/* print the statistics about this floorplan. * note that connects_file is NULL if wire * information is already populated */ void print_flp_stats(flp_t *flp, RC_model_t *model, char *l2_label, char *power_file, char *connects_file) { double core, total, occupied; /* area */ double width, height, aspect, total_w, total_h; double wire_metric; double peak, avg; /* temperature */ double *power, *temp; FILE *fp = NULL; char str[STR_SIZE]; if (connects_file) { fp = fopen(connects_file, "r"); if (!fp) { sprintf(str, "error opening file %s\n", connects_file); fatal(str); } flp_populate_connects(flp, fp); } power = hotspot_vector(model); temp = hotspot_vector(model); read_power(model, power, power_file); core = get_core_area(flp, l2_label); total = get_total_area(flp); total_w = get_total_width(flp); total_h = get_total_height(flp); occupied = get_core_occupied_area(flp, l2_label); width = get_core_width(flp, l2_label); height = get_core_height(flp, l2_label); aspect = (height > width) ? (height/width) : (width/height); wire_metric = get_wire_metric(flp); populate_R_model(model, flp); steady_state_temp(model, power, temp); peak = find_max_temp(model, temp); avg = find_avg_temp(model, temp); fprintf(stdout, "printing summary statistics about the floorplan\n"); fprintf(stdout, "total area:\t%g\n", total); fprintf(stdout, "total width:\t%g\n", total_w); fprintf(stdout, "total height:\t%g\n", total_h); fprintf(stdout, "core area:\t%g\n", core); fprintf(stdout, "occupied area:\t%g\n", occupied); fprintf(stdout, "area utilization:\t%.3f\n", occupied / core * 100.0); fprintf(stdout, "core width:\t%g\n", width); fprintf(stdout, "core height:\t%g\n", height); fprintf(stdout, "core aspect ratio:\t%.3f\n", aspect); fprintf(stdout, "wire length metric:\t%.3f\n", wire_metric); fprintf(stdout, "peak temperature:\t%.3f\n", peak); fprintf(stdout, "avg temperature:\t%.3f\n", avg); free_dvector(power); free_dvector(temp); if (fp) fclose(fp); }
/* main function for the floorplanner */ int main(int argc, char **argv) { flp_desc_t *flp_desc; flp_t *flp; RC_model_t *model; double *power; thermal_config_t thermal_config; flp_config_t flp_config; global_config_t global_config; str_pair table[MAX_ENTRIES]; int size, compacted; if (!(argc >= 7 && argc % 2)) { usage(argc, argv); return 1; } size = parse_cmdline(table, MAX_ENTRIES, argc, argv); global_config_from_strs(&global_config, table, size); /* read configuration file */ if (strcmp(global_config.config, NULLFILE)) size += read_str_pairs(&table[size], MAX_ENTRIES, global_config.config); /* * in the str_pair 'table', earlier entries override later ones. * so, command line options have priority over config file */ size = str_pairs_remove_duplicates(table, size); /* get defaults */ thermal_config = default_thermal_config(); flp_config = default_flp_config(); /* modify according to command line / config file */ thermal_config_add_from_strs(&thermal_config, table, size); flp_config_add_from_strs(&flp_config, table, size); /* dump configuration if specified */ if (strcmp(global_config.dump_config, NULLFILE)) { size = global_config_to_strs(&global_config, table, MAX_ENTRIES); size += thermal_config_to_strs(&thermal_config, &table[size], MAX_ENTRIES-size); size += flp_config_to_strs(&flp_config, &table[size], MAX_ENTRIES-size); /* prefix the name of the variable with a '-' */ dump_str_pairs(table, size, global_config.dump_config, "-"); } /* HotFloorplan currently uses the block model and does not * support the grid model. */ if (!strcasecmp(thermal_config.model_type, GRID_MODEL_STR)) fatal("HotFloorplan doesn't support the grid model\n"); /* description of the functional blocks to be floorplanned */ flp_desc = read_flp_desc(global_config.flp_desc, &flp_config); /* * just an empty frame with blocks' names. * block positions not known yet. */ flp = flp_placeholder(flp_desc); /* temperature model */ model = alloc_RC_model(&thermal_config, flp); /* input power vector */ power = hotspot_vector(model); read_power(model, power, global_config.power_in); /* main floorplanning routine */ compacted = floorplan(flp, flp_desc, model, power); /* * print the finally selected floorplan in a format that can * be understood by tofig.pl (which converts it to a FIG file) */ print_flp_fig(flp); /* print the floorplan statistics */ if (flp_config.wrap_l2 && !strcasecmp(flp_desc->units[flp_desc->n_units-1].name, flp_config.l2_label)) print_flp_stats(flp, model, flp_config.l2_label, global_config.power_in, global_config.flp_desc); /* print the wire delays between blocks */ print_wire_delays(flp, thermal_config.base_proc_freq); /* also output the floorplan to a file readable by hotspot */ dump_flp(flp, global_config.flp_out, FALSE); free_flp_desc(flp_desc); delete_RC_model(model); free_dvector(power); /* while deallocating, free the compacted blocks too */ free_flp(flp, compacted); return 0; }