blob: 99c8bdeca61fc4d3b5d8b2bea3bee6c320286463 [file] [log] [blame]
/************** Global variables shared only by the rr_* modules. ************/
extern boolean *rr_edge_done; /* [0..num_rr_nodes-1]. Used to keep track *
* of whether or not a node has been put in *
* an edge list yet. */
/******************* Subroutines exported by rr_graph2.c *********************/
struct s_ivec ***alloc_and_load_rr_node_indices(IN int nodes_per_chan,
IN int nx,
IN int ny,
INOUT int *index,
IN t_seg_details *
seg_details);
void free_rr_node_indices(IN t_ivec *** rr_node_indices);
int get_rr_node_index(int x,
int y,
t_rr_type rr_type,
int ptc,
t_ivec *** rr_node_indices);
void free_seg_details(t_seg_details * seg_details,
int nodes_per_chan);
t_seg_details *alloc_and_load_seg_details(INOUT int *nodes_per_chan,
IN int max_len,
IN int num_seg_types,
IN t_segment_inf * segment_inf,
IN boolean use_full_seg_groups,
IN boolean is_global_graph,
IN enum e_directionality
directionality);
void dump_seg_details(t_seg_details * seg_details,
int nodes_per_chan,
char *fname);
int get_seg_start(IN t_seg_details * seg_details,
IN int itrack,
IN int chan_num,
IN int seg_num);
int get_seg_end(IN t_seg_details * seg_details,
IN int itrack,
IN int istart,
IN int chan_num,
IN int seg_max);
boolean is_cbox(IN int chan,
IN int seg,
IN int track,
IN t_seg_details * seg_details,
IN enum e_directionality directionality);
boolean is_sbox(IN int chan,
IN int wire_seg,
IN int sb_seg,
IN int track,
IN t_seg_details * seg_details,
IN enum e_directionality directionality);
int get_bidir_opin_connections(IN int i,
IN int j,
IN int ipin,
IN struct s_linked_edge **edge_list,
IN int *****opin_to_track_map,
IN int Fc,
IN boolean * rr_edge_done,
IN t_ivec *** rr_node_indices,
IN t_seg_details * seg_details);
int get_unidir_opin_connections(IN int chan,
IN int seg,
IN int Fc,
IN t_rr_type chan_type,
IN t_seg_details * seg_details,
INOUT t_linked_edge ** edge_list_ptr,
INOUT int **Fc_ofs,
INOUT boolean * rr_edge_done,
IN int max_len,
IN int nodes_per_chan,
IN t_ivec *** rr_node_indices,
OUT boolean * Fc_clipped);
int get_track_to_ipins(int seg,
int chan,
int track,
t_linked_edge ** edge_list_ptr,
t_ivec *** rr_node_indices,
struct s_ivec ****track_to_ipin_lookup,
t_seg_details * seg_details,
enum e_rr_type chan_type,
int chan_length,
int wire_to_ipin_switch,
enum e_directionality directionality);
int get_track_to_tracks(IN int from_chan,
IN int from_seg,
IN int from_track,
IN t_rr_type from_type,
IN int to_seg,
IN t_rr_type to_type,
IN int chan_len,
IN int nodes_per_chan,
IN int *opin_mux_size,
IN int Fs_per_side,
IN short *****sblock_pattern,
INOUT struct s_linked_edge **edge_list,
IN t_seg_details * seg_details,
IN enum e_directionality directionality,
IN t_ivec *** rr_node_indices,
INOUT boolean * rr_edge_done,
IN struct s_ivec ***switch_block_conn);
short *****alloc_sblock_pattern_lookup(IN int nx,
IN int ny,
IN int nodes_per_chan);
void free_sblock_pattern_lookup(INOUT short *****sblock_pattern);
void load_sblock_pattern_lookup(IN int i,
IN int j,
IN int nodes_per_chan,
IN t_seg_details * seg_details,
IN int Fs,
IN enum e_switch_block_type switch_block_type,
INOUT short *****sblock_pattern);