@@ -785,23 +785,26 @@ IRSolver::Voltage IRSolver::generateSourceNodesFromSourceFile(
785785 return src_voltage;
786786}
787787
788- void IRSolver::buildNodeCurrentMap (sta::Corner* corner,
789- ValueNodeMap<Current>& currents) const
788+ IRSolver::Power IRSolver::buildNodeCurrentMap (
789+ sta::Corner* corner,
790+ ValueNodeMap<Current>& currents) const
790791{
791792 const utl::DebugScopedTimer timer (
792793 logger_, utl::PSM, " timer" , 1 , " Build node/current map: {}" );
793794 // Build power map
795+ std::map<odb::dbInst*, Power> instance_powers;
794796 const auto inst_nodes = network_->getInstanceNodeMapping ();
795797 const Voltage power_voltage = getPowerNetVoltage (corner);
796798 if (power_voltage == 0 ) {
797799 logger_->error (utl::PSM, 74 , " Unable to determine voltage for power nets." );
798800 }
799801 for (const auto & [inst, power] : getInstancePower (corner)) {
800- const Current current = power / power_voltage;
801802 auto find_inst = inst_nodes.find (inst);
802803 if (find_inst == inst_nodes.end ()) {
803804 continue ;
804805 }
806+ instance_powers[inst] = power;
807+ const Current current = power / power_voltage;
805808 const auto & nodes = find_inst->second ;
806809 for (auto * node : nodes) {
807810 currents[node] += current / nodes.size ();
@@ -823,12 +826,19 @@ void IRSolver::buildNodeCurrentMap(sta::Corner* corner,
823826 continue ;
824827 }
825828
829+ instance_powers[inst] = find_power->second ;
826830 const Current current = find_power->second / power_voltage;
827831 const auto & nodes = find_inst->second ;
828832 for (auto * node : nodes) {
829833 currents[node] += current / nodes.size ();
830834 }
831835 }
836+
837+ Power total_power = 0.0 ;
838+ for (const auto & [inst, power] : instance_powers) {
839+ total_power += power;
840+ }
841+ return total_power;
832842}
833843
834844std::map<Node*, Connection::ConnectionSet> IRSolver::getNodeConnectionMap (
@@ -993,7 +1003,7 @@ void IRSolver::solve(sta::Corner* corner,
9931003 all_nodes.insert (node);
9941004 }
9951005
996- buildNodeCurrentMap (corner, currents);
1006+ const Power total_power = buildNodeCurrentMap (corner, currents);
9971007
9981008 // Build source map
9991009 std::vector<std::unique_ptr<SourceNode>> src_nodes;
@@ -1077,6 +1087,7 @@ void IRSolver::solve(sta::Corner* corner,
10771087 voltages[node] = v_vector[node_idx];
10781088 }
10791089 solution_voltages_[corner] = src_voltage;
1090+ solution_power_[corner] = total_power;
10801091}
10811092
10821093std::map<odb::dbInst*, IRSolver::Power> IRSolver::getInstancePower (
@@ -1270,6 +1281,7 @@ IRSolver::Results IRSolver::getSolution(sta::Corner* corner) const
12701281 }
12711282
12721283 results.net_voltage = solution_voltages_.at (corner);
1284+ results.total_power = solution_power_.at (corner);
12731285
12741286 const bool is_ground = results.net_voltage == 0.0 ;
12751287 auto worst_calc = [is_ground](Voltage& worst, Voltage check) {
@@ -1357,6 +1369,7 @@ void IRSolver::report(sta::Corner* corner) const
13571369 logger_->report (" ########## IR report #################" );
13581370 logger_->report (" Net : {}" , net_->getName ());
13591371 logger_->report (" Corner : {}" , corner->name ());
1372+ logger_->report (" Total power : {:3.2e} W" , results.total_power );
13601373 logger_->report (" Supply voltage : {:3.2e} V" , results.net_voltage );
13611374 logger_->report (" Worstcase voltage: {:3.2e} V" , results.worst_voltage );
13621375 logger_->report (" Average voltage : {:3.2e} V" , results.avg_voltage );
0 commit comments