diff --git a/power/Power.cc b/power/Power.cc index 649bc32b..37c79fb2 100644 --- a/power/Power.cc +++ b/power/Power.cc @@ -711,8 +711,10 @@ Power::findInstClk(const Instance *inst) while (pin_iter->hasNext()) { const Pin *pin = pin_iter->next(); const Clock *clk = findClk(pin); - if (clk) + if (clk) { inst_clk = clk; + break; + } } delete pin_iter; return inst_clk; @@ -1178,7 +1180,9 @@ Power::findActivity(const Pin *pin) if (activity.origin() != PwrActivityOrigin::unknown) return activity; } - return PwrActivity(2.0, 0.5, PwrActivityOrigin::clock); + const Clock *clk = findClk(pin); + float duty = clockDuty(clk); + return PwrActivity(2.0, duty, PwrActivityOrigin::clock); } else if (global_activity_.isSet()) return global_activity_; @@ -1190,6 +1194,25 @@ Power::findActivity(const Pin *pin) return PwrActivity(0.0, 0.0, PwrActivityOrigin::unknown); } +float +Power::clockDuty(const Clock *clk) +{ + if (clk->isGenerated()) { + const Clock *master = clk->masterClk(); + if (master == nullptr) + return 0.5; // punt + else + return clockDuty(master); + } + else { + const FloatSeq *waveform = clk->waveform(); + float rise_time = (*waveform)[0]; + float fall_time = (*waveform)[1]; + float duty = (fall_time - rise_time) / clk->period(); + return duty; + } +} + PwrActivity Power::findSeqActivity(const Instance *inst, LibertyPort *port) @@ -1201,7 +1224,7 @@ Power::findSeqActivity(const Instance *inst, if (activity.origin() != PwrActivityOrigin::unknown) return activity; } - return input_activity_; + return PwrActivity(0.0, 0.0, PwrActivityOrigin::unknown); } float diff --git a/power/Power.hh b/power/Power.hh index 7aef5f31..7dd08827 100644 --- a/power/Power.hh +++ b/power/Power.hh @@ -149,6 +149,7 @@ protected: const Corner *corner); const Clock *findInstClk(const Instance *inst); const Clock *findClk(const Pin *to_pin); + float clockDuty(const Clock *clk); PwrActivity findClkedActivity(const Pin *pin, const Clock *inst_clk); PwrActivity findActivity(const Pin *pin); diff --git a/sdc/Clock.cc b/sdc/Clock.cc index dcc06fc3..5e87df91 100644 --- a/sdc/Clock.cc +++ b/sdc/Clock.cc @@ -118,8 +118,8 @@ void Clock::makeClkEdges() { clk_edges_ = new ClockEdge*[RiseFall::index_count]; - for (auto tr : RiseFall::range()) { - clk_edges_[tr->index()] = new ClockEdge(this, tr); + for (auto rf : RiseFall::range()) { + clk_edges_[rf->index()] = new ClockEdge(this, rf); } }