caravel/signoff/caravan/caravan.sdc

407 lines
25 KiB
Tcl

### Caravan new Signoff SDC
### Rev 1
### Date: 25/5/2023
# IO 4 mode is either SCK or GPIO (hkspi)
set io_4_mode SCK
puts "\[INFO\]: IO[4] is set as: $io_4_mode"
# IOs mode is either OUT or IN (GPIOs)
set ios_mode OUT
puts "\[INFO\]: GPIOs mode is set as: $ios_mode"
# IO ports to user's project wrapper are assumed to be asynchronous. If they're synchronous to the clock, update the variable IO_SYNC to 1
set ::env(IO_SYNC) 0
## MASTER CLOCKS
set clk_period 25
create_clock -name clk -period $clk_period [get_ports {clock}]
puts "\[INFO\]: System clock period: $clk_period"
create_clock -name hk_serial_clk -period 100 [get_pins {chip_core/housekeeping_alt/serial_clock}]
create_clock -name hk_serial_load -period 1000 [get_pins {chip_core/housekeeping_alt/serial_load}]
set_clock_uncertainty 0.1000 [get_clocks {clk hk_serial_clk hk_serial_load}]
set_propagated_clock [get_clocks {clk hk_serial_clk hk_serial_load}]
set min_clk_tran 1
set max_clk_tran 1.5
puts "\[INFO\]: Clock transition range: $min_clk_tran : $max_clk_tran"
# Add clock transition
set_input_transition -min $min_clk_tran [get_ports {clock}]
set_input_transition -max $max_clk_tran [get_ports {clock}]
if {$io_4_mode == "SCK"} {
# deassert hkspi_disable
set_case_analysis 0 [get_pins {chip_core/housekeeping_alt/_7257_/Q}]
# dessert CSB
set_case_analysis 0 [get_ports {mprj_io[3]} ]
create_clock -name hkspi_clk -period 100 [get_ports {mprj_io[4]} ]
set_clock_uncertainty 0.1000 [get_clocks {hkspi_clk}]
set_propagated_clock [get_clocks {hkspi_clk}]
set_clock_groups \
-name clock_group \
-logically_exclusive \
-group [get_clocks {clk}]\
-group [get_clocks {hk_serial_clk}]\
-group [get_clocks {hk_serial_load}]\
-group [get_clocks {hkspi_clk}]
} elseif {$io_4_mode == "GPIO"} {
# assert hkspi_disable
set_case_analysis 1 [get_pins {chip_core/housekeeping_alt/_7257_/Q}]
set_clock_groups \
-name clock_group \
-logically_exclusive \
-group [get_clocks {clk}]\
-group [get_clocks {hk_serial_clk}]\
-group [get_clocks {hk_serial_load}]\
}
# Add case analysis for clock pad DM[2]==1'b0 & DM[1]==1'b0 & DM[0]==1'b1 to be input
set_case_analysis 0 [get_pins padframe/clock_pad/DM[2]]
set_case_analysis 0 [get_pins padframe/clock_pad/DM[1]]
set_case_analysis 1 [get_pins padframe/clock_pad/DM[0]]
set_case_analysis 0 [get_pins padframe/clock_pad/INP_DIS]
# hk_serial_clk period is x2 core clock
# clock <-> hk_serial_clk/load no paths
# future note: CDC stuff
# clock <-> hkspi_clk no paths with careful methods (clock is off)
# Set system monitoring mux select to zero so that the clock/user_clk monitoring is disabled
set_case_analysis 0 [get_pins chip_core/housekeeping_alt/_4161_/S]
set_case_analysis 0 [get_pins chip_core/housekeeping_alt/_4162_/S]
set input_delay_value 4
set output_delay_value 4
puts "\[INFO\]: Setting input delay to: $input_delay_value"
puts "\[INFO\]: Setting output delay to: $output_delay_value"
set min_in_tran 1
set max_in_tran 4
puts "\[INFO\]: Input transition range: $min_in_tran : $max_in_tran"
# 10 too high --> 4:7
set min_cap 4
set max_cap 7
puts "\[INFO\]: Cap load range: $min_cap : $max_cap"
if {$ios_mode == "IN"} {
# Add case analysis for pads DM[2]==1'b0 & DM[1]==1'b0 & DM[0]==1'b1 to be inputs
set_case_analysis 0 [get_pins padframe/*mprj*/DM[2]]
set_case_analysis 0 [get_pins padframe/*mprj*/DM[1]]
set_case_analysis 1 [get_pins padframe/*mprj*/DM[0]]
set_case_analysis 0 [get_pins padframe/*mprj*/INP_DIS]
# Add input transition
set_input_transition -min $min_in_tran [get_ports {mprj_io[*]}]
set_input_transition -max $max_in_tran [get_ports {mprj_io[*]}]
## INPUT DELAYS
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[0]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[5]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[6]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[7]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[8]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[9]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[10]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[11]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[12]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[13]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[14]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[15]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[16]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[17]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[18]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[19]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[20]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[21]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[22]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[23]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[24]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[25]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[26]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[27]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[28]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[29]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[30]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[31]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[32]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[33]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[34]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[35]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[36]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[37]}]
if {$io_4_mode == "SCK"} {
# Add clock transition
set_input_transition -min $min_clk_tran [get_ports {mprj_io[4]}]
set_input_transition -max $max_clk_tran [get_ports {mprj_io[4]}]
# SDO output
set_case_analysis 1 [get_pins padframe/\mprj_pads.area1_io_pad[1]/DM[2]]
set_case_analysis 1 [get_pins padframe/\mprj_pads.area1_io_pad[1]/DM[1]]
set_case_analysis 0 [get_pins padframe/\mprj_pads.area1_io_pad[1]/DM[0]]
set_case_analysis 0 [get_pins padframe/\mprj_pads.area1_io_pad[1]/OE_N]
set_output_delay $output_delay_value -clock [get_clocks {hkspi_clk}] [get_ports {mprj_io[1]}]
set_load -min $min_cap [get_ports {mprj_io[1]}]
set_load -max $max_cap [get_ports {mprj_io[1]}]
set_input_delay $input_delay_value -clock [get_clocks {hkspi_clk}] [get_ports {mprj_io[2]}]
set_input_delay $input_delay_value -clock [get_clocks {hkspi_clk}] [get_ports {mprj_io[3]}]
if { $::env(IO_SYNC) } {
set_false_path -from [get_ports mprj_io[*]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_out[*]]
set_false_path -from [get_ports mprj_io[*]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_oeb[*]]
set_false_path -from [get_ports mprj_io[0]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[0]]
set_false_path -from [get_ports mprj_io[5]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[5]]
set_false_path -from [get_ports mprj_io[6]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[6]]
set_false_path -from [get_ports mprj_io[7]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[7]]
set_false_path -from [get_ports mprj_io[8]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[8]]
set_false_path -from [get_ports mprj_io[9]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[9]]
set_false_path -from [get_ports mprj_io[10]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[10]]
set_false_path -from [get_ports mprj_io[11]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[11]]
set_false_path -from [get_ports mprj_io[12]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[12]]
set_false_path -from [get_ports mprj_io[13]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[13]]
set_false_path -from [get_ports mprj_io[14]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[14]]
set_false_path -from [get_ports mprj_io[15]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[15]]
set_false_path -from [get_ports mprj_io[16]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[16]]
set_false_path -from [get_ports mprj_io[17]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[17]]
set_false_path -from [get_ports mprj_io[18]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[18]]
set_false_path -from [get_ports mprj_io[19]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[19]]
set_false_path -from [get_ports mprj_io[20]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[20]]
set_false_path -from [get_ports mprj_io[21]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[21]]
set_false_path -from [get_ports mprj_io[22]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[22]]
set_false_path -from [get_ports mprj_io[23]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[23]]
set_false_path -from [get_ports mprj_io[24]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[24]]
set_false_path -from [get_ports mprj_io[25]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[25]]
set_false_path -from [get_ports mprj_io[26]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[26]]
set_false_path -from [get_ports mprj_io[27]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[27]]
set_false_path -from [get_ports mprj_io[28]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[28]]
set_false_path -from [get_ports mprj_io[29]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[29]]
set_false_path -from [get_ports mprj_io[30]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[30]]
set_false_path -from [get_ports mprj_io[31]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[31]]
set_false_path -from [get_ports mprj_io[32]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[32]]
set_false_path -from [get_ports mprj_io[33]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[33]]
set_false_path -from [get_ports mprj_io[34]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[34]]
set_false_path -from [get_ports mprj_io[35]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[35]]
set_false_path -from [get_ports mprj_io[36]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[36]]
set_false_path -from [get_ports mprj_io[37]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[37]]
} else {
set_false_path -from [get_ports mprj_io[0]]
set_false_path -from [get_ports mprj_io[5]]
set_false_path -from [get_ports mprj_io[6]]
set_false_path -from [get_ports mprj_io[7]]
set_false_path -from [get_ports mprj_io[8]]
set_false_path -from [get_ports mprj_io[9]]
set_false_path -from [get_ports mprj_io[10]]
set_false_path -from [get_ports mprj_io[11]]
set_false_path -from [get_ports mprj_io[12]]
set_false_path -from [get_ports mprj_io[13]]
set_false_path -from [get_ports mprj_io[14]]
set_false_path -from [get_ports mprj_io[15]]
set_false_path -from [get_ports mprj_io[16]]
set_false_path -from [get_ports mprj_io[17]]
set_false_path -from [get_ports mprj_io[18]]
set_false_path -from [get_ports mprj_io[19]]
set_false_path -from [get_ports mprj_io[20]]
set_false_path -from [get_ports mprj_io[21]]
set_false_path -from [get_ports mprj_io[22]]
set_false_path -from [get_ports mprj_io[23]]
set_false_path -from [get_ports mprj_io[24]]
set_false_path -from [get_ports mprj_io[25]]
set_false_path -from [get_ports mprj_io[26]]
set_false_path -from [get_ports mprj_io[27]]
set_false_path -from [get_ports mprj_io[28]]
set_false_path -from [get_ports mprj_io[29]]
set_false_path -from [get_ports mprj_io[30]]
set_false_path -from [get_ports mprj_io[31]]
set_false_path -from [get_ports mprj_io[32]]
set_false_path -from [get_ports mprj_io[33]]
set_false_path -from [get_ports mprj_io[34]]
set_false_path -from [get_ports mprj_io[35]]
set_false_path -from [get_ports mprj_io[36]]
set_false_path -from [get_ports mprj_io[37]]
}
} elseif {$io_4_mode == "GPIO"} {
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[1]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[2]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[3]}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[4]}]
if { $::env(IO_SYNC) } {
set_false_path -from [get_ports mprj_io[*]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_out[*]]
set_false_path -from [get_ports mprj_io[*]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_oeb[*]]
set_false_path -from [get_ports mprj_io[*]] -through [get_pins chip_core/housekeeping_alt/mgmt_gpio_in[*]]
} else {
# set_false_path -from [get_ports mprj_io[*]]
}
}
} elseif {$ios_mode == "OUT"} {
# Add case analysis for pads DM[2]==1'b1 & DM[1]==1'b1 & DM[0]==1'b0 to be outputs
set_case_analysis 1 [get_pins padframe/*mprj*/DM[2]]
set_case_analysis 1 [get_pins padframe/*mprj*/DM[1]]
set_case_analysis 0 [get_pins padframe/*mprj*/DM[0]]
set_case_analysis 0 [get_pins padframe/*mprj*/OE_N]
# add loads for output ports (pads)
set_load -min $min_cap [get_ports {mprj_io[*]}]
set_load -max $max_cap [get_ports {mprj_io[*]}]
## OUTPUT DELAYS
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[0]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[5]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[6]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[7]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[8]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[9]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[10]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[11]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[12]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[13]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[14]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[15]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[16]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[17]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[18]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[19]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[20]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[21]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[22]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[23]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[24]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[25]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[26]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[27]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[28]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[29]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[30]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[31]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[32]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[33]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[34]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[35]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[36]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[37]}]
if {$io_4_mode == "SCK"} {
# SCK, CSB, SDI are inputs
set_case_analysis 0 [get_pins padframe/\mprj_pads.area1_io_pad[4]/DM[2]]
set_case_analysis 0 [get_pins padframe/\mprj_pads.area1_io_pad[4]/DM[1]]
set_case_analysis 1 [get_pins padframe/\mprj_pads.area1_io_pad[4]/DM[0]]
set_case_analysis 0 [get_pins padframe/\mprj_pads.area1_io_pad[4]/INP_DIS]
set_case_analysis 0 [get_pins padframe/\mprj_pads.area1_io_pad[3]/DM[2]]
set_case_analysis 0 [get_pins padframe/\mprj_pads.area1_io_pad[3]/DM[1]]
set_case_analysis 1 [get_pins padframe/\mprj_pads.area1_io_pad[3]/DM[0]]
set_case_analysis 0 [get_pins padframe/\mprj_pads.area1_io_pad[3]/INP_DIS]
set_case_analysis 0 [get_pins padframe/\mprj_pads.area1_io_pad[2]/DM[2]]
set_case_analysis 0 [get_pins padframe/\mprj_pads.area1_io_pad[2]/DM[1]]
set_case_analysis 1 [get_pins padframe/\mprj_pads.area1_io_pad[2]/DM[0]]
set_case_analysis 0 [get_pins padframe/\mprj_pads.area1_io_pad[2]/INP_DIS]
set_output_delay $output_delay_value -clock [get_clocks {hkspi_clk}] [get_ports {mprj_io[1]}]
set_input_delay $input_delay_value -clock [get_clocks {hkspi_clk}] [get_ports {mprj_io[2]}]
set_input_delay $input_delay_value -clock [get_clocks {hkspi_clk}] [get_ports {mprj_io[3]}]
set_input_transition -min $min_in_tran [get_ports {mprj_io[2] mprj_io[2]}]
set_input_transition -max $max_in_tran [get_ports {mprj_io[3] mprj_io[3]}]
if { !($::env(IO_SYNC)) } {
set_false_path -to [get_ports mprj_io[0]]
set_false_path -to [get_ports mprj_io[5]]
set_false_path -to [get_ports mprj_io[6]]
set_false_path -to [get_ports mprj_io[7]]
set_false_path -to [get_ports mprj_io[8]]
set_false_path -to [get_ports mprj_io[9]]
set_false_path -to [get_ports mprj_io[10]]
set_false_path -to [get_ports mprj_io[11]]
set_false_path -to [get_ports mprj_io[12]]
set_false_path -to [get_ports mprj_io[13]]
set_false_path -to [get_ports mprj_io[14]]
set_false_path -to [get_ports mprj_io[15]]
set_false_path -to [get_ports mprj_io[16]]
set_false_path -to [get_ports mprj_io[17]]
set_false_path -to [get_ports mprj_io[18]]
set_false_path -to [get_ports mprj_io[19]]
set_false_path -to [get_ports mprj_io[20]]
set_false_path -to [get_ports mprj_io[21]]
set_false_path -to [get_ports mprj_io[22]]
set_false_path -to [get_ports mprj_io[23]]
set_false_path -to [get_ports mprj_io[24]]
set_false_path -to [get_ports mprj_io[25]]
set_false_path -to [get_ports mprj_io[26]]
set_false_path -to [get_ports mprj_io[27]]
set_false_path -to [get_ports mprj_io[28]]
set_false_path -to [get_ports mprj_io[29]]
set_false_path -to [get_ports mprj_io[30]]
set_false_path -to [get_ports mprj_io[31]]
set_false_path -to [get_ports mprj_io[32]]
set_false_path -to [get_ports mprj_io[33]]
set_false_path -to [get_ports mprj_io[34]]
set_false_path -to [get_ports mprj_io[35]]
set_false_path -to [get_ports mprj_io[36]]
set_false_path -to [get_ports mprj_io[37]]
}
} elseif {$io_4_mode == "GPIO"} {
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[1]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[2]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[3]}]
set_output_delay $output_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {mprj_io[4]}]
if { !($::env(IO_SYNC)) } {
set_false_path -to [get_ports mprj_io[*]]
}
}
}
# flash_* are output except for io1
set_case_analysis 1 [get_pins padframe/flash_*pad/DM[2]]
set_case_analysis 1 [get_pins padframe/flash_*pad/DM[1]]
set_case_analysis 0 [get_pins padframe/flash_*pad/DM[0]]
set_case_analysis 0 [get_pins padframe/flash_*pad/INP_DIS]
set_case_analysis 0 [get_pins padframe/flash_io1_pad/DM[2]]
set_case_analysis 0 [get_pins padframe/flash_io1_pad/DM[1]]
set_case_analysis 1 [get_pins padframe/flash_io1_pad/DM[0]]
set_case_analysis 0 [get_pins padframe/flash_io1_pad/OE_N]
#flash interface input transition from the datasheet
set flash_min_tran 4
set flash_max_tran 6
puts "\[INFO\]: Flash interface transition range: $flash_min_tran : $flash_max_tran"
set_input_transition -min $flash_min_tran [get_ports {flash_io1}]
set_input_transition -max $flash_max_tran [get_ports {flash_io1}]
set flash_min_cap 6
set flash_max_cap 8
puts "\[INFO\]: Flash interface cap load range: $flash_min_cap : $flash_max_cap"
set_load -min $min_cap [get_ports {flash_csb flash_clk flash_io0}]
set_load -max $max_cap [get_ports {flash_csb flash_clk flash_io0}]
set flash_in_delay 4
set flash_out_delay 4
puts "\[INFO\]: Flash interface delay: input $flash_in_delay output $flash_out_delay"
set_output_delay $flash_out_delay -clock [get_clocks {clk}] -add_delay [get_ports {flash_csb}]
set_multicycle_path -setup 2 -to [get_ports {flash_csb}]
set_multicycle_path -hold 1 -to [get_ports {flash_csb}]
set_output_delay $flash_out_delay -clock [get_clocks {clk}] -add_delay [get_ports {flash_clk}]
set_output_delay $flash_out_delay -clock [get_clocks {clk}] -add_delay [get_ports {flash_io0}]
set_input_delay $flash_in_delay -clock [get_clocks {clk}] -add_delay [get_ports {flash_io1}]
# gpio_pad is set as input pad
set_case_analysis 0 [get_pins padframe/gpio_pad/DM[2]]
set_case_analysis 0 [get_pins padframe/gpio_pad/DM[1]]
set_case_analysis 1 [get_pins padframe/gpio_pad/DM[0]]
set_case_analysis 0 [get_pins padframe/gpio_pad/INP_DIS]
set_input_transition -min $min_in_tran [get_ports {gpio}]
set_input_transition -max $max_in_tran [get_ports {gpio}]
set_input_delay $input_delay_value -clock [get_clocks {clk}] -add_delay [get_ports {gpio}]
# Maximum Fanout soft constraint
set_max_fanout 18 [current_design]
# synthesis max fanout is 18
## FALSE PATHS (ASYNCHRONOUS I/Os)
set_false_path -from [get_ports resetb]
set_false_path -from [get_ports gpio]
# check ocv table (not provided)
set derate 0.0375
puts "\[INFO\]: Setting derate factor to: [expr $derate * 100] %"
set_timing_derate -early [expr 1-$derate]
set_timing_derate -late [expr 1+$derate]