hpin clk disables without graph

This commit is contained in:
James Cherry 2020-07-12 10:29:06 -07:00
parent 7e71edecf2
commit f60b82fee5
2 changed files with 12 additions and 28 deletions

View File

@ -1245,9 +1245,6 @@ protected:
void disconnectPinBefore(Pin *pin, void disconnectPinBefore(Pin *pin,
ExceptionPathSet *exceptions); ExceptionPathSet *exceptions);
void clockGroupsDeleteClkRefs(Clock *clk); void clockGroupsDeleteClkRefs(Clock *clk);
void makeVertexClkHpinDisables(Clock *clk,
Vertex *vertex,
FindClkHpinDisables &visitor);
void clearGroupPathMap(); void clearGroupPathMap();
AnalysisType analysis_type_; AnalysisType analysis_type_;

View File

@ -1392,16 +1392,20 @@ Sdc::ensureClkHpinDisables()
for (auto clk : clocks_) { for (auto clk : clocks_) {
for (Pin *src : clk->pins()) { for (Pin *src : clk->pins()) {
if (network_->isHierarchical(src)) { if (network_->isHierarchical(src)) {
FindClkHpinDisables visitor(clk, network_, this); FindClkHpinDisables visitor1(clk, network_, this);
visitHpinDrvrLoads(src, network_, &visitor); visitHpinDrvrLoads(src, network_, &visitor1);
PinSeq loads, drvrs;
PinSet visited_drvrs;
FindNetDrvrLoads visitor2(nullptr, visited_drvrs, loads, drvrs, network_);
network_->visitConnectedPins(src, visitor2);
// Disable fanouts from the src driver pins that do // Disable fanouts from the src driver pins that do
// not go thru the hierarchical src pin. // not go thru the hierarchical src pin.
for (Pin *lpin : clk->leafPins()) { for (Pin *drvr : drvrs) {
Vertex *vertex, *bidirect_drvr_vertex; for (Pin *load : loads) {
graph_->pinVertices(lpin, vertex, bidirect_drvr_vertex); if (!visitor1.drvrLoadExists(drvr, load))
makeVertexClkHpinDisables(clk, vertex, visitor); makeClkHpinDisable(clk, drvr, load);
if (bidirect_drvr_vertex) }
makeVertexClkHpinDisables(clk, bidirect_drvr_vertex, visitor);
} }
} }
} }
@ -1410,23 +1414,6 @@ Sdc::ensureClkHpinDisables()
} }
} }
void
Sdc::makeVertexClkHpinDisables(Clock *clk,
Vertex *vertex,
FindClkHpinDisables &visitor)
{
VertexOutEdgeIterator edge_iter(vertex, graph_);
while (edge_iter.hasNext()) {
Edge *edge = edge_iter.next();
if (edge->isWire()) {
Pin *drvr = edge->from(graph_)->pin();
Pin *load = edge->to(graph_)->pin();
if (!visitor.drvrLoadExists(drvr, load))
makeClkHpinDisable(clk, drvr, load);
}
}
}
void void
Sdc::makeClkHpinDisable(Clock *clk, Sdc::makeClkHpinDisable(Clock *clk,
Pin *drvr, Pin *drvr,