set activity invalidates inst power resolves #336

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2025-11-18 18:55:56 -07:00
parent 759348402d
commit 10511dee01
2 changed files with 15 additions and 2 deletions

View File

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

View File

@ -234,6 +234,7 @@ private:
bool activities_valid_;
Bdd bdd_;
std::map<const Instance*, PowerResult> instance_powers_;
bool instance_powers_valid_;
const Corner *corner_;
static constexpr int max_activity_passes_ = 100;