added driver vertex levelization
Signed-off-by: Cho Moon <cmoon@precisioninno.com>
This commit is contained in:
parent
fe61456df6
commit
55bb77ff89
|
|
@ -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) :
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Reference in New Issue