#include #include "util.h" #include "vpr_types.h" #include "globals.h" #include "OptionTokens.h" #include "ReadOptions.h" #include "read_xml_arch_file.h" #include "SetupVPR.h" /******** Function Prototypes ********/ static void ShowPackerOpts(INP struct s_packer_opts PackerOpts); static void ShowPlacerOpts(INP t_options Options, INP struct s_placer_opts PlacerOpts, INP struct s_annealing_sched AnnealSched); static void ShowOperation(INP enum e_operation Operation); static void ShowRouterOpts(INP struct s_router_opts RouterOpts); static void ShowAnnealSched(INP struct s_annealing_sched AnnealSched); static void ShowRoutingArch(INP struct s_det_routing_arch RoutingArch); /******** Function Implementations ********/ void ShowSetup(INP t_options options, INP t_vpr_setup vpr_setup) { vpr_printf(TIO_MESSAGE_INFO, "Timing analysis: %s\n", (vpr_setup.TimingEnabled? "ON" : "OFF")); vpr_printf(TIO_MESSAGE_INFO, "Circuit netlist file: %s\n", vpr_setup.FileNameOpts.NetFile); vpr_printf(TIO_MESSAGE_INFO, "Circuit placement file: %s\n", vpr_setup.FileNameOpts.PlaceFile); vpr_printf(TIO_MESSAGE_INFO, "Circuit routing file: %s\n", vpr_setup.FileNameOpts.RouteFile); vpr_printf(TIO_MESSAGE_INFO, "Circuit SDC file: %s\n", vpr_setup.Timing.SDCFile); ShowOperation(vpr_setup.Operation); vpr_printf(TIO_MESSAGE_INFO, "Packer: %s\n", (vpr_setup.PackerOpts.doPacking ? "ENABLED" : "DISABLED")); vpr_printf(TIO_MESSAGE_INFO, "Placer: %s\n", (vpr_setup.PlacerOpts.doPlacement ? "ENABLED" : "DISABLED")); vpr_printf(TIO_MESSAGE_INFO, "Router: %s\n", (vpr_setup.RouterOpts.doRouting ? "ENABLED" : "DISABLED")); if (vpr_setup.PackerOpts.doPacking) { ShowPackerOpts(vpr_setup.PackerOpts); } if (vpr_setup.PlacerOpts.doPlacement) { ShowPlacerOpts(options, vpr_setup.PlacerOpts, vpr_setup.AnnealSched); } if (vpr_setup.RouterOpts.doRouting) { ShowRouterOpts(vpr_setup.RouterOpts); } if (DETAILED == vpr_setup.RouterOpts.route_type) ShowRoutingArch(vpr_setup.RoutingArch); } void printClusteredNetlistStats() { int i, j, L_num_p_inputs, L_num_p_outputs; int *num_blocks_type; num_blocks_type = (int*) my_calloc(num_types, sizeof(int)); vpr_printf(TIO_MESSAGE_INFO, "\n"); vpr_printf(TIO_MESSAGE_INFO, "Netlist num_nets: %d\n", num_nets); vpr_printf(TIO_MESSAGE_INFO, "Netlist num_blocks: %d\n", num_blocks); for (i = 0; i < num_types; i++) { num_blocks_type[i] = 0; } /* Count I/O input and output pads */ L_num_p_inputs = 0; L_num_p_outputs = 0; for (i = 0; i < num_blocks; i++) { num_blocks_type[block[i].type->index]++; if (block[i].type == IO_TYPE) { for (j = 0; j < IO_TYPE->num_pins; j++) { if (block[i].nets[j] != OPEN) { if (IO_TYPE->class_inf[IO_TYPE->pin_class[j]].type == DRIVER) { L_num_p_inputs++; } else { assert( IO_TYPE-> class_inf[IO_TYPE-> pin_class[j]]. type == RECEIVER); L_num_p_outputs++; } } } } } for (i = 0; i < num_types; i++) { if (IO_TYPE != &type_descriptors[i]) { vpr_printf(TIO_MESSAGE_INFO, "Netlist %s blocks: %d.\n", type_descriptors[i].name, num_blocks_type[i]); } } /* Print out each block separately instead */ vpr_printf(TIO_MESSAGE_INFO, "Netlist inputs pins: %d\n", L_num_p_inputs); vpr_printf(TIO_MESSAGE_INFO, "Netlist output pins: %d\n", L_num_p_outputs); vpr_printf(TIO_MESSAGE_INFO, "\n"); free(num_blocks_type); } static void ShowRoutingArch(INP struct s_det_routing_arch RoutingArch) { vpr_printf(TIO_MESSAGE_INFO, "RoutingArch.directionality: "); switch (RoutingArch.directionality) { case BI_DIRECTIONAL: vpr_printf(TIO_MESSAGE_INFO, "BI_DIRECTIONAL\n"); break; case UNI_DIRECTIONAL: vpr_printf(TIO_MESSAGE_INFO, "UNI_DIRECTIONAL\n"); break; default: vpr_printf(TIO_MESSAGE_INFO, "\n"); exit(1); } vpr_printf(TIO_MESSAGE_INFO, "RoutingArch.switch_block_type: "); switch (RoutingArch.switch_block_type) { case SUBSET: vpr_printf(TIO_MESSAGE_INFO, "SUBSET\n"); break; case WILTON: vpr_printf(TIO_MESSAGE_INFO, "WILTON\n"); break; case UNIVERSAL: vpr_printf(TIO_MESSAGE_INFO, "UNIVERSAL\n"); break; case FULL: vpr_printf(TIO_MESSAGE_INFO, "FULL\n"); break; default: vpr_printf(TIO_MESSAGE_ERROR, "switch block type\n"); } vpr_printf(TIO_MESSAGE_INFO, "RoutingArch.Fs: %d\n", RoutingArch.Fs); vpr_printf(TIO_MESSAGE_INFO, "\n"); } static void ShowAnnealSched(INP struct s_annealing_sched AnnealSched) { vpr_printf(TIO_MESSAGE_INFO, "AnnealSched.type: "); switch (AnnealSched.type) { case AUTO_SCHED: vpr_printf(TIO_MESSAGE_INFO, "AUTO_SCHED\n"); break; case USER_SCHED: vpr_printf(TIO_MESSAGE_INFO, "USER_SCHED\n"); break; default: vpr_printf(TIO_MESSAGE_ERROR, "Unknown annealing schedule\n"); } vpr_printf(TIO_MESSAGE_INFO, "AnnealSched.inner_num: %f\n", AnnealSched.inner_num); if (USER_SCHED == AnnealSched.type) { vpr_printf(TIO_MESSAGE_INFO, "AnnealSched.init_t: %f\n", AnnealSched.init_t); vpr_printf(TIO_MESSAGE_INFO, "AnnealSched.alpha_t: %f\n", AnnealSched.alpha_t); vpr_printf(TIO_MESSAGE_INFO, "AnnealSched.exit_t: %f\n", AnnealSched.exit_t); } } static void ShowRouterOpts(INP struct s_router_opts RouterOpts) { vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.route_type: "); switch (RouterOpts.route_type) { case GLOBAL: vpr_printf(TIO_MESSAGE_INFO, "GLOBAL\n"); break; case DETAILED: vpr_printf(TIO_MESSAGE_INFO, "DETAILED\n"); break; default: vpr_printf(TIO_MESSAGE_ERROR, "Unknown router opt\n"); } if (DETAILED == RouterOpts.route_type) { vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.router_algorithm: "); switch (RouterOpts.router_algorithm) { case BREADTH_FIRST: vpr_printf(TIO_MESSAGE_INFO, "BREADTH_FIRST\n"); break; case TIMING_DRIVEN: vpr_printf(TIO_MESSAGE_INFO, "TIMING_DRIVEN\n"); break; case NO_TIMING: vpr_printf(TIO_MESSAGE_INFO, "NO_TIMING\n"); break; default: vpr_printf(TIO_MESSAGE_INFO, "\n"); exit(1); } vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.base_cost_type: "); switch (RouterOpts.base_cost_type) { case INTRINSIC_DELAY: vpr_printf(TIO_MESSAGE_INFO, "INTRINSIC_DELAY\n"); break; case DELAY_NORMALIZED: vpr_printf(TIO_MESSAGE_INFO, "DELAY_NORMALIZED\n"); break; case DEMAND_ONLY: vpr_printf(TIO_MESSAGE_INFO, "DEMAND_ONLY\n"); break; default: vpr_printf(TIO_MESSAGE_ERROR, "Unknown base_cost_type\n"); } vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.fixed_channel_width: "); if (NO_FIXED_CHANNEL_WIDTH == RouterOpts.fixed_channel_width) { vpr_printf(TIO_MESSAGE_INFO, "NO_FIXED_CHANNEL_WIDTH\n"); } else { vpr_printf(TIO_MESSAGE_INFO, "%d\n", RouterOpts.fixed_channel_width); } vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.acc_fac: %f\n", RouterOpts.acc_fac); vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.bb_factor: %d\n", RouterOpts.bb_factor); vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.bend_cost: %f\n", RouterOpts.bend_cost); vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.first_iter_pres_fac: %f\n", RouterOpts.first_iter_pres_fac); vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.initial_pres_fac: %f\n", RouterOpts.initial_pres_fac); vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.pres_fac_mult: %f\n", RouterOpts.pres_fac_mult); vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.max_router_iterations: %d\n", RouterOpts.max_router_iterations); if (TIMING_DRIVEN == RouterOpts.router_algorithm) { vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.astar_fac: %f\n", RouterOpts.astar_fac); vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.criticality_exp: %f\n", RouterOpts.criticality_exp); vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.max_criticality: %f\n", RouterOpts.max_criticality); } } else { assert(GLOBAL == RouterOpts.route_type); vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.router_algorithm: "); switch (RouterOpts.router_algorithm) { case BREADTH_FIRST: vpr_printf(TIO_MESSAGE_INFO, "BREADTH_FIRST\n"); break; case TIMING_DRIVEN: vpr_printf(TIO_MESSAGE_INFO, "TIMING_DRIVEN\n"); break; case NO_TIMING: vpr_printf(TIO_MESSAGE_INFO, "NO_TIMING\n"); break; default: vpr_printf(TIO_MESSAGE_ERROR, "Unknown router algorithm\n"); } vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.base_cost_type: "); switch (RouterOpts.base_cost_type) { case INTRINSIC_DELAY: vpr_printf(TIO_MESSAGE_INFO, "INTRINSIC_DELAY\n"); break; case DELAY_NORMALIZED: vpr_printf(TIO_MESSAGE_INFO, "DELAY_NORMALIZED\n"); break; case DEMAND_ONLY: vpr_printf(TIO_MESSAGE_INFO, "DEMAND_ONLY\n"); break; default: vpr_printf(TIO_MESSAGE_ERROR, "Unknown router base cost type\n"); } vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.fixed_channel_width: "); if (NO_FIXED_CHANNEL_WIDTH == RouterOpts.fixed_channel_width) { vpr_printf(TIO_MESSAGE_INFO, "NO_FIXED_CHANNEL_WIDTH\n"); } else { vpr_printf(TIO_MESSAGE_INFO, "%d\n", RouterOpts.fixed_channel_width); } vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.acc_fac: %f\n", RouterOpts.acc_fac); vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.bb_factor: %d\n", RouterOpts.bb_factor); vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.bend_cost: %f\n", RouterOpts.bend_cost); vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.first_iter_pres_fac: %f\n", RouterOpts.first_iter_pres_fac); vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.initial_pres_fac: %f\n", RouterOpts.initial_pres_fac); vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.pres_fac_mult: %f\n", RouterOpts.pres_fac_mult); vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.max_router_iterations: %d\n", RouterOpts.max_router_iterations); if (TIMING_DRIVEN == RouterOpts.router_algorithm) { vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.astar_fac: %f\n", RouterOpts.astar_fac); vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.criticality_exp: %f\n", RouterOpts.criticality_exp); vpr_printf(TIO_MESSAGE_INFO, "RouterOpts.max_criticality: %f\n", RouterOpts.max_criticality); } } vpr_printf(TIO_MESSAGE_INFO, "\n"); } static void ShowOperation(INP enum e_operation Operation) { vpr_printf(TIO_MESSAGE_INFO, "Operation: "); switch (Operation) { case RUN_FLOW: vpr_printf(TIO_MESSAGE_INFO, "RUN_FLOW\n"); break; case TIMING_ANALYSIS_ONLY: vpr_printf(TIO_MESSAGE_INFO, "TIMING_ANALYSIS_ONLY\n"); break; default: vpr_printf(TIO_MESSAGE_ERROR, "Unknown VPR operation\n"); } vpr_printf(TIO_MESSAGE_INFO, "\n"); } static void ShowPlacerOpts(INP t_options Options, INP struct s_placer_opts PlacerOpts, INP struct s_annealing_sched AnnealSched) { vpr_printf(TIO_MESSAGE_INFO, "PlacerOpts.place_freq: "); switch (PlacerOpts.place_freq) { case PLACE_ONCE: vpr_printf(TIO_MESSAGE_INFO, "PLACE_ONCE\n"); break; case PLACE_ALWAYS: vpr_printf(TIO_MESSAGE_INFO, "PLACE_ALWAYS\n"); break; case PLACE_NEVER: vpr_printf(TIO_MESSAGE_INFO, "PLACE_NEVER\n"); break; default: vpr_printf(TIO_MESSAGE_ERROR, "Unknown Place Freq\n"); } if ((PLACE_ONCE == PlacerOpts.place_freq) || (PLACE_ALWAYS == PlacerOpts.place_freq)) { vpr_printf(TIO_MESSAGE_INFO, "PlacerOpts.place_algorithm: "); switch (PlacerOpts.place_algorithm) { case BOUNDING_BOX_PLACE: vpr_printf(TIO_MESSAGE_INFO, "BOUNDING_BOX_PLACE\n"); break; case NET_TIMING_DRIVEN_PLACE: vpr_printf(TIO_MESSAGE_INFO, "NET_TIMING_DRIVEN_PLACE\n"); break; case PATH_TIMING_DRIVEN_PLACE: vpr_printf(TIO_MESSAGE_INFO, "PATH_TIMING_DRIVEN_PLACE\n"); break; default: vpr_printf(TIO_MESSAGE_ERROR, "Unknown placement algorithm\n"); } vpr_printf(TIO_MESSAGE_INFO, "PlacerOpts.pad_loc_type: "); switch (PlacerOpts.pad_loc_type) { case FREE: vpr_printf(TIO_MESSAGE_INFO, "FREE\n"); break; case RANDOM: vpr_printf(TIO_MESSAGE_INFO, "RANDOM\n"); break; case USER: vpr_printf(TIO_MESSAGE_INFO, "USER '%s'\n", PlacerOpts.pad_loc_file); break; default: vpr_printf(TIO_MESSAGE_INFO, "Unknown I/O pad location type\n"); exit(1); } vpr_printf(TIO_MESSAGE_INFO, "PlacerOpts.place_cost_exp: %f\n", PlacerOpts.place_cost_exp); if (Options.Count[OT_PLACE_CHAN_WIDTH]) { vpr_printf(TIO_MESSAGE_INFO, "PlacerOpts.place_chan_width: %d\n", PlacerOpts.place_chan_width); } if ((NET_TIMING_DRIVEN_PLACE == PlacerOpts.place_algorithm) || (PATH_TIMING_DRIVEN_PLACE == PlacerOpts.place_algorithm)) { vpr_printf(TIO_MESSAGE_INFO, "PlacerOpts.inner_loop_recompute_divider: %d\n", PlacerOpts.inner_loop_recompute_divider); vpr_printf(TIO_MESSAGE_INFO, "PlacerOpts.recompute_crit_iter: %d\n", PlacerOpts.recompute_crit_iter); vpr_printf(TIO_MESSAGE_INFO, "PlacerOpts.timing_tradeoff: %f\n", PlacerOpts.timing_tradeoff); vpr_printf(TIO_MESSAGE_INFO, "PlacerOpts.td_place_exp_first: %f\n", PlacerOpts.td_place_exp_first); vpr_printf(TIO_MESSAGE_INFO, "PlacerOpts.td_place_exp_last: %f\n", PlacerOpts.td_place_exp_last); } vpr_printf(TIO_MESSAGE_INFO, "PlaceOpts.seed: %d\n", PlacerOpts.seed); ShowAnnealSched(AnnealSched); } vpr_printf(TIO_MESSAGE_INFO, "\n"); } static void ShowPackerOpts(INP struct s_packer_opts PackerOpts) { vpr_printf(TIO_MESSAGE_INFO, "PackerOpts.allow_early_exit: %s", (PackerOpts.allow_early_exit ? "TRUE\n" : "FALSE\n")); vpr_printf(TIO_MESSAGE_INFO, "PackerOpts.allow_unrelated_clustering: %s", (PackerOpts.allow_unrelated_clustering ? "TRUE\n" : "FALSE\n")); vpr_printf(TIO_MESSAGE_INFO, "PackerOpts.alpha_clustering: %f\n", PackerOpts.alpha); vpr_printf(TIO_MESSAGE_INFO, "PackerOpts.aspect: %f\n", PackerOpts.aspect); vpr_printf(TIO_MESSAGE_INFO, "PackerOpts.beta_clustering: %f\n", PackerOpts.beta); vpr_printf(TIO_MESSAGE_INFO, "PackerOpts.block_delay: %f\n", PackerOpts.block_delay); vpr_printf(TIO_MESSAGE_INFO, "PackerOpts.cluster_seed_type: "); switch (PackerOpts.cluster_seed_type) { case VPACK_TIMING: vpr_printf(TIO_MESSAGE_INFO, "TIMING\n"); break; case VPACK_MAX_INPUTS: vpr_printf(TIO_MESSAGE_INFO, "MAX_INPUTS\n"); break; default: vpr_printf(TIO_MESSAGE_INFO, "Unknown packer cluster_seed_type\n"); exit(1); } vpr_printf(TIO_MESSAGE_INFO, "PackerOpts.connection_driven: %s", (PackerOpts.connection_driven ? "TRUE\n" : "FALSE\n")); vpr_printf(TIO_MESSAGE_INFO, "PackerOpts.global_clocks: %s", (PackerOpts.global_clocks ? "TRUE\n" : "FALSE\n")); vpr_printf(TIO_MESSAGE_INFO, "PackerOpts.hill_climbing_flag: %s", (PackerOpts.hill_climbing_flag ? "TRUE\n" : "FALSE\n")); vpr_printf(TIO_MESSAGE_INFO, "PackerOpts.inter_cluster_net_delay: %f\n", PackerOpts.inter_cluster_net_delay); vpr_printf(TIO_MESSAGE_INFO, "PackerOpts.intra_cluster_net_delay: %f\n", PackerOpts.intra_cluster_net_delay); vpr_printf(TIO_MESSAGE_INFO, "PackerOpts.recompute_timing_after: %d\n", PackerOpts.recompute_timing_after); vpr_printf(TIO_MESSAGE_INFO, "PackerOpts.sweep_hanging_nets_and_inputs: %s", (PackerOpts.sweep_hanging_nets_and_inputs ? "TRUE\n" : "FALSE\n")); vpr_printf(TIO_MESSAGE_INFO, "PackerOpts.timing_driven: %s", (PackerOpts.timing_driven ? "TRUE\n" : "FALSE\n")); vpr_printf(TIO_MESSAGE_INFO, "\n"); }