Skip to content

Commit 3ab4b4a

Browse files
authored
Merge pull request #10085 from The-OpenROAD-Project-staging/drt_odb_stable
drt/odb: fix non-determinism on pin access
2 parents 33c72bf + 084c2ea commit 3ab4b4a

2 files changed

Lines changed: 15 additions & 4 deletions

File tree

src/drt/src/pa/FlexPA.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,8 @@ void FlexPA::removeDirtyInst(frInst* inst)
121121

122122
void FlexPA::updateDirtyInsts()
123123
{
124-
std::set<UniqueClass*> dirty_unique_classes;
124+
auto cmp = [](UniqueClass* a, UniqueClass* b) { return a->key() < b->key(); };
125+
std::set<UniqueClass*, decltype(cmp)> dirty_unique_classes(cmp);
125126
frOrderedIdSet<frInst*>
126127
pattern_insts; // list of insts that need row pattern generation
127128
for (const auto& inst : dirty_insts_) {

src/odb/src/db/dbITerm.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -801,7 +801,9 @@ void dbITerm::setAccessPoint(dbMPin* pin, dbAccessPoint* ap)
801801
if (ap != nullptr) {
802802
iterm->aps_[pin->getImpl()->getOID()] = ap->getImpl()->getOID();
803803
_dbAccessPoint* _ap = (_dbAccessPoint*) ap;
804-
_ap->iterms_.push_back(iterm->getOID());
804+
auto& iterms = _ap->iterms_;
805+
auto pos = std::lower_bound(iterms.begin(), iterms.end(), iterm->getOID());
806+
iterms.insert(pos, iterm->getOID());
805807
} else {
806808
iterm->aps_[pin->getImpl()->getOID()] = dbId<_dbAccessPoint>();
807809
}
@@ -861,8 +863,16 @@ std::vector<dbAccessPoint*> dbITerm::getPrefAccessPoints() const
861863
void dbITerm::clearPrefAccessPoints()
862864
{
863865
_dbITerm* iterm = (_dbITerm*) this;
864-
// Clear aps_ map instead of destroying dbAccessPoint object to prevent
865-
// destroying APs of other iterms.
866+
_dbBlock* block = (_dbBlock*) iterm->getOwner();
867+
// Remove this iterm from each AP's back-reference list before clearing.
868+
for (auto& [pin_id, ap_id] : iterm->aps_) {
869+
if (ap_id.isValid()) {
870+
auto* ap = block->ap_tbl_->getPtr(ap_id);
871+
auto& iterms = ap->iterms_;
872+
iterms.erase(std::remove(iterms.begin(), iterms.end(), iterm->getOID()),
873+
iterms.end());
874+
}
875+
}
866876
iterm->aps_.clear();
867877
}
868878

0 commit comments

Comments
 (0)