diff --git a/doc/OpenSTA.odt b/doc/OpenSTA.odt index 5c899c42..df2413a4 100644 Binary files a/doc/OpenSTA.odt and b/doc/OpenSTA.odt differ diff --git a/doc/OpenSTA.pdf b/doc/OpenSTA.pdf index 598b21c5..cd69a845 100644 Binary files a/doc/OpenSTA.pdf and b/doc/OpenSTA.pdf differ diff --git a/include/sta/Sdc.hh b/include/sta/Sdc.hh index b2de4c8d..b00e3bad 100644 --- a/include/sta/Sdc.hh +++ b/include/sta/Sdc.hh @@ -224,6 +224,9 @@ public: const RiseFall *rf, const EarlyLate *early_late) const; void unsetTimingDerate(); + static void moveDeratingFactors(Sdc *from, + Sdc *to); + void setInputSlew(Port *port, const RiseFallBoth *rf, const MinMaxAll *min_max, float slew); // Set the rise/fall drive resistance on design port. diff --git a/sdc/Sdc.cc b/sdc/Sdc.cc index b69db1c7..f31f29f0 100644 --- a/sdc/Sdc.cc +++ b/sdc/Sdc.cc @@ -686,6 +686,28 @@ Sdc::unsetTimingDerate() deleteDeratingFactors(); } +void +Sdc::moveDeratingFactors(Sdc *from, + Sdc *to) +{ + if (from->derating_factors_) { + to->derating_factors_ = from->derating_factors_; + from->derating_factors_ = nullptr; + } + if (from->net_derating_factors_) { + to->net_derating_factors_ = from->net_derating_factors_; + from->net_derating_factors_ = nullptr; + } + if (from->inst_derating_factors_) { + to->inst_derating_factors_ = from->inst_derating_factors_; + from->inst_derating_factors_ = nullptr; + } + if (from->cell_derating_factors_) { + to->cell_derating_factors_ = from->cell_derating_factors_; + from->cell_derating_factors_ = nullptr; + } +} + void Sdc::deleteDeratingFactors() { diff --git a/search/MakeTimingModel.cc b/search/MakeTimingModel.cc index 1d196e20..0b37ebe2 100644 --- a/search/MakeTimingModel.cc +++ b/search/MakeTimingModel.cc @@ -93,6 +93,7 @@ MakeTimingModel::saveSdc() sdc_backup_ = new Sdc(this); Sdc::movePortDelays(sdc_, sdc_backup_); Sdc::movePortExtCaps(sdc_, sdc_backup_); + Sdc::moveDeratingFactors(sdc_, sdc_backup_); sta_->delaysInvalid(); } @@ -101,6 +102,7 @@ MakeTimingModel::restoreSdc() { Sdc::movePortDelays(sdc_backup_, sdc_); Sdc::movePortExtCaps(sdc_backup_, sdc_); + Sdc::moveDeratingFactors(sdc_backup_, sdc_); sta_->delaysInvalid(); delete sdc_backup_; }