Skip to content

Commit 57e8f1d

Browse files
authored
Merge pull request #8967 from gadfort/psm-report-power
psm: add total power to PSM report
2 parents c3f40ea + 978174e commit 57e8f1d

25 files changed

+58
-6
lines changed

src/psm/src/ir_solver.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

834844
std::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

10821093
std::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);

src/psm/src/ir_solver.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class IRSolver
5050
Voltage avg_voltage = 0.0;
5151
Voltage avg_ir_drop = 0.0;
5252
float max_percent = 0.0;
53+
Power total_power = 0.0;
5354
};
5455
struct EMResults
5556
{
@@ -172,8 +173,8 @@ class IRSolver
172173
std::map<Node*, Connection::ConnectionSet> getNodeConnectionMap(
173174
const Connection::ConnectionMap<Connection::Conductance>& conductance)
174175
const;
175-
void buildNodeCurrentMap(sta::Corner* corner,
176-
ValueNodeMap<Current>& currents) const;
176+
IRSolver::Power buildNodeCurrentMap(sta::Corner* corner,
177+
ValueNodeMap<Current>& currents) const;
177178
std::map<Node*, std::size_t> assignNodeIDs(const Node::NodeSet& nodes,
178179
std::size_t start = 0) const;
179180
std::map<Node*, std::size_t> assignNodeIDs(
@@ -216,6 +217,7 @@ class IRSolver
216217
const std::map<odb::dbNet*, std::map<sta::Corner*, Voltage>>& user_voltages_;
217218
const std::map<odb::dbInst*, std::map<sta::Corner*, Power>>& user_powers_;
218219
std::map<sta::Corner*, Voltage> solution_voltages_;
220+
std::map<sta::Corner*, Power> solution_power_;
219221

220222
const PDNSim::GeneratedSourceSettings& generated_source_settings_;
221223

src/psm/test/aes_asap7_vdd.ok

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
########## IR report #################
2121
Net : VDD
2222
Corner : default
23+
Total power : 1.32e-03 W
2324
Supply voltage : 7.00e-01 V
2425
Worstcase voltage: 6.91e-01 V
2526
Average voltage : 6.97e-01 V

src/psm/test/aes_test_bterms.ok

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
########## IR report #################
99
Net : VDD
1010
Corner : default
11+
Total power : 3.01e-02 W
1112
Supply voltage : 1.10e+00 V
1213
Worstcase voltage: 1.09e+00 V
1314
Average voltage : 1.10e+00 V
@@ -19,6 +20,7 @@ Percentage drop : 0.90 %
1920
########## IR report #################
2021
Net : VSS
2122
Corner : default
23+
Total power : 3.01e-02 W
2224
Supply voltage : 0.00e+00 V
2325
Worstcase voltage: 9.20e-03 V
2426
Average voltage : 1.95e-03 V

src/psm/test/aes_test_multiple_bterms.ok

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
########## IR report #################
99
Net : VDD
1010
Corner : default
11+
Total power : 3.01e-02 W
1112
Supply voltage : 1.10e+00 V
1213
Worstcase voltage: 1.10e+00 V
1314
Average voltage : 1.10e+00 V
@@ -19,6 +20,7 @@ Percentage drop : 0.23 %
1920
########## IR report #################
2021
Net : VSS
2122
Corner : default
23+
Total power : 3.01e-02 W
2224
Supply voltage : 0.00e+00 V
2325
Worstcase voltage: 4.36e-03 V
2426
Average voltage : 3.62e-04 V

src/psm/test/aes_test_multiple_bterms_skipped.ok

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
########## IR report #################
99
Net : VDD
1010
Corner : default
11+
Total power : 3.01e-02 W
1112
Supply voltage : 1.10e+00 V
1213
Worstcase voltage: 1.10e+00 V
1314
Average voltage : 1.10e+00 V
@@ -19,6 +20,7 @@ Percentage drop : 0.23 %
1920
########## IR report #################
2021
Net : VDD
2122
Corner : default
23+
Total power : 3.01e-02 W
2224
Supply voltage : 1.10e+00 V
2325
Worstcase voltage: 1.10e+00 V
2426
Average voltage : 1.10e+00 V

src/psm/test/aes_test_vdd.ok

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
########## IR report #################
1010
Net : VDD
1111
Corner : default
12+
Total power : 3.01e-02 W
1213
Supply voltage : 1.10e+00 V
1314
Worstcase voltage: 1.06e+00 V
1415
Average voltage : 1.08e+00 V

src/psm/test/aes_test_vss.ok

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
########## IR report #################
1010
Net : VSS
1111
Corner : default
12+
Total power : 3.01e-02 W
1213
Supply voltage : 0.00e+00 V
1314
Worstcase voltage: 7.48e-02 V
1415
Average voltage : 5.25e-02 V

src/psm/test/corners.ok

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
########## IR report #################
1010
Net : VDD
1111
Corner : min
12+
Total power : 2.22e-04 W
1213
Supply voltage : 1.10e+00 V
1314
Worstcase voltage: 8.93e-01 V
1415
Average voltage : 9.07e-01 V
@@ -21,6 +22,7 @@ Percentage drop : 18.81 %
2122
########## IR report #################
2223
Net : VDD
2324
Corner : max
25+
Total power : 1.02e-04 W
2426
Supply voltage : 1.10e+00 V
2527
Worstcase voltage: 9.10e-01 V
2628
Average voltage : 9.22e-01 V

src/psm/test/corners_assign_power.ok

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
########## IR report #################
1010
Net : VDD
1111
Corner : min
12+
Total power : 2.41e-04 W
1213
Supply voltage : 1.10e+00 V
1314
Worstcase voltage: 8.74e-01 V
1415
Average voltage : 8.90e-01 V
@@ -21,6 +22,7 @@ Percentage drop : 20.52 %
2122
########## IR report #################
2223
Net : VDD
2324
Corner : max
25+
Total power : 3.02e-04 W
2426
Supply voltage : 1.10e+00 V
2527
Worstcase voltage: 2.51e-01 V
2628
Average voltage : 5.86e-01 V

0 commit comments

Comments
 (0)