BfsIterator after delete vertex
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
0ab75c30bf
commit
88c7779680
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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--;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue