From 759348402df2cde1f9e326960cdba6e197d1ea56 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Tue, 18 Nov 2025 22:20:00 +0000 Subject: [PATCH 1/3] Get the pin count from the Liberty cell not the Cell (#334) The Cell may come from LEF which doesn't have internal pins that Liberty does. This used to work by dumb luck where the extra two power pins in LEF happened to align to the extra two internal pins from Liberty. With the change to pg_pins this no longer works. Signed-off-by: Matt Liberty --- verilog/VerilogReader.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/verilog/VerilogReader.cc b/verilog/VerilogReader.cc index b7e0260f..166021e6 100644 --- a/verilog/VerilogReader.cc +++ b/verilog/VerilogReader.cc @@ -534,7 +534,7 @@ VerilogReader::makeModuleInst(const string *module_vname, // to reduce the memory footprint of the verilog parser. if (liberty_cell && hasScalarNamedPortRefs(liberty_cell, pins)) { - int port_count = network_->portBitCount(cell); + const int port_count = liberty_cell->portBitCount(); StdStringSeq net_names(port_count); for (VerilogNet *vnet : *pins) { VerilogNetPortRefScalarNet *vpin = From 10511dee0196776d419408ca140c0bc20d55d044 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Tue, 18 Nov 2025 18:55:56 -0700 Subject: [PATCH 2/3] set activity invalidates inst power resolves #336 Signed-off-by: James Cherry --- power/Power.cc | 16 ++++++++++++++-- power/Power.hh | 1 + 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/power/Power.cc b/power/Power.cc index cc596820..f093e147 100644 --- a/power/Power.cc +++ b/power/Power.cc @@ -101,6 +101,7 @@ Power::Power(StaState *sta) : seq_activity_map_(100, SeqPinHash(network_), SeqPinEqual()), activities_valid_(false), bdd_(sta), + instance_powers_valid_(false), corner_(nullptr) { } @@ -124,6 +125,7 @@ Power::setGlobalActivity(float density, { global_activity_.set(density, duty, PwrActivityOrigin::global); activities_valid_ = false; + instance_powers_valid_ = false; } void @@ -131,6 +133,7 @@ Power::unsetGlobalActivity() { global_activity_.init(); activities_valid_ = false; + instance_powers_valid_ = false; } void @@ -139,6 +142,7 @@ Power::setInputActivity(float density, { input_activity_.set(density, duty, PwrActivityOrigin::input); activities_valid_ = false; + instance_powers_valid_ = false; } void @@ -146,6 +150,7 @@ Power::unsetInputActivity() { input_activity_.init(); activities_valid_ = false; + instance_powers_valid_ = false; } void @@ -158,6 +163,7 @@ Power::setInputPortActivity(const Port *input_port, if (pin) { user_activity_map_[pin] = {density, duty, PwrActivityOrigin::user}; activities_valid_ = false; + instance_powers_valid_ = false; } } @@ -169,6 +175,7 @@ Power::unsetInputPortActivity(const Port *input_port) if (pin) { user_activity_map_.erase(pin); activities_valid_ = false; + instance_powers_valid_ = false; } } @@ -180,6 +187,8 @@ Power::setUserActivity(const Pin *pin, { user_activity_map_[pin] = {density, duty, origin}; activities_valid_ = false; + instance_powers_valid_ = false; + } void @@ -187,6 +196,7 @@ Power::unsetUserActivity(const Pin *pin) { user_activity_map_.erase(pin); activities_valid_ = false; + instance_powers_valid_ = false; } PwrActivity & @@ -837,9 +847,11 @@ Power::seedRegOutputActivities(const Instance *reg, void Power::ensureInstPowers(const Corner *corner) { - if (instance_powers_.empty() - || corner != corner_) + if (!instance_powers_valid_ + || corner != corner_) { findInstPowers(corner); + instance_powers_valid_ = true; + } } void diff --git a/power/Power.hh b/power/Power.hh index e51ce285..09cf0050 100644 --- a/power/Power.hh +++ b/power/Power.hh @@ -234,6 +234,7 @@ private: bool activities_valid_; Bdd bdd_; std::map instance_powers_; + bool instance_powers_valid_; const Corner *corner_; static constexpr int max_activity_passes_ = 100; From 5bf832c1b6133a6c90a8fc9122981168f3429436 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Wed, 19 Nov 2025 10:49:43 -0700 Subject: [PATCH 3/3] set_case_analysis invalidates power resolves #332 Signed-off-by: James Cherry --- power/Power.cc | 44 ++++++++++++++++++++------------------------ power/Power.hh | 1 + search/Sta.cc | 5 +++++ 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/power/Power.cc b/power/Power.cc index f093e147..48692dea 100644 --- a/power/Power.cc +++ b/power/Power.cc @@ -119,21 +119,26 @@ Power::clear() corner_ = nullptr; } +void +Power::activitiesInvalid() +{ + activities_valid_ = false; + instance_powers_valid_ = false; +} + void Power::setGlobalActivity(float density, float duty) { global_activity_.set(density, duty, PwrActivityOrigin::global); - activities_valid_ = false; - instance_powers_valid_ = false; + activitiesInvalid(); } void Power::unsetGlobalActivity() { global_activity_.init(); - activities_valid_ = false; - instance_powers_valid_ = false; + activitiesInvalid(); } void @@ -141,16 +146,14 @@ Power::setInputActivity(float density, float duty) { input_activity_.set(density, duty, PwrActivityOrigin::input); - activities_valid_ = false; - instance_powers_valid_ = false; + activitiesInvalid(); } void Power::unsetInputActivity() { input_activity_.init(); - activities_valid_ = false; - instance_powers_valid_ = false; + activitiesInvalid(); } void @@ -162,8 +165,7 @@ Power::setInputPortActivity(const Port *input_port, const Pin *pin = network_->findPin(top_inst, input_port); if (pin) { user_activity_map_[pin] = {density, duty, PwrActivityOrigin::user}; - activities_valid_ = false; - instance_powers_valid_ = false; + activitiesInvalid(); } } @@ -174,8 +176,7 @@ Power::unsetInputPortActivity(const Port *input_port) const Pin *pin = network_->findPin(top_inst, input_port); if (pin) { user_activity_map_.erase(pin); - activities_valid_ = false; - instance_powers_valid_ = false; + activitiesInvalid(); } } @@ -186,17 +187,14 @@ Power::setUserActivity(const Pin *pin, PwrActivityOrigin origin) { user_activity_map_[pin] = {density, duty, origin}; - activities_valid_ = false; - instance_powers_valid_ = false; - + activitiesInvalid(); } void Power::unsetUserActivity(const Pin *pin) { user_activity_map_.erase(pin); - activities_valid_ = false; - instance_powers_valid_ = false; + activitiesInvalid(); } PwrActivity & @@ -243,7 +241,7 @@ Power::setSeqActivity(const Instance *reg, PwrActivity &activity) { seq_activity_map_[SeqPin(reg, output)] = activity; - activities_valid_ = false; + activitiesInvalid(); } bool @@ -709,10 +707,9 @@ void Power::ensureActivities() { Stats stats(debug_, report_); - // No need to propagate activites if global activity is set. - if (!global_activity_.isSet()) { - if (!activities_valid_) { - Stats stats(debug_, report_); + if (!activities_valid_) { + // No need to propagate activites if global activity is set. + if (!global_activity_.isSet()) { // Clear existing activities. activity_map_.clear(); seq_activity_map_.clear(); @@ -748,9 +745,8 @@ Power::ensureActivities() pass, visitor.maxChange()); pass++; } - stats.report("Find power activities"); - activities_valid_ = true; } + activities_valid_ = true; } stats.report("Power activities"); } diff --git a/power/Power.hh b/power/Power.hh index 09cf0050..55f8a252 100644 --- a/power/Power.hh +++ b/power/Power.hh @@ -76,6 +76,7 @@ class Power : public StaState public: Power(StaState *sta); void clear(); + void activitiesInvalid(); void power(const Corner *corner, // Return values. PowerResult &total, diff --git a/search/Sta.cc b/search/Sta.cc index b34d2d8a..3957f3d5 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -1111,6 +1111,7 @@ Sta::makeClock(const char *name, sdc_->makeClock(name, pins, add_to_pins, period, waveform, comment); update_genclks_ = true; search_->arrivalsInvalid(); + power_->activitiesInvalid(); } void @@ -1135,6 +1136,7 @@ Sta::makeGeneratedClock(const char *name, edges, edge_shifts, comment); update_genclks_ = true; search_->arrivalsInvalid(); + power_->activitiesInvalid(); } void @@ -1142,6 +1144,7 @@ Sta::removeClock(Clock *clk) { sdc_->removeClock(clk); search_->arrivalsInvalid(); + power_->activitiesInvalid(); } bool @@ -1819,6 +1822,7 @@ Sta::setLogicValue(Pin *pin, sdc_->setLogicValue(pin, value); // Levelization respects constant disabled edges. levelize_->invalid(); + power_->activitiesInvalid(); sim_->constantsInvalid(); // Constants disable edges which isolate downstream vertices of the // graph from the delay calculator's BFS search. This means that @@ -1834,6 +1838,7 @@ Sta::setCaseAnalysis(Pin *pin, LogicValue value) { sdc_->setCaseAnalysis(pin, value); + power_->activitiesInvalid(); // Levelization respects constant disabled edges. levelize_->invalid(); sim_->constantsInvalid();