mirror of
https://github.com/retroSoC/retroSoC.git
synced 2026-11-06 14:55:14 +00:00
167 lines
5.5 KiB
Tcl
167 lines
5.5 KiB
Tcl
# Copyright 2025-2026 LibreLane Contributors and retroSoC Authors
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
# Adapted from the IHP SG13G2 LibreLane full-chip template.
|
|
|
|
source $::env(SCRIPTS_DIR)/openroad/common/io.tcl
|
|
source $::env(SCRIPTS_DIR)/openroad/common/set_global_connections.tcl
|
|
set_global_connections
|
|
|
|
set secondary_supplies []
|
|
foreach vdd $::env(VDD_NETS) gnd $::env(GND_NETS) {
|
|
if {$vdd != $::env(VDD_NET)} {
|
|
lappend secondary_supplies $vdd
|
|
set db_net [[ord::get_db_block] findNet $vdd]
|
|
if {$db_net == "NULL"} {
|
|
set net [odb::dbNet_create [ord::get_db_block] $vdd]
|
|
$net setSpecial
|
|
$net setSigType "POWER"
|
|
}
|
|
}
|
|
if {$gnd != $::env(GND_NET)} {
|
|
lappend secondary_supplies $gnd
|
|
set db_net [[ord::get_db_block] findNet $gnd]
|
|
if {$db_net == "NULL"} {
|
|
set net [odb::dbNet_create [ord::get_db_block] $gnd]
|
|
$net setSpecial
|
|
$net setSigType "GROUND"
|
|
}
|
|
}
|
|
}
|
|
|
|
# I/O rails are pad-ring internal and are absent from the synthesized top-level.
|
|
foreach {net signal_type} {IOVDD POWER IOVSS GROUND} {
|
|
set db_net [[ord::get_db_block] findNet $net]
|
|
if {$db_net == "NULL"} {
|
|
set db_net [odb::dbNet_create [ord::get_db_block] $net]
|
|
$db_net setSpecial
|
|
$db_net setSigType $signal_type
|
|
}
|
|
}
|
|
|
|
# IHP IO cells carry both core and external-IO power rails on lower-case pins.
|
|
add_global_connection -net $::env(VDD_NET) -inst_pattern .* -pin_pattern vdd -power
|
|
add_global_connection -net $::env(GND_NET) -inst_pattern .* -pin_pattern vss -ground
|
|
add_global_connection -net IOVDD -inst_pattern .* -pin_pattern iovdd -power
|
|
add_global_connection -net IOVSS -inst_pattern .* -pin_pattern iovss -ground
|
|
global_connect -verbose
|
|
|
|
# connect_by_abutment assigns IHP pad rails to corner-local *_RING nets. Rebind
|
|
# those physical pad and filler pins so the PDN knows they are VDD/VSS terminals.
|
|
proc reconnect_ihp_padring_rails {block} {
|
|
foreach {net_name pin_name} {
|
|
VDD vdd
|
|
VSS vss
|
|
IOVDD iovdd
|
|
IOVSS iovss
|
|
} {
|
|
set net [$block findNet $net_name]
|
|
foreach inst [$block getInsts] {
|
|
set master_name [[$inst getMaster] getName]
|
|
if {![string match "sg13g2_IOPad*" $master_name] &&
|
|
![string match "sg13g2_Filler*" $master_name] &&
|
|
![string match "sg13g2_Corner*" $master_name]} {
|
|
continue
|
|
}
|
|
foreach iterm [$inst getITerms] {
|
|
if {[[$iterm getMTerm] getName] != $pin_name} {
|
|
continue
|
|
}
|
|
odb::dbITerm_disconnect $iterm
|
|
odb::dbITerm_connect $iterm $net
|
|
}
|
|
}
|
|
}
|
|
}
|
|
reconnect_ihp_padring_rails [ord::get_db_block]
|
|
|
|
set_voltage_domain -name CORE -power $::env(VDD_NET) -ground $::env(GND_NET) \
|
|
-secondary_power $secondary_supplies
|
|
|
|
set stdcell_grid_args [list]
|
|
if {$::env(PDN_ENABLE_PINS) == 1} {
|
|
lappend stdcell_grid_args -pins "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)"
|
|
}
|
|
define_pdn_grid \
|
|
-name stdcell_grid \
|
|
-starts_with POWER \
|
|
-voltage_domain CORE \
|
|
{*}$stdcell_grid_args
|
|
|
|
add_pdn_stripe \
|
|
-grid stdcell_grid \
|
|
-layer $::env(PDN_VERTICAL_LAYER) \
|
|
-width $::env(PDN_VWIDTH) \
|
|
-pitch $::env(PDN_VPITCH) \
|
|
-offset $::env(PDN_VOFFSET) \
|
|
-spacing $::env(PDN_VSPACING) \
|
|
-starts_with POWER
|
|
|
|
add_pdn_stripe \
|
|
-grid stdcell_grid \
|
|
-layer $::env(PDN_HORIZONTAL_LAYER) \
|
|
-width $::env(PDN_HWIDTH) \
|
|
-pitch $::env(PDN_HPITCH) \
|
|
-offset $::env(PDN_HOFFSET) \
|
|
-spacing $::env(PDN_HSPACING) \
|
|
-starts_with POWER
|
|
|
|
add_pdn_connect \
|
|
-grid stdcell_grid \
|
|
-layers "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)"
|
|
|
|
if {$::env(PDN_ENABLE_RAILS) == 1} {
|
|
add_pdn_stripe \
|
|
-grid stdcell_grid \
|
|
-layer $::env(PDN_RAIL_LAYER) \
|
|
-width $::env(PDN_RAIL_WIDTH) \
|
|
-followpins
|
|
add_pdn_connect \
|
|
-grid stdcell_grid \
|
|
-layers "$::env(PDN_RAIL_LAYER) $::env(PDN_VERTICAL_LAYER)"
|
|
}
|
|
|
|
if {$::env(PDN_CORE_RING) == 1} {
|
|
add_pdn_ring \
|
|
-grid stdcell_grid \
|
|
-layers "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)" \
|
|
-widths "$::env(PDN_CORE_RING_VWIDTH) $::env(PDN_CORE_RING_HWIDTH)" \
|
|
-spacings "$::env(PDN_CORE_RING_VSPACING) $::env(PDN_CORE_RING_HSPACING)" \
|
|
-core_offset "$::env(PDN_CORE_RING_VOFFSET) $::env(PDN_CORE_RING_HOFFSET)" \
|
|
-connect_to_pads
|
|
}
|
|
|
|
define_pdn_grid \
|
|
-macro \
|
|
-default \
|
|
-name macro_default \
|
|
-starts_with POWER \
|
|
-halo "$::env(PDN_HORIZONTAL_HALO) $::env(PDN_VERTICAL_HALO)"
|
|
|
|
add_pdn_connect \
|
|
-grid macro_default \
|
|
-layers "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)"
|
|
|
|
set packet_ram_instances [list \
|
|
u_retrosoc.u_apb4_periph.u_apb4_usb2.u_link_domain.u_packet_store.u_packet_ram.u_packet_ram.u_data_high \
|
|
u_retrosoc.u_apb4_periph.u_apb4_usb2.u_link_domain.u_packet_store.u_packet_ram.u_packet_ram.u_data_low \
|
|
u_retrosoc.u_apb4_periph.u_apb4_usb2.u_link_domain.u_packet_store.u_packet_ram.u_packet_ram.u_ecc]
|
|
|
|
define_pdn_grid \
|
|
-macro \
|
|
-instances $packet_ram_instances \
|
|
-name packet_ram_grid \
|
|
-starts_with POWER
|
|
|
|
add_pdn_stripe \
|
|
-grid packet_ram_grid \
|
|
-layer Metal5 \
|
|
-width 2.81 \
|
|
-pitch 11.24 \
|
|
-offset 2.81 \
|
|
-spacing 2.81 \
|
|
-nets "VSS VDD" \
|
|
-starts_with POWER
|
|
|
|
add_pdn_connect -grid packet_ram_grid -layers "Metal4 Metal5"
|
|
add_pdn_connect -grid packet_ram_grid -layers "Metal5 TopMetal1"
|