# This script was written and developed by ABKGroup students at UCSD. However, the underlying commands and reports are copyrighted by Cadence. 
# We thank Cadence for granting permission to share our research to help promote and foster the next generation of innovators.
source lib_setup.tcl
source design_setup.tcl

if {[info exist ::env(PHY_SYNTH)] && $::env(PHY_SYNTH) == 1} {
    read_mmmc mmmc_iSpatial_setup.tcl
}

# set the output directories
set OUTPUTS_PATH  syn_output
set REPORTS_PATH  syn_rpt
set HANDOFF_PATH  syn_handoff

if {![file exists ${OUTPUTS_PATH}]} {
  file mkdir ${OUTPUTS_PATH}
}

if {![file exists ${REPORTS_PATH}]} {
  file mkdir ${REPORTS_PATH}
}

if {![file exists ${HANDOFF_PATH}]} {
  file mkdir ${HANDOFF_PATH}
}
#
# set threads
set_db max_cpus_per_server 16
set_db super_thread_servers "localhost"
#
set list_lib "$libworst"


if {[info exist ::env(PHY_SYNTH)] && $::env(PHY_SYNTH) == 1} {
    set_db invs_temp_dir ${OUTPUTS_PATH}/invs_tmp_dir
    read_physical -lefs $lefs
}

# Target library
set link_library $list_lib
set target_library $list_lib

# set pathi
set_db hdl_flatten_complex_port true
set_db hdl_record_naming_style  %s_%s
set_db auto_ungroup none


if {![info exist ::env(PHY_SYNTH)] || $::env(PHY_SYNTH) == 0} {
    set_db library $list_lib
}

#################################################
# Load Design and Initialize
#################################################
set_db init_hdl_search_path $rtldir 

read_hdl -f rtl_list.tcl

#source rtl_list.tcl
#
#foreach rtl_file $rtl_all {
#    read_hdl -language sv $rtl_file
#}

elaborate $DESIGN
time_info Elaboration

if {![info exist ::env(PHY_SYNTH)] || $::env(PHY_SYNTH) == 0} {
    #read_sdc $sdc
    source $sdc
}

init_design

check_design -unresolved

check_timing_intent
# reports the physical layout estimation report from lef and QRC tech file
report_ple > ${REPORTS_PATH}/ple.rpt 

###############################################
# Read DEF
###############################################
if {[info exist ::env(PHY_SYNTH)] && $::env(PHY_SYNTH) == 1} {
    read_def $floorplan_def
    check_floorplan -detailed
}

# keep hierarchy during synthesis
set_db auto_ungroup none

if {[info exist ::env(PHY_SYNTH)] && $::env(PHY_SYNTH) == 1} {
    syn_generic -physical
} else {
    syn_generic
    write_hdl -generic > ${HANDOFF_PATH}/${DESIGN}_generic.v
}
time_info GENERIC

# generate a summary for the current stage of synthesis
write_reports -directory ${REPORTS_PATH} -tag generic
write_db  ${OUTPUTS_PATH}/${DESIGN}_generic.db

 
if {[info exist ::env(PHY_SYNTH)] && $::env(PHY_SYNTH) == 1} {
    syn_map -physical
} else {
    syn_map
}
time_info MAPPED

# generate a summary for the current stage of synthesis
write_reports -directory ${REPORTS_PATH} -tag map
write_db  ${OUTPUTS_PATH}/${DESIGN}_map.db

if {[info exist ::env(PHY_SYNTH)] && $::env(PHY_SYNTH) == 1} {
    syn_opt -spatial
} else {
    syn_opt
}

time_info OPT 
write_db ${OUTPUTS_PATH}/${DESIGN}_opt.db

##############################################################################
# Write reports
##############################################################################

# summarizes the information, warnings and errors
report_messages > ${REPORTS_PATH}/${DESIGN}_messages.rpt

# generate PPA reports
report_gates > ${REPORTS_PATH}/${DESIGN}_gates.rpt
report_power > ${REPORTS_PATH}/${DESIGN}_power.rpt
report_area > ${REPORTS_PATH}/${DESIGN}_power.rpt
write_reports -directory ${REPORTS_PATH} -tag final 


if {[info exist ::env(PHY_SYNTH)] && $::env(PHY_SYNTH) == 1} {
    write_design -innovus -base_name ${HANDOFF_PATH}/${DESIGN}
} else {
    write_sdc >${HANDOFF_PATH}/${DESIGN}.sdc
    write_hdl > ${HANDOFF_PATH}/${DESIGN}.v
}

exit