power limit activity

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2025-01-04 11:41:09 -08:00
parent d1d0e097f9
commit 87418f23b1
2 changed files with 26 additions and 0 deletions

View File

@ -466,6 +466,10 @@ bool
PropActivityVisitor::setActivityCheck(const Pin *pin,
PwrActivity &activity)
{
float min_rf_slew = power_->getMinRfSlew(pin);
float max_activity = (min_rf_slew > 0.0) ? 1.0 / min_rf_slew : INF;
if (activity.activity() > max_activity)
activity.setActivity(max_activity);
PwrActivity &prev_activity = power_->activity(pin);
float activity_delta = abs(activity.activity() - prev_activity.activity());
float duty_delta = abs(activity.duty() - prev_activity.duty());
@ -879,6 +883,27 @@ Power::getSlew(Vertex *vertex,
return delayAsFloat(graph_->slew(vertex, rf, dcalc_ap->index()));
}
float
Power::getMinRfSlew(const Pin *pin)
{
Vertex *vertex, *bidir_vertex;
graph_->pinVertices(pin, vertex, bidir_vertex);
if (vertex) {
const MinMax *min_max = MinMax::min();
Slew mm_slew = min_max->initValue();
for (const DcalcAnalysisPt *dcalc_ap : corners_->dcalcAnalysisPts()) {
DcalcAPIndex ap_index = dcalc_ap->index();
const Slew &slew1 = graph_->slew(vertex, RiseFall::rise(), ap_index);
const Slew &slew2 = graph_->slew(vertex, RiseFall::fall(), ap_index);
Slew slew = delayAsFloat(slew1 + slew2) / 2.0;
if (delayGreater(slew, mm_slew, min_max, this))
mm_slew = slew;
}
return mm_slew;
}
return 0.0;
}
LibertyPort *
Power::findExprOutPort(FuncExpr *expr)
{

View File

@ -151,6 +151,7 @@ protected:
float getSlew(Vertex *vertex,
const RiseFall *rf,
const Corner *corner);
float getMinRfSlew(const Pin *pin);
const Clock *findInstClk(const Instance *inst);
const Clock *findClk(const Pin *to_pin);
float clockDuty(const Clock *clk);