VPR-7.0
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
stats.c File Reference
#include <assert.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include "util.h"
#include "vpr_types.h"
#include "globals.h"
#include "rr_graph_area.h"
#include "segment_stats.h"
#include "stats.h"
#include "net_delay.h"
#include "path_delay.h"
#include "read_xml_arch_file.h"
#include "ReadOptions.h"
+ Include dependency graph for stats.c:

Go to the source code of this file.

Functions

static void load_channel_occupancies (int **chanx_occ, int **chany_occ)
 
static void get_length_and_bends_stats (void)
 
static void get_channel_occupancy_stats (void)
 
void routing_stats (boolean full_stats, enum e_route_type route_type, int num_switch, t_segment_inf *segment_inf, int num_segment, float R_minW_nmos, float R_minW_pmos, enum e_directionality directionality, boolean timing_analysis_enabled, float **net_delay, t_slack *slacks)
 
void get_num_bends_and_length (int inet, int *bends_ptr, int *len_ptr, int *segments_ptr)
 
void print_wirelen_prob_dist (void)
 
void print_lambda (void)
 
int count_netlist_clocks (void)
 

Function Documentation

int count_netlist_clocks ( void  )

Definition at line 449 of file stats.c.

449  {
450 
451  /* Count how many clocks are in the netlist. */
452 
453  int iblock, i, clock_net;
454  char * name;
455  boolean found;
456  int num_clocks = 0;
457  char ** clock_names = NULL;
458 
459  for (iblock = 0; iblock < num_logical_blocks; iblock++) {
460  if (logical_block[iblock].clock_net != OPEN) {
461  clock_net = logical_block[iblock].clock_net;
462  assert(clock_net != OPEN);
463  name = logical_block[clock_net].name;
464  /* Now that we've found a clock, let's see if we've counted it already */
465  found = FALSE;
466  for (i = 0; !found && i < num_clocks; i++) {
467  if (strcmp(clock_names[i], name) == 0) {
468  found = TRUE;
469  }
470  }
471  if (!found) {
472  /* If we get here, the clock is new and so we dynamically grow the array netlist_clocks by one. */
473  clock_names = (char **) my_realloc (clock_names, ++num_clocks * sizeof(char *));
474  clock_names[num_clocks - 1] = name;
475  }
476  }
477  }
478  free (clock_names);
479  return num_clocks;
480 }
Definition: util.h:12
static void * my_realloc(void *memblk, int ibytes)
Definition: graphics.c:512
int num_logical_blocks
Definition: globals.c:17
Definition: slre.c:50
struct s_logical_block * logical_block
Definition: globals.c:20
Definition: util.h:12

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void get_channel_occupancy_stats ( void  )
static

Definition at line 165 of file stats.c.

165  {
166 
167  /* Determines how many tracks are used in each channel. */
168 
169  int i, j, max_occ, total_x, total_y;
170  float av_occ;
171  int **chanx_occ; /* [1..nx][0..ny] */
172  int **chany_occ; /* [0..nx][1..ny] */
173 
174  chanx_occ = (int **) alloc_matrix(1, nx, 0, ny, sizeof(int));
175  chany_occ = (int **) alloc_matrix(0, nx, 1, ny, sizeof(int));
176  load_channel_occupancies(chanx_occ, chany_occ);
177 
178  vpr_printf(TIO_MESSAGE_INFO, "\n");
179  vpr_printf(TIO_MESSAGE_INFO, "X - Directed channels: j\tmax occ\tav_occ\t\tcapacity\n");
180 
181  total_x = 0;
182 
183  for (j = 0; j <= ny; j++) {
184  total_x += chan_width_x[j];
185  av_occ = 0.;
186  max_occ = -1;
187 
188  for (i = 1; i <= nx; i++) {
189  max_occ = std::max(chanx_occ[i][j], max_occ);
190  av_occ += chanx_occ[i][j];
191  }
192  av_occ /= nx;
193  vpr_printf(TIO_MESSAGE_INFO, "%d\t%d\t%-#9g\t%d\n", j, max_occ, av_occ, chan_width_x[j]);
194  }
195 
196  vpr_printf(TIO_MESSAGE_INFO, "\n");
197  vpr_printf(TIO_MESSAGE_INFO, "Y - Directed channels: i\tmax occ\tav_occ\t\tcapacity\n");
198 
199  total_y = 0;
200 
201  for (i = 0; i <= nx; i++) {
202  total_y += chan_width_y[i];
203  av_occ = 0.;
204  max_occ = -1;
205 
206  for (j = 1; j <= ny; j++) {
207  max_occ = std::max(chany_occ[i][j], max_occ);
208  av_occ += chany_occ[i][j];
209  }
210  av_occ /= ny;
211  vpr_printf(TIO_MESSAGE_INFO, "%d\t%d\t%-#9g\t%d\n", i, max_occ, av_occ, chan_width_y[i]);
212  }
213 
214  vpr_printf(TIO_MESSAGE_INFO, "\n");
215  vpr_printf(TIO_MESSAGE_INFO, "Total tracks in x-direction: %d, in y-direction: %d\n", total_x, total_y);
216  vpr_printf(TIO_MESSAGE_INFO, "\n");
217 
218  free_matrix(chanx_occ, 1, nx, 0, sizeof(int));
219  free_matrix(chany_occ, 0, nx, 1, sizeof(int));
220 }
void ** alloc_matrix(int nrmin, int nrmax, int ncmin, int ncmax, size_t elsize)
Definition: util.c:551
void free_matrix(void *vptr, int nrmin, int nrmax, int ncmin, size_t elsize)
Definition: util.c:573
int * chan_width_x
Definition: globals.c:56
int * chan_width_y
Definition: globals.c:57
static void load_channel_occupancies(int **chanx_occ, int **chany_occ)
Definition: stats.c:222
#define max(a, b)
Definition: graphics.c:171
int nx
Definition: globals.c:46
int ny
Definition: globals.c:47
messagelogger vpr_printf
Definition: util.c:17

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void get_length_and_bends_stats ( void  )
static

Definition at line 107 of file stats.c.

107  {
108 
109  /* Figures out maximum, minimum and average number of bends and net length *
110  * in the routing. */
111 
112  int inet, bends, total_bends, max_bends;
113  int length, total_length, max_length;
114  int segments, total_segments, max_segments;
115  float av_bends, av_length, av_segments;
116  int num_global_nets, num_clb_opins_reserved;
117 
118  max_bends = 0;
119  total_bends = 0;
120  max_length = 0;
121  total_length = 0;
122  max_segments = 0;
123  total_segments = 0;
124  num_global_nets = 0;
125  num_clb_opins_reserved = 0;
126 
127  for (inet = 0; inet < num_nets; inet++) {
128  if (clb_net[inet].is_global == FALSE && clb_net[inet].num_sinks != 0) { /* Globals don't count. */
129  get_num_bends_and_length(inet, &bends, &length, &segments);
130 
131  total_bends += bends;
132  max_bends = std::max(bends, max_bends);
133 
134  total_length += length;
135  max_length = std::max(length, max_length);
136 
137  total_segments += segments;
138  max_segments = std::max(segments, max_segments);
139  } else if (clb_net[inet].is_global) {
140  num_global_nets++;
141  } else {
142  num_clb_opins_reserved++;
143  }
144  }
145 
146  av_bends = (float) total_bends / (float) (num_nets - num_global_nets);
147  vpr_printf(TIO_MESSAGE_INFO, "\n");
148  vpr_printf(TIO_MESSAGE_INFO, "Average number of bends per net: %#g Maximum # of bends: %d\n", av_bends, max_bends);
149  vpr_printf(TIO_MESSAGE_INFO, "\n");
150 
151  av_length = (float) total_length / (float) (num_nets - num_global_nets);
152  vpr_printf(TIO_MESSAGE_INFO, "Number of routed nets (nonglobal): %d\n", num_nets - num_global_nets);
153  vpr_printf(TIO_MESSAGE_INFO, "Wirelength results (in units of 1 clb segments)...\n");
154  vpr_printf(TIO_MESSAGE_INFO, "\tTotal wirelength: %d, average net length: %#g\n", total_length, av_length);
155  vpr_printf(TIO_MESSAGE_INFO, "\tMaximum net length: %d\n", max_length);
156  vpr_printf(TIO_MESSAGE_INFO, "\n");
157 
158  av_segments = (float) total_segments / (float) (num_nets - num_global_nets);
159  vpr_printf(TIO_MESSAGE_INFO, "Wirelength results in terms of physical segments...\n");
160  vpr_printf(TIO_MESSAGE_INFO, "\tTotal wiring segments used: %d, average wire segments per net: %#g\n", total_segments, av_segments);
161  vpr_printf(TIO_MESSAGE_INFO, "\tMaximum segments used by a net: %d\n", max_segments);
162  vpr_printf(TIO_MESSAGE_INFO, "\tTotal local nets with reserved CLB opins: %d\n", num_clb_opins_reserved);
163 }
int num_nets
Definition: globals.c:27
Definition: util.h:12
void get_num_bends_and_length(int inet, int *bends_ptr, int *len_ptr, int *segments_ptr)
Definition: stats.c:276
boolean * is_global
#define max(a, b)
Definition: graphics.c:171
struct s_net * clb_net
Definition: globals.c:28
messagelogger vpr_printf
Definition: util.c:17

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void get_num_bends_and_length ( int  inet,
int *  bends_ptr,
int *  len_ptr,
int *  segments_ptr 
)

Definition at line 276 of file stats.c.

277  {
278 
279  /* Counts and returns the number of bends, wirelength, and number of routing *
280  * resource segments in net inet's routing. */
281 
282  struct s_trace *tptr, *prevptr;
283  int inode;
284  t_rr_type curr_type, prev_type;
285  int bends, length, segments;
286 
287  bends = 0;
288  length = 0;
289  segments = 0;
290 
291  prevptr = trace_head[inet]; /* Should always be SOURCE. */
292  if (prevptr == NULL) {
293  vpr_printf(TIO_MESSAGE_ERROR, "in get_num_bends_and_length: net #%d has no traceback.\n", inet);
294  exit(1);
295  }
296  inode = prevptr->index;
297  prev_type = rr_node[inode].type;
298 
299  tptr = prevptr->next;
300 
301  while (tptr != NULL) {
302  inode = tptr->index;
303  curr_type = rr_node[inode].type;
304 
305  if (curr_type == SINK) { /* Starting a new segment */
306  tptr = tptr->next; /* Link to existing path - don't add to len. */
307  if (tptr == NULL)
308  break;
309 
310  curr_type = rr_node[tptr->index].type;
311  }
312 
313  else if (curr_type == CHANX || curr_type == CHANY) {
314  segments++;
315  length += 1 + rr_node[inode].xhigh - rr_node[inode].xlow
316  + rr_node[inode].yhigh - rr_node[inode].ylow;
317 
318  if (curr_type != prev_type
319  && (prev_type == CHANX || prev_type == CHANY))
320  bends++;
321  }
322 
323  prev_type = curr_type;
324  tptr = tptr->next;
325  }
326 
327  *bends_ptr = bends;
328  *len_ptr = length;
329  *segments_ptr = segments;
330 }
short xhigh
Definition: vpr_types.h:891
int index
Definition: vpr_types.h:866
t_rr_node * rr_node
Definition: globals.c:70
short ylow
Definition: vpr_types.h:892
struct s_trace * next
Definition: vpr_types.h:870
struct s_trace ** trace_head
Definition: globals.c:64
short yhigh
Definition: vpr_types.h:893
enum e_rr_type t_rr_type
short xlow
Definition: vpr_types.h:890
messagelogger vpr_printf
Definition: util.c:17
t_rr_type type
Definition: vpr_types.h:902

+ Here is the caller graph for this function:

static void load_channel_occupancies ( int **  chanx_occ,
int **  chany_occ 
)
static

Definition at line 222 of file stats.c.

222  {
223 
224  /* Loads the two arrays passed in with the total occupancy at each of the *
225  * channel segments in the FPGA. */
226 
227  int i, j, inode, inet;
228  struct s_trace *tptr;
229  t_rr_type rr_type;
230 
231  /* First set the occupancy of everything to zero. */
232 
233  for (i = 1; i <= nx; i++)
234  for (j = 0; j <= ny; j++)
235  chanx_occ[i][j] = 0;
236 
237  for (i = 0; i <= nx; i++)
238  for (j = 1; j <= ny; j++)
239  chany_occ[i][j] = 0;
240 
241  /* Now go through each net and count the tracks and pins used everywhere */
242 
243  for (inet = 0; inet < num_nets; inet++) {
244 
245  if (clb_net[inet].is_global && clb_net[inet].num_sinks != 0) /* Skip global and empty nets. */
246  continue;
247 
248  tptr = trace_head[inet];
249  while (tptr != NULL) {
250  inode = tptr->index;
251  rr_type = rr_node[inode].type;
252 
253  if (rr_type == SINK) {
254  tptr = tptr->next; /* Skip next segment. */
255  if (tptr == NULL)
256  break;
257  }
258 
259  else if (rr_type == CHANX) {
260  j = rr_node[inode].ylow;
261  for (i = rr_node[inode].xlow; i <= rr_node[inode].xhigh; i++)
262  chanx_occ[i][j]++;
263  }
264 
265  else if (rr_type == CHANY) {
266  i = rr_node[inode].xlow;
267  for (j = rr_node[inode].ylow; j <= rr_node[inode].yhigh; j++)
268  chany_occ[i][j]++;
269  }
270 
271  tptr = tptr->next;
272  }
273  }
274 }
short xhigh
Definition: vpr_types.h:891
int index
Definition: vpr_types.h:866
t_rr_node * rr_node
Definition: globals.c:70
short ylow
Definition: vpr_types.h:892
int num_nets
Definition: globals.c:27
struct s_trace * next
Definition: vpr_types.h:870
boolean * is_global
struct s_net * clb_net
Definition: globals.c:28
int nx
Definition: globals.c:46
struct s_trace ** trace_head
Definition: globals.c:64
short yhigh
Definition: vpr_types.h:893
enum e_rr_type t_rr_type
short xlow
Definition: vpr_types.h:890
int ny
Definition: globals.c:47
t_rr_type type
Definition: vpr_types.h:902

+ Here is the caller graph for this function:

void print_lambda ( void  )

Definition at line 417 of file stats.c.

417  {
418 
419  /* Finds the average number of input pins used per clb. Does not *
420  * count inputs which are hooked to global nets (i.e. the clock *
421  * when it is marked global). */
422 
423  int bnum, ipin;
424  int num_inputs_used = 0;
425  int iclass, inet;
426  float lambda;
427  t_type_ptr type;
428 
429  for (bnum = 0; bnum < num_blocks; bnum++) {
430  type = block[bnum].type;
431  assert(type != NULL);
432  if (type != IO_TYPE) {
433  for (ipin = 0; ipin < type->num_pins; ipin++) {
434  iclass = type->pin_class[ipin];
435  if (type->class_inf[iclass].type == RECEIVER) {
436  inet = block[bnum].nets[ipin];
437  if (inet != OPEN) /* Pin is connected? */
438  if (clb_net[inet].is_global == FALSE) /* Not a global clock */
439  num_inputs_used++;
440  }
441  }
442  }
443  }
444 
445  lambda = (float) num_inputs_used / (float) num_blocks;
446  vpr_printf(TIO_MESSAGE_INFO, "Average lambda (input pins used per clb) is: %g\n", lambda);
447 }
struct s_class * class_inf
t_type_ptr type
Definition: vpr_types.h:561
int num_blocks
Definition: globals.c:30
Definition: util.h:12
boolean * is_global
struct s_block * block
Definition: globals.c:31
struct s_net * clb_net
Definition: globals.c:28
t_type_ptr IO_TYPE
Definition: globals.c:40
Definition: slre.c:50
int * nets
Definition: vpr_types.h:562
enum e_pin_type type
messagelogger vpr_printf
Definition: util.c:17
void print_wirelen_prob_dist ( void  )

Definition at line 332 of file stats.c.

332  {
333 
334  /* Prints out the probability distribution of the wirelength / number *
335  * input pins on a net -- i.e. simulates 2-point net length probability *
336  * distribution. */
337 
338  float *prob_dist;
339  float norm_fac, two_point_length;
340  int inet, bends, length, segments, index;
341  float av_length;
342  int prob_dist_size, i, incr;
343 
344  prob_dist_size = nx + ny + 10;
345  prob_dist = (float *) my_calloc(prob_dist_size, sizeof(float));
346  norm_fac = 0.;
347 
348  for (inet = 0; inet < num_nets; inet++) {
349  if (clb_net[inet].is_global == FALSE && clb_net[inet].num_sinks != 0) {
350  get_num_bends_and_length(inet, &bends, &length, &segments);
351 
352  /* Assign probability to two integer lengths proportionately -- i.e. *
353  * if two_point_length = 1.9, add 0.9 of the pins to prob_dist[2] and *
354  * only 0.1 to prob_dist[1]. */
355 
356  two_point_length = (float) length
357  / (float) (clb_net[inet].num_sinks);
358  index = (int) two_point_length;
359  if (index >= prob_dist_size) {
360 
361  vpr_printf(TIO_MESSAGE_WARNING, "index (%d) to prob_dist exceeds its allocated size (%d).\n",
362  index, prob_dist_size);
363  vpr_printf(TIO_MESSAGE_INFO, "Realloc'ing to increase 2-pin wirelen prob distribution array.\n");
364  incr = index - prob_dist_size + 2;
365  prob_dist_size += incr;
366  prob_dist = (float *)my_realloc(prob_dist,
367  prob_dist_size * sizeof(float));
368  for (i = prob_dist_size - incr; i < prob_dist_size; i++)
369  prob_dist[i] = 0.0;
370  }
371  prob_dist[index] += (clb_net[inet].num_sinks)
372  * (1 - two_point_length + index);
373 
374  index++;
375  if (index >= prob_dist_size) {
376 
377  vpr_printf(TIO_MESSAGE_WARNING, "Warning: index (%d) to prob_dist exceeds its allocated size (%d).\n",
378  index, prob_dist_size);
379  vpr_printf(TIO_MESSAGE_INFO, "Realloc'ing to increase 2-pin wirelen prob distribution array.\n");
380  incr = index - prob_dist_size + 2;
381  prob_dist_size += incr;
382  prob_dist = (float *)my_realloc(prob_dist,
383  prob_dist_size * sizeof(float));
384  for (i = prob_dist_size - incr; i < prob_dist_size; i++)
385  prob_dist[i] = 0.0;
386  }
387  prob_dist[index] += (clb_net[inet].num_sinks)
388  * (1 - index + two_point_length);
389 
390  norm_fac += clb_net[inet].num_sinks;
391  }
392  }
393 
394  /* Normalize so total probability is 1 and print out. */
395 
396  vpr_printf(TIO_MESSAGE_INFO, "\n");
397  vpr_printf(TIO_MESSAGE_INFO, "Probability distribution of 2-pin net lengths:\n");
398  vpr_printf(TIO_MESSAGE_INFO, "\n");
399  vpr_printf(TIO_MESSAGE_INFO, "Length p(Lenth)\n");
400 
401  av_length = 0;
402 
403  for (index = 0; index < prob_dist_size; index++) {
404  prob_dist[index] /= norm_fac;
405  vpr_printf(TIO_MESSAGE_INFO, "%6d %10.6f\n", index, prob_dist[index]);
406  av_length += prob_dist[index] * index;
407  }
408 
409  vpr_printf(TIO_MESSAGE_INFO, "\n");
410  vpr_printf(TIO_MESSAGE_INFO, "Number of 2-pin nets: ;%g;\n", norm_fac);
411  vpr_printf(TIO_MESSAGE_INFO, "Expected value of 2-pin net length (R): ;%g;\n", av_length);
412  vpr_printf(TIO_MESSAGE_INFO, "Total wire length: ;%g;\n", norm_fac * av_length);
413 
414  free(prob_dist);
415 }
int index
Definition: vpr_types.h:866
void * my_calloc(size_t nelem, size_t size)
Definition: util.c:132
int num_nets
Definition: globals.c:27
Definition: util.h:12
void get_num_bends_and_length(int inet, int *bends_ptr, int *len_ptr, int *segments_ptr)
Definition: stats.c:276
boolean * is_global
struct s_net * clb_net
Definition: globals.c:28
int nx
Definition: globals.c:46
static void * my_realloc(void *memblk, int ibytes)
Definition: graphics.c:512
int ny
Definition: globals.c:47
messagelogger vpr_printf
Definition: util.c:17
int num_sinks
Definition: vpr_types.h:506

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void routing_stats ( boolean  full_stats,
enum e_route_type  route_type,
int  num_switch,
t_segment_inf segment_inf,
int  num_segment,
float  R_minW_nmos,
float  R_minW_pmos,
enum e_directionality  directionality,
boolean  timing_analysis_enabled,
float **  net_delay,
t_slack slacks 
)

Definition at line 27 of file stats.c.

31  {
32 
33  /* Prints out various statistics about the current routing. Both a routing *
34  * and an rr_graph must exist when you call this routine. */
35 
36  float area, used_area;
37  int i, j;
38 
41 
42  vpr_printf(TIO_MESSAGE_INFO, "Logic area (in minimum width transistor areas, excludes I/Os and empty grid tiles)...\n");
43 
44  area = 0;
45  for (i = 1; i <= nx; i++) {
46  for (j = 1; j <= ny; j++) {
47  if (grid[i][j].offset == 0) {
48  if (grid[i][j].type->area == UNDEFINED) {
49  area += grid_logic_tile_area * grid[i][j].type->height;
50  } else {
51  area += grid[i][j].type->area;
52  }
53  }
54  }
55  }
56  /* Todo: need to add pitch of routing to blocks with height > 3 */
57  vpr_printf(TIO_MESSAGE_INFO, "\tTotal logic block area (Warning, need to add pitch of routing to blocks with height > 3): %g\n", area);
58 
59  used_area = 0;
60  for (i = 0; i < num_blocks; i++) {
61  if (block[i].type != IO_TYPE) {
62  if (block[i].type->area == UNDEFINED) {
63  used_area += grid_logic_tile_area * block[i].type->height;
64  } else {
65  used_area += block[i].type->area;
66  }
67  }
68  }
69  vpr_printf(TIO_MESSAGE_INFO, "\tTotal used logic block area: %g\n", used_area);
70 
71  if (route_type == DETAILED) {
72  count_routing_transistors(directionality, num_switch, segment_inf,
73  R_minW_nmos, R_minW_pmos);
74  get_segment_usage_stats(num_segment, segment_inf);
75 
76  if (timing_analysis_enabled) {
78 
80 
81 #ifdef HACK_LUT_PIN_SWAPPING
82  do_timing_analysis(slacks, FALSE, TRUE, TRUE);
83 #else
85 #endif
86  if (getEchoEnabled()) {
93  }
94 
98 
100  }
101  }
102 
103  if (full_stats == TRUE)
105 }
t_type_ptr type
Definition: vpr_types.h:522
void print_timing_stats(void)
Definition: path_delay.c:3081
void load_net_delay_from_routing(float **net_delay, struct s_net *nets, int n_nets)
Definition: net_delay.c:136
static float ** net_delay
void get_segment_usage_stats(int num_segment, t_segment_inf *segment_inf)
Definition: segment_stats.c:13
void print_wirelen_prob_dist(void)
Definition: stats.c:332
int num_nets
Definition: globals.c:27
void print_critical_path(const char *fname)
Definition: path_delay.c:2458
void do_timing_analysis(t_slack *slacks, boolean is_prepacked, boolean do_lut_input_balancing, boolean is_final_analysis)
Definition: path_delay.c:1613
float ** slack
Definition: vpr_types.h:405
t_type_ptr type
Definition: vpr_types.h:561
int num_blocks
Definition: globals.c:30
#define UNDEFINED
Definition: vpr_types.h:103
boolean getEchoEnabled(void)
Definition: ReadOptions.c:67
Definition: util.h:12
void print_lut_remapping(const char *fname)
Definition: path_delay.c:2430
struct s_block * block
Definition: globals.c:31
struct s_net * clb_net
Definition: globals.c:28
int nx
Definition: globals.c:46
boolean isEchoFileEnabled(enum e_echo_files echo_option)
Definition: ReadOptions.c:115
static void get_channel_occupancy_stats(void)
Definition: stats.c:165
struct s_grid_tile ** grid
Definition: globals.c:59
void print_criticality(t_slack *slacks, boolean criticality_is_normalized, const char *fname)
Definition: path_delay.c:559
static void get_length_and_bends_stats(void)
Definition: stats.c:107
char * getOutputFileName(enum e_output_files ename)
Definition: ReadOptions.c:196
t_type_ptr IO_TYPE
Definition: globals.c:40
void print_slack(float **slack, boolean slack_is_normalized, const char *fname)
Definition: path_delay.c:441
void print_timing_graph(const char *fname)
Definition: path_delay.c:1388
float grid_logic_tile_area
Definition: globals.c:13
char * getEchoFileName(enum e_echo_files echo_option)
Definition: ReadOptions.c:122
int ny
Definition: globals.c:47
messagelogger vpr_printf
Definition: util.c:17
void print_net_delay(float **net_delay, const char *fname)
Definition: path_delay.c:670
void load_timing_graph_net_delays(float **net_delay)
Definition: path_delay.c:368
void count_routing_transistors(enum e_directionality directionality, int num_switch, t_segment_inf *segment_inf, float R_minW_nmos, float R_minW_pmos)
Definition: rr_graph_area.c:36
Definition: util.h:12

+ Here is the call graph for this function:

+ Here is the caller graph for this function: