# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
#
# Simple tcl script for DC to do some wire-load-model-based sweep syntheses.

#####################
##  PREPARE FLOW   ##
#####################

# tool setup
set CONFIG_PATH "../../../foundry/syn/dc/"
source ${CONFIG_PATH}/setup.tcl

# paths
set WORKLIB  "WORK"
set REPDIR   "REPORTS"
set DDCDIR   "DDC"
set VLOGDIR  "NETLISTS"

exec mkdir -p ${REPDIR} ${DDCDIR} ${VLOGDIR} ${WORKLIB}

# define work lib path
define_design_lib WORK -path $WORKLIB

######################
##   DESIGN SETUP  ##
######################

set DUT "prim_prince"
# set DUT "prim_present"

lappend search_path "../../../ip/prim/rtl/"
set SRC {  "../../../ip/prim/rtl/prim_assert.sv" \
           "../../../ip/prim/rtl/prim_cipher_pkg.sv" \
           "../../../ip/prim/rtl/prim_present.sv" \
           "../../../ip/prim/rtl/prim_prince.sv" \
         }


# additional defines
set DEFINE ""

# additional parameters
set PARAMS ""

set CLK_PIN clk_i
set RST_PIN rst_ni

set TCK_SWEEP { 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0 }
set IN_DEL  0.0
set OUT_DEL 0.0

###########################
##         SWEEP         ##
###########################

foreach TCK $TCK_SWEEP {
	###########################
	##   ELABORATE DESIGN    ##
	###########################

	# delete previous designs.
	remove_design -designs
	sh rm -rf $WORKLIB/*

	analyze -define ${DEFINE} -format sv ${SRC}   > "${REPDIR}/${DUT}_${TCK}_analyze.rpt"
	elaborate  ${DUT} -parameters ${PARAMS}       > "${REPDIR}/${DUT}_${TCK}_elab.rpt"
	link                                          > "${REPDIR}/${DUT}_${TCK}_link.rpt"
	check_design                                  > "${REPDIR}/${DUT}_${TCK}_check.rpt"

	write_file -format ddc -hierarchy -output "${DDCDIR}/${DUT}_${TCK}_elab.ddc"
	write_file -format verilog -hierarchy -output "${DDCDIR}/${DUT}_${TCK}_elab.v"

	###########################
	##   APPLY CONSTRAINTS   ##
	###########################

	# timing constraint in ns
	# set timing to 250 MHz
	set DELAY   ${TCK}

	create_clock ${CLK_PIN} -period ${TCK}

	set_ideal_network ${CLK_PIN}
	set_ideal_network ${RST_PIN}

	set_max_delay ${DELAY} -from [all_inputs] -to [all_outputs]
	set_input_delay ${IN_DEL} [remove_from_collection [all_inputs] {${CLK_PIN}}] -clock ${CLK_PIN}
	set_output_delay ${OUT_DEL}  [all_outputs] -clock ${CLK_PIN}

	set_driving_cell  -no_design_rule -lib_cell ${DRIVING_CELL} -pin X [all_inputs]
	set_load [load_of ${LOAD_LIB}/${LOAD_CELL}/A] [all_outputs]

	######################
	##    MAP DESIGN    ##
	######################

	compile_ultra -gate_clock -scan  > "${REPDIR}/${DUT}_${TCK}_compile.rpt"

	#################
	##   REPORTS   ##
	#################

	report_timing -nosplit               > "${REPDIR}/${DUT}_${TCK}_timing.rpt"
	report_area -hier -nosplit           > "${REPDIR}/${DUT}_${TCK}_area.rpt"
	report_constraints -all_violators    > "${REPDIR}/${DUT}_${TCK}_constraints.rpt"

	report_timing -nosplit -nworst 1000 -input -net -trans -cap > "${REPDIR}/${DUT}_${TCK}_timing_long.rpt"

	#################
	##   NETLIST   ##
	#################

	change_names -rules verilog -hierarchy
	write_file -format ddc     -hierarchy -output "${DDCDIR}/${DUT}_${TCK}_mapped.ddc"
	write_file -format verilog -hierarchy -output "${VLOGDIR}/${DUT}_${TCK}_mapped.v"
}
