[syn] Revise constraints

Move mio_* to IO clock domain give 50% in/out delay.

Add IO, AON clocks into the constraint. Aiming 24MHz and 300kHz

Revised clock definition to find correct clock port for SPI Device clk.

Signed-off-by: Eunchan Kim <eunchan@opentitan.org>
diff --git a/hw/syn/data/dc.hjson b/hw/syn/data/dc.hjson
index 35c65ce..c9bcf40 100644
--- a/hw/syn/data/dc.hjson
+++ b/hw/syn/data/dc.hjson
@@ -14,7 +14,7 @@
             {"SV_FLIST"  : "{sv_flist}"}]
 
   // Tool invocation
-  build_cmd:  "dc_shell-xg-t "
+  build_cmd:  "{job_prefix} dc_shell-xg-t "
   build_opts: ["-f run-syn.tcl"]
 
   // DC-specific results parsing script that is called after running synthesis
diff --git a/hw/syn/tools/dc/run-syn.tcl b/hw/syn/tools/dc/run-syn.tcl
index ff75db8..53201e3 100644
--- a/hw/syn/tools/dc/run-syn.tcl
+++ b/hw/syn/tools/dc/run-syn.tcl
@@ -11,28 +11,48 @@
 # tool setup
 source setup.tcl
 
+# not exit remained in command line
+set RUN_INTERACTIVE $::env(INTERACTIVE)
+
 # path to directory containing the source list file
 set SV_FLIST $::env(SV_FLIST)
 set BUILD_DIR $::env(BUILD_DIR)
 
+# just compile the "core" toplevel at the moment
+# might want to switch to top_earlgrey_asic later on (with pads)
+set DUT $::env(DUT)
+
 # paths
 set WORKLIB  "${BUILD_DIR}/WORK"
 set REPDIR   "${BUILD_DIR}/REPORTS"
 set DDCDIR   "${BUILD_DIR}/DDC"
+set RESULTDIR "${BUILD_DIR}/results"
 set VLOGDIR  "${BUILD_DIR}/NETLISTS"
 
-exec mkdir -p ${REPDIR} ${DDCDIR} ${VLOGDIR} ${WORKLIB}
+exec mkdir -p ${REPDIR} ${DDCDIR} ${VLOGDIR} ${WORKLIB} ${RESULTDIR}
 
 # define work lib path
 define_design_lib WORK -path $WORKLIB
 
 #######################
+## CONFIGURATIONS   ###
+#######################
+
+# Define the verification setup file for Formality
+set_svf ${RESULTDIR}/${DUT}.svf
+
+# Setup SAIF Name Mapping Database
+saif_map -start
+
+###The following variable helps verification when there are differences between DC and FM while inferring logical hierarchies
+set_app_var hdlin_enable_hier_map true
+
+
+
+#######################
 ##  DESIGN SOURCES  ###
 #######################
 
-# just compile the "core" toplevel at the moment
-# might want to switch to top_earlgrey_asic later on (with pads)
-set DUT $::env(DUT)
 
 # this PRIM_DEFAULT_IMPL selects the appropriate technology by defining
 # PRIM_DEFAULT_IMPL=prim_pkg::Impl<tech identifier>
@@ -55,6 +75,8 @@
 link                                                      > "${REPDIR}/link.rpt"
 check_design                                              > "${REPDIR}/check.rpt"
 
+set_verification_top
+
 write_file -format ddc -hierarchy -output "${DDCDIR}/elab.ddc"
 write_file -format verilog -hierarchy -output "${DDCDIR}/elab.v"
 
@@ -96,6 +118,9 @@
 sh echo ${NAND2_GATE_EQUIVALENT} > "${REPDIR}/gate_equiv.rpt"
 
 report_clocks                                 > "${REPDIR}/clocks.rpt"
+report_clock -groups                          > "${REPDIR}/clock.groups.rpt"
+report_path_group                             > "${REPDIR}/path_group.rpt"
+report_clock_gating -multi_stage -nosplit     > "${REPDIR}/clock_gating.rpt"
 report_timing -nosplit -slack_lesser_than 0.0 > "${REPDIR}/timing.rpt"
 report_area   -hier -nosplit                  > "${REPDIR}/area.rpt"
 report_power  -hier -nosplit                  > "${REPDIR}/power.rpt"
@@ -113,6 +138,10 @@
 write_file -format ddc     -hierarchy -output "${DDCDIR}/mapped.ddc"
 write_file -format verilog -hierarchy -output "${VLOGDIR}/mapped.v"
 
+# Write final SDC
+write_sdc -nosplit ${RESULTDIR}/${DUT}.final.sdc
+# If SAIF is used, write out SAIF name mapping file for PrimeTime-PX
+saif_map -type ptpx -write_map ${RESULTDIR}/${DUT}.mapped.SAIF.namemap
 # ##############################
 # ##  INCREMENTAL FLATTENING  ##
 # ##############################
@@ -136,4 +165,7 @@
 # write_file -format ddc     -hierarchy -output "${DDCDIR}/flat.ddc"
 # write_file -format verilog -hierarchy -output "${VLOGDIR}/flat.v"
 
-exit
+if { ![info exists RUN_INTERACTIVE] } {
+    exit
+}
+
diff --git a/hw/top_earlgrey/syn/constraints.sdc b/hw/top_earlgrey/syn/constraints.sdc
index 4d6bdea..8a682c0 100644
--- a/hw/top_earlgrey/syn/constraints.sdc
+++ b/hw/top_earlgrey/syn/constraints.sdc
@@ -13,6 +13,27 @@
 # there are no pads instantiated in the netlist (yet)
 
 #####################
+# DIO pin mapping   #
+#####################
+set PORT_SPI_DEVICE_SCK 14
+set PORT_SPI_DEVICE_CSB 13
+set PORT_SPI_DEVICE_MOSI 12
+set PORT_SPI_DEVICE_MISO 11
+
+set PORT_UART_RX 10
+set PORT_UART_TX 9
+
+set PORT_USBDEV_SENSE 8
+set PORT_USBDEV_SE0 7
+set PORT_USBDEV_DP_PULLUP 6
+set PORT_USBDEV_DN_PULLUP 5
+set PORT_USBDEV_TX_MODE_SE 4
+set PORT_USBDEV_SUSPEND 3
+set PORT_USBDEV_D 2
+set PORT_USBDEV_DP 1
+set PORT_USBDEV_DN 0
+
+#####################
 # main clock        #
 #####################
 set MAIN_CLK_PIN clk_i
@@ -22,47 +43,85 @@
 set_ideal_network ${MAIN_CLK_PIN}
 set_ideal_network ${MAIN_RST_PIN}
 
-create_clock ${MAIN_CLK_PIN} -period ${MAIN_TCK}
-set_clock_uncertainty ${SETUP_CLOCK_UNCERTAINTY}  ${MAIN_CLK_PIN}
+create_clock -name MAIN_CLK -period ${MAIN_TCK} [get_ports ${MAIN_CLK_PIN}]
+set_clock_uncertainty ${SETUP_CLOCK_UNCERTAINTY} [get_clocks MAIN_CLK]
+
+# TODO: generated clock
+# TODO: clock gating setup/hold
+
 
 set IN_DEL    5.5
 set OUT_DEL   5.5
 
-set_input_delay ${IN_DEL} [get_ports mio_in_i*]          -clock ${MAIN_CLK_PIN}
-set_input_delay ${IN_DEL} [get_ports scanmode_i]         -clock ${MAIN_CLK_PIN}
-set_input_delay ${IN_DEL} [get_ports dio_uart_rx_i]      -clock ${MAIN_CLK_PIN}
-
-set_output_delay ${OUT_DEL} [get_ports mio_out_o*]       -clock ${MAIN_CLK_PIN}
-set_output_delay ${OUT_DEL} [get_ports mio_oe_o*]        -clock ${MAIN_CLK_PIN}
-set_output_delay ${OUT_DEL} [get_ports dio_uart_tx_o]    -clock ${MAIN_CLK_PIN}
-set_output_delay ${OUT_DEL} [get_ports dio_uart_tx_en_o] -clock ${MAIN_CLK_PIN}
+# Doesn't need
+#set_input_delay ${IN_DEL} [get_ports scanmode_i] -clock MAIN_CLK
 
 #####################
 # USB clock         #
 #####################
-set USB_CLK_PIN clk_usb_48mhz_i
+set USB_CLK_PIN clk_usb_i
 # 50MHz
 set USB_TCK 20.0
 set_ideal_network ${USB_CLK_PIN}
 
-create_clock ${USB_CLK_PIN} -period ${USB_TCK}
-set_clock_uncertainty ${SETUP_CLOCK_UNCERTAINTY} ${USB_CLK_PIN}
+create_clock -name USB_CLK -period ${USB_TCK} [get_ports ${USB_CLK_PIN}]
+set_clock_uncertainty ${SETUP_CLOCK_UNCERTAINTY} [get_clocks USB_CLK]
 
 set IN_DEL    17.0
 set OUT_DEL   17.0
 
-set_input_delay ${IN_DEL} [get_ports dio_usbdev_sense_i]       -clock ${USB_CLK_PIN}
-set_input_delay ${IN_DEL} [get_ports dio_usbdev_dp_i]          -clock ${USB_CLK_PIN}
-set_input_delay ${IN_DEL} [get_ports dio_usbdev_dn_i]          -clock ${USB_CLK_PIN}
+set_input_delay ${IN_DEL} [get_ports dio_in_i[$PORT_USBDEV_SENSE]]       -clock USB_CLK
+set_input_delay ${IN_DEL} [get_ports dio_in_i[$PORT_USBDEV_DP]]          -clock USB_CLK
+set_input_delay ${IN_DEL} [get_ports dio_in_i[$PORT_USBDEV_DN]]          -clock USB_CLK
 
-set_output_delay ${OUT_DEL} [get_ports dio_usbdev_dp_pullup_o]    -clock ${USB_CLK_PIN}
-set_output_delay ${OUT_DEL} [get_ports dio_usbdev_dp_pullup_en_o] -clock ${USB_CLK_PIN}
-set_output_delay ${OUT_DEL} [get_ports dio_usbdev_dn_pullup_o]    -clock ${USB_CLK_PIN}
-set_output_delay ${OUT_DEL} [get_ports dio_usbdev_dn_pullup_en_o] -clock ${USB_CLK_PIN}
-set_output_delay ${OUT_DEL} [get_ports dio_usbdev_dp_o]           -clock ${USB_CLK_PIN}
-set_output_delay ${OUT_DEL} [get_ports dio_usbdev_dp_en_o]        -clock ${USB_CLK_PIN}
-set_output_delay ${OUT_DEL} [get_ports dio_usbdev_dn_o]           -clock ${USB_CLK_PIN}
-set_output_delay ${OUT_DEL} [get_ports dio_usbdev_dn_en_o]        -clock ${USB_CLK_PIN}
+set_output_delay ${OUT_DEL} [get_ports dio_out_o[$PORT_USBDEV_DP_PULLUP]] -clock USB_CLK
+set_output_delay ${OUT_DEL} [get_ports dio_oe_o[$PORT_USBDEV_DP_PULLUP]]  -clock USB_CLK
+set_output_delay ${OUT_DEL} [get_ports dio_out_o[$PORT_USBDEV_DN_PULLUP]] -clock USB_CLK
+set_output_delay ${OUT_DEL} [get_ports dio_oe_o[$PORT_USBDEV_DN_PULLUP]]  -clock USB_CLK
+set_output_delay ${OUT_DEL} [get_ports dio_out_o[$PORT_USBDEV_DP]]        -clock USB_CLK
+set_output_delay ${OUT_DEL} [get_ports dio_oe_o[$PORT_USBDEV_DP]]         -clock USB_CLK
+set_output_delay ${OUT_DEL} [get_ports dio_out_o[$PORT_USBDEV_DN]]        -clock USB_CLK
+set_output_delay ${OUT_DEL} [get_ports dio_oe_o[$PORT_USBDEV_DN]]         -clock USB_CLK
+
+#####################
+# IO clk (24MHz)    #
+#####################
+set IO_CLK_PIN clk_io_i
+set IO_TCK 40.0
+set_ideal_network ${IO_CLK_PIN}
+
+create_clock -name IO_CLK -period ${IO_TCK} [get_ports ${IO_CLK_PIN}] 
+set_clock_uncertainty ${SETUP_CLOCK_UNCERTAINTY} [get_clocks IO_CLK]
+
+# TODO: generated clock
+# TODO: clock gating setup/hold
+
+set IN_DEL  20.0
+set OUT_DEL 20.0
+
+set_input_delay ${IN_DEL} [get_ports mio_in_i*]          -clock IO_CLK
+
+set_output_delay ${OUT_DEL} [get_ports mio_out_o*]       -clock IO_CLK
+set_output_delay ${OUT_DEL} [get_ports mio_oe_o*]        -clock IO_CLK
+
+# UART RX
+set_input_delay ${IN_DEL} [get_ports dio_in_i[$PORT_UART_RX]]      -clock IO_CLK
+
+# UART TX
+set_output_delay ${OUT_DEL} [get_ports dio_out_o[$PORT_UART_TX]]    -clock IO_CLK
+set_output_delay ${OUT_DEL} [get_ports dio_oe_o[$PORT_UART_TX]]     -clock IO_CLK
+
+#####################
+# AON clk (300kHz)  #
+#####################
+set AON_CLK_PIN clk_aon_i
+set AON_TCK 3333.0
+set_ideal_network ${AON_CLK_PIN}
+
+create_clock -name AON_CLK -perio ${AON_TCK} [get_ports ${AON_CLK_PIN}]
+set_clock_uncertainty ${SETUP_CLOCK_UNCERTAINTY} [get_clocks AON_CLK]
+
+# use same IO IN/OUT delay
 
 #####################
 # JTAG clock        #
@@ -74,49 +133,53 @@
 set_ideal_network ${JTAG_CLK_PIN}
 set_ideal_network ${JTAG_RST_PIN}
 
-create_clock ${JTAG_CLK_PIN} -period ${JTAG_TCK}
-set_clock_uncertainty ${SETUP_CLOCK_UNCERTAINTY} ${JTAG_CLK_PIN}
+create_clock -name JTAG_CLK -period ${JTAG_TCK} [get_ports ${JTAG_CLK_PIN}]
+set_clock_uncertainty ${SETUP_CLOCK_UNCERTAINTY} [get_clocks JTAG_CLK]
 
 set IN_DEL    10.0
 set OUT_DEL   10.0
 
-set_input_delay ${IN_DEL} [get_ports jtag_tms_i]  -clock ${JTAG_CLK_PIN}
-set_input_delay ${IN_DEL} [get_ports jtag_td_i]   -clock ${JTAG_CLK_PIN}
+set_input_delay ${IN_DEL} [get_ports jtag_tms_i]  -clock JTAG_CLK
+set_input_delay ${IN_DEL} [get_ports jtag_tdi_i]   -clock JTAG_CLK
 
-set_output_delay ${OUT_DEL} [get_ports jtag_td_o] -clock ${JTAG_CLK_PIN}
+set_output_delay ${OUT_DEL} [get_ports jtag_tdo_o] -clock JTAG_CLK
 
 #####################
 # SPI clock         #
 #####################
-set SPI_CLK_PIN dio_spi_device_sck_i
+set SPI_CLK_PIN dio_in_i[$PORT_SPI_DEVICE_SCK]
 # 62.5MHz
 set SPI_TCK 16.0
 set_ideal_network ${SPI_CLK_PIN}
 
-create_clock ${SPI_CLK_PIN} -period ${SPI_TCK}
-set_clock_uncertainty ${SETUP_CLOCK_UNCERTAINTY} ${SPI_CLK_PIN}
+create_clock -name SPID_CLK  -period ${SPI_TCK} [get_ports ${SPI_CLK_PIN}]
+set_clock_uncertainty ${SETUP_CLOCK_UNCERTAINTY} [get_clocks SPID_CLK]
+
+## TODO: Create generated clock for negedge SPID_CLK. Then make them clock group
 
 set IN_DEL    6.0
 set OUT_DEL   6.0
 
-set_input_delay ${IN_DEL} [get_ports dio_spi_device_csb_i]       -clock ${SPI_CLK_PIN}
-set_input_delay ${IN_DEL} [get_ports dio_spi_device_mosi_i]      -clock ${SPI_CLK_PIN}
+set_input_delay ${IN_DEL} [get_ports dio_in_i[$PORT_SPI_DEVICE_CSB]]     -clock SPID_CLK
+set_input_delay ${IN_DEL} [get_ports dio_in_i[$PORT_SPI_DEVICE_MOSI]]    -clock SPID_CLK
 
-set_output_delay ${OUT_DEL} [get_ports dio_spi_device_miso_o]    -clock ${SPI_CLK_PIN}
-set_output_delay ${OUT_DEL} [get_ports dio_spi_device_miso_en_o] -clock ${SPI_CLK_PIN}
+set_output_delay ${OUT_DEL} [get_ports dio_out_o[$PORT_SPI_DEVICE_MISO]] -clock SPID_CLK
+set_output_delay ${OUT_DEL} [get_ports dio_oe_o[$PORT_SPI_DEVICE_MISO]]  -clock SPID_CLK
 
 #####################
 # CDC               #
 #####################
 
 # this may need some refinement (and max delay / skew needs to be constrained)
-set_clock_groups -name group1 -async -group ${MAIN_CLK_PIN} \
-                                     -group ${JTAG_CLK_PIN} \
-                                     -group ${USB_CLK_PIN}  \
-                                     -group ${SPI_CLK_PIN}
+set_clock_groups -name group1 -async -group [get_clocks MAIN_CLK] \
+                                     -group [get_clocks JTAG_CLK] \
+                                     -group [get_clocks USB_CLK ] \
+                                     -group [get_clocks SPID_CLK] \
+                                     -group [get_clocks IO_CLK  ] \
+                                     -group [get_clocks AON_CLK ]
 
 # loopback path can be considered to be a false path
-set_false_path -from dio_uart_rx_i -to dio_uart_tx_o
+set_false_path -from dio_in_i[$PORT_UART_RX] -to dio_out_o[$PORT_UART_TX]
 
 #####################
 # I/O drive/load    #