Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

psm: add check for bterms option #6584

Merged
merged 6 commits into from
Jan 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/psm/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ check_power_grid
-net net_name
[-floorplanning]
[-error_file error_file]
[-dont_require_terminals]
```

#### Options
Expand All @@ -69,6 +70,7 @@ check_power_grid
| `-net` | Name of the net to analyze. Must be a power or ground net name. |
| `-floorplanning` | Ignore non-fixed instances in the power grid, this is useful during floorplanning analysis when instances may not be properly placed. |
| `-error_file` | File to write power grid errors to. |
| `-dont_require_terminals` | If specified, this will skip checking if there are terminals on the net. |

### Write Spice Power Grid

Expand Down
3 changes: 2 additions & 1 deletion src/psm/include/psm/pdnsim.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,8 @@ class PDNSim : public odb::dbBlockCallBackObj
IRDropByPoint& ir_drop) const;
bool checkConnectivity(odb::dbNet* net,
bool floorplanning,
const std::string& error_file);
const std::string& error_file,
bool require_bterm);
void setDebugGui(bool enable);

void clearSolvers();
Expand Down
28 changes: 27 additions & 1 deletion src/psm/src/ir_solver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ PDNSim::IRDropByPoint IRSolver::getIRDrop(odb::dbTechLayer* layer,
return ir_drop;
}

bool IRSolver::check()
bool IRSolver::check(bool check_bterms)
{
const utl::DebugScopedTimer timer(logger_, utl::PSM, "timer", 1, "Check: {}");
if (connected_.has_value()) {
Expand All @@ -137,6 +137,10 @@ bool IRSolver::check()

// set to true and unset if it failed
connected_ = true;
if (check_bterms && !checkBTerms()) {
reportMissingBTerm();
connected_ = false;
}
if (!checkOpen()) {
reportUnconnectedNodes();
connected_ = false;
Expand Down Expand Up @@ -228,6 +232,28 @@ bool IRSolver::checkOpen()
return true;
}

bool IRSolver::checkBTerms() const
{
const utl::DebugScopedTimer timer(
logger_, utl::PSM, "timer", 1, "Check bterm: {}");

for (odb::dbBTerm* bterm : net_->getBTerms()) {
for (odb::dbBPin* bpin : bterm->getBPins()) {
if (bpin->getPlacementStatus().isPlaced()) {
return true;
}
}
}

return false;
}

void IRSolver::reportMissingBTerm() const
{
logger_->error(
utl::PSM, 25, "{} does not contain any terminals", net_->getName());
}

IRSolver::ConnectivityResults IRSolver::getConnectivityResults() const
{
ConnectivityResults results;
Expand Down
4 changes: 3 additions & 1 deletion src/psm/src/ir_solver.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ class IRSolver

odb::dbNet* getNet() const { return net_; };

bool check();
bool check(bool check_bterms);

void solve(sta::Corner* corner,
GeneratedSourceType source_type,
Expand Down Expand Up @@ -156,6 +156,7 @@ class IRSolver
odb::dbTech* getTech() const;

bool checkOpen();
bool checkBTerms() const;
bool checkShort() const;

std::map<odb::dbInst*, Power> getInstancePower(sta::Corner* corner) const;
Expand Down Expand Up @@ -187,6 +188,7 @@ class IRSolver
std::vector<std::unique_ptr<SourceNode>>& sources) const;

void reportUnconnectedNodes() const;
void reportMissingBTerm() const;
bool wasNodeVisited(const std::unique_ptr<ITermNode>& node) const;
bool wasNodeVisited(const std::unique_ptr<Node>& node) const;
bool wasNodeVisited(const Node* node) const;
Expand Down
7 changes: 4 additions & 3 deletions src/psm/src/pdnsim.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ void PDNSim::analyzePowerGrid(odb::dbNet* net,
const std::string& error_file,
const std::string& voltage_source_file)
{
if (!checkConnectivity(net, false, error_file)) {
if (!checkConnectivity(net, false, error_file, false)) {
return;
}

Expand All @@ -138,10 +138,11 @@ void PDNSim::analyzePowerGrid(odb::dbNet* net,

bool PDNSim::checkConnectivity(odb::dbNet* net,
bool floorplanning,
const std::string& error_file)
const std::string& error_file,
bool require_bterm)
{
auto* solver = getIRSolver(net, floorplanning);
const bool check = solver->check();
const bool check = solver->check(require_bterm);
solver->writeErrorFile(error_file);

if (debug_gui_enabled_) {
Expand Down
4 changes: 2 additions & 2 deletions src/psm/src/pdnsim.i
Original file line number Diff line number Diff line change
Expand Up @@ -99,10 +99,10 @@ insert_decap_cmd(const float target, const char* net_name)
}

bool
check_connectivity_cmd(odb::dbNet* net, bool floorplanning, const char* error_file)
check_connectivity_cmd(odb::dbNet* net, bool floorplanning, const char* error_file, bool dont_require_bterm)
{
PDNSim* pdnsim = getPDNSim();
return pdnsim->checkConnectivity(net, floorplanning, error_file);
return pdnsim->checkConnectivity(net, floorplanning, error_file, !dont_require_bterm);
}

void
Expand Down
11 changes: 9 additions & 2 deletions src/psm/src/pdnsim.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,13 @@ sta::define_cmd_args "check_power_grid" {
-net power_net
[-error_file error_file]
[-floorplanning]
[-dont_require_terminals]
}

proc check_power_grid { args } {
sta::parse_key_args "check_power_grid" args \
keys {-net -error_file} flags {-floorplanning}
keys {-net -error_file} \
flags {-floorplanning -dont_require_terminals}

if { ![info exists keys(-net)] } {
utl::error PSM 57 "Argument -net not specified."
Expand All @@ -53,8 +55,13 @@ proc check_power_grid { args } {
}

set floorplanning [info exists flags(-floorplanning)]
set dont_require_bterm [info exists flags(-dont_require_terminals)]

psm::check_connectivity_cmd [psm::find_net $keys(-net)] $floorplanning $error_file
psm::check_connectivity_cmd \
[psm::find_net $keys(-net)] \
$floorplanning \
$error_file \
$dont_require_bterm
}

sta::define_cmd_args "analyze_power_grid" {
Expand Down
2 changes: 2 additions & 0 deletions src/psm/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ or_integration_tests(
check_power_grid_floorplanning
check_power_grid_macros
check_power_grid_ok_disconnected
check_power_grid_require_bterms_fail
check_power_grid_require_bterms_pass
corners
corners_assign_power
gcd_all_vss
Expand Down
2 changes: 1 addition & 1 deletion src/psm/test/check_power_grid.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ source helpers.tcl

read_lef Nangate45/Nangate45.lef
read_def Nangate45_data/gcd.def
check_power_grid -net VDD
check_power_grid -net VDD -dont_require_terminals
2 changes: 1 addition & 1 deletion src/psm/test/check_power_grid_disconnected.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ source helpers.tcl
read_lef Nangate45/Nangate45.lef
read_lef Nangate45_data/fakeram45_64x32.lef
read_def Nangate45_data/check_power_grid_disconnected.def
catch {check_power_grid -net VDD} err
catch {check_power_grid -net VDD -dont_require_terminals} err
puts $err
3 changes: 2 additions & 1 deletion src/psm/test/check_power_grid_disconnected_macro.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ read_def asap7_data/riscv.def


set error_report [make_result_file check_power_grid_disconnected_macro.rpt]
catch {check_power_grid -net VDD -error_file $error_report} err
catch {check_power_grid -net VDD -error_file $error_report \
-dont_require_terminals} err
puts $err

diff_files $error_report check_power_grid_disconnected_macro.rptok
2 changes: 1 addition & 1 deletion src/psm/test/check_power_grid_floorplanning.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ source helpers.tcl

read_lef Nangate45/Nangate45.lef
read_def Nangate45_data/gcd_floorplanning.def
check_power_grid -net VDD -floorplanning
check_power_grid -net VDD -floorplanning -dont_require_terminals
2 changes: 1 addition & 1 deletion src/psm/test/check_power_grid_macros.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@ read_lef Nangate45_data/fakeram45_64x32.lef

read_def check_power_grid_macros.def

check_power_grid -net VDD
check_power_grid -net VDD -dont_require_terminals
2 changes: 1 addition & 1 deletion src/psm/test/check_power_grid_ok_disconnected.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@ read_liberty Nangate45/Nangate45_typ.lib
read_liberty Nangate45/fakeram45_64x32.lib

read_def Nangate45_data/check_power_grid_ok_disconnected.def
check_power_grid -net VDD
check_power_grid -net VDD -dont_require_terminals
8 changes: 8 additions & 0 deletions src/psm/test/check_power_grid_require_bterms_fail.ok
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[INFO ODB-0227] LEF file: Nangate45/Nangate45.lef, created 22 layers, 27 vias, 135 library cells
[INFO ODB-0128] Design: gcd
[INFO ODB-0130] Created 54 pins.
[INFO ODB-0131] Created 624 components and 2752 component-terminals.
[INFO ODB-0132] Created 2 special nets and 1248 connections.
[INFO ODB-0133] Created 581 nets and 1504 connections.
[ERROR PSM-0025] VDD does not contain any terminals
PSM-0025
7 changes: 7 additions & 0 deletions src/psm/test/check_power_grid_require_bterms_fail.tcl
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Check that check_power_grid fails with missing terminals
source helpers.tcl

read_lef Nangate45/Nangate45.lef
read_def Nangate45_data/gcd.def
catch {check_power_grid -net VDD} err
puts $err
8 changes: 8 additions & 0 deletions src/psm/test/check_power_grid_require_bterms_pass.ok
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[INFO ODB-0227] LEF file: Nangate45/Nangate45.lef, created 22 layers, 27 vias, 135 library cells
[INFO ODB-0128] Design: aes_cipher_top
[INFO ODB-0130] Created 390 pins.
[INFO ODB-0131] Created 19835 components and 101835 component-terminals.
[INFO ODB-0132] Created 2 special nets and 39670 connections.
[INFO ODB-0133] Created 18908 nets and 62165 connections.
[INFO PSM-0040] All shapes on net VDD are connected.
1
7 changes: 7 additions & 0 deletions src/psm/test/check_power_grid_require_bterms_pass.tcl
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Check that check_power_grid passes with terminals
source helpers.tcl

read_lef Nangate45/Nangate45.lef
read_def Nangate45_data/aes_bterms.def
catch {check_power_grid -net VDD -dont_require_terminals} err
puts $err
2 changes: 1 addition & 1 deletion src/psm/test/gcd_all_vss.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ set voltage_file [make_result_file gcd_all_vss-voltage.rpt]
set em_file [make_result_file gcd_all_vss-em.rpt]
set spice_file [make_result_file gcd_all_vss-spice.sp]

check_power_grid -net VSS
check_power_grid -net VSS -dont_require_terminals
analyze_power_grid -vsrc Vsrc_gcd_vss.loc -voltage_file $voltage_file -net VSS \
-enable_em -em_outfile $em_file

Expand Down
2 changes: 1 addition & 1 deletion src/psm/test/gcd_sky130_vdd.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@
design.readDef("sky130hd_data/gcd_sky130hd_floorplan.def")
design.evalTclString("read_sdc sky130hd_data/gcd_sky130hd_floorplan.sdc")

pdnsim_aux.check_power_grid(design, net="VDD")
pdnsim_aux.check_power_grid(design, net="VDD", require_bterm=False)
2 changes: 1 addition & 1 deletion src/psm/test/gcd_sky130_vdd.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@ read_def sky130hd_data/gcd_sky130hd_floorplan.def
read_liberty sky130hd/sky130_fd_sc_hd__tt_025C_1v80.lib
read_sdc sky130hd_data/gcd_sky130hd_floorplan.sdc

check_power_grid -net VDD
check_power_grid -net VDD -dont_require_terminals
2 changes: 1 addition & 1 deletion src/psm/test/gcd_test_assign_power.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ set voltage_file [make_result_file gcd_test_vdd-voltage.rpt]
set_pdnsim_inst_power -inst _440_ -power 1e-5
set_pdnsim_inst_power -inst _829_ -power 1e-5

check_power_grid -net VDD
check_power_grid -net VDD -dont_require_terminals
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a way we could generate the terminals rather than using the switch?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pdngen can generate them if it's setup to do so, that is the correct place to do it, this is only a checker.

analyze_power_grid -vsrc Vsrc_gcd_vdd.loc -net VDD
2 changes: 1 addition & 1 deletion src/psm/test/gcd_test_vdd.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
design.evalTclString("read_sdc Nangate45_data/gcd.sdc")

voltage_file = helpers.make_result_file("gcd_test_vdd-voltage.rpt")
pdnsim_aux.check_power_grid(design, net="VDD")
pdnsim_aux.check_power_grid(design, net="VDD", require_bterm=False)

pdnsim_aux.analyze_power_grid(
design, vsrc="Vsrc_gcd_vdd.loc", net="VDD", outfile=voltage_file
Expand Down
2 changes: 1 addition & 1 deletion src/psm/test/gcd_test_vdd.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ read_sdc Nangate45_data/gcd.sdc

set voltage_file [make_result_file gcd_test_vdd-voltage.rpt]

check_power_grid -net VDD
check_power_grid -net VDD -dont_require_terminals
analyze_power_grid -vsrc Vsrc_gcd_vdd.loc -voltage_file $voltage_file -net VDD

diff_files $voltage_file gcd_test_vdd-voltage.rptok
6 changes: 4 additions & 2 deletions src/psm/test/pdnsim_aux.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,15 +81,17 @@ def analyze_power_grid(
)


def check_power_grid(design, *, net=None, error_file=None):
def check_power_grid(design, *, net=None, error_file=None, require_bterm=True):
pdnsim = design.getPDNSim()
if not net:
utl.error(utl.PSM, 157, "Argument 'net' not specified to check_power_grid.")

if not error_file:
error_file = ""

res = pdnsim.checkConnectivity(design.getBlock().findNet(net), False, error_file)
res = pdnsim.checkConnectivity(
design.getBlock().findNet(net), False, error_file, require_bterm
)
if res == 0:
utl.error(utl.PSM, 169, "Check connectivity failed.")
return res
Expand Down
2 changes: 1 addition & 1 deletion src/psm/test/switch_top_grid.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ read_def Nangate45_data/aes.def
read_liberty Nangate45/Nangate45_typ.lib
read_sdc Nangate45_data/aes.sdc

check_power_grid -net VDD
check_power_grid -net VDD -dont_require_terminals
analyze_power_grid -net VDD -source_type BUMPS
analyze_power_grid -net VDD -source_type FULL
analyze_power_grid -net VDD -source_type STRAPS
2 changes: 1 addition & 1 deletion src/psm/test/top_grid_settings.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ read_def Nangate45_data/aes.def
read_liberty Nangate45/Nangate45_typ.lib
read_sdc Nangate45_data/aes.sdc

check_power_grid -net VDD
check_power_grid -net VDD -dont_require_terminals
set_pdnsim_source_settings -bump_dx 45 -bump_dy 45 -bump_size 25 -bump_interval 2
analyze_power_grid -net VDD -source_type BUMPS
set_pdnsim_source_settings -bump_dx 65 -bump_dy 65 -bump_size 25 -bump_interval 4
Expand Down
Loading