@@ -53,7 +53,8 @@ Levelize::Levelize(StaState *sta) :
5353 level_space_ (10 ),
5454 roots_ (makeVertexSet(sta)),
5555 relevelize_from_ (makeVertexSet(sta)),
56- observer_ (nullptr )
56+ observer_ (nullptr ),
57+ drvr_vertices_level_valid_ (false )
5758{
5859}
5960
@@ -90,6 +91,8 @@ Levelize::clear()
9091 loops_.clear ();
9192 loop_edges_.clear ();
9293 max_level_ = 0 ;
94+ drvr_vertices_level_valid_ = false ;
95+ levelized_drvr_vertices_.clear ();
9396}
9497
9598void
@@ -546,6 +549,7 @@ Levelize::setLevel(Vertex *vertex,
546549void
547550Levelize::invalid ()
548551{
552+ drvr_vertices_level_valid_ = false ;
549553 if (levelized_) {
550554 debugPrint (debug_, " levelize" , 1 , " levels invalid" );
551555 levelized_ = false ;
@@ -559,6 +563,8 @@ Levelize::deleteVertexBefore(Vertex *vertex)
559563 if (levelized_) {
560564 roots_.erase (vertex);
561565 relevelize_from_.erase (vertex);
566+ drvr_vertices_level_valid_ = false ;
567+ levelized_drvr_vertices_.clear ();
562568 }
563569}
564570
@@ -570,6 +576,7 @@ Levelize::relevelizeFrom(Vertex *vertex)
570576 vertex->to_string (this ));
571577 relevelize_from_.insert (vertex);
572578 levels_valid_ = false ;
579+ drvr_vertices_level_valid_ = false ;
573580 }
574581}
575582
@@ -584,6 +591,7 @@ Levelize::deleteEdgeBefore(Edge *edge)
584591 // fails because the DFS path will be missing.
585592 levelized_ = false ;
586593 levels_valid_ = false ;
594+ drvr_vertices_level_valid_ = false ;
587595 }
588596}
589597
@@ -710,6 +718,36 @@ Levelize::checkLevels()
710718 }
711719}
712720
721+ void
722+ Levelize::levelizeDrvrVertices ()
723+ {
724+ levelized_drvr_vertices_.clear ();
725+ // Rough estimate: ~half of vertices are drivers
726+ levelized_drvr_vertices_.reserve (graph_->vertexCount () / 2 );
727+ VertexIterator vertex_iter (graph_);
728+ while (vertex_iter.hasNext ()) {
729+ Vertex *vertex = vertex_iter.next ();
730+ if (vertex->isDriver (network_))
731+ levelized_drvr_vertices_.emplace_back (vertex);
732+ }
733+ sort (levelized_drvr_vertices_,
734+ [this ](const Vertex *a, const Vertex *b) {
735+ if (a->level () != b->level ())
736+ return a->level () < b->level ();
737+ return VertexNameLess (network_)(a, b);
738+ });
739+ drvr_vertices_level_valid_ = true ;
740+ }
741+
742+ const VertexSeq &
743+ Levelize::levelizedDrvrVertices ()
744+ {
745+ ensureLevelized ();
746+ if (!drvr_vertices_level_valid_)
747+ levelizeDrvrVertices ();
748+ return levelized_drvr_vertices_;
749+ }
750+
713751// //////////////////////////////////////////////////////////////
714752
715753GraphLoop::GraphLoop (EdgeSeq *edges) :
0 commit comments