GraphDelayCalc::initLoadSlews

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2023-11-12 18:39:02 -07:00
parent 042f1f84d1
commit 2bc81c9bda
2 changed files with 31 additions and 21 deletions

View File

@ -903,25 +903,45 @@ GraphDelayCalc::findDriverDelays(Vertex *drvr_vertex,
if (multi_drvr) { if (multi_drvr) {
Vertex *dcalc_drvr = multi_drvr->dcalcDrvr(); Vertex *dcalc_drvr = multi_drvr->dcalcDrvr();
if (drvr_vertex == dcalc_drvr) { if (drvr_vertex == dcalc_drvr) {
bool init_load_slews = true; initLoadSlews(drvr_vertex);
for (Vertex *drvr_vertex : *multi_drvr->drvrs()) { for (Vertex *drvr_vertex : *multi_drvr->drvrs()) {
// Only init load slews once so previous driver dcalc results // Only init load slews once so previous driver dcalc results
// aren't clobbered. // aren't clobbered.
delay_changed |= findDriverDelays1(drvr_vertex, init_load_slews, delay_changed |= findDriverDelays1(drvr_vertex, multi_drvr, arc_delay_calc);
multi_drvr, arc_delay_calc);
init_load_slews = false;
} }
} }
} }
else else {
delay_changed = findDriverDelays1(drvr_vertex, true, nullptr, arc_delay_calc); initLoadSlews(drvr_vertex);
delay_changed = findDriverDelays1(drvr_vertex, nullptr, arc_delay_calc);
}
arc_delay_calc->finishDrvrPin(); arc_delay_calc->finishDrvrPin();
return delay_changed; return delay_changed;
} }
void
GraphDelayCalc::initLoadSlews(Vertex *drvr_vertex)
{
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_);
for (auto dcalc_ap : corners_->dcalcAnalysisPts()) {
const MinMax *slew_min_max = dcalc_ap->slewMinMax();
Slew slew_init_value(slew_min_max->initValue());
DcalcAPIndex ap_index = dcalc_ap->index();
for (auto rf : RiseFall::range()) {
if (!load_vertex->slewAnnotated(rf, slew_min_max))
graph_->setSlew(load_vertex, rf, ap_index, slew_init_value);
}
}
}
}
}
bool bool
GraphDelayCalc::findDriverDelays1(Vertex *drvr_vertex, GraphDelayCalc::findDriverDelays1(Vertex *drvr_vertex,
bool init_load_slews,
MultiDrvrNet *multi_drvr, MultiDrvrNet *multi_drvr,
ArcDelayCalc *arc_delay_calc) ArcDelayCalc *arc_delay_calc)
{ {
@ -929,7 +949,7 @@ GraphDelayCalc::findDriverDelays1(Vertex *drvr_vertex,
Instance *drvr_inst = network_->instance(drvr_pin); Instance *drvr_inst = network_->instance(drvr_pin);
LibertyCell *drvr_cell = network_->libertyCell(drvr_inst); LibertyCell *drvr_cell = network_->libertyCell(drvr_inst);
initSlew(drvr_vertex); initSlew(drvr_vertex);
initWireDelays(drvr_vertex, init_load_slews); initWireDelays(drvr_vertex);
bool delay_changed = false; bool delay_changed = false;
bool has_delays = false; bool has_delays = false;
VertexInEdgeIterator edge_iter(drvr_vertex, graph_); VertexInEdgeIterator edge_iter(drvr_vertex, graph_);
@ -1200,29 +1220,20 @@ GraphDelayCalc::zeroSlewAndWireDelays(Vertex *drvr_vertex)
} }
} }
// Init wire delays and load slews.
void void
GraphDelayCalc::initWireDelays(Vertex *drvr_vertex, GraphDelayCalc::initWireDelays(Vertex *drvr_vertex)
bool init_load_slews)
{ {
VertexOutEdgeIterator edge_iter(drvr_vertex, graph_); VertexOutEdgeIterator edge_iter(drvr_vertex, graph_);
while (edge_iter.hasNext()) { while (edge_iter.hasNext()) {
Edge *wire_edge = edge_iter.next(); Edge *wire_edge = edge_iter.next();
if (wire_edge->isWire()) { if (wire_edge->isWire()) {
Vertex *load_vertex = wire_edge->to(graph_);
for (auto dcalc_ap : corners_->dcalcAnalysisPts()) { for (auto dcalc_ap : corners_->dcalcAnalysisPts()) {
const MinMax *delay_min_max = dcalc_ap->delayMinMax(); const MinMax *delay_min_max = dcalc_ap->delayMinMax();
const MinMax *slew_min_max = dcalc_ap->slewMinMax();
Delay delay_init_value(delay_min_max->initValue()); Delay delay_init_value(delay_min_max->initValue());
Slew slew_init_value(slew_min_max->initValue());
DcalcAPIndex ap_index = dcalc_ap->index(); DcalcAPIndex ap_index = dcalc_ap->index();
for (auto rf : RiseFall::range()) { for (auto rf : RiseFall::range()) {
if (!graph_->wireDelayAnnotated(wire_edge, rf, ap_index)) if (!graph_->wireDelayAnnotated(wire_edge, rf, ap_index))
graph_->setWireArcDelay(wire_edge, rf, ap_index, delay_init_value); graph_->setWireArcDelay(wire_edge, rf, ap_index, delay_init_value);
// Init load vertex slew.
if (init_load_slews
&& !load_vertex->slewAnnotated(rf, slew_min_max))
graph_->setSlew(load_vertex, rf, ap_index, slew_init_value);
} }
} }
} }

View File

@ -159,9 +159,9 @@ protected:
bool findDriverDelays(Vertex *drvr_vertex, bool findDriverDelays(Vertex *drvr_vertex,
ArcDelayCalc *arc_delay_calc); ArcDelayCalc *arc_delay_calc);
bool findDriverDelays1(Vertex *drvr_vertex, bool findDriverDelays1(Vertex *drvr_vertex,
bool init_load_slews,
MultiDrvrNet *multi_drvr, MultiDrvrNet *multi_drvr,
ArcDelayCalc *arc_delay_calc); ArcDelayCalc *arc_delay_calc);
void initLoadSlews(Vertex *drvr_vertex);
bool findDriverEdgeDelays(LibertyCell *drvr_cell, bool findDriverEdgeDelays(LibertyCell *drvr_cell,
Instance *drvr_inst, Instance *drvr_inst,
const Pin *drvr_pin, const Pin *drvr_pin,
@ -169,8 +169,7 @@ protected:
MultiDrvrNet *multi_drvr, MultiDrvrNet *multi_drvr,
Edge *edge, Edge *edge,
ArcDelayCalc *arc_delay_calc); ArcDelayCalc *arc_delay_calc);
void initWireDelays(Vertex *drvr_vertex, void initWireDelays(Vertex *drvr_vertex);
bool init_load_slews);
void initRootSlews(Vertex *vertex); void initRootSlews(Vertex *vertex);
void zeroSlewAndWireDelays(Vertex *drvr_vertex); void zeroSlewAndWireDelays(Vertex *drvr_vertex);
void findVertexDelay(Vertex *vertex, void findVertexDelay(Vertex *vertex,