@@ -100,7 +100,8 @@ Power::Power(StaState *sta) :
100100 input_activity_ (), // default set in ensureActivities()
101101 seq_activity_map_ (100 , SeqPinHash(network_), SeqPinEqual()),
102102 activities_valid_ (false ),
103- bdd_ (sta)
103+ bdd_ (sta),
104+ corner_ (nullptr )
104105{
105106}
106107
@@ -113,6 +114,8 @@ Power::clear()
113114 seq_activity_map_.clear ();
114115 activity_map_.clear ();
115116 activities_valid_ = false ;
117+ instance_powers_.clear ();
118+ corner_ = nullptr ;
116119}
117120
118121void
@@ -286,13 +289,10 @@ Power::power(const Corner *corner,
286289 pad.clear ();
287290
288291 ensureActivities ();
289- Stats stats (debug_, report_);
290- LeafInstanceIterator *inst_iter = network_->leafInstanceIterator ();
291- while (inst_iter->hasNext ()) {
292- Instance *inst = inst_iter->next ();
292+ ensureInstPowers (corner);
293+ for (auto [inst, inst_power] : instance_powers_) {
293294 LibertyCell *cell = network_->libertyCell (inst);
294295 if (cell) {
295- PowerResult inst_power = power (inst, cell, corner);
296296 if (cell->isMacro ()
297297 || cell->isMemory ()
298298 || cell->interfaceTiming ())
@@ -308,8 +308,6 @@ Power::power(const Corner *corner,
308308 total.incr (inst_power);
309309 }
310310 }
311- delete inst_iter;
312- stats.report (" Find power" );
313311}
314312
315313bool
@@ -332,17 +330,15 @@ PowerResult
332330Power::power (const Instance *inst,
333331 const Corner *corner)
334332{
333+ ensureActivities ();
334+ ensureInstPowers (corner);
335335 if (network_->isHierarchical (inst)) {
336336 PowerResult result;
337337 powerInside (inst, corner, result);
338338 return result;
339339 }
340- LibertyCell *cell = network_->libertyCell (inst);
341- if (cell) {
342- ensureActivities ();
343- return power (inst, cell, corner);
344- }
345- return PowerResult ();
340+ else
341+ return instance_powers_[inst];
346342}
347343
348344void
@@ -355,13 +351,8 @@ Power::powerInside(const Instance *hinst,
355351 Instance *child = child_iter->next ();
356352 if (network_->isHierarchical (child))
357353 powerInside (child, corner, result);
358- else {
359- LibertyCell *cell = network_->libertyCell (child);
360- if (cell) {
361- PowerResult inst_power = power (child, cell, corner);
362- result.incr (inst_power);
363- }
364- }
354+ else
355+ result.incr (instance_powers_[child]);
365356 }
366357 delete child_iter;
367358}
@@ -707,6 +698,7 @@ Power::evalBddActivity(DdNode *bdd,
707698void
708699Power::ensureActivities ()
709700{
701+ Stats stats (debug_, report_);
710702 // No need to propagate activites if global activity is set.
711703 if (!global_activity_.isSet ()) {
712704 if (!activities_valid_) {
@@ -750,6 +742,7 @@ Power::ensureActivities()
750742 activities_valid_ = true ;
751743 }
752744 }
745+ stats.report (" Power activities" );
753746}
754747
755748void
@@ -841,6 +834,32 @@ Power::seedRegOutputActivities(const Instance *reg,
841834
842835// //////////////////////////////////////////////////////////////
843836
837+ void
838+ Power::ensureInstPowers (const Corner *corner)
839+ {
840+ if (instance_powers_.empty ()
841+ || corner != corner_)
842+ findInstPowers (corner);
843+ }
844+
845+ void
846+ Power::findInstPowers (const Corner *corner)
847+ {
848+ Stats stats (debug_, report_);
849+ LeafInstanceIterator *inst_iter = network_->leafInstanceIterator ();
850+ while (inst_iter->hasNext ()) {
851+ Instance *inst = inst_iter->next ();
852+ LibertyCell *cell = network_->libertyCell (inst);
853+ if (cell) {
854+ PowerResult inst_power = power (inst, cell, corner);
855+ instance_powers_[inst] = inst_power;
856+ }
857+ }
858+ delete inst_iter;
859+ corner_ = corner;
860+ stats.report (" Find power" );
861+ }
862+
844863PowerResult
845864Power::power (const Instance *inst,
846865 LibertyCell *cell,
@@ -1539,6 +1558,22 @@ Power::clockMinPeriod()
15391558 return 0.0 ;
15401559}
15411560
1561+ void
1562+ Power::deleteInstanceBefore (const Instance *)
1563+ {
1564+ activities_valid_ = false ;
1565+ instance_powers_.clear ();
1566+ corner_ = nullptr ;
1567+ }
1568+
1569+ void
1570+ Power::deletePinBefore (const Pin *)
1571+ {
1572+ activities_valid_ = false ;
1573+ instance_powers_.clear ();
1574+ corner_ = nullptr ;
1575+ }
1576+
15421577// //////////////////////////////////////////////////////////////
15431578
15441579PowerResult::PowerResult () :
0 commit comments