From 6110a6b96563676228bd51f95a21ae0a2da2aa92 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Fri, 19 Jul 2024 19:55:52 -0700 Subject: [PATCH] issue52 constant disabled edge delay calc Signed-off-by: James Cherry --- dcalc/GraphDelayCalc.cc | 61 ++++++++++++++++++----------------- include/sta/GraphDelayCalc.hh | 8 +++-- 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/dcalc/GraphDelayCalc.cc b/dcalc/GraphDelayCalc.cc index 9722c76d..159d868c 100644 --- a/dcalc/GraphDelayCalc.cc +++ b/dcalc/GraphDelayCalc.cc @@ -796,7 +796,7 @@ GraphDelayCalc::findDriverDelays1(Vertex *drvr_vertex, else initWireDelays(drvr_vertex); bool delay_changed = false; - bool has_delays = false; + array delay_exists = {false, false}; VertexInEdgeIterator edge_iter(drvr_vertex, graph_); while (edge_iter.hasNext()) { Edge *edge = edge_iter.next(); @@ -804,14 +804,14 @@ GraphDelayCalc::findDriverDelays1(Vertex *drvr_vertex, // Don't let disabled edges set slews that influence downstream delays. if (search_pred_->searchFrom(from_vertex) && search_pred_->searchThru(edge) - && !edge->role()->isLatchDtoQ()) { + && !edge->role()->isLatchDtoQ()) delay_changed |= findDriverEdgeDelays(drvr_vertex, multi_drvr, edge, - arc_delay_calc); - has_delays = true; - } + arc_delay_calc, delay_exists); + } + for (auto rf : RiseFall::range()) { + if (!delay_exists[rf->index()]) + zeroSlewAndWireDelays(drvr_vertex, rf); } - if (!has_delays) - zeroSlewAndWireDelays(drvr_vertex); if (delay_changed && observer_) observer_->delayChangedTo(drvr_vertex); return delay_changed; @@ -840,8 +840,9 @@ GraphDelayCalc::findLatchEdgeDelays(Edge *edge) Instance *drvr_inst = network_->instance(drvr_pin); debugPrint(debug_, "delay_calc", 2, "find latch D->Q %s", sdc_network_->pathName(drvr_inst)); + array delay_exists = {false, false}; bool delay_changed = findDriverEdgeDelays(drvr_vertex, nullptr, edge, - arc_delay_calc_); + arc_delay_calc_, delay_exists); if (delay_changed && observer_) observer_->delayChangedTo(drvr_vertex); } @@ -850,17 +851,20 @@ bool GraphDelayCalc::findDriverEdgeDelays(Vertex *drvr_vertex, const MultiDrvrNet *multi_drvr, Edge *edge, - ArcDelayCalc *arc_delay_calc) + ArcDelayCalc *arc_delay_calc, + array &delay_exists) { Vertex *from_vertex = edge->from(graph_); const TimingArcSet *arc_set = edge->timingArcSet(); bool delay_changed = false; LoadPinIndexMap load_pin_index_map = makeLoadPinIndexMap(drvr_vertex); for (auto dcalc_ap : corners_->dcalcAnalysisPts()) { - for (const TimingArc *arc : arc_set->arcs()) + for (const TimingArc *arc : arc_set->arcs()) { delay_changed |= findDriverArcDelays(drvr_vertex, multi_drvr, edge, arc, load_pin_index_map, dcalc_ap, arc_delay_calc); + delay_exists[arc->toEdge()->asRiseFall()->index()] = true; + } } if (delay_changed && observer_) { observer_->delayChangedFrom(from_vertex); @@ -1328,30 +1332,29 @@ GraphDelayCalc::initSlew(Vertex *vertex) } void -GraphDelayCalc::zeroSlewAndWireDelays(Vertex *drvr_vertex) +GraphDelayCalc::zeroSlewAndWireDelays(Vertex *drvr_vertex, + const RiseFall *rf) { for (auto dcalc_ap : corners_->dcalcAnalysisPts()) { DcalcAPIndex ap_index = dcalc_ap->index(); const MinMax *slew_min_max = dcalc_ap->slewMinMax(); - for (auto rf : RiseFall::range()) { - // Init drvr slew. - if (!drvr_vertex->slewAnnotated(rf, slew_min_max)) { - DcalcAPIndex ap_index = dcalc_ap->index(); - graph_->setSlew(drvr_vertex, rf, ap_index, slew_min_max->initValue()); - } + // Init drvr slew. + if (!drvr_vertex->slewAnnotated(rf, slew_min_max)) { + DcalcAPIndex ap_index = dcalc_ap->index(); + graph_->setSlew(drvr_vertex, rf, ap_index, slew_min_max->initValue()); + } - // Init wire delays and slews. - VertexOutEdgeIterator edge_iter(drvr_vertex, graph_); - while (edge_iter.hasNext()) { - Edge *wire_edge = edge_iter.next(); - if (wire_edge->isWire()) { - Vertex *load_vertex = wire_edge->to(graph_); - if (!graph_->wireDelayAnnotated(wire_edge, rf, ap_index)) - graph_->setWireArcDelay(wire_edge, rf, ap_index, 0.0); - // Init load vertex slew. - if (!load_vertex->slewAnnotated(rf, slew_min_max)) - graph_->setSlew(load_vertex, rf, ap_index, 0.0); - } + // Init wire delays and slews. + VertexOutEdgeIterator edge_iter(drvr_vertex, graph_); + while (edge_iter.hasNext()) { + Edge *wire_edge = edge_iter.next(); + if (wire_edge->isWire()) { + Vertex *load_vertex = wire_edge->to(graph_); + if (!graph_->wireDelayAnnotated(wire_edge, rf, ap_index)) + graph_->setWireArcDelay(wire_edge, rf, ap_index, 0.0); + // Init load vertex slew. + if (!load_vertex->slewAnnotated(rf, slew_min_max)) + graph_->setSlew(load_vertex, rf, ap_index, 0.0); } } } diff --git a/include/sta/GraphDelayCalc.hh b/include/sta/GraphDelayCalc.hh index c25ac2cf..e91fa00a 100644 --- a/include/sta/GraphDelayCalc.hh +++ b/include/sta/GraphDelayCalc.hh @@ -18,6 +18,7 @@ #include #include +#include #include "Map.hh" #include "NetworkClass.hh" @@ -32,6 +33,7 @@ namespace sta { using std::vector; using std::map; +using std::array; class DelayCalcObserver; class MultiDrvrNet; @@ -171,7 +173,8 @@ protected: bool findDriverEdgeDelays(Vertex *drvr_vertex, const MultiDrvrNet *multi_drvr, Edge *edge, - ArcDelayCalc *arc_delay_calc); + ArcDelayCalc *arc_delay_calc, + array &delay_exists); bool findDriverArcDelays(Vertex *drvr_vertex, const MultiDrvrNet *multi_drvr, Edge *edge, @@ -193,7 +196,8 @@ protected: const TimingArc *&arc); void initWireDelays(Vertex *drvr_vertex); void initRootSlews(Vertex *vertex); - void zeroSlewAndWireDelays(Vertex *drvr_vertex); + void zeroSlewAndWireDelays(Vertex *drvr_vertex, + const RiseFall *rf); void findVertexDelay(Vertex *vertex, ArcDelayCalc *arc_delay_calc, bool propagate);