Update flow and allow netlist generation

This commit is contained in:
AurelienUoU 2019-05-17 17:00:38 -06:00
parent df8bb0db1a
commit 17ad905b14
3 changed files with 206 additions and 61 deletions

View File

@ -36,5 +36,4 @@ if ["$result" = ""]; then
else else
echo "Verification succeed" echo "Verification succeed"
cd - cd -
exit 0
fi fi

View File

@ -10,7 +10,6 @@ rpt_file="$PWD/csv_rpts/fpga_spice/${task_name}.csv"
task_file="$PWD/vpr_fpga_spice_task_lists/${task_name}" task_file="$PWD/vpr_fpga_spice_task_lists/${task_name}"
verilog_path="${PWD}/regression_MCNC" verilog_path="${PWD}/regression_MCNC"
modelsim_ini_path="/uusoc/facility/cad_tools/Mentor/modelsim10.7b/modeltech/modelsim.ini"
# FPGA-SPICE # FPGA-SPICE
rm -rf ${pwd_path}/results rm -rf ${pwd_path}/results
@ -18,10 +17,11 @@ cd ${pwd_path}/scripts
# SRAM FPGA # SRAM FPGA
# TT case # TT case
perl fpga_flow.pl -conf ${config_file} -benchmark ${bench_txt} -rpt ${rpt_file} -N 10 -K 6 -ace_d 0.5 -power -remove_designs -multi_thread 1 -vpr_fpga_x2p_rename_illegal_port -vpr_fpga_verilog -vpr_fpga_verilog_dir $verilog_path -vpr_fpga_bitstream_generator -vpr_fpga_verilog_print_autocheck_top_testbench -vpr_fpga_verilog_print_modelsim_autodeck $modelsim_ini_path -vpr_fpga_verilog_include_timing -vpr_fpga_verilog_include_signal_init -vpr_fpga_verilog_formal_verification_top_netlist -fix_route_chan_width perl fpga_flow.pl -conf ${config_file} -benchmark ${bench_txt} -rpt ${rpt_file} -N 10 -K 6 -ace_d 0.5 -power -remove_designs -multi_thread 1 -vpr_fpga_x2p_rename_illegal_port -vpr_fpga_verilog -vpr_fpga_verilog_dir $verilog_path -vpr_fpga_bitstream_generator -vpr_fpga_verilog_print_autocheck_top_testbench -vpr_fpga_verilog_include_timing -vpr_fpga_verilog_include_signal_init -vpr_fpga_verilog_formal_verification_top_netlist -fix_route_chan_width-vpr_fpga_verilog_include_icarus_simulator
rm -rf ${pwd_path}/results rm -rf ${pwd_path}/results
rm -rf $verilog_path rm -rf $verilog_path
cd ${pwd_path} cd ${pwd_path}
echo "Netlists successfully generated"
exit 0 exit 0

View File

@ -34,6 +34,7 @@ my $rpt_ptr = \%rpt_h;
my @benchmark_names; my @benchmark_names;
my %benchmarks; my %benchmarks;
my $benchmarks_ptr = \%benchmarks; my $benchmarks_ptr = \%benchmarks;
my $verilog_benchmark;
# Supported flows # Supported flows
my @supported_flows = ("standard", my @supported_flows = ("standard",
@ -154,11 +155,12 @@ sub print_usage()
print " \t-vpr_route_breadthfirst : use the breadth-first routing algorithm of VPR.\n"; print " \t-vpr_route_breadthfirst : use the breadth-first routing algorithm of VPR.\n";
print " \t-min_route_chan_width <float> : turn on routing with <float>* min_route_chan_width.\n"; print " \t-min_route_chan_width <float> : turn on routing with <float>* min_route_chan_width.\n";
print " \t-fix_route_chan_width : turn on routing with a fixed route_chan_width, defined in benchmark configuration file.\n"; print " \t-fix_route_chan_width : turn on routing with a fixed route_chan_width, defined in benchmark configuration file.\n";
print " [ VPR - FPGA-X2P Extension ] \n";
print " \t-vpr_fpga_x2p_rename_illegal_port : turn on renaming illegal ports option of VPR FPGA SPICE\n";
print " \t-vpr_fpga_x2p_signal_density_weight <float>: specify the option signal_density_weight of VPR FPGA SPICE\n";
print " \t-vpr_fpga_x2p_sim_window_size <float>: specify the option sim_window_size of VPR FPGA SPICE\n";
print " [ VPR - FPGA-SPICE Extension ] \n"; print " [ VPR - FPGA-SPICE Extension ] \n";
print " \t-vpr_fpga_spice <task_file> : turn on SPICE netlists print-out in VPR, specify a task file\n"; print " \t-vpr_fpga_spice <task_file> : turn on SPICE netlists print-out in VPR, specify a task file\n";
print " \t-vpr_fpga_spice_rename_illegal_port : turn on renaming illegal ports option of VPR FPGA SPICE\n";
print " \t-vpr_fpga_spice_signal_density_weight <float>: specify the option signal_density_weight of VPR FPGA SPICE\n";
print " \t-vpr_fpga_spice_sim_window_size <float>: specify the option sim_window_size of VPR FPGA SPICE\n";
print " \t-vpr_fpga_spice_sim_mt_num <int>: specify the option sim_mt_num of VPR FPGA SPICE\n"; print " \t-vpr_fpga_spice_sim_mt_num <int>: specify the option sim_mt_num of VPR FPGA SPICE\n";
print " \t-vpr_fpga_spice_print_component_tb : print component-level testbenches in VPR FPGA SPICE\n"; print " \t-vpr_fpga_spice_print_component_tb : print component-level testbenches in VPR FPGA SPICE\n";
print " \t-vpr_fpga_spice_print_grid_tb : print Grid-level testbenches in VPR FPGA SPICE\n"; print " \t-vpr_fpga_spice_print_grid_tb : print Grid-level testbenches in VPR FPGA SPICE\n";
@ -168,19 +170,41 @@ sub print_usage()
print " \t-vpr_fpga_spice_testbench_load_extraction_off : turn off testbench_load_extraction in VPR FPGA SPICE\n"; print " \t-vpr_fpga_spice_testbench_load_extraction_off : turn off testbench_load_extraction in VPR FPGA SPICE\n";
print " [ VPR - FPGA-Verilog Extension ] \n"; print " [ VPR - FPGA-Verilog Extension ] \n";
print " \t-vpr_fpga_verilog : turn on Verilog Generator of VPR FPGA SPICE\n"; print " \t-vpr_fpga_verilog : turn on Verilog Generator of VPR FPGA SPICE\n";
print " \t-vpr_fpga_verilog_dir <verilog_path>: provide the path where generated verilog files will be written\n";
print " \t-vpr_fpga_verilog_include_timing : turn on printing delay specification in Verilog files\n";
print " \t-vpr_fpga_verilog_include_signal_init : turn on printing signal initialization in Verilog files\n";
print " \t-vpr_fpga_verilog_print_autocheck_top_testbench: turn on printing autochecked top-level testbench for Verilog Generator of VPR FPGA SPICE\n";
print " \t-vpr_fpga_verilog_formal_verification_top_netlist : turn on printing formal top Verilog files\n";
print " \t-vpr_fpga_verilog_include_icarus_simulator : Add syntax and definition required to use Icarus Verilog simulator\n";
print " \t-vpr_fpga_verilog_print_user_defined_template : \n";
print " \t-vpr_fpga_verilog_print_report_timing_tcl : Generate tcl script useful for timing report generation\n";
print " \t-vpr_fpga_verilog_report_timing_rpt_path <path_to_generate_reports> : Specify path for report timing\n";
print " \t-vpr_fpga_verilog_print_sdc_pnr : Generate sdc file to constraint Hardware P&R\n";
print " \t-vpr_fpga_verilog_print_sdc_analysis : Generate sdc file to do STA\n";
print " \t-vpr_fpga_verilog_print_top_tb : turn on printing top-level testbench for Verilog Generator of VPR FPGA SPICE\n";
print " \t-vpr_fpga_verilog_print_input_blif_tb : turn on printing testbench for input blif file in Verilog Generator of VPR FPGA SPICE\n";
print " \t-vpr_fpga_verilog_print_modelsim_autodeck <modelsim.ini_path>: turn on printing modelsim simulation script\n";
print " [ VPR - FPGA-Bitstream Extension ] \n";
print " \t-vpr_fpga_bitstream_generator: turn on FPGA-SPICE bitstream generator\n";
exit(1); exit(1);
return 1; return 1;
} }
sub spot_option($ $) { sub spot_option($ $)
{
my ($start,$target) = @_; my ($start,$target) = @_;
my ($arg_no,$flag) = (-1,"unfound"); my ($arg_no,$flag) = (-1,"unfound");
for (my $iarg = $start; $iarg < $#ARGV+1; $iarg++) { for (my $iarg = $start; $iarg < $#ARGV+1; $iarg++)
if ($ARGV[$iarg] eq $target) { {
if ("found" eq $flag) { if ($ARGV[$iarg] eq $target)
{
if ("found" eq $flag)
{
print "Error: Repeated Arguments!(IndexA: $arg_no,IndexB: $iarg)\n"; print "Error: Repeated Arguments!(IndexA: $arg_no,IndexB: $iarg)\n";
&print_usage(); &print_usage();
} else { }
else
{
$flag = "found"; $flag = "found";
$arg_no = $iarg; $arg_no = $iarg;
} }
@ -195,35 +219,49 @@ sub spot_option($ $) {
# 1. Option Name # 1. Option Name
# 2. Whether Option with value. if yes, choose "on" # 2. Whether Option with value. if yes, choose "on"
# 3. Whether Option is mandatory. If yes, choose "on" # 3. Whether Option is mandatory. If yes, choose "on"
sub read_opt_into_hash($ $ $) { sub read_opt_into_hash($ $ $)
{
my ($opt_name,$opt_with_val,$mandatory) = @_; my ($opt_name,$opt_with_val,$mandatory) = @_;
# Check the -$opt_name # Check the -$opt_name
my ($opt_fact) = ("-".$opt_name); my ($opt_fact) = ("-".$opt_name);
my ($cur_arg) = (0); my ($cur_arg) = (0);
my ($argfd) = (&spot_option($cur_arg,"$opt_fact")); my ($argfd) = (&spot_option($cur_arg,"$opt_fact"));
if ($opt_with_val eq "on") { if ($opt_with_val eq "on")
if (-1 != $argfd) { {
if ($ARGV[$argfd+1] =~ m/^-/) { if (-1 != $argfd)
{
if ($ARGV[$argfd+1] =~ m/^-/)
{
print "The next argument cannot start with '-'!\n"; print "The next argument cannot start with '-'!\n";
print "it implies an option!\n"; print "it implies an option!\n";
} else { }
else
{
$opt_ptr->{"$opt_name\_val"} = $ARGV[$argfd+1]; $opt_ptr->{"$opt_name\_val"} = $ARGV[$argfd+1];
$opt_ptr->{"$opt_name"} = "on"; $opt_ptr->{"$opt_name"} = "on";
} }
} else { }
else
{
$opt_ptr->{"$opt_name"} = "off"; $opt_ptr->{"$opt_name"} = "off";
if ($mandatory eq "on") { if ($mandatory eq "on")
{
print "Mandatory option: $opt_fact is missing!\n"; print "Mandatory option: $opt_fact is missing!\n";
&print_usage(); &print_usage();
} }
} }
} else { }
if (-1 != $argfd) { else
{
if (-1 != $argfd)
{
$opt_ptr->{"$opt_name"} = "on"; $opt_ptr->{"$opt_name"} = "on";
} }
else { else
{
$opt_ptr->{"$opt_name"} = "off"; $opt_ptr->{"$opt_name"} = "off";
if ($mandatory eq "on") { if ($mandatory eq "on")
{
print "Mandatory option: $opt_fact is missing!\n"; print "Mandatory option: $opt_fact is missing!\n";
&print_usage(); &print_usage();
} }
@ -233,9 +271,11 @@ sub read_opt_into_hash($ $ $) {
} }
# Read options # Read options
sub opts_read() { sub opts_read()
{
# if no arguments detected, print the usage. # if no arguments detected, print the usage.
if (-1 == $#ARGV) { if (-1 == $#ARGV)
{
print "Error : No input arguments!\n"; print "Error : No input arguments!\n";
print "Help desk:\n"; print "Help desk:\n";
&print_usage(); &print_usage();
@ -249,16 +289,19 @@ sub opts_read() {
my $argfd; my $argfd;
# Check help fist # Check help fist
$argfd = &spot_option($cur_arg,"-help"); $argfd = &spot_option($cur_arg,"-help");
if (-1 != $argfd) { if (-1 != $argfd)
{
print "Help desk:\n"; print "Help desk:\n";
&print_usage(); &print_usage();
} }
# Then Check the debug with highest priority # Then Check the debug with highest priority
$argfd = &spot_option($cur_arg,"-debug"); $argfd = &spot_option($cur_arg,"-debug");
if (-1 != $argfd) { if (-1 != $argfd)
{
$opt_ptr->{"debug"} = "on"; $opt_ptr->{"debug"} = "on";
} }
else { else
{
$opt_ptr->{"debug"} = "off"; $opt_ptr->{"debug"} = "off";
} }
# Check mandatory options # Check mandatory options
@ -297,9 +340,9 @@ sub opts_read() {
# FPGA-SPICE options # FPGA-SPICE options
# Read Opt into Hash(opt_ptr) : "opt_name","with_val","mandatory" # Read Opt into Hash(opt_ptr) : "opt_name","with_val","mandatory"
&read_opt_into_hash("vpr_fpga_spice","on","off"); &read_opt_into_hash("vpr_fpga_spice","on","off");
&read_opt_into_hash("vpr_fpga_spice_rename_illegal_port","off","off"); &read_opt_into_hash("vpr_fpga_x2p_rename_illegal_port","off","off");
&read_opt_into_hash("vpr_fpga_spice_signal_density_weight","on","off"); &read_opt_into_hash("vpr_fpga_x2p_signal_density_weight","on","off");
&read_opt_into_hash("vpr_fpga_spice_sim_window_size","on","off"); &read_opt_into_hash("vpr_fpga_x2p_sim_window_size","on","off");
&read_opt_into_hash("vpr_fpga_spice_sim_mt_num","on","off"); &read_opt_into_hash("vpr_fpga_spice_sim_mt_num","on","off");
&read_opt_into_hash("vpr_fpga_spice_print_component_tb","off","off"); &read_opt_into_hash("vpr_fpga_spice_print_component_tb","off","off");
&read_opt_into_hash("vpr_fpga_spice_print_grid_tb","off","off"); &read_opt_into_hash("vpr_fpga_spice_print_grid_tb","off","off");
@ -308,6 +351,22 @@ sub opts_read() {
&read_opt_into_hash("vpr_fpga_spice_parasitic_net_estimation_off","off","off"); &read_opt_into_hash("vpr_fpga_spice_parasitic_net_estimation_off","off","off");
&read_opt_into_hash("vpr_fpga_spice_testbench_load_extraction_off","off","off"); &read_opt_into_hash("vpr_fpga_spice_testbench_load_extraction_off","off","off");
&read_opt_into_hash("vpr_fpga_verilog","off","off"); &read_opt_into_hash("vpr_fpga_verilog","off","off");
&read_opt_into_hash("vpr_fpga_verilog_print_top_tb","off","off");
&read_opt_into_hash("vpr_fpga_verilog_print_input_blif_tb","off","off");
&read_opt_into_hash("vpr_fpga_bitstream_generator","off","off");
# AA add for update
&read_opt_into_hash("vpr_fpga_verilog_print_autocheck_top_testbench","off","off");
&read_opt_into_hash("vpr_fpga_verilog_dir","on","off");
&read_opt_into_hash("vpr_fpga_verilog_print_modelsim_autodeck","on","off");
&read_opt_into_hash("vpr_fpga_verilog_include_timing","off","off");
&read_opt_into_hash("vpr_fpga_verilog_include_signal_init","off","off");
&read_opt_into_hash("vpr_fpga_verilog_formal_verification_top_netlist","off","off");
&read_opt_into_hash("vpr_fpga_verilog_include_icarus_simulator","off","off");
&read_opt_into_hash("vpr_fpga_verilog_print_report_timing_tcl","off","off");
&read_opt_into_hash("vpr_fpga_verilog_report_timing_rpt_path","on","off");
&read_opt_into_hash("vpr_fpga_verilog_print_sdc_pnr","off","off");
&read_opt_into_hash("vpr_fpga_verilog_print_sdc_analysis","off","off");
&read_opt_into_hash("vpr_fpga_verilog_print_user_defined_template","off","off");
&print_opts(); &print_opts();
@ -315,12 +374,12 @@ sub opts_read() {
} }
# List the options # List the options
sub print_opts() { sub print_opts()
{
print "List your options\n"; print "List your options\n";
while(my ($key,$value) = each(%opt_h)) { while(my ($key,$value) = each(%opt_h))
print "$key : $value\n"; {print "$key : $value\n";}
}
return 1; return 1;
} }
@ -530,6 +589,48 @@ sub run_abc_libmap($ $ $)
chdir $cwd; chdir $cwd;
} }
# Rewrite the verilog after optimization
sub run_rewrite_verilog($ $ $ $ $) {
my ($blif, $path, $benchmark, $bm, $log) = @_;
my ($new_verilog) = "$path/$benchmark".".v";
my ($cmd_log) = ($log);
$cmd_log =~ s/\.log$/rewrite_verilog\.ys/;
# Get Yosys path
my ($yosys_dir,$yosys_name) = &split_prog_path($conf_ptr->{dir_path}->{yosys_path}->{val});
print "Entering $yosys_dir\n";
chdir $yosys_dir;
my ($lut_num) = $opt_ptr->{K_val};
# Create yosys synthesize script
my ($YOSYS_CMD_FH) = (FileHandle->new);
if ($YOSYS_CMD_FH->open("> $cmd_log")) {
print "INFO: auto generating cmds for Yosys ($cmd_log) ...\n";
} else {
die "ERROR: fail to auto generating cmds for Yosys ($cmd_log) ...\n";
}
# Output the standard format (refer to VTR_flow script)
print $YOSYS_CMD_FH "# Yosys rewriting verilog script for $bm\n";
print $YOSYS_CMD_FH "read_blif $blif\n";
print $YOSYS_CMD_FH "write_verilog $new_verilog\n";
close($YOSYS_CMD_FH);
#
# Create a local copy for the commands
system("/bin/tcsh -cx './$yosys_name $cmd_log > $log'");
if (!(-e $new_verilog)) {
die "ERROR: Yosys fail at rewriting benchmark $bm.\n";
}
print "Leaving $yosys_dir\n";
chdir $cwd;
return ($new_verilog);
}
# Run yosys synthesis with ABC LUT mapping # Run yosys synthesis with ABC LUT mapping
sub run_yosys_fpgamap($ $ $ $) { sub run_yosys_fpgamap($ $ $ $) {
my ($bm, $bm_path, $blif_out, $log) = @_; my ($bm, $bm_path, $blif_out, $log) = @_;
@ -593,7 +694,6 @@ sub run_yosys_fpgamap($ $ $ $) {
chdir $cwd; chdir $cwd;
} }
# Run ABC by FPGA-oriented synthesis # Run ABC by FPGA-oriented synthesis
sub run_abc_fpgamap($ $ $) sub run_abc_fpgamap($ $ $)
{ {
@ -926,7 +1026,6 @@ sub extract_vpr_power_esti($ $ $ $)
if ($line =~ m/$tmp\s*([0-9E\-+.]+)/i) { if ($line =~ m/$tmp\s*([0-9E\-+.]+)/i) {
$rpt_h{$tag}->{$bm}->{$opt_ptr->{N_val}}->{$type}->{power}->{$tmpkw} = $1; $rpt_h{$tag}->{$bm}->{$opt_ptr->{N_val}}->{$type}->{power}->{$tmpkw} = $1;
my @tempdata = split /\./,$rpt_ptr->{$tag}->{$bm}->{$opt_ptr->{N_val}}->{$type}->{power}->{$tmpkw}; my @tempdata = split /\./,$rpt_ptr->{$tag}->{$bm}->{$opt_ptr->{N_val}}->{$type}->{power}->{$tmpkw};
#print "$tmpkw\n";
$rpt_h{$tag}->{$bm}->{$opt_ptr->{N_val}}->{$type}->{power}->{$tmpkw} = join('.',$tempdata[0],$tempdata[1]); $rpt_h{$tag}->{$bm}->{$opt_ptr->{N_val}}->{$type}->{power}->{$tmpkw} = join('.',$tempdata[0],$tempdata[1]);
$rpt_h{$tag}->{$bm}->{$opt_ptr->{N_val}}->{$type}->{power}->{$tmpkw} =~ s/0$//; $rpt_h{$tag}->{$bm}->{$opt_ptr->{N_val}}->{$type}->{power}->{$tmpkw} =~ s/0$//;
} }
@ -1121,10 +1220,8 @@ sub run_std_vpr($ $ $ $ $ $ $ $ $)
{ {
my ($blif,$bm,$arch,$net,$place,$route,$fix_chan_width,$log,$act_file) = @_; my ($blif,$bm,$arch,$net,$place,$route,$fix_chan_width,$log,$act_file) = @_;
my ($vpr_dir,$vpr_name) = &split_prog_path($conf_ptr->{dir_path}->{vpr_path}->{val}); my ($vpr_dir,$vpr_name) = &split_prog_path($conf_ptr->{dir_path}->{vpr_path}->{val});
print "Entering $vpr_dir\n";
chdir $vpr_dir; chdir $vpr_dir;
my ($power_opts); my ($power_opts);
if ("on" eq $opt_ptr->{power}) { if ("on" eq $opt_ptr->{power}) {
$power_opts = "--power --activity_file $act_file --tech_properties $conf_ptr->{flow_conf}->{power_tech_xml}->{val}"; $power_opts = "--power --activity_file $act_file --tech_properties $conf_ptr->{flow_conf}->{power_tech_xml}->{val}";
@ -1146,11 +1243,11 @@ sub run_std_vpr($ $ $ $ $ $ $ $ $)
if (("on" eq $opt_ptr->{power})&&("on" eq $opt_ptr->{vpr_fpga_spice})) { if (("on" eq $opt_ptr->{power})&&("on" eq $opt_ptr->{vpr_fpga_spice})) {
$vpr_spice_opts = "--fpga_spice"; $vpr_spice_opts = "--fpga_spice";
if ("on" eq $opt_ptr->{vpr_fpga_spice_signal_density_weight}) { if ("on" eq $opt_ptr->{vpr_fpga_x2p_signal_density_weight}) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_spice_signal_density_weight $opt_ptr->{vpr_fpga_spice_signal_density_weight_val}"; $vpr_spice_opts = $vpr_spice_opts." --fpga_x2p_signal_density_weight $opt_ptr->{vpr_fpga_x2p_signal_density_weight_val}";
} }
if ("on" eq $opt_ptr->{vpr_fpga_spice_sim_window_size}) { if ("on" eq $opt_ptr->{vpr_fpga_x2p_sim_window_size}) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_spice_sim_window_size $opt_ptr->{vpr_fpga_spice_sim_window_size_val}"; $vpr_spice_opts = $vpr_spice_opts." --fpga_x2p_sim_window_size $opt_ptr->{vpr_fpga_x2p_sim_window_size_val}";
} }
if ("on" eq $opt_ptr->{vpr_fpga_spice_sim_mt_num}) { if ("on" eq $opt_ptr->{vpr_fpga_spice_sim_mt_num}) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_spice_sim_mt_num $opt_ptr->{vpr_fpga_spice_sim_mt_num_val}"; $vpr_spice_opts = $vpr_spice_opts." --fpga_spice_sim_mt_num $opt_ptr->{vpr_fpga_spice_sim_mt_num_val}";
@ -1184,12 +1281,64 @@ sub run_std_vpr($ $ $ $ $ $ $ $ $)
# FPGA Verilog options # FPGA Verilog options
if (("on" eq $opt_ptr->{power})&&("on" eq $opt_ptr->{vpr_fpga_verilog})) { if (("on" eq $opt_ptr->{power})&&("on" eq $opt_ptr->{vpr_fpga_verilog})) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_verilog"; $vpr_spice_opts = $vpr_spice_opts." --fpga_verilog";
if ("on" eq $opt_ptr->{vpr_fpga_verilog_dir}) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_verilog_dir $opt_ptr->{vpr_fpga_verilog_dir_val}";
}
if ("on" eq $opt_ptr->{vpr_fpga_verilog_print_top_tb}) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_verilog_print_top_testbench";
}
if ("on" eq $opt_ptr->{vpr_fpga_verilog_print_input_blif_tb}) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_verilog_print_input_blif_testbench";
}
if ("on" eq $opt_ptr->{vpr_fpga_verilog_print_autocheck_top_testbench}) {
if($verilog_benchmark eq undef){
$vpr_spice_opts = $vpr_spice_opts." --fpga_verilog_print_autocheck_top_testbench $conf_ptr->{dir_path}->{benchmark_dir}->{val}"."/$bm/$bm.v";
} else {
$vpr_spice_opts = $vpr_spice_opts." --fpga_verilog_print_autocheck_top_testbench $verilog_benchmark";
}
}
if ("on" eq $opt_ptr->{vpr_fpga_verilog_include_timing}) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_verilog_include_timing";
}
if ("on" eq $opt_ptr->{vpr_fpga_verilog_include_signal_init}) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_verilog_include_signal_init";
}
if ("on" eq $opt_ptr->{vpr_fpga_verilog_formal_verification_top_netlist}) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_verilog_print_formal_verification_top_netlist";
}
if ("on" eq $opt_ptr->{vpr_fpga_verilog_print_modelsim_autodeck}) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_verilog_print_modelsim_autodeck $opt_ptr->{vpr_fpga_verilog_print_modelsim_autodeck_val}";
}
if ("on" eq $opt_ptr->{vpr_fpga_verilog_include_icarus_simulator}) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_verilog_include_icarus_simulator";
}
if ("on" eq $opt_ptr->{vpr_fpga_verilog_print_report_timing_tcl}) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_verilog_print_report_timing_tcl";
}
if ("on" eq $opt_ptr->{vpr_fpga_verilog_report_timing_rpt_path}) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_verilog_report_timing_rpt_path $opt_ptr->{vpr_fpga_verilog_report_timing_rpt_path_val}";
}
if ("on" eq $opt_ptr->{vpr_fpga_verilog_print_sdc_pnr}) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_verilog_print_sdc_pnr";
}
if ("on" eq $opt_ptr->{vpr_fpga_verilog_print_user_defined_template}) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_verilog_print_user_defined_template";
}
if ("on" eq $opt_ptr->{vpr_fpga_verilog_print_sdc_analysis}) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_verilog_print_sdc_analysis";
}
} }
if (("on" eq $opt_ptr->{vpr_fpga_spice_rename_illegal_port}) # FPGA Bitstream Generator Options
if ("on" eq $opt_ptr->{vpr_fpga_bitstream_generator}) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_bitstream_generator";
}
if (("on" eq $opt_ptr->{vpr_fpga_x2p_rename_illegal_port})
|| ("on" eq $opt_ptr->{vpr_fpga_spice}) || ("on" eq $opt_ptr->{vpr_fpga_spice})
|| ("on" eq $opt_ptr->{vpr_fpga_verilog})) { || ("on" eq $opt_ptr->{vpr_fpga_verilog})) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_spice_rename_illegal_port"; $vpr_spice_opts = $vpr_spice_opts." --fpga_x2p_rename_illegal_port";
} }
my ($other_opt) = (""); my ($other_opt) = ("");
@ -1206,7 +1355,6 @@ sub run_std_vpr($ $ $ $ $ $ $ $ $)
system("/bin/csh -cx './$vpr_name $arch $blif --net_file $net --place_file $place --route_file $route --full_stats --nodisp $power_opts $packer_opts $chan_width_opt $vpr_spice_opts $other_opt > $log'"); system("/bin/csh -cx './$vpr_name $arch $blif --net_file $net --place_file $place --route_file $route --full_stats --nodisp $power_opts $packer_opts $chan_width_opt $vpr_spice_opts $other_opt > $log'");
chdir $cwd; chdir $cwd;
print "Leaving $vpr_dir\n";
} }
sub run_vpr_route($ $ $ $ $ $ $ $ $) sub run_vpr_route($ $ $ $ $ $ $ $ $)
@ -1252,10 +1400,10 @@ sub run_vpr_route($ $ $ $ $ $ $ $ $)
$vpr_spice_opts = $vpr_spice_opts." --fpga_spice_parasitic_net_estimation_off"; $vpr_spice_opts = $vpr_spice_opts." --fpga_spice_parasitic_net_estimation_off";
} }
} }
if ("on" eq $opt_ptr->{vpr_fpga_spice_verilog_generator}) { if ("on" eq $opt_ptr->{vpr_fpga_verilog}) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_syn_verilog"; $vpr_spice_opts = $vpr_spice_opts." --fpga_verilog";
if ("on" eq $opt_ptr->{vpr_fpga_spice_rename_illegal_port}) { if ("on" eq $opt_ptr->{vpr_fpga_x2p_rename_illegal_port}) {
$vpr_spice_opts = $vpr_spice_opts." --fpga_spice_rename_illegal_port"; $vpr_spice_opts = $vpr_spice_opts." --fpga_x2p_rename_illegal_port";
} }
} }
@ -1420,8 +1568,6 @@ sub init_fpga_spice_task($) {
&generate_path($task_dir_path); &generate_path($task_dir_path);
print "INFO: writting FPGA SPICE task list $task_file\n";
# Open the task file handler # Open the task file handler
my ($TASKFH) = (FileHandle->new); my ($TASKFH) = (FileHandle->new);
if ($TASKFH->open("> $task_file")) { if ($TASKFH->open("> $task_file")) {
@ -1436,7 +1582,6 @@ sub init_fpga_spice_task($) {
# Close the file handler # Close the file handler
close($TASKFH); close($TASKFH);
} }
# Print a line into task file which contains task info of FPGA SPICE. # Print a line into task file which contains task info of FPGA SPICE.
@ -1633,7 +1778,7 @@ sub run_yosys_vpr_flow($ $ $ $ $)
&run_yosys_fpgamap($benchmark, $yosys_bm, $yosys_blif_out, $yosys_log); &run_yosys_fpgamap($benchmark, $yosys_bm, $yosys_blif_out, $yosys_log);
# Files for ace # Files for ace
my ($act_file,$ace_new_blif,$ace_log) = ("$prefix"."ace.act","$prefix"."ace.blif","$prefix"."ace.log"); my ($act_file,$ace_new_blif,$ace_log) = ("$rpt_dir/$benchmark".".act","$rpt_dir/$benchmark".".blif","$prefix"."ace.log");
&run_ace_in_flow($prefix, $yosys_blif_out, $act_file, $ace_new_blif, $ace_log); &run_ace_in_flow($prefix, $yosys_blif_out, $act_file, $ace_new_blif, $ace_log);
# Files for VPR # Files for VPR
@ -1645,7 +1790,10 @@ sub run_yosys_vpr_flow($ $ $ $ $)
$vpr_log = "$prefix"."vpr.log"; $vpr_log = "$prefix"."vpr.log";
$vpr_reroute_log = "$prefix"."vpr_reroute.log"; $vpr_reroute_log = "$prefix"."vpr_reroute.log";
&run_vpr_in_flow($tag, $benchmark, $benchmark_file, $yosys_blif_out, $vpr_arch, $act_file, $vpr_net, $vpr_place, $vpr_route, $vpr_log, $vpr_reroute_log, $parse_results); # Need to add a regenation of the verilog from the optimized blif -> write verilog from blif + correct the name of the verilog for the testbench
$verilog_benchmark = &run_rewrite_verilog($ace_new_blif, $rpt_dir, $benchmark, $benchmark, $yosys_log);
&run_vpr_in_flow($tag, $benchmark, $benchmark_file, $ace_new_blif, $vpr_arch, $act_file, $vpr_net, $vpr_place, $vpr_route, $vpr_log, $vpr_reroute_log, $parse_results);
return; return;
} }
@ -1668,7 +1816,7 @@ sub parse_yosys_vpr_flow_results($ $ $ $)
# Run Yosys flow # Run Yosys flow
$yosys_bm = "$conf_ptr->{dir_path}->{benchmark_dir}->{val}"."/$benchmark_file"; $yosys_bm = "$conf_ptr->{dir_path}->{benchmark_dir}->{val}"."/$benchmark_file";
$prefix = "$rpt_dir/$benchmark\_"."K$opt_ptr->{K_val}\_"."N$opt_ptr->{N_val}\_"; $prefix = "$rpt_dir/$benchmark\_"."K$opt_ptr->{K_val}\_"."N$opt_ptr->{N_val}\_";
$yosys_blif_out = "$prefix"."yosys.blif"; $yosys_blif_out = "$rpt_dir/$benchmark".".blif";
$yosys_log = "$prefix"."yosys.log"; $yosys_log = "$prefix"."yosys.log";
# Files for ace # Files for ace
@ -1716,13 +1864,13 @@ sub parse_yosys_vpr_flow_results($ $ $ $)
} }
sub run_standard_flow($ $ $ $ $) sub run_standard_flow($ $ $ $ $)
{ {
my ($tag,$benchmark_file,$vpr_arch,$flow_enhance, $parse_results) = @_; my ($tag,$benchmark_file,$vpr_arch,$flow_enhance, $parse_results) = @_;
my ($benchmark, $rpt_dir,$prefix); my ($benchmark, $rpt_dir,$prefix);
my ($abc_bm,$abc_blif_out,$abc_log,$abc_blif_out_bak); my ($abc_bm,$abc_blif_out,$abc_log,$abc_blif_out_bak);
my ($mpack_blif_out,$mpack_stats,$mpack_log); my ($mpack_blif_out,$mpack_stats,$mpack_log);
my ($vpr_net,$vpr_place,$vpr_route,$vpr_reroute_log,$vpr_log);
$benchmark = $benchmark_file; $benchmark = $benchmark_file;
$benchmark =~ s/\.blif$//g; $benchmark =~ s/\.blif$//g;
@ -1738,8 +1886,6 @@ sub run_standard_flow($ $ $ $ $)
my ($act_file,$ace_new_blif,$ace_log) = ("$prefix"."ace.act","$prefix"."ace.blif","$prefix"."ace.log"); my ($act_file,$ace_new_blif,$ace_log) = ("$prefix"."ace.act","$prefix"."ace.blif","$prefix"."ace.log");
my ($vpr_net,$vpr_place,$vpr_route,$vpr_reroute_log,$vpr_log);
$vpr_net = "$prefix"."vpr.net"; $vpr_net = "$prefix"."vpr.net";
$vpr_place = "$prefix"."vpr.place"; $vpr_place = "$prefix"."vpr.place";
$vpr_route = "$prefix"."vpr.route"; $vpr_route = "$prefix"."vpr.route";
@ -2543,7 +2689,7 @@ sub multithread_run_flows($) {
die "ERROR: cannot use threads package in Perl! Please check the installation of package...\n"; die "ERROR: cannot use threads package in Perl! Please check the installation of package...\n";
} }
# Launch threads up to the limited number of threads number # Lauch threads up to the limited number of threads number
if ($num_threads < 2) { if ($num_threads < 2) {
$num_threads = 2; $num_threads = 2;
} }
@ -2590,7 +2736,7 @@ sub multithread_run_flows($) {
my $thr_new = threads->create(\&run_benchmark_selected_flow,$flow_to_run,$benchmark, 0); my $thr_new = threads->create(\&run_benchmark_selected_flow,$flow_to_run,$benchmark, 0);
# We have a valid thread... # We have a valid thread...
if ($thr_new) { if ($thr_new) {
print "INFO: a new thread is launched!\n"; print "INFO: a new thread is lauched!\n";
print "FLOW RUNNING: $flow_to_run, Benchmark: $benchmark\n"; print "FLOW RUNNING: $flow_to_run, Benchmark: $benchmark\n";
# Check if it is running... # Check if it is running...
if ($thr_new->is_running()) { if ($thr_new->is_running()) {