VPR-7.0
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
vpr_types.h
Go to the documentation of this file.
1 /* This is a core file that defines the major data types used by VPR
2 
3  This file is divided into generally 4 major sections:
4 
5  1. Global data types and constants
6  2. Packing specific data types
7  3. Placement specific data types
8  4. Routing specific data types
9 
10  Key background file:
11 
12  An understanding of libvpr/physical_types.h is crucial to understanding this file. physical_types.h contains information about the architecture described in the architecture description language
13 
14  Key data structures:
15 
16  logical_block - One node in the input technology-mapped netlist
17  net - Connectivity data structure for the user netlist
18  block - An already clustered logic block
19  rr_node - The basic building block of the interconnect in the FPGA architecture
20 
21  Cluster-specific main data structure:
22 
23  t_pb: Stores the mapping between the user netlist and the logic blocks on the FPGA achitecture. For example, if a user design has 10 clusters of 5 LUTs each, you will have 10 t_pb instances of type cluster and within each of those clusters another 5 t_pb instances of type LUT.
24  The t_pb hierarchy follows what is described by t_pb_graph_node
25 
26  Each top-level pb stores the entire routing resource graph (rr_graph). The traceback information is included in this rr_graph so if you needed to determine connectivity down to the wire level, this is the data structure that you would traverse.
27  The rr_graph is generated based on the pb_graph_node netlist of that pb. Each pb_graph_node has a member variable called pin_count that serves as the index for the rr_node (in retrospect, I should have used rr_node_index instead of pin_count for the member variable to be more descriptive).
28  This makes it easy to identify which rr_node corresponds to which pb_graph_pin. Additional sources and sinks are generated at the inputs and outputs of the complex logic block to match with what has already been packed into the cluster.
29 
30 
31  */
32 
33 #ifndef VPR_TYPES_H
34 #define VPR_TYPES_H
35 
36 #include "arch_types.h"
37 #include <map>
38 
39 /*******************************************************************************
40  * Global data types and constants
41  ******************************************************************************/
42 typedef struct s_power_opts t_power_opts;
43 typedef struct s_net_power t_net_power;
44 
45 #ifndef SPEC
46 #define DEBUG 1 /* Echoes input & checks error conditions */
47 /* Only causes about a 1% speed degradation in V 3.10 */
48 #endif
49 
50 /*#define CREATE_ECHO_FILES*//* prints echo files */
51 /*#define DEBUG_FAILED_PACKING_CANDIDATES*//*Displays candidates during packing that failed */
52 /*#define PRINT_SINK_DELAYS*//*prints the sink delays to files */
53 /*#define PRINT_SLACKS*//*prints out all slacks in the circuit */
54 /*#define PRINT_PLACE_CRIT_PATH*//*prints out placement estimated critical path */
55 /*#define PRINT_NET_DELAYS*//*prints out delays for all connections */
56 /*#define PRINT_TIMING_GRAPH*//*prints out the timing graph */
57 /*#define PRINT_REL_POS_DISTR *//*prints out the relative distribution graph for placements */
58 /*#define DUMP_BLIF_ECHO*//*dump blif of internal representation of user circuit. Useful for ensuring functional correctness via logical equivalence with input blif*/
59 /*#define HACK_LUT_PIN_SWAPPING*//* Hack to enable LUT input pin swapping for delay purposes */
60 
61 #ifdef SPEC
62 #define NO_GRAPHICS /* Rips out graphics (for non-X11 systems) */
63 #define NDEBUG /* Turns off assertion checking for extra speed */
64 #endif
65 
66 #define TOKENS " \t\n" /* Input file parsing. */
67 
68 /*#define VERBOSE 1*//* Prints all sorts of intermediate data */
69 
70 typedef size_t bitfield;
71 
72 #define MINOR 0 /* For update_screen. Denotes importance of update. */
73 #define MAJOR 1
74 
75 #define MAX_SHORT 32767
76 
77 /* Values large enough to be way out of range for any data, but small enough
78  to allow a small number to be added to them without going out of range. */
79 #define HUGE_POSITIVE_FLOAT 1.e30
80 #define HUGE_NEGATIVE_FLOAT -1.e30
81 
82 /* Used to avoid floating-point errors when comparing values close to 0 */
83 #define EPSILON 1.e-15
84 #define NEGATIVE_EPSILON -1.e-15
85 
86 #define HIGH_FANOUT_NET_LIM 64 /* All nets with this number of sinks or more are considered high fanout nets */
87 
88 #define FIRST_ITER_WIRELENTH_LIMIT 0.85 /* If used wirelength exceeds this value in first iteration of routing, do not route */
89 
90 #define EMPTY -1
91 
92 /*******************************************************************************
93  * Packing specific data types and constants
94  * Packing takes the circuit described in the technology mapped user netlist
95  * and maps it to the complex logic blocks found in the arhictecture
96  ******************************************************************************/
97 
98 #define NO_CLUSTER -1
99 #define NEVER_CLUSTER -2
100 #define NOT_VALID -10000 /* Marks gains that aren't valid */
101 /* Ensure no gain can ever be this negative! */
102 #ifndef UNDEFINED
103 #define UNDEFINED -1
104 #endif
105 
106 /* netlist blocks are assigned one of these types */
109 };
110 
111 /* Selection algorithm for selecting next seed */
114 };
115 
118 };
119 
120 struct s_rr_node;
121 /* defined later, but need to declare here because it is used */
122 struct s_pack_molecule;
123 /* defined later, but need to declare here because it is used */
124 
125 /* Stores statistical information for pb such as cost information */
126 typedef struct s_pb_stats {
127  /* Packing statistics */
128  std::map<int, float> gain; /* Attraction (inverse of cost) function */
129 
130  std::map<int, float> timinggain; /* [0..num_logical_blocks-1]. The timing criticality score of this logical_block.
131  Determined by the most critical vpack_net between this logical_block and any logical_block in the current pb */
132  std::map<int, float> connectiongain; /* [0..num_logical_blocks-1] Weighted sum of connections to attraction function */
133  std::map<int, float> prevconnectiongainincr; /* [0..num_logical_blocks-1] Prev sum to weighted sum of connections to attraction function */
134  std::map<int, float> sharinggain; /* [0..num_logical_blocks-1]. How many nets on this logical_block are already in the pb under consideration */
135 
136  /* [0..num_logical_blocks-1]. This is the gain used for hill-climbing. It stores*
137  * the reduction in the number of pins that adding this logical_block to the the*
138  * current pb will have. This reflects the fact that sometimes the *
139  * addition of a logical_block to a pb may reduce the number of inputs *
140  * required if it shares inputs with all other BLEs and it's output is *
141  * used by all other child pbs in this parent pb. */
142  std::map<int, float> hillgain;
143 
144  /* [0..num_marked_nets] and [0..num_marked_blocks] respectively. List *
145  * the indices of the nets and blocks that have had their num_pins_of_ *
146  * net_in_pb and gain entries altered. */
150 
151  int tie_break_high_fanout_net; /* If no marked candidate atoms, use this high fanout net to determine the next candidate atom */
152 
153  /* [0..num_logical_nets-1]. How many pins of each vpack_net are contained in the *
154  * currently open pb? */
155  std::map<int, int> num_pins_of_net_in_pb;
156 
157  /* Record of pins of class used TODO: Jason Luu: Should really be using hash table for this for speed, too lazy to write one now, performance isn't too bad since I'm at most iterating over the number of pins of a pb which is effectively a constant for reasonable architectures */
158  int **input_pins_used; /* [0..pb_graph_node->num_pin_classes-1][0..pin_class_size] number of input pins of this class that are used */
159  int **output_pins_used; /* [0..pb_graph_node->num_pin_classes-1][0..pin_class_size] number of output pins of this class that are used */
160 
161  int **lookahead_input_pins_used; /* [0..pb_graph_node->num_pin_classes-1][0..pin_class_size] number of input pins of this class that are speculatively used */
162  int **lookahead_output_pins_used; /* [0..pb_graph_node->num_pin_classes-1][0..pin_class_size] number of output pins of this class that are speculatively used */
163 
164  /* Array of feasible blocks to select from [0..max_array_size-1]
165  Sorted in ascending gain order so that the last block is the most desirable (this makes it easy to pop blocks off the list
166  */
168  int num_feasible_blocks; /* [0..num_marked_models-1] */
169 } t_pb_stats;
170 
171 /* An FPGA complex block is represented by a hierarchy of physical blocks.
172  These include leaf physical blocks that a netlist block can map to (such as LUTs, flip-flops, memory slices, etc),
173  parent physical blocks that contain children physical blocks (such as a BLE) that may be leaves or parents of other physical blocks,
174  and the top-level phyiscal block which represents the complex block itself (such as a clustered logic block).
175 
176  All physical blocks are represented by this s_pb data structure.
177  */
178 typedef struct s_pb {
179  char *name; /* Name of this physical block */
180  t_pb_graph_node *pb_graph_node; /* pointer to pb_graph_node this pb corresponds to */
181  int logical_block; /* If this is a terminating pb, gives the logical (netlist) block that it contains */
182 
183  int mode; /* mode that this pb is set to */
184 
185  struct s_pb **child_pbs; /* children pbs attached to this pb [0..num_child_pb_types - 1][0..child_type->num_pb - 1] */
186  struct s_pb *parent_pb; /* pointer to parent node */
187 
188  struct s_rr_node *rr_graph; /* pointer to rr_graph connecting pbs of cluster */
189  struct s_pb **rr_node_to_pb_mapping; /* [0..num_local_rr_nodes-1] pointer look-up of which pb this rr_node belongs based on index, NULL if pb does not exist */
190  struct s_pb_stats *pb_stats; /* statistics for current pb */
191 
192  struct s_net *local_nets; /* Records post-packing connections, valid only for top-level */
193  int num_local_nets; /* Records post-packing connections, valid only for top-level */
194 
195  int clock_net; /* Records clock net driving a flip-flop, valid only for lowest-level, flip-flop PBs */
196 
197  int *lut_pin_remap; /* [0..num_lut_inputs-1] applies only to LUT primitives, stores how LUT inputs were swapped during CAD flow,
198  LUT inputs can be swapped by changing the logic in the LUT, this is useful because the fastest LUT input compared to the slowest is often significant (2-5x),
199  so this optimization is crucial for handling LUT based FPGAs.
200  */
201 } t_pb;
202 
203 struct s_tnode;
204 
205 /* Technology-mapped user netlist block */
206 typedef struct s_logical_block {
207  char *name; /* Taken from the first vpack_net which it drives. */
208  enum logical_block_types type; /* I/O, combinational logic, or latch */
209  t_model* model; /* Technology-mapped type (eg. LUT, Flip-flop, memory slice, inpad, etc) */
210 
211  int **input_nets; /* [0..num_input_ports-1][0..num_port_pins-1] List of input nets connected to this logical_block. */
212  int **output_nets; /* [0..num_output_ports-1][0..num_port_pins-1] List of output nets connected to this logical_block. */
213  int clock_net; /* Clock net connected to this logical_block. */
214 
215  int used_input_pins; /* Number of used input pins */
216 
217  int clb_index; /* Complex block index that this logical block got mapped to */
218 
219  int index; /* Index in array that this block can be found */
220  t_pb* pb; /* pb primitive that this block is packed into */
221 
222  /* timing information */
223  struct s_tnode ***input_net_tnodes; /* [0..num_input_ports-1][0..num_pins -1] correspnding input net tnode */
224  struct s_tnode ***output_net_tnodes; /* [0..num_output_ports-1][0..num_pins -1] correspnding output net tnode */
225  struct s_tnode *clock_net_tnode; /* correspnding clock net tnode */
226 
227  struct s_linked_vptr *truth_table; /* If this is a LUT (.names), then this is the logic that the LUT implements */
228  struct s_linked_vptr *packed_molecules; /* List of t_pack_molecules that this logical block is a part of */
229 
230  t_pb_graph_node *expected_lowest_cost_primitive; /* predicted ideal primitive to use for this logical block */
232 
235 };
236 
237 /**
238  * Represents a grouping of logical_blocks that match a pack_pattern, these groups are intended to be placed as a single unit during packing
239  * Store in linked list
240  *
241  * A chain is a special type of pack pattern. A chain can extend across multiple logic blocks. Must segment the chain to fit in a logic block by identifying the actual atom that forms the root of the new chain.
242  * Assumes that the root of a chain is the primitive that starts the chain or is driven from outside the logic block
243  */
244 typedef struct s_pack_molecule {
245  enum e_pack_pattern_molecule_type type; /* what kind of molecule is this? */
246  t_pack_patterns *pack_pattern; /* If this is a forced_pack molecule, pattern this molecule matches */
247  t_model_chain_pattern *chain_pattern; /* If this is a chain molecule, chain that this molecule matches */
248  t_logical_block **logical_block_ptrs; /* [0..num_blocks-1] ptrs to logical blocks that implements this molecule, index on pack_pattern_block->index of pack pattern */
249  boolean valid; /* Whether or not this molecule is still valid */
250 
251  int num_blocks; /* number of logical blocks of molecule */
252  int root; /* root index of molecule, logical_block_ptrs[root] is ptr to root logical block */
253 
254  float base_gain; /* Intrinsic "goodness" score for molecule independant of rest of netlist */
255 
256  int num_ext_inputs; /* number of input pins used by molecule that are not self-contained by pattern molecule matches */
259 
260 /**
261  * Stats keeper for placement information during packing
262  * Contains linked lists to placement locations based on status of primitive
263  */
265  int num_pb_types; /* num primitive pb_types inside complex block */
266  t_pack_molecule *curr_molecule; /* current molecule being considered for packing */
267  t_cluster_placement_primitive **valid_primitives; /* [0..num_pb_types-1] ptrs to linked list of valid primitives, for convenience, each linked list head is empty */
268  t_cluster_placement_primitive *in_flight; /* ptrs to primitives currently being considered */
269  t_cluster_placement_primitive *tried; /* ptrs to primitives that are open but current logic block unable to pack to */
270  t_cluster_placement_primitive *invalid; /* ptrs to primitives that are invalid */
272 
273 /* Built-in library models */
274 #define MODEL_LOGIC "names"
275 #define MODEL_LATCH "latch"
276 #define MODEL_INPUT "input"
277 #define MODEL_OUTPUT "output"
278 
279 /******************************************************************
280  * Timing data types
281  *******************************************************************/
282 
283 // #define PATH_COUNTING 'P'
284 /* Uncomment this to turn on path counting. Its value determines how path criticality
285  is calculated from forward and backward weights. Possible values:
286  'S' - sum of forward and backward weights
287  'P' - product of forward and backward weights
288  'L' - natural log of the product of forward and backward weights
289  'R' - product of the natural logs of forward and backward weights
290  See path_delay.h for further path-counting options. */
291 
292 /* Timing graph information */
293 
294 typedef struct s_tedge {
295  /* Edge in the timing graph. */
296  int to_node; /* index of node at the sink end of this edge */
297  float Tdel; /* delay to go to to_node along this edge */
298 } t_tedge;
299 
300 typedef enum {
301  /* Types of tnodes (timing graph nodes). */
302  TN_INPAD_SOURCE, /* input to an input I/O pad */
303  TN_INPAD_OPIN, /* output from an input I/O pad */
304  TN_OUTPAD_IPIN, /* input to an output I/O pad */
305  TN_OUTPAD_SINK, /* output from an output I/O pad */
306  TN_CB_IPIN, /* input pin to complex block */
307  TN_CB_OPIN, /* output pin from complex block */
308  TN_INTERMEDIATE_NODE, /* Used in post-packed timing graph only:
309  connection between intra-cluster pins. */
310  TN_PRIMITIVE_IPIN, /* input pin to a primitive (e.g. a LUT) */
311  TN_PRIMITIVE_OPIN, /* output pin from a primitive (e.g. a LUT) */
312  TN_FF_IPIN, /* input pin to a flip-flop - goes to TN_FF_SINK */
313  TN_FF_OPIN, /* output pin from a flip-flop - comes from TN_FF_SOURCE */
314  TN_FF_SINK, /* sink (D) pin of flip-flop */
315  TN_FF_SOURCE, /* source (Q) pin of flip-flop */
316  TN_FF_CLOCK, /* clock pin of flip-flop */
317  TN_CONSTANT_GEN_SOURCE /* source of a constant logic 1 or 0 */
318 } e_tnode_type;
319 
320 typedef struct s_prepacked_tnode_data {
321  /* Data only used by prepacked tnodes. Stored separately so it
322  doesn't need to be allocated in the post-packed netlist. */
323  int model_port, model_pin; /* technology mapped model pin */
325 #ifndef PATH_COUNTING
326  long num_critical_input_paths, num_critical_output_paths; /* count of critical paths fanning into/out of this tnode */
327  float normalized_slack; /* slack (normalized with respect to max slack) */
328  float normalized_total_critical_paths; /* critical path count (normalized with respect to max count) */
329  float normalized_T_arr; /* arrival time (normalized with respect to max time) */
330 #endif
332 
333 typedef struct s_tnode {
334  /* Node in the timing graph. Note: we combine 2 members into a bit field. */
335  e_tnode_type type; /* see the above enum */
336  t_tedge *out_edges; /* [0..num_edges - 1] array of edges fanning out from this tnode.
337  Note: there is a correspondence in indexing between out_edges and the
338  net data structure: out_edges[iedge] = net[inet].node_block[iedge + 1]
339  There is an offset of 1 because net[inet].node_block includes the driver
340  node at index 0, while out_edges is part of the driver node and does
341  not bother to refer to itself. */
343  float T_arr; /* Arrival time of the last input signal to this node. */
344  float T_req; /* Required arrival time of the last input signal to this node
345  if the critical path is not to be lengthened. */
346  int block; /* logical block primitive which this tnode is part of */
347 
348 #ifdef PATH_COUNTING
349  float forward_weight, backward_weight; /* Weightings of the importance of paths
350  fanning into and out of this node, respectively. */
351 #endif
352 
353  /* Valid values for TN_FF_SINK, TN_FF_SOURCE, TN_FF_CLOCK, TN_INPAD_SOURCE, and TN_OUTPAD_SINK only: */
354  int clock_domain; /* Index of the clock in g_sdc->constrained_clocks which this flip-flop or I/O is constrained on. */
355  float clock_delay; /* The time taken for a clock signal to get to the flip-flop or I/O (assumed 0 for I/Os). */
356 
357  /* Used in post-packing timing graph only: */
358  t_pb_graph_pin *pb_graph_pin; /* pb_graph_pin that this block is connected to */
359 
360  /* Used in pre-packing timing graph only: */
362 } t_tnode;
363 
364 /* Other structures storing timing information */
365 
366 typedef struct s_clock {
367  /* Stores information on clocks given timing constraints.
368  Used in SDC parsing and timing analysis. */
369  char * name;
370  boolean is_netlist_clock; /* Is this a netlist or virtual (external) clock? */
371  int fanout;
372 } t_clock;
373 
374 typedef struct s_io {
375  /* Stores information on I/Os given timing constraints.
376  Used in SDC parsing and timing analysis. */
377  char * name; /* I/O port name with an SDC constraint */
378  char * clock_name; /* Clock it was constrained on */
379  float delay; /* Delay through the I/O in this constraint */
380  int file_line_number; /* line in the SDC file I/O was constrained on - used for error reporting */
381 } t_io;
382 
383 typedef struct s_timing_stats {
384  /* Timing statistics for final reporting for each constraint
385  (pair of constrained source and sink clock domains).
386 
387  cpd holds the critical path delay, the longest path between the
388  pair of domains, or equivalently the path with the least slack.
389 
390  least_slack holds the slack of the connection with the least slack
391  over all paths in this constraint, even if this connection is part
392  of another constraint and has a lower slack from that constraint.
393 
394  The "critical path" of the entire design is the path with the least
395  slack in the constraint with the least slack
396  (see get_critical_path_delay()). */
397 
398  float ** cpd;
399  float ** least_slack;
401 
402 typedef struct s_slack {
403  /* Matrices storing slacks and criticalities of each sink pin on each net
404  [0..num_nets-1][1..num_pins-1] for both pre- and post-packed netlists. */
405  float ** slack;
407 #ifdef PATH_COUNTING
408  float ** path_criticality;
409 #endif
410 } t_slack;
411 
412 typedef struct s_override_constraint {
413  /* A special-case constraint to override the default, calculated, timing constraint. Holds data from
414  set_clock_groups, set_false_path, set_max_delay, and set_multicycle_path commands. Can hold data for
415  clock-to-clock, clock-to-flip-flop, flip-flop-to-clock or flip-flop-to-flip-flop constraints, each of
416  which has its own array (g_sdc->cc_constraints, g_sdc->cf_constraints, g_sdc->fc_constraints, and g_sdc->ff_constraints). */
417  char ** source_list; /* Array of net names of flip-flops or clocks */
418  char ** sink_list;
420  int num_sink;
421  float constraint;
423  int file_line_number; /* line in the SDC file clock was constrained on - used for error reporting */
425 
426 typedef struct s_timing_constraints { /* Container structure for all SDC timing constraints.
427  See top-level comment to read_sdc.c for details on members. */
428  int num_constrained_clocks; /* number of clocks with timing constraints */
429  t_clock * constrained_clocks; /* [0..g_sdc->num_constrained_clocks - 1] array of clocks with timing constraints */
430 
431  float ** domain_constraint; /* [0..num_constrained_clocks - 1 (source)][0..num_constrained_clocks - 1 (destination)] */
432 
433  int num_constrained_inputs; /* number of inputs with timing constraints */
434  t_io * constrained_inputs; /* [0..num_constrained_inputs - 1] array of inputs with timing constraints */
435 
436  int num_constrained_outputs; /* number of outputs with timing constraints */
437  t_io * constrained_outputs; /* [0..num_constrained_outputs - 1] array of outputs with timing constraints */
438 
439  int num_cc_constraints; /* number of special-case clock-to-clock constraints overriding default, calculated, timing constraints */
440  t_override_constraint * cc_constraints; /* [0..num_cc_constraints - 1] array of such constraints */
441 
442  int num_cf_constraints; /* number of special-case clock-to-flipflop constraints */
443  t_override_constraint * cf_constraints; /* [0..num_cf_constraints - 1] array of such constraints */
444 
445  int num_fc_constraints; /* number of special-case flipflop-to-clock constraints */
446  t_override_constraint * fc_constraints; /* [0..num_fc_constraints - 1] */
447 
448  int num_ff_constraints; /* number of special-case flipflop-to-flipflop constraints */
449  t_override_constraint * ff_constraints; /* [0..num_ff_constraints - 1] array of such constraints */
451 
452 /***************************************************************************
453  * Placement and routing data types
454  ****************************************************************************/
455 
456 /* Timing data structures end */
459 };
460 /* Annealing schedule */
461 
462 enum pic_type {
464 };
465 /* What's on screen? */
466 
467 /* Map netlist to FPGA or timing analyze only */
470 };
471 
472 enum pfreq {
474 };
475 
476 /* Are the pads free to be moved, locked in a random configuration, or *
477  * locked in user-specified positions? */
480 };
481 
482 /* Power data for t_net structure */
483 struct s_net_power {
484  /* Signal probability - long term probability that signal is logic-high*/
485  float probability;
486 
487  /* Transistion density - average # of transitions per clock cycle
488  * For example, a clock would have density = 2
489  */
490  float density;
491 };
492 
493 /* name: ASCII net name for informative annotations in the output. *
494  * num_sinks: Number of sinks on this net. *
495  * node_block: [0..num_sinks]. Contains the blocks to which the nodes of this
496  * net connect. The source block is node_block[0] and the sink blocks
497  * are the remaining nodes.
498  * node_block_port: [0..num_sinks]. Contains port index (on a block) to
499  * which each net terminal connects.
500  * node_block_pin: [0..num_sinks]. Contains the index of the pin (on a block) to
501  * which each net terminal connects.
502  * is_global: not routed
503  * is_const_gen: constant generator (does not affect timing) */
504 typedef struct s_net {
505  char *name;
510  boolean is_global;
511  boolean is_const_gen;
513 } t_net;
514 
515 /* s_grid_tile is the minimum tile of the fpga
516  * type: Pointer to type descriptor, NULL for illegal, IO_TYPE for io
517  * offset: Number of grid tiles above the bottom location of a block
518  * usage: Number of blocks used in this grid tile
519  * blocks[]: Array of logical blocks placed in a physical position, EMPTY means
520  no block at that index */
521 typedef struct s_grid_tile {
523  int offset;
524  int usage;
525  int *blocks;
526 } t_grid_tile;
527 
528 /* Stores the bounding box of a net in terms of the minimum and *
529  * maximum coordinates of the blocks forming the net, clipped to *
530  * the region (1..nx, 1..ny). */
531 struct s_bb {
532  int xmin;
533  int xmax;
534  int ymin;
535  int ymax;
536 };
537 
538 /* capacity: Capacity of this region, in tracks. *
539  * occupancy: Expected number of tracks that will be occupied. *
540  * cost: Current cost of this usage. */
542  float capacity;
544  float occupancy;
545  float cost;
546 };
547 
548 /*
549  Represents a clustered logic block of a user circuit that fits into one unit of space in an FPGA grid block
550  name: identifier for this block
551  type: the type of physical block this user circuit block can map into
552  nets: nets that connect to other user circuit blocks
553  x: x-coordinate
554  y: y-coordinate
555  z: occupancy coordinate
556  pb: Physical block representing the clustering of this CLB
557  isFixed: TRUE if this block's position is fixed by the user and shouldn't be moved during annealing
558  */
559 struct s_block {
560  char *name;
562  int *nets;
563  int x;
564  int y;
565  int z;
566 
568 
569  boolean isFixed;
570 
571 };
572 typedef struct s_block t_block;
573 
574 /* Names of various files */
576  char *ArchFile;
577  char *CircuitName;
578  char *BlifFile;
579  char *NetFile;
580  char *PlaceFile;
581  char *RouteFile;
582  char *ActFile;
583  char *PowerFile;
586 };
587 
588 /* Options for packing
589  * TODO: document each packing parameter */
592 };
593 
597  char *output_file;
598  boolean global_clocks;
601  boolean timing_driven;
603  float alpha;
604  float beta;
606  float block_delay;
614  boolean doPacking;
616  float aspect;
617 };
618 
619 /* Annealing schedule information for the placer. The schedule type *
620  * is either USER_SCHED or AUTO_SCHED. Inner_num is multiplied by *
621  * num_blocks^4/3 to find the number of moves per temperature. The *
622  * remaining information is used only for USER_SCHED, and have the *
623  * obvious meanings. */
626  float inner_num;
627  float init_t;
628  float alpha_t;
629  float exit_t;
630 };
631 
634 };
635 
649  int seed;
651  boolean doPlacement;
652 };
653 
654 /* Various options for the placer. *
655  * place_algorithm: BOUNDING_BOX_PLACE or NET_TIMING_DRIVEN_PLACE, or *
656  * PATH_TIMING_DRIVEN_PLACE *
657  * timing_tradeoff: When TIMING_DRIVEN_PLACE mode, what is the tradeoff *
658  * timing driven and BOUNDING_BOX_PLACE. *
659  * block_dist: Initial guess of how far apart blocks on the critical path *
660  * This is used to compute the initial slacks and criticalities *
661  * place_cost_exp: Power to which denominator is raised for linear_cong. *
662  * place_chan_width: The channel width assumed if only one placement is *
663  * performed. *
664  * pad_loc_type: Are pins FREE, fixed randomly, or fixed from a file. *
665  * pad_loc_file: File to read pin locations form if pad_loc_type *
666  * is USER. *
667  * place_freq: Should the placement be skipped, done once, or done for each *
668  * channel width in the binary search. *
669  * recompute_crit_iter: how many temperature stages pass before we recompute *
670  * criticalities based on average point to point delay *
671  * enable_timing_computations: in bounding_box mode, normally, timing *
672  * information is not produced, this causes the information *
673  * to be computed. in *_TIMING_DRIVEN modes, this has no effect*
674  * inner_loop_crit_divider: (move_lim/inner_loop_crit_divider) determines how*
675  * many inner_loop iterations pass before a recompute of *
676  * criticalities is done. *
677  * td_place_exp_first: exponent that is used on the timing_driven criticlity *
678  * it is the value that the exponent starts at. *
679  * td_place_exp_last: value that the criticality exponent will be at the end *
680  * doPlacement: TRUE if placement is supposed to be done in the CAD flow, FALSE otherwise */
681 
684 };
687 };
690 };
691 
692 #define NO_FIXED_CHANNEL_WIDTH -1
693 
699  float acc_fac;
700  float bend_cost;
707  float astar_fac;
711  boolean full_stats;
712  boolean doRouting;
713 };
714 
715 /* All the parameters controlling the router's operation are in this *
716  * structure. *
717  * first_iter_pres_fac: Present sharing penalty factor used for the *
718  * very first (congestion mapping) Pathfinder iteration. *
719  * initial_pres_fac: Initial present sharing penalty factor for *
720  * Pathfinder; used to set pres_fac on 2nd iteration. *
721  * pres_fac_mult: Amount by which pres_fac is multiplied each *
722  * routing iteration. *
723  * acc_fac: Historical congestion cost multiplier. Used unchanged *
724  * for all iterations. *
725  * bend_cost: Cost of a bend (usually non-zero only for global routing). *
726  * max_router_iterations: Maximum number of iterations before giving *
727  * up. *
728  * bb_factor: Linear distance a route can go outside the net bounding *
729  * box. *
730  * route_type: GLOBAL or DETAILED. *
731  * fixed_channel_width: Only attempt to route the design once, with the *
732  * channel width given. If this variable is *
733  * == NO_FIXED_CHANNEL_WIDTH, do a binary search *
734  * on channel width. *
735  * router_algorithm: BREADTH_FIRST or TIMING_DRIVEN. Selects the desired *
736  * routing algorithm. *
737  * base_cost_type: Specifies how to compute the base cost of each type of *
738  * rr_node. INTRINSIC_DELAY -> base_cost = intrinsic delay *
739  * of each node. DELAY_NORMALIZED -> base_cost = "demand" *
740  * x average delay to route past 1 CLB. DEMAND_ONLY -> *
741  * expected demand of this node (old breadth-first costs). *
742  * *
743  * The following parameters are used only by the timing-driven router. *
744  * *
745  * astar_fac: Factor (alpha) used to weight expected future costs to *
746  * target in the timing_driven router. astar_fac = 0 leads to *
747  * an essentially breadth-first search, astar_fac = 1 is near *
748  * the usual astar algorithm and astar_fac > 1 are more *
749  * aggressive. *
750  * max_criticality: The maximum criticality factor (from 0 to 1) any sink *
751  * will ever have (i.e. clip criticality to this number). *
752  * criticality_exp: Set criticality to (path_length(sink) / longest_path) ^ *
753  * criticality_exp (then clip to max_criticality).
754  * doRouting: True if routing is supposed to be done, FALSE otherwise */
755 
758  enum e_directionality directionality; /* UDSD by AY */
759  int Fs;
762  short num_switch;
766  float R_minW_nmos;
767  float R_minW_pmos;
768 };
769 
770 /* Defines the detailed routing architecture of the FPGA. Only important *
771  * if the route_type is DETAILED. *
772  * (UDSD by AY) directionality: Should the tracks be uni-directional or *
773  * bi-directional? *
774  * switch_block_type: Pattern of switches at each switch block. I *
775  * assume Fs is always 3. If the type is SUBSET, I use a *
776  * Xilinx-like switch block where track i in one channel always *
777  * connects to track i in other channels. If type is WILTON, *
778  * I use a switch block where track i does not always connect *
779  * to track i in other channels. See Steve Wilton, Phd Thesis, *
780  * University of Toronto, 1996. The UNIVERSAL switch block is *
781  * from Y. W. Chang et al, TODAES, Jan. 1996, pp. 80 - 101. *
782  * num_segment: Number of distinct segment types in the FPGA. *
783  * num_switch: Number of distinct switch types (pass transistors or *
784  * buffers) in the FPGA. *
785  * delayless_switch: Index of a zero delay switch (used to connect things *
786  * that should have no delay). *
787  * wire_to_ipin_switch: Index of a switch used to connect wire segments *
788  * to clb or pad input pins (IPINs). *
789  * R_minW_nmos: Resistance (in Ohms) of a minimum width nmos transistor. *
790  * Used only in the FPGA area model. *
791  * R_minW_pmos: Resistance (in Ohms) of a minimum width pmos transistor. */
792 
793 enum e_drivers {
795 };
796 /* legacy routing drivers by Andy Ye (remove or integrate in future) */
797 
800 };
801 /* UDSD by AY */
802 
803 typedef struct s_seg_details {
804  int length;
805  int start;
806  boolean longline;
807  boolean *sb;
808  boolean *cb;
809  short wire_switch;
810  short opin_switch;
811  float Rmetal;
812  float Cmetal;
813  boolean twisted;
814  enum e_direction direction; /* UDSD by AY */
815  enum e_drivers drivers; /* UDSD by AY */
818  int index;
819  float Cmetal_per_m; /* Used for power */
820 } t_seg_details;
821 
822 /* Lists detailed information about segmentation. [0 .. W-1]. *
823  * length: length of segment. *
824  * start: index at which a segment starts in channel 0. *
825  * longline: TRUE if this segment spans the entire channel. *
826  * sb: [0..length]: TRUE for every channel intersection, relative to the *
827  * segment start, at which there is a switch box. *
828  * cb: [0..length-1]: TRUE for every logic block along the segment at *
829  * which there is a connection box. *
830  * wire_switch: Index of the switch type that connects other wires *to* *
831  * this segment. *
832  * opin_switch: Index of the switch type that connects output pins (OPINs) *
833  * *to* this segment. *
834  * Cmetal: Capacitance of a routing track, per unit logic block length. *
835  * Rmetal: Resistance of a routing track, per unit logic block length. *
836  * (UDSD by AY) direction: The direction of a routing track. *
837  * (UDSD by AY) drivers: How do signals driving a routing track connect to *
838  * the track? *
839  * index: index of the segment type used for this track. */
840 
843  float *fptr;
844 };
845 
846 /* A linked list of float pointers. Used for keeping track of *
847  * which pathcosts in the router have been changed. */
848 
849 /* Uncomment lines below to save some memory, at the cost of debugging ease. */
850 /*enum e_rr_type {SOURCE, SINK, IPIN, OPIN, CHANX, CHANY}; */
851 /* typedef short t_rr_type */
852 
853 typedef enum e_rr_type {
855 } t_rr_type;
856 
857 /* Type of a routing resource node. x-directed channel segment, *
858  * y-directed channel segment, input pin to a clb to pad, output *
859  * from a clb or pad (i.e. output pin of a net) and: *
860  * SOURCE: A dummy node that is a logical output within a block *
861  * -- i.e., the gate that generates a signal. *
862  * SINK: A dummy node that is a logical input within a block *
863  * -- i.e. the gate that needs a signal. */
864 
865 typedef struct s_trace {
866  int index;
867  short iswitch;
868  int iblock;
870  struct s_trace *next;
871 } t_trace;
872 
873 /* Basic element used to store the traceback (routing) of each net. *
874  * index: Array index (ID) of this routing resource node. *
875  * iswitch: Index of the switch type used to go from this rr_node to *
876  * the next one in the routing. OPEN if there is no next node *
877  * (i.e. this node is the last one (a SINK) in a branch of the *
878  * net's routing). *
879  * iblock: Index of block that this trace applies to if applicable, OPEN *
880  * otherwise *
881  * num_siblings: Number of traceback sibling nodes (including self). This *
882  * count is used to help extract individual route paths for *
883  * each net. A '0' indicates a terminal node, '1' means a *
884  * single child, '+1' defines branch with 2 or more children.*
885  * next: Pointer to the next traceback element in this route. */
886 
887 #define NO_PREVIOUS -1
888 
889 typedef struct s_rr_node {
890  short xlow;
891  short xhigh;
892  short ylow;
893  short yhigh;
894 
895  short ptc_num;
896 
897  short cost_index;
898  short occ;
899  short capacity;
900  short fan_in;
901  short num_edges;
903  int *edges;
904  short *switches;
905 
906  float R;
907  float C;
908 
909  enum e_direction direction; /* UDSD by AY */
910  enum e_drivers drivers; /* UDSD by AY */
911  int num_wire_drivers; /* UDSD by WMF */
912  int num_opin_drivers; /* UDSD by WMF (could use "short") */
913 
914  /* Used by clustering only (TODO, may wish to extend to regular router) */
917  int net_num;
921 
922  int z; /* For IPIN, source, and sink nodes, helps identify which location this rr_node belongs to */
923 } t_rr_node;
924 /* Main structure describing one routing resource node. Everything in *
925  * this structure should describe the graph -- information needed only *
926  * to store algorithm-specific data should be stored in one of the *
927  * parallel rr_node_?? structures. *
928  * *
929  * xlow, xhigh, ylow, yhigh: Integer coordinates (see route.c for *
930  * coordinate system) of the ends of this routing resource. *
931  * xlow = xhigh and ylow = yhigh for pins or for segments of *
932  * length 1. These values are used to decide whether or not this *
933  * node should be added to the expansion heap, based on things *
934  * like whether it's outside the net bounding box or is moving *
935  * further away from the target, etc. *
936  * type: What is this routing resource? *
937  * ptc_num: Pin, track or class number, depending on rr_node type. *
938  * Needed to properly draw. *
939  * cost_index: An integer index into the table of routing resource indexed *
940  * data (this indirection allows quick dynamic changes of rr *
941  * base costs, and some memory storage savings for fields that *
942  * have only a few distinct values). *
943  * occ: Current occupancy (usage) of this node. *
944  * capacity: Capacity of this node (number of routes that can use it). *
945  * num_edges: Number of edges exiting this node. That is, the number *
946  * of nodes to which it connects. *
947  * edges[0..num_edges-1]: Array of indices of the neighbours of this *
948  * node. *
949  * switches[0..num_edges-1]: Array of switch indexes for each of the *
950  * edges leaving this node. *
951  * *
952  * The following parameters are only needed for timing analysis. *
953  * R: Resistance to go through this node. This is only metal *
954  * resistance (end to end, so conservative) -- it doesn't include the *
955  * switch that leads to another rr_node. *
956  * C: Total capacitance of this node. Includes metal capacitance, the *
957  * input capacitance of all switches hanging off the node, the *
958  * output capacitance of all switches to the node, and the connection *
959  * box buffer capacitances hanging off it. *
960  * (UDSD by AY) direction: if the node represents a track, this field *
961  * indicates the direction of the track. Otherwise *
962  * the value contained in the field should be *
963  * ignored. *
964  * (UDSD by AY) drivers: if the node represents a track, this field *
965  * indicates the driving architecture of the track. *
966  * Otherwise the value contained in the field should *
967  * be ignored. */
968 
969 typedef struct s_rr_indexed_data {
970  float base_cost;
974  float inv_length;
975  float T_linear;
976  float T_quadratic;
977  float C_load;
978 
979 
980  /* Power Estimation: Wire capacitance in (Farads * tiles / meter)
981  * This is used to calculate capacitance of this segment, by
982  * multiplying it by the length per tile (meters/tile).
983  * This is only the wire capacitance, not including any switches */
986 
987 /* Data that is pointed to by the .cost_index member of t_rr_node. It's *
988  * purpose is to store the base_cost so that it can be quickly changed *
989  * and to store fields that have only a few different values (like *
990  * seg_index) or whose values should be an average over all rr_nodes of a *
991  * certain type (like T_linear etc., which are used to predict remaining *
992  * delay in the timing_driven router). *
993  * *
994  * base_cost: The basic cost of using an rr_node. *
995  * ortho_cost_index: The index of the type of rr_node that generally *
996  * connects to this type of rr_node, but runs in the *
997  * orthogonal direction (e.g. vertical if the direction *
998  * of this member is horizontal). *
999  * seg_index: Index into segment_inf of this segment type if this type of *
1000  * rr_node is an CHANX or CHANY; OPEN (-1) otherwise. *
1001  * inv_length: 1/length of this type of segment. *
1002  * T_linear: Delay through N segments of this type is N * T_linear + N^2 * *
1003  * T_quadratic. For buffered segments all delay is T_linear. *
1004  * T_quadratic: Dominant delay for unbuffered segments, 0 for buffered *
1005  * segments. *
1006  * C_load: Load capacitance seen by the driver for each segment added to *
1007  * the chain driven by the driver. 0 for buffered segments. */
1008 
1015 };
1016 
1017 /* Gives the index of the SOURCE, SINK, OPIN, IPIN, etc. member of *
1018  * rr_indexed_data. */
1019 
1020 /* Power estimation options */
1022  boolean do_power; /* Perform power estimation? */
1023 };
1024 
1025 /* Type to store our list of token to enum pairings */
1026 struct s_TokenPair {
1027  const char *Str;
1028  int Enum;
1029 };
1030 
1031 /* Store settings for VPR */
1032 typedef struct s_vpr_setup {
1033  boolean TimingEnabled; /* Is VPR timing enabled */
1034  struct s_file_name_opts FileNameOpts; /* File names */
1035  enum e_operation Operation; /* run VPR or do analysis only */
1036  t_model * user_models; /* blif models defined by the user */
1037  t_model * library_models; /* blif models in VPR */
1038  struct s_packer_opts PackerOpts; /* Options for packer */
1039  struct s_placer_opts PlacerOpts; /* Options for placer */
1040  struct s_annealing_sched AnnealSched; /* Placement option annealing schedule */
1041  struct s_router_opts RouterOpts; /* router options */
1042  struct s_det_routing_arch RoutingArch; /* routing architecture */
1043  t_segment_inf * Segments; /* wires in routing architecture */
1044  t_timing_inf Timing; /* timing information */
1045  float constant_net_delay; /* timing information when place and route not run */
1046  boolean ShowGraphics; /* option to show graphics */
1047  int GraphPause; /* user interactiveness graphics option */
1049 } t_vpr_setup;
1050 
1051 #endif
1052 
t_type_ptr type
Definition: vpr_types.h:522
int * node_block_pin
Definition: vpr_types.h:509
std::map< int, float > sharinggain
Definition: vpr_types.h:134
short xhigh
Definition: vpr_types.h:891
const char * Str
Definition: vpr_types.h:1027
short num_edges
Definition: vpr_types.h:901
float R
Definition: vpr_types.h:906
char * name
Definition: vpr_types.h:179
int index
Definition: vpr_types.h:866
short cost_index
Definition: vpr_types.h:897
char * CmosTechFile
Definition: vpr_types.h:584
int num_siblings
Definition: vpr_types.h:869
int * edges
Definition: vpr_types.h:903
boolean doRouting
Definition: vpr_types.h:712
struct s_pb * parent_pb
Definition: vpr_types.h:186
short wire_switch
Definition: vpr_types.h:809
enum e_router_algorithm router_algorithm
Definition: vpr_types.h:705
boolean sweep_hanging_nets_and_inputs
Definition: vpr_types.h:600
struct s_pb ** child_pbs
Definition: vpr_types.h:185
t_segment_inf * Segments
Definition: vpr_types.h:1043
int ** output_pins_used
Definition: vpr_types.h:159
float T_req
Definition: vpr_types.h:344
boolean full_stats
Definition: vpr_types.h:711
int ** input_nets
Definition: vpr_types.h:211
sched_type
Definition: vpr_types.h:457
float capacity
Definition: vpr_types.h:542
boolean is_const_gen
Definition: vpr_types.h:511
int tie_break_high_fanout_net
Definition: vpr_types.h:151
int net_num
Definition: vpr_types.h:917
struct s_vpr_setup t_vpr_setup
float block_delay
Definition: vpr_types.h:606
boolean enable_timing_computations
Definition: vpr_types.h:646
short ptc_num
Definition: vpr_types.h:895
struct s_rr_node * rr_graph
Definition: vpr_types.h:188
boolean doPacking
Definition: vpr_types.h:614
short iswitch
Definition: vpr_types.h:867
int GraphPause
Definition: vpr_types.h:1047
float Rmetal
Definition: vpr_types.h:811
int xmax
Definition: vpr_types.h:533
t_tnode * tnode
Definition: vpr_types.h:919
boolean auto_compute_inter_cluster_net_delay
Definition: vpr_types.h:609
struct s_timing_stats t_timing_stats
short delayless_switch
Definition: vpr_types.h:764
e_pack_pattern_molecule_type
Definition: vpr_types.h:233
short global_route_switch
Definition: vpr_types.h:763
char * pad_loc_file
Definition: vpr_types.h:643
int fixed_channel_width
Definition: vpr_types.h:704
int ymin
Definition: vpr_types.h:534
char * RouteFile
Definition: vpr_types.h:581
float ** least_slack
Definition: vpr_types.h:399
struct s_grid_tile t_grid_tile
short ylow
Definition: vpr_types.h:892
float pres_fac_mult
Definition: vpr_types.h:698
logical_block_types
Definition: vpr_types.h:107
enum e_pad_loc_type pad_loc_type
Definition: vpr_types.h:642
struct s_timing_constraints t_timing_constraints
struct s_pack_molecule ** feasible_blocks
Definition: vpr_types.h:167
float C
Definition: vpr_types.h:907
int num_local_nets
Definition: vpr_types.h:193
int max_router_iterations
Definition: vpr_types.h:701
boolean is_netlist_clock
Definition: vpr_types.h:370
char * PlaceFile
Definition: vpr_types.h:580
int x
Definition: vpr_types.h:563
std::map< int, int > num_pins_of_net_in_pb
Definition: vpr_types.h:155
float first_iter_pres_fac
Definition: vpr_types.h:696
int num_marked_blocks
Definition: vpr_types.h:148
float occupancy
Definition: vpr_types.h:544
int prev_node
Definition: vpr_types.h:915
e_switch_block_type
enum e_drivers drivers
Definition: vpr_types.h:815
float T_arr
Definition: vpr_types.h:343
boolean twisted
Definition: vpr_types.h:813
t_power_opts PowerOpts
Definition: vpr_types.h:1048
e_tnode_type
Definition: vpr_types.h:300
char * output_file
Definition: vpr_types.h:597
enum e_drivers drivers
Definition: vpr_types.h:910
struct s_clock t_clock
float timing_tradeoff
Definition: vpr_types.h:638
enum e_direction direction
Definition: vpr_types.h:909
int * lut_pin_remap
Definition: vpr_types.h:197
int * node_block
Definition: vpr_types.h:507
struct s_linked_vptr * packed_molecules
Definition: vpr_types.h:228
struct s_linked_vptr * truth_table
Definition: vpr_types.h:227
int clock_domain
Definition: vpr_types.h:354
boolean timing_driven
Definition: vpr_types.h:601
float ** domain_constraint
Definition: vpr_types.h:431
boolean ShowGraphics
Definition: vpr_types.h:1046
e_cluster_seed
Definition: vpr_types.h:112
e_pad_loc_type
Definition: vpr_types.h:478
float Cmetal
Definition: vpr_types.h:812
char * name
Definition: vpr_types.h:505
struct s_pb ** rr_node_to_pb_mapping
Definition: vpr_types.h:189
float ** slack
Definition: vpr_types.h:405
t_type_ptr type
Definition: vpr_types.h:561
boolean do_power
Definition: vpr_types.h:1022
t_pack_molecule * curr_molecule
Definition: vpr_types.h:266
struct s_file_name_opts FileNameOpts
Definition: vpr_types.h:1034
t_cluster_placement_primitive * tried
Definition: vpr_types.h:269
int ** input_pins_used
Definition: vpr_types.h:158
char * name
Definition: vpr_types.h:560
t_pack_patterns * pack_pattern
Definition: vpr_types.h:246
struct s_slack t_slack
t_prepacked_tnode_data * prepacked_data
Definition: vpr_types.h:361
t_cluster_placement_primitive * in_flight
Definition: vpr_types.h:268
int num_edges
Definition: vpr_types.h:342
boolean TimingEnabled
Definition: vpr_types.h:1033
float td_place_exp_first
Definition: vpr_types.h:648
struct s_io t_io
struct s_tnode t_tnode
short opin_switch
Definition: vpr_types.h:810
char * name
Definition: vpr_types.h:377
char * out_file_prefix
Definition: vpr_types.h:585
int y
Definition: vpr_types.h:564
size_t bitfield
Definition: vpr_types.h:70
struct s_cluster_placement_stats t_cluster_placement_stats
float ** cpd
Definition: vpr_types.h:398
enum e_cluster_seed cluster_seed_type
Definition: vpr_types.h:602
struct s_tnode * clock_net_tnode
Definition: vpr_types.h:225
float probability
Definition: vpr_types.h:485
int recompute_timing_after
Definition: vpr_types.h:605
std::map< int, float > hillgain
Definition: vpr_types.h:142
t_override_constraint * fc_constraints
Definition: vpr_types.h:446
int block
Definition: vpr_types.h:346
float bend_cost
Definition: vpr_types.h:700
int ** lookahead_output_pins_used
Definition: vpr_types.h:162
enum pfreq place_freq
Definition: vpr_types.h:644
t_timing_inf Timing
Definition: vpr_types.h:1044
float normalized_total_critical_paths
Definition: vpr_types.h:328
struct s_trace * next
Definition: vpr_types.h:870
t_override_constraint * cf_constraints
Definition: vpr_types.h:443
struct s_tnode *** input_net_tnodes
Definition: vpr_types.h:223
int num_child_blocks_in_pb
Definition: vpr_types.h:149
enum e_directionality directionality
Definition: vpr_types.h:758
struct s_pack_molecule t_pack_molecule
boolean isFixed
Definition: vpr_types.h:569
int file_line_number
Definition: vpr_types.h:380
struct s_logical_block t_logical_block
e_drivers
Definition: vpr_types.h:793
t_net_power * net_power
Definition: vpr_types.h:512
e_operation
Definition: vpr_types.h:468
int fanout
Definition: vpr_types.h:371
float td_place_exp_last
Definition: vpr_types.h:650
char * CircuitName
Definition: vpr_types.h:577
float initial_pres_fac
Definition: vpr_types.h:697
int clock_net
Definition: vpr_types.h:195
pic_type
Definition: vpr_types.h:462
t_cluster_placement_primitive * invalid
Definition: vpr_types.h:270
int logical_block
Definition: vpr_types.h:181
enum e_direction direction
Definition: vpr_types.h:814
char * name
Definition: vpr_types.h:369
struct s_net * local_nets
Definition: vpr_types.h:192
std::map< int, float > prevconnectiongainincr
Definition: vpr_types.h:133
e_direction
Definition: vpr_types.h:798
struct s_pb t_pb
e_block_pack_status
Definition: vpr_types.h:116
short capacity
Definition: vpr_types.h:899
std::map< int, float > connectiongain
Definition: vpr_types.h:132
float inv_capacity
Definition: vpr_types.h:543
float Tdel
Definition: vpr_types.h:297
int num_opin_drivers
Definition: vpr_types.h:912
float Cmetal_per_m
Definition: vpr_types.h:819
struct s_rr_indexed_data t_rr_indexed_data
float constant_net_delay
Definition: vpr_types.h:1045
float inter_cluster_net_delay
Definition: vpr_types.h:608
enum e_route_type route_type
Definition: vpr_types.h:703
boolean hill_climbing_flag
Definition: vpr_types.h:599
boolean allow_early_exit
Definition: vpr_types.h:612
float astar_fac
Definition: vpr_types.h:707
struct s_linked_f_pointer * next
Definition: vpr_types.h:842
std::map< int, float > gain
Definition: vpr_types.h:128
float delay
Definition: vpr_types.h:379
float place_cost_exp
Definition: vpr_types.h:640
struct s_pack_molecule * next
Definition: vpr_types.h:257
t_clock * constrained_clocks
Definition: vpr_types.h:429
t_pb_graph_pin * pb_graph_pin
Definition: vpr_types.h:358
boolean is_global
Definition: vpr_types.h:510
short fan_in
Definition: vpr_types.h:900
struct s_placer_opts PlacerOpts
Definition: vpr_types.h:1039
int recompute_crit_iter
Definition: vpr_types.h:645
enum e_packer_algorithm packer_algorithm
Definition: vpr_types.h:615
struct s_pb_stats t_pb_stats
int iblock
Definition: vpr_types.h:868
enum logical_block_types type
Definition: vpr_types.h:208
e_base_cost_type
Definition: vpr_types.h:688
boolean global_clocks
Definition: vpr_types.h:598
enum e_place_algorithm place_algorithm
Definition: vpr_types.h:637
int * blocks
Definition: vpr_types.h:525
t_tedge * out_edges
Definition: vpr_types.h:336
char * PowerFile
Definition: vpr_types.h:583
float saved_base_cost
Definition: vpr_types.h:971
short yhigh
Definition: vpr_types.h:893
boolean connection_driven
Definition: vpr_types.h:613
enum e_rr_type t_rr_type
e_router_algorithm
Definition: vpr_types.h:685
boolean longline
Definition: vpr_types.h:806
enum sched_type type
Definition: vpr_types.h:625
enum e_switch_block_type switch_block_type
Definition: vpr_types.h:760
short * switches
Definition: vpr_types.h:904
float aspect
Definition: vpr_types.h:616
float ** timing_criticality
Definition: vpr_types.h:406
t_cluster_placement_primitive ** valid_primitives
Definition: vpr_types.h:267
struct s_tedge t_tedge
char * sdc_file_name
Definition: vpr_types.h:596
float max_criticality
Definition: vpr_types.h:708
t_model * library_models
Definition: vpr_types.h:1037
char * blif_file_name
Definition: vpr_types.h:595
t_pb_graph_pin * pb_graph_pin
Definition: vpr_types.h:918
int to_node
Definition: vpr_types.h:296
boolean * sb
Definition: vpr_types.h:807
t_model_ports * model_port_ptr
Definition: vpr_types.h:324
char * clock_name
Definition: vpr_types.h:378
std::map< int, float > timinggain
Definition: vpr_types.h:130
struct s_det_routing_arch RoutingArch
Definition: vpr_types.h:1042
pfreq
Definition: vpr_types.h:472
int num_feasible_blocks
Definition: vpr_types.h:168
struct s_packer_opts PackerOpts
Definition: vpr_types.h:1038
struct s_prepacked_tnode_data t_prepacked_tnode_data
short xlow
Definition: vpr_types.h:890
t_io * constrained_outputs
Definition: vpr_types.h:437
int * nets
Definition: vpr_types.h:562
enum e_pack_pattern_molecule_type type
Definition: vpr_types.h:245
t_override_constraint * ff_constraints
Definition: vpr_types.h:449
t_pb * pb
Definition: vpr_types.h:567
float acc_fac
Definition: vpr_types.h:699
struct s_override_constraint t_override_constraint
int * marked_nets
Definition: vpr_types.h:147
float pack_intrinsic_cost
Definition: vpr_types.h:920
t_override_constraint * cc_constraints
Definition: vpr_types.h:440
int z
Definition: vpr_types.h:565
e_tnode_type type
Definition: vpr_types.h:335
struct s_tnode *** output_net_tnodes
Definition: vpr_types.h:224
float density
Definition: vpr_types.h:490
float criticality_exp
Definition: vpr_types.h:709
int inner_loop_recompute_divider
Definition: vpr_types.h:647
t_logical_block ** logical_block_ptrs
Definition: vpr_types.h:248
float clock_delay
Definition: vpr_types.h:355
struct s_annealing_sched AnnealSched
Definition: vpr_types.h:1040
boolean skip_clustering
Definition: vpr_types.h:610
e_rr_type
Definition: vpr_types.h:853
int prev_edge
Definition: vpr_types.h:916
enum e_operation Operation
Definition: vpr_types.h:1035
int ** lookahead_input_pins_used
Definition: vpr_types.h:161
e_route_type
Definition: vpr_types.h:682
int num_marked_nets
Definition: vpr_types.h:148
int place_chan_width
Definition: vpr_types.h:641
int mode
Definition: vpr_types.h:183
struct s_pb_stats * pb_stats
Definition: vpr_types.h:190
struct s_trace t_trace
int xmin
Definition: vpr_types.h:532
t_model * model
Definition: vpr_types.h:209
struct s_router_opts RouterOpts
Definition: vpr_types.h:1041
e_packer_algorithm
Definition: vpr_types.h:590
int ** output_nets
Definition: vpr_types.h:212
boolean allow_unrelated_clustering
Definition: vpr_types.h:611
t_model * user_models
Definition: vpr_types.h:1036
e_cost_indices
Definition: vpr_types.h:1009
t_pb_graph_node * pb_graph_node
Definition: vpr_types.h:180
int num_sinks
Definition: vpr_types.h:506
short wire_to_ipin_switch
Definition: vpr_types.h:765
enum e_base_cost_type base_cost_type
Definition: vpr_types.h:706
boolean valid
Definition: vpr_types.h:249
e_place_algorithm
Definition: vpr_types.h:632
short occ
Definition: vpr_types.h:898
t_io * constrained_inputs
Definition: vpr_types.h:434
float intra_cluster_net_delay
Definition: vpr_types.h:607
int * node_block_port
Definition: vpr_types.h:508
t_rr_type type
Definition: vpr_types.h:902
struct s_net t_net
t_pb_graph_node * expected_lowest_cost_primitive
Definition: vpr_types.h:230
int * marked_blocks
Definition: vpr_types.h:147
boolean * cb
Definition: vpr_types.h:808
t_model_chain_pattern * chain_pattern
Definition: vpr_types.h:247
boolean verify_binary_search
Definition: vpr_types.h:710
int num_wire_drivers
Definition: vpr_types.h:911
e_directionality
struct s_rr_node t_rr_node
boolean doPlacement
Definition: vpr_types.h:651
struct s_seg_details t_seg_details
int ymax
Definition: vpr_types.h:535