# 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 -generate sram_* i:clk0 i:csb0 i:web0 \
                           i:wmask0 i:addr0 i:din0 \
                           o:dout0
hierarchy -check -top $vtop
# clk0,csb0,web0,wmask0,addr0,din0,dout0
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"
}
