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), level_space_(10),
roots_(makeVertexSet(sta)), roots_(makeVertexSet(sta)),
relevelize_from_(makeVertexSet(sta)), relevelize_from_(makeVertexSet(sta)),
observer_(nullptr) observer_(nullptr),
drvr_vertices_level_valid_(false)
{ {
} }
@ -90,6 +91,7 @@ Levelize::clear()
loops_.clear(); loops_.clear();
loop_edges_.clear(); loop_edges_.clear();
max_level_ = 0; max_level_ = 0;
drvr_vertices_level_valid_ = false;
} }
void void
@ -550,6 +552,7 @@ Levelize::invalid()
debugPrint(debug_, "levelize", 1, "levels invalid"); debugPrint(debug_, "levelize", 1, "levels invalid");
levelized_ = false; levelized_ = false;
levels_valid_ = false; levels_valid_ = false;
drvr_vertices_level_valid_ = false;
} }
} }
@ -559,6 +562,7 @@ Levelize::deleteVertexBefore(Vertex *vertex)
if (levelized_) { if (levelized_) {
roots_.erase(vertex); roots_.erase(vertex);
relevelize_from_.erase(vertex); relevelize_from_.erase(vertex);
drvr_vertices_level_valid_ = false;
} }
} }
@ -570,6 +574,7 @@ Levelize::relevelizeFrom(Vertex *vertex)
vertex->to_string(this)); vertex->to_string(this));
relevelize_from_.insert(vertex); relevelize_from_.insert(vertex);
levels_valid_ = false; levels_valid_ = false;
drvr_vertices_level_valid_ = false;
} }
} }
@ -584,6 +589,7 @@ Levelize::deleteEdgeBefore(Edge *edge)
// fails because the DFS path will be missing. // fails because the DFS path will be missing.
levelized_ = false; levelized_ = false;
levels_valid_ = 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) : GraphLoop::GraphLoop(EdgeSeq *edges) :

View File

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