Merge branch 'master' into rel_3.0

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2026-02-04 17:36:33 -07:00
commit c7f4bb3bb3
7 changed files with 55 additions and 58 deletions

View File

@ -28,34 +28,23 @@
namespace sta { namespace sta {
class LeakagePowerAttrs;
class LeakagePowerAttrs
{
public:
LeakagePowerAttrs();
FuncExpr *when() const { return when_; }
void setWhen(FuncExpr *when);
float power() { return power_; }
void setPower(float power);
protected:
FuncExpr *when_;
float power_;
};
class LeakagePower class LeakagePower
{ {
public: public:
LeakagePower();
LeakagePower(LibertyCell *cell, LeakagePower(LibertyCell *cell,
LeakagePowerAttrs *attrs); LibertyPort *related_pg_port,
FuncExpr *when,
float power);
~LeakagePower(); ~LeakagePower();
LibertyCell *libertyCell() const { return cell_; } LibertyCell *libertyCell() const { return cell_; }
LibertyPort *relatedPgPort() const { return related_pg_port_; }
FuncExpr *when() const { return when_; } FuncExpr *when() const { return when_; }
float power() { return power_; } float power() const { return power_; }
protected: protected:
LibertyCell *cell_; LibertyCell *cell_;
LibertyPort *related_pg_port_;
FuncExpr *when_; FuncExpr *when_;
float power_; float power_;
}; };

View File

@ -30,33 +30,15 @@
namespace sta { namespace sta {
LeakagePowerAttrs::LeakagePowerAttrs() :
when_(nullptr),
power_(0.0)
{
}
void
LeakagePowerAttrs::setWhen(FuncExpr *when)
{
when_ = when;
}
void
LeakagePowerAttrs::setPower(float power)
{
power_ = power;
}
////////////////////////////////////////////////////////////////
LeakagePower::LeakagePower(LibertyCell *cell, LeakagePower::LeakagePower(LibertyCell *cell,
LeakagePowerAttrs *attrs) : LibertyPort *related_pg_port,
FuncExpr *when,
float power) :
cell_(cell), cell_(cell),
when_(attrs->when()), related_pg_port_(related_pg_port),
power_(attrs->power()) when_(when),
power_(power)
{ {
cell->addLeakagePower(this);
} }
LeakagePower::~LeakagePower() LeakagePower::~LeakagePower()

View File

@ -758,11 +758,4 @@ LibertyBuilder::makeInternalPower(LibertyCell *cell,
return new InternalPower(cell, port, related_port, attrs); return new InternalPower(cell, port, related_port, attrs);
} }
LeakagePower *
LibertyBuilder::makeLeakagePower(LibertyCell *cell,
LeakagePowerAttrs *attrs)
{
return new LeakagePower(cell, attrs);
}
} // namespace } // namespace

View File

@ -70,8 +70,6 @@ public:
LibertyPort *port, LibertyPort *port,
LibertyPort *related_port, LibertyPort *related_port,
InternalPowerAttrs *attrs); InternalPowerAttrs *attrs);
LeakagePower *makeLeakagePower(LibertyCell *cell,
LeakagePowerAttrs *attrs);
TimingArcSet *makeFromTransitionArcs(LibertyCell *cell, TimingArcSet *makeFromTransitionArcs(LibertyCell *cell,
LibertyPort *from_port, LibertyPort *from_port,

View File

@ -2245,7 +2245,11 @@ void
LibertyReader::makeLeakagePowers() LibertyReader::makeLeakagePowers()
{ {
for (LeakagePowerGroup *power_group : leakage_powers_) { for (LeakagePowerGroup *power_group : leakage_powers_) {
builder_.makeLeakagePower(cell_, power_group); 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; delete power_group;
} }
leakage_powers_.clear(); leakage_powers_.clear();
@ -5418,6 +5422,8 @@ LibertyReader::visitRelatedPgPin(LibertyAttr *attr)
{ {
if (internal_power_) if (internal_power_)
internal_power_->setRelatedPgPin(getAttrString(attr)); internal_power_->setRelatedPgPin(getAttrString(attr));
else if (leakage_power_)
leakage_power_->setRelatedPgPin(getAttrString(attr));
} }
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
@ -6080,13 +6086,28 @@ InternalPowerGroup::~InternalPowerGroup()
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
LeakagePowerGroup::LeakagePowerGroup(int line) : LeakagePowerGroup::LeakagePowerGroup(int line) :
LeakagePowerAttrs(), when_(nullptr),
power_(0.0),
line_(line) line_(line)
{ {
} }
LeakagePowerGroup::~LeakagePowerGroup() void
LeakagePowerGroup::setRelatedPgPin(std::string pin_name)
{ {
related_pg_pin_ = std::move(pin_name);
}
void
LeakagePowerGroup::setWhen(FuncExpr *when)
{
when_ = when;
}
void
LeakagePowerGroup::setPower(float power)
{
power_ = power;
} }
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////

View File

@ -896,13 +896,21 @@ public:
virtual ~InternalPowerGroup(); virtual ~InternalPowerGroup();
}; };
class LeakagePowerGroup : public LeakagePowerAttrs class LeakagePowerGroup
{ {
public: public:
LeakagePowerGroup(int line); LeakagePowerGroup(int line);
virtual ~LeakagePowerGroup(); 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: protected:
std::string related_pg_pin_;
FuncExpr *when_;
float power_;
int line_; int line_;
}; };

View File

@ -1495,12 +1495,16 @@ Power::findLeakagePower(const Instance *inst,
bool found_uncond = false; bool found_uncond = false;
float cond_duty_sum = 0.0; float cond_duty_sum = 0.0;
for (LeakagePower *leak : *scene_cell->leakagePowers()) { for (LeakagePower *leak : *scene_cell->leakagePowers()) {
LibertyPort *pg_port = leak->relatedPgPort();
if (pg_port == nullptr
|| pg_port->pwrGndType() == PwrGndType::primary_power) {
FuncExpr *when = leak->when(); FuncExpr *when = leak->when();
if (when) { if (when) {
PwrActivity cond_activity = evalActivity(when, inst); PwrActivity cond_activity = evalActivity(when, inst);
float cond_duty = cond_activity.duty(); float cond_duty = cond_activity.duty();
debugPrint(debug_, "power", 2, "leakage %s %s %.3e * %.2f", debugPrint(debug_, "power", 2, "leakage %s %s %s %.3e * %.2f",
cell->name(), cell->name(),
leak->relatedPgPort()->name(),
when->to_string().c_str(), when->to_string().c_str(),
leak->power(), leak->power(),
cond_duty); cond_duty);
@ -1510,13 +1514,15 @@ Power::findLeakagePower(const Instance *inst,
found_cond = true; found_cond = true;
} }
else { else {
debugPrint(debug_, "power", 2, "leakage -- %s %.3e", debugPrint(debug_, "power", 2, "leakage %s %s -- %.3e",
cell->name(), cell->name(),
leak->relatedPgPort()->name(),
leak->power()); leak->power());
uncond_leakage += leak->power(); uncond_leakage += leak->power();
found_uncond = true; 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;