diff --git a/src/drt/src/pa/FlexPA.cpp b/src/drt/src/pa/FlexPA.cpp index 9ac2b22871..eb10c5ae28 100644 --- a/src/drt/src/pa/FlexPA.cpp +++ b/src/drt/src/pa/FlexPA.cpp @@ -121,7 +121,8 @@ void FlexPA::removeDirtyInst(frInst* inst) void FlexPA::updateDirtyInsts() { - std::set dirty_unique_classes; + auto cmp = [](UniqueClass* a, UniqueClass* b) { return a->key() < b->key(); }; + std::set dirty_unique_classes(cmp); frOrderedIdSet pattern_insts; // list of insts that need row pattern generation for (const auto& inst : dirty_insts_) { diff --git a/src/odb/src/db/dbITerm.cpp b/src/odb/src/db/dbITerm.cpp index ce64542b0b..1898fd9226 100644 --- a/src/odb/src/db/dbITerm.cpp +++ b/src/odb/src/db/dbITerm.cpp @@ -801,7 +801,9 @@ void dbITerm::setAccessPoint(dbMPin* pin, dbAccessPoint* ap) if (ap != nullptr) { iterm->aps_[pin->getImpl()->getOID()] = ap->getImpl()->getOID(); _dbAccessPoint* _ap = (_dbAccessPoint*) ap; - _ap->iterms_.push_back(iterm->getOID()); + auto& iterms = _ap->iterms_; + auto pos = std::lower_bound(iterms.begin(), iterms.end(), iterm->getOID()); + iterms.insert(pos, iterm->getOID()); } else { iterm->aps_[pin->getImpl()->getOID()] = dbId<_dbAccessPoint>(); } @@ -861,8 +863,16 @@ std::vector dbITerm::getPrefAccessPoints() const void dbITerm::clearPrefAccessPoints() { _dbITerm* iterm = (_dbITerm*) this; - // Clear aps_ map instead of destroying dbAccessPoint object to prevent - // destroying APs of other iterms. + _dbBlock* block = (_dbBlock*) iterm->getOwner(); + // Remove this iterm from each AP's back-reference list before clearing. + for (auto& [pin_id, ap_id] : iterm->aps_) { + if (ap_id.isValid()) { + auto* ap = block->ap_tbl_->getPtr(ap_id); + auto& iterms = ap->iterms_; + iterms.erase(std::remove(iterms.begin(), iterms.end(), iterm->getOID()), + iterms.end()); + } + } iterm->aps_.clear(); }