Merge remote-tracking branch 'upstream/master'

Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
This commit is contained in:
Matt Liberty 2025-11-19 19:40:52 +00:00
commit 581364982d
4 changed files with 33 additions and 18 deletions

View File

@ -101,6 +101,7 @@ Power::Power(StaState *sta) :
seq_activity_map_(100, SeqPinHash(network_), SeqPinEqual()), seq_activity_map_(100, SeqPinHash(network_), SeqPinEqual()),
activities_valid_(false), activities_valid_(false),
bdd_(sta), bdd_(sta),
instance_powers_valid_(false),
corner_(nullptr) corner_(nullptr)
{ {
} }
@ -118,19 +119,26 @@ Power::clear()
corner_ = nullptr; corner_ = nullptr;
} }
void
Power::activitiesInvalid()
{
activities_valid_ = false;
instance_powers_valid_ = false;
}
void void
Power::setGlobalActivity(float density, Power::setGlobalActivity(float density,
float duty) float duty)
{ {
global_activity_.set(density, duty, PwrActivityOrigin::global); global_activity_.set(density, duty, PwrActivityOrigin::global);
activities_valid_ = false; activitiesInvalid();
} }
void void
Power::unsetGlobalActivity() Power::unsetGlobalActivity()
{ {
global_activity_.init(); global_activity_.init();
activities_valid_ = false; activitiesInvalid();
} }
void void
@ -138,14 +146,14 @@ Power::setInputActivity(float density,
float duty) float duty)
{ {
input_activity_.set(density, duty, PwrActivityOrigin::input); input_activity_.set(density, duty, PwrActivityOrigin::input);
activities_valid_ = false; activitiesInvalid();
} }
void void
Power::unsetInputActivity() Power::unsetInputActivity()
{ {
input_activity_.init(); input_activity_.init();
activities_valid_ = false; activitiesInvalid();
} }
void void
@ -157,7 +165,7 @@ Power::setInputPortActivity(const Port *input_port,
const Pin *pin = network_->findPin(top_inst, input_port); const Pin *pin = network_->findPin(top_inst, input_port);
if (pin) { if (pin) {
user_activity_map_[pin] = {density, duty, PwrActivityOrigin::user}; user_activity_map_[pin] = {density, duty, PwrActivityOrigin::user};
activities_valid_ = false; activitiesInvalid();
} }
} }
@ -168,7 +176,7 @@ Power::unsetInputPortActivity(const Port *input_port)
const Pin *pin = network_->findPin(top_inst, input_port); const Pin *pin = network_->findPin(top_inst, input_port);
if (pin) { if (pin) {
user_activity_map_.erase(pin); user_activity_map_.erase(pin);
activities_valid_ = false; activitiesInvalid();
} }
} }
@ -179,14 +187,14 @@ Power::setUserActivity(const Pin *pin,
PwrActivityOrigin origin) PwrActivityOrigin origin)
{ {
user_activity_map_[pin] = {density, duty, origin}; user_activity_map_[pin] = {density, duty, origin};
activities_valid_ = false; activitiesInvalid();
} }
void void
Power::unsetUserActivity(const Pin *pin) Power::unsetUserActivity(const Pin *pin)
{ {
user_activity_map_.erase(pin); user_activity_map_.erase(pin);
activities_valid_ = false; activitiesInvalid();
} }
PwrActivity & PwrActivity &
@ -233,7 +241,7 @@ Power::setSeqActivity(const Instance *reg,
PwrActivity &activity) PwrActivity &activity)
{ {
seq_activity_map_[SeqPin(reg, output)] = activity; seq_activity_map_[SeqPin(reg, output)] = activity;
activities_valid_ = false; activitiesInvalid();
} }
bool bool
@ -699,10 +707,9 @@ void
Power::ensureActivities() Power::ensureActivities()
{ {
Stats stats(debug_, report_); Stats stats(debug_, report_);
// No need to propagate activites if global activity is set. if (!activities_valid_) {
if (!global_activity_.isSet()) { // No need to propagate activites if global activity is set.
if (!activities_valid_) { if (!global_activity_.isSet()) {
Stats stats(debug_, report_);
// Clear existing activities. // Clear existing activities.
activity_map_.clear(); activity_map_.clear();
seq_activity_map_.clear(); seq_activity_map_.clear();
@ -738,9 +745,8 @@ Power::ensureActivities()
pass, visitor.maxChange()); pass, visitor.maxChange());
pass++; pass++;
} }
stats.report("Find power activities");
activities_valid_ = true;
} }
activities_valid_ = true;
} }
stats.report("Power activities"); stats.report("Power activities");
} }
@ -837,9 +843,11 @@ Power::seedRegOutputActivities(const Instance *reg,
void void
Power::ensureInstPowers(const Corner *corner) Power::ensureInstPowers(const Corner *corner)
{ {
if (instance_powers_.empty() if (!instance_powers_valid_
|| corner != corner_) || corner != corner_) {
findInstPowers(corner); findInstPowers(corner);
instance_powers_valid_ = true;
}
} }
void void

View File

@ -76,6 +76,7 @@ class Power : public StaState
public: public:
Power(StaState *sta); Power(StaState *sta);
void clear(); void clear();
void activitiesInvalid();
void power(const Corner *corner, void power(const Corner *corner,
// Return values. // Return values.
PowerResult &total, PowerResult &total,
@ -234,6 +235,7 @@ private:
bool activities_valid_; bool activities_valid_;
Bdd bdd_; Bdd bdd_;
std::map<const Instance*, PowerResult> instance_powers_; std::map<const Instance*, PowerResult> instance_powers_;
bool instance_powers_valid_;
const Corner *corner_; const Corner *corner_;
static constexpr int max_activity_passes_ = 100; static constexpr int max_activity_passes_ = 100;

View File

@ -1111,6 +1111,7 @@ Sta::makeClock(const char *name,
sdc_->makeClock(name, pins, add_to_pins, period, waveform, comment); sdc_->makeClock(name, pins, add_to_pins, period, waveform, comment);
update_genclks_ = true; update_genclks_ = true;
search_->arrivalsInvalid(); search_->arrivalsInvalid();
power_->activitiesInvalid();
} }
void void
@ -1135,6 +1136,7 @@ Sta::makeGeneratedClock(const char *name,
edges, edge_shifts, comment); edges, edge_shifts, comment);
update_genclks_ = true; update_genclks_ = true;
search_->arrivalsInvalid(); search_->arrivalsInvalid();
power_->activitiesInvalid();
} }
void void
@ -1142,6 +1144,7 @@ Sta::removeClock(Clock *clk)
{ {
sdc_->removeClock(clk); sdc_->removeClock(clk);
search_->arrivalsInvalid(); search_->arrivalsInvalid();
power_->activitiesInvalid();
} }
bool bool
@ -1819,6 +1822,7 @@ Sta::setLogicValue(Pin *pin,
sdc_->setLogicValue(pin, value); sdc_->setLogicValue(pin, value);
// Levelization respects constant disabled edges. // Levelization respects constant disabled edges.
levelize_->invalid(); levelize_->invalid();
power_->activitiesInvalid();
sim_->constantsInvalid(); sim_->constantsInvalid();
// Constants disable edges which isolate downstream vertices of the // Constants disable edges which isolate downstream vertices of the
// graph from the delay calculator's BFS search. This means that // graph from the delay calculator's BFS search. This means that
@ -1834,6 +1838,7 @@ Sta::setCaseAnalysis(Pin *pin,
LogicValue value) LogicValue value)
{ {
sdc_->setCaseAnalysis(pin, value); sdc_->setCaseAnalysis(pin, value);
power_->activitiesInvalid();
// Levelization respects constant disabled edges. // Levelization respects constant disabled edges.
levelize_->invalid(); levelize_->invalid();
sim_->constantsInvalid(); sim_->constantsInvalid();

View File

@ -534,7 +534,7 @@ VerilogReader::makeModuleInst(const string *module_vname,
// to reduce the memory footprint of the verilog parser. // to reduce the memory footprint of the verilog parser.
if (liberty_cell if (liberty_cell
&& hasScalarNamedPortRefs(liberty_cell, pins)) { && hasScalarNamedPortRefs(liberty_cell, pins)) {
int port_count = liberty_cell->portBitCount(); const int port_count = liberty_cell->portBitCount();
StdStringSeq net_names(port_count); StdStringSeq net_names(port_count);
for (VerilogNet *vnet : *pins) { for (VerilogNet *vnet : *pins) {
VerilogNetPortRefScalarNet *vpin = VerilogNetPortRefScalarNet *vpin =