liberty memory management

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2026-02-04 18:33:32 -07:00
parent 33e480a6c1
commit 7cb71fe766
4 changed files with 23 additions and 102 deletions

View File

@ -56,25 +56,3 @@ LeakagePower::~LeakagePower()
} }
} // namespace } // namespace
>>>>>>>
namespace sta {
LeakagePower::LeakagePower(LibertyCell *cell,
LibertyPort *related_pg_port,
FuncExpr *when,
float power) :
cell_(cell),
related_pg_port_(related_pg_port),
when_(when),
power_(power)
{
}
LeakagePower::~LeakagePower()
{
if (when_)
when_->deleteSubexprs();
}
} // namespace

View File

@ -2233,23 +2233,12 @@ void
LibertyReader::makeLeakagePowers() LibertyReader::makeLeakagePowers()
{ {
for (LeakagePowerGroup *power_group : leakage_powers_) { for (LeakagePowerGroup *power_group : leakage_powers_) {
<<<<<<<
=======
LibertyPort *related_pg_pin = LibertyPort *related_pg_pin =
cell_->findLibertyPort(power_group->relatedPgPin().c_str()); cell_->findLibertyPort(power_group->relatedPgPin().c_str());
cell_->makeLeakagePower(related_pg_pin, power_group->when(), power_group->power()); cell_->makeLeakagePower(related_pg_pin, power_group->when(), power_group->power());
delete power_group; delete power_group;
} }
leakage_powers_.clear(); leakage_powers_.clear();
>>>>>>>
LibertyPort *related_pg_pin =
cell_->findLibertyPort(power_group->relatedPgPin().c_str());
LeakagePower *leakage = new LeakagePower(cell_, related_pg_pin, power_group->when(),
power_group->power());
cell_->addLeakagePower(leakage);
delete power_group;
}
leakage_powers_.clear();
} }
// Record a reference to a function that will be parsed at the end of // Record a reference to a function that will be parsed at the end of
@ -6092,8 +6081,6 @@ LeakagePowerGroup::LeakagePowerGroup(int line) :
void void
LeakagePowerGroup::setRelatedPgPin(std::string pin_name) LeakagePowerGroup::setRelatedPgPin(std::string pin_name)
<<<<<<<
=======
{ {
related_pg_pin_ = std::move(pin_name); related_pg_pin_ = std::move(pin_name);
} }
@ -6104,23 +6091,6 @@ LeakagePowerGroup::setWhen(FuncExpr *when)
when_ = when; when_ = when;
} }
void
LeakagePowerGroup::setPower(float power)
>>>>>>>
{
<<<<<<<
related_pg_pin_ = std::move(pin_name);
=======
power_ = power;
>>>>>>>
}
void
LeakagePowerGroup::setWhen(FuncExpr *when)
{
when_ = when;
}
void void
LeakagePowerGroup::setPower(float power) LeakagePowerGroup::setPower(float power)
{ {

View File

@ -912,23 +912,6 @@ class LeakagePowerGroup
{ {
public: public:
LeakagePowerGroup(int line); LeakagePowerGroup(int line);
<<<<<<<
=======
const std::string &relatedPgPin() const { return related_pg_pin_; }
void setRelatedPgPin(std::string pin_name);
FuncExpr *when() const { return when_; }
void setWhen(FuncExpr *when);
float power() const { return power_; }
void setPower(float power);
protected:
std::string related_pg_pin_;
FuncExpr *when_;
float power_;
int line_;
};
>>>>>>>
const std::string &relatedPgPin() const { return related_pg_pin_; } const std::string &relatedPgPin() const { return related_pg_pin_; }
void setRelatedPgPin(std::string pin_name); void setRelatedPgPin(std::string pin_name);
FuncExpr *when() const { return when_; } FuncExpr *when() const { return when_; }

View File

@ -1493,45 +1493,35 @@ Power::findLeakagePower(const Instance *inst,
float uncond_leakage = 0.0; float uncond_leakage = 0.0;
bool found_uncond = false; bool found_uncond = false;
float cond_duty_sum = 0.0; float cond_duty_sum = 0.0;
<<<<<<< for (const LeakagePower &leak : scene_cell->leakagePowers()) {
for (LeakagePower *leak : *scene_cell->leakagePowers()) { LibertyPort *pg_port = leak.relatedPgPort();
LibertyPort *pg_port = leak->relatedPgPort();
if (pg_port == nullptr if (pg_port == nullptr
|| pg_port->pwrGndType() == PwrGndType::primary_power) { || pg_port->pwrGndType() == PwrGndType::primary_power) {
FuncExpr *when = leak->when(); FuncExpr *when = leak.when();
======= if (when) {
for (const LeakagePower &leak : scene_cell->leakagePowers()) { PwrActivity cond_activity = evalActivity(when, inst);
FuncExpr *when = leak.when(); float cond_duty = cond_activity.duty();
>>>>>>>
if (when) {
PwrActivity cond_activity = evalActivity(when, inst);
float cond_duty = cond_activity.duty();
debugPrint(debug_, "power", 2, "leakage %s %s %s %.3e * %.2f", debugPrint(debug_, "power", 2, "leakage %s %s %s %.3e * %.2f",
cell->name(), cell->name(),
leak->relatedPgPort()->name(), leak.relatedPgPort()->name(),
when->to_string().c_str(), when->to_string().c_str(),
leak.power(), leak.power(),
cond_duty); cond_duty);
cond_leakage += leak.power() * cond_duty; cond_leakage += leak.power() * cond_duty;
if (leak.power() > 0.0) if (leak.power() > 0.0)
cond_duty_sum += cond_duty; cond_duty_sum += cond_duty;
found_cond = true; found_cond = true;
} }
else { else {
debugPrint(debug_, "power", 2, "leakage %s %s -- %.3e", debugPrint(debug_, "power", 2, "leakage %s %s -- %.3e",
cell->name(), cell->name(),
<<<<<<< leak.relatedPgPort()->name(),
leak->relatedPgPort()->name(), leak.power());
leak->power()); uncond_leakage += leak.power();
uncond_leakage += leak->power(); found_uncond = true;
======= }
leak.power());
uncond_leakage += leak.power();
>>>>>>>
found_uncond = true;
} }
} }
}
float leakage = 0.0; float leakage = 0.0;
float cell_leakage; float cell_leakage;
bool cell_leakage_exists; bool cell_leakage_exists;