set_load port does not override parasitics
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
964f255565
commit
deeaaee9a3
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
BIN
doc/OpenSTA.odt
BIN
doc/OpenSTA.odt
Binary file not shown.
BIN
doc/OpenSTA.pdf
BIN
doc/OpenSTA.pdf
Binary file not shown.
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
34
sdc/Sdc.cc
34
sdc/Sdc.cc
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue