From 5bf832c1b6133a6c90a8fc9122981168f3429436 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Wed, 19 Nov 2025 10:49:43 -0700 Subject: [PATCH] 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();