Skip to content

Commit 771050b

Browse files
committed
cache instance power results
Signed-off-by: James Cherry <[email protected]>
1 parent cf903f4 commit 771050b

File tree

3 files changed

+64
-21
lines changed

3 files changed

+64
-21
lines changed

power/Power.cc

Lines changed: 56 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

118121
void
@@ -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

315313
bool
@@ -332,17 +330,15 @@ PowerResult
332330
Power::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

348344
void
@@ -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,
707698
void
708699
Power::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

755748
void
@@ -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+
844863
PowerResult
845864
Power::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

15441579
PowerResult::PowerResult() :

power/Power.hh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ public:
107107
float clockMinPeriod();
108108
InstanceSeq highestPowerInstances(size_t count,
109109
const Corner *corner);
110+
void deleteInstanceBefore(const Instance *inst);
111+
void deletePinBefore(const Pin *pin);
110112

111113
protected:
112114
PwrActivity &activity(const Pin *pin);
@@ -129,6 +131,8 @@ protected:
129131
PwrActivity &activity);
130132
PwrActivity findActivity(const Pin *pin);
131133

134+
void ensureInstPowers(const Corner *corner);
135+
void findInstPowers(const Corner *corner);
132136
PowerResult power(const Instance *inst,
133137
LibertyCell *cell,
134138
const Corner *corner);
@@ -229,6 +233,8 @@ private:
229233
PwrSeqActivityMap seq_activity_map_;
230234
bool activities_valid_;
231235
Bdd bdd_;
236+
std::map<const Instance*, PowerResult> instance_powers_;
237+
const Corner *corner_;
232238

233239
static constexpr int max_activity_passes_ = 100;
234240

search/Sta.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4588,6 +4588,7 @@ Sta::deleteLeafInstanceBefore(const Instance *inst)
45884588
{
45894589
sim_->deleteInstanceBefore(inst);
45904590
sdc_->deleteInstanceBefore(inst);
4591+
power_->deleteInstanceBefore(inst);
45914592
}
45924593

45934594
void
@@ -4664,6 +4665,7 @@ Sta::deletePinBefore(const Pin *pin)
46644665
}
46654666
sim_->deletePinBefore(pin);
46664667
clk_network_->deletePinBefore(pin);
4668+
power_->deletePinBefore(pin);
46674669
}
46684670

46694671
void

0 commit comments

Comments
 (0)