Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions include/sta/PowerClass.hh
Original file line number Diff line number Diff line change
Expand Up @@ -78,16 +78,22 @@ public:
PowerResult();
void clear();
float internal() const { return internal_; }
float inputInternal() const { return input_internal_; }
float outputInternal() const { return output_internal_; }
float switching() const { return switching_; }
float leakage() const { return leakage_; }
float total() const;
void incr(PowerResult &result);
void incrInternal(float pwr);
void incrInputInternal(float pwr);
void incrOutputInternal(float pwr);
void incrSwitching(float pwr);
void incrLeakage(float pwr);

private:
float internal_;
float input_internal_;
float output_internal_;
float switching_;
float leakage_;
};
Expand Down
31 changes: 30 additions & 1 deletion power/Power.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1011,6 +1011,7 @@ Power::findInputInternalPower(const Pin *pin,
internal += port_internal;
}
result.incrInternal(internal);
result.incrInputInternal(internal);
}
}
}
Expand Down Expand Up @@ -1102,7 +1103,9 @@ Power::findOutputInternalPower(const LibertyPort *to_port,
FuncExpr *func = to_port->function();

map<const char*, float, StringLessIf> pg_duty_sum;
int arc_count = 0;
for (InternalPower *pwr : corner_cell->internalPowers(to_corner_port)) {
arc_count += 1;
const LibertyPort *from_corner_port = pwr->relatedPort();
if (from_corner_port) {
const Pin *from_pin = findLinkPin(inst, from_corner_port);
Expand All @@ -1113,10 +1116,13 @@ Power::findOutputInternalPower(const LibertyPort *to_port,
pg_duty_sum[related_pg_pin] += from_density * duty;
}
}
// The number of pins that consume internal power in total.
float internal_power_pin_count = arc_count / (float) pg_duty_sum.size();

debugPrint(debug_, "power", 2,
" when act/ns duty wgt energy power");
float internal = 0.0;
float out_internal = 0.0;
for (InternalPower *pwr : corner_cell->internalPowers(to_corner_port)) {
FuncExpr *when = pwr->when();
const char *related_pg_pin = pwr->relatedPgPin();
Expand Down Expand Up @@ -1157,6 +1163,7 @@ Power::findOutputInternalPower(const LibertyPort *to_port,
}
}
float port_internal = weight * energy * to_activity.density();
float avg_arc_internal = energy * to_activity.density();
debugPrint(debug_, "power", 2, "%3s -> %-3s %6s %.3f %.3f %.3f %9.2e %9.2e %s",
from_corner_port ? from_corner_port->name() : "-" ,
to_port->name(),
Expand All @@ -1168,8 +1175,13 @@ Power::findOutputInternalPower(const LibertyPort *to_port,
port_internal,
related_pg_pin ? related_pg_pin : "no pg_pin");
internal += port_internal;
out_internal += avg_arc_internal;
}
result.incrInternal(internal);
if (internal_power_pin_count)
result.incrOutputInternal(out_internal / internal_power_pin_count);
else
result.incrOutputInternal(0.0);
}

float
Expand Down Expand Up @@ -1603,15 +1615,19 @@ Power::deletePinBefore(const Pin *)

PowerResult::PowerResult() :
internal_(0.0),
input_internal_(0.0),
output_internal_(0.0),
switching_(0.0),
leakage_(0.0)
{
}

void
PowerResult::clear()
PowerResult::clear()
{
internal_ = 0.0;
input_internal_ = 0.0;
output_internal_ = 0.0;
switching_ = 0.0;
leakage_ = 0.0;
}
Expand All @@ -1627,6 +1643,17 @@ PowerResult::incrInternal(float pwr)
{
internal_ += pwr;
}
void
PowerResult::incrInputInternal(float pwr)
{
input_internal_ += pwr;
}

void
PowerResult::incrOutputInternal(float pwr)
{
output_internal_ += pwr;
}

void
PowerResult::incrSwitching(float pwr)
Expand All @@ -1644,6 +1671,8 @@ void
PowerResult::incr(PowerResult &result)
{
internal_ += result.internal_;
input_internal_ += result.input_internal_;
output_internal_ += result.output_internal_;
switching_ += result.switching_;
leakage_ += result.leakage_;
}
Expand Down
17 changes: 17 additions & 0 deletions power/Power.i
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,13 @@ pushPowerResultFloats(PowerResult &power,
powers.push_back(power.leakage());
powers.push_back(power.total());
}
static void
pushInternalPowerComponents(PowerResult &power,
FloatSeq &powers)
{
powers.push_back(power.inputInternal());
powers.push_back(power.outputInternal());
}

FloatSeq
design_power(const Corner *corner)
Expand All @@ -62,6 +69,16 @@ design_power(const Corner *corner)
return powers;
}

FloatSeq
internal_power_components(const Corner *corner)
{
PowerResult total, sequential, combinational, clock, macro, pad;
Sta::sta()->power(corner, total, sequential, combinational, clock, macro, pad);
FloatSeq powers;
pushInternalPowerComponents(total, powers);
return powers;
}

FloatSeq
instance_power(Instance *inst,
const Corner *corner)
Expand Down