From 5cb7027f857241c2e9679cb3f988e1e672b9a183 Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Wed, 8 Apr 2026 03:41:40 +0000 Subject: [PATCH 1/4] drt: add custom comparator for dirty_unique_classes Signed-off-by: Eder Monteiro --- src/drt/src/pa/FlexPA.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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_) { From f98e2c9a2b675074f50de8a07086268362f20f99 Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Wed, 8 Apr 2026 03:42:49 +0000 Subject: [PATCH 2/4] odb: sort iterms inside dbAccessPoint for deterministic serialization Signed-off-by: Eder Monteiro --- src/odb/src/db/dbAccessPoint.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/odb/src/db/dbAccessPoint.cpp b/src/odb/src/db/dbAccessPoint.cpp index a37336fdae..cc445e519c 100644 --- a/src/odb/src/db/dbAccessPoint.cpp +++ b/src/odb/src/db/dbAccessPoint.cpp @@ -126,7 +126,11 @@ dbOStream& operator<<(dbOStream& stream, const _dbAccessPoint& obj) stream << obj.mpin_; stream << obj.bpin_; stream << obj.accesses_; - stream << obj.iterms_; + // Sort iterms_ for deterministic serialization since the push_back order + // depends on the order instances are processed during pin access updates. + auto sorted_iterms = obj.iterms_; + std::sort(sorted_iterms.begin(), sorted_iterms.end()); + stream << sorted_iterms; stream << obj.vias_; stream << obj.path_segs_; // User Code Begin << From a38bf6c8fb563ae926aa00b5fe5e15f72b1f93ae Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Wed, 8 Apr 2026 03:45:11 +0000 Subject: [PATCH 3/4] odb: remove iterm from access point terms list Signed-off-by: Eder Monteiro --- src/odb/src/db/dbITerm.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/odb/src/db/dbITerm.cpp b/src/odb/src/db/dbITerm.cpp index b39cc09b37..e4d23a1cec 100644 --- a/src/odb/src/db/dbITerm.cpp +++ b/src/odb/src/db/dbITerm.cpp @@ -860,8 +860,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(); } From 7a67a5746d3e9142e3ff59efb9b93ae345bd6aa7 Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Wed, 8 Apr 2026 03:59:47 +0000 Subject: [PATCH 4/4] maintain sorted AP iterms_ to ensure deterministic serialization Move the iterms_ sort from dbAccessPoint serialization to insertion time in setAccessPoint, using lower_bound + insert instead of push_back. This keeps the serialization code generator-safe (the previous sort in operator<< was outside user code markers and would be overwritten by the ODB code generator). Signed-off-by: Eder Monteiro --- src/odb/src/db/dbAccessPoint.cpp | 6 +----- src/odb/src/db/dbITerm.cpp | 4 +++- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/odb/src/db/dbAccessPoint.cpp b/src/odb/src/db/dbAccessPoint.cpp index cc445e519c..a37336fdae 100644 --- a/src/odb/src/db/dbAccessPoint.cpp +++ b/src/odb/src/db/dbAccessPoint.cpp @@ -126,11 +126,7 @@ dbOStream& operator<<(dbOStream& stream, const _dbAccessPoint& obj) stream << obj.mpin_; stream << obj.bpin_; stream << obj.accesses_; - // Sort iterms_ for deterministic serialization since the push_back order - // depends on the order instances are processed during pin access updates. - auto sorted_iterms = obj.iterms_; - std::sort(sorted_iterms.begin(), sorted_iterms.end()); - stream << sorted_iterms; + stream << obj.iterms_; stream << obj.vias_; stream << obj.path_segs_; // User Code Begin << diff --git a/src/odb/src/db/dbITerm.cpp b/src/odb/src/db/dbITerm.cpp index e4d23a1cec..0d0b647dfc 100644 --- a/src/odb/src/db/dbITerm.cpp +++ b/src/odb/src/db/dbITerm.cpp @@ -800,7 +800,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>(); }