Clean warnings in SDC generator and use RRSwitchBlock to replace old data structure sb_info
This commit is contained in:
parent
994b90ae53
commit
924136e7a2
|
@ -50,6 +50,8 @@
|
||||||
#include "verilog_sdc_pb_types.h"
|
#include "verilog_sdc_pb_types.h"
|
||||||
#include "verilog_include_netlists.h"
|
#include "verilog_include_netlists.h"
|
||||||
|
|
||||||
|
#include "verilog_api.h"
|
||||||
|
|
||||||
/***** Subroutines *****/
|
/***** Subroutines *****/
|
||||||
/* Alloc array that records Configuration bits for :
|
/* Alloc array that records Configuration bits for :
|
||||||
* (1) Switch blocks
|
* (1) Switch blocks
|
||||||
|
@ -284,8 +286,7 @@ void vpr_fpga_verilog(t_vpr_setup vpr_setup,
|
||||||
verilog_generate_sdc_pnr(sram_verilog_orgz_info, sdc_dir_path,
|
verilog_generate_sdc_pnr(sram_verilog_orgz_info, sdc_dir_path,
|
||||||
Arch, &vpr_setup.RoutingArch,
|
Arch, &vpr_setup.RoutingArch,
|
||||||
num_rr_nodes, rr_node, rr_node_indices, rr_indexed_data,
|
num_rr_nodes, rr_node, rr_node_indices, rr_indexed_data,
|
||||||
nx, ny, grid,
|
nx, ny);
|
||||||
vpr_setup.FPGA_SPICE_Opts.SynVerilogOpts);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* dump_verilog_sdc_file(); */
|
/* dump_verilog_sdc_file(); */
|
||||||
|
@ -384,10 +385,10 @@ void vpr_fpga_verilog(t_vpr_setup vpr_setup,
|
||||||
*/
|
*/
|
||||||
if (TRUE == vpr_setup.FPGA_SPICE_Opts.SynVerilogOpts.print_sdc_analysis) {
|
if (TRUE == vpr_setup.FPGA_SPICE_Opts.SynVerilogOpts.print_sdc_analysis) {
|
||||||
verilog_generate_sdc_analysis(sram_verilog_orgz_info, sdc_dir_path,
|
verilog_generate_sdc_analysis(sram_verilog_orgz_info, sdc_dir_path,
|
||||||
chomped_circuit_name, Arch, &vpr_setup.RoutingArch,
|
Arch,
|
||||||
num_rr_nodes, rr_node, rr_node_indices, rr_indexed_data,
|
num_rr_nodes, rr_node, rr_node_indices,
|
||||||
nx, ny, grid, block,
|
nx, ny, grid, block,
|
||||||
vpr_setup.FPGA_SPICE_Opts.SynVerilogOpts);
|
vpr_setup.FPGA_SPICE_Opts.compact_routing_hierarchy);
|
||||||
}
|
}
|
||||||
/* Output routing report_timing script :
|
/* Output routing report_timing script :
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -53,14 +53,17 @@ struct s_sdc_opts {
|
||||||
boolean break_loops_mux;
|
boolean break_loops_mux;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static
|
||||||
float get_switch_sdc_tmax (t_switch_inf* cur_switch_inf) {
|
float get_switch_sdc_tmax (t_switch_inf* cur_switch_inf) {
|
||||||
return cur_switch_inf->R * cur_switch_inf->Cout + cur_switch_inf->Tdel;
|
return cur_switch_inf->R * cur_switch_inf->Cout + cur_switch_inf->Tdel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
float get_routing_seg_sdc_tmax (t_segment_inf* cur_seg) {
|
float get_routing_seg_sdc_tmax (t_segment_inf* cur_seg) {
|
||||||
return cur_seg->Rmetal * cur_seg->Cmetal;
|
return cur_seg->Rmetal * cur_seg->Cmetal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
boolean is_rr_node_to_be_disable_for_analysis(t_rr_node* cur_rr_node) {
|
boolean is_rr_node_to_be_disable_for_analysis(t_rr_node* cur_rr_node) {
|
||||||
/* Conditions to enable timing analysis for a node
|
/* Conditions to enable timing analysis for a node
|
||||||
* 1st condition: it have a valid vpack_net_number
|
* 1st condition: it have a valid vpack_net_number
|
||||||
|
@ -79,6 +82,7 @@ boolean is_rr_node_to_be_disable_for_analysis(t_rr_node* cur_rr_node) {
|
||||||
/* TO avoid combinational loops caused by memories
|
/* TO avoid combinational loops caused by memories
|
||||||
* We disable all the timing paths starting from an output of memory cell
|
* We disable all the timing paths starting from an output of memory cell
|
||||||
*/
|
*/
|
||||||
|
static
|
||||||
void verilog_generate_sdc_break_loop_sram(FILE* fp,
|
void verilog_generate_sdc_break_loop_sram(FILE* fp,
|
||||||
t_sram_orgz_info* cur_sram_orgz_info) {
|
t_sram_orgz_info* cur_sram_orgz_info) {
|
||||||
t_spice_model* mem_model = NULL;
|
t_spice_model* mem_model = NULL;
|
||||||
|
@ -133,6 +137,7 @@ void verilog_generate_sdc_break_loop_sram(FILE* fp,
|
||||||
* used in FPGA architecture
|
* used in FPGA architecture
|
||||||
* Disable timing starting from any MUX outputs
|
* Disable timing starting from any MUX outputs
|
||||||
*/
|
*/
|
||||||
|
static
|
||||||
void verilog_generate_sdc_break_loop_mux(FILE* fp,
|
void verilog_generate_sdc_break_loop_mux(FILE* fp,
|
||||||
int num_switch,
|
int num_switch,
|
||||||
t_switch_inf* switches,
|
t_switch_inf* switches,
|
||||||
|
@ -208,6 +213,7 @@ void verilog_generate_sdc_break_loop_mux(FILE* fp,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
void verilog_generate_sdc_clock_period(t_sdc_opts sdc_opts,
|
void verilog_generate_sdc_clock_period(t_sdc_opts sdc_opts,
|
||||||
float critical_path_delay) {
|
float critical_path_delay) {
|
||||||
FILE* fp = NULL;
|
FILE* fp = NULL;
|
||||||
|
@ -294,6 +300,7 @@ void verilog_generate_sdc_clock_period(t_sdc_opts sdc_opts,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
void verilog_generate_sdc_break_loop_sb(FILE* fp,
|
void verilog_generate_sdc_break_loop_sb(FILE* fp,
|
||||||
int LL_nx, int LL_ny) {
|
int LL_nx, int LL_ny) {
|
||||||
int ix, iy;
|
int ix, iy;
|
||||||
|
@ -336,6 +343,7 @@ void verilog_generate_sdc_break_loop_sb(FILE* fp,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
void verilog_generate_sdc_break_loops(t_sram_orgz_info* cur_sram_orgz_info,
|
void verilog_generate_sdc_break_loops(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
t_sdc_opts sdc_opts,
|
t_sdc_opts sdc_opts,
|
||||||
int LL_nx, int LL_ny,
|
int LL_nx, int LL_ny,
|
||||||
|
@ -384,6 +392,7 @@ void verilog_generate_sdc_break_loops(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
/* Constrain a path within a Switch block,
|
/* Constrain a path within a Switch block,
|
||||||
* If this indicates a metal wire, we constraint to be 0 delay
|
* If this indicates a metal wire, we constraint to be 0 delay
|
||||||
*/
|
*/
|
||||||
|
static
|
||||||
void verilog_generate_sdc_constrain_one_sb_path(FILE* fp,
|
void verilog_generate_sdc_constrain_one_sb_path(FILE* fp,
|
||||||
t_sb* cur_sb_info,
|
t_sb* cur_sb_info,
|
||||||
t_rr_node* src_rr_node,
|
t_rr_node* src_rr_node,
|
||||||
|
@ -425,6 +434,7 @@ void verilog_generate_sdc_constrain_one_sb_path(FILE* fp,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
void verilog_generate_sdc_constrain_one_sb_mux(FILE* fp,
|
void verilog_generate_sdc_constrain_one_sb_mux(FILE* fp,
|
||||||
t_sb* cur_sb_info,
|
t_sb* cur_sb_info,
|
||||||
t_rr_node* wire_rr_node) {
|
t_rr_node* wire_rr_node) {
|
||||||
|
@ -460,6 +470,7 @@ void verilog_generate_sdc_constrain_one_sb_mux(FILE* fp,
|
||||||
/* Constrain a path within a Switch block,
|
/* Constrain a path within a Switch block,
|
||||||
* If this indicates a metal wire, we constraint to be 0 delay
|
* If this indicates a metal wire, we constraint to be 0 delay
|
||||||
*/
|
*/
|
||||||
|
static
|
||||||
void verilog_generate_sdc_constrain_one_cb_path(FILE* fp,
|
void verilog_generate_sdc_constrain_one_cb_path(FILE* fp,
|
||||||
t_cb* cur_cb_info,
|
t_cb* cur_cb_info,
|
||||||
t_rr_node* src_rr_node,
|
t_rr_node* src_rr_node,
|
||||||
|
@ -512,12 +523,9 @@ void verilog_generate_sdc_constrain_one_cb_path(FILE* fp,
|
||||||
|
|
||||||
|
|
||||||
/* Constrain the inputs and outputs of SBs, with the Switch delays */
|
/* Constrain the inputs and outputs of SBs, with the Switch delays */
|
||||||
void verilog_generate_sdc_constrain_sbs(t_sram_orgz_info* cur_sram_orgz_info,
|
static
|
||||||
t_sdc_opts sdc_opts,
|
void verilog_generate_sdc_constrain_sbs(t_sdc_opts sdc_opts,
|
||||||
int LL_nx, int LL_ny,
|
int LL_nx, int LL_ny) {
|
||||||
int num_switch,
|
|
||||||
t_switch_inf* switches,
|
|
||||||
t_spice* spice) {
|
|
||||||
FILE* fp = NULL;
|
FILE* fp = NULL;
|
||||||
int ix, iy;
|
int ix, iy;
|
||||||
int side, itrack;
|
int side, itrack;
|
||||||
|
@ -578,6 +586,7 @@ void verilog_generate_sdc_constrain_sbs(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
void verilog_generate_sdc_constrain_one_cb(FILE* fp,
|
void verilog_generate_sdc_constrain_one_cb(FILE* fp,
|
||||||
t_cb* cur_cb_info) {
|
t_cb* cur_cb_info) {
|
||||||
int side, side_cnt;
|
int side, side_cnt;
|
||||||
|
@ -625,12 +634,9 @@ void verilog_generate_sdc_constrain_one_cb(FILE* fp,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Constrain the inputs and outputs of Connection Blocks, with the Switch delays */
|
/* Constrain the inputs and outputs of Connection Blocks, with the Switch delays */
|
||||||
void verilog_generate_sdc_constrain_cbs(t_sram_orgz_info* cur_sram_orgz_info,
|
static
|
||||||
t_sdc_opts sdc_opts,
|
void verilog_generate_sdc_constrain_cbs(t_sdc_opts sdc_opts,
|
||||||
int LL_nx, int LL_ny,
|
int LL_nx, int LL_ny) {
|
||||||
int num_switch,
|
|
||||||
t_switch_inf* switches,
|
|
||||||
t_spice* spice) {
|
|
||||||
FILE* fp = NULL;
|
FILE* fp = NULL;
|
||||||
int ix, iy;
|
int ix, iy;
|
||||||
char* fname = my_strcat(sdc_opts.sdc_dir, sdc_constrain_cb_file_name);
|
char* fname = my_strcat(sdc_opts.sdc_dir, sdc_constrain_cb_file_name);
|
||||||
|
@ -679,6 +685,7 @@ void verilog_generate_sdc_constrain_cbs(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
void verilog_generate_sdc_constrain_one_chan(FILE* fp,
|
void verilog_generate_sdc_constrain_one_chan(FILE* fp,
|
||||||
t_rr_type chan_type,
|
t_rr_type chan_type,
|
||||||
int x, int y,
|
int x, int y,
|
||||||
|
@ -747,12 +754,12 @@ void verilog_generate_sdc_constrain_one_chan(FILE* fp,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
void verilog_generate_sdc_disable_one_unused_chan(FILE* fp,
|
void verilog_generate_sdc_disable_one_unused_chan(FILE* fp,
|
||||||
t_rr_type chan_type,
|
t_rr_type chan_type,
|
||||||
int x, int y,
|
int x, int y,
|
||||||
int LL_num_rr_nodes, t_rr_node* LL_rr_node,
|
int LL_num_rr_nodes, t_rr_node* LL_rr_node,
|
||||||
t_ivec*** LL_rr_node_indices,
|
t_ivec*** LL_rr_node_indices) {
|
||||||
t_rr_indexed_data* LL_rr_indexed_data) {
|
|
||||||
int chan_width = 0;
|
int chan_width = 0;
|
||||||
t_rr_node** chan_rr_nodes = NULL;
|
t_rr_node** chan_rr_nodes = NULL;
|
||||||
int itrack;
|
int itrack;
|
||||||
|
@ -813,14 +820,13 @@ void verilog_generate_sdc_disable_one_unused_chan(FILE* fp,
|
||||||
|
|
||||||
|
|
||||||
/* Constrain the inputs and outputs of Connection Blocks, with the Switch delays */
|
/* Constrain the inputs and outputs of Connection Blocks, with the Switch delays */
|
||||||
void verilog_generate_sdc_constrain_routing_channels(t_sram_orgz_info* cur_sram_orgz_info,
|
static
|
||||||
t_sdc_opts sdc_opts,
|
void verilog_generate_sdc_constrain_routing_channels(t_sdc_opts sdc_opts,
|
||||||
t_arch arch,
|
t_arch arch,
|
||||||
int LL_nx, int LL_ny,
|
int LL_nx, int LL_ny,
|
||||||
int LL_num_rr_nodes, t_rr_node* LL_rr_node,
|
int LL_num_rr_nodes, t_rr_node* LL_rr_node,
|
||||||
t_ivec*** LL_rr_node_indices,
|
t_ivec*** LL_rr_node_indices,
|
||||||
t_rr_indexed_data* LL_rr_indexed_data,
|
t_rr_indexed_data* LL_rr_indexed_data) {
|
||||||
t_spice* spice) {
|
|
||||||
FILE* fp = NULL;
|
FILE* fp = NULL;
|
||||||
int ix, iy;
|
int ix, iy;
|
||||||
char* fname = my_strcat(sdc_opts.sdc_dir, sdc_constrain_routing_chan_file_name);
|
char* fname = my_strcat(sdc_opts.sdc_dir, sdc_constrain_routing_chan_file_name);
|
||||||
|
@ -870,6 +876,7 @@ void verilog_generate_sdc_constrain_routing_channels(t_sram_orgz_info* cur_sram_
|
||||||
/* Disable the timing for all the global port
|
/* Disable the timing for all the global port
|
||||||
* Except the clock ports
|
* Except the clock ports
|
||||||
*/
|
*/
|
||||||
|
static
|
||||||
void verilog_generate_sdc_disable_global_ports(FILE* fp) {
|
void verilog_generate_sdc_disable_global_ports(FILE* fp) {
|
||||||
t_llist* temp = global_ports_head;
|
t_llist* temp = global_ports_head;
|
||||||
t_spice_model_port* cur_port = NULL;
|
t_spice_model_port* cur_port = NULL;
|
||||||
|
@ -912,6 +919,7 @@ void verilog_generate_sdc_disable_global_ports(FILE* fp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disable the timing for SRAM outputs */
|
/* Disable the timing for SRAM outputs */
|
||||||
|
static
|
||||||
void verilog_generate_sdc_disable_sram_orgz(FILE* fp,
|
void verilog_generate_sdc_disable_sram_orgz(FILE* fp,
|
||||||
t_sram_orgz_info* cur_sram_orgz_info) {
|
t_sram_orgz_info* cur_sram_orgz_info) {
|
||||||
|
|
||||||
|
@ -938,9 +946,10 @@ void verilog_generate_sdc_disable_sram_orgz(FILE* fp,
|
||||||
|
|
||||||
void verilog_generate_sdc_disable_unused_sbs_muxs(FILE* fp, int LL_nx, int LL_ny) {
|
void verilog_generate_sdc_disable_unused_sbs_muxs(FILE* fp, int LL_nx, int LL_ny) {
|
||||||
|
|
||||||
int ix, iy, side, itrack, imux;
|
int ix, iy, side, itrack, imux;
|
||||||
t_rr_node* cur_rr_node;
|
t_rr_node* cur_rr_node;
|
||||||
t_sb* cur_sb_info;
|
t_sb* cur_sb_info;
|
||||||
|
|
||||||
for (ix = 0; ix < (LL_nx + 1); ix++) {
|
for (ix = 0; ix < (LL_nx + 1); ix++) {
|
||||||
for (iy = 0; iy < (LL_ny + 1); iy++) {
|
for (iy = 0; iy < (LL_ny + 1); iy++) {
|
||||||
cur_sb_info = &(sb_info[ix][iy]);
|
cur_sb_info = &(sb_info[ix][iy]);
|
||||||
|
@ -969,7 +978,8 @@ t_sb* cur_sb_info;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void verilog_generate_sdc_disable_unused_cbs_muxs(FILE* fp) {
|
void verilog_generate_sdc_disable_unused_cbs_muxs(FILE* fp) {
|
||||||
|
@ -1037,11 +1047,69 @@ void verilog_generate_sdc_disable_unused_cbs_muxs(FILE* fp) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void verilog_generate_sdc_disable_unused_sbs(FILE* fp) {
|
||||||
|
/* Check the file handler */
|
||||||
|
if (NULL == fp) {
|
||||||
|
vpr_printf(TIO_MESSAGE_ERROR,
|
||||||
|
"(FILE:%s,LINE[%d])Invalid file handler for SDC generation",
|
||||||
|
__FILE__, __LINE__);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
DeviceCoordinator sb_range = device_rr_switch_block.get_switch_block_range();
|
||||||
|
/* We start from a SB[x][y] */
|
||||||
|
for (size_t ix = 0; ix < sb_range.get_x(); ++ix) {
|
||||||
|
for (size_t iy = 0; iy < sb_range.get_y(); ++iy) {
|
||||||
|
RRSwitchBlock rr_sb = device_rr_switch_block.get_switch_block(ix, iy);
|
||||||
|
/* Print comments */
|
||||||
|
fprintf(fp,
|
||||||
|
"##################################################\n");
|
||||||
|
fprintf(fp,
|
||||||
|
"### Disable Timing for an Switch block[%lu][%lu] ###\n",
|
||||||
|
ix, iy);
|
||||||
|
fprintf(fp,
|
||||||
|
"##################################################\n");
|
||||||
|
for (size_t side = 0; side < rr_sb.get_num_sides(); ++side) {
|
||||||
|
Side side_manager(side);
|
||||||
|
/* Disable Channel inputs and outputs*/
|
||||||
|
for (size_t itrack = 0; itrack < rr_sb.get_chan_width(side_manager.get_side()); ++itrack) {
|
||||||
|
assert((CHANX == rr_sb.get_chan_node(side_manager.get_side(), itrack)->type)
|
||||||
|
||(CHANY == rr_sb.get_chan_node(side_manager.get_side(), itrack)->type));
|
||||||
|
if (FALSE == is_rr_node_to_be_disable_for_analysis(rr_sb.get_chan_node(side_manager.get_side(), itrack))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
fprintf(fp, "set_disable_timing ");
|
||||||
|
fprintf(fp, "%s/",
|
||||||
|
rr_sb.gen_verilog_instance_name());
|
||||||
|
dump_verilog_one_sb_chan_pin(fp, rr_sb,
|
||||||
|
rr_sb.get_chan_node(side_manager.get_side(), itrack),
|
||||||
|
rr_sb.get_chan_node_direction(side_manager.get_side(), itrack));
|
||||||
|
fprintf(fp, "\n");
|
||||||
|
}
|
||||||
|
/* Disable OPINs*/
|
||||||
|
for (size_t inode = 0; inode < rr_sb.get_num_opin_nodes(side_manager.get_side()); ++inode) {
|
||||||
|
assert (OPIN == rr_sb.get_opin_node(side_manager.get_side(), inode)->type);
|
||||||
|
if (FALSE == is_rr_node_to_be_disable_for_analysis(rr_sb.get_opin_node(side_manager.get_side(), inode))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
fprintf(fp, "set_disable_timing ");
|
||||||
|
fprintf(fp, "%s/",
|
||||||
|
rr_sb.gen_verilog_instance_name());
|
||||||
|
dump_verilog_one_sb_routing_pin(fp, rr_sb,
|
||||||
|
rr_sb.get_opin_node(side_manager.get_side(), inode));
|
||||||
|
fprintf(fp, "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
void verilog_generate_sdc_disable_unused_sbs(FILE* fp,
|
void verilog_generate_sdc_disable_unused_sbs(FILE* fp,
|
||||||
int LL_nx, int LL_ny,
|
int LL_nx, int LL_ny) {
|
||||||
int num_switch,
|
|
||||||
t_switch_inf* switches,
|
|
||||||
t_spice* spice) {
|
|
||||||
int ix, iy;
|
int ix, iy;
|
||||||
int side, itrack, inode;
|
int side, itrack, inode;
|
||||||
t_sb* cur_sb_info = NULL;
|
t_sb* cur_sb_info = NULL;
|
||||||
|
@ -1103,6 +1171,7 @@ void verilog_generate_sdc_disable_unused_sbs(FILE* fp,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
void verilog_generate_sdc_disable_one_unused_cb(FILE* fp,
|
void verilog_generate_sdc_disable_one_unused_cb(FILE* fp,
|
||||||
t_cb* cur_cb_info) {
|
t_cb* cur_cb_info) {
|
||||||
int side, side_cnt;
|
int side, side_cnt;
|
||||||
|
@ -1157,11 +1226,9 @@ void verilog_generate_sdc_disable_one_unused_cb(FILE* fp,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
void verilog_generate_sdc_disable_unused_cbs(FILE* fp,
|
void verilog_generate_sdc_disable_unused_cbs(FILE* fp,
|
||||||
int LL_nx, int LL_ny,
|
int LL_nx, int LL_ny) {
|
||||||
int num_switch,
|
|
||||||
t_switch_inf* switches,
|
|
||||||
t_spice* spice) {
|
|
||||||
int ix, iy;
|
int ix, iy;
|
||||||
|
|
||||||
/* Check the file handler */
|
/* Check the file handler */
|
||||||
|
@ -1196,12 +1263,11 @@ void verilog_generate_sdc_disable_unused_cbs(FILE* fp,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Constrain the inputs and outputs of Connection Blocks, with the Switch delays */
|
/* Constrain the inputs and outputs of Connection Blocks, with the Switch delays */
|
||||||
|
static
|
||||||
void verilog_generate_sdc_disable_unused_routing_channels(FILE* fp,
|
void verilog_generate_sdc_disable_unused_routing_channels(FILE* fp,
|
||||||
t_arch arch,
|
|
||||||
int LL_nx, int LL_ny,
|
int LL_nx, int LL_ny,
|
||||||
int LL_num_rr_nodes, t_rr_node* LL_rr_node,
|
int LL_num_rr_nodes, t_rr_node* LL_rr_node,
|
||||||
t_ivec*** LL_rr_node_indices,
|
t_ivec*** LL_rr_node_indices) {
|
||||||
t_rr_indexed_data* LL_rr_indexed_data) {
|
|
||||||
int ix, iy;
|
int ix, iy;
|
||||||
|
|
||||||
/* Check the file handler */
|
/* Check the file handler */
|
||||||
|
@ -1218,7 +1284,7 @@ void verilog_generate_sdc_disable_unused_routing_channels(FILE* fp,
|
||||||
for (ix = 1; ix < (LL_nx + 1); ix++) {
|
for (ix = 1; ix < (LL_nx + 1); ix++) {
|
||||||
verilog_generate_sdc_disable_one_unused_chan(fp, CHANX, ix, iy,
|
verilog_generate_sdc_disable_one_unused_chan(fp, CHANX, ix, iy,
|
||||||
LL_num_rr_nodes, LL_rr_node,
|
LL_num_rr_nodes, LL_rr_node,
|
||||||
LL_rr_node_indices, LL_rr_indexed_data);
|
LL_rr_node_indices);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Y - channels [1...ny][0..nx]*/
|
/* Y - channels [1...ny][0..nx]*/
|
||||||
|
@ -1226,7 +1292,7 @@ void verilog_generate_sdc_disable_unused_routing_channels(FILE* fp,
|
||||||
for (iy = 1; iy < (LL_ny + 1); iy++) {
|
for (iy = 1; iy < (LL_ny + 1); iy++) {
|
||||||
verilog_generate_sdc_disable_one_unused_chan(fp, CHANY, ix, iy,
|
verilog_generate_sdc_disable_one_unused_chan(fp, CHANY, ix, iy,
|
||||||
LL_num_rr_nodes, LL_rr_node,
|
LL_num_rr_nodes, LL_rr_node,
|
||||||
LL_rr_node_indices, LL_rr_indexed_data);
|
LL_rr_node_indices);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1236,6 +1302,7 @@ void verilog_generate_sdc_disable_unused_routing_channels(FILE* fp,
|
||||||
/* Go recursively in the hierarchy
|
/* Go recursively in the hierarchy
|
||||||
* and disable all the pb_types
|
* and disable all the pb_types
|
||||||
*/
|
*/
|
||||||
|
static
|
||||||
void rec_verilog_generate_sdc_disable_unused_pb_types(FILE* fp,
|
void rec_verilog_generate_sdc_disable_unused_pb_types(FILE* fp,
|
||||||
char* prefix,
|
char* prefix,
|
||||||
t_pb_type* cur_pb_type) {
|
t_pb_type* cur_pb_type) {
|
||||||
|
@ -1288,6 +1355,7 @@ void rec_verilog_generate_sdc_disable_unused_pb_types(FILE* fp,
|
||||||
/* This block is totally unused.
|
/* This block is totally unused.
|
||||||
* We just go through each pb_type and disable all the ports using wildcards
|
* We just go through each pb_type and disable all the ports using wildcards
|
||||||
*/
|
*/
|
||||||
|
static
|
||||||
void verilog_generate_sdc_disable_one_unused_grid(FILE* fp,
|
void verilog_generate_sdc_disable_one_unused_grid(FILE* fp,
|
||||||
t_type_ptr cur_grid_type,
|
t_type_ptr cur_grid_type,
|
||||||
int block_x, int block_y,
|
int block_x, int block_y,
|
||||||
|
@ -1341,6 +1409,7 @@ void verilog_generate_sdc_disable_one_unused_grid(FILE* fp,
|
||||||
* This function will search the local_rr_graph of a phy_pb of the block
|
* This function will search the local_rr_graph of a phy_pb of the block
|
||||||
* And disable the unused resources in a SDC format
|
* And disable the unused resources in a SDC format
|
||||||
*/
|
*/
|
||||||
|
static
|
||||||
void verilog_generate_sdc_disable_one_unused_block(FILE* fp,
|
void verilog_generate_sdc_disable_one_unused_block(FILE* fp,
|
||||||
t_block* cur_block) {
|
t_block* cur_block) {
|
||||||
int inode;
|
int inode;
|
||||||
|
@ -1394,6 +1463,7 @@ void verilog_generate_sdc_disable_one_unused_block(FILE* fp,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
void verilog_generate_sdc_disable_unused_grids(FILE* fp,
|
void verilog_generate_sdc_disable_unused_grids(FILE* fp,
|
||||||
int LL_nx, int LL_ny,
|
int LL_nx, int LL_ny,
|
||||||
t_grid_tile** LL_grid,
|
t_grid_tile** LL_grid,
|
||||||
|
@ -1661,8 +1731,8 @@ void dump_sdc_pb_graph_pin_muxes (FILE* fp,
|
||||||
* We consider the top module in formal verification purpose here
|
* We consider the top module in formal verification purpose here
|
||||||
* which is easier
|
* which is easier
|
||||||
*/
|
*/
|
||||||
|
static
|
||||||
void verilog_generate_sdc_input_output_delays(FILE* fp,
|
void verilog_generate_sdc_input_output_delays(FILE* fp,
|
||||||
char* circuit_name,
|
|
||||||
float critical_path_delay) {
|
float critical_path_delay) {
|
||||||
int iopad_idx, iblock, iport;
|
int iopad_idx, iblock, iport;
|
||||||
int found_mapped_inpad;
|
int found_mapped_inpad;
|
||||||
|
@ -1791,8 +1861,7 @@ void verilog_generate_sdc_pnr(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
int LL_num_rr_nodes, t_rr_node* LL_rr_node,
|
int LL_num_rr_nodes, t_rr_node* LL_rr_node,
|
||||||
t_ivec*** LL_rr_node_indices,
|
t_ivec*** LL_rr_node_indices,
|
||||||
t_rr_indexed_data* LL_rr_indexed_data,
|
t_rr_indexed_data* LL_rr_indexed_data,
|
||||||
int LL_nx, int LL_ny, t_grid_tile** LL_grid,
|
int LL_nx, int LL_ny) {
|
||||||
t_syn_verilog_opts fpga_verilog_opts) {
|
|
||||||
t_sdc_opts sdc_opts;
|
t_sdc_opts sdc_opts;
|
||||||
|
|
||||||
/* Initialize */
|
/* Initialize */
|
||||||
|
@ -1818,27 +1887,22 @@ void verilog_generate_sdc_pnr(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
|
|
||||||
/* Part 3. Output routing constraints for Switch Blocks */
|
/* Part 3. Output routing constraints for Switch Blocks */
|
||||||
if (TRUE == sdc_opts.constrain_sbs) {
|
if (TRUE == sdc_opts.constrain_sbs) {
|
||||||
verilog_generate_sdc_constrain_sbs(cur_sram_orgz_info, sdc_opts,
|
verilog_generate_sdc_constrain_sbs(sdc_opts,
|
||||||
LL_nx, LL_ny,
|
LL_nx, LL_ny);
|
||||||
routing_arch->num_switch, switch_inf,
|
|
||||||
arch.spice);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Part 4. Output routing constraints for Connection Blocks */
|
/* Part 4. Output routing constraints for Connection Blocks */
|
||||||
if (TRUE == sdc_opts.constrain_cbs) {
|
if (TRUE == sdc_opts.constrain_cbs) {
|
||||||
verilog_generate_sdc_constrain_cbs(cur_sram_orgz_info, sdc_opts,
|
verilog_generate_sdc_constrain_cbs(sdc_opts,
|
||||||
LL_nx, LL_ny,
|
LL_nx, LL_ny);
|
||||||
routing_arch->num_switch, switch_inf,
|
|
||||||
arch.spice);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Part 5. Output routing constraints for Connection Blocks */
|
/* Part 5. Output routing constraints for Connection Blocks */
|
||||||
if (TRUE == sdc_opts.constrain_routing_channels) {
|
if (TRUE == sdc_opts.constrain_routing_channels) {
|
||||||
verilog_generate_sdc_constrain_routing_channels(cur_sram_orgz_info, sdc_opts, arch,
|
verilog_generate_sdc_constrain_routing_channels(sdc_opts, arch,
|
||||||
LL_nx, LL_ny,
|
LL_nx, LL_ny,
|
||||||
LL_num_rr_nodes, LL_rr_node,
|
LL_num_rr_nodes, LL_rr_node,
|
||||||
LL_rr_node_indices, LL_rr_indexed_data,
|
LL_rr_node_indices, LL_rr_indexed_data);
|
||||||
arch.spice);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Part 6. Output routing constraints for Programmable blocks */
|
/* Part 6. Output routing constraints for Programmable blocks */
|
||||||
|
@ -1853,15 +1917,12 @@ void verilog_generate_sdc_pnr(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
/* Output a SDC file to constrain a FPGA mapped with a benchmark */
|
/* Output a SDC file to constrain a FPGA mapped with a benchmark */
|
||||||
void verilog_generate_sdc_analysis(t_sram_orgz_info* cur_sram_orgz_info,
|
void verilog_generate_sdc_analysis(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
char* sdc_dir,
|
char* sdc_dir,
|
||||||
char* circuit_name,
|
|
||||||
t_arch arch,
|
t_arch arch,
|
||||||
t_det_routing_arch* routing_arch,
|
|
||||||
int LL_num_rr_nodes, t_rr_node* LL_rr_node,
|
int LL_num_rr_nodes, t_rr_node* LL_rr_node,
|
||||||
t_ivec*** LL_rr_node_indices,
|
t_ivec*** LL_rr_node_indices,
|
||||||
t_rr_indexed_data* LL_rr_indexed_data,
|
|
||||||
int LL_nx, int LL_ny, t_grid_tile** LL_grid,
|
int LL_nx, int LL_ny, t_grid_tile** LL_grid,
|
||||||
t_block* LL_block,
|
t_block* LL_block,
|
||||||
t_syn_verilog_opts fpga_verilog_opts) {
|
boolean compact_routing_hierarchy) {
|
||||||
FILE* fp = NULL;
|
FILE* fp = NULL;
|
||||||
char* fname = my_strcat(sdc_dir, sdc_analysis_file_name);
|
char* fname = my_strcat(sdc_dir, sdc_analysis_file_name);
|
||||||
|
|
||||||
|
@ -1881,7 +1942,7 @@ void verilog_generate_sdc_analysis(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
dump_verilog_sdc_file_header(fp, "Constrain for Timing/Power analysis on the mapped FPGA");
|
dump_verilog_sdc_file_header(fp, "Constrain for Timing/Power analysis on the mapped FPGA");
|
||||||
|
|
||||||
/* Create clock and set input/output delays */
|
/* Create clock and set input/output delays */
|
||||||
verilog_generate_sdc_input_output_delays(fp, circuit_name,
|
verilog_generate_sdc_input_output_delays(fp,
|
||||||
arch.spice->spice_params.stimulate_params.vpr_crit_path_delay);
|
arch.spice->spice_params.stimulate_params.vpr_crit_path_delay);
|
||||||
|
|
||||||
/* Disable the timing for global ports */
|
/* Disable the timing for global ports */
|
||||||
|
@ -1892,20 +1953,20 @@ void verilog_generate_sdc_analysis(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
|
|
||||||
/* Disable timing for un-used resources */
|
/* Disable timing for un-used resources */
|
||||||
/* Apply to Routing Channels */
|
/* Apply to Routing Channels */
|
||||||
verilog_generate_sdc_disable_unused_routing_channels(fp, arch, LL_nx, LL_ny,
|
verilog_generate_sdc_disable_unused_routing_channels(fp, LL_nx, LL_ny,
|
||||||
LL_num_rr_nodes, LL_rr_node,
|
LL_num_rr_nodes, LL_rr_node,
|
||||||
LL_rr_node_indices, LL_rr_indexed_data);
|
LL_rr_node_indices);
|
||||||
|
|
||||||
/* Apply to Connection blocks */
|
/* Apply to Connection blocks */
|
||||||
verilog_generate_sdc_disable_unused_cbs(fp, LL_nx, LL_ny,
|
verilog_generate_sdc_disable_unused_cbs(fp, LL_nx, LL_ny);
|
||||||
routing_arch->num_switch, switch_inf,
|
|
||||||
arch.spice);
|
|
||||||
verilog_generate_sdc_disable_unused_cbs_muxs(fp);
|
verilog_generate_sdc_disable_unused_cbs_muxs(fp);
|
||||||
|
|
||||||
/* Apply to Switch blocks */
|
/* Apply to Switch blocks */
|
||||||
verilog_generate_sdc_disable_unused_sbs(fp, LL_nx, LL_ny,
|
if (TRUE == compact_routing_hierarchy) {
|
||||||
routing_arch->num_switch, switch_inf,
|
verilog_generate_sdc_disable_unused_sbs(fp);
|
||||||
arch.spice);
|
} else {
|
||||||
|
verilog_generate_sdc_disable_unused_sbs(fp, LL_nx, LL_ny);
|
||||||
|
}
|
||||||
|
|
||||||
verilog_generate_sdc_disable_unused_sbs_muxs(fp, LL_nx, LL_ny);
|
verilog_generate_sdc_disable_unused_sbs_muxs(fp, LL_nx, LL_ny);
|
||||||
|
|
||||||
|
|
|
@ -6,20 +6,16 @@ void verilog_generate_sdc_pnr(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
int LL_num_rr_nodes, t_rr_node* LL_rr_node,
|
int LL_num_rr_nodes, t_rr_node* LL_rr_node,
|
||||||
t_ivec*** LL_rr_node_indices,
|
t_ivec*** LL_rr_node_indices,
|
||||||
t_rr_indexed_data* LL_rr_indexed_data,
|
t_rr_indexed_data* LL_rr_indexed_data,
|
||||||
int LL_nx, int LL_ny, t_grid_tile** LL_grid,
|
int LL_nx, int LL_ny);
|
||||||
t_syn_verilog_opts fpga_verilog_opts);
|
|
||||||
|
|
||||||
void verilog_generate_sdc_analysis(t_sram_orgz_info* cur_sram_orgz_info,
|
void verilog_generate_sdc_analysis(t_sram_orgz_info* cur_sram_orgz_info,
|
||||||
char* sdc_dir,
|
char* sdc_dir,
|
||||||
char* circuit_name,
|
|
||||||
t_arch arch,
|
t_arch arch,
|
||||||
t_det_routing_arch* routing_arch,
|
|
||||||
int LL_num_rr_nodes, t_rr_node* LL_rr_node,
|
int LL_num_rr_nodes, t_rr_node* LL_rr_node,
|
||||||
t_ivec*** LL_rr_node_indices,
|
t_ivec*** LL_rr_node_indices,
|
||||||
t_rr_indexed_data* LL_rr_indexed_data,
|
|
||||||
int LL_nx, int LL_ny, t_grid_tile** LL_grid,
|
int LL_nx, int LL_ny, t_grid_tile** LL_grid,
|
||||||
t_block* LL_block,
|
t_block* LL_block,
|
||||||
t_syn_verilog_opts fpga_verilog_opts);
|
boolean compact_routing_hierarchy);
|
||||||
|
|
||||||
void verilog_generate_sdc_disable_unused_sbs_muxs(FILE* fp, int LL_nx, int LL_ny);
|
void verilog_generate_sdc_disable_unused_sbs_muxs(FILE* fp, int LL_nx, int LL_ny);
|
||||||
|
|
||||||
|
@ -31,23 +27,23 @@ void verilog_generate_sdc_disable_unused_grids_muxs(FILE* fp,
|
||||||
t_block* LL_block);
|
t_block* LL_block);
|
||||||
|
|
||||||
void dump_sdc_one_clb_muxes(FILE* fp,
|
void dump_sdc_one_clb_muxes(FILE* fp,
|
||||||
char* grid_instance_name,
|
char* grid_instance_name,
|
||||||
t_rr_graph* rr_graph,
|
t_rr_graph* rr_graph,
|
||||||
t_pb_graph_node* pb_graph_head);
|
t_pb_graph_node* pb_graph_head);
|
||||||
|
|
||||||
|
|
||||||
void dump_sdc_rec_one_pb_muxes(FILE* fp,
|
void dump_sdc_rec_one_pb_muxes(FILE* fp,
|
||||||
char* grid_instance_name,
|
char* grid_instance_name,
|
||||||
t_rr_graph* rr_graph,
|
t_rr_graph* rr_graph,
|
||||||
t_pb_graph_node* cur_pb_graph_node);
|
t_pb_graph_node* cur_pb_graph_node);
|
||||||
|
|
||||||
void dump_sdc_pb_graph_node_muxes(FILE* fp,
|
void dump_sdc_pb_graph_node_muxes(FILE* fp,
|
||||||
char* grid_instance_name,
|
char* grid_instance_name,
|
||||||
t_rr_graph* rr_graph,
|
t_rr_graph* rr_graph,
|
||||||
t_pb_graph_node* cur_pb_graph_node);
|
t_pb_graph_node* cur_pb_graph_node);
|
||||||
|
|
||||||
void dump_sdc_pb_graph_pin_muxes (FILE* fp,
|
void dump_sdc_pb_graph_pin_muxes(FILE* fp,
|
||||||
char* grid_instance_name,
|
char* grid_instance_name,
|
||||||
t_rr_graph* rr_graph,
|
t_rr_graph* rr_graph,
|
||||||
t_pb_graph_pin pb_graph_pin);
|
t_pb_graph_pin pb_graph_pin);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue