diff --git a/doc/OpenSTA.odt b/doc/OpenSTA.odt index 2269f15f..437b600d 100644 Binary files a/doc/OpenSTA.odt and b/doc/OpenSTA.odt differ diff --git a/doc/OpenSTA.pdf b/doc/OpenSTA.pdf index a5813f9e..2949d32f 100644 Binary files a/doc/OpenSTA.pdf and b/doc/OpenSTA.pdf differ diff --git a/power/Power.cc b/power/Power.cc index 39abd14c..d944408e 100644 --- a/power/Power.cc +++ b/power/Power.cc @@ -321,6 +321,32 @@ Power::powerInside(const Instance *hinst, delete child_iter; } +typedef std::pair InstPower; + +InstanceSeq +Power::highestPowerInstances(size_t count, + const Corner *corner) +{ + vector inst_pwrs; + LeafInstanceIterator *inst_iter = network_->leafInstanceIterator(); + while (inst_iter->hasNext()) { + Instance *inst = inst_iter->next(); + PowerResult pwr = power(inst, corner); + inst_pwrs.push_back({inst, pwr.total()}); + } + delete inst_iter; + + sort(inst_pwrs.begin(), inst_pwrs.end(), [](InstPower &inst_pwr1, + InstPower &inst_pwr2) { + return inst_pwr1.second > inst_pwr2.second; + }); + + InstanceSeq insts; + for (size_t i = 0; i < count; i++) + insts.push_back(inst_pwrs[i].first); + return insts; +} + //////////////////////////////////////////////////////////////// class ActivitySrchPred : public SearchPredNonLatch2 diff --git a/power/Power.hh b/power/Power.hh index 23d48d36..f28a7946 100644 --- a/power/Power.hh +++ b/power/Power.hh @@ -100,6 +100,8 @@ public: void reportActivityAnnotation(bool report_unannotated, bool report_annotated); float clockMinPeriod(); + InstanceSeq highestPowerInstances(size_t count, + const Corner *corner); protected: PwrActivity &activity(const Pin *pin); diff --git a/power/Power.i b/power/Power.i index 72035c2a..e2e0ed50 100644 --- a/power/Power.i +++ b/power/Power.i @@ -117,6 +117,14 @@ clock_min_period() return power->clockMinPeriod(); } +InstanceSeq +highest_power_instances(size_t count, + const Corner *corner) +{ + Power *power = Sta::sta()->power(); + return power->highestPowerInstances(count, corner); +} + //////////////////////////////////////////////////////////////// void diff --git a/power/Power.tcl b/power/Power.tcl index 2a1e47c6..dca43217 100644 --- a/power/Power.tcl +++ b/power/Power.tcl @@ -32,6 +32,7 @@ namespace eval sta { define_cmd_args "report_power" \ { [-instances instances]\ + [-highest_power_instances count]\ [-corner corner]\ [-digits digits]\ [> filename] [>> filename] } @@ -40,7 +41,7 @@ proc_redirect report_power { global sta_report_default_digits parse_key_args "report_power" args \ - keys {-instances -corner -digits} flags {} + keys {-instances -highest_power_instances -corner -digits} flags {} check_argc_eq0 "report_power" $args @@ -58,6 +59,11 @@ proc_redirect report_power { if { [info exists keys(-instances)] } { set insts [get_instances_error "-instances" $keys(-instances)] report_power_insts $insts $corner $digits + } elseif { [info exists keys(-highest_power_instances)] } { + set count $keys(-highest_power_instances) + check_positive_integer "-highest_power_instances" $count + set insts [highest_power_instances $count $corner] + report_power_insts $insts $corner $digits } else { report_power_design $corner $digits }