From dcbaaf4c05835de8fd6f898feff414df9bf99ba2 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 7 Sep 2025 15:22:06 -0700 Subject: [PATCH] ExpandedExceptionVisitor Signed-off-by: James Cherry --- include/sta/ExceptionPath.hh | 2 +- sdc/ExceptionPath.cc | 66 +++++++++++++++++------------------- sdc/Sdc.cc | 6 ++-- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/include/sta/ExceptionPath.hh b/include/sta/ExceptionPath.hh index c7cd839c..1619fec3 100644 --- a/include/sta/ExceptionPath.hh +++ b/include/sta/ExceptionPath.hh @@ -632,7 +632,7 @@ private: void expandFrom(); void expandThrus(ExceptionFrom *expanded_from); void expandThru(ExceptionFrom *expanded_from, - ExceptionThruSeq::Iterator &thru_iter, + size_t next_thru_idx, ExceptionThruSeq *expanded_thrus); void expandTo(ExceptionFrom *expanded_from, ExceptionThruSeq *expanded_thrus); diff --git a/sdc/ExceptionPath.cc b/sdc/ExceptionPath.cc index a212dc24..22dfaf5e 100644 --- a/sdc/ExceptionPath.cc +++ b/sdc/ExceptionPath.cc @@ -2146,9 +2146,8 @@ ExpandedExceptionVisitor::expandThrus(ExceptionFrom *expanded_from) ExceptionThruSeq *thrus = exception_->thrus(); if (thrus) { // Use tail recursion to expand the exception points in the thrus. - ExceptionThruSeq::Iterator thru_iter(thrus); ExceptionThruSeq expanded_thrus; - expandThru(expanded_from, thru_iter, &expanded_thrus); + expandThru(expanded_from, 0, &expanded_thrus); } else expandTo(expanded_from, nullptr); @@ -2156,42 +2155,41 @@ ExpandedExceptionVisitor::expandThrus(ExceptionFrom *expanded_from) void ExpandedExceptionVisitor::expandThru(ExceptionFrom *expanded_from, - ExceptionThruSeq::Iterator &thru_iter, + size_t next_thru_idx, ExceptionThruSeq *expanded_thrus) { - if (exception_->thrus()) { - if (thru_iter.hasNext()) { - ExceptionThru *thru = thru_iter.next(); - const RiseFallBoth *rf = thru->transition(); - if (thru->pins()) { - for (const Pin *pin : *thru->pins()) { - PinSet pins(network_); - pins.insert(pin); - ExceptionThru expanded_thru(&pins, nullptr, nullptr, rf, false, network_); - expanded_thrus->push_back(&expanded_thru); - expandThru(expanded_from, thru_iter, expanded_thrus); - expanded_thrus->pop_back(); - } + ExceptionThruSeq *thrus = exception_->thrus(); + if (next_thru_idx < thrus->size()) { + ExceptionThru *thru = (*thrus)[next_thru_idx]; + const RiseFallBoth *rf = thru->transition(); + if (thru->pins()) { + for (const Pin *pin : *thru->pins()) { + PinSet pins(network_); + pins.insert(pin); + ExceptionThru expanded_thru(&pins, nullptr, nullptr, rf, false, network_); + expanded_thrus->push_back(&expanded_thru); + expandThru(expanded_from, next_thru_idx + 1, expanded_thrus); + expanded_thrus->pop_back(); } - if (thru->nets()) { - for (const Net *net : *thru->nets()) { - NetSet nets(network_); - nets.insert(net); - ExceptionThru expanded_thru(nullptr, &nets, nullptr, rf, false, network_); - expanded_thrus->push_back(&expanded_thru); - expandThru(expanded_from, thru_iter, expanded_thrus); - expanded_thrus->pop_back(); - } + } + if (thru->nets()) { + for (const Net *net : *thru->nets()) { + NetSet nets(network_); + nets.insert(net); + ExceptionThru expanded_thru(nullptr, &nets, nullptr, rf, false, network_); + expanded_thrus->push_back(&expanded_thru); + expandThru(expanded_from, next_thru_idx + 1, expanded_thrus); + expanded_thrus->pop_back(); } - if (thru->instances()) { - for (const Instance *inst : *thru->instances()) { - InstanceSet insts(network_); - insts.insert(inst); - ExceptionThru expanded_thru(nullptr, nullptr, &insts, rf, false, network_); - expanded_thrus->push_back(&expanded_thru); - expandThru(expanded_from, thru_iter, expanded_thrus); - expanded_thrus->pop_back(); - } + } + if (thru->instances()) { + for (const Instance *inst : *thru->instances()) { + InstanceSet insts(network_); + insts.insert(inst); + ExceptionThru expanded_thru(nullptr, nullptr, &insts, rf, false, network_); + expanded_thrus->push_back(&expanded_thru); + expandThru(expanded_from, next_thru_idx + 1, expanded_thrus); + expanded_thrus->pop_back(); } } } diff --git a/sdc/Sdc.cc b/sdc/Sdc.cc index d26def4c..5b8b697c 100644 --- a/sdc/Sdc.cc +++ b/sdc/Sdc.cc @@ -5115,8 +5115,10 @@ ExpandException::visit(ExceptionFrom *from, ExceptionThruSeq *thrus_clone = nullptr; if (thrus) { thrus_clone = new ExceptionThruSeq; - for (ExceptionThru *thru : *thrus) - thrus_clone->push_back(thru->clone(network_)); + for (ExceptionThru *thru : *thrus) { + ExceptionThru *thru_clone = thru->clone(network_); + thrus_clone->push_back(thru_clone); + } } ExceptionTo *to_clone = nullptr; if (to)