BfsIterator after delete vertex

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2025-08-01 17:06:43 -07:00
parent 0ab75c30bf
commit 88c7779680
6 changed files with 60 additions and 23 deletions

View File

@ -75,7 +75,7 @@ public:
// Notify iterator that vertex will be deleted. // Notify iterator that vertex will be deleted.
void deleteVertexBefore(Vertex *vertex); void deleteVertexBefore(Vertex *vertex);
void remove(Vertex *vertex); void remove(Vertex *vertex);
void reportEntries(); void reportEntries() const;
virtual bool hasNext(); virtual bool hasNext();
bool hasNext(Level to_level); bool hasNext(Level to_level);
@ -103,7 +103,7 @@ protected:
Level level2) const = 0; Level level2) const = 0;
virtual bool levelLessOrEqual(Level level1, virtual bool levelLessOrEqual(Level level1,
Level level2) const = 0; Level level2) const = 0;
virtual void incrLevel(Level &level) = 0; virtual void incrLevel(Level &level) const = 0;
void findNext(Level to_level); void findNext(Level to_level);
void deleteEntries(); void deleteEntries();
@ -139,7 +139,7 @@ protected:
Level level2) const; Level level2) const;
virtual bool levelLess(Level level1, virtual bool levelLess(Level level1,
Level level2) const; Level level2) const;
virtual void incrLevel(Level &level); virtual void incrLevel(Level &level) const;
}; };
class BfsBkwdIterator : public BfsIterator class BfsBkwdIterator : public BfsIterator
@ -159,7 +159,7 @@ protected:
Level level2) const; Level level2) const;
virtual bool levelLess(Level level1, virtual bool levelLess(Level level1,
Level level2) const; Level level2) const;
virtual void incrLevel(Level &level); virtual void incrLevel(Level &level) const;
}; };
} // namespace } // namespace

View File

@ -89,20 +89,17 @@ BfsIterator::clear()
} }
void void
BfsIterator::reportEntries() BfsIterator::reportEntries() const
{ {
Level level = first_level_; for (Level level=first_level_; levelLessOrEqual(level, last_level_);incrLevel(level)){
while (levelLessOrEqual(level, last_level_)) { const VertexSeq &level_vertices = queue_[level];
VertexSeq &level_vertices = queue_[level];
if (!level_vertices.empty()) { if (!level_vertices.empty()) {
report_->reportLine("Level %d", level); report_->reportLine("Level %d", level);
for (Vertex *vertex : level_vertices) { for (Vertex *vertex : level_vertices)
if (vertex) report_->reportLine(" %s",
report_->reportLine(" %s", vertex->to_string(this).c_str()); vertex ? vertex->to_string(this).c_str() : "NULL");
} }
} }
incrLevel(level);
}
} }
void void
@ -255,9 +252,18 @@ void
BfsIterator::findNext(Level to_level) BfsIterator::findNext(Level to_level)
{ {
while (levelLessOrEqual(first_level_, last_level_) while (levelLessOrEqual(first_level_, last_level_)
&& levelLessOrEqual(first_level_, to_level) && levelLessOrEqual(first_level_, to_level)) {
&& queue_[first_level_].empty()) VertexSeq &level_vertices = queue_[first_level_];
// Skip null entries from deleted vertices.
while (!level_vertices.empty()) {
Vertex *vertex = level_vertices.back();
if (vertex == nullptr)
level_vertices.pop_back();
else
return;
}
incrLevel(first_level_); incrLevel(first_level_);
}
} }
void void
@ -319,6 +325,9 @@ BfsIterator::remove(Vertex *vertex)
Level level = vertex->level(); Level level = vertex->level();
if (vertex->bfsInQueue(bfs_index_) if (vertex->bfsInQueue(bfs_index_)
&& static_cast<Level>(queue_.size()) > level) { && static_cast<Level>(queue_.size()) > level) {
debugPrint(debug_, "bfs", 2, "remove %s",
vertex->to_string(this).c_str());
printf("bfs remove %s\n", vertex->to_string(this).c_str());
for (Vertex *&v : queue_[level]) { for (Vertex *&v : queue_[level]) {
if (v == vertex) { if (v == vertex) {
v = nullptr; v = nullptr;
@ -346,7 +355,7 @@ BfsFwdIterator::~BfsFwdIterator()
} }
void void
BfsFwdIterator::incrLevel(Level &level) BfsFwdIterator::incrLevel(Level &level) const
{ {
level++; level++;
} }
@ -400,7 +409,7 @@ BfsBkwdIterator::~BfsBkwdIterator()
} }
void void
BfsBkwdIterator::incrLevel(Level &level) BfsBkwdIterator::incrLevel(Level &level) const
{ {
level--; level--;
} }

View File

@ -602,7 +602,7 @@ void
Levelize::relevelizeFrom(Vertex *vertex) Levelize::relevelizeFrom(Vertex *vertex)
{ {
if (levelized_) { if (levelized_) {
debugPrint(debug_, "levelize", 1, "relevelize from %s", debugPrint(debug_, "levelize", 1, "level invalid from %s",
vertex->to_string(this).c_str()); vertex->to_string(this).c_str());
relevelize_from_.insert(vertex); relevelize_from_.insert(vertex);
levels_valid_ = false; levels_valid_ = false;
@ -649,8 +649,6 @@ Levelize::relevelize()
ensureLatchLevels(); ensureLatchLevels();
levels_valid_ = true; levels_valid_ = true;
relevelize_from_.clear(); relevelize_from_.clear();
checkLevels();
} }
void void

View File

@ -70,9 +70,10 @@ public:
// Set the observer for level changes. // Set the observer for level changes.
void setObserver(LevelizeObserver *observer); void setObserver(LevelizeObserver *observer);
void checkLevels(); void checkLevels();
// Public for regression testing.
void levelize();
protected: protected:
void levelize();
void findRoots(); void findRoots();
VertexSeq sortedRootsWithFanout(); VertexSeq sortedRootsWithFanout();
VertexSeq findTopologicalOrder(); VertexSeq findTopologicalOrder();

View File

@ -32,6 +32,7 @@
#include "search/Levelize.hh" #include "search/Levelize.hh"
#include "search/ReportPath.hh" #include "search/ReportPath.hh"
#include "PathExpanded.hh" #include "PathExpanded.hh"
#include "Bfs.hh"
#include "Sta.hh" #include "Sta.hh"
using namespace sta; using namespace sta;
@ -1128,6 +1129,32 @@ set_use_default_arrival_clock(bool enable)
Sta::sta()->setUseDefaultArrivalClock(enable); Sta::sta()->setUseDefaultArrivalClock(enable);
} }
// For regression tests.
void
report_arrival_entries()
{
Sta *sta = Sta::sta();
Search *search = sta->search();
search->arrivalIterator()->reportEntries();
}
// For regression tests.
void
report_required_entries()
{
Sta *sta = Sta::sta();
Search *search = sta->search();
search->requiredIterator()->reportEntries();
}
// For regression tests.
void
levelize()
{
Sta *sta = Sta::sta();
sta->levelize()->levelize();
}
%} // inline %} // inline
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////

View File

@ -4486,7 +4486,7 @@ Sta::disconnectPinBefore(const Pin *pin)
void void
Sta::deleteEdge(Edge *edge) Sta::deleteEdge(Edge *edge)
{ {
debugPrint(debug_, "network_edit", 1, "delete edge %s -> %s", debugPrint(debug_, "network_edit", 2, "delete edge %s -> %s",
edge->from(graph_)->name(sdc_network_), edge->from(graph_)->name(sdc_network_),
edge->to(graph_)->name(sdc_network_)); edge->to(graph_)->name(sdc_network_));
Vertex *to = edge->to(graph_); Vertex *to = edge->to(graph_);
@ -4568,6 +4568,8 @@ void
Sta::deletePinBefore(const Pin *pin) Sta::deletePinBefore(const Pin *pin)
{ {
if (graph_) { if (graph_) {
debugPrint(debug_, "network_edit", 1, "delete pin %s",
sdc_network_->pathName(pin));
if (network_->isLoad(pin)) { if (network_->isLoad(pin)) {
Vertex *vertex = graph_->pinLoadVertex(pin); Vertex *vertex = graph_->pinLoadVertex(pin);
if (vertex) { if (vertex) {