GraphDelayCalc::initLoadSlews
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
042f1f84d1
commit
2bc81c9bda
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue