ccs ceff pocv
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
ed19ed80df
commit
04f4528c2c
|
|
@ -87,7 +87,7 @@ CcsCeffDelayCalc::gateDelay(const Pin *drvr_pin,
|
||||||
parasitic_ = parasitic;
|
parasitic_ = parasitic;
|
||||||
output_waveforms_ = nullptr;
|
output_waveforms_ = nullptr;
|
||||||
|
|
||||||
GateTableModel *table_model = arc->gateTableModel(scene, min_max);
|
const GateTableModel *table_model = arc->gateTableModel(scene, min_max);
|
||||||
if (table_model && parasitic) {
|
if (table_model && parasitic) {
|
||||||
OutputWaveforms *output_waveforms = table_model->outputWaveforms();
|
OutputWaveforms *output_waveforms = table_model->outputWaveforms();
|
||||||
Parasitics *parasitics = scene->parasitics(min_max);
|
Parasitics *parasitics = scene->parasitics(min_max);
|
||||||
|
|
@ -112,12 +112,36 @@ CcsCeffDelayCalc::gateDelay(const Pin *drvr_pin,
|
||||||
drvr_cell->ensureVoltageWaveforms(scenes_);
|
drvr_cell->ensureVoltageWaveforms(scenes_);
|
||||||
output_waveforms_ = output_waveforms;
|
output_waveforms_ = output_waveforms;
|
||||||
ref_time_ = output_waveforms_->referenceTime(in_slew_);
|
ref_time_ = output_waveforms_->referenceTime(in_slew_);
|
||||||
debugPrint(debug_, "ccs_dcalc", 1, "{} {}", drvr_cell->name(),
|
debugPrint(debug_, "ccs_dcalc", 1, "{} {}",
|
||||||
|
drvr_cell->name(),
|
||||||
drvr_rf_->shortName());
|
drvr_rf_->shortName());
|
||||||
|
|
||||||
double gate_delay, drvr_slew;
|
double gate_delay, drvr_slew;
|
||||||
gateDelaySlew(drvr_library, drvr_rf_, gate_delay, drvr_slew);
|
gateDelaySlew(drvr_library, gate_delay, drvr_slew);
|
||||||
return makeResult(drvr_library, drvr_rf_, gate_delay, drvr_slew,
|
debugPrint(debug_, "ccs_dcalc", 2, "gate_delay {} drvr_slew {}",
|
||||||
load_pin_index_map);
|
delayAsString(gate_delay, this), delayAsString(drvr_slew, this));
|
||||||
|
|
||||||
|
// Fill in pocv parameters.
|
||||||
|
ArcDelay gate_delay2(gate_delay);
|
||||||
|
Slew drvr_slew2(drvr_slew);
|
||||||
|
if (variables_->pocvEnabled()) {
|
||||||
|
double ceff = region_ceff_[0];
|
||||||
|
const Pvt *pvt = pinPvt(drvr_pin_, scene, min_max);
|
||||||
|
table_model->gateDelayPocv(pvt, in_slew_, ceff, min_max,
|
||||||
|
variables_->pocvMode(),
|
||||||
|
gate_delay2, drvr_slew2);
|
||||||
|
}
|
||||||
|
ArcDcalcResult dcalc_result(load_pin_index_map.size());
|
||||||
|
dcalc_result.setGateDelay(gate_delay2);
|
||||||
|
dcalc_result.setDrvrSlew(drvr_slew2);
|
||||||
|
|
||||||
|
for (const auto &[load_pin, load_idx] : load_pin_index_map) {
|
||||||
|
double wire_delay, load_slew;
|
||||||
|
loadDelaySlew(load_pin, drvr_library, drvr_slew, wire_delay, load_slew);
|
||||||
|
dcalc_result.setWireDelay(load_idx, wire_delay);
|
||||||
|
dcalc_result.setLoadSlew(load_idx, load_slew);
|
||||||
|
}
|
||||||
|
return dcalc_result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return table_dcalc_->gateDelay(drvr_pin, arc, in_slew, load_cap, parasitic,
|
return table_dcalc_->gateDelay(drvr_pin, arc, in_slew, load_cap, parasitic,
|
||||||
|
|
@ -126,12 +150,11 @@ CcsCeffDelayCalc::gateDelay(const Pin *drvr_pin,
|
||||||
|
|
||||||
void
|
void
|
||||||
CcsCeffDelayCalc::gateDelaySlew(const LibertyLibrary *drvr_library,
|
CcsCeffDelayCalc::gateDelaySlew(const LibertyLibrary *drvr_library,
|
||||||
const RiseFall *rf,
|
|
||||||
// Return values.
|
// Return values.
|
||||||
double &gate_delay,
|
double &gate_delay,
|
||||||
double &drvr_slew)
|
double &drvr_slew)
|
||||||
{
|
{
|
||||||
initRegions(drvr_library, rf);
|
initRegions(drvr_library, drvr_rf_);
|
||||||
findCsmWaveform();
|
findCsmWaveform();
|
||||||
ref_time_ = output_waveforms_->referenceTime(in_slew_);
|
ref_time_ = output_waveforms_->referenceTime(in_slew_);
|
||||||
gate_delay = region_times_[region_vth_idx_] - ref_time_;
|
gate_delay = region_times_[region_vth_idx_] - ref_time_;
|
||||||
|
|
@ -300,33 +323,10 @@ CcsCeffDelayCalc::findCsmWaveform()
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
ArcDcalcResult
|
|
||||||
CcsCeffDelayCalc::makeResult(const LibertyLibrary *drvr_library,
|
|
||||||
const RiseFall *rf,
|
|
||||||
double &gate_delay,
|
|
||||||
double &drvr_slew,
|
|
||||||
const LoadPinIndexMap &load_pin_index_map)
|
|
||||||
{
|
|
||||||
ArcDcalcResult dcalc_result(load_pin_index_map.size());
|
|
||||||
debugPrint(debug_, "ccs_dcalc", 2, "gate_delay {} drvr_slew {}",
|
|
||||||
delayAsString(gate_delay, this), delayAsString(drvr_slew, this));
|
|
||||||
dcalc_result.setGateDelay(gate_delay);
|
|
||||||
dcalc_result.setDrvrSlew(drvr_slew);
|
|
||||||
|
|
||||||
for (const auto &[load_pin, load_idx] : load_pin_index_map) {
|
|
||||||
double wire_delay, load_slew;
|
|
||||||
loadDelaySlew(load_pin, drvr_library, rf, drvr_slew, wire_delay, load_slew);
|
|
||||||
dcalc_result.setWireDelay(load_idx, wire_delay);
|
|
||||||
dcalc_result.setLoadSlew(load_idx, load_slew);
|
|
||||||
}
|
|
||||||
return dcalc_result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CcsCeffDelayCalc::loadDelaySlew(const Pin *load_pin,
|
CcsCeffDelayCalc::loadDelaySlew(const Pin *load_pin,
|
||||||
const LibertyLibrary *drvr_library,
|
const LibertyLibrary *drvr_library,
|
||||||
const RiseFall *rf,
|
double drvr_slew,
|
||||||
double &drvr_slew,
|
|
||||||
// Return values.
|
// Return values.
|
||||||
double &wire_delay,
|
double &wire_delay,
|
||||||
double &load_slew)
|
double &load_slew)
|
||||||
|
|
@ -349,7 +349,7 @@ CcsCeffDelayCalc::loadDelaySlew(const Pin *load_pin,
|
||||||
else
|
else
|
||||||
loadDelaySlew(load_pin, drvr_slew, elmore, wire_delay, load_slew);
|
loadDelaySlew(load_pin, drvr_slew, elmore, wire_delay, load_slew);
|
||||||
|
|
||||||
thresholdAdjust(load_pin, drvr_library, rf, wire_delay, load_slew);
|
thresholdAdjust(load_pin, drvr_library, drvr_rf_, wire_delay, load_slew);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -71,22 +71,15 @@ protected:
|
||||||
typedef std::vector<double> Region;
|
typedef std::vector<double> Region;
|
||||||
|
|
||||||
void gateDelaySlew(const LibertyLibrary *drvr_library,
|
void gateDelaySlew(const LibertyLibrary *drvr_library,
|
||||||
const RiseFall *rf,
|
|
||||||
// Return values.
|
// Return values.
|
||||||
double &gate_delay,
|
double &gate_delay,
|
||||||
double &drvr_slew);
|
double &drvr_slew);
|
||||||
void initRegions(const LibertyLibrary *drvr_library,
|
void initRegions(const LibertyLibrary *drvr_library,
|
||||||
const RiseFall *rf);
|
const RiseFall *rf);
|
||||||
void findCsmWaveform();
|
void findCsmWaveform();
|
||||||
ArcDcalcResult makeResult(const LibertyLibrary *drvr_library,
|
|
||||||
const RiseFall *rf,
|
|
||||||
double &gate_delay,
|
|
||||||
double &drvr_slew,
|
|
||||||
const LoadPinIndexMap &load_pin_index_map);
|
|
||||||
void loadDelaySlew(const Pin *load_pin,
|
void loadDelaySlew(const Pin *load_pin,
|
||||||
const LibertyLibrary *drvr_library,
|
const LibertyLibrary *drvr_library,
|
||||||
const RiseFall *rf,
|
double drvr_slew,
|
||||||
double &drvr_slew,
|
|
||||||
// Return values.
|
// Return values.
|
||||||
double &wire_delay,
|
double &wire_delay,
|
||||||
double &load_slew);
|
double &load_slew);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue