From dc6dc6d0ab659422831a9a97e2bb16972fbf064e Mon Sep 17 00:00:00 2001 From: Divinesoumyadip Date: Wed, 15 Apr 2026 04:36:00 +0000 Subject: [PATCH 1/3] dpl: fix topological sort cycle with multi-height cells in shift legalizer Multi-height cells appear in segments across multiple rows. When a single-height cell sits inside the row span of two multi-height cells, the ordering differs per row, creating a cycle in the topological sort which triggers DPL-0400. Fix: only add dependency edges when both cells' bottom Y matches the current segment's row bottom, ensuring each multi-height cell contributes edges only from its primary (bottom) row. Fixes #9932 Signed-off-by: Divinesoumyadip --- src/dpl/src/legalize_shift.cxx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/dpl/src/legalize_shift.cxx b/src/dpl/src/legalize_shift.cxx index 5b23147389b..22cecd9c40c 100644 --- a/src/dpl/src/legalize_shift.cxx +++ b/src/dpl/src/legalize_shift.cxx @@ -120,10 +120,18 @@ bool ShiftLegalizer::legalize(DetailedMgr& mgr) outgoing_.resize(size); for (size_t i = 0; i < mgr.getNumSegments(); i++) { const int segId = mgr.getSegment(i)->getSegId(); + const int rowId = mgr.getSegment(i)->getRowId(); + const DbuY rowBottom{arch_->getRow(rowId)->getBottom()}; for (size_t j = 1; j < mgr.getNumCellsInSeg(segId); j++) { const Node* prev = mgr.getCellsInSeg(segId)[j - 1]; const Node* curr = mgr.getCellsInSeg(segId)[j]; + // Only add edges from a cell's bottom (primary) row to avoid + // cycles in the topological sort caused by multi-height cells + // appearing in multiple row segments with conflicting orderings. + if (prev->getBottom() != rowBottom || curr->getBottom() != rowBottom) { + continue; + } incoming_[curr->getId()].push_back(prev->getId()); outgoing_[prev->getId()].push_back(curr->getId()); } From 7b5d315aef2937094f96b31296988f9df94ae5d5 Mon Sep 17 00:00:00 2001 From: Divinesoumyadip Date: Wed, 15 Apr 2026 21:08:57 +0000 Subject: [PATCH 2/3] dpl: fix non-deterministic sort in compareNodesX with cell ID tie-breaker Signed-off-by: Divinesoumyadip --- src/dpl/src/optimization/detailed_manager.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/dpl/src/optimization/detailed_manager.h b/src/dpl/src/optimization/detailed_manager.h index 9573bc41d76..c8b880e90a0 100644 --- a/src/dpl/src/optimization/detailed_manager.h +++ b/src/dpl/src/optimization/detailed_manager.h @@ -265,7 +265,9 @@ class DetailedMgr // Needs cell centers. bool operator()(Node* p, Node* q) const { - return p->getCenterX() < q->getCenterX(); + if (p->getCenterX() != q->getCenterX()) + return p->getCenterX() < q->getCenterX(); + return p->getId() < q->getId(); } bool operator()(Node*& s, DbuX i) const { return s->getCenterX() < i; } bool operator()(DbuX i, Node*& s) const { return i < s->getCenterX(); } From 39a00e7e41bb880f58faf4982bdae76fdfaf8717 Mon Sep 17 00:00:00 2001 From: Divinesoumyadip Date: Sat, 18 Apr 2026 10:12:23 +0000 Subject: [PATCH 3/3] dpl: fix clang-format braces warning in compareNodesX Signed-off-by: Divinesoumyadip --- src/dpl/src/optimization/detailed_manager.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dpl/src/optimization/detailed_manager.h b/src/dpl/src/optimization/detailed_manager.h index c8b880e90a0..3e36b76cac4 100644 --- a/src/dpl/src/optimization/detailed_manager.h +++ b/src/dpl/src/optimization/detailed_manager.h @@ -265,8 +265,9 @@ class DetailedMgr // Needs cell centers. bool operator()(Node* p, Node* q) const { - if (p->getCenterX() != q->getCenterX()) + if (p->getCenterX() != q->getCenterX()) { return p->getCenterX() < q->getCenterX(); + } return p->getId() < q->getId(); } bool operator()(Node*& s, DbuX i) const { return s->getCenterX() < i; }