issue52 constant disabled edge delay calc

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2024-07-19 19:55:52 -07:00
parent 50a249d7ae
commit 6110a6b965
2 changed files with 38 additions and 31 deletions

View File

@ -796,7 +796,7 @@ GraphDelayCalc::findDriverDelays1(Vertex *drvr_vertex,
else else
initWireDelays(drvr_vertex); initWireDelays(drvr_vertex);
bool delay_changed = false; bool delay_changed = false;
bool has_delays = false; array<bool, RiseFall::index_count> delay_exists = {false, false};
VertexInEdgeIterator edge_iter(drvr_vertex, graph_); VertexInEdgeIterator edge_iter(drvr_vertex, graph_);
while (edge_iter.hasNext()) { while (edge_iter.hasNext()) {
Edge *edge = edge_iter.next(); 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. // Don't let disabled edges set slews that influence downstream delays.
if (search_pred_->searchFrom(from_vertex) if (search_pred_->searchFrom(from_vertex)
&& search_pred_->searchThru(edge) && search_pred_->searchThru(edge)
&& !edge->role()->isLatchDtoQ()) { && !edge->role()->isLatchDtoQ())
delay_changed |= findDriverEdgeDelays(drvr_vertex, multi_drvr, edge, delay_changed |= findDriverEdgeDelays(drvr_vertex, multi_drvr, edge,
arc_delay_calc); arc_delay_calc, delay_exists);
has_delays = true;
} }
for (auto rf : RiseFall::range()) {
if (!delay_exists[rf->index()])
zeroSlewAndWireDelays(drvr_vertex, rf);
} }
if (!has_delays)
zeroSlewAndWireDelays(drvr_vertex);
if (delay_changed && observer_) if (delay_changed && observer_)
observer_->delayChangedTo(drvr_vertex); observer_->delayChangedTo(drvr_vertex);
return delay_changed; return delay_changed;
@ -840,8 +840,9 @@ GraphDelayCalc::findLatchEdgeDelays(Edge *edge)
Instance *drvr_inst = network_->instance(drvr_pin); Instance *drvr_inst = network_->instance(drvr_pin);
debugPrint(debug_, "delay_calc", 2, "find latch D->Q %s", debugPrint(debug_, "delay_calc", 2, "find latch D->Q %s",
sdc_network_->pathName(drvr_inst)); sdc_network_->pathName(drvr_inst));
array<bool, RiseFall::index_count> delay_exists = {false, false};
bool delay_changed = findDriverEdgeDelays(drvr_vertex, nullptr, edge, bool delay_changed = findDriverEdgeDelays(drvr_vertex, nullptr, edge,
arc_delay_calc_); arc_delay_calc_, delay_exists);
if (delay_changed && observer_) if (delay_changed && observer_)
observer_->delayChangedTo(drvr_vertex); observer_->delayChangedTo(drvr_vertex);
} }
@ -850,17 +851,20 @@ bool
GraphDelayCalc::findDriverEdgeDelays(Vertex *drvr_vertex, GraphDelayCalc::findDriverEdgeDelays(Vertex *drvr_vertex,
const MultiDrvrNet *multi_drvr, const MultiDrvrNet *multi_drvr,
Edge *edge, Edge *edge,
ArcDelayCalc *arc_delay_calc) ArcDelayCalc *arc_delay_calc,
array<bool, RiseFall::index_count> &delay_exists)
{ {
Vertex *from_vertex = edge->from(graph_); Vertex *from_vertex = edge->from(graph_);
const TimingArcSet *arc_set = edge->timingArcSet(); const TimingArcSet *arc_set = edge->timingArcSet();
bool delay_changed = false; bool delay_changed = false;
LoadPinIndexMap load_pin_index_map = makeLoadPinIndexMap(drvr_vertex); LoadPinIndexMap load_pin_index_map = makeLoadPinIndexMap(drvr_vertex);
for (auto dcalc_ap : corners_->dcalcAnalysisPts()) { 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, delay_changed |= findDriverArcDelays(drvr_vertex, multi_drvr, edge, arc,
load_pin_index_map, dcalc_ap, load_pin_index_map, dcalc_ap,
arc_delay_calc); arc_delay_calc);
delay_exists[arc->toEdge()->asRiseFall()->index()] = true;
}
} }
if (delay_changed && observer_) { if (delay_changed && observer_) {
observer_->delayChangedFrom(from_vertex); observer_->delayChangedFrom(from_vertex);
@ -1328,12 +1332,12 @@ GraphDelayCalc::initSlew(Vertex *vertex)
} }
void void
GraphDelayCalc::zeroSlewAndWireDelays(Vertex *drvr_vertex) GraphDelayCalc::zeroSlewAndWireDelays(Vertex *drvr_vertex,
const RiseFall *rf)
{ {
for (auto dcalc_ap : corners_->dcalcAnalysisPts()) { for (auto dcalc_ap : corners_->dcalcAnalysisPts()) {
DcalcAPIndex ap_index = dcalc_ap->index(); DcalcAPIndex ap_index = dcalc_ap->index();
const MinMax *slew_min_max = dcalc_ap->slewMinMax(); const MinMax *slew_min_max = dcalc_ap->slewMinMax();
for (auto rf : RiseFall::range()) {
// Init drvr slew. // Init drvr slew.
if (!drvr_vertex->slewAnnotated(rf, slew_min_max)) { if (!drvr_vertex->slewAnnotated(rf, slew_min_max)) {
DcalcAPIndex ap_index = dcalc_ap->index(); DcalcAPIndex ap_index = dcalc_ap->index();
@ -1354,7 +1358,6 @@ GraphDelayCalc::zeroSlewAndWireDelays(Vertex *drvr_vertex)
} }
} }
} }
}
} }
void void

View File

@ -18,6 +18,7 @@
#include <vector> #include <vector>
#include <mutex> #include <mutex>
#include <array>
#include "Map.hh" #include "Map.hh"
#include "NetworkClass.hh" #include "NetworkClass.hh"
@ -32,6 +33,7 @@ namespace sta {
using std::vector; using std::vector;
using std::map; using std::map;
using std::array;
class DelayCalcObserver; class DelayCalcObserver;
class MultiDrvrNet; class MultiDrvrNet;
@ -171,7 +173,8 @@ protected:
bool findDriverEdgeDelays(Vertex *drvr_vertex, bool findDriverEdgeDelays(Vertex *drvr_vertex,
const MultiDrvrNet *multi_drvr, const MultiDrvrNet *multi_drvr,
Edge *edge, Edge *edge,
ArcDelayCalc *arc_delay_calc); ArcDelayCalc *arc_delay_calc,
array<bool, RiseFall::index_count> &delay_exists);
bool findDriverArcDelays(Vertex *drvr_vertex, bool findDriverArcDelays(Vertex *drvr_vertex,
const MultiDrvrNet *multi_drvr, const MultiDrvrNet *multi_drvr,
Edge *edge, Edge *edge,
@ -193,7 +196,8 @@ protected:
const TimingArc *&arc); const TimingArc *&arc);
void initWireDelays(Vertex *drvr_vertex); void initWireDelays(Vertex *drvr_vertex);
void initRootSlews(Vertex *vertex); void initRootSlews(Vertex *vertex);
void zeroSlewAndWireDelays(Vertex *drvr_vertex); void zeroSlewAndWireDelays(Vertex *drvr_vertex,
const RiseFall *rf);
void findVertexDelay(Vertex *vertex, void findVertexDelay(Vertex *vertex,
ArcDelayCalc *arc_delay_calc, ArcDelayCalc *arc_delay_calc,
bool propagate); bool propagate);