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

View File

@ -253,7 +253,7 @@ protected:
TableTemplate *tbl_template_;
// ScaleFactorType gcc barfs if this is dcl'd.
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;
};

View File

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

View File

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