00001 #include <assert.h>
00002 #include "util.h"
00003 #include "vpr_types.h"
00004 #include "globals.h"
00005 #include "OptionTokens.h"
00006 #include "ReadOptions.h"
00007 #include "xml_arch.h"
00008 #include "SetupVPR.h"
00009
00010
00011
00012 static void ShowPlacerOpts(IN t_options Options,
00013 IN struct s_placer_opts PlacerOpts,
00014 IN struct s_annealing_sched AnnealSched);
00015 static void ShowOperation(IN enum e_operation Operation);
00016 static void ShowRouterOpts(IN struct s_router_opts RouterOpts);
00017 static void ShowAnnealSched(IN struct s_annealing_sched AnnealSched);
00018 static void ShowRoutingArch(IN struct s_det_routing_arch RoutingArch);
00019
00020
00021
00022
00023 void
00024 ShowSetup(IN t_options Options,
00025 IN t_arch Arch,
00026 IN boolean TimingEnabled,
00027 IN enum e_operation Operation,
00028 IN struct s_placer_opts PlacerOpts,
00029 IN struct s_annealing_sched AnnealSched,
00030 IN struct s_router_opts RouterOpts,
00031 IN struct s_det_routing_arch RoutingArch,
00032 IN t_segment_inf * Segments,
00033 IN t_timing_inf Timing,
00034 IN t_subblock_data Subblocks)
00035 {
00036 int i, j, num_p_inputs, num_p_outputs;
00037
00038 printf("Timing analysis: %s\n", (TimingEnabled ? "ON" : "OFF"));
00039 printf("\n");
00040
00041 ShowOperation(Operation);
00042 ShowPlacerOpts(Options, PlacerOpts, AnnealSched);
00043 if((ROUTE_ONLY == Operation) || (PLACE_AND_ROUTE == Operation))
00044 {
00045 ShowRouterOpts(RouterOpts);
00046 }
00047 else
00048 {
00049 printf("Router: DISABLED\n\n");
00050 }
00051
00052 if(DETAILED == RouterOpts.route_type)
00053 ShowRoutingArch(RoutingArch);
00054
00055 printf("The circuit will be mapped into a %d x %d array of clbs.\n",
00056 nx, ny);
00057 printf("\n");
00058 printf("Netlist num_nets: %d\n", num_nets);
00059 printf("Netlist num_blocks: %d\n", num_blocks);
00060
00061
00062 num_p_inputs = 0;
00063 num_p_outputs = 0;
00064 for(i = 0; i < num_blocks; i++)
00065 {
00066 if(block[i].type == IO_TYPE)
00067 {
00068 for(j = 0; j < IO_TYPE->num_pins; j++)
00069 {
00070 if(block[i].nets[j] != OPEN)
00071 {
00072 if(IO_TYPE->
00073 class_inf[IO_TYPE->pin_class[j]].
00074 type == DRIVER)
00075 {
00076 num_p_inputs++;
00077 }
00078 else
00079 {
00080 assert(IO_TYPE->
00081 class_inf[IO_TYPE->
00082 pin_class[j]].
00083 type == RECEIVER);
00084 num_p_outputs++;
00085 }
00086 }
00087 }
00088 }
00089 }
00090
00091
00092 printf("Netlist inputs pins: %d\n", num_p_inputs);
00093 printf("Netlist output pins: %d\n", num_p_outputs);
00094 printf("\n");
00095 }
00096
00097
00098 static void
00099 ShowRoutingArch(IN struct s_det_routing_arch RoutingArch)
00100 {
00101
00102 printf("RoutingArch.directionality: ");
00103 switch (RoutingArch.directionality)
00104 {
00105 case BI_DIRECTIONAL:
00106 printf("BI_DIRECTIONAL\n");
00107 break;
00108 case UNI_DIRECTIONAL:
00109 printf("UNI_DIRECTIONAL\n");
00110 break;
00111 default:
00112 printf("<Unknown>\n");
00113 exit(1);
00114 }
00115
00116 printf("RoutingArch.switch_block_type: ");
00117 switch (RoutingArch.switch_block_type)
00118 {
00119 case SUBSET:
00120 printf("SUBSET\n");
00121 break;
00122 case WILTON:
00123 printf("WILTON\n");
00124 break;
00125 case UNIVERSAL:
00126 printf("UNIVERSAL\n");
00127 break;
00128 case FULL:
00129 printf("FULL\n");
00130 break;
00131 default:
00132 printf("<Unknown>\n");
00133 exit(1);
00134 }
00135
00136 printf("RoutingArch.Fs: %d\n", RoutingArch.Fs);
00137
00138 printf("\n");
00139 }
00140
00141
00142 static void
00143 ShowAnnealSched(IN struct s_annealing_sched AnnealSched)
00144 {
00145
00146 printf("AnnealSched.type: ");
00147 switch (AnnealSched.type)
00148 {
00149 case AUTO_SCHED:
00150 printf("AUTO_SCHED\n");
00151 break;
00152 case USER_SCHED:
00153 printf("USER_SCHED\n");
00154 break;
00155 default:
00156 printf("<Unknown>\n");
00157 exit(1);
00158 }
00159
00160 printf("AnnealSched.inner_num: %f\n", AnnealSched.inner_num);
00161
00162 if(USER_SCHED == AnnealSched.type)
00163 {
00164 printf("AnnealSched.init_t: %f\n", AnnealSched.init_t);
00165 printf("AnnealSched.alpha_t: %f\n", AnnealSched.alpha_t);
00166 printf("AnnealSched.exit_t: %f\n", AnnealSched.exit_t);
00167 }
00168 }
00169
00170
00171 static void
00172 ShowRouterOpts(IN struct s_router_opts RouterOpts)
00173 {
00174
00175 printf("RouterOpts.route_type: ");
00176 switch (RouterOpts.route_type)
00177 {
00178 case GLOBAL:
00179 printf("GLOBAL\n");
00180 break;
00181 case DETAILED:
00182 printf("DETAILED\n");
00183 break;
00184 default:
00185 printf("<Unknown>\n");
00186 exit(1);
00187 }
00188
00189 if(DETAILED == RouterOpts.route_type)
00190 {
00191 printf("RouterOpts.router_algorithm: ");
00192 switch (RouterOpts.router_algorithm)
00193 {
00194 case BREADTH_FIRST:
00195 printf("BREADTH_FIRST\n");
00196 break;
00197 case TIMING_DRIVEN:
00198 printf("TIMING_DRIVEN\n");
00199 break;
00200 case DIRECTED_SEARCH:
00201 printf("DIRECTED_SEARCH\n");
00202 break;
00203 default:
00204 printf("<Unknown>\n");
00205 exit(1);
00206 }
00207
00208 printf("RouterOpts.base_cost_type: ");
00209 switch (RouterOpts.base_cost_type)
00210 {
00211 case INTRINSIC_DELAY:
00212 printf("INTRINSIC_DELAY\n");
00213 break;
00214 case DELAY_NORMALIZED:
00215 printf("DELAY_NORMALIZED\n");
00216 break;
00217 case DEMAND_ONLY:
00218 printf("DEMAND_ONLY\n");
00219 break;
00220 default:
00221 printf("<Unknown>\n");
00222 exit(1);
00223 }
00224
00225 printf("RouterOpts.fixed_channel_width: ");
00226 if(NO_FIXED_CHANNEL_WIDTH == RouterOpts.fixed_channel_width)
00227 {
00228 printf("NO_FIXED_CHANNEL_WIDTH\n");
00229 }
00230 else
00231 {
00232 printf("%d\n", RouterOpts.fixed_channel_width);
00233 }
00234
00235 printf("RouterOpts.acc_fac: %f\n", RouterOpts.acc_fac);
00236 printf("RouterOpts.bb_factor: %d\n", RouterOpts.bb_factor);
00237 printf("RouterOpts.bend_cost: %f\n", RouterOpts.bend_cost);
00238 printf("RouterOpts.first_iter_pres_fac: %f\n",
00239 RouterOpts.first_iter_pres_fac);
00240 printf("RouterOpts.initial_pres_fac: %f\n",
00241 RouterOpts.initial_pres_fac);
00242 printf("RouterOpts.pres_fac_mult: %f\n",
00243 RouterOpts.pres_fac_mult);
00244 printf("RouterOpts.max_router_iterations: %d\n",
00245 RouterOpts.max_router_iterations);
00246
00247 if(TIMING_DRIVEN == RouterOpts.router_algorithm)
00248 {
00249 printf("RouterOpts.astar_fac: %f\n",
00250 RouterOpts.astar_fac);
00251 printf("RouterOpts.criticality_exp: %f\n",
00252 RouterOpts.criticality_exp);
00253 printf("RouterOpts.max_criticality: %f\n",
00254 RouterOpts.max_criticality);
00255 }
00256 }
00257 else
00258 {
00259 assert(GLOBAL == RouterOpts.route_type);
00260
00261 printf("RouterOpts.router_algorithm: ");
00262 switch (RouterOpts.router_algorithm)
00263 {
00264 case BREADTH_FIRST:
00265 printf("BREADTH_FIRST\n");
00266 break;
00267 case TIMING_DRIVEN:
00268 printf("TIMING_DRIVEN\n");
00269 break;
00270 case DIRECTED_SEARCH:
00271 printf("DIRECTED_SEARCH\n");
00272 break;
00273 default:
00274 printf("<Unknown>\n");
00275 exit(1);
00276 }
00277
00278 printf("RouterOpts.base_cost_type: ");
00279 switch (RouterOpts.base_cost_type)
00280 {
00281 case INTRINSIC_DELAY:
00282 printf("INTRINSIC_DELAY\n");
00283 break;
00284 case DELAY_NORMALIZED:
00285 printf("DELAY_NORMALIZED\n");
00286 break;
00287 case DEMAND_ONLY:
00288 printf("DEMAND_ONLY\n");
00289 break;
00290 default:
00291 printf("<Unknown>\n");
00292 exit(1);
00293 }
00294
00295 printf("RouterOpts.fixed_channel_width: ");
00296 if(NO_FIXED_CHANNEL_WIDTH == RouterOpts.fixed_channel_width)
00297 {
00298 printf("NO_FIXED_CHANNEL_WIDTH\n");
00299 }
00300 else
00301 {
00302 printf("%d\n", RouterOpts.fixed_channel_width);
00303 }
00304
00305 printf("RouterOpts.acc_fac: %f\n", RouterOpts.acc_fac);
00306 printf("RouterOpts.bb_factor: %d\n", RouterOpts.bb_factor);
00307 printf("RouterOpts.bend_cost: %f\n", RouterOpts.bend_cost);
00308 printf("RouterOpts.first_iter_pres_fac: %f\n",
00309 RouterOpts.first_iter_pres_fac);
00310 printf("RouterOpts.initial_pres_fac: %f\n",
00311 RouterOpts.initial_pres_fac);
00312 printf("RouterOpts.pres_fac_mult: %f\n",
00313 RouterOpts.pres_fac_mult);
00314 printf("RouterOpts.max_router_iterations: %d\n",
00315 RouterOpts.max_router_iterations);
00316 if(TIMING_DRIVEN == RouterOpts.router_algorithm)
00317 {
00318 printf("RouterOpts.astar_fac: %f\n",
00319 RouterOpts.astar_fac);
00320 printf("RouterOpts.criticality_exp: %f\n",
00321 RouterOpts.criticality_exp);
00322 printf("RouterOpts.max_criticality: %f\n",
00323 RouterOpts.max_criticality);
00324 }
00325 }
00326 printf("\n");
00327 }
00328
00329
00330 static void
00331 ShowOperation(IN enum e_operation Operation)
00332 {
00333 printf("Operation: ");
00334 switch (Operation)
00335 {
00336 case PLACE_AND_ROUTE:
00337 printf("PLACE_AND_ROUTE\n");
00338 break;
00339 case PLACE_ONLY:
00340 printf("PLACE_ONLY\n");
00341 break;
00342 case ROUTE_ONLY:
00343 printf("ROUTE_ONLY\n");
00344 break;
00345 case TIMING_ANALYSIS_ONLY:
00346 printf("TIMING_ANALYSIS_ONLY\n");
00347 break;
00348 default:
00349 printf("<Unknown>\n");
00350 exit(1);
00351 }
00352 printf("\n");
00353 }
00354
00355
00356 static void
00357 ShowPlacerOpts(IN t_options Options,
00358 IN struct s_placer_opts PlacerOpts,
00359 IN struct s_annealing_sched AnnealSched)
00360 {
00361
00362 printf("PlacerOpts.place_freq: ");
00363 switch (PlacerOpts.place_freq)
00364 {
00365 case PLACE_ONCE:
00366 printf("PLACE_ONCE\n");
00367 break;
00368 case PLACE_ALWAYS:
00369 printf("PLACE_ALWAYS\n");
00370 break;
00371 case PLACE_NEVER:
00372 printf("PLACE_NEVER\n");
00373 break;
00374 default:
00375 printf("<Unknown>\n");
00376 exit(1);
00377 }
00378 if((PLACE_ONCE == PlacerOpts.place_freq) ||
00379 (PLACE_ALWAYS == PlacerOpts.place_freq))
00380 {
00381
00382 printf("PlacerOpts.place_algorithm: ");
00383 switch (PlacerOpts.place_algorithm)
00384 {
00385 case BOUNDING_BOX_PLACE:
00386 printf("BOUNDING_BOX_PLACE\n");
00387 break;
00388 case NET_TIMING_DRIVEN_PLACE:
00389 printf("NET_TIMING_DRIVEN_PLACE\n");
00390 break;
00391 case PATH_TIMING_DRIVEN_PLACE:
00392 printf("PATH_TIMING_DRIVEN_PLACE\n");
00393 break;
00394 default:
00395 printf("<Unknown>\n");
00396 exit(1);
00397 }
00398
00399 printf("PlacerOpts.place_cost_type: ");
00400 switch (PlacerOpts.place_cost_type)
00401 {
00402 case LINEAR_CONG:
00403 printf("LINEAR_CONG\n");
00404 break;
00405 case NONLINEAR_CONG:
00406 printf("NONLINEAR_CONG\n");
00407 break;
00408 default:
00409 printf("<Unknown>\n");
00410 exit(1);
00411 }
00412
00413 printf("PlacerOpts.pad_loc_type: ");
00414 switch (PlacerOpts.pad_loc_type)
00415 {
00416 case FREE:
00417 printf("FREE\n");
00418 break;
00419 case RANDOM:
00420 printf("RANDOM\n");
00421 break;
00422 case USER:
00423 printf("USER '%s'\n", PlacerOpts.pad_loc_file);
00424 break;
00425 default:
00426 printf("<Unknown>\n");
00427 exit(1);
00428 }
00429
00430 printf("PlacerOpts.place_cost_exp: %f\n",
00431 PlacerOpts.place_cost_exp);
00432
00433 if((LINEAR_CONG == PlacerOpts.place_cost_type) ||
00434 (Options.Count[OT_PLACE_CHAN_WIDTH]))
00435 {
00436 printf("PlacerOpts.place_chan_width: %d\n",
00437 PlacerOpts.place_chan_width);
00438 }
00439
00440 if(NONLINEAR_CONG == PlacerOpts.place_cost_type)
00441 {
00442 printf("PlacerOpts.num_regions: %d\n",
00443 PlacerOpts.num_regions);
00444 }
00445
00446 if((NET_TIMING_DRIVEN_PLACE == PlacerOpts.place_algorithm) ||
00447 (PATH_TIMING_DRIVEN_PLACE == PlacerOpts.place_algorithm))
00448 {
00449 printf("PlacerOpts.inner_loop_recompute_divider: %d\n",
00450 PlacerOpts.inner_loop_recompute_divider);
00451 printf("PlacerOpts.recompute_crit_iter: %d\n",
00452 PlacerOpts.recompute_crit_iter);
00453 printf("PlacerOpts.timing_tradeoff: %f\n",
00454 PlacerOpts.timing_tradeoff);
00455 printf("PlacerOpts.td_place_exp_first: %f\n",
00456 PlacerOpts.td_place_exp_first);
00457 printf("PlacerOpts.td_place_exp_last: %f\n",
00458 PlacerOpts.td_place_exp_last);
00459 }
00460
00461 printf("PlaceOpts.seed: %d\n", PlacerOpts.seed);
00462
00463 ShowAnnealSched(AnnealSched);
00464 }
00465 printf("\n");
00466
00467 }