####################################################################################
#                             POST-INIT PLUG-IN
####################################################################################
#
# This plug-in script is called after design import from the run_init.tcl script.
#
# --------------------------------------------------------------------------------
# Can be used for various floorplan related tasks, like:
#              - Die/core boundary
#              - placement of hard macros/blocks
#              - power domain size and clearence surrounding to it
#              - Placement and routing blockages in the floorplan
#              - IO ring creation
#              - PSO planning
# --------------------------------------------------------------------------------
# Specifically, this example includes tasks related to the LP/CPF foundation flow 
# including power domain modification and power shut-off planning. The examples 
# included here operate based on variables (vars array) defined in the 
# OVERLAY/lp_config.tcl file
#
if {[info exists vars(cpf_file)]} {

# --------------------------------------------------------------------------------
# Modify power domains
# --------------------------------------------------------------------------------
# The 'modify_power_domains' procedure is included with the foundation flows
# to help automate power domain modification.  To enable this, please set the
# appropriate variables in the lp_config.tcl and uncomment the following command
#

#	ff_modify_power_domains
    
# --------------------------------------------------------------------------------
# Power switch insertion
# --------------------------------------------------------------------------------
# The 'add_power_switches' procedure is included with the foundation flows
# to cover common power switch insertion scenarios.  To use, set the appropriate
# variables in the lp_config.tcl file and uncomment the following command.
# --------------------------------------------------------------------------------
# NOTE: This procedure  will NOT COVER THE ALL THE OPTIONS in addPowerSwitch
# For more complicated scenarios, please manually add the addPowerSwitch command
# here with the necessary options.
# --------------------------------------------------------------------------------

#	ff_add_power_switches

}

# Floorplan (from long time ago in a galaxy far, far away)
floorplan -r 1.0 0.60 40 40 40 40 

# Make VDD/VSS power connectors
globalNetConnect VSS -type pgpin -pin gnd -inst * 
globalNetConnect VDD -type pgpin -pin vdd -inst * 
# Not sure I need this
#globalNetConnect VDD –type tiehi
#globalNetConnect VSS –type tielo

# Add Ring
setAddRingMode -ring_target default -extend_over_row 0 -ignore_rows 0 -avoid_short 0 -skip_crossing_trunks none -stacked_via_top_layer met2 -stacked_via_bottom_layer met1 -via_using_exact_crossover_size 1 -orthogonal_only true -skip_via_on_pin {  standardcell } -skip_via_on_wire_shape {  noshape }
addRing -nets {VDD VSS} -type core_rings -follow core -layer {top met1 bottom met1 left met2 right met2} -width {top 14.4 bottom 14.4 left 14.4 right 14.4} -spacing {top 1.8 bottom 1.8 left 1.8 right 1.8} -offset {top 1.8 bottom 1.8 left 1.8 right 1.8} -center 0 -extend_corner {} -threshold 0 -jog_distance 0 -snap_wire_center_to_grid None

####Some settings for power grid:
set vars(layers) "0 1"
# LI1
set vars(1,width) 0.61
set vars(1,space) 4.94
set vars(1,pitch) 11.10
set vars(1,direction) horizontal
set vars(1,bottom_via_layer) 0
set vars(1,offset) -0.1525
# M1
set vars(0,width) 0.61
set vars(0,space) 4.94
set vars(0,pitch) 11.10
set vars(0,direction) horizontal
set vars(0,bottom_via_layer) 0
set vars(0,offset) -0.1525


foreach layer $vars(layers) {
    set sp1 $vars($layer,space)
    set sp2 $vars($layer,space)
    if {$vars($layer,direction)== "vertical"} {
    set start_edge left
    } else {
    set start_edge bottom
    }
    setAddStripeMode -stacked_via_top_layer $layer -stacked_via_bottom_layer $vars($layer,bottom_via_layer) -break_at none -orthogonal_only false
    # add stripe command
        addStripe \
        -layer $layer \
        -width $vars($layer,width) \
        -spacing [list $sp1 $sp2] \
        -set_to_set_distance $vars($layer,pitch) \
        -start_offset [expr $vars($layer,offset)*2] \
        -direction $vars($layer,direction) \
        -start_from $start_edge \
        -nets {VDD VSS}
}

# Connect to power
setSrouteMode -viaConnectToShape { noshape }
sroute -connect { blockPin padPin padRing corePin floatingStripe } -layerChangeRange { met5(5) met1(1) } -blockPinTarget { nearestTarget } -padPinPortConnect { allPort oneGeom } -padPinTarget { nearestTarget } -corePinTarget { firstAfterRowEnd } -floatingStripeTarget { blockring padring ring stripe ringpin blockpin followpin } -allowJogging 1 -crossoverViaLayerRange { met1(1) met5(5) } -nets { VDD VSS } -allowLayerChange 1 -blockPin useLef -targetViaLayerRange { met1(1) met5(5) }

