diff --git a/doc/OpenSTA.odt b/doc/OpenSTA.odt index 495ea6fb..488139bd 100644 Binary files a/doc/OpenSTA.odt and b/doc/OpenSTA.odt differ diff --git a/doc/OpenSTA.pdf b/doc/OpenSTA.pdf index f20e6fea..233d2857 100644 Binary files a/doc/OpenSTA.pdf and b/doc/OpenSTA.pdf differ diff --git a/include/sta/PowerClass.hh b/include/sta/PowerClass.hh index 5b5fbf5f..ed4a4860 100644 --- a/include/sta/PowerClass.hh +++ b/include/sta/PowerClass.hh @@ -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_; } diff --git a/power/Power.cc b/power/Power.cc index b66681e1..25d1cb2d 100644 --- a/power/Power.cc +++ b/power/Power.cc @@ -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, diff --git a/power/Power.hh b/power/Power.hh index f28a7946..f4fde251 100644 --- a/power/Power.hh +++ b/power/Power.hh @@ -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(); diff --git a/power/Power.i b/power/Power.i index e2e0ed50..cdc59840 100644 --- a/power/Power.i +++ b/power/Power.i @@ -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() { diff --git a/power/Power.tcl b/power/Power.tcl index feebc7c1..d38d4cbb 100644 --- a/power/Power.tcl +++ b/power/Power.tcl @@ -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 }