# 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 test syntheses.

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

# tool setup
source ../../../foundry/syn/dc/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 SOURCES  ###
#######################

set DUT "rv_plic_target"

lappend search_path "../../../ip/prim/rtl/"
set SRC {  "../../../ip/rv_plic/rtl/rv_plic_target.sv" }

# additional defines
set DEFINE ""

# additional parameters
set PARAMS "N_SOURCE=128"

###########################
##   ELABORATE DESIGN    ##
###########################

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

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

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

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

set CLK_PIN clk_i
set RST_PIN rst_ni

# timing constraint in ns
# set timing to 250 MHz
set TCK     4.0
set IN_DEL  1.0
set OUT_DEL 1.0
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]

# set a nonzero critical range to be able to spot the violating paths better
# in the report
# set_critical_range 0.2 ${DUT}

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

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

# preserve hierarchy for reports
#compile_ultra -gate_clock -scan -no_autoungroup > "${REPDIR}/${DUT}_compile.rpt"

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

report_clocks                                 > "${REPDIR}/${DUT}_clocks.rpt"
report_timing -nosplit -slack_lesser_than 0.0 > "${REPDIR}/${DUT}_timing.rpt"
report_area   -hier -nosplit                  > "${REPDIR}/${DUT}_area.rpt"
report_power  -hier -nosplit                  > "${REPDIR}/${DUT}_power.rpt"
report_constraints -all_violators             > "${REPDIR}/${DUT}_constraints.rpt"

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

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

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