Skip to content

Commit e9b3257

Browse files
authored
Merge pull request #8981 from gadfort/psm-input-res
psm: add source resistance option to better model packaging effects
2 parents dce7d10 + ed85e7b commit e9b3257

15 files changed

+200
-22
lines changed

src/psm/README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ set_pdnsim_source_settings
145145
[-bump_size size]
146146
[-bump_interval interval]
147147
[-strap_track_pitch pitch]
148+
[-external_resistance resistance]
148149
```
149150

150151
#### Options
@@ -154,7 +155,8 @@ set_pdnsim_source_settings
154155
| `-bump_dx`,`-bump_dy` | Set the bump pitch to decide the voltage source location. The default bump pitch is 140um. |
155156
| `-bump_size` | Set the bump size. The default bump size is 70um. |
156157
| `-bump_interval` | Set the bump population interval, this is used to depopulate the bump grid to emulate signals and other power connections. The default bump pitch is 3. |
157-
| `-strap_track_pitch` | Sets the track pitck to use for moduling voltage sources as straps. The default is 10x. |
158+
| `-strap_track_pitch` | Sets the track pitch to use for modeling voltage sources as straps. The default is 10x. |
159+
| `-external_resistance` | Set to model the resistance of the package or power network outside the chip/block. The default value is 0.0. |
158160

159161
### Insert Decap Cells
160162
The `insert_decap` command inserts decap cells in the areas with the highest

src/psm/include/psm/pdnsim.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ class PDNSim : public odb::dbBlockCallBackObj
5656

5757
// Straps
5858
int strap_track_pitch = 10;
59+
60+
// Source resistance
61+
float resistance = 0.0; // Ohms
5962
};
6063

6164
using IRDropByPoint = std::map<odb::Point, double>;

src/psm/src/connection.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -204,15 +204,23 @@ TermConnection::TermConnection(Node* node0, Node* node1)
204204
{
205205
}
206206

207-
Connection::Resistance TermConnection::getResistance(
208-
const ResistanceMap& res_map) const
207+
std::string TermConnection::describe() const
209208
{
210-
return kResistance;
209+
return "Terminal Connection";
211210
}
212211

213-
std::string TermConnection::describe() const
212+
/////////////////////////////
213+
214+
FixedResistanceConnection::FixedResistanceConnection(Node* node0,
215+
Node* node1,
216+
Resistance resistance)
217+
: Connection(node0, node1), res_(resistance)
214218
{
215-
return "Terminal Connection";
219+
}
220+
221+
std::string FixedResistanceConnection::describe() const
222+
{
223+
return "Fixed Resistance Connection";
216224
}
217225

218226
} // namespace psm

src/psm/src/connection.h

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,10 @@ class TermConnection : public Connection
131131
public:
132132
TermConnection(Node* node0, Node* node1);
133133

134-
Resistance getResistance(const ResistanceMap& res_map) const override;
134+
Resistance getResistance(const ResistanceMap& res_map) const override
135+
{
136+
return kResistance;
137+
}
135138
bool isValid() const override { return true; }
136139

137140
void mergeWith(const Connection* other) override {}
@@ -142,4 +145,23 @@ class TermConnection : public Connection
142145
static constexpr Resistance kResistance = 0.001;
143146
};
144147

148+
class FixedResistanceConnection : public Connection
149+
{
150+
public:
151+
FixedResistanceConnection(Node* node0, Node* node1, Resistance resistance);
152+
153+
Resistance getResistance(const ResistanceMap& res_map) const override
154+
{
155+
return res_;
156+
};
157+
bool isValid() const override { return true; }
158+
159+
void mergeWith(const Connection* other) override {}
160+
161+
std::string describe() const override;
162+
163+
private:
164+
Resistance res_;
165+
};
166+
145167
} // namespace psm

src/psm/src/ir_solver.cpp

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -431,15 +431,17 @@ Connection::ResistanceMap IRSolver::getResistanceMap(sta::Corner* corner) const
431431
}
432432

433433
Connection::ConnectionMap<Connection::Conductance>
434-
IRSolver::generateConductanceMap(sta::Corner* corner) const
434+
IRSolver::generateConductanceMap(
435+
sta::Corner* corner,
436+
const std::vector<std::unique_ptr<Connection>>& connections) const
435437
{
436438
const utl::DebugScopedTimer timer(
437439
logger_, utl::PSM, "timer", 1, "Generate conductance map: {}");
438440

439441
const Connection::ResistanceMap resistance = getResistanceMap(corner);
440442

441443
Connection::ConnectionMap<Connection::Conductance> conductance;
442-
for (const auto& conn : network_->getConnections()) {
444+
for (const auto& conn : connections) {
443445
const auto res = conn->getResistance(resistance);
444446
conductance[conn.get()] = 1.0 / res;
445447
}
@@ -985,7 +987,33 @@ void IRSolver::solve(sta::Corner* corner,
985987
voltages.clear();
986988
currents.clear();
987989

988-
const auto conductance = generateConductanceMap(corner);
990+
// Build source map
991+
std::vector<std::unique_ptr<SourceNode>> real_src_nodes;
992+
Voltage src_voltage
993+
= generateSourceNodes(source_type, source_file, corner, real_src_nodes);
994+
995+
std::vector<std::unique_ptr<SourceNode>> src_nodes;
996+
std::vector<std::unique_ptr<Connection>> src_conns;
997+
// If resistance is set, add connection from source nodes to new source and
998+
// connect
999+
if (generated_source_settings_.resistance > 0) {
1000+
src_nodes.reserve(real_src_nodes.size());
1001+
src_conns.reserve(real_src_nodes.size());
1002+
for (const auto& real_src_node : real_src_nodes) {
1003+
src_conns.push_back(std::make_unique<FixedResistanceConnection>(
1004+
real_src_node->getSource(),
1005+
real_src_node.get(),
1006+
generated_source_settings_.resistance));
1007+
src_nodes.push_back(std::make_unique<SourceNode>(real_src_node.get()));
1008+
}
1009+
} else {
1010+
src_nodes = std::move(real_src_nodes);
1011+
real_src_nodes.clear();
1012+
}
1013+
1014+
// Build conductance map
1015+
Connection::ConnectionMap<Connection::Conductance> conductance
1016+
= generateConductanceMap(corner, network_->getConnections());
9891017
debugPrint(logger_,
9901018
utl::PSM,
9911019
"stats",
@@ -997,23 +1025,34 @@ void IRSolver::solve(sta::Corner* corner,
9971025
dumpConductance(conductance, "cond");
9981026
}
9991027

1000-
const auto node_connections = getNodeConnectionMap(conductance);
1028+
std::map<Node*, Connection::ConnectionSet> node_connections
1029+
= getNodeConnectionMap(conductance);
10011030
Node::NodeSet all_nodes;
10021031
for (const auto& [node, conns] : node_connections) {
10031032
all_nodes.insert(node);
10041033
}
10051034

1006-
const Power total_power = buildNodeCurrentMap(corner, currents);
1035+
// Add source conductance
1036+
if (!src_conns.empty()) {
1037+
const auto src_conductance = generateConductanceMap(corner, src_conns);
1038+
for (const auto& [conn, cond] : src_conductance) {
1039+
conductance[conn] = cond;
1040+
}
1041+
for (const auto& [node, conns] : getNodeConnectionMap(src_conductance)) {
1042+
node_connections[node].insert(conns.begin(), conns.end());
1043+
}
1044+
}
10071045

1008-
// Build source map
1009-
std::vector<std::unique_ptr<SourceNode>> src_nodes;
1010-
Voltage src_voltage
1011-
= generateSourceNodes(source_type, source_file, corner, src_nodes);
1046+
const Power total_power = buildNodeCurrentMap(corner, currents);
10121047

10131048
// Solve
10141049
// create vector of nodes
10151050
std::map<Node*, std::size_t> node_index = assignNodeIDs(all_nodes);
10161051
const std::map<Node*, std::size_t> real_node_index = node_index;
1052+
for (const auto& [node, id] :
1053+
assignNodeIDs(real_src_nodes, node_index.size())) {
1054+
node_index[node] = id;
1055+
}
10171056
for (const auto& [node, id] : assignNodeIDs(src_nodes, node_index.size())) {
10181057
node_index[node] = id;
10191058
}
@@ -1052,6 +1091,7 @@ void IRSolver::solve(sta::Corner* corner,
10521091
if (logger_->debugCheck(utl::PSM, "dump", 1)) {
10531092
network_->dumpNodes(node_index);
10541093
dumpMatrix(g_matrix, "G");
1094+
dumpVector(j_vector, "J");
10551095
}
10561096
logger_->error(
10571097
utl::PSM,
@@ -1576,7 +1616,8 @@ Connection::ConnectionMap<IRSolver::Current> IRSolver::generateCurrentMap(
15761616
{
15771617
const auto& voltages = voltages_.at(corner);
15781618
Connection::ConnectionMap<IRSolver::Current> currents;
1579-
for (const auto& [connection, cond] : generateConductanceMap(corner)) {
1619+
for (const auto& [connection, cond] :
1620+
generateConductanceMap(corner, network_->getConnections())) {
15801621
if (connection->hasITermNode() || connection->hasBPinNode()) {
15811622
continue;
15821623
}

src/psm/src/ir_solver.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ class IRSolver
143143
sta::Corner* corner) const;
144144

145145
Connection::ConnectionMap<Connection::Conductance> generateConductanceMap(
146-
sta::Corner* corner) const;
146+
sta::Corner* corner,
147+
const std::vector<std::unique_ptr<Connection>>& connections) const;
147148
Voltage generateSourceNodes(
148149
GeneratedSourceType source_type,
149150
const std::string& source_file,

src/psm/src/pdnsim.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,9 @@ void PDNSim::setGeneratedSourceSettings(const GeneratedSourceSettings& settings)
205205
if (settings.strap_track_pitch > 0) {
206206
generated_source_settings_.strap_track_pitch = settings.strap_track_pitch;
207207
}
208+
if (settings.resistance > 0) {
209+
generated_source_settings_.resistance = settings.resistance;
210+
}
208211
}
209212

210213
void PDNSim::clearSolvers()

src/psm/src/pdnsim.i

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,14 +94,15 @@ void clear_solvers()
9494
pdnsim->clearSolvers();
9595
}
9696

97-
void set_source_settings(int bump_dx, int bump_dy, int bump_size, int bump_interval, int track_pitch)
97+
void set_source_settings(int bump_dx, int bump_dy, int bump_size, int bump_interval, int track_pitch, float resistance)
9898
{
9999
PDNSim::GeneratedSourceSettings settings;
100100
settings.bump_dx = bump_dx;
101101
settings.bump_dy = bump_dy;
102102
settings.bump_size = bump_size;
103103
settings.bump_interval = bump_interval;
104104
settings.strap_track_pitch = track_pitch;
105+
settings.resistance = resistance;
105106

106107
PDNSim* pdnsim = getPDNSim();
107108
pdnsim->setGeneratedSourceSettings(settings);

src/psm/src/pdnsim.tcl

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -227,11 +227,14 @@ sta::define_cmd_args "set_pdnsim_source_settings" {
227227
[-bump_dy pitch]
228228
[-bump_size size]
229229
[-bump_interval interval]
230-
[-strap_track_pitch pitch]}
230+
[-strap_track_pitch pitch]
231+
[-external_resistance resistance]
232+
}
231233

232234
proc set_pdnsim_source_settings { args } {
233235
sta::parse_key_args "set_pdnsim_source_settings" args \
234-
keys {-bump_dx -bump_dy -bump_size -bump_interval -strap_track_pitch} flags {}
236+
keys {-bump_dx -bump_dy -bump_size -bump_interval -strap_track_pitch -external_resistance} \
237+
flags {}
235238

236239
set dx 0
237240
if { [info exists keys(-bump_dx)] } {
@@ -255,7 +258,12 @@ proc set_pdnsim_source_settings { args } {
255258
set track_pitch $keys(-strap_track_pitch)
256259
}
257260

258-
psm::set_source_settings $dx $dy $size $interval $track_pitch
261+
set resistance 0
262+
if { [info exists keys(-external_resistance)] } {
263+
set resistance $keys(-external_resistance)
264+
}
265+
266+
psm::set_source_settings $dx $dy $size $interval $track_pitch $resistance
259267
}
260268

261269
namespace eval psm {

src/psm/test/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package(features = ["layering_check"])
77
# From CMakeLists.txt or_integration_tests(TESTS
88
COMPULSORY_TESTS = [
99
"aes_asap7_vdd",
10+
"aes_test_bterms_source_resistance",
1011
"aes_test_bterms",
1112
"aes_test_multiple_bterms",
1213
"aes_test_multiple_bterms_skipped",
@@ -22,6 +23,7 @@ COMPULSORY_TESTS = [
2223
"check_power_grid_require_bterms_pass",
2324
"corners",
2425
"corners_assign_power",
26+
"gcd_all_vss_source_res",
2527
"gcd_all_vss",
2628
"gcd_em_test_vdd",
2729
"gcd_no_vsrc",

0 commit comments

Comments
 (0)