From 9d401d1c0e567f0596f848a5726d9ce915cb5f37 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Tue, 6 Jan 2026 14:37:26 -0800 Subject: [PATCH] dcalc bfs incr level/hercules_is_int 0.3 correlation Signed-off-by: James Cherry --- dcalc/GraphDelayCalc.cc | 13 +++++++++++++ include/sta/Bfs.hh | 2 ++ include/sta/GraphDelayCalc.hh | 2 ++ search/Bfs.cc | 21 +++++++++++++++++++-- search/Sta.cc | 13 +++++++++---- 5 files changed, 45 insertions(+), 6 deletions(-) diff --git a/dcalc/GraphDelayCalc.cc b/dcalc/GraphDelayCalc.cc index b0b0402d..6fcaa870 100644 --- a/dcalc/GraphDelayCalc.cc +++ b/dcalc/GraphDelayCalc.cc @@ -184,6 +184,19 @@ GraphDelayCalc::delayInvalid(Vertex *vertex) } } +void +GraphDelayCalc::levelsChangedBefore() +{ + delaysInvalid(); +} + +void +GraphDelayCalc::levelChangedBefore(Vertex *vertex) +{ + iter_->remove(vertex); + delayInvalid(vertex); +} + void GraphDelayCalc::deleteVertexBefore(Vertex *vertex) { diff --git a/include/sta/Bfs.hh b/include/sta/Bfs.hh index 89080010..c95fc5cb 100644 --- a/include/sta/Bfs.hh +++ b/include/sta/Bfs.hh @@ -106,6 +106,8 @@ protected: virtual void incrLevel(Level &level) const = 0; void findNext(Level to_level); void deleteEntries(); + void checkLevel(Vertex *vertex, + Level level); BfsIndex bfs_index_; Level level_min_; diff --git a/include/sta/GraphDelayCalc.hh b/include/sta/GraphDelayCalc.hh index 942c8468..6a746fc4 100644 --- a/include/sta/GraphDelayCalc.hh +++ b/include/sta/GraphDelayCalc.hh @@ -58,10 +58,12 @@ public: virtual void setObserver(DelayCalcObserver *observer); // Invalidate all delays/slews. virtual void delaysInvalid(); + virtual void levelsChangedBefore(); // Invalidate vertex and downstream delays/slews. virtual void delayInvalid(Vertex *vertex); virtual void delayInvalid(const Pin *pin); virtual void deleteVertexBefore(Vertex *vertex); + virtual void levelChangedBefore(Vertex *vertex); // Reset to virgin state. virtual void clear(); // Find arc delays and vertex slews thru level. diff --git a/search/Bfs.cc b/search/Bfs.cc index d6987508..11e0c394 100644 --- a/search/Bfs.cc +++ b/search/Bfs.cc @@ -146,7 +146,8 @@ BfsIterator::visit(Level to_level, int visit_count = 0; while (levelLessOrEqual(first_level_, last_level_) && levelLessOrEqual(first_level_, to_level)) { - VertexSeq &level_vertices = queue_[first_level_]; + Level level = first_level_; + VertexSeq &level_vertices = queue_[level]; incrLevel(first_level_); // Note that ArrivalVisitor::enqueueRefPinInputDelays may enqueue // vertices at this level so range iteration fails if the vector grows. @@ -154,6 +155,7 @@ BfsIterator::visit(Level to_level, Vertex *vertex = level_vertices.back(); level_vertices.pop_back(); if (vertex) { + checkLevel(vertex, level); vertex->setBfsInQueue(bfs_index_, false); visitor->visit(vertex); visit_count++; @@ -187,6 +189,7 @@ BfsIterator::visitParallel(Level to_level, if (vertex_count < thread_count) { for (Vertex *vertex : level_vertices) { if (vertex) { + checkLevel(vertex, first_level_); vertex->setBfsInQueue(bfs_index_, false); visitor->visit(vertex); } @@ -203,6 +206,7 @@ BfsIterator::visitParallel(Level to_level, for (size_t i = from; i < to; i++) { Vertex *vertex = level_vertices[i]; if (vertex) { + checkLevel(vertex, first_level_); vertex->setBfsInQueue(bfs_index, false); visitors[k]->visit(vertex); } @@ -259,8 +263,10 @@ BfsIterator::findNext(Level to_level) Vertex *vertex = level_vertices.back(); if (vertex == nullptr) level_vertices.pop_back(); - else + else { + checkLevel(vertex, first_level_); return; + } } incrLevel(first_level_); } @@ -313,6 +319,17 @@ BfsIterator::checkInQueue(Vertex *vertex) vertex->to_string(this).c_str()); } +void +BfsIterator::checkLevel(Vertex *vertex, + Level level) +{ + if (vertex->level() != level) + report_->error(000, "vertex %s level %d != bfs level %d", + vertex->to_string(this).c_str(), + vertex->level(), + level); +} + void BfsIterator::deleteVertexBefore(Vertex *vertex) { diff --git a/search/Sta.cc b/search/Sta.cc index 51158cf8..eb389646 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -209,16 +209,19 @@ StaSimObserver::fanoutEdgesChangeAfter(Vertex *vertex) class StaLevelizeObserver : public LevelizeObserver { public: - StaLevelizeObserver(Search *search); + StaLevelizeObserver(Search *search, GraphDelayCalc *graph_delay_calc); void levelsChangedBefore() override; void levelChangedBefore(Vertex *vertex) override; private: Search *search_; + GraphDelayCalc *graph_delay_calc_; }; -StaLevelizeObserver::StaLevelizeObserver(Search *search) : - search_(search) +StaLevelizeObserver::StaLevelizeObserver(Search *search, + GraphDelayCalc *graph_delay_calc) : + search_(search), + graph_delay_calc_(graph_delay_calc) { } @@ -226,12 +229,14 @@ void StaLevelizeObserver::levelsChangedBefore() { search_->levelsChangedBefore(); + graph_delay_calc_->levelsChangedBefore(); } void StaLevelizeObserver::levelChangedBefore(Vertex *vertex) { search_->levelChangedBefore(vertex); + graph_delay_calc_->levelChangedBefore(vertex); } //////////////////////////////////////////////////////////////// @@ -326,7 +331,7 @@ Sta::makeObservers() { graph_delay_calc_->setObserver(new StaDelayCalcObserver(search_)); sim_->setObserver(new StaSimObserver(graph_delay_calc_, levelize_, search_)); - levelize_->setObserver(new StaLevelizeObserver(search_)); + levelize_->setObserver(new StaLevelizeObserver(search_, graph_delay_calc_)); } int