added driver vertex levelization

Signed-off-by: Cho Moon <cmoon@precisioninno.com>
This commit is contained in:
Cho Moon 2026-03-31 22:59:52 +00:00
parent fe61456df6
commit 55bb77ff89
2 changed files with 38 additions and 2 deletions

View File

@ -53,7 +53,8 @@ Levelize::Levelize(StaState *sta) :
level_space_(10),
roots_(makeVertexSet(sta)),
relevelize_from_(makeVertexSet(sta)),
observer_(nullptr)
observer_(nullptr),
drvr_vertices_level_valid_(false)
{
}
@ -90,6 +91,7 @@ Levelize::clear()
loops_.clear();
loop_edges_.clear();
max_level_ = 0;
drvr_vertices_level_valid_ = false;
}
void
@ -550,6 +552,7 @@ Levelize::invalid()
debugPrint(debug_, "levelize", 1, "levels invalid");
levelized_ = false;
levels_valid_ = false;
drvr_vertices_level_valid_ = false;
}
}
@ -559,6 +562,7 @@ Levelize::deleteVertexBefore(Vertex *vertex)
if (levelized_) {
roots_.erase(vertex);
relevelize_from_.erase(vertex);
drvr_vertices_level_valid_ = false;
}
}
@ -570,6 +574,7 @@ Levelize::relevelizeFrom(Vertex *vertex)
vertex->to_string(this));
relevelize_from_.insert(vertex);
levels_valid_ = false;
drvr_vertices_level_valid_ = false;
}
}
@ -584,6 +589,7 @@ Levelize::deleteEdgeBefore(Edge *edge)
// fails because the DFS path will be missing.
levelized_ = false;
levels_valid_ = false;
drvr_vertices_level_valid_ = false;
}
}
@ -710,6 +716,32 @@ Levelize::checkLevels()
}
}
void
Levelize::levelizeDrvrVertices()
{
levelized_drvr_vertices_.clear();
VertexIterator vertex_iter(graph_);
while (vertex_iter.hasNext()) {
Vertex *vertex = vertex_iter.next();
if (vertex->isDriver(network_))
levelized_drvr_vertices_.emplace_back(vertex);
}
sort(levelized_drvr_vertices_,
[](const Vertex *a, const Vertex *b) {
return a->level() < b->level();
});
drvr_vertices_level_valid_ = true;
}
const VertexSeq &
Levelize::levelizedDrvrVertices()
{
ensureLevelized();
if (!drvr_vertices_level_valid_)
levelizeDrvrVertices();
return levelized_drvr_vertices_;
}
////////////////////////////////////////////////////////////////
GraphLoop::GraphLoop(EdgeSeq *edges) :

View File

@ -74,7 +74,8 @@ public:
void checkLevels();
// Public for regression testing.
void levelize();
const VertexSeq &levelizedDrvrVertices();
protected:
void findRoots();
VertexSeq sortedRootsWithFanout();
@ -104,6 +105,7 @@ protected:
void clearLoopEdges();
void deleteLoops();
void reportPath(EdgeSeq &path) const;
void levelizeDrvrVertices();
bool levelized_;
bool levels_valid_;
@ -116,6 +118,8 @@ protected:
EdgeSet disabled_loop_edges_;
EdgeSet latch_d_to_q_edges_;
LevelizeObserver *observer_;
VertexSeq levelized_drvr_vertices_;
bool drvr_vertices_level_valid_;
};
// Loops broken by levelization may not necessarily be combinational.