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()); } diff --git a/src/dpl/src/optimization/detailed_manager.h b/src/dpl/src/optimization/detailed_manager.h index 9573bc41d76..3e36b76cac4 100644 --- a/src/dpl/src/optimization/detailed_manager.h +++ b/src/dpl/src/optimization/detailed_manager.h @@ -265,7 +265,10 @@ 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(); }