diff --git a/include/sta/InternalPower.hh b/include/sta/InternalPower.hh index f1f0df4c..0f183662 100644 --- a/include/sta/InternalPower.hh +++ b/include/sta/InternalPower.hh @@ -43,7 +43,7 @@ class InternalPower public: InternalPower(LibertyPort *port, LibertyPort *related_port, - const std::string &related_pg_pin, + LibertyPort *related_pg_pin, const std::shared_ptr &when, InternalPowerModels &models); //InternalPower(InternalPower &&other) noexcept; @@ -51,7 +51,7 @@ public: LibertyPort *port() const { return port_; } LibertyPort *relatedPort() const { return related_port_; } FuncExpr *when() const { return when_.get(); } - const std::string &relatedPgPin() const { return related_pg_pin_; } + LibertyPort *relatedPgPin() const { return related_pg_pin_; } float power(const RiseFall *rf, const Pvt *pvt, float in_slew, @@ -61,7 +61,7 @@ public: protected: LibertyPort *port_; LibertyPort *related_port_; - std::string related_pg_pin_; + LibertyPort *related_pg_pin_; std::shared_ptr when_; InternalPowerModels models_; }; diff --git a/include/sta/Liberty.hh b/include/sta/Liberty.hh index 41f6d493..68d43bb3 100644 --- a/include/sta/Liberty.hh +++ b/include/sta/Liberty.hh @@ -587,7 +587,7 @@ public: TimingArcAttrsPtr attrs); void makeInternalPower(LibertyPort *port, LibertyPort *related_port, - const std::string &related_pg_pin, + LibertyPort *related_pg_pin, const std::shared_ptr &when, InternalPowerModels &models); void makeLeakagePower(LibertyPort *related_pg_port, diff --git a/liberty/InternalPower.cc b/liberty/InternalPower.cc index 11492bf4..2516a36d 100644 --- a/liberty/InternalPower.cc +++ b/liberty/InternalPower.cc @@ -35,7 +35,7 @@ namespace sta { InternalPower::InternalPower(LibertyPort *port, LibertyPort *related_port, - const std::string &related_pg_pin, + LibertyPort *related_pg_pin, const std::shared_ptr &when, InternalPowerModels &models) : port_(port), diff --git a/liberty/Liberty.cc b/liberty/Liberty.cc index a6e7be96..d83d06b7 100644 --- a/liberty/Liberty.cc +++ b/liberty/Liberty.cc @@ -1265,7 +1265,7 @@ LibertyCell::makeTimingArcSet(LibertyPort *from, void LibertyCell::makeInternalPower(LibertyPort *port, LibertyPort *related_port, - const std::string &related_pg_pin, + LibertyPort *related_pg_pin, const std::shared_ptr &when, InternalPowerModels &models) { diff --git a/liberty/LibertyReader.cc b/liberty/LibertyReader.cc index c75240b0..edcde894 100644 --- a/liberty/LibertyReader.cc +++ b/liberty/LibertyReader.cc @@ -2865,6 +2865,9 @@ LibertyReader::makeInternalPowers(LibertyPort *port, InternalPowerGroup *power_group) { int line = power_group->line(); + const std::string &related_pg_pin_name = power_group->relatedPgPin(); + LibertyPort *related_pg_pin = cell_->findLibertyPort(related_pg_pin_name.c_str()); + StringSeq *related_port_names = power_group->relatedPortNames(); if (related_port_names) { for (const char *related_port_name : *related_port_names) { @@ -2872,12 +2875,12 @@ LibertyReader::makeInternalPowers(LibertyPort *port, if (related_port_iter.hasNext()) { debugPrint(debug_, "liberty", 2, " power %s -> %s", related_port_name, port->name()); - makeInternalPowers(port, related_port_name, related_port_iter, power_group); + makeInternalPowers(port, related_port_name, related_port_iter, + related_pg_pin, power_group); } } } else { - const std::string &related_pg_pin = power_group->relatedPgPin(); if (port->hasMembers()) { LibertyPortMemberIterator bit_iter(port); while (bit_iter.hasNext()) { @@ -2896,9 +2899,9 @@ void LibertyReader::makeInternalPowers(LibertyPort *port, const char *related_port_name, PortNameBitIterator &related_port_iter, + LibertyPort *related_pg_pin, InternalPowerGroup *power_group) { - const std::string &related_pg_pin = power_group->relatedPgPin(); const auto &when = power_group->when(); InternalPowerModels &models = power_group->models(); if (related_port_iter.size() == 1 && !port->hasMembers()) { diff --git a/liberty/LibertyReaderPvt.hh b/liberty/LibertyReaderPvt.hh index 81109a68..b4a8e604 100644 --- a/liberty/LibertyReaderPvt.hh +++ b/liberty/LibertyReaderPvt.hh @@ -423,6 +423,7 @@ public: virtual void makeInternalPowers(LibertyPort *port, const char *related_port_name, PortNameBitIterator &related_port_iter, + LibertyPort *related_pg_pin, InternalPowerGroup *power_group); // AOCV attributes. diff --git a/power/Power.cc b/power/Power.cc index 286b43e7..db3ef053 100644 --- a/power/Power.cc +++ b/power/Power.cc @@ -1176,7 +1176,7 @@ Power::findInputInternalPower(const Pin *pin, Vertex *vertex = graph_->pinLoadVertex(pin); float internal = 0.0; for (const InternalPower *pwr : internal_pwrs) { - const char *related_pg_pin = pwr->relatedPgPin().c_str(); + LibertyPort *related_pg_pin = pwr->relatedPgPin(); float energy = 0.0; int rf_count = 0; for (const RiseFall *rf : RiseFall::range()) { @@ -1214,7 +1214,7 @@ Power::findInputInternalPower(const Pin *pin, duty, energy, port_internal, - related_pg_pin ? related_pg_pin : "no pg_pin"); + related_pg_pin ? related_pg_pin->name() : "no pg_pin"); internal += port_internal; } result.incrInternal(internal); @@ -1313,14 +1313,14 @@ Power::findOutputInternalPower(const LibertyPort *to_port, const LibertyPort *to_scene_port = to_port->scenePort(scene, min_max); FuncExpr *func = to_port->function(); - map pg_duty_sum; + std::map pg_duty_sum; for (const InternalPower *pwr : scene_cell->internalPowers(to_scene_port)) { const LibertyPort *from_scene_port = pwr->relatedPort(); if (from_scene_port) { const Pin *from_pin = findLinkPin(inst, from_scene_port); float from_density = findActivity(from_pin).density(); float duty = findInputDuty(inst, func, pwr); - const char *related_pg_pin = pwr->relatedPgPin().c_str(); + LibertyPort *related_pg_pin = pwr->relatedPgPin(); // Note related_pg_pin may be null. pg_duty_sum[related_pg_pin] += from_density * duty; } @@ -1331,7 +1331,7 @@ Power::findOutputInternalPower(const LibertyPort *to_port, float internal = 0.0; for (const InternalPower *pwr : scene_cell->internalPowers(to_scene_port)) { FuncExpr *when = pwr->when(); - const char *related_pg_pin = pwr->relatedPgPin().c_str(); + LibertyPort *related_pg_pin = pwr->relatedPgPin(); float duty = findInputDuty(inst, func, pwr); Vertex *from_vertex = nullptr; bool positive_unate = true; @@ -1378,7 +1378,7 @@ Power::findOutputInternalPower(const LibertyPort *to_port, weight, energy, port_internal, - related_pg_pin ? related_pg_pin : "no pg_pin"); + related_pg_pin ? related_pg_pin->name() : "no pg_pin"); internal += port_internal; } result.incrInternal(internal); @@ -1517,13 +1517,13 @@ Power::findLeakagePower(const Instance *inst, LibertyCell *scene_cell = cell->sceneCell(scene, MinMax::max()); std::map leakage_summaries; Sim *sim = scene->mode()->sim(); - for (const LeakagePower &leak : scene_cell->leakagePowers()) { - LibertyPort *pg_port = leak.relatedPgPort(); + for (const LeakagePower &pwr : scene_cell->leakagePowers()) { + LibertyPort *pg_port = pwr.relatedPgPort(); if (pg_port == nullptr || pg_port->pwrGndType() == PwrGndType::primary_power) { LeakageSummary &sum = leakage_summaries[pg_port]; - float leakage = leak.power(); - FuncExpr *when = leak.when(); + float leakage = pwr.power(); + FuncExpr *when = pwr.when(); if (when) { LogicValue when_value = sim->evalExpr(when, inst); if (when_value == LogicValue::one) {