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.
void deleteVertexBefore(Vertex *vertex);
void remove(Vertex *vertex);
void reportEntries();
void reportEntries() const;
virtual bool hasNext();
bool hasNext(Level to_level);
@ -103,7 +103,7 @@ protected:
Level level2) const = 0;
virtual bool levelLessOrEqual(Level level1,
Level level2) const = 0;
virtual void incrLevel(Level &level) = 0;
virtual void incrLevel(Level &level) const = 0;
void findNext(Level to_level);
void deleteEntries();
@ -139,7 +139,7 @@ protected:
Level level2) const;
virtual bool levelLess(Level level1,
Level level2) const;
virtual void incrLevel(Level &level);
virtual void incrLevel(Level &level) const;
};
class BfsBkwdIterator : public BfsIterator
@ -159,7 +159,7 @@ protected:
Level level2) const;
virtual bool levelLess(Level level1,
Level level2) const;
virtual void incrLevel(Level &level);
virtual void incrLevel(Level &level) const;
};
} // namespace

View File

@ -89,20 +89,17 @@ BfsIterator::clear()
}
void
BfsIterator::reportEntries()
BfsIterator::reportEntries() const
{
Level level = first_level_;
while (levelLessOrEqual(level, last_level_)) {
VertexSeq &level_vertices = queue_[level];
for (Level level=first_level_; levelLessOrEqual(level, last_level_);incrLevel(level)){
const VertexSeq &level_vertices = queue_[level];
if (!level_vertices.empty()) {
report_->reportLine("Level %d", level);
for (Vertex *vertex : level_vertices) {
if (vertex)
report_->reportLine(" %s", vertex->to_string(this).c_str());
for (Vertex *vertex : level_vertices)
report_->reportLine(" %s",
vertex ? vertex->to_string(this).c_str() : "NULL");
}
}
incrLevel(level);
}
}
void
@ -255,10 +252,19 @@ void
BfsIterator::findNext(Level to_level)
{
while (levelLessOrEqual(first_level_, last_level_)
&& levelLessOrEqual(first_level_, to_level)
&& queue_[first_level_].empty())
&& levelLessOrEqual(first_level_, to_level)) {
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_);
}
}
void
BfsIterator::enqueue(Vertex *vertex)
@ -319,6 +325,9 @@ BfsIterator::remove(Vertex *vertex)
Level level = vertex->level();
if (vertex->bfsInQueue(bfs_index_)
&& 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]) {
if (v == vertex) {
v = nullptr;
@ -346,7 +355,7 @@ BfsFwdIterator::~BfsFwdIterator()
}
void
BfsFwdIterator::incrLevel(Level &level)
BfsFwdIterator::incrLevel(Level &level) const
{
level++;
}
@ -400,7 +409,7 @@ BfsBkwdIterator::~BfsBkwdIterator()
}
void
BfsBkwdIterator::incrLevel(Level &level)
BfsBkwdIterator::incrLevel(Level &level) const
{
level--;
}

View File

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

View File

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

View File

@ -32,6 +32,7 @@
#include "search/Levelize.hh"
#include "search/ReportPath.hh"
#include "PathExpanded.hh"
#include "Bfs.hh"
#include "Sta.hh"
using namespace sta;
@ -1128,6 +1129,32 @@ set_use_default_arrival_clock(bool 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
////////////////////////////////////////////////////////////////

View File

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