fix race ND

Signed-off-by: dsengupta0628 <dsengupta@precisioninno.com>
This commit is contained in:
dsengupta0628 2026-03-31 21:35:01 +00:00
parent 41ad5c62b8
commit df007256de
2 changed files with 37 additions and 13 deletions

View File

@ -425,7 +425,8 @@ GraphDelayCalc::seedDrvrSlew(Vertex *drvr_vertex,
if (from_port == nullptr)
from_port = driveCellDefaultFromPort(drvr_cell, to_port);
findInputDriverDelay(drvr_cell, drvr_pin, drvr_vertex, rf,
from_port, from_slews, to_port, scene, min_max);
from_port, from_slews, to_port, scene, min_max,
arc_delay_calc);
}
else
seedNoDrvrCellSlew(drvr_vertex, drvr_pin, rf, drive, scene, min_max,
@ -600,7 +601,8 @@ GraphDelayCalc::findInputDriverDelay(const LibertyCell *drvr_cell,
float *from_slews,
const LibertyPort *to_port,
const Scene *scene,
const MinMax *min_max)
const MinMax *min_max,
ArcDelayCalc *arc_delay_calc)
{
debugPrint(debug_, "delay_calc", 2, " driver cell {} {}",
drvr_cell->name(),
@ -609,11 +611,12 @@ GraphDelayCalc::findInputDriverDelay(const LibertyCell *drvr_cell,
for (TimingArc *arc : arc_set->arcs()) {
if (arc->toEdge()->asRiseFall() == rf) {
float from_slew = from_slews[arc->fromEdge()->index()];
findInputArcDelay(drvr_pin, drvr_vertex, arc, from_slew, scene, min_max);
findInputArcDelay(drvr_pin, drvr_vertex, arc, from_slew, scene, min_max,
arc_delay_calc);
}
}
}
arc_delay_calc_->finishDrvrPin();
arc_delay_calc->finishDrvrPin();
}
// Driving cell delay is the load dependent delay, which is the gate
@ -625,7 +628,8 @@ GraphDelayCalc::findInputArcDelay(const Pin *drvr_pin,
const TimingArc *arc,
float from_slew,
const Scene *scene,
const MinMax *min_max)
const MinMax *min_max,
ArcDelayCalc *arc_delay_calc)
{
debugPrint(debug_, "delay_calc", 3, " {} {} -> {} {} ({})",
arc->from()->name(),
@ -639,33 +643,51 @@ GraphDelayCalc::findInputArcDelay(const Pin *drvr_pin,
const Parasitic *parasitic;
float load_cap;
parasiticLoad(drvr_pin, drvr_rf, scene, min_max, nullptr, arc_delay_calc_,
parasiticLoad(drvr_pin, drvr_rf, scene, min_max, nullptr, arc_delay_calc,
load_cap, parasitic);
LoadPinIndexMap load_pin_index_map = makeLoadPinIndexMap(drvr_vertex);
ArcDcalcResult intrinsic_result =
arc_delay_calc_->gateDelay(drvr_pin, arc, Slew(from_slew), 0.0, nullptr,
arc_delay_calc->gateDelay(drvr_pin, arc, Slew(from_slew), 0.0, nullptr,
load_pin_index_map, scene, min_max);
const ArcDelay &intrinsic_delay = intrinsic_result.gateDelay();
ArcDcalcResult gate_result = arc_delay_calc_->gateDelay(drvr_pin, arc,
ArcDcalcResult gate_result = arc_delay_calc->gateDelay(drvr_pin, arc,
Slew(from_slew), load_cap,
parasitic,
parasitic,
load_pin_index_map,
scene, min_max);
const ArcDelay &gate_delay = gate_result.gateDelay();
const Slew &gate_slew = gate_result.drvrSlew();
const ArcDelay load_delay = delayDiff(gate_delay, intrinsic_delay, this);
{
float ld = delayAsFloat(load_delay);
if (ld > 1e-6f || ld < -1e-6f)
report_->report(
"DEBUG findInputArcDelay: load_delay={}"
" gate_delay={} intrinsic_delay={}"
" from_slew={:g} load_cap={:g} parasitic={}"
" drvr={} arc={}->{}({})",
delayAsString(load_delay, this),
delayAsString(gate_delay, this),
delayAsString(intrinsic_delay, this),
from_slew, load_cap,
parasitic != nullptr ? "pi" : "null",
network_->pathName(drvr_pin),
arc->from()->name(),
arc->to()->name(),
drvr_rf->to_string());
}
debugPrint(debug_, "delay_calc", 3,
" gate delay = {} intrinsic = {} slew = {}",
delayAsString(gate_delay, this),
delayAsString(intrinsic_delay, this),
delayAsString(gate_slew, this));
graph_->setSlew(drvr_vertex, drvr_rf, ap_index, gate_slew);
annotateLoadDelays(drvr_vertex, drvr_rf, gate_result, load_pin_index_map,
annotateLoadDelays(drvr_vertex, drvr_rf, gate_result, load_pin_index_map,
load_delay, false, scene, min_max);
arc_delay_calc_->finishDrvrPin();
arc_delay_calc->finishDrvrPin();
}
}

View File

@ -174,7 +174,8 @@ protected:
float *from_slews,
const LibertyPort *to_port,
const Scene *scene,
const MinMax *min_max);
const MinMax *min_max,
ArcDelayCalc *arc_delay_calc);
LibertyPort *driveCellDefaultFromPort(const LibertyCell *cell,
const LibertyPort *to_port);
int findPortIndex(const LibertyCell *cell,
@ -184,7 +185,8 @@ protected:
const TimingArc *arc,
float from_slew,
const Scene *scene,
const MinMax *min_max);
const MinMax *min_max,
ArcDelayCalc *arc_delay_calc);
void findDriverDelays(Vertex *drvr_vertex,
ArcDelayCalc *arc_delay_calc,
LoadPinIndexMap &load_pin_index_map);