From 9d69dfbc4fe0aadd5d41ca4936411d5f0ec3e78a Mon Sep 17 00:00:00 2001 From: James Cherry Date: Thu, 19 Oct 2023 10:34:23 -0700 Subject: [PATCH] power - leakage power Signed-off-by: James Cherry --- examples/power.tcl | 1 + power/Power.cc | 24 ++++++++++-------------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/examples/power.tcl b/examples/power.tcl index b515f109..51b616c1 100644 --- a/examples/power.tcl +++ b/examples/power.tcl @@ -4,6 +4,7 @@ read_verilog gcd_sky130hd.v link_design gcd read_sdc gcd_sky130hd.sdc +set_propagated_clock clk read_spef gcd_sky130hd.spef set_power_activity -input -activity .1 set_power_activity -input_port reset -activity 0 diff --git a/power/Power.cc b/power/Power.cc index 92ea3ca6..6fe46adb 100644 --- a/power/Power.cc +++ b/power/Power.cc @@ -363,7 +363,7 @@ PropActivityVisitor::visit(Vertex *vertex) Edge *edge = edge_iter.next(); if (edge->isWire()) { Vertex *from_vertex = edge->from(graph_); - const Pin *from_pin = from_vertex->pin(); + const Pin *from_pin = from_vertex->pin(); PwrActivity &from_activity = power_->activity(from_pin); PwrActivity to_activity(from_activity.activity(), from_activity.duty(), @@ -436,7 +436,8 @@ PropActivityVisitor::setActivityCheck(const Pin *pin, float activity_delta = abs(activity.activity() - prev_activity.activity()); float duty_delta = abs(activity.duty() - prev_activity.duty()); if (activity_delta > change_tolerance_ - || duty_delta > change_tolerance_) { + || duty_delta > change_tolerance_ + || activity.origin() != prev_activity.origin()) { max_change_ = max(max_change_, activity_delta); max_change_ = max(max_change_, duty_delta); power_->setActivity(pin, activity); @@ -1016,7 +1017,7 @@ isPositiveUnate(const LibertyCell *cell, //////////////////////////////////////////////////////////////// void -Power::findLeakagePower(const Instance *, +Power::findLeakagePower(const Instance *inst, LibertyCell *cell, const Corner *corner, // Return values. @@ -1031,21 +1032,16 @@ Power::findLeakagePower(const Instance *, for (LeakagePower *leak : *corner_cell->leakagePowers()) { FuncExpr *when = leak->when(); if (when) { - FuncExprPortIterator port_iter(when); - float duty = 1.0; - while (port_iter.hasNext()) { - LibertyPort *port = port_iter.next(); - if (port->direction()->isAnyInput()) - duty *= port->isClock() ? 0.25 : 0.5; - } + PwrActivity cond_activity = evalActivity(when, inst); + float cond_duty = cond_activity.duty(); debugPrint(debug_, "power", 2, "leakage %s %s %.3e * %.2f", cell->name(), when->asString(), leak->power(), - duty); - cond_leakage += leak->power() * duty; + cond_duty); + cond_leakage += leak->power() * cond_duty; if (leak->power() > 0.0) - cond_duty_sum += duty; + cond_duty_sum += cond_duty; found_cond = true; } else { @@ -1152,7 +1148,7 @@ Power::findActivity(const Pin *pin) if (activity.origin() != PwrActivityOrigin::unknown) return activity; } - return input_activity_; + return PwrActivity(0.0, 0.0, PwrActivityOrigin::unknown); } PwrActivity