blob: 84ea8108d28bb9ff3d9817689890285d0a5b097c [file] [log] [blame]
# Power nets
if { [info exists ::env(FP_PDN_ENABLE_GLOBAL_CONNECTIONS)] } {
if { $::env(FP_PDN_ENABLE_GLOBAL_CONNECTIONS) == 1 } {
foreach power_pin $::env(STD_CELL_POWER_PINS) {
add_global_connection \
-net $::env(VDD_NET) \
-inst_pattern .* \
-pin_pattern $power_pin \
-power
}
foreach ground_pin $::env(STD_CELL_GROUND_PINS) {
add_global_connection \
-net $::env(GND_NET) \
-inst_pattern .* \
-pin_pattern $ground_pin \
-ground
}
}
}
if { $::env(FP_PDN_ENABLE_MACROS_GRID) == 1 &&
[info exists ::env(FP_PDN_MACRO_HOOKS)]} {
set pdn_hooks [split $::env(FP_PDN_MACRO_HOOKS) ","]
foreach pdn_hook $pdn_hooks {
set instance_name [lindex $pdn_hook 0]
set power_net [lindex $pdn_hook 1]
set ground_net [lindex $pdn_hook 2]
set power_pin [lindex $pdn_hook 3]
set ground_pin [lindex $pdn_hook 4]
if { $power_pin == "" || $ground_pin == "" } {
puts "FP_PDN_MACRO_HOOKS missing power and ground pin names"
exit -1
}
add_global_connection \
-net $power_net \
-inst_pattern $instance_name \
-pin_pattern $power_pin \
-power
add_global_connection \
-net $ground_net \
-inst_pattern $instance_name \
-pin_pattern $ground_pin \
-ground
}
}
set secondary []
foreach vdd $::env(VDD_NETS) gnd $::env(GND_NETS) {
if { $vdd != $::env(VDD_NET)} {
lappend secondary $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 $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"
}
}
}
set_voltage_domain -name CORE -power $::env(VDD_NET) -ground $::env(GND_NET) \
-secondary_power $secondary
# Assesses whether the design is the core of the chip or not based on the
# value of $::env(DESIGN_IS_CORE) and uses the appropriate stdcell section
if { $::env(DESIGN_IS_CORE) == 1 } {
# Used if the design is the core of the chip
define_pdn_grid \
-name stdcell_grid \
-starts_with POWER \
-voltage_domain CORE \
-pins "$::env(FP_PDN_LOWER_LAYER) $::env(FP_PDN_UPPER_LAYER)"
add_pdn_stripe \
-grid stdcell_grid \
-layer $::env(FP_PDN_LOWER_LAYER) \
-width $::env(FP_PDN_VWIDTH) \
-pitch $::env(FP_PDN_VPITCH) \
-offset $::env(FP_PDN_VOFFSET) \
-spacing $::env(FP_PDN_VSPACING) \
-nets "$::env(PDN_STRIPE)" \
-starts_with POWER -extend_to_core_ring
add_pdn_stripe \
-grid stdcell_grid \
-layer $::env(FP_PDN_UPPER_LAYER) \
-width $::env(FP_PDN_HWIDTH) \
-pitch $::env(FP_PDN_HPITCH) \
-offset $::env(FP_PDN_HOFFSET) \
-spacing $::env(FP_PDN_HSPACING) \
-nets "$::env(PDN_STRIPE)" \
-starts_with POWER -extend_to_core_ring
add_pdn_connect \
-grid stdcell_grid \
-layers "$::env(FP_PDN_LOWER_LAYER) $::env(FP_PDN_UPPER_LAYER)"
} else {
# Used if the design is a macro in the core
define_pdn_grid \
-name stdcell_grid \
-starts_with POWER \
-voltage_domain CORE \
-pins $::env(FP_PDN_LOWER_LAYER)
add_pdn_stripe \
-grid stdcell_grid \
-layer $::env(FP_PDN_LOWER_LAYER) \
-width $::env(FP_PDN_VWIDTH) \
-pitch $::env(FP_PDN_VPITCH) \
-offset $::env(FP_PDN_VOFFSET) \
-starts_with POWER
}
# Adds the standard cell rails if enabled.
if { $::env(FP_PDN_ENABLE_RAILS) == 1 } {
add_pdn_stripe \
-grid stdcell_grid \
-layer $::env(FP_PDN_RAILS_LAYER) \
-width $::env(FP_PDN_RAIL_WIDTH) \
-followpins \
-starts_with POWER
add_pdn_connect \
-grid stdcell_grid \
-layers "$::env(FP_PDN_RAILS_LAYER) $::env(FP_PDN_LOWER_LAYER)"
}
# Adds the core ring if enabled.
if { $::env(FP_PDN_CORE_RING) == 1 } {
add_pdn_ring \
-grid stdcell_grid \
-layers "$::env(FP_PDN_LOWER_LAYER) $::env(FP_PDN_UPPER_LAYER)" \
-widths "$::env(FP_PDN_CORE_RING_VWIDTH) $::env(FP_PDN_CORE_RING_HWIDTH)" \
-spacings "$::env(FP_PDN_CORE_RING_VSPACING) $::env(FP_PDN_CORE_RING_HSPACING)" \
-core_offset "$::env(FP_PDN_CORE_RING_VOFFSET) $::env(FP_PDN_CORE_RING_HOFFSET)"
}
##################################
# Common Macro Power Hook Up
# Power Connect met-4 to met-5
##################################
define_pdn_grid \
-macro \
-name macro_1 \
-instances "u_pll u_intercon u_pinmux u_qspi_master u_tsram0_2kb u_icache_2kb u_dcache_2kb u_uart_i2c_usb_spi u_wb_host u_riscv_top.i_core_top_0 u_riscv_top.i_core_top_1 u_riscv_top.u_connect u_riscv_top.u_intf u_4x8bit_dac u_aes u_fpu u_peri" \
-starts_with POWER \
-halo "$::env(FP_PDN_HORIZONTAL_HALO) $::env(FP_PDN_VERTICAL_HALO)"
add_pdn_connect \
-grid macro_1 \
-layers "$::env(FP_PDN_LOWER_LAYER) $::env(FP_PDN_UPPER_LAYER)"
##################################
# u_rp_North & u_rp_south Power Hook Up
# Power connect met-3 to met-4
##################################
define_pdn_grid \
-macro \
-name macro_2 \
-instances "u_rp_south u_rp_north" \
-starts_with POWER \
-halo "$::env(FP_PDN_HORIZONTAL_HALO) $::env(FP_PDN_VERTICAL_HALO)"
add_pdn_connect -grid macro_2 -layers "met3 met4"
##################################
# u_rp_east Power Hook Up
# Power connect met-3 to met-5
##################################
define_pdn_grid \
-macro \
-name macro_3 \
-instances "u_rp_east u_rp_west" \
-starts_with POWER \
-halo "$::env(FP_PDN_HORIZONTAL_HALO) $::env(FP_PDN_VERTICAL_HALO)"
add_pdn_connect -grid macro_3 -layers "met3 met5"