unset_power_activity resolves #253

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2025-06-25 07:56:26 -07:00
parent 6a28a3dd52
commit a6ec2b5871
7 changed files with 117 additions and 3 deletions

Binary file not shown.

Binary file not shown.

View File

@ -49,6 +49,7 @@ public:
PwrActivity(float density,
float duty,
PwrActivityOrigin origin);
void init();
float density() const { return density_; }
void setDensity(float density);
float duty() const { return duty_; }

View File

@ -112,6 +112,13 @@ Power::setGlobalActivity(float density,
activities_valid_ = false;
}
void
Power::unsetGlobalActivity()
{
global_activity_.init();
activities_valid_ = false;
}
void
Power::setInputActivity(float density,
float duty)
@ -120,6 +127,13 @@ Power::setInputActivity(float density,
activities_valid_ = false;
}
void
Power::unsetInputActivity()
{
input_activity_.init();
activities_valid_ = false;
}
void
Power::setInputPortActivity(const Port *input_port,
float density,
@ -133,6 +147,17 @@ Power::setInputPortActivity(const Port *input_port,
}
}
void
Power::unsetInputPortActivity(const Port *input_port)
{
Instance *top_inst = network_->topInstance();
const Pin *pin = network_->findPin(top_inst, input_port);
if (pin) {
user_activity_map_.erase(pin);
activities_valid_ = false;
}
}
void
Power::setUserActivity(const Pin *pin,
float density,
@ -143,6 +168,13 @@ Power::setUserActivity(const Pin *pin,
activities_valid_ = false;
}
void
Power::unsetUserActivity(const Pin *pin)
{
user_activity_map_.erase(pin);
activities_valid_ = false;
}
PwrActivity &
Power::userActivity(const Pin *pin)
{
@ -664,7 +696,7 @@ Power::ensureActivities()
// Initialize default input activity (after sdc is defined)
// unless it has been set by command.
if (input_activity_.density() == 0.0) {
if (input_activity_.origin() == PwrActivityOrigin::unknown) {
float min_period = clockMinPeriod();
float density = 0.1 / (min_period != 0.0
? min_period
@ -1535,6 +1567,7 @@ PwrActivity::PwrActivity(float density,
duty_(duty),
origin_(origin)
{
check();
}
PwrActivity::PwrActivity() :
@ -1542,7 +1575,6 @@ PwrActivity::PwrActivity() :
duty_(0.0),
origin_(PwrActivityOrigin::unknown)
{
check();
}
void
@ -1563,6 +1595,14 @@ PwrActivity::setOrigin(PwrActivityOrigin origin)
origin_ = origin;
}
void
PwrActivity::init()
{
density_ = 0.0;
duty_ = 0.0;
origin_ = PwrActivityOrigin::unknown;
}
void
PwrActivity::set(float density,
float duty,

View File

@ -87,16 +87,20 @@ public:
const Corner *corner);
void setGlobalActivity(float activity,
float duty);
void unsetGlobalActivity();
void setInputActivity(float activity,
float duty);
void unsetInputActivity();
void setInputPortActivity(const Port *input_port,
float activity,
float duty);
void unsetInputPortActivity(const Port *input_port);
PwrActivity pinActivity(const Pin *pin);
void setUserActivity(const Pin *pin,
float activity,
float duty,
PwrActivityOrigin origin);
void unsetUserActivity(const Pin *pin);
void reportActivityAnnotation(bool report_unannotated,
bool report_annotated);
float clockMinPeriod();

View File

@ -84,6 +84,13 @@ set_power_global_activity(float activity,
power->setGlobalActivity(activity, duty);
}
void
unset_power_global_activity()
{
Power *power = Sta::sta()->power();
power->unsetGlobalActivity();
}
void
set_power_input_activity(float activity,
float duty)
@ -92,6 +99,13 @@ set_power_input_activity(float activity,
return power->setInputActivity(activity, duty);
}
void
unset_power_input_activity()
{
Power *power = Sta::sta()->power();
return power->unsetInputActivity();
}
void
set_power_input_port_activity(const Port *input_port,
float activity,
@ -101,6 +115,13 @@ set_power_input_port_activity(const Port *input_port,
return power->setInputPortActivity(input_port, activity, duty);
}
void
unset_power_input_port_activity(const Port *input_port)
{
Power *power = Sta::sta()->power();
return power->unsetInputPortActivity(input_port);
}
void
set_power_pin_activity(const Pin *pin,
float activity,
@ -110,6 +131,13 @@ set_power_pin_activity(const Pin *pin,
return power->setUserActivity(pin, activity, duty, PwrActivityOrigin::user);
}
void
unset_power_pin_activity(const Pin *pin)
{
Power *power = Sta::sta()->power();
return power->unsetUserActivity(pin);
}
float
clock_min_period()
{

View File

@ -289,7 +289,7 @@ proc set_power_activity { args } {
foreach port $ports {
if { [get_property $port "direction"] == "input" } {
if { [is_clock_src [sta::get_port_pin $port]] } {
sta_warn 303 "activity cannot be set on clock ports."
sta_warn 310 "activity cannot be set on clock ports."
} else {
set_power_input_port_activity $port $density $duty
}
@ -306,6 +306,47 @@ proc set_power_activity { args } {
################################################################
define_cmd_args "unset_power_activity" { [-global]\
[-input]\
[-input_ports ports]\
[-pins pins]\
[-clock clock]}
proc unset_power_activity { args } {
parse_key_args "unset_power_activity" args \
keys {-input_ports -pins -clock} \
flags {-global -input}
check_argc_eq0 "unset_power_activity" $args
if { [info exists flags(-global)] } {
unset_power_global_activity
}
if { [info exists flags(-input)] } {
unset_power_input_activity
}
if { [info exists keys(-input_ports)] } {
set ports [get_ports_error "input_ports" $keys(-input_ports)]
foreach port $ports {
if { [get_property $port "direction"] == "input" } {
if { [is_clock_src [sta::get_port_pin $port]] } {
sta_warn 303 "activity cannot be set on clock ports."
} else {
unset_power_input_port_activity $port
}
}
}
}
if { [info exists keys(-pins)] } {
set pins [get_pins $keys(-pins)]
foreach pin $pins {
unset_power_pin_activity $pin
}
}
}
################################################################
# Deprecated 9/2024
define_cmd_args "read_power_activities" { [-scope scope] -vcd filename }