Merge branch 'dev' into documentation
This commit is contained in:
commit
35e1962732
|
@ -46,7 +46,8 @@ my @supported_flows = ("standard",
|
||||||
"mpack1",
|
"mpack1",
|
||||||
"vtr",
|
"vtr",
|
||||||
"vtr_standard",
|
"vtr_standard",
|
||||||
"yosys_vpr");
|
"yosys_vpr",
|
||||||
|
"vpr_only");
|
||||||
my %selected_flows;
|
my %selected_flows;
|
||||||
|
|
||||||
# Configuration file keywords list
|
# Configuration file keywords list
|
||||||
|
@ -761,6 +762,8 @@ sub run_abc_fpgamap($ $ $)
|
||||||
# Run ABC by FPGA-oriented synthesis
|
# Run ABC by FPGA-oriented synthesis
|
||||||
sub run_abc_bb_fpgamap($ $ $) {
|
sub run_abc_bb_fpgamap($ $ $) {
|
||||||
my ($bm,$blif_out,$log) = @_;
|
my ($bm,$blif_out,$log) = @_;
|
||||||
|
my ($cmd_log) = ($log."cmd");
|
||||||
|
|
||||||
# Get ABC path
|
# Get ABC path
|
||||||
my ($abc_dir,$abc_name) = &split_prog_path($conf_ptr->{dir_path}->{abc_with_bb_support_path}->{val});
|
my ($abc_dir,$abc_name) = &split_prog_path($conf_ptr->{dir_path}->{abc_with_bb_support_path}->{val});
|
||||||
my ($lut_num) = $opt_ptr->{K_val};
|
my ($lut_num) = $opt_ptr->{K_val};
|
||||||
|
@ -777,9 +780,26 @@ sub run_abc_bb_fpgamap($ $ $) {
|
||||||
$dump_verilog = "write_verilog $bm.v";
|
$dump_verilog = "write_verilog $bm.v";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Create a local copy for the commands
|
||||||
|
#
|
||||||
|
my ($ABC_CMD_FH) = (FileHandle->new);
|
||||||
|
if ($ABC_CMD_FH->open("> $cmd_log")) {
|
||||||
|
print "INFO: auto generating cmds for ABC ($cmd_log) ...\n";
|
||||||
|
} else {
|
||||||
|
die "ERROR: fail to auto generating cmds for ABC ($cmd_log) ...\n";
|
||||||
|
}
|
||||||
|
# Output the standard format (refer to VTR_flow script)
|
||||||
|
print $ABC_CMD_FH "read $bm; resyn; resyn2; $fpga_synthesis_method -K $lut_num; $abc_seq_optimize sweep; write_hie $bm $blif_out; $dump_verilog; quit;\n";
|
||||||
|
|
||||||
|
close($ABC_CMD_FH);
|
||||||
|
|
||||||
|
# Go to ABC directory and run FPGA with commands
|
||||||
|
print "Entering $abc_dir\n";
|
||||||
chdir $abc_dir;
|
chdir $abc_dir;
|
||||||
|
|
||||||
# Run FPGA ABC
|
# Run FPGA ABC
|
||||||
system("./$abc_name -c \"read $bm; resyn; resyn2; $fpga_synthesis_method -K $lut_num; $abc_seq_optimize sweep; write_hie $bm $blif_out; $dump_verilog; quit;\" > $log");
|
system("./$abc_name -F $cmd_log > $log");
|
||||||
|
|
||||||
if (!(-e $blif_out)) {
|
if (!(-e $blif_out)) {
|
||||||
die "ERROR: Fail ABC_with_bb_support for benchmark $bm.\n";
|
die "ERROR: Fail ABC_with_bb_support for benchmark $bm.\n";
|
||||||
|
@ -789,6 +809,7 @@ sub run_abc_bb_fpgamap($ $ $) {
|
||||||
die "ERROR: ABC verilog rewrite failed for benchmark $bm!\n";
|
die "ERROR: ABC verilog rewrite failed for benchmark $bm!\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
print "Leaving $abc_dir\n";
|
||||||
chdir $cwd;
|
chdir $cwd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2004,6 +2025,34 @@ sub parse_yosys_vpr_flow_results($ $ $ $)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub run_vpr_only_flow($ $ $ $ $)
|
||||||
|
{
|
||||||
|
my ($tag,$benchmark_file,$vpr_arch, $parse_results) = @_;
|
||||||
|
my ($benchmark, $rpt_dir,$prefix);
|
||||||
|
my ($vpr_net,$vpr_place,$vpr_route,$vpr_reroute_log,$vpr_log);
|
||||||
|
|
||||||
|
$benchmark = $benchmark_file;
|
||||||
|
$benchmark =~ s/\.blif$//g;
|
||||||
|
# Run Standard flow
|
||||||
|
$rpt_dir = "$conf_ptr->{dir_path}->{rpt_dir}->{val}"."/$benchmark/$tag";
|
||||||
|
&generate_path($rpt_dir);
|
||||||
|
$prefix = "$rpt_dir/$benchmark\_"."K$opt_ptr->{K_val}\_"."N$opt_ptr->{N_val}\_";
|
||||||
|
|
||||||
|
my ($input_blif) = ("$conf_ptr->{dir_path}->{benchmark_dir}->{val}"."/$benchmark".".blif");
|
||||||
|
my ($act_file,$ace_new_blif,$ace_log) = ("$prefix"."ace.act","$prefix"."ace.blif","$prefix"."ace.log");
|
||||||
|
|
||||||
|
$vpr_net = "$prefix"."vpr.net";
|
||||||
|
$vpr_place = "$prefix"."vpr.place";
|
||||||
|
$vpr_route = "$prefix"."vpr.route";
|
||||||
|
$vpr_log = "$prefix"."vpr.log";
|
||||||
|
$vpr_reroute_log = "$prefix"."vpr_reroute.log";
|
||||||
|
|
||||||
|
&run_ace_in_flow($prefix, $input_blif, $act_file, $ace_new_blif, $ace_log);
|
||||||
|
|
||||||
|
&run_vpr_in_flow($tag, $benchmark, $benchmark_file, $input_blif, $vpr_arch, $act_file, $vpr_net, $vpr_place, $vpr_route, $vpr_log, $vpr_reroute_log, $parse_results);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
sub run_standard_flow($ $ $ $ $)
|
sub run_standard_flow($ $ $ $ $)
|
||||||
{
|
{
|
||||||
|
@ -2728,6 +2777,8 @@ sub run_benchmark_selected_flow($ $ $)
|
||||||
&run_mig_mccl_flow("mig_mccl",$benchmark,$conf_ptr->{flow_conf}->{vpr_arch}->{val}, $parse_results);
|
&run_mig_mccl_flow("mig_mccl",$benchmark,$conf_ptr->{flow_conf}->{vpr_arch}->{val}, $parse_results);
|
||||||
} elsif ($flow_type eq "yosys_vpr") {
|
} elsif ($flow_type eq "yosys_vpr") {
|
||||||
&run_yosys_vpr_flow("yosys_vpr",$benchmark,$conf_ptr->{flow_conf}->{vpr_arch}->{val}, "classic", $parse_results);
|
&run_yosys_vpr_flow("yosys_vpr",$benchmark,$conf_ptr->{flow_conf}->{vpr_arch}->{val}, "classic", $parse_results);
|
||||||
|
} elsif ($flow_type eq "vpr_only") {
|
||||||
|
&run_vpr_only_flow("vpr_only",$benchmark,$conf_ptr->{flow_conf}->{vpr_arch}->{val}, $parse_results);
|
||||||
} else {
|
} else {
|
||||||
die "ERROR: unsupported flow type ($flow_type) is chosen!\n";
|
die "ERROR: unsupported flow type ($flow_type) is chosen!\n";
|
||||||
}
|
}
|
||||||
|
@ -2756,6 +2807,8 @@ sub parse_benchmark_selected_flow($ $) {
|
||||||
&parse_standard_flow_results("mig_mccl", $benchmark, $conf_ptr->{flow_conf}->{vpr_arch}->{val}, "abc_black_box");
|
&parse_standard_flow_results("mig_mccl", $benchmark, $conf_ptr->{flow_conf}->{vpr_arch}->{val}, "abc_black_box");
|
||||||
} elsif ($flow_type eq "yosys_vpr") {
|
} elsif ($flow_type eq "yosys_vpr") {
|
||||||
&parse_yosys_vpr_flow_results("yosys_vpr",$benchmark,$conf_ptr->{flow_conf}->{vpr_arch}->{val},"abc_black_box");
|
&parse_yosys_vpr_flow_results("yosys_vpr",$benchmark,$conf_ptr->{flow_conf}->{vpr_arch}->{val},"abc_black_box");
|
||||||
|
} elsif ($flow_type eq "vpr_only") {
|
||||||
|
&parse_standard_flow_results("vpr_only",$benchmark,$conf_ptr->{flow_conf}->{vpr_arch}->{val}, "classic");
|
||||||
} else {
|
} else {
|
||||||
die "ERROR: unsupported flow type ($flow_type) is chosen!\n";
|
die "ERROR: unsupported flow type ($flow_type) is chosen!\n";
|
||||||
}
|
}
|
||||||
|
@ -3547,6 +3600,11 @@ sub gen_csv_rpt($)
|
||||||
print "INFO: writing yosys_vpr flow results ...\n";
|
print "INFO: writing yosys_vpr flow results ...\n";
|
||||||
&gen_csv_rpt_yosys_vpr_flow("yosys_vpr",$CSVFH);
|
&gen_csv_rpt_yosys_vpr_flow("yosys_vpr",$CSVFH);
|
||||||
}
|
}
|
||||||
|
} elsif ($flow_type eq "vpr_only") {
|
||||||
|
if (1 == &check_flow_all_benchmarks_done("vpr_only")) {
|
||||||
|
print "INFO: writing vpr_only flow results ...\n";
|
||||||
|
&gen_csv_rpt_standard_flow("vpr_only",$CSVFH);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
die "ERROR: flow_type: $flow_type is not supported!\n";
|
die "ERROR: flow_type: $flow_type is not supported!\n";
|
||||||
}
|
}
|
||||||
|
|
|
@ -147,6 +147,7 @@ sub process_blifmodel($ $) {
|
||||||
if ($temp eq $default_clk_name) {
|
if ($temp eq $default_clk_name) {
|
||||||
$have_default_clk = 1;
|
$have_default_clk = 1;
|
||||||
$clk_num++;
|
$clk_num++;
|
||||||
|
print "Found 1 clock: $temp in @tokens\n";
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -244,7 +244,7 @@ void load_one_grid_rr_nodes_basic_info(const DeviceCoordinator& grid_coordinator
|
||||||
rr_graph->rr_node[*cur_node_id].xlow = grid_coordinator.get_x();
|
rr_graph->rr_node[*cur_node_id].xlow = grid_coordinator.get_x();
|
||||||
rr_graph->rr_node[*cur_node_id].xhigh = grid_coordinator.get_x();
|
rr_graph->rr_node[*cur_node_id].xhigh = grid_coordinator.get_x();
|
||||||
rr_graph->rr_node[*cur_node_id].ylow = grid_coordinator.get_y();
|
rr_graph->rr_node[*cur_node_id].ylow = grid_coordinator.get_y();
|
||||||
rr_graph->rr_node[*cur_node_id].yhigh = grid_coordinator.get_y();
|
rr_graph->rr_node[*cur_node_id].yhigh = grid_coordinator.get_y() + cur_grid.type->height - 1;
|
||||||
rr_graph->rr_node[*cur_node_id].ptc_num = opin_list[pin];
|
rr_graph->rr_node[*cur_node_id].ptc_num = opin_list[pin];
|
||||||
rr_graph->rr_node[*cur_node_id].capacity = 1;
|
rr_graph->rr_node[*cur_node_id].capacity = 1;
|
||||||
rr_graph->rr_node[*cur_node_id].occ = 0;
|
rr_graph->rr_node[*cur_node_id].occ = 0;
|
||||||
|
@ -253,6 +253,15 @@ void load_one_grid_rr_nodes_basic_info(const DeviceCoordinator& grid_coordinator
|
||||||
/* Switch info */
|
/* Switch info */
|
||||||
rr_graph->rr_node[*cur_node_id].driver_switch = delayless_switch;
|
rr_graph->rr_node[*cur_node_id].driver_switch = delayless_switch;
|
||||||
/* fill fast look-up table */
|
/* fill fast look-up table */
|
||||||
|
/* If height > 1, we will update fast lookup to twice:
|
||||||
|
* 1. for the x, y + height. This enable fast fast look-up for node collection in rr_gsb
|
||||||
|
* 2. for the x, y. This enables fast lookup for SOURCE and SINK nodes drive/driven by the node
|
||||||
|
*/
|
||||||
|
load_one_node_to_rr_graph_fast_lookup(rr_graph, *cur_node_id,
|
||||||
|
rr_graph->rr_node[*cur_node_id].type,
|
||||||
|
rr_graph->rr_node[*cur_node_id].xlow,
|
||||||
|
rr_graph->rr_node[*cur_node_id].ylow + height,
|
||||||
|
rr_graph->rr_node[*cur_node_id].ptc_num);
|
||||||
load_one_node_to_rr_graph_fast_lookup(rr_graph, *cur_node_id,
|
load_one_node_to_rr_graph_fast_lookup(rr_graph, *cur_node_id,
|
||||||
rr_graph->rr_node[*cur_node_id].type,
|
rr_graph->rr_node[*cur_node_id].type,
|
||||||
rr_graph->rr_node[*cur_node_id].xlow,
|
rr_graph->rr_node[*cur_node_id].xlow,
|
||||||
|
@ -269,7 +278,7 @@ void load_one_grid_rr_nodes_basic_info(const DeviceCoordinator& grid_coordinator
|
||||||
rr_graph->rr_node[*cur_node_id].xlow = grid_coordinator.get_x();
|
rr_graph->rr_node[*cur_node_id].xlow = grid_coordinator.get_x();
|
||||||
rr_graph->rr_node[*cur_node_id].xhigh = grid_coordinator.get_x();
|
rr_graph->rr_node[*cur_node_id].xhigh = grid_coordinator.get_x();
|
||||||
rr_graph->rr_node[*cur_node_id].ylow = grid_coordinator.get_y();
|
rr_graph->rr_node[*cur_node_id].ylow = grid_coordinator.get_y();
|
||||||
rr_graph->rr_node[*cur_node_id].yhigh = grid_coordinator.get_y();
|
rr_graph->rr_node[*cur_node_id].yhigh = grid_coordinator.get_y() + cur_grid.type->height - 1;
|
||||||
rr_graph->rr_node[*cur_node_id].ptc_num = ipin_list[pin];
|
rr_graph->rr_node[*cur_node_id].ptc_num = ipin_list[pin];
|
||||||
rr_graph->rr_node[*cur_node_id].capacity = 1;
|
rr_graph->rr_node[*cur_node_id].capacity = 1;
|
||||||
rr_graph->rr_node[*cur_node_id].occ = 0;
|
rr_graph->rr_node[*cur_node_id].occ = 0;
|
||||||
|
@ -278,6 +287,15 @@ void load_one_grid_rr_nodes_basic_info(const DeviceCoordinator& grid_coordinator
|
||||||
/* Switch info */
|
/* Switch info */
|
||||||
rr_graph->rr_node[*cur_node_id].driver_switch = wire_to_ipin_switch;
|
rr_graph->rr_node[*cur_node_id].driver_switch = wire_to_ipin_switch;
|
||||||
/* fill fast look-up table */
|
/* fill fast look-up table */
|
||||||
|
/* If height > 1, we will update fast lookup to twice:
|
||||||
|
* 1. for the x, y + height. This enable fast fast look-up for node collection in rr_gsb
|
||||||
|
* 2. for the x, y. This enables fast lookup for SOURCE and SINK nodes drive/driven by the node
|
||||||
|
*/
|
||||||
|
load_one_node_to_rr_graph_fast_lookup(rr_graph, *cur_node_id,
|
||||||
|
rr_graph->rr_node[*cur_node_id].type,
|
||||||
|
rr_graph->rr_node[*cur_node_id].xlow,
|
||||||
|
rr_graph->rr_node[*cur_node_id].ylow + height,
|
||||||
|
rr_graph->rr_node[*cur_node_id].ptc_num);
|
||||||
load_one_node_to_rr_graph_fast_lookup(rr_graph, *cur_node_id,
|
load_one_node_to_rr_graph_fast_lookup(rr_graph, *cur_node_id,
|
||||||
rr_graph->rr_node[*cur_node_id].type,
|
rr_graph->rr_node[*cur_node_id].type,
|
||||||
rr_graph->rr_node[*cur_node_id].xlow,
|
rr_graph->rr_node[*cur_node_id].xlow,
|
||||||
|
@ -289,46 +307,44 @@ void load_one_grid_rr_nodes_basic_info(const DeviceCoordinator& grid_coordinator
|
||||||
} /* End of side enumeration */
|
} /* End of side enumeration */
|
||||||
} /* End of height enumeration */
|
} /* End of height enumeration */
|
||||||
|
|
||||||
/* Walk through the height of each grid,
|
/* No need to Walk through the height of each grid,
|
||||||
* get pins and configure the rr_nodes */
|
* get pins and configure the rr_nodes */
|
||||||
for (int height = 0; height < cur_grid.type->height; ++height) {
|
/* Set a SOURCE or a SINK rr_node for each class */
|
||||||
/* Set a SOURCE or a SINK rr_node for each class */
|
for (int iclass = 0; iclass < cur_grid.type->num_class; ++iclass) {
|
||||||
for (int iclass = 0; iclass < cur_grid.type->num_class; ++iclass) {
|
/* Set a SINK rr_node for the OPIN */
|
||||||
/* Set a SINK rr_node for the OPIN */
|
if ( DRIVER == cur_grid.type->class_inf[iclass].type) {
|
||||||
if ( DRIVER == cur_grid.type->class_inf[iclass].type) {
|
rr_graph->rr_node[*cur_node_id].type = SOURCE;
|
||||||
rr_graph->rr_node[*cur_node_id].type = SOURCE;
|
}
|
||||||
}
|
if ( RECEIVER == cur_grid.type->class_inf[iclass].type) {
|
||||||
if ( RECEIVER == cur_grid.type->class_inf[iclass].type) {
|
rr_graph->rr_node[*cur_node_id].type = SINK;
|
||||||
rr_graph->rr_node[*cur_node_id].type = SINK;
|
}
|
||||||
}
|
rr_graph->rr_node[*cur_node_id].xlow = grid_coordinator.get_x();
|
||||||
rr_graph->rr_node[*cur_node_id].xlow = grid_coordinator.get_x();
|
rr_graph->rr_node[*cur_node_id].xhigh = grid_coordinator.get_x();
|
||||||
rr_graph->rr_node[*cur_node_id].xhigh = grid_coordinator.get_x();
|
rr_graph->rr_node[*cur_node_id].ylow = grid_coordinator.get_y();
|
||||||
rr_graph->rr_node[*cur_node_id].ylow = grid_coordinator.get_y();
|
rr_graph->rr_node[*cur_node_id].yhigh = grid_coordinator.get_y() + cur_grid.type->height - 1;
|
||||||
rr_graph->rr_node[*cur_node_id].yhigh = grid_coordinator.get_y();
|
rr_graph->rr_node[*cur_node_id].ptc_num = iclass;
|
||||||
rr_graph->rr_node[*cur_node_id].ptc_num = iclass;
|
/* FIXME: need to confirm if the capacity should be the number of pins in this class*/
|
||||||
/* FIXME: need to confirm if the capacity should be the number of pins in this class*/
|
rr_graph->rr_node[*cur_node_id].capacity = cur_grid.type->class_inf[iclass].num_pins;
|
||||||
rr_graph->rr_node[*cur_node_id].capacity = cur_grid.type->class_inf[iclass].num_pins;
|
rr_graph->rr_node[*cur_node_id].occ = 0;
|
||||||
rr_graph->rr_node[*cur_node_id].occ = 0;
|
/* cost index is a FIXED value for SOURCE and SINK */
|
||||||
/* cost index is a FIXED value for SOURCE and SINK */
|
if (SOURCE == rr_graph->rr_node[*cur_node_id].type) {
|
||||||
if (SOURCE == rr_graph->rr_node[*cur_node_id].type) {
|
rr_graph->rr_node[*cur_node_id].cost_index = SOURCE_COST_INDEX;
|
||||||
rr_graph->rr_node[*cur_node_id].cost_index = SOURCE_COST_INDEX;
|
}
|
||||||
}
|
if (SINK == rr_graph->rr_node[*cur_node_id].type) {
|
||||||
if (SINK == rr_graph->rr_node[*cur_node_id].type) {
|
rr_graph->rr_node[*cur_node_id].cost_index = SINK_COST_INDEX;
|
||||||
rr_graph->rr_node[*cur_node_id].cost_index = SINK_COST_INDEX;
|
}
|
||||||
}
|
/* Switch info */
|
||||||
/* Switch info */
|
rr_graph->rr_node[*cur_node_id].driver_switch = delayless_switch;
|
||||||
rr_graph->rr_node[*cur_node_id].driver_switch = delayless_switch;
|
/* TODO: should we set pb_graph_pin here? */
|
||||||
/* TODO: should we set pb_graph_pin here? */
|
/* fill fast look-up table */
|
||||||
/* fill fast look-up table */
|
load_one_node_to_rr_graph_fast_lookup(rr_graph, *cur_node_id,
|
||||||
load_one_node_to_rr_graph_fast_lookup(rr_graph, *cur_node_id,
|
rr_graph->rr_node[*cur_node_id].type,
|
||||||
rr_graph->rr_node[*cur_node_id].type,
|
rr_graph->rr_node[*cur_node_id].xlow,
|
||||||
rr_graph->rr_node[*cur_node_id].xlow,
|
rr_graph->rr_node[*cur_node_id].ylow,
|
||||||
rr_graph->rr_node[*cur_node_id].ylow,
|
rr_graph->rr_node[*cur_node_id].ptc_num);
|
||||||
rr_graph->rr_node[*cur_node_id].ptc_num);
|
/* Update node counter */
|
||||||
/* Update node counter */
|
(*cur_node_id)++;
|
||||||
(*cur_node_id)++;
|
} /* End of height enumeration */
|
||||||
} /* End of height enumeration */
|
|
||||||
} /* End of pin_class enumeration */
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -640,7 +656,7 @@ void load_rr_nodes_basic_info(t_rr_graph* rr_graph,
|
||||||
|| (OPIN == rr_graph->rr_node[inode].type)
|
|| (OPIN == rr_graph->rr_node[inode].type)
|
||||||
|| (IPIN == rr_graph->rr_node[inode].type));
|
|| (IPIN == rr_graph->rr_node[inode].type));
|
||||||
assert (rr_graph->rr_node[inode].xlow == rr_graph->rr_node[inode].xhigh);
|
assert (rr_graph->rr_node[inode].xlow == rr_graph->rr_node[inode].xhigh);
|
||||||
assert (rr_graph->rr_node[inode].ylow == rr_graph->rr_node[inode].yhigh);
|
assert (rr_graph->rr_node[inode].ylow + grids[rr_graph->rr_node[inode].xlow][rr_graph->rr_node[inode].ylow].type->height - 1 == rr_graph->rr_node[inode].yhigh);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -993,6 +1009,13 @@ void build_tileable_unidir_rr_graph(INP const int L_num_types,
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
alloc_rr_graph_fast_lookup(device_size, &rr_graph);
|
alloc_rr_graph_fast_lookup(device_size, &rr_graph);
|
||||||
|
|
||||||
|
/* FIXME: DEBUG CODES TO BE REMOVED
|
||||||
|
vpr_printf(TIO_MESSAGE_INFO, "estimated %lu SOURCE NODE.\n", num_rr_nodes_per_type[SOURCE]);
|
||||||
|
vpr_printf(TIO_MESSAGE_INFO, "estimated %lu SINK NODE.\n", num_rr_nodes_per_type[SINK]);
|
||||||
|
vpr_printf(TIO_MESSAGE_INFO, "estimated %lu OPIN NODE.\n", num_rr_nodes_per_type[OPIN]);
|
||||||
|
vpr_printf(TIO_MESSAGE_INFO, "estimated %lu IPIN NODE.\n", num_rr_nodes_per_type[IPIN]);
|
||||||
|
*/
|
||||||
|
|
||||||
load_rr_nodes_basic_info(&rr_graph, device_size, grids, device_chan_width, segment_infs,
|
load_rr_nodes_basic_info(&rr_graph, device_size, grids, device_chan_width, segment_infs,
|
||||||
wire_to_ipin_switch, delayless_switch);
|
wire_to_ipin_switch, delayless_switch);
|
||||||
|
|
||||||
|
|
|
@ -736,7 +736,7 @@ t_block* search_mapped_block(int x, int y, int z) {
|
||||||
assert((0 < x)||(0 == x));
|
assert((0 < x)||(0 == x));
|
||||||
assert((x < (nx + 1))||(x == (nx + 1)));
|
assert((x < (nx + 1))||(x == (nx + 1)));
|
||||||
assert((0 < y)||(0 == y));
|
assert((0 < y)||(0 == y));
|
||||||
assert((x < (ny + 1))||(x == (ny + 1)));
|
assert((y < (ny + 1))||(y == (ny + 1)));
|
||||||
|
|
||||||
/* Search all blocks*/
|
/* Search all blocks*/
|
||||||
for (iblk = 0; iblk < num_blocks; iblk++) {
|
for (iblk = 0; iblk < num_blocks; iblk++) {
|
||||||
|
@ -3479,10 +3479,10 @@ int my_strlen_int(int input_int) {
|
||||||
|
|
||||||
boolean my_bool_to_boolean(bool my_bool) {
|
boolean my_bool_to_boolean(bool my_bool) {
|
||||||
|
|
||||||
if(true == my_bool)
|
if(true == my_bool) {
|
||||||
return TRUE;
|
return TRUE;
|
||||||
if(false == my_bool)
|
} else {
|
||||||
return FALSE;
|
assert (false == my_bool);
|
||||||
vpr_printf(TIO_MESSAGE_ERROR,"Failure to convert bool to boolean. Parameter is neither true nor false.\n");
|
return FALSE;
|
||||||
exit(1);
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -373,7 +373,9 @@ void dump_verilog_pb_type_one_bus_port(FILE* fp,
|
||||||
fprintf(fp, ".%s(",
|
fprintf(fp, ".%s(",
|
||||||
pb_type_port->spice_model_port->lib_name);
|
pb_type_port->spice_model_port->lib_name);
|
||||||
}
|
}
|
||||||
fprintf(fp, "{");
|
if (1 < pb_type_port->num_pins) {
|
||||||
|
fprintf(fp, "{");
|
||||||
|
}
|
||||||
for (int ipin = 0; ipin < pb_type_port->num_pins; ++ipin) {
|
for (int ipin = 0; ipin < pb_type_port->num_pins; ++ipin) {
|
||||||
if (0 < ipin) {
|
if (0 < ipin) {
|
||||||
fprintf(fp, ", ");
|
fprintf(fp, ", ");
|
||||||
|
@ -381,7 +383,9 @@ void dump_verilog_pb_type_one_bus_port(FILE* fp,
|
||||||
fprintf(fp, "%s",
|
fprintf(fp, "%s",
|
||||||
gen_verilog_one_pb_type_pin_name(port_prefix, pb_type_port, ipin));
|
gen_verilog_one_pb_type_pin_name(port_prefix, pb_type_port, ipin));
|
||||||
}
|
}
|
||||||
fprintf(fp, "}");
|
if (1 < pb_type_port->num_pins) {
|
||||||
|
fprintf(fp, "}");
|
||||||
|
}
|
||||||
if (TRUE == dump_explicit_port_map) {
|
if (TRUE == dump_explicit_port_map) {
|
||||||
fprintf(fp, ")");
|
fprintf(fp, ")");
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,7 +134,7 @@ void dump_verilog_pb_generic_primitive(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
get_sram_orgz_info_num_blwl(cur_sram_orgz_info, &cur_bl, &cur_wl);
|
get_sram_orgz_info_num_blwl(cur_sram_orgz_info, &cur_bl, &cur_wl);
|
||||||
|
|
||||||
/* print ports --> input ports */
|
/* print ports --> input ports */
|
||||||
dump_verilog_pb_type_ports(fp, port_prefix, 0, prim_pb_type, TRUE, FALSE, FALSE, false);
|
dump_verilog_pb_type_ports(fp, port_prefix, 0, prim_pb_type, TRUE, FALSE, FALSE, true);
|
||||||
/* IOPADs requires a specical port to output */
|
/* IOPADs requires a specical port to output */
|
||||||
if (SPICE_MODEL_IOPAD == verilog_model->type) {
|
if (SPICE_MODEL_IOPAD == verilog_model->type) {
|
||||||
fprintf(fp, ",\n");
|
fprintf(fp, ",\n");
|
||||||
|
@ -222,34 +222,41 @@ void dump_verilog_pb_generic_primitive(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
fprintf(fp, "`endif\n");
|
fprintf(fp, "`endif\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Explicit port map support: turn it on when there is need for the full netlist or just standard cell */
|
||||||
|
boolean subckt_require_explicit_port_map = FALSE;
|
||||||
|
if ( (TRUE == verilog_model->dump_explicit_port_map) || (true == is_explicit_mapping) ) {
|
||||||
|
subckt_require_explicit_port_map = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Call the subckt*/
|
/* Call the subckt*/
|
||||||
fprintf(fp, "%s %s_%d_ (", verilog_model->name, verilog_model->prefix, verilog_model->cnt);
|
fprintf(fp, "%s %s_%d_ (", verilog_model->name, verilog_model->prefix, verilog_model->cnt);
|
||||||
fprintf(fp, "\n");
|
fprintf(fp, "\n");
|
||||||
/* Only dump the global ports belonging to a spice_model
|
/* Only dump the global ports belonging to a spice_model
|
||||||
* Disable recursive here !
|
* Disable recursive here !
|
||||||
*/
|
*/
|
||||||
if (0 < rec_dump_verilog_spice_model_global_ports(fp, verilog_model, FALSE, FALSE, my_bool_to_boolean(is_explicit_mapping))) {
|
if (0 < rec_dump_verilog_spice_model_global_ports(fp, verilog_model, FALSE, FALSE, subckt_require_explicit_port_map)) {
|
||||||
fprintf(fp, ",\n");
|
fprintf(fp, ",\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* assert */
|
/* assert */
|
||||||
num_sram = count_num_sram_bits_one_spice_model(verilog_model, -1);
|
num_sram = count_num_sram_bits_one_spice_model(verilog_model, -1);
|
||||||
/* print ports --> input ports */
|
/* print ports --> input ports */
|
||||||
dump_verilog_pb_type_bus_ports(fp, port_prefix, 1, prim_pb_type, FALSE, FALSE, my_bool_to_boolean(is_explicit_mapping));
|
dump_verilog_pb_type_bus_ports(fp, port_prefix, 1, prim_pb_type, FALSE, FALSE,
|
||||||
|
subckt_require_explicit_port_map);
|
||||||
/* IOPADs requires a specical port to output */
|
/* IOPADs requires a specical port to output */
|
||||||
if (SPICE_MODEL_IOPAD == verilog_model->type) {
|
if (SPICE_MODEL_IOPAD == verilog_model->type) {
|
||||||
fprintf(fp, ",\n");
|
fprintf(fp, ",\n");
|
||||||
assert(1 == num_pad_port);
|
assert(1 == num_pad_port);
|
||||||
assert(NULL != pad_ports[0]);
|
assert(NULL != pad_ports[0]);
|
||||||
/* Add explicit port mapping if required */
|
/* Add explicit port mapping if required */
|
||||||
if (true == is_explicit_mapping) {
|
if (TRUE == subckt_require_explicit_port_map) {
|
||||||
fprintf(fp, ".%s(",
|
fprintf(fp, ".%s(",
|
||||||
pad_ports[0]->lib_name);
|
pad_ports[0]->lib_name);
|
||||||
}
|
}
|
||||||
/* Print inout port */
|
/* Print inout port */
|
||||||
fprintf(fp, "%s%s[%d]", gio_inout_prefix,
|
fprintf(fp, "%s%s[%d]", gio_inout_prefix,
|
||||||
verilog_model->prefix, verilog_model->cnt);
|
verilog_model->prefix, verilog_model->cnt);
|
||||||
if (true == is_explicit_mapping) {
|
if (TRUE == subckt_require_explicit_port_map) {
|
||||||
fprintf(fp, ")");
|
fprintf(fp, ")");
|
||||||
}
|
}
|
||||||
fprintf(fp, ", ");
|
fprintf(fp, ", ");
|
||||||
|
@ -263,7 +270,7 @@ void dump_verilog_pb_generic_primitive(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
case SPICE_SRAM_SCAN_CHAIN:
|
case SPICE_SRAM_SCAN_CHAIN:
|
||||||
/* Add explicit port mapping if required */
|
/* Add explicit port mapping if required */
|
||||||
if ( (0 < num_sram)
|
if ( (0 < num_sram)
|
||||||
&& (true == is_explicit_mapping)) {
|
&& (TRUE == subckt_require_explicit_port_map)) {
|
||||||
assert( 1 == num_sram_port);
|
assert( 1 == num_sram_port);
|
||||||
assert( NULL != sram_ports[0]);
|
assert( NULL != sram_ports[0]);
|
||||||
fprintf(fp, ".%s(",
|
fprintf(fp, ".%s(",
|
||||||
|
@ -273,7 +280,7 @@ void dump_verilog_pb_generic_primitive(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
cur_num_sram, cur_num_sram + num_sram - 1,
|
cur_num_sram, cur_num_sram + num_sram - 1,
|
||||||
0, VERILOG_PORT_CONKT);
|
0, VERILOG_PORT_CONKT);
|
||||||
if ( (0 < num_sram)
|
if ( (0 < num_sram)
|
||||||
&& (true == is_explicit_mapping)) {
|
&& (true == subckt_require_explicit_port_map)) {
|
||||||
fprintf(fp, ")");
|
fprintf(fp, ")");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,7 +291,7 @@ void dump_verilog_pb_generic_primitive(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
fprintf(fp, ", ");
|
fprintf(fp, ", ");
|
||||||
/* Add explicit port mapping if required */
|
/* Add explicit port mapping if required */
|
||||||
if ( (0 < num_sram)
|
if ( (0 < num_sram)
|
||||||
&& (true == is_explicit_mapping)) {
|
&& (TRUE == subckt_require_explicit_port_map)) {
|
||||||
assert( 1 == num_sram_port);
|
assert( 1 == num_sram_port);
|
||||||
assert( NULL != sram_ports[0]);
|
assert( NULL != sram_ports[0]);
|
||||||
fprintf(fp, ".%s(",
|
fprintf(fp, ".%s(",
|
||||||
|
@ -294,14 +301,14 @@ void dump_verilog_pb_generic_primitive(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
cur_num_sram, cur_num_sram + num_sram - 1,
|
cur_num_sram, cur_num_sram + num_sram - 1,
|
||||||
1, VERILOG_PORT_CONKT);
|
1, VERILOG_PORT_CONKT);
|
||||||
if ( (0 < num_sram)
|
if ( (0 < num_sram)
|
||||||
&& (true == is_explicit_mapping)) {
|
&& (TRUE == verilog_model->dump_explicit_port_map || is_explicit_mapping)) {
|
||||||
fprintf(fp, ")");
|
fprintf(fp, ")");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SPICE_SRAM_MEMORY_BANK:
|
case SPICE_SRAM_MEMORY_BANK:
|
||||||
/* Add explicit port mapping if required */
|
/* Add explicit port mapping if required */
|
||||||
if ( (0 < num_sram)
|
if ( (0 < num_sram)
|
||||||
&& (true == is_explicit_mapping)) {
|
&& (TRUE == subckt_require_explicit_port_map)) {
|
||||||
assert( 1 == num_sram_port);
|
assert( 1 == num_sram_port);
|
||||||
assert( NULL != sram_ports[0]);
|
assert( NULL != sram_ports[0]);
|
||||||
fprintf(fp, ".%s(",
|
fprintf(fp, ".%s(",
|
||||||
|
@ -311,7 +318,7 @@ void dump_verilog_pb_generic_primitive(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
cur_num_sram, cur_num_sram + num_sram - 1,
|
cur_num_sram, cur_num_sram + num_sram - 1,
|
||||||
0, VERILOG_PORT_CONKT);
|
0, VERILOG_PORT_CONKT);
|
||||||
if ( (0 < num_sram)
|
if ( (0 < num_sram)
|
||||||
&& (true == is_explicit_mapping)) {
|
&& (TRUE == subckt_require_explicit_port_map)) {
|
||||||
fprintf(fp, ")");
|
fprintf(fp, ")");
|
||||||
}
|
}
|
||||||
/* Check if we have an inverterd prefix */
|
/* Check if we have an inverterd prefix */
|
||||||
|
@ -321,7 +328,7 @@ void dump_verilog_pb_generic_primitive(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
fprintf(fp, ", ");
|
fprintf(fp, ", ");
|
||||||
/* Add explicit port mapping if required */
|
/* Add explicit port mapping if required */
|
||||||
if ( (0 < num_sram)
|
if ( (0 < num_sram)
|
||||||
&& (true == is_explicit_mapping)) {
|
&& (TRUE == subckt_require_explicit_port_map)) {
|
||||||
assert( 1 == num_sram_port);
|
assert( 1 == num_sram_port);
|
||||||
assert( NULL != sram_ports[0]);
|
assert( NULL != sram_ports[0]);
|
||||||
fprintf(fp, ".%s(",
|
fprintf(fp, ".%s(",
|
||||||
|
@ -331,7 +338,7 @@ void dump_verilog_pb_generic_primitive(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
cur_num_sram, cur_num_sram + num_sram - 1,
|
cur_num_sram, cur_num_sram + num_sram - 1,
|
||||||
1, VERILOG_PORT_CONKT);
|
1, VERILOG_PORT_CONKT);
|
||||||
if ( (0 < num_sram)
|
if ( (0 < num_sram)
|
||||||
&& (true == is_explicit_mapping)) {
|
&& (TRUE == subckt_require_explicit_port_map)) {
|
||||||
fprintf(fp, ")");
|
fprintf(fp, ")");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -594,6 +601,11 @@ void dump_verilog_pb_primitive_lut(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
num_sram = count_num_sram_bits_one_spice_model(verilog_model, -1);
|
num_sram = count_num_sram_bits_one_spice_model(verilog_model, -1);
|
||||||
cur_num_sram = get_sram_orgz_info_num_mem_bit(cur_sram_orgz_info);
|
cur_num_sram = get_sram_orgz_info_num_mem_bit(cur_sram_orgz_info);
|
||||||
|
|
||||||
|
/* Explicit port map support: turn it on when there is need for the full netlist or just standard cell */
|
||||||
|
boolean subckt_require_explicit_port_map = FALSE;
|
||||||
|
if ( (TRUE == verilog_model->dump_explicit_port_map) || (true == is_explicit_mapping) ) {
|
||||||
|
subckt_require_explicit_port_map = TRUE;
|
||||||
|
}
|
||||||
/* Call LUT subckt*/
|
/* Call LUT subckt*/
|
||||||
fprintf(fp, "%s %s_%d_ (", verilog_model->name, verilog_model->prefix, verilog_model->cnt);
|
fprintf(fp, "%s %s_%d_ (", verilog_model->name, verilog_model->prefix, verilog_model->cnt);
|
||||||
fprintf(fp, "\n");
|
fprintf(fp, "\n");
|
||||||
|
@ -602,13 +614,13 @@ void dump_verilog_pb_primitive_lut(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
* Only dump the global ports belonging to a spice_model
|
* Only dump the global ports belonging to a spice_model
|
||||||
* DISABLE recursive here !
|
* DISABLE recursive here !
|
||||||
*/
|
*/
|
||||||
if (0 < rec_dump_verilog_spice_model_global_ports(fp, verilog_model, FALSE, FALSE, my_bool_to_boolean(is_explicit_mapping))) {
|
if (0 < rec_dump_verilog_spice_model_global_ports(fp, verilog_model, FALSE, FALSE, subckt_require_explicit_port_map)) {
|
||||||
fprintf(fp, ",\n");
|
fprintf(fp, ",\n");
|
||||||
}
|
}
|
||||||
/* Connect inputs*/
|
/* Connect inputs*/
|
||||||
/* Connect outputs*/
|
/* Connect outputs*/
|
||||||
fprintf(fp, "//----- Input and output ports -----\n");
|
fprintf(fp, "//----- Input and output ports -----\n");
|
||||||
dump_verilog_pb_type_bus_ports(fp, port_prefix, 1, cur_pb_type, FALSE, TRUE, my_bool_to_boolean(is_explicit_mapping));
|
dump_verilog_pb_type_bus_ports(fp, port_prefix, 1, cur_pb_type, FALSE, TRUE, subckt_require_explicit_port_map);
|
||||||
fprintf(fp, "\n//----- SRAM ports -----\n");
|
fprintf(fp, "\n//----- SRAM ports -----\n");
|
||||||
|
|
||||||
/* check */
|
/* check */
|
||||||
|
@ -620,88 +632,88 @@ void dump_verilog_pb_primitive_lut(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
case SPICE_SRAM_STANDALONE:
|
case SPICE_SRAM_STANDALONE:
|
||||||
break;
|
break;
|
||||||
case SPICE_SRAM_SCAN_CHAIN:
|
case SPICE_SRAM_SCAN_CHAIN:
|
||||||
if (true == is_explicit_mapping) {
|
if (TRUE == subckt_require_explicit_port_map) {
|
||||||
fprintf(fp, ".sram_out( ");
|
fprintf(fp, ".sram_out( ");
|
||||||
}
|
}
|
||||||
dump_verilog_sram_one_local_outport(fp, cur_sram_orgz_info,
|
dump_verilog_sram_one_local_outport(fp, cur_sram_orgz_info,
|
||||||
cur_num_sram, cur_num_sram + num_lut_sram - 1,
|
cur_num_sram, cur_num_sram + num_lut_sram - 1,
|
||||||
0, VERILOG_PORT_CONKT);
|
0, VERILOG_PORT_CONKT);
|
||||||
if (true == is_explicit_mapping) {
|
if (TRUE == subckt_require_explicit_port_map) {
|
||||||
fprintf(fp, ")");
|
fprintf(fp, ")");
|
||||||
}
|
}
|
||||||
fprintf(fp, ", ");
|
fprintf(fp, ", ");
|
||||||
if (true == is_explicit_mapping) {
|
if (TRUE == subckt_require_explicit_port_map) {
|
||||||
fprintf(fp, ".sram_outb( ");
|
fprintf(fp, ".sram_outb( ");
|
||||||
}
|
}
|
||||||
dump_verilog_sram_one_local_outport(fp, cur_sram_orgz_info,
|
dump_verilog_sram_one_local_outport(fp, cur_sram_orgz_info,
|
||||||
cur_num_sram, cur_num_sram + num_lut_sram - 1,
|
cur_num_sram, cur_num_sram + num_lut_sram - 1,
|
||||||
1, VERILOG_PORT_CONKT);
|
1, VERILOG_PORT_CONKT);
|
||||||
if (true == is_explicit_mapping) {
|
if (TRUE == subckt_require_explicit_port_map) {
|
||||||
fprintf(fp, ")");
|
fprintf(fp, ")");
|
||||||
}
|
}
|
||||||
if (0 < num_mode_sram) {
|
if (0 < num_mode_sram) {
|
||||||
fprintf(fp, ", ");
|
fprintf(fp, ", ");
|
||||||
if (true == is_explicit_mapping) {
|
}
|
||||||
|
if (TRUE == subckt_require_explicit_port_map) {
|
||||||
fprintf(fp, ".mode_out( ");
|
fprintf(fp, ".mode_out( ");
|
||||||
}
|
}
|
||||||
dump_verilog_sram_one_local_outport(fp, cur_sram_orgz_info,
|
dump_verilog_sram_one_local_outport(fp, cur_sram_orgz_info,
|
||||||
cur_num_sram + num_lut_sram, cur_num_sram + num_lut_sram + num_mode_sram - 1,
|
cur_num_sram + num_lut_sram, cur_num_sram + num_lut_sram + num_mode_sram - 1,
|
||||||
0, VERILOG_PORT_CONKT);
|
0, VERILOG_PORT_CONKT);
|
||||||
if (true == is_explicit_mapping) {
|
if (TRUE == subckt_require_explicit_port_map) {
|
||||||
fprintf(fp, ")");
|
fprintf(fp, ")");
|
||||||
}
|
}
|
||||||
fprintf(fp, ", ");
|
fprintf(fp, ", ");
|
||||||
if (true == is_explicit_mapping) {
|
if (TRUE == subckt_require_explicit_port_map) {
|
||||||
fprintf(fp, ".mode_outb( ");
|
fprintf(fp, ".mode_outb( ");
|
||||||
}
|
}
|
||||||
dump_verilog_sram_one_local_outport(fp, cur_sram_orgz_info,
|
dump_verilog_sram_one_local_outport(fp, cur_sram_orgz_info,
|
||||||
cur_num_sram + num_lut_sram, cur_num_sram + num_lut_sram + num_mode_sram - 1,
|
cur_num_sram + num_lut_sram, cur_num_sram + num_lut_sram + num_mode_sram - 1,
|
||||||
1, VERILOG_PORT_CONKT);
|
1, VERILOG_PORT_CONKT);
|
||||||
if (true == is_explicit_mapping) {
|
if (TRUE == subckt_require_explicit_port_map) {
|
||||||
fprintf(fp, ")");
|
fprintf(fp, ")");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case SPICE_SRAM_MEMORY_BANK:
|
case SPICE_SRAM_MEMORY_BANK:
|
||||||
if (true == is_explicit_mapping) {
|
if (TRUE == subckt_require_explicit_port_map) {
|
||||||
fprintf(fp, ".sram_out( ");
|
fprintf(fp, ".sram_out( ");
|
||||||
}
|
}
|
||||||
dump_verilog_sram_one_outport(fp, cur_sram_orgz_info,
|
dump_verilog_sram_one_outport(fp, cur_sram_orgz_info,
|
||||||
cur_num_sram, cur_num_sram + num_lut_sram - 1,
|
cur_num_sram, cur_num_sram + num_lut_sram - 1,
|
||||||
0, VERILOG_PORT_CONKT);
|
0, VERILOG_PORT_CONKT);
|
||||||
if (true == is_explicit_mapping) {
|
if (TRUE == subckt_require_explicit_port_map) {
|
||||||
fprintf(fp, ")");
|
fprintf(fp, ")");
|
||||||
}
|
}
|
||||||
fprintf(fp, ", ");
|
fprintf(fp, ", ");
|
||||||
if (true == is_explicit_mapping) {
|
if (TRUE == subckt_require_explicit_port_map) {
|
||||||
fprintf(fp, ".sram_outb( ");
|
fprintf(fp, ".sram_outb( ");
|
||||||
}
|
}
|
||||||
dump_verilog_sram_one_outport(fp, cur_sram_orgz_info,
|
dump_verilog_sram_one_outport(fp, cur_sram_orgz_info,
|
||||||
cur_num_sram, cur_num_sram + num_lut_sram - 1,
|
cur_num_sram, cur_num_sram + num_lut_sram - 1,
|
||||||
1, VERILOG_PORT_CONKT);
|
1, VERILOG_PORT_CONKT);
|
||||||
if (true == is_explicit_mapping) {
|
if (TRUE == subckt_require_explicit_port_map) {
|
||||||
fprintf(fp, ")");
|
fprintf(fp, ")");
|
||||||
}
|
}
|
||||||
if (0 < num_mode_sram) {
|
if (0 < num_mode_sram) {
|
||||||
fprintf(fp, ", ");
|
fprintf(fp, ", ");
|
||||||
if (true == is_explicit_mapping) {
|
if (TRUE == subckt_require_explicit_port_map) {
|
||||||
fprintf(fp, ".mode_out( ");
|
fprintf(fp, ".mode_out( ");
|
||||||
}
|
}
|
||||||
dump_verilog_sram_one_outport(fp, cur_sram_orgz_info,
|
dump_verilog_sram_one_outport(fp, cur_sram_orgz_info,
|
||||||
cur_num_sram + num_lut_sram, cur_num_sram + num_lut_sram + num_mode_sram - 1,
|
cur_num_sram + num_lut_sram, cur_num_sram + num_lut_sram + num_mode_sram - 1,
|
||||||
0, VERILOG_PORT_CONKT);
|
0, VERILOG_PORT_CONKT);
|
||||||
if (true == is_explicit_mapping) {
|
if (TRUE == subckt_require_explicit_port_map) {
|
||||||
fprintf(fp, ")");
|
fprintf(fp, ")");
|
||||||
}
|
}
|
||||||
fprintf(fp, ", ");
|
fprintf(fp, ", ");
|
||||||
if (true == is_explicit_mapping) {
|
if (TRUE == subckt_require_explicit_port_map) {
|
||||||
fprintf(fp, ".mode_outb( ");
|
fprintf(fp, ".mode_outb( ");
|
||||||
}
|
}
|
||||||
dump_verilog_sram_one_outport(fp, cur_sram_orgz_info,
|
dump_verilog_sram_one_outport(fp, cur_sram_orgz_info,
|
||||||
cur_num_sram + num_lut_sram, cur_num_sram + num_lut_sram + num_mode_sram - 1,
|
cur_num_sram + num_lut_sram, cur_num_sram + num_lut_sram + num_mode_sram - 1,
|
||||||
1, VERILOG_PORT_CONKT);
|
1, VERILOG_PORT_CONKT);
|
||||||
}
|
}
|
||||||
if (true == is_explicit_mapping) {
|
if (TRUE == subckt_require_explicit_port_map) {
|
||||||
fprintf(fp, ")");
|
fprintf(fp, ")");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -667,10 +667,12 @@ void verilog_generate_sdc_constrain_one_cb_path(FILE* fp,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check */
|
/* Check */
|
||||||
assert ((INC_DIRECTION == src_rr_node->direction)
|
if (! ((CHANX == src_rr_node->type) ||(CHANY == src_rr_node->type)))
|
||||||
||(DEC_DIRECTION == src_rr_node->direction));
|
|
||||||
assert ((CHANX == src_rr_node->type)
|
assert ((CHANX == src_rr_node->type)
|
||||||
||(CHANY == src_rr_node->type));
|
||(CHANY == src_rr_node->type));
|
||||||
|
|
||||||
|
assert ((INC_DIRECTION == src_rr_node->direction)
|
||||||
|
||(DEC_DIRECTION == src_rr_node->direction));
|
||||||
assert (IPIN == des_rr_node->type);
|
assert (IPIN == des_rr_node->type);
|
||||||
|
|
||||||
fprintf(fp, "set_max_delay");
|
fprintf(fp, "set_max_delay");
|
||||||
|
@ -928,6 +930,13 @@ void verilog_generate_sdc_constrain_one_cb(FILE* fp,
|
||||||
for (size_t inode = 0; inode < rr_gsb.get_num_ipin_nodes(cb_ipin_side); ++inode) {
|
for (size_t inode = 0; inode < rr_gsb.get_num_ipin_nodes(cb_ipin_side); ++inode) {
|
||||||
t_rr_node* cur_ipin_node = rr_gsb.get_ipin_node(cb_ipin_side, inode);
|
t_rr_node* cur_ipin_node = rr_gsb.get_ipin_node(cb_ipin_side, inode);
|
||||||
for (int iedge = 0; iedge < cur_ipin_node->num_drive_rr_nodes; iedge++) {
|
for (int iedge = 0; iedge < cur_ipin_node->num_drive_rr_nodes; iedge++) {
|
||||||
|
/* Skip the drivers that are not CHANX or CHANY.
|
||||||
|
* OPINs should be handled by directlist
|
||||||
|
*/
|
||||||
|
if ( (CHANX != cur_ipin_node->drive_rr_nodes[iedge]->type)
|
||||||
|
&& (CHANY != cur_ipin_node->drive_rr_nodes[iedge]->type) ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
/* Get the switch delay */
|
/* Get the switch delay */
|
||||||
int switch_id = cur_ipin_node->drive_switches[iedge];
|
int switch_id = cur_ipin_node->drive_switches[iedge];
|
||||||
float switch_delay = get_switch_sdc_tmax (&(switch_inf[switch_id]));
|
float switch_delay = get_switch_sdc_tmax (&(switch_inf[switch_id]));
|
||||||
|
|
|
@ -902,8 +902,8 @@ int rec_dump_verilog_spice_model_global_ports(FILE* fp,
|
||||||
/* Add explicit port mapping if required */
|
/* Add explicit port mapping if required */
|
||||||
if (TRUE == require_explicit_port_map ) {
|
if (TRUE == require_explicit_port_map ) {
|
||||||
fprintf(fp, ".%s(",
|
fprintf(fp, ".%s(",
|
||||||
/* cur_spice_model_port->lib_name); /* Old version*/
|
cur_spice_model_port->lib_name);
|
||||||
cur_spice_model_port->prefix);
|
/*cur_spice_model_port->prefix);*/
|
||||||
}
|
}
|
||||||
fprintf(fp, "%s[0:%d]",
|
fprintf(fp, "%s[0:%d]",
|
||||||
cur_spice_model_port->prefix,
|
cur_spice_model_port->prefix,
|
||||||
|
|
Loading…
Reference in New Issue