From ad06a919f59d531c223567d5b822c6cc53d90136 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Fri, 7 Apr 2023 18:33:24 -0700 Subject: [PATCH] make timing model no search thru latches Signed-off-by: James Cherry --- include/sta/Search.hh | 12 ++++++------ search/MakeTimingModel.cc | 2 +- search/Search.cc | 39 ++++++++++++++++++++------------------- 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/include/sta/Search.hh b/include/sta/Search.hh index 7e6a3ecd..4cbbd9d8 100644 --- a/include/sta/Search.hh +++ b/include/sta/Search.hh @@ -121,7 +121,6 @@ public: void findAllArrivals(); // Find all arrivals (without latch propagation). void findArrivals(); - virtual void findAllArrivals(VertexVisitor *visitor); // Find arrival times up thru level. void findArrivals(Level level); void findRequireds(); @@ -346,7 +345,8 @@ public: void findFilteredArrivals(ExceptionFrom *from, ExceptionThruSeq *thrus, ExceptionTo *to, - bool unconstrained); + bool unconstrained, + bool thru_latches); protected: void init(StaState *sta); @@ -445,8 +445,8 @@ protected: Vertex *vertex); void findClkArrivals1(); - virtual void findArrivals(Level level, - VertexVisitor *arrival_visitor); + void findAllArrivals(bool thru_latches); + void findArrivals1(Level level); Tag *mutateTag(Tag *from_tag, const Pin *from_pin, const RiseFall *from_rf, @@ -471,8 +471,8 @@ protected: bool havePendingLatchOutputs(); void clearPendingLatchOutputs(); void enqueuePendingLatchOutputs(); - void findFilteredArrivals(); - void findArrivals1(); + void findFilteredArrivals(bool thru_latches); + void findArrivalsSeed(); void seedFilterStarts(); bool hasEnabledChecks(Vertex *vertex) const; virtual float timingDerate(Vertex *from_vertex, diff --git a/search/MakeTimingModel.cc b/search/MakeTimingModel.cc index 7e62f87a..a2fbac99 100644 --- a/search/MakeTimingModel.cc +++ b/search/MakeTimingModel.cc @@ -320,7 +320,7 @@ MakeTimingModel::findTimingFromInput(Port *input_port) from_pins->insert(input_pin); ExceptionFrom *from = sta_->makeExceptionFrom(from_pins, nullptr, nullptr, input_rf1); - search_->findFilteredArrivals(from, nullptr, nullptr, false); + search_->findFilteredArrivals(from, nullptr, nullptr, false, false); end_visitor.setInputRf(input_rf); VisitPathEnds visit_ends(sta_); diff --git a/search/Search.cc b/search/Search.cc index 00e47943..1b7a5970 100644 --- a/search/Search.cc +++ b/search/Search.cc @@ -444,7 +444,7 @@ Search::findPathEnds(ExceptionFrom *from, bool clk_gating_setup, bool clk_gating_hold) { - findFilteredArrivals(from, thrus, to, unconstrained); + findFilteredArrivals(from, thrus, to, unconstrained, true); if (!sdc_->recoveryRemovalChecksEnabled()) recovery = removal = false; if (!sdc_->gatedClkChecksEnabled()) @@ -466,7 +466,8 @@ void Search::findFilteredArrivals(ExceptionFrom *from, ExceptionThruSeq *thrus, ExceptionTo *to, - bool unconstrained) + bool unconstrained, + bool thru_latches) { unconstrained_paths_ = unconstrained; // Delete results from last findPathEnds. @@ -480,13 +481,13 @@ Search::findFilteredArrivals(ExceptionFrom *from, || from->instances())) || thrus) { filter_ = sdc_->makeFilterPath(from, thrus, nullptr); - findFilteredArrivals(); + findFilteredArrivals(thru_latches); } else // These cases do not require filtered arrivals. // -from clocks // -to - findAllArrivals(); + findAllArrivals(thru_latches); } // From/thrus/to are used to make a filter exception. If the last @@ -567,17 +568,18 @@ Search::deleteFilterClkInfos() } void -Search::findFilteredArrivals() +Search::findFilteredArrivals(bool thru_latches) { - findArrivals1(); + findArrivalsSeed(); seedFilterStarts(); Level max_level = levelize_->maxLevel(); // Search always_to_endpoint to search from exisiting arrivals at // fanin startpoints to reach -thru/-to endpoints. arrival_visitor_->init(true); // Iterate until data arrivals at all latches stop changing. - for (int pass = 1; pass <= 2 || havePendingLatchOutputs() ; pass++) { - enqueuePendingLatchOutputs(); + for (int pass = 1; pass == 1 || (thru_latches && havePendingLatchOutputs()) ; pass++) { + if (thru_latches) + enqueuePendingLatchOutputs(); debugPrint(debug_, "search", 1, "find arrivals pass %d", pass); int arrival_count = arrival_iter_->visitParallel(max_level, arrival_visitor_); @@ -926,18 +928,18 @@ Search::visitEndpoints(VertexVisitor *visitor) void Search::findAllArrivals() { - arrival_visitor_->init(false); - findAllArrivals(arrival_visitor_); + findAllArrivals(true); } void -Search::findAllArrivals(VertexVisitor *arrival_visitor) +Search::findAllArrivals(bool thru_latches) { + arrival_visitor_->init(false); // Iterate until data arrivals at all latches stop changing. - for (int pass = 1; pass == 1 || havePendingLatchOutputs(); pass++) { + for (int pass = 1; pass == 1 || (thru_latches && havePendingLatchOutputs()); pass++) { enqueuePendingLatchOutputs(); debugPrint(debug_, "search", 1, "find arrivals pass %d", pass); - findArrivals(levelize_->maxLevel(), arrival_visitor); + findArrivals1(levelize_->maxLevel()); } } @@ -971,17 +973,16 @@ void Search::findArrivals(Level level) { arrival_visitor_->init(false); - findArrivals(level, arrival_visitor_); + findArrivals1(level); } void -Search::findArrivals(Level level, - VertexVisitor *arrival_visitor) +Search::findArrivals1(Level level) { debugPrint(debug_, "search", 1, "find arrivals to level %d", level); - findArrivals1(); + findArrivalsSeed(); Stats stats(debug_, report_); - int arrival_count = arrival_iter_->visitParallel(level, arrival_visitor); + int arrival_count = arrival_iter_->visitParallel(level, arrival_visitor_); stats.report("Find arrivals"); if (arrival_iter_->empty() && invalid_arrivals_->empty()) { @@ -993,7 +994,7 @@ Search::findArrivals(Level level, } void -Search::findArrivals1() +Search::findArrivalsSeed() { if (!arrivals_seeded_) { genclks_->ensureInsertionDelays();