issue52 constant disabled edge delay calc
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
50a249d7ae
commit
6110a6b965
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue