From 28bb1f0eec05e2042b9a17478af702bcfe28bb10 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Thu, 28 Oct 2021 08:38:23 -0700 Subject: [PATCH] power ideal clock slews Signed-off-by: James Cherry --- search/Power.cc | 20 +++++++++++++++----- search/Power.hh | 4 ++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/search/Power.cc b/search/Power.cc index 349b2a73..79214bc0 100644 --- a/search/Power.cc +++ b/search/Power.cc @@ -651,9 +651,7 @@ Power::findInputInternalPower(const Pin *pin, float energy = 0.0; int rf_count = 0; for (RiseFall *rf : RiseFall::range()) { - float slew = clk_network_->isIdealClock(pin) - ? clk_network_->idealClkSlew(pin, rf, MinMax::max()) - : delayAsFloat(graph_->slew(vertex, rf, dcalc_ap->index())); + float slew = getSlew(vertex, rf, corner); if (!delayInf(slew)) { float table_energy = pwr->power(rf, pvt, slew, load_cap); energy += table_energy; @@ -692,6 +690,19 @@ Power::findInputInternalPower(const Pin *pin, } } +float +Power::getSlew(Vertex *vertex, + const RiseFall *rf, + const Corner *corner) +{ + const DcalcAnalysisPt *dcalc_ap = corner->findDcalcAnalysisPt(MinMax::max()); + const Pin *pin = vertex->pin(); + if (clk_network_->isIdealClock(pin)) + return clk_network_->idealClkSlew(pin, rf, MinMax::max()); + else + return delayAsFloat(graph_->slew(vertex, rf, dcalc_ap->index())); +} + LibertyPort * Power::findExprOutPort(FuncExpr *expr) { @@ -796,8 +807,7 @@ Power::findOutputInternalPower(const Pin *to_pin, // Use unateness to find from_rf. RiseFall *from_rf = positive_unate ? to_rf : to_rf->opposite(); float slew = from_vertex - ? delayAsFloat(graph_->slew(from_vertex, from_rf, - dcalc_ap->index())) + ? getSlew(from_vertex, from_rf, corner) : 0.0; if (!delayInf(slew)) { float table_energy = pwr->power(to_rf, pvt, slew, load_cap); diff --git a/search/Power.hh b/search/Power.hh index 3833d75a..7e10ac7d 100644 --- a/search/Power.hh +++ b/search/Power.hh @@ -31,6 +31,7 @@ class Corner; class DcalcAnalysisPt; class PropActivityVisitor; class BfsFwdIterator; +class Vertex; typedef std::pair SeqPin; @@ -134,6 +135,9 @@ protected: const Corner *corner, // Return values. PowerResult &result); + float getSlew(Vertex *vertex, + const RiseFall *rf, + const Corner *corner); const Clock *findInstClk(const Instance *inst); const Clock *findClk(const Pin *to_pin); PwrActivity findClkedActivity(const Pin *pin,