diff --git a/search/Levelize.cc b/search/Levelize.cc index 7d588d5f..f281ff07 100644 --- a/search/Levelize.cc +++ b/search/Levelize.cc @@ -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) : diff --git a/search/Levelize.hh b/search/Levelize.hh index 3a30d869..80396cf3 100644 --- a/search/Levelize.hh +++ b/search/Levelize.hh @@ -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.