write_timing_model leak

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2024-04-23 12:57:06 -07:00
parent 1b5c4e2745
commit 8ae487c602
4 changed files with 48 additions and 50 deletions

View File

@ -239,8 +239,8 @@ public:
const RiseFall *rf, const RiseFall *rf,
const EarlyLate *early_late) const; const EarlyLate *early_late) const;
void unsetTimingDerate(); void unsetTimingDerate();
static void moveDeratingFactors(Sdc *from, static void swapDeratingFactors(Sdc *sdc1,
Sdc *to); Sdc *sdc2);
void setInputSlew(const Port *port, void setInputSlew(const Port *port,
const RiseFallBoth *rf, const RiseFallBoth *rf,
@ -445,8 +445,8 @@ public:
float delay); float delay);
void removeClockInsertion(const Clock *clk, void removeClockInsertion(const Clock *clk,
const Pin *pin); const Pin *pin);
static void moveClockInsertions(Sdc *from, static void swapClockInsertions(Sdc *sdc1,
Sdc *to); Sdc *sdc2);
bool hasClockInsertion(const Pin *pin) const; bool hasClockInsertion(const Pin *pin) const;
float clockInsertion(const Clock *clk, float clockInsertion(const Clock *clk,
const RiseFall *rf, const RiseFall *rf,
@ -569,8 +569,8 @@ public:
const Clock *clk, const Clock *clk,
const RiseFall *clk_rf, const RiseFall *clk_rf,
const MinMaxAll *min_max); const MinMaxAll *min_max);
static void movePortDelays(Sdc *from, static void swapPortDelays(Sdc *sdc1,
Sdc *to); Sdc *sdc2);
// Set port external pin load (set_load -pin_load port). // Set port external pin load (set_load -pin_load port).
void setPortExtPinCap(const Port *port, void setPortExtPinCap(const Port *port,
@ -585,8 +585,8 @@ public:
const Corner *corner, const Corner *corner,
const MinMax *min_max, const MinMax *min_max,
float cap); float cap);
static void movePortExtCaps(Sdc *from, static void swapPortExtCaps(Sdc *sdc1,
Sdc *to); Sdc *sdc2);
// Remove all "set_load net" annotations. // Remove all "set_load net" annotations.
void removeNetLoadCaps(); void removeNetLoadCaps();
void setNetWireCap(const Net *net, void setNetWireCap(const Net *net,

View File

@ -51,6 +51,8 @@
namespace sta { namespace sta {
using std::swap;
bool bool
ClockPairLess::operator()(const ClockPair &pair1, ClockPairLess::operator()(const ClockPair &pair1,
const ClockPair &pair2) const const ClockPair &pair2) const
@ -660,17 +662,13 @@ Sdc::unsetTimingDerate()
} }
void void
Sdc::moveDeratingFactors(Sdc *from, Sdc::swapDeratingFactors(Sdc *sdc1,
Sdc *to) Sdc *sdc2)
{ {
if (from->derating_factors_) { swap(sdc1->derating_factors_, sdc2->derating_factors_);
to->derating_factors_ = from->derating_factors_; swap(sdc1->net_derating_factors_, sdc2->net_derating_factors_);
from->derating_factors_ = nullptr; swap(sdc1->inst_derating_factors_, sdc2->inst_derating_factors_);
} swap(sdc1->cell_derating_factors_, sdc2->cell_derating_factors_);
to->net_derating_factors_ = std::move(from->net_derating_factors_);
to->inst_derating_factors_ = std::move(from->inst_derating_factors_);
to->cell_derating_factors_ = std::move(from->cell_derating_factors_);
} }
void void
@ -1733,10 +1731,10 @@ Sdc::removeClockInsertion(const Clock *clk,
} }
void void
Sdc::moveClockInsertions(Sdc *from, Sdc::swapClockInsertions(Sdc *sdc1,
Sdc *to) Sdc *sdc2)
{ {
to->clk_insertions_ = std::move(from->clk_insertions_); swap(sdc1->clk_insertions_, sdc2->clk_insertions_);
} }
void void
@ -2742,21 +2740,20 @@ Sdc::deleteInputDelay(InputDelay *input_delay)
} }
void void
Sdc::movePortDelays(Sdc *from, Sdc::swapPortDelays(Sdc *sdc1,
Sdc *to) Sdc *sdc2)
{ {
to->input_delays_ = std::move(from->input_delays_); swap(sdc1->input_delays_, sdc2->input_delays_);
to->input_delay_pin_map_ = std::move(from->input_delay_pin_map_); swap(sdc1->input_delay_pin_map_, sdc2->input_delay_pin_map_);
to->input_delay_ref_pin_map_ = std::move(from->input_delay_ref_pin_map_); swap(sdc1->input_delay_ref_pin_map_, sdc2->input_delay_ref_pin_map_);
to->input_delay_leaf_pin_map_ = std::move(from->input_delay_leaf_pin_map_); swap(sdc1->input_delay_leaf_pin_map_, sdc2->input_delay_leaf_pin_map_);
to->input_delay_internal_pin_map_ = std::move(from->input_delay_internal_pin_map_); swap(sdc1->input_delay_internal_pin_map_, sdc2->input_delay_internal_pin_map_);
to->input_delay_index_ = from->input_delay_index_; swap(sdc1->input_delay_index_, sdc2->input_delay_index_);
from->input_delay_index_ = 0;
to->output_delays_ = std::move(from->output_delays_); swap(sdc1->output_delays_, sdc2->output_delays_);
to->output_delay_pin_map_ = std::move(from->output_delay_pin_map_); swap(sdc1->output_delay_pin_map_, sdc2->output_delay_pin_map_);
to->output_delay_ref_pin_map_ = std::move(from->output_delay_ref_pin_map_); swap(sdc1->output_delay_ref_pin_map_, sdc2->output_delay_ref_pin_map_);
to->output_delay_leaf_pin_map_ = std::move(from->output_delay_leaf_pin_map_); swap(sdc1->output_delay_leaf_pin_map_, sdc2->output_delay_leaf_pin_map_);
} }
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
@ -3322,15 +3319,12 @@ Sdc::ensurePortExtPinCap(const Port *port,
} }
void void
Sdc::movePortExtCaps(Sdc *from, Sdc::swapPortExtCaps(Sdc *sdc1,
Sdc *to) Sdc *sdc2)
{ {
for (int corner_index = 0; corner_index < from->corners()->count(); corner_index++) { for (int corner_index = 0; corner_index < sdc1->corners()->count(); corner_index++) {
to->port_ext_cap_maps_[corner_index] = swap(sdc1->port_ext_cap_maps_[corner_index], sdc2->port_ext_cap_maps_[corner_index]);
std::move(from->port_ext_cap_maps_[corner_index]); swap(sdc1->net_wire_cap_maps_[corner_index], sdc2->net_wire_cap_maps_[corner_index]);
to->net_wire_cap_maps_[corner_index] =
std::move(from->net_wire_cap_maps_[corner_index]);
} }
} }

View File

@ -111,24 +111,27 @@ void
MakeTimingModel::saveSdc() MakeTimingModel::saveSdc()
{ {
sdc_backup_ = new Sdc(this); sdc_backup_ = new Sdc(this);
Sdc::movePortDelays(sdc_, sdc_backup_); swapSdcWithBackup();
Sdc::movePortExtCaps(sdc_, sdc_backup_);
Sdc::moveDeratingFactors(sdc_, sdc_backup_);
Sdc::moveClockInsertions(sdc_, sdc_backup_);
sta_->delaysInvalid(); sta_->delaysInvalid();
} }
void void
MakeTimingModel::restoreSdc() MakeTimingModel::restoreSdc()
{ {
Sdc::movePortDelays(sdc_backup_, sdc_); swapSdcWithBackup();
Sdc::movePortExtCaps(sdc_backup_, sdc_);
Sdc::moveDeratingFactors(sdc_backup_, sdc_);
Sdc::moveClockInsertions(sdc_backup_, sdc_);
delete sdc_backup_; delete sdc_backup_;
sta_->delaysInvalid(); sta_->delaysInvalid();
} }
void
MakeTimingModel::swapSdcWithBackup()
{
Sdc::swapPortDelays(sdc_, sdc_backup_);
Sdc::swapPortExtCaps(sdc_, sdc_backup_);
Sdc::swapDeratingFactors(sdc_, sdc_backup_);
Sdc::swapClockInsertions(sdc_, sdc_backup_);
}
void void
MakeTimingModel::makeLibrary() MakeTimingModel::makeLibrary()
{ {

View File

@ -92,6 +92,7 @@ private:
void saveSdc(); void saveSdc();
void restoreSdc(); void restoreSdc();
void swapSdcWithBackup();
const char *lib_name_; const char *lib_name_;
const char *cell_name_; const char *cell_name_;