Skip to content

Commit 438633d

Browse files
authored
Merge pull request #329 from The-OpenROAD-Project-staging/sta_bias_pin_issue_commit_history_correct
Sta bias pin issue handling, non-determinism in delay calc
2 parents 12683d6 + d47cbeb commit 438633d

28 files changed

Lines changed: 938 additions & 236 deletions

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ set(STA_SOURCE
152152
sdc/DeratingFactors.cc
153153
sdc/DisabledPorts.cc
154154
sdc/ExceptionPath.cc
155+
sdc/FilterObjects.cc
155156
sdc/InputDrive.cc
156157
sdc/PinPair.cc
157158
sdc/PortDelay.cc

dcalc/DmpCeff.cc

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
#include "TimingArc.hh"
4545
#include "TableModel.hh"
4646
#include "Liberty.hh"
47-
#include "Network.hh"
4847
#include "Sdc.hh"
4948
#include "Parasitics.hh"
5049
#include "ArcDelayCalc.hh"
@@ -78,11 +77,11 @@ exp2(double x);
7877
class DmpError : public Exception
7978
{
8079
public:
81-
DmpError(const char *what);
82-
virtual const char *what() const noexcept { return what_; }
80+
DmpError(std::string_view what);
81+
virtual const char *what() const noexcept { return what_.c_str(); }
8382

8483
private:
85-
const char *what_;
84+
std::string what_;
8685
};
8786

8887
static double
@@ -139,9 +138,9 @@ class DmpAlg : public StaState
139138
double c2,
140139
double rpi,
141140
double c1);
142-
virtual void gateDelaySlew( // Return values.
143-
double &delay,
144-
double &slew) = 0;
141+
virtual void gateDelaySlew(// Return values.
142+
double &delay,
143+
double &slew) = 0;
145144
virtual void loadDelaySlew(const Pin *load_pin,
146145
double elmore,
147146
// Return values.
@@ -685,9 +684,9 @@ class DmpCap : public DmpAlg
685684
double c2,
686685
double rpi,
687686
double c1) override;
688-
void gateDelaySlew( // Return values.
689-
double &delay,
690-
double &slew) override;
687+
void gateDelaySlew(// Return values.
688+
double &delay,
689+
double &slew) override;
691690
void loadDelaySlew(const Pin *,
692691
double elmore,
693692
// Return values.
@@ -726,15 +725,15 @@ DmpCap::init(const LibertyLibrary *drvr_library,
726725
double c1)
727726
{
728727
debugPrint(debug_, "dmp_ceff", 3, "Using DMP cap");
729-
DmpAlg::init(drvr_library, drvr_cell, pvt, gate_model, rf, rd, in_slew, c2, rpi,
730-
c1);
728+
DmpAlg::init(drvr_library, drvr_cell, pvt, gate_model, rf, rd, in_slew,
729+
c2, rpi, c1);
731730
ceff_ = c1 + c2;
732731
}
733732

734733
void
735-
DmpCap::gateDelaySlew( // Return values.
736-
double &delay,
737-
double &slew)
734+
DmpCap::gateDelaySlew(// Return values.
735+
double &delay,
736+
double &slew)
738737
{
739738
debugPrint(debug_, "dmp_ceff", 3, " ceff = {}",
740739
units_->capacitanceUnit()->asString(ceff_));
@@ -801,9 +800,9 @@ class DmpPi : public DmpAlg
801800
double c2,
802801
double rpi,
803802
double c1) override;
804-
void gateDelaySlew( // Return values.
805-
double &delay,
806-
double &slew) override;
803+
void gateDelaySlew(// Return values.
804+
double &delay,
805+
double &slew) override;
807806
void evalDmpEqns() override;
808807
double voCrossingUpperBound() override;
809808

@@ -868,8 +867,8 @@ DmpPi::init(const LibertyLibrary *drvr_library,
868867
double c1)
869868
{
870869
debugPrint(debug_, "dmp_ceff", 3, "Using DMP Pi");
871-
DmpAlg::init(drvr_library, drvr_cell, pvt, gate_model, rf, rd, in_slew, c2, rpi,
872-
c1);
870+
DmpAlg::init(drvr_library, drvr_cell, pvt, gate_model, rf, rd, in_slew,
871+
c2, rpi, c1);
873872

874873
// Find poles/zeros.
875874
z1_ = 1.0 / (rpi_ * c1_);
@@ -893,9 +892,9 @@ DmpPi::init(const LibertyLibrary *drvr_library,
893892
}
894893

895894
void
896-
DmpPi::gateDelaySlew( // Return values.
897-
double &delay,
898-
double &slew)
895+
DmpPi::gateDelaySlew(// Return values.
896+
double &delay,
897+
double &slew)
899898
{
900899
driver_valid_ = false;
901900
try {
@@ -1127,9 +1126,9 @@ class DmpZeroC2 : public DmpOnePole
11271126
double c2,
11281127
double rpi,
11291128
double c1) override;
1130-
void gateDelaySlew( // Return values.
1131-
double &delay,
1132-
double &slew) override;
1129+
void gateDelaySlew(// Return values.
1130+
double &delay,
1131+
double &slew) override;
11331132

11341133
private:
11351134
void V0(double t,
@@ -1176,8 +1175,8 @@ DmpZeroC2::init(const LibertyLibrary *drvr_library,
11761175
double c1)
11771176
{
11781177
debugPrint(debug_, "dmp_ceff", 3, "Using DMP C2=0");
1179-
DmpAlg::init(drvr_library, drvr_cell, pvt, gate_model, rf, rd, in_slew, c2, rpi,
1180-
c1);
1178+
DmpAlg::init(drvr_library, drvr_cell, pvt, gate_model, rf, rd, in_slew,
1179+
c2, rpi, c1);
11811180
ceff_ = c1;
11821181

11831182
z1_ = 1.0 / (rpi_ * c1_);
@@ -1275,8 +1274,10 @@ newtonRaphson(const int max_iter,
12751274
all_under_x_tol = false;
12761275
x[i] += p[i];
12771276
}
1278-
if (all_under_x_tol)
1277+
if (all_under_x_tol) {
1278+
eval();
12791279
return;
1280+
}
12801281
}
12811282
throw DmpError("Newton-Raphson max iterations exceeded");
12821283
}
@@ -1557,8 +1558,8 @@ DmpCeffDelayCalc::setCeffAlgorithm(const LibertyLibrary *drvr_library,
15571558
}
15581559
else
15591560
dmp_alg_ = dmp_cap_;
1560-
dmp_alg_->init(drvr_library, drvr_cell, pvt, gate_model, rf, rd, in_slew, c2, rpi,
1561-
c1);
1561+
dmp_alg_->init(drvr_library, drvr_cell, pvt, gate_model, rf, rd, in_slew,
1562+
c2, rpi, c1);
15621563
debugPrint(debug_, "dmp_ceff", 3,
15631564
" DMP in_slew = {} c2 = {} rpi = {} c1 = {} Rd = {} ({} alg)",
15641565
units_->timeUnit()->asString(in_slew),
@@ -1667,10 +1668,10 @@ DmpCeffDelayCalc::copyState(const StaState *sta)
16671668
dmp_zero_c2_->copyState(sta);
16681669
}
16691670

1670-
DmpError::DmpError(const char *what) :
1671+
DmpError::DmpError(std::string_view what) :
16711672
what_(what)
16721673
{
1673-
// printf("DmpError %s\n", what);
1674+
//sta::print(stdout, "DmpError {}\n", what);
16741675
}
16751676

16761677
// This saves about 2.5% in overall run time on designs with SPEF.

dcalc/GraphDelayCalc.cc

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,8 @@ GraphDelayCalc::seedDrvrSlew(Vertex *drvr_vertex,
426426
if (from_port == nullptr)
427427
from_port = driveCellDefaultFromPort(drvr_cell, to_port);
428428
findInputDriverDelay(drvr_cell, drvr_pin, drvr_vertex, rf,
429-
from_port, from_slews, to_port, scene, min_max);
429+
from_port, from_slews, to_port, scene, min_max,
430+
arc_delay_calc);
430431
}
431432
else
432433
seedNoDrvrCellSlew(drvr_vertex, drvr_pin, rf, drive, scene, min_max,
@@ -601,7 +602,8 @@ GraphDelayCalc::findInputDriverDelay(const LibertyCell *drvr_cell,
601602
float *from_slews,
602603
const LibertyPort *to_port,
603604
const Scene *scene,
604-
const MinMax *min_max)
605+
const MinMax *min_max,
606+
ArcDelayCalc *arc_delay_calc)
605607
{
606608
debugPrint(debug_, "delay_calc", 2, " driver cell {} {}",
607609
drvr_cell->name(),
@@ -610,11 +612,11 @@ GraphDelayCalc::findInputDriverDelay(const LibertyCell *drvr_cell,
610612
for (TimingArc *arc : arc_set->arcs()) {
611613
if (arc->toEdge()->asRiseFall() == rf) {
612614
float from_slew = from_slews[arc->fromEdge()->index()];
613-
findInputArcDelay(drvr_pin, drvr_vertex, arc, from_slew, scene, min_max);
615+
findInputArcDelay(drvr_pin, drvr_vertex, arc, from_slew, scene, min_max,
616+
arc_delay_calc);
614617
}
615618
}
616619
}
617-
arc_delay_calc_->finishDrvrPin();
618620
}
619621

620622
// Driving cell delay is the load dependent delay, which is the gate
@@ -626,7 +628,8 @@ GraphDelayCalc::findInputArcDelay(const Pin *drvr_pin,
626628
const TimingArc *arc,
627629
float from_slew,
628630
const Scene *scene,
629-
const MinMax *min_max)
631+
const MinMax *min_max,
632+
ArcDelayCalc *arc_delay_calc)
630633
{
631634
debugPrint(debug_, "delay_calc", 3, " {} {} -> {} {} ({})",
632635
arc->from()->name(),
@@ -640,20 +643,20 @@ GraphDelayCalc::findInputArcDelay(const Pin *drvr_pin,
640643

641644
const Parasitic *parasitic;
642645
float load_cap;
643-
parasiticLoad(drvr_pin, drvr_rf, scene, min_max, nullptr, arc_delay_calc_,
646+
parasiticLoad(drvr_pin, drvr_rf, scene, min_max, nullptr, arc_delay_calc,
644647
load_cap, parasitic);
645648

646649
LoadPinIndexMap load_pin_index_map = makeLoadPinIndexMap(drvr_vertex);
647650
ArcDcalcResult intrinsic_result =
648-
arc_delay_calc_->gateDelay(drvr_pin, arc, Slew(from_slew), 0.0, nullptr,
649-
load_pin_index_map, scene, min_max);
651+
arc_delay_calc->gateDelay(drvr_pin, arc, Slew(from_slew), 0.0, nullptr,
652+
load_pin_index_map, scene, min_max);
650653
const ArcDelay &intrinsic_delay = intrinsic_result.gateDelay();
651654

652-
ArcDcalcResult gate_result = arc_delay_calc_->gateDelay(drvr_pin, arc,
653-
Slew(from_slew), load_cap,
654-
parasitic,
655-
load_pin_index_map,
656-
scene, min_max);
655+
ArcDcalcResult gate_result = arc_delay_calc->gateDelay(drvr_pin, arc,
656+
Slew(from_slew), load_cap,
657+
parasitic,
658+
load_pin_index_map,
659+
scene, min_max);
657660
const ArcDelay &gate_delay = gate_result.gateDelay();
658661
const Slew &gate_slew = gate_result.drvrSlew();
659662

@@ -666,7 +669,7 @@ GraphDelayCalc::findInputArcDelay(const Pin *drvr_pin,
666669
graph_->setSlew(drvr_vertex, drvr_rf, ap_index, gate_slew);
667670
annotateLoadDelays(drvr_vertex, drvr_rf, gate_result, load_pin_index_map,
668671
load_delay, false, scene, min_max);
669-
arc_delay_calc_->finishDrvrPin();
672+
arc_delay_calc->finishDrvrPin();
670673
}
671674
}
672675

@@ -1598,41 +1601,41 @@ GraphDelayCalc::findCheckEdgeDelays(Edge *edge,
15981601
for (Scene *scene : scenes_) {
15991602
for (const MinMax *min_max : MinMax::range()) {
16001603
DcalcAPIndex ap_index = scene->dcalcAnalysisPtIndex(min_max);
1601-
if (!graph_->arcDelayAnnotated(edge, arc, ap_index)) {
1602-
const Slew &from_slew = checkEdgeClkSlew(from_vertex, from_rf,
1604+
if (!graph_->arcDelayAnnotated(edge, arc, ap_index)) {
1605+
const Slew &from_slew = checkEdgeClkSlew(from_vertex, from_rf,
16031606
scene, min_max);
16041607
const Slew to_slew = graph_->slew(to_vertex, to_rf, ap_index);
1605-
debugPrint(debug_, "delay_calc", 3,
1608+
debugPrint(debug_, "delay_calc", 3,
16061609
" {} {} -> {} {} ({}) scene:{}/{}",
1607-
arc_set->from()->name(),
1608-
arc->fromEdge()->to_string(),
1609-
arc_set->to()->name(),
1610-
arc->toEdge()->to_string(),
1611-
arc_set->role()->to_string(),
1610+
arc_set->from()->name(),
1611+
arc->fromEdge()->to_string(),
1612+
arc_set->to()->name(),
1613+
arc->toEdge()->to_string(),
1614+
arc_set->role()->to_string(),
16121615
scene->name(),
16131616
min_max->to_string());
1614-
debugPrint(debug_, "delay_calc", 3,
1615-
" from_slew = {} to_slew = {}",
1616-
delayAsString(from_slew, this),
1617-
delayAsString(to_slew, this));
1618-
float related_out_cap = 0.0;
1619-
if (related_out_pin)
1617+
debugPrint(debug_, "delay_calc", 3,
1618+
" from_slew = {} to_slew = {}",
1619+
delayAsString(from_slew, this),
1620+
delayAsString(to_slew, this));
1621+
float related_out_cap = 0.0;
1622+
if (related_out_pin)
16201623
related_out_cap = loadCap(related_out_pin, to_rf,scene,min_max,
16211624
arc_delay_calc);
1622-
ArcDelay check_delay = arc_delay_calc->checkDelay(to_pin, arc, from_slew,
1623-
to_slew, related_out_cap,
1625+
ArcDelay check_delay = arc_delay_calc->checkDelay(to_pin, arc, from_slew,
1626+
to_slew, related_out_cap,
16241627
scene, min_max);
1625-
debugPrint(debug_, "delay_calc", 3,
1626-
" check_delay = {}",
1627-
delayAsString(check_delay, this));
1628-
graph_->setArcDelay(edge, arc, ap_index, check_delay);
1629-
delay_changed = true;
1630-
arc_delay_calc_->finishDrvrPin();
1631-
}
1628+
debugPrint(debug_, "delay_calc", 3,
1629+
" check_delay = {}",
1630+
delayAsString(check_delay, this));
1631+
graph_->setArcDelay(edge, arc, ap_index, check_delay);
1632+
delay_changed = true;
1633+
arc_delay_calc_->finishDrvrPin();
1634+
}
1635+
}
16321636
}
16331637
}
16341638
}
1635-
}
16361639

16371640
if (delay_changed && observer_)
16381641
observer_->checkDelayChangedTo(to_vertex);

0 commit comments

Comments
 (0)