# Copyright (c) Efabless Corporation. All rights reserved.
# See LICENSE file in the project root for full license information.
# inputs expected as env vars
set strategy $::env(SYNTH_STRATEGY)
#set opt $::env(SYNTH_OPT)
set buffering $::env(SYNTH_BUFFERING)

yosys -import

set vtop $::env(DESIGN_NAME)
#set sdc_file $::env(SDC_FILE)
set sclib $::env(LIB_SYNTH)
# ns expected (in sdc as well)
set clock_period [expr {$::env(CLOCK_PERIOD)*1000}]

set driver  $::env(SYNTH_DRIVING_CELL)
set cload   $::env(SYNTH_CAP_LOAD)
# input pin cap of IN_3VX8
set max_FO $::env(SYNTH_MAX_FANOUT)
if {![info exist ::env(SYNTH_MAX_TRAN)]} {
	set ::env(SYNTH_MAX_TRAN) [expr {0.1*$clock_period}]
} else {
	set ::env(SYNTH_MAX_TRAN) [expr {$::env(SYNTH_MAX_TRAN) * 1000}]
}
set max_Tran $::env(SYNTH_MAX_TRAN)


# Mapping parameters
set A_factor  0.00
set B_factor  0.88
set F_factor  0.00

# Don't change these unless you know what you are doing
set stat_ext    ".stat.rpt"
set chk_ext    ".chk.rpt"
set gl_ext      ".gl.v"
set constr_ext  ".$clock_period.constr"
set timing_ext  ".timing.txt"
set abc_ext     ".abc"


# get old sdc, add library specific stuff for abc scripts
set sdc_file $::env(yosys_tmp_file_tag).sdc
set outfile [open ${sdc_file} w]
  #puts $outfile $sdc_data
  puts $outfile "set_driving_cell ${driver}"
  puts $outfile "set_load ${cload}"
close $outfile


# ABC Scrips
set abc_rs_K    "resub,-K,"
set abc_rs      "resub"
set abc_rsz     "resub,-z"
set abc_rw_K    "rewrite,-K,"
set abc_rw      "rewrite"
set abc_rwz     "rewrite,-z"
set abc_rf      "refactor"
set abc_rfz     "refactor,-z"
set abc_b       "balance"

set abc_resyn2        "${abc_b}; ${abc_rw}; ${abc_rf}; ${abc_b}; ${abc_rw}; ${abc_rwz}; ${abc_b}; ${abc_rfz}; ${abc_rwz}; ${abc_b}"
#set abc_share         "strash; multi,-m; ${abc_resyn2}"

#set abc_resyn2a       "${abc_b};${abc_rw};${abc_b};${abc_rw};${abc_rwz};${abc_b};${abc_rwz};${abc_b}"
#set abc_resyn3        "balance;resub;resub,-K,6;balance;resub,-z;resub,-z,-K,6;balance;resub,-z,-K,5;balance"
#set abc_resyn2rs      "${abc_b};${abc_rs_K},6;${abc_rw};${abc_rs_K},6,-N,2;${abc_rf};${abc_rs_K},8;${abc_rw};${abc_rs_K},10;${abc_rwz};${abc_rs_K},10,-N,2;${abc_b},${abc_rs_K},12;${abc_rfz};${abc_rs_K},12,-N,2;${abc_rwz};${abc_b}"
#set compress2rs       "${abc_b},-l; ${abc_rs_K},6,-l; ${abc_rw},-l; ${abc_rs_K},6,-N,2,-l; ${abc_rf},-l; ${abc_rs_K},8,-l; ${abc_b}, -l; ${abc_rs_K},8,-N,2,-l; ${abc_rw},-l; ${abc_rs_K},10,-l; ${abc_rsz}, -l; ${abc_rs_K},10, -N, 2, -l; ${abc_b}, -l; ${abc_rs_K}, 12, -l; ${abc_rfz}, -l; ${abc_rs_K},12,-N,2,-l; ${abc_rwz}, -l; ${abc_b}, -l"

#set ms_opt            "dch; ${abc_resyn2};dch;${abc_resyn2};dch;${abc_resyn2};dch,-f;${abc_resyn2rs};"

#set ms_opt_           "strash; dch,-f; ${abc_resyn2};retime,-o,{D};"
#set ms_opt2           "${ms_opt};${ms_opt}"
#set ms_opt4           "${ms_opt2};${ms_opt2}"
#set ms_opt8           "${ms_opt4};${ms_opt4}"

#set abc_map_old         "map,-p,-B,0.88,-A,0.0,-M,1,{D},-F,$F_factor,-f"
#set abc_old_opt         "strash; dc2,-b,-l,-p;ifraig"
#set abc_new_opt         "strash;dch,-p;ifraig"
#set abc_retime_area     "retime,-D,{D},-M,5"
#set abc_retime_dly      "retime,-D,{D},-M,6"

#set abc_fine_tune       "buffer,-N,${max_FO},-S,${max_Tran};upsize,{D};dnsize,{D}; "
#set abc_map_new       	"amap,-m,-Q,0.2,-F,50,-A,50,-C,1000"
#set abc_map_new_area    "amap,-m,-Q,0.0,-F,20,-A,20,-C,1000, ${abc_retime_area}, ${abc_fine_tune}"
#set abc_map_new_dly     "amap,-i,-Q,1.0,-F,5,-A,5,-C,1000,${abc_retime_dly}, ${abc_fine_tune}"
#set abc_map_new_std     "amap,-m;${abc_retime_dly};${abc_fine_tune}"


set map_old_cnt			    "map,-p,-a,-B,0.2,-A,0.9,-M,0"
set map_old_dly			    "map,-p,-B,0.2,-A,0.9,-M,0"
set abc_retime_area   	"retime,-D,{D},-M,5"
set abc_retime_dly    	"retime,-D,{D},-M,6"
set abc_map_new_area  	"amap,-m,-Q,0.1,-F,20,-A,20,-C,5000"

if {$buffering==1} {
  set abc_fine_tune		    "buffer,-N,${max_FO},-S,${max_Tran};upsize,{D};dnsize,{D}"
} else {
  set abc_fine_tune       "upsize,{D};dnsize,{D}"
}

set scpt_0        "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_area};scleanup;${map_old_cnt};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m"
set scpt_1        "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_dly};scleanup;${map_old_dly};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m"
set scpt_2        "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_area};scleanup;${abc_map_new_area};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m"
set scpt_3        "+read_constr,${sdc_file};strash; ifraig; scorr; dc2; dretime; strash; &get -n; &dch -f; &nf {D}; &put; buffer,-N,${max_FO}; upsize {D}; dnsize {D}; stime -p;print_stats -m"


set scripts(0) $scpt_0
set scripts(1) $scpt_1
set scripts(2) $scpt_2
set scripts(3) $scpt_3

set scriptname(0) "scpt_0"
set scriptname(1) "scpt_1"
set scriptname(2) "scpt_2"
set scriptname(3) "scpt_3"


for { set i 0 } { $i < [llength $::env(VERILOG_FILES)] } { incr i } {
  read_verilog [lindex $::env(VERILOG_FILES) $i]
}

hierarchy -check -top $vtop
synth  -top $vtop -flatten
share -aggressive
opt
opt_clean -purge

tee -o "$::env(yosys_report_file_tag)_pre.stat" stat

dfflibmap -liberty $sclib
tee -o "$::env(yosys_report_file_tag)_dff.stat" stat

if {$strategy==100} {
  design -save myDesign

  for { set index 0 }  { $index < [array size scriptname] }  { incr index } {
      puts "ABC: WireLoad : $scriptname($index)"
      design -load myDesign

        abc -D $clock_period \
        \-constr "$sdc_file" \
        -liberty $sclib  \
        -script $scripts($index)

      hilomap -hicell {*}$::env(SYNTH_TIEHI_PORT) -locell {*}$::env(SYNTH_TIELO_PORT)

      setundef -zero
      # get rid of the assignments that make verilog2def fail
      splitnets
      opt_clean -purge
      insbuf -buf {*}$::env(SYNTH_MIN_BUF_PORT)

      tee -o "$::env(yosys_report_file_tag)_$index$chk_ext" check
      tee -o "$::env(yosys_report_file_tag)$index$stat_ext" stat -top $vtop -liberty $sclib
      write_verilog -noattr -noexpr -nohex -nodec "$::env(yosys_result_file_tag).v"
      #tee -o "$vtop-finl.stat" stat
      design -reset
  }
} else {

    puts "ABC: WireLoad : S_$strategy"

        abc -D $clock_period \
          -constr "$sdc_file" \
          -liberty $sclib  \
          -script $scripts($strategy) \
          -showtmp;

    hilomap -hicell {*}$::env(SYNTH_TIEHI_PORT) -locell {*}$::env(SYNTH_TIELO_PORT)

    setundef -zero
    # get rid of the assignments that make verilog2def fail
    splitnets
    opt_clean -purge
    insbuf -buf {*}$::env(SYNTH_MIN_BUF_PORT)

    tee -o "$::env(yosys_report_file_tag)_$strategy$chk_ext" check
    tee -o "$::env(yosys_report_file_tag)_$strategy$stat_ext" stat -top $vtop -liberty $sclib
    write_verilog -noattr -noexpr -nohex -nodec "$::env(yosys_result_file_tag).v"
}
