72 vpr_printf(TIO_MESSAGE_INFO,
"VPR FPGA Placement and Routing.\n");
74 vpr_printf(TIO_MESSAGE_INFO,
"Compiled: " __DATE__
".\n");
75 vpr_printf(TIO_MESSAGE_INFO,
"University of Toronto\n");
76 vpr_printf(TIO_MESSAGE_INFO,
"vpr@eecg.utoronto.ca\n");
77 vpr_printf(TIO_MESSAGE_INFO,
"This is free open source code under MIT license.\n");
84 "Usage: vpr fpga_architecture.xml circuit_name [Options ...]\n");
87 "General Options: [--nodisp] [--auto <int>] [--pack]\n");
89 "\t[--place] [--route] [--timing_analyze_only_with_net_delay <float>]\n");
91 "\t[--fast] [--full_stats] [--timing_analysis on | off] [--outfile_prefix <string>]\n");
93 "\t[--blif_file <string>][--net_file <string>][--place_file <string>]\n");
95 "\t[--route_file <string>][--sdc_file <string>][--echo_file on | off]\n");
97 vpr_printf(TIO_MESSAGE_INFO,
"Packer Options:\n");
101 vpr_printf(TIO_MESSAGE_INFO,
"\t[--timing_driven_clustering on|off]\n");
103 "\t[--cluster_seed_type timing|max_inputs] [--alpha_clustering <float>] [--beta_clustering <float>]\n");
105 vpr_printf(TIO_MESSAGE_INFO,
"\t[--allow_unrelated_clustering on|off]\n");
110 "\t[--connection_driven_clustering on|off] \n");
112 vpr_printf(TIO_MESSAGE_INFO,
"Placer Options:\n");
114 "\t[--place_algorithm bounding_box | net_timing_driven | path_timing_driven]\n");
115 vpr_printf(TIO_MESSAGE_INFO,
"\t[--init_t <float>] [--exit_t <float>]\n");
117 "\t[--alpha_t <float>] [--inner_num <float>] [--seed <int>]\n");
118 vpr_printf(TIO_MESSAGE_INFO,
"\t[--place_cost_exp <float>]\n");
119 vpr_printf(TIO_MESSAGE_INFO,
"\t[--place_chan_width <int>] \n");
120 vpr_printf(TIO_MESSAGE_INFO,
"\t[--fix_pins random | <file.pads>]\n");
121 vpr_printf(TIO_MESSAGE_INFO,
"\t[--enable_timing_computations on | off]\n");
122 vpr_printf(TIO_MESSAGE_INFO,
"\t[--block_dist <int>]\n");
125 "Placement Options Valid Only for Timing-Driven Placement:\n");
126 vpr_printf(TIO_MESSAGE_INFO,
"\t[--timing_tradeoff <float>]\n");
127 vpr_printf(TIO_MESSAGE_INFO,
"\t[--recompute_crit_iter <int>]\n");
128 vpr_printf(TIO_MESSAGE_INFO,
"\t[--inner_loop_recompute_divider <int>]\n");
129 vpr_printf(TIO_MESSAGE_INFO,
"\t[--td_place_exp_first <float>]\n");
130 vpr_printf(TIO_MESSAGE_INFO,
"\t[--td_place_exp_last <float>]\n");
133 "Router Options: [-max_router_iterations <int>] [-bb_factor <int>]\n");
135 "\t[--initial_pres_fac <float>] [--pres_fac_mult <float>]\n");
137 "\t[--acc_fac <float>] [--first_iter_pres_fac <float>]\n");
139 "\t[--bend_cost <float>] [--route_type global | detailed]\n");
141 "\t[--verify_binary_search] [--route_chan_width <int>]\n");
143 "\t[--router_algorithm breadth_first | timing_driven]\n");
145 "\t[--base_cost_type intrinsic_delay | delay_normalized | demand_only]\n");
148 "Routing options valid only for timing-driven routing:\n");
150 "\t[--astar_fac <float>] [--max_criticality <float>]\n");
151 vpr_printf(TIO_MESSAGE_INFO,
"\t[--criticality_exp <float>]\n");
163 char* pszLogFileName =
"vpr_stdout.log";
164 unsigned char enableTimeStamps = 1;
165 unsigned long maxWarningCount = 100000;
166 unsigned long maxErrorCount = 1000;
168 if (PrintHandlerExists() == 1) {
174 PrintHandlerNew(pszLogFileName);
175 PrintHandlerInit(enableTimeStamps, maxWarningCount, maxErrorCount);
189 memset(arch, 0,
sizeof(
t_arch));
198 vpr_setup->constant_net_delay = options->constant_net_delay;
201 SetupVPR(options, vpr_setup->TimingEnabled,
TRUE, &vpr_setup->FileNameOpts,
202 arch, &vpr_setup->Operation, &vpr_setup->user_models,
203 &vpr_setup->library_models, &vpr_setup->PackerOpts,
204 &vpr_setup->PlacerOpts, &vpr_setup->AnnealSched,
205 &vpr_setup->RouterOpts, &vpr_setup->RoutingArch,
206 &vpr_setup->Segments, &vpr_setup->Timing, &vpr_setup->ShowGraphics,
207 &vpr_setup->GraphPause, &vpr_setup->PowerOpts);
211 CheckArch(*arch, vpr_setup->TimingEnabled);
214 CheckSetup(vpr_setup->Operation, vpr_setup->PlacerOpts,
215 vpr_setup->AnnealSched, vpr_setup->RouterOpts,
216 vpr_setup->RoutingArch, vpr_setup->Segments, vpr_setup->Timing,
224 vpr_setup->PackerOpts.sweep_hanging_nets_and_inputs,
225 vpr_setup->user_models, vpr_setup->library_models,
226 vpr_setup->PowerOpts.do_power, vpr_setup->FileNameOpts.ActFile);
237 int *num_instances_type, *num_blocks_type;
239 int current, high, low;
243 if (vpr_setup.FileNameOpts.NetFile) {
255 vpr_setup.constant_net_delay);
268 if (Arch.clb_grid.IsAuto) {
270 while (high == -1 || low < high) {
272 if (Arch.clb_grid.Aspect >= 1.0) {
274 nx =
nint(current * Arch.clb_grid.Aspect);
277 ny =
nint(current / Arch.clb_grid.Aspect);
281 "Auto-sizing FPGA at x = %d y = %d\n",
nx,
ny);
289 if (num_blocks_type[i] > num_instances_type[i]) {
299 current = current * 2;
302 "FPGA required is too large for current architecture settings.\n");
309 current = low + ((high - low) / 2);
313 current = low + ((high - low) / 2);
317 if (Arch.clb_grid.Aspect >= 1.0) {
319 nx =
nint(current * Arch.clb_grid.Aspect);
322 ny =
nint(current / Arch.clb_grid.Aspect);
325 vpr_printf(TIO_MESSAGE_INFO,
"FPGA auto-sized to x = %d y = %d\n",
328 nx = Arch.clb_grid.W;
329 ny = Arch.clb_grid.H;
334 "The circuit will be mapped into a %d x %d array of clbs.\n",
340 if (num_blocks_type[i] > num_instances_type[i]) {
347 "Not enough physical locations for type %s, number of blocks is %d but number of locations is %d.\n",
349 num_instances_type[i]);
354 vpr_printf(TIO_MESSAGE_INFO,
"Resource usage...\n");
357 "\tNetlist %d\tblocks of type: %s\n",
360 "\tArchitecture %d\tblocks of type: %s\n",
367 free(num_blocks_type);
368 free(num_instances_type);
374 float inter_cluster_delay =
UNDEFINED, Tdel_opin_switch, Tdel_wire_switch,
375 Tdel_wtoi_switch, R_opin_switch, R_wire_switch, R_wtoi_switch,
376 Cout_opin_switch, Cout_wire_switch, Cout_wtoi_switch,
377 opin_switch_del, wire_switch_del, wtoi_switch_del, Rmetal, Cmetal,
378 first_wire_seg_delay, second_wire_seg_delay;
380 vpr_printf(TIO_MESSAGE_INFO,
"Initialize packing.\n");
386 if (vpr_setup.PackerOpts.timing_driven
387 && vpr_setup.PackerOpts.auto_compute_inter_cluster_net_delay) {
389 Tdel_opin_switch, R_opin_switch, Cout_opin_switch);
391 Tdel_wire_switch, R_wire_switch, Cout_wire_switch);
393 vpr_setup.RoutingArch.wire_to_ipin_switch, Tdel_wtoi_switch,
394 R_wtoi_switch, Cout_wtoi_switch);
395 Rmetal = arch.Segments[0].Rmetal;
396 Cmetal = arch.Segments[0].Cmetal;
401 #define WIRE_SEGMENT_LENGTH 4
402 first_wire_seg_delay = opin_switch_del
405 second_wire_seg_delay = wire_switch_del
406 + (R_wire_switch + Rmetal * WIRE_SEGMENT_LENGTH / 2)
407 * (Cout_wire_switch + Cmetal * WIRE_SEGMENT_LENGTH);
408 inter_cluster_delay = 4
409 * (first_wire_seg_delay + second_wire_seg_delay
413 try_pack(&vpr_setup.PackerOpts, &arch, vpr_setup.user_models,
414 vpr_setup.library_models, vpr_setup.Timing, inter_cluster_delay);
416 #ifdef CLOCKS_PER_SEC
417 vpr_printf(TIO_MESSAGE_INFO,
"Packing took %g seconds.\n",
418 (
float) (end - begin) / CLOCKS_PER_SEC);
419 vpr_printf(TIO_MESSAGE_INFO,
"Packing completed.\n");
421 vpr_printf(TIO_MESSAGE_INFO,
"Packing took %g seconds.\n", (
float)(end - begin) / CLK_PER_SEC);
429 vpr_setup.RouterOpts.route_type);
430 if (vpr_setup.ShowGraphics) {
437 vpr_setup.FileNameOpts.PlaceFile, vpr_setup.FileNameOpts.NetFile,
438 vpr_setup.FileNameOpts.ArchFile, vpr_setup.FileNameOpts.RouteFile,
439 vpr_setup.AnnealSched, vpr_setup.RouterOpts, vpr_setup.RoutingArch,
440 vpr_setup.Segments, vpr_setup.Timing, arch.Chans, arch.models,
441 arch.Directs, arch.num_directs);
446 if (vpr_setup.ShowGraphics)
486 free(prev_port->
name);
493 free(prev_port->
name);
511 for (i = 0; i < 4; i++) {
588 for (k = 0; k < 4; k++) {
629 for (i = 0; i < pb_type->
num_modes; i++) {
673 free(pb_type->
modes);
699 for (i = 0; i < pb_type->
num_ports; i++) {
708 free(pb_type->
ports);
731 free(
clb_net[i].node_block_pin);
732 free(
clb_net[i].node_block_port);
740 if (
block[i].pb != NULL) {
756 while (p_io_removed != NULL) {
767 if (vpr_setup.Timing.SDCFile != NULL) {
768 free(vpr_setup.Timing.SDCFile);
769 vpr_setup.Timing.SDCFile = NULL;
784 if (vpr_setup.RouterOpts.doRouting) {
790 PrintHandlerDelete();
814 OUTP boolean * ShowGraphics,
OUTP int *GraphPause,
816 SetupVPR(Options, TimingEnabled, readArchFile, FileNameOpts, Arch,
817 Operation, user_models, library_models, PackerOpts, PlacerOpts,
818 AnnealSched, RouterOpts, RoutingArch, Segments, Timing,
819 ShowGraphics, GraphPause, PowerOpts);
835 CheckSetup(Operation, PlacerOpts, AnnealSched, RouterOpts, RoutingArch,
836 Segments, Timing, Chans);
840 INP boolean sweep_hanging_nets_and_inputs,
INP t_model *user_models,
841 INP t_model *library_models,
boolean read_activity_file,
842 char * activity_file) {
844 library_models, read_activity_file, activity_file);
856 const char* default_name) {
921 final_routing_trace[i].
iblock = iblock;
924 final_routing_trace[i].
next = NULL;
934 return final_routing_trace;
941 int i, iblock, inode, ipin, inet;
943 t_trace *current, *new_trace, *inter_cb_trace;
949 inode = trace->
index;
967 new_trace->
next = NULL;
968 current->
next = new_trace;
975 if (inter_cb_trace != NULL) {
976 inter_cb_trace = inter_cb_trace->
next;
978 while (inter_cb_trace != NULL) {
986 new_trace->
next = NULL;
987 current->
next = new_trace;
989 current = current->
next;
1001 new_trace->
next = NULL;
1002 current->
next = new_trace;
1006 current = current->
next;
1009 inter_cb_trace = inter_cb_trace->
next;
1017 for (i = 0; i < local_rr_graph[inode].
num_edges; i++) {
1018 if (local_rr_graph[local_rr_graph[inode].edges[i]].prev_node
1020 if (success ==
FALSE) {
1024 current = current->
next;
1028 current->
next = NULL;
1032 new_trace->
index = local_rr_graph[inode].
edges[i];
1035 new_trace->
next = NULL;
1036 current->
next = new_trace;
1047 int iblock, inode, iprev_block;
1050 const char *
name_type[] = {
"SOURCE",
"SINK",
"IPIN",
"OPIN",
"CHANX",
1051 "CHANY",
"INTRA_CLUSTER_EDGE" };
1057 current = &trace[i];
1060 fprintf(fp,
"Net %s (%d)\n\n",
vpack_net[i].name, i);
1061 while (current != NULL) {
1062 iblock = current->
iblock;
1063 inode = current->
index;
1064 if (iblock !=
OPEN) {
1065 if (iprev_block != iblock) {
1066 iprev_block = iblock;
1067 fprintf(fp,
"Block %s (%d) (%d, %d, %d):\n",
1072 fprintf(fp,
"\tNode:\t%d\t%s[%d].%s[%d]", inode,
1073 local_rr_graph[inode].pb_graph_pin->parent_node->pb_type->name,
1078 fprintf(fp,
"Node:\t%d\t%6s (%d,%d) ", inode,
1079 name_type[(
int)
rr_node[inode].type],
1084 fprintf(fp,
"to (%d,%d) ",
rr_node[inode].xhigh,
1087 switch (
rr_node[inode].type) {
1093 fprintf(fp,
" Pad: ");
1095 fprintf(fp,
" Pin: ");
1101 fprintf(fp,
" Track: ");
1108 fprintf(fp,
" Pad: ");
1110 fprintf(fp,
" Class: ");
1116 "in print_route: Unexpected traceback element type: %d (%s).\n",
1118 name_type[
rr_node[inode].type]);
1123 fprintf(fp,
"%d ",
rr_node[inode].ptc_num);
1131 current = current->
next;
1154 while (trace != NULL) {
1160 assert(
clb_net[i].node_block[j] == iblock);
1174 trace = trace->
next;
1176 assert(j ==
clb_net[i].num_sinks + 1);
1181 t_trace **saved_ext_rr_trace_head, **saved_ext_rr_trace_tail;
1183 int num_ext_rr_node, num_ext_nets;
1213 #ifdef HACK_LUT_PIN_SWAPPING
1226 "Failed to resync post routed solution with clustered netlist.\n");
1227 vpr_printf(TIO_MESSAGE_ERROR,
"Cannot recover from error.\n");
1253 if (pb->
name != NULL) {
1257 if (lut_pin_remap != NULL) {
1273 for (i = 0; i < lut_size; i++) {
1275 free(local_rr_graph[snode].edges);
1276 local_rr_graph[snode].
edges = NULL;
1279 for (i = 0; i < lut_size; i++) {
1280 input = lut_pin_remap[i];
1281 if (input !=
OPEN) {
1284 assert(local_rr_graph[snode].num_edges == 0);
1288 local_rr_graph[snode].
edges[0] =
1316 int i, mode, ipin, new_loc;
1322 int inet, ivpack_net;
1329 pb_type = pb_graph_node->
pb_type;
1333 assert(
block[iblock].pb->mode == 0);
1344 if (
block[iblock].pb->child_pbs[0][i].
name != NULL) {
1356 trace = trace->
next;
1362 assert(temp[0][new_loc].name == NULL);
1371 if (
block[iblock].pb->child_pbs[0][i].
name != NULL) {
1376 while (temp[0][new_loc].name != NULL) {
1384 free(
block[iblock].pb->child_pbs);
1394 if (pb->
name == NULL) {
1426 boolean power_error;
1435 vpr_printf(TIO_MESSAGE_INFO,
"\n\nPower Estimation:\n");
1436 vpr_printf(TIO_MESSAGE_INFO,
"-----------------\n");
1438 vpr_printf(TIO_MESSAGE_INFO,
"Initializing power module\n");
1444 vpr_printf(TIO_MESSAGE_ERROR,
"Power initialization failed.\n");
1448 float power_runtime_s;
1450 vpr_printf(TIO_MESSAGE_INFO,
"Running power estimation\n");
1453 power_ret_code =
power_total(&power_runtime_s, vpr_setup, &Arch,
1459 "Power estimation failed. See power output for error details.\n");
1462 "Power estimation completed with warnings. See power output for more details.\n");
1465 vpr_printf(TIO_MESSAGE_INFO,
"Power estimation took %g seconds\n",
1471 vpr_printf(TIO_MESSAGE_INFO,
"Uninitializing power module\n");
1474 vpr_printf(TIO_MESSAGE_ERROR,
"Power uninitialization failed.\n");
void setEchoEnabled(boolean echo_enabled)
void free_logical_blocks(void)
void printClusteredNetlistStats(void)
t_clock_network * clock_inf
t_interconnect * interconnect
FILE * my_fopen(const char *fname, const char *flag, int prompt)
t_port_power * port_power
void vpr_setup_vpr(INP t_options *Options, INP boolean TimingEnabled, INP boolean readArchFile, OUTP struct s_file_name_opts *FileNameOpts, INOUTP t_arch *Arch, OUTP enum e_operation *Operation, OUTP t_model **user_models, OUTP t_model **library_models, OUTP struct s_packer_opts *PackerOpts, OUTP struct s_placer_opts *PlacerOpts, OUTP struct s_annealing_sched *AnnealSched, OUTP struct s_router_opts *RouterOpts, OUTP struct s_det_routing_arch *RoutingArch, OUTP t_segment_inf **Segments, OUTP t_timing_inf *Timing, OUTP boolean *ShowGraphics, OUTP int *GraphPause, t_power_opts *PowerOpts)
void close_graphics(void)
struct s_trace ** trace_tail
struct s_pb_type * pb_type_children
#define WIRE_SEGMENT_LENGTH
void free_cluster_legality_checker(void)
void vpr_free_vpr_data_structures(INOUTP t_arch Arch, INOUTP t_options options, INOUTP t_vpr_setup vpr_setup)
struct s_linked_vptr * circuit_p_io_removed
boolean IsPostSynthesisEnabled(INP t_options *Options)
struct s_pb_graph_node * parent_pb_graph_node
void free_legalizer_for_cluster(INP t_block *clb, boolean free_local_rr_graph)
void vpr_check_options(INP t_options Options, INP boolean TimingEnabled)
void vpr_print_usage(void)
struct s_rr_node * rr_graph
t_pb_graph_pin * get_pb_graph_node_pin_from_clb_net(int inet, int ipin)
int * clb_to_vpack_net_mapping
static void free_arch(t_arch *Arch)
void vpr_read_options(INP int argc, INP char **argv, OUTP t_options *options)
float get_switch_info(short switch_index, float &Tdel_switch, float &R_switch, float &Cout_switch)
float get_critical_path_delay(void)
void free_chunk_memory_trace(void)
boolean power_init(char *power_out_filepath, char *cmos_tech_behavior_filepath, t_arch *arch, t_det_routing_arch *routing_arch)
void vpr_show_setup(INP t_options options, INP t_vpr_setup vpr_setup)
void vpr_check_arch(INP t_arch Arch, INP boolean TimingEnabled)
boolean IsTimingEnabled(INP t_options *Options)
boolean IsEchoEnabled(INP t_options *Options)
static t_trace * alloc_and_load_final_routing_trace()
void * my_calloc(size_t nelem, size_t size)
struct s_model_ports * next
t_pb_type_power * pb_type_power
void free_trace_structs(void)
void CheckOptions(INP t_options Options, INP boolean TimingEnabled)
void ReadOptions(INP int argc, INP char **argv, OUTP t_options *Options)
void reload_ext_net_rr_terminal_cluster(void)
void force_post_place_route_cb_input_pins(int iblock)
t_pb_graph_pin ** output_pins
void vpr_init_pre_place_and_route(INP t_vpr_setup vpr_setup, INP t_arch Arch)
static void reload_intra_cluster_nets(t_pb *pb)
void reset_legalizer_for_cluster(t_block *clb)
void vpr_alloc_and_load_output_file_names(const char *default_name)
struct s_file_name_opts FileNameOpts
static void free_circuit(void)
boolean getEchoEnabled(void)
int count_netlist_clocks(void)
void free_output_file_names()
static const char * name_type[]
boolean power_uninit(void)
void alloc_and_load_grid(INOUTP int *num_instances_type)
t_solution_inf g_solution_inf
boolean try_breadth_first_route_cluster(void)
void SetupVPR(INP t_options *Options, INP boolean TimingEnabled, INP boolean readArchFile, OUTP struct s_file_name_opts *FileNameOpts, INOUTP t_arch *Arch, OUTP enum e_operation *Operation, OUTP t_model **user_models, OUTP t_model **library_models, OUTP struct s_packer_opts *PackerOpts, OUTP struct s_placer_opts *PlacerOpts, OUTP struct s_annealing_sched *AnnealSched, OUTP struct s_router_opts *RouterOpts, OUTP struct s_det_routing_arch *RoutingArch, OUTP t_segment_inf **Segments, OUTP t_timing_inf *Timing, OUTP boolean *ShowGraphics, OUTP int *GraphPause, t_power_opts *PowerOpts)
void init_graphics(const char *window_name, int cindex)
t_pin_to_pin_annotation * annotations
void set_pb_graph_mode(t_pb_graph_node *pb_graph_node, int mode, int isOn)
static void clay_logical_equivalence_handling(const t_arch *arch)
void CheckArch(INP t_arch Arch, INP boolean TimingEnabled)
static void * my_malloc(int ibytes)
void do_constant_net_delay_timing_analysis(t_timing_inf timing_inf, float constant_net_delay_value)
void vpr_pack(INP t_vpr_setup vpr_setup, INP t_arch arch)
int * vpack_to_clb_net_mapping
void vpr_set_output_file_name(enum e_output_files ename, const char *name, const char *default_name)
void vpr_read_and_process_blif(INP char *blif_file, INP boolean sweep_hanging_nets_and_inputs, INP t_model *user_models, INP t_model *library_models, boolean read_activity_file, char *activity_file)
void free_draw_structs(void)
void vpr_free_all(INOUTP t_arch Arch, INOUTP t_options options, INOUTP t_vpr_setup vpr_setup)
static void resync_post_route_netlist()
t_trace * vpr_resync_post_route_netlist_to_TI_CLAY_v1_architecture(INP const t_arch *arch)
char * default_output_name
struct s_pb_graph_node * parent_node
struct s_trace ** trace_head
void read_and_process_blif(char *blif_file, boolean sweep_hanging_nets_and_inputs, t_model *user_models, t_model *library_models, boolean read_activity_file, char *activity_file)
struct s_switch_inf * switch_inf
struct s_switch_inf * Switches
void setOutputFileName(enum e_output_files ename, const char *name, const char *default_name)
boolean isEchoFileEnabled(enum e_echo_files echo_option)
static void print_complete_net_trace(t_trace *trace, const char *file_name)
void free_sdc_related_structs(void)
struct s_linked_vptr * pb_types
static boolean has_printhandler_pre_vpr
t_pin_to_pin_annotation * annotations
void vpr_print_title(void)
struct s_pb_graph_node *** child_pb_graph_nodes
struct s_linked_vptr * next
void ShowSetup(INP t_options options, INP t_vpr_setup vpr_setup)
struct s_grid_tile ** grid
static void free_complex_block_types(void)
char * getOutputFileName(enum e_output_files ename)
struct s_pb_type * pb_type
static void free_pb_type(t_pb_type *pb_type)
void free_timing_stats(void)
int ** num_pin_loc_assignments
void vpr_power_estimation(t_vpr_setup vpr_setup, t_arch Arch)
void set_graphics_state(boolean show_graphics_val, int gr_automode_val, enum e_route_type route_type)
void free_all_pb_graph_nodes(void)
static t_trace * expand_routing_trace(t_trace *trace, int ivpack_net)
void CheckSetup(INP enum e_operation Operation, INP struct s_placer_opts PlacerOpts, INP struct s_annealing_sched AnnealSched, INP struct s_router_opts RouterOpts, INP struct s_det_routing_arch RoutingArch, INP t_segment_inf *Segments, INP t_timing_inf Timing, INP t_chan_width_dist Chans)
t_pb_graph_pin * pb_graph_pin
void setup_intracluster_routing_for_logical_block(INP int iblock, INP t_pb_graph_node *primitive)
struct s_det_routing_arch RoutingArch
void SetPostSynthesisOption(boolean post_synthesis_enabled)
void read_netlist(INP const char *net_file, INP const t_arch *arch, OUTP int *L_num_blocks, OUTP struct s_block *block_list[], OUTP int *L_num_nets, OUTP struct s_net *net_list[])
void free_echo_file_info()
void alloc_draw_structs(void)
static void resync_pb_graph_nodes_in_pb(t_pb_graph_node *pb_graph_node, t_pb *pb)
struct s_type_descriptor * type_descriptors
char * getEchoFileName(enum e_echo_files echo_option)
void vpr_check_setup(INP enum e_operation Operation, INP struct s_placer_opts PlacerOpts, INP struct s_annealing_sched AnnealSched, INP struct s_router_opts RouterOpts, INP struct s_det_routing_arch RoutingArch, INP t_segment_inf *Segments, INP t_timing_inf Timing, INP t_chan_width_dist Chans)
static void free_options(t_options *options)
void alloc_and_load_legalizer_for_cluster(INP t_block *clb, INP int clb_index, INP const t_arch *arch)
void free_route_structs()
void alloc_and_load_output_file_names(const char *default_name)
t_mode_power * mode_power
void save_cluster_solution(void)
static void clay_lut_input_rebalancing(int iblock, t_pb *pb)
t_pb_graph_node * pb_graph_node
void place_and_route(enum e_operation operation, struct s_placer_opts placer_opts, char *place_file, char *net_file, char *arch_file, char *route_file, struct s_annealing_sched annealing_sched, struct s_router_opts router_opts, struct s_det_routing_arch det_routing_arch, t_segment_inf *segment_inf, t_timing_inf timing_inf, t_chan_width_dist chan_width_dist, struct s_model *models, t_direct_inf *directs, int num_directs)
void vpr_init(INP int argc, INP char **argv, OUTP t_options *options, OUTP t_vpr_setup *vpr_setup, OUTP t_arch *arch)
char * vpr_get_output_file_name(enum e_output_files ename)
t_interconnect_power * interconnect_power
void alloc_and_load_cluster_legality_checker(void)
static void clay_reload_ble_locations(int iblock)
t_pb_graph_pin * get_pb_graph_node_pin_from_block_pin(int iblock, int ipin)
void free_logical_nets(void)
t_pb_graph_pin ** input_pins
struct s_logical_block * logical_block
e_power_ret_code power_total(float *run_time_s, t_vpr_setup vpr_setup, t_arch *arch, t_det_routing_arch *routing_arch)
t_pb_graph_pin * get_pb_graph_node_pin_from_vpack_net(int inet, int ipin)
void try_pack(INP struct s_packer_opts *packer_opts, INP const t_arch *arch, INP t_model *user_models, INP t_model *library_models, t_timing_inf timing_inf, float interc_delay)
void vpr_place_and_route(INP t_vpr_setup vpr_setup, INP t_arch arch)