blob: f55a64f7f9fac40c87b79bd4e6308c61ba33a6e7 [file] [log] [blame]
#ifndef RR_GRAPH_H
#define RR_GRAPH_H
/* Include track buffers or not. Track buffers isolate the tracks from the
* input connection block. However, they are difficult to lay out in practice,
* and so are not currently used in commercial architectures. */
#define INCLUDE_TRACK_BUFFERS false
#include "device_grid.h"
enum e_graph_type {
GRAPH_GLOBAL, /* One node per channel with wire capacity > 1 and full connectivity */
GRAPH_BIDIR, /* Detailed bidirectional graph */
GRAPH_UNIDIR, /* Detailed unidir graph, untilable */
/* RESEARCH TODO: Get this option debugged */
GRAPH_UNIDIR_TILEABLE /* Detail unidir graph with wire groups multiples of 2*L */
};
typedef enum e_graph_type t_graph_type;
/* Warnings about the routing graph that can be returned.
* This is to avoid output messages during a value sweep */
enum {
RR_GRAPH_NO_WARN = 0x00,
RR_GRAPH_WARN_FC_CLIPPED = 0x01,
RR_GRAPH_WARN_CHAN_WIDTH_CHANGED = 0x02
};
void create_rr_graph(const t_graph_type graph_type,
const std::vector<t_physical_tile_type>& block_types,
const DeviceGrid& grid,
t_chan_width nodes_per_chan,
const int num_arch_switches,
t_det_routing_arch* det_routing_arch,
std::vector<t_segment_inf>& segment_inf,
const enum e_base_cost_type base_cost_type,
const bool trim_empty_channels,
const bool trim_obs_channels,
const enum e_clock_modeling clock_modeling,
const t_direct_inf* directs,
const int num_directs,
int* Warnings);
void free_rr_graph();
//Returns a brief one-line summary of an RR node
std::string describe_rr_node(int inode);
void init_fan_in(std::vector<t_rr_node>& L_rr_node, const int num_rr_nodes);
// Sets the spec for the rr_switch based on the arch switch
void load_rr_switch_from_arch_switch(int arch_switch_idx,
int rr_switch_idx,
int fanin,
const float R_minW_nmos,
const float R_minW_pmos);
t_non_configurable_rr_sets identify_non_configurable_rr_sets();
#endif