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),
|
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) :
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue