set_load port does not override parasitics

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2023-03-07 17:03:26 -07:00
parent 964f255565
commit deeaaee9a3
7 changed files with 40 additions and 45 deletions

View File

@ -73,7 +73,7 @@ public:
float &pin_cap, float &pin_cap,
float &wire_cap, float &wire_cap,
float &fanout, float &fanout,
bool &has_set_load); bool &has_net_load);
void findCaps(const GraphDelayCalc1 *dcalc, void findCaps(const GraphDelayCalc1 *dcalc,
const Sdc *sdc); const Sdc *sdc);
@ -162,7 +162,7 @@ MultiDrvrNet::netCaps(const RiseFall *drvr_rf,
float &pin_cap, float &pin_cap,
float &wire_cap, float &wire_cap,
float &fanout, float &fanout,
bool &has_set_load) bool &has_net_load)
{ {
int index = dcalc_ap->index() * RiseFall::index_count int index = dcalc_ap->index() * RiseFall::index_count
+ drvr_rf->index(); + drvr_rf->index();
@ -170,7 +170,7 @@ MultiDrvrNet::netCaps(const RiseFall *drvr_rf,
pin_cap = net_caps.pinCap(); pin_cap = net_caps.pinCap();
wire_cap = net_caps.wireCap(); wire_cap = net_caps.wireCap();
fanout = net_caps.fanout(); fanout = net_caps.fanout();
has_set_load = net_caps.hasSetLoad(); has_net_load = net_caps.hasSetLoad();
} }
void void
@ -191,11 +191,11 @@ MultiDrvrNet::findCaps(const GraphDelayCalc1 *dcalc,
int index = ap_index * RiseFall::index_count + drvr_rf_index; int index = ap_index * RiseFall::index_count + drvr_rf_index;
NetCaps &net_caps = net_caps_[index]; NetCaps &net_caps = net_caps_[index];
float pin_cap, wire_cap, fanout; float pin_cap, wire_cap, fanout;
bool has_set_load; bool has_net_load;
// Find pin and external pin/wire capacitance. // Find pin and external pin/wire capacitance.
sdc->connectedCap(drvr_pin, drvr_rf, op_cond, corner, min_max, sdc->connectedCap(drvr_pin, drvr_rf, op_cond, corner, min_max,
pin_cap, wire_cap, fanout, has_set_load); pin_cap, wire_cap, fanout, has_net_load);
net_caps.init(pin_cap, wire_cap, fanout, has_set_load); net_caps.init(pin_cap, wire_cap, fanout, has_net_load);
} }
} }
} }
@ -1077,15 +1077,15 @@ GraphDelayCalc1::loadCap(const Pin *drvr_pin,
const DcalcAnalysisPt *dcalc_ap) const const DcalcAnalysisPt *dcalc_ap) const
{ {
float pin_cap, wire_cap; float pin_cap, wire_cap;
bool has_set_load; bool has_net_load;
float fanout; float fanout;
if (multi_drvr) if (multi_drvr)
multi_drvr->netCaps(rf, dcalc_ap, multi_drvr->netCaps(rf, dcalc_ap,
pin_cap, wire_cap, fanout, has_set_load); pin_cap, wire_cap, fanout, has_net_load);
else else
netCaps(drvr_pin, rf, dcalc_ap, netCaps(drvr_pin, rf, dcalc_ap,
pin_cap, wire_cap, fanout, has_set_load); pin_cap, wire_cap, fanout, has_net_load);
loadCap(drvr_parasitic, has_set_load, pin_cap, wire_cap); loadCap(drvr_parasitic, has_net_load, pin_cap, wire_cap);
return wire_cap + pin_cap; return wire_cap + pin_cap;
} }
@ -1098,23 +1098,23 @@ GraphDelayCalc1::loadCap(const Pin *drvr_pin,
float &pin_cap, float &pin_cap,
float &wire_cap) const float &wire_cap) const
{ {
bool has_set_load; bool has_net_load;
float fanout; float fanout;
// Find pin and external pin/wire capacitance. // Find pin and external pin/wire capacitance.
netCaps(drvr_pin, rf, dcalc_ap, netCaps(drvr_pin, rf, dcalc_ap,
pin_cap, wire_cap, fanout, has_set_load); pin_cap, wire_cap, fanout, has_net_load);
loadCap(drvr_parasitic, has_set_load, pin_cap, wire_cap); loadCap(drvr_parasitic, has_net_load, pin_cap, wire_cap);
} }
void void
GraphDelayCalc1::loadCap(Parasitic *drvr_parasitic, GraphDelayCalc1::loadCap(Parasitic *drvr_parasitic,
bool has_set_load, bool has_net_load,
// Return values. // Return values.
float &pin_cap, float &pin_cap,
float &wire_cap) const float &wire_cap) const
{ {
// set_load has precidence over parasitics. // set_load net has precidence over parasitics.
if (!has_set_load && drvr_parasitic) { if (!has_net_load && drvr_parasitic) {
if (parasitics_->isParasiticNetwork(drvr_parasitic)) if (parasitics_->isParasiticNetwork(drvr_parasitic))
wire_cap += parasitics_->capacitance(drvr_parasitic); wire_cap += parasitics_->capacitance(drvr_parasitic);
else { else {
@ -1138,7 +1138,7 @@ GraphDelayCalc1::netCaps(const Pin *drvr_pin,
float &pin_cap, float &pin_cap,
float &wire_cap, float &wire_cap,
float &fanout, float &fanout,
bool &has_set_load) const bool &has_net_load) const
{ {
MultiDrvrNet *multi_drvr = nullptr; MultiDrvrNet *multi_drvr = nullptr;
if (graph_) { if (graph_) {
@ -1147,14 +1147,14 @@ GraphDelayCalc1::netCaps(const Pin *drvr_pin,
} }
if (multi_drvr) if (multi_drvr)
multi_drvr->netCaps(rf, dcalc_ap, multi_drvr->netCaps(rf, dcalc_ap,
pin_cap, wire_cap, fanout, has_set_load); pin_cap, wire_cap, fanout, has_net_load);
else { else {
const OperatingConditions *op_cond = dcalc_ap->operatingConditions(); const OperatingConditions *op_cond = dcalc_ap->operatingConditions();
const Corner *corner = dcalc_ap->corner(); const Corner *corner = dcalc_ap->corner();
const MinMax *min_max = dcalc_ap->constraintMinMax(); const MinMax *min_max = dcalc_ap->constraintMinMax();
// Find pin and external pin/wire capacitance. // Find pin and external pin/wire capacitance.
sdc_->connectedCap(drvr_pin, rf, op_cond, corner, min_max, sdc_->connectedCap(drvr_pin, rf, op_cond, corner, min_max,
pin_cap, wire_cap, fanout, has_set_load); pin_cap, wire_cap, fanout, has_net_load);
} }
} }

Binary file not shown.

Binary file not shown.

View File

@ -936,7 +936,7 @@ public:
float &pin_cap, float &pin_cap,
float &wire_cap, float &wire_cap,
float &fanout, float &fanout,
bool &has_set_load) const; bool &has_net_load) const;
void portExtFanout(const Port *port, void portExtFanout(const Port *port,
const Corner *corner, const Corner *corner,
const MinMax *min_max, const MinMax *min_max,
@ -1222,8 +1222,7 @@ protected:
const MinMax *min_max, const MinMax *min_max,
float &pin_cap, float &pin_cap,
float &wire_cap, float &wire_cap,
float &fanout, float &fanout) const;
bool &has_ext_cap) const;
void netCaps(const Pin *drvr_pin, void netCaps(const Pin *drvr_pin,
const RiseFall *rf, const RiseFall *rf,
const OperatingConditions *op_cond, const OperatingConditions *op_cond,
@ -1233,7 +1232,7 @@ protected:
float &pin_cap, float &pin_cap,
float &wire_cap, float &wire_cap,
float &fanout, float &fanout,
bool &has_set_load) const; bool &has_net_load) const;
// connectedCap pin_cap. // connectedCap pin_cap.
float connectedPinCap(const Pin *pin, float connectedPinCap(const Pin *pin,
const RiseFall *rf, const RiseFall *rf,

View File

@ -253,7 +253,7 @@ protected:
TableTemplate *tbl_template_; TableTemplate *tbl_template_;
// ScaleFactorType gcc barfs if this is dcl'd. // ScaleFactorType gcc barfs if this is dcl'd.
unsigned scale_factor_type_:scale_factor_bits; unsigned scale_factor_type_:scale_factor_bits;
unsigned tr_index_:RiseFall::index_bit_count; unsigned rf_index_:RiseFall::index_bit_count;
bool is_scaled_:1; bool is_scaled_:1;
}; };

View File

@ -609,7 +609,7 @@ TableModel::TableModel(TablePtr table,
table_(table), table_(table),
tbl_template_(tbl_template), tbl_template_(tbl_template),
scale_factor_type_(int(scale_factor_type)), scale_factor_type_(int(scale_factor_type)),
tr_index_(rf->index()), rf_index_(rf->index()),
is_scaled_(false) is_scaled_(false)
{ {
} }
@ -681,7 +681,7 @@ TableModel::scaleFactor(const LibertyLibrary *library,
return 1.0F; return 1.0F;
else else
return library->scaleFactor(static_cast<ScaleFactorType>(scale_factor_type_), return library->scaleFactor(static_cast<ScaleFactorType>(scale_factor_type_),
tr_index_, cell, pvt); rf_index_, cell, pvt);
} }
void void

View File

@ -3081,16 +3081,14 @@ Sdc::connectedCap(const Pin *pin,
float &pin_cap, float &pin_cap,
float &wire_cap, float &wire_cap,
float &fanout, float &fanout,
bool &has_set_load) const bool &has_net_load) const
{ {
netCaps(pin, rf, op_cond, corner, min_max, netCaps(pin, rf, op_cond, corner, min_max,
pin_cap, wire_cap, fanout, has_set_load); pin_cap, wire_cap, fanout, has_net_load);
float net_wire_cap; float net_wire_cap;
bool has_net_wire_cap; drvrPinWireCap(pin, corner, min_max, net_wire_cap, has_net_load);
drvrPinWireCap(pin, corner, min_max, net_wire_cap, has_net_wire_cap); if (has_net_load) {
if (has_net_wire_cap) {
wire_cap += net_wire_cap; wire_cap += net_wire_cap;
has_set_load = true;
} }
} }
@ -3102,9 +3100,9 @@ Sdc::connectedPinCap(const Pin *pin,
const MinMax *min_max) const MinMax *min_max)
{ {
float pin_cap, wire_cap, fanout; float pin_cap, wire_cap, fanout;
bool has_set_load; bool has_net_load;
connectedCap(pin, rf, op_cond, corner, min_max, connectedCap(pin, rf, op_cond, corner, min_max,
pin_cap, wire_cap, fanout, has_set_load); pin_cap, wire_cap, fanout, has_net_load);
return pin_cap; return pin_cap;
} }
@ -3118,7 +3116,7 @@ public:
float &pin_cap, float &pin_cap,
float &wire_cap, float &wire_cap,
float &fanout, float &fanout,
bool &has_set_load, bool &has_net_load,
const Sdc *sdc); const Sdc *sdc);
virtual void operator()(const Pin *pin); virtual void operator()(const Pin *pin);
@ -3130,7 +3128,7 @@ protected:
float &pin_cap_; float &pin_cap_;
float &wire_cap_; float &wire_cap_;
float &fanout_; float &fanout_;
bool &has_set_load_; bool &has_net_load_;
const Sdc *sdc_; const Sdc *sdc_;
}; };
@ -3141,7 +3139,7 @@ FindNetCaps::FindNetCaps(const RiseFall *rf,
float &pin_cap, float &pin_cap,
float &wire_cap, float &wire_cap,
float &fanout, float &fanout,
bool &has_set_load, bool &has_net_load,
const Sdc *sdc) : const Sdc *sdc) :
PinVisitor(), PinVisitor(),
rf_(rf), rf_(rf),
@ -3151,7 +3149,7 @@ FindNetCaps::FindNetCaps(const RiseFall *rf,
pin_cap_(pin_cap), pin_cap_(pin_cap),
wire_cap_(wire_cap), wire_cap_(wire_cap),
fanout_(fanout), fanout_(fanout),
has_set_load_(has_set_load), has_net_load_(has_net_load),
sdc_(sdc) sdc_(sdc)
{ {
} }
@ -3160,7 +3158,7 @@ void
FindNetCaps::operator()(const Pin *pin) FindNetCaps::operator()(const Pin *pin)
{ {
sdc_->pinCaps(pin, rf_, op_cond_, corner_, min_max_, sdc_->pinCaps(pin, rf_, op_cond_, corner_, min_max_,
pin_cap_, wire_cap_, fanout_, has_set_load_); pin_cap_, wire_cap_, fanout_);
} }
// Capacitances for all pins connected to drvr_pin's net. // Capacitances for all pins connected to drvr_pin's net.
@ -3174,14 +3172,14 @@ Sdc::netCaps(const Pin *drvr_pin,
float &pin_cap, float &pin_cap,
float &wire_cap, float &wire_cap,
float &fanout, float &fanout,
bool &has_set_load) const bool &has_net_load) const
{ {
pin_cap = 0.0; pin_cap = 0.0;
wire_cap = 0.0; wire_cap = 0.0;
fanout = 0.0; fanout = 0.0;
has_set_load = false; has_net_load = false;
FindNetCaps visitor(rf, op_cond, corner, min_max, pin_cap, FindNetCaps visitor(rf, op_cond, corner, min_max, pin_cap,
wire_cap, fanout, has_set_load, this); wire_cap, fanout, has_net_load, this);
network_->visitConnectedPins(const_cast<Pin*>(drvr_pin), visitor); network_->visitConnectedPins(const_cast<Pin*>(drvr_pin), visitor);
} }
@ -3194,8 +3192,7 @@ Sdc::pinCaps(const Pin *pin,
// Return values. // Return values.
float &pin_cap, float &pin_cap,
float &wire_cap, float &wire_cap,
float &fanout, float &fanout) const
bool &has_set_load) const
{ {
if (network_->isTopLevelPort(pin)) { if (network_->isTopLevelPort(pin)) {
Port *port = network_->port(pin); Port *port = network_->port(pin);
@ -3217,7 +3214,6 @@ Sdc::pinCaps(const Pin *pin,
// Output port counts as a fanout. // Output port counts as a fanout.
fanout++; fanout++;
} }
has_set_load |= has_pin_cap || has_wire_cap;
} }
else { else {
LibertyPort *port = network_->libertyPort(pin); LibertyPort *port = network_->libertyPort(pin);