diff --git a/vpr/src/base/flat_placement_types.h b/vpr/src/base/flat_placement_types.h index afad1a98ab4..6ece9b2d318 100644 --- a/vpr/src/base/flat_placement_types.h +++ b/vpr/src/base/flat_placement_types.h @@ -35,6 +35,16 @@ struct t_flat_pl_loc { return *this; } + /** + * @brief Subtracts the coordinates of another t_flat_pl_loc to this one. + */ + t_flat_pl_loc& operator-=(const t_flat_pl_loc& other) { + x -= other.x; + y -= other.y; + layer -= other.layer; + return *this; + } + /** * @brief Divides the coordinates of this t_flat_pl_loc by a divisor. * diff --git a/vpr/src/place/initial_placement.cpp b/vpr/src/place/initial_placement.cpp index b41564ba715..0b881320f61 100644 --- a/vpr/src/place/initial_placement.cpp +++ b/vpr/src/place/initial_placement.cpp @@ -2,6 +2,8 @@ #include "atom_netlist_fwd.h" #include "physical_types_util.h" #include "place_macro.h" +#include "vtr_geometry.h" +#include "vtr_ndmatrix.h" #include "vtr_random.h" #include "vtr_time.h" #include "vpr_types.h" @@ -17,9 +19,12 @@ #include "region.h" #include "noc_place_utils.h" +#include #include #include +#include #include +#include #ifdef VERBOSE void print_clb_placement(const char* fname); @@ -38,11 +43,6 @@ static constexpr int SORT_WEIGHT_PER_TILES_OUTSIDE_OF_PR = 100; // The neighbor location should be within the defined range to the calculated centroid location. static constexpr int CENTROID_NEIGHBOR_SEARCH_RLIM = 15; -// The range limit to be used when searcing for a neighbor in the centroid placement when AP is used. -// Since AP is assumed to have a better idea of where clusters should be placed, we want to search more -// places to place a cluster near its solved position before giving up. -static constexpr int CENTROID_NEIGHBOR_SEARCH_RLIM_AP = 60; - /** * @brief Control routine for placing a macro. * First iteration of place_marco performs the following steps to place a macro: @@ -549,47 +549,242 @@ static std::vector find_centroid_loc(const t_pl_macro& pl_macro, } // TODO: Should this return the unplaced_blocks_to_update_their_score? -static void find_centroid_loc_from_flat_placement(const t_pl_macro& pl_macro, - t_pl_loc& centroid, - const FlatPlacementInfo& flat_placement_info) { +static t_flat_pl_loc find_centroid_loc_from_flat_placement(const t_pl_macro& pl_macro, + const FlatPlacementInfo& flat_placement_info) { // Use the flat placement to compute the centroid of the given macro. // TODO: Instead of averaging, maybe use MODE (most frequently placed location). float acc_weight = 0.f; - float acc_x = 0.f; - float acc_y = 0.f; - float acc_layer = 0.f; - float acc_sub_tile = 0.f; + t_flat_pl_loc centroid({0.0f, 0.0f, 0.0f}); for (const t_pl_macro_member& member : pl_macro.members) { const auto& cluster_atoms = g_vpr_ctx.clustering().atoms_lookup[member.blk_index]; for (AtomBlockId atom_blk_id : cluster_atoms) { // TODO: We can get away with using less information. VTR_ASSERT(flat_placement_info.blk_x_pos[atom_blk_id] != FlatPlacementInfo::UNDEFINED_POS && flat_placement_info.blk_y_pos[atom_blk_id] != FlatPlacementInfo::UNDEFINED_POS && flat_placement_info.blk_layer[atom_blk_id] != FlatPlacementInfo::UNDEFINED_POS && flat_placement_info.blk_sub_tile[atom_blk_id] != FlatPlacementInfo::UNDEFINED_SUB_TILE); - // TODO: Make this a debug print. - // VTR_LOG("%s ", g_vpr_ctx.atom().netlist().block_name(atom_blk_id).c_str()); // Accumulate the x, y, layer, and sub_tile for each atom in each // member of the macro. Remove the offset so the centroid would be // where the head macro should be placed to put the members in the // correct place. - acc_x += flat_placement_info.blk_x_pos[atom_blk_id] - member.offset.x; - acc_y += flat_placement_info.blk_y_pos[atom_blk_id] - member.offset.y; - acc_layer += flat_placement_info.blk_layer[atom_blk_id] - member.offset.layer; - acc_sub_tile += flat_placement_info.blk_sub_tile[atom_blk_id] - member.offset.sub_tile; + t_flat_pl_loc cluster_offset({(float)member.offset.x, + (float)member.offset.y, + (float)member.offset.layer}); + centroid += flat_placement_info.get_pos(atom_blk_id); + centroid -= cluster_offset; acc_weight++; } } if (acc_weight > 0.f) { - // NOTE: We add an offset of 0.5 to prevent us from moving to the tile - // below / to the left due to tiny numerical changes (this - // pretends that each atom is in the center of the tile). - centroid.x = std::floor(acc_x / acc_weight); - centroid.y = std::floor(acc_y / acc_weight); - centroid.layer = std::floor(acc_layer / acc_weight); - centroid.sub_tile = std::floor(acc_sub_tile / acc_weight); - - // TODO: Make this a debug print. - // VTR_LOG("\n\t(%d, %d, %d, %d)\n", centroid.x, centroid.y, centroid.layer, centroid.sub_tile); + centroid /= acc_weight; + } + return centroid; +} + +/** + * @brief Returns the L1 distance a cluster at the given flat location would + * need to move to be within the bounds of a tile at the given tile loc. + */ +static inline float get_dist_to_tile(const t_flat_pl_loc& src_flat_loc, + const t_physical_tile_loc& tile_loc, + const DeviceGrid& device_grid) { + // Get the bounds of the tile. + // Note: The get_tile_bb function will not work in this case since it + // subtracts 1 from the width and height. + auto tile_type = device_grid.get_physical_type(tile_loc); + float tile_xmin = tile_loc.x; + float tile_xmax = tile_loc.x + tile_type->width; + float tile_ymin = tile_loc.y; + float tile_ymax = tile_loc.y + tile_type->height; + + // Get the closest point in the bounding box (including the edges) to + // the src_flat_loc. To do this, we project the point in L1 space. + float proj_x = std::clamp(src_flat_loc.x, tile_xmin, tile_xmax); + float proj_y = std::clamp(src_flat_loc.y, tile_ymin, tile_ymax); + + // Then compute the L1 distance from the src_flat_loc to the projected + // position. This will be the minimum distance this point needs to move. + float dx = std::abs(proj_x - src_flat_loc.x); + float dy = std::abs(proj_y - src_flat_loc.y); + return dx + dy; +} + +/** + * @brief Returns the first available sub_tile (both compatible with the given + * compressed grid and is empty according the the blk_loc_registry) in + * the tile at the given grid_loc. Returns OPEN if no such sub_tile exists. + */ +static inline int get_first_available_sub_tile_at_grid_loc(const t_physical_tile_loc& grid_loc, + const BlkLocRegistry& blk_loc_registry, + const DeviceGrid& device_grid, + const t_compressed_block_grid& compressed_block_grid) { + + // Get the compatible sub-tiles from the compressed grid for this physical + // tile type. + const t_physical_tile_type_ptr phy_type = device_grid.get_physical_type(grid_loc); + const auto& compatible_sub_tiles = compressed_block_grid.compatible_sub_tile_num(phy_type->index); + + // Return the first empty sub-tile from this list. + for (int sub_tile : compatible_sub_tiles) { + if (blk_loc_registry.grid_blocks().is_sub_tile_empty(grid_loc, sub_tile)) { + return sub_tile; + } } + + // If one cannot be found, return OPEN. + return OPEN; +} + +/** + * @brief Find the nearest compatible location for the given macro as close to + * the src_flat_loc as possible. + * + * This method uses a BFS to find the closest legal location for the macro. + * + * @param src_flat_loc + * The start location of the BFS. This is given as a flat placement to + * allow the search to trade-off different location options. For example, + * if src_loc was (1.6, 1.5), this tells the search that the cluster + * would prefer to be at tile (1, 1), but if it cannot go there and + * it had to go to one of the neighbors, it would prefer to be on the + * right. + * @param block_type + * The logical block type of the macro. + * @param macro + * The macro to place in the location. + * @param blk_loc_registry + * + * @return Returns the closest legal location found. All of the dimensions will + * be OPEN if a locations could not be found. + */ +static inline t_pl_loc find_nearest_compatible_loc(const t_flat_pl_loc& src_flat_loc, + t_logical_block_type_ptr block_type, + const t_pl_macro& pl_macro, + const BlkLocRegistry& blk_loc_registry) { + // This method performs a BFS over the compressed grid. This avoids searching + // locations which obviously cannot implement this macro. + const auto& compressed_block_grid = g_vpr_ctx.placement().compressed_block_grids[block_type->index]; + const DeviceGrid& device_grid = g_vpr_ctx.device().grid; + const int num_layers = device_grid.get_num_layers(); + // This method does not support 3D FPGAs yet. The search performed will only + // traverse the same layer as the src_loc. + VTR_ASSERT(num_layers == 1); + constexpr int layer = 0; + + // Get the closest (approximately) compressed location to the src location. + // This does not need to be perfect (in fact I do not think it is), but the + // closer it is, the faster the BFS will find the best solution. + t_physical_tile_loc src_grid_loc(src_flat_loc.x, src_flat_loc.y, src_flat_loc.layer); + const t_physical_tile_loc compressed_src_loc = compressed_block_grid.grid_loc_to_compressed_loc_approx(src_grid_loc); + + // Weighted-BFS search the compressed grid for an empty compatible subtile. + size_t num_rows = compressed_block_grid.get_num_rows(layer); + size_t num_cols = compressed_block_grid.get_num_columns(layer); + vtr::NdMatrix visited({num_cols, num_rows}, false); + float best_dist = std::numeric_limits::max(); + t_pl_loc best_loc(OPEN, OPEN, OPEN, OPEN); + + std::queue loc_queue; + loc_queue.push(compressed_src_loc); + while (!loc_queue.empty()) { + // Pop the top element off the queue. + t_physical_tile_loc loc = loc_queue.front(); + loc_queue.pop(); + + // If this location has already been visited, skip it. + if (visited[loc.x][loc.y]) + continue; + visited[loc.x][loc.y] = true; + + // Get the minimum distance the cluster would need to move (relative to + // its global placement solution) to be within the tile at the given + // location. + // Note: In compressed space, distances are not what they appear. We are + // using the true grid positions to get the truly closest loc. + auto grid_loc = compressed_block_grid.compressed_loc_to_grid_loc(loc); + float grid_dist = get_dist_to_tile(src_flat_loc, grid_loc, device_grid); + // If this distance is worst than the best we have seen. + // NOTE: This prune is always safe (i.e. it will never remove a better + // solution) since this is a spatial graph and our objective is + // positional distance. The un-visitied neighbors of a node should + // have a higher distance than the current node. + if (grid_dist >= best_dist) + continue; + + // In order to ensure our BFS finds the closest compatible location, we + // traverse compressed grid locations which may not actually be valid + // (i.e. no tile exists there). This is fine, we just need to check for + // them to ensure we never try to put a cluster there. + bool is_valid_compressed_loc = false; + const auto& compressed_col_blk_map = compressed_block_grid.get_column_block_map(loc.x, layer); + if (compressed_col_blk_map.count(loc.y) != 0) + is_valid_compressed_loc = true; + + // If this distance is better than the best we have seen so far, try + // to see if this is a better solution. + if (is_valid_compressed_loc) { + // Get a sub-tile at this location if it is available. + int new_sub_tile = get_first_available_sub_tile_at_grid_loc(grid_loc, + blk_loc_registry, + device_grid, + compressed_block_grid); + if (new_sub_tile != OPEN) { + // If a sub-tile is available, set this to be the first sub-tile + // available and check if this site is legal for this macro. + // Note: We are using the fully legality check here to check for + // floorplanning constraints and compatibility for all + // members of the macro. This prevents some macros being + // placed where they obviously cannot be implemented. + // Note: The check_all_legality flag is poorly named. false means + // that it WILL check all legality... + t_pl_loc new_loc = t_pl_loc(grid_loc.x, grid_loc.y, new_sub_tile, grid_loc.layer_num); + bool site_legal_for_macro = macro_can_be_placed(pl_macro, + new_loc, + false /*check_all_legality*/, + blk_loc_registry); + if (site_legal_for_macro) { + // Update the best solition. + // Note: We need to keep searching since the compressed grid + // may present a location which is closer in compressed + // space earlier than a location which is closer in + // grid space. + best_dist = grid_dist; + best_loc = new_loc; + } + } + } + + // Push the neighbors (in the compressed grid) onto the queue. + // This will push the neighbors left, right, above, and below the current + // location. Some of these locations may not exist or may have already + // been visited. The code above checks for these cases to prevent extra + // work and invalid lookups. This must be done this way to ensure that + // the closest location can be found efficiently. + if (loc.x > 0) { + t_physical_tile_loc new_comp_loc = t_physical_tile_loc(loc.x - 1, + loc.y, + loc.layer_num); + loc_queue.push(new_comp_loc); + } + if (loc.x < (int)num_cols - 1) { + t_physical_tile_loc new_comp_loc = t_physical_tile_loc(loc.x + 1, + loc.y, + loc.layer_num); + loc_queue.push(new_comp_loc); + } + if (loc.y > 0) { + t_physical_tile_loc new_comp_loc = t_physical_tile_loc(loc.x, + loc.y - 1, + loc.layer_num); + loc_queue.push(new_comp_loc); + } + if (loc.y < (int)num_rows - 1) { + t_physical_tile_loc new_comp_loc = t_physical_tile_loc(loc.x, + loc.y + 1, + loc.layer_num); + loc_queue.push(new_comp_loc); + } + } + + return best_loc; } static bool try_centroid_placement(const t_pl_macro& pl_macro, @@ -614,46 +809,29 @@ static bool try_centroid_placement(const t_pl_macro& pl_macro, unplaced_blocks_to_update_their_score = find_centroid_loc(pl_macro, centroid_loc, blk_loc_registry); found_legal_subtile = find_subtile_in_location(centroid_loc, block_type, blk_loc_registry, pr, rng); } else { - // Note: AP uses a different rlim than non-AP - rlim = CENTROID_NEIGHBOR_SEARCH_RLIM_AP; // If a flat placement is provided, use the flat placement to get the - // centroid. - find_centroid_loc_from_flat_placement(pl_macro, centroid_loc, flat_placement_info); - if (!is_loc_on_chip({centroid_loc.x, centroid_loc.y, centroid_loc.layer}) || !is_loc_legal(centroid_loc, pr, block_type)) { - // If the centroid is not legal, check for a neighboring block we - // can use instead. - bool neighbor_legal_loc = find_centroid_neighbor(centroid_loc, - block_type, - false, - rlim, - blk_loc_registry, - rng); - if (!neighbor_legal_loc) { - // If we cannot find a neighboring block, fall back on the - // original find_centroid_loc function. - // FIXME: We should really just skip this block and come back - // to it later. We do not want it taking space from - // someone else! - unplaced_blocks_to_update_their_score = find_centroid_loc(pl_macro, centroid_loc, blk_loc_registry); - found_legal_subtile = find_subtile_in_location(centroid_loc, block_type, blk_loc_registry, pr, rng); - } else { - found_legal_subtile = true; - } + // centroid location of the macro. + t_flat_pl_loc centroid_flat_loc = find_centroid_loc_from_flat_placement(pl_macro, flat_placement_info); + // Then find the nearest legal location to this centroid for this macro. + centroid_loc = find_nearest_compatible_loc(centroid_flat_loc, + block_type, + pl_macro, + blk_loc_registry); + // FIXME: After this point, if the find_nearest_compatible_loc function + // could not find a valid location, then nothing should be able to. + // Also the location it returns will be on the chip and in the PR + // by construction. Could save time by skipping those checks if + // needed. + if (centroid_loc.x == OPEN) { + // If we cannot find a nearest block, fall back on the original + // find_centroid_loc function. + // FIXME: We should really just skip this block and come back + // to it later. We do not want it taking space from + // someone else! + unplaced_blocks_to_update_their_score = find_centroid_loc(pl_macro, centroid_loc, blk_loc_registry); + found_legal_subtile = find_subtile_in_location(centroid_loc, block_type, blk_loc_registry, pr, rng); } else { - // If this is a legal location for this block, check if any other - // blocks are at this subtile location. - const GridBlock& grid_blocks = blk_loc_registry.grid_blocks(); - if (grid_blocks.block_at_location(centroid_loc)) { - // If there is a block at this subtile, try to find another - // subtile at this location to be placed in. - found_legal_subtile = find_subtile_in_location(centroid_loc, - block_type, - blk_loc_registry, - pr, - rng); - } else { - found_legal_subtile = true; - } + found_legal_subtile = true; } } diff --git a/vtr_flow/tasks/regression_tests/vtr_reg_strong/basic_ap/config/golden_results.txt b/vtr_flow/tasks/regression_tests/vtr_reg_strong/basic_ap/config/golden_results.txt index a21f4847723..f0282e9bf5e 100644 --- a/vtr_flow/tasks/regression_tests/vtr_reg_strong/basic_ap/config/golden_results.txt +++ b/vtr_flow/tasks/regression_tests/vtr_reg_strong/basic_ap/config/golden_results.txt @@ -1,5 +1,5 @@ - arch circuit script_params vtr_flow_elapsed_time vtr_max_mem_stage vtr_max_mem error odin_synth_time max_odin_mem parmys_synth_time max_parmys_mem abc_depth abc_synth_time abc_cec_time abc_sec_time max_abc_mem ace_time max_ace_mem num_clb num_io num_memories num_mult vpr_status vpr_revision vpr_build_info vpr_compiler vpr_compiled hostname rundir max_vpr_mem num_primary_inputs num_primary_outputs num_pre_packed_nets num_pre_packed_blocks num_netlist_clocks num_post_packed_nets num_post_packed_blocks device_width device_height device_grid_tiles device_limiting_resources device_name pack_mem pack_time placed_wirelength_est total_swap accepted_swap rejected_swap aborted_swap place_mem place_time place_quench_time placed_CPD_est placed_setup_TNS_est placed_setup_WNS_est placed_geomean_nonvirtual_intradomain_critical_path_delay_est place_delay_matrix_lookup_time place_quench_timing_analysis_time place_quench_sta_time place_total_timing_analysis_time place_total_sta_time ap_mem ap_time ap_full_legalizer_mem ap_full_legalizer_time min_chan_width routed_wirelength min_chan_width_route_success_iteration logic_block_area_total logic_block_area_used min_chan_width_routing_area_total min_chan_width_routing_area_per_tile min_chan_width_route_time min_chan_width_total_timing_analysis_time min_chan_width_total_sta_time crit_path_num_rr_graph_nodes crit_path_num_rr_graph_edges crit_path_collapsed_nodes crit_path_routed_wirelength crit_path_route_success_iteration crit_path_total_nets_routed crit_path_total_connections_routed crit_path_total_heap_pushes crit_path_total_heap_pops critical_path_delay geomean_nonvirtual_intradomain_critical_path_delay setup_TNS setup_WNS hold_TNS hold_WNS crit_path_routing_area_total crit_path_routing_area_per_tile router_lookahead_computation_time crit_path_route_time crit_path_create_rr_graph_time crit_path_create_intra_cluster_rr_graph_time crit_path_tile_lookahead_computation_time crit_path_router_lookahead_computation_time crit_path_total_timing_analysis_time crit_path_total_sta_time - fixed_k6_frac_N8_22nm.xml single_wire.v common 1.54 vpr 75.57 MiB -1 -1 0.07 20592 1 0.01 -1 -1 32920 -1 -1 0 1 0 0 success v8.0.0-12254-gfbcf794de release VTR_ASSERT_LEVEL=3 GNU 13.2.0 on Linux-6.8.0-49-generic x86_64 2025-03-15T15:26:16 srivatsan-Precision-Tower-5810 /home/alex/vtr-verilog-to-routing 77384 1 1 0 2 0 1 2 17 17 289 -1 unnamed_device -1 -1 2 3 0 0 3 75.6 MiB 0.53 0.00 0.2714 -0.2714 -0.2714 nan 0.40 1.4631e-05 9.791e-06 8.1049e-05 5.7141e-05 75.6 MiB 0.53 75.6 MiB 0.12 8 4 1 6.79088e+06 0 166176. 575.005 0.15 0.000784397 0.000717344 20206 45088 -1 14 1 1 1 125 46 0.7726 nan -0.7726 -0.7726 0 0 202963. 702.294 0.01 0.00 0.04 -1 -1 0.01 0.000811044 0.000756117 - fixed_k6_frac_N8_22nm.xml single_ff.v common 1.63 vpr 75.70 MiB -1 -1 0.07 20844 1 0.02 -1 -1 33032 -1 -1 1 2 0 0 success v8.0.0-12254-gfbcf794de release VTR_ASSERT_LEVEL=3 GNU 13.2.0 on Linux-6.8.0-49-generic x86_64 2025-03-15T15:26:16 srivatsan-Precision-Tower-5810 /home/alex/vtr-verilog-to-routing 77520 2 1 3 3 1 3 4 17 17 289 -1 unnamed_device -1 -1 22 9 3 1 5 75.7 MiB 0.53 0.00 0.74674 -1.4524 -0.74674 0.74674 0.40 2.2315e-05 1.4572e-05 0.00011558 8.2163e-05 75.7 MiB 0.53 75.7 MiB 0.12 20 27 1 6.79088e+06 13472 414966. 1435.87 0.24 0.000962952 0.000874709 22510 95286 -1 26 1 2 2 102 24 0.691615 0.691615 -1.31306 -0.691615 0 0 503264. 1741.40 0.03 0.00 0.08 -1 -1 0.03 0.000867563 0.000798758 - fixed_k6_frac_N8_22nm.xml ch_intrinsics.v common 2.79 vpr 76.36 MiB -1 -1 0.25 22244 3 0.07 -1 -1 36668 -1 -1 68 99 1 0 success v8.0.0-12254-gfbcf794de release VTR_ASSERT_LEVEL=3 GNU 13.2.0 on Linux-6.8.0-49-generic x86_64 2025-03-15T15:26:16 srivatsan-Precision-Tower-5810 /home/alex/vtr-verilog-to-routing 78188 99 130 240 229 1 226 298 17 17 289 -1 unnamed_device -1 -1 846 18208 2258 1637 14313 76.4 MiB 0.64 0.00 1.6707 -124.477 -1.6707 1.6707 0.40 0.00059261 0.000526035 0.013517 0.012053 76.4 MiB 0.64 76.4 MiB 0.19 34 1946 36 6.79088e+06 1.4641e+06 618332. 2139.56 0.79 0.171134 0.151607 25102 150614 -1 1729 13 592 913 55626 16852 2.0466 2.0466 -144.281 -2.0466 -0.42408 -0.16867 787024. 2723.27 0.04 0.03 0.13 -1 -1 0.04 0.0345082 0.031115 - fixed_k6_frac_N8_22nm.xml diffeq1.v common 12.53 vpr 78.07 MiB -1 -1 0.37 26724 15 0.31 -1 -1 37344 -1 -1 48 162 0 5 success v8.0.0-12254-gfbcf794de release VTR_ASSERT_LEVEL=3 GNU 13.2.0 on Linux-6.8.0-49-generic x86_64 2025-03-15T15:26:16 srivatsan-Precision-Tower-5810 /home/alex/vtr-verilog-to-routing 79948 162 96 817 258 1 703 311 17 17 289 -1 unnamed_device -1 -1 6658 22424 277 6100 16047 78.1 MiB 1.01 0.01 20.481 -1562.51 -20.481 20.481 0.40 0.00197202 0.00175463 0.0544262 0.0486974 78.1 MiB 1.01 78.1 MiB 0.34 52 13955 24 6.79088e+06 2.62666e+06 926341. 3205.33 8.88 0.890272 0.801277 28558 226646 -1 11525 23 3544 7898 1070307 274350 20.4832 20.4832 -1545.04 -20.4832 0 0 1.14541e+06 3963.36 0.05 0.30 0.20 -1 -1 0.05 0.173866 0.157862 + arch circuit script_params vtr_flow_elapsed_time vtr_max_mem_stage vtr_max_mem error odin_synth_time max_odin_mem parmys_synth_time max_parmys_mem abc_depth abc_synth_time abc_cec_time abc_sec_time max_abc_mem ace_time max_ace_mem num_clb num_io num_memories num_mult vpr_status vpr_revision vpr_build_info vpr_compiler vpr_compiled hostname rundir max_vpr_mem num_primary_inputs num_primary_outputs num_pre_packed_nets num_pre_packed_blocks num_netlist_clocks num_post_packed_nets num_post_packed_blocks device_width device_height device_grid_tiles device_limiting_resources device_name pack_mem pack_time initial_placed_wirelength_est placed_wirelength_est total_swap accepted_swap rejected_swap aborted_swap place_mem place_time place_quench_time initial_placed_CPD_est placed_CPD_est placed_setup_TNS_est placed_setup_WNS_est placed_geomean_nonvirtual_intradomain_critical_path_delay_est place_delay_matrix_lookup_time place_quench_timing_analysis_time place_quench_sta_time place_total_timing_analysis_time place_total_sta_time ap_mem ap_time ap_full_legalizer_mem ap_full_legalizer_time min_chan_width routed_wirelength min_chan_width_route_success_iteration logic_block_area_total logic_block_area_used min_chan_width_routing_area_total min_chan_width_routing_area_per_tile min_chan_width_route_time min_chan_width_total_timing_analysis_time min_chan_width_total_sta_time crit_path_num_rr_graph_nodes crit_path_num_rr_graph_edges crit_path_collapsed_nodes crit_path_routed_wirelength crit_path_route_success_iteration crit_path_total_nets_routed crit_path_total_connections_routed crit_path_total_heap_pushes crit_path_total_heap_pops critical_path_delay geomean_nonvirtual_intradomain_critical_path_delay setup_TNS setup_WNS hold_TNS hold_WNS crit_path_routing_area_total crit_path_routing_area_per_tile router_lookahead_computation_time crit_path_route_time crit_path_create_rr_graph_time crit_path_create_intra_cluster_rr_graph_time crit_path_tile_lookahead_computation_time crit_path_router_lookahead_computation_time crit_path_total_timing_analysis_time crit_path_total_sta_time + fixed_k6_frac_N8_22nm.xml single_wire.v common 1.34 vpr 75.71 MiB -1 -1 0.07 20608 1 0.01 -1 -1 33172 -1 -1 0 1 0 0 success v8.0.0-12401-g2b0120e4a-dirty release VTR_ASSERT_LEVEL=3 GNU 13.3.0 on Linux-6.8.0-57-generic x86_64 2025-04-13T13:41:01 srivatsan-Precision-Tower-5810 /home/alex/vtr-verilog-to-routing 77532 1 1 0 2 0 1 2 17 17 289 -1 unnamed_device -1 -1 2 2 3 0 0 3 75.7 MiB 0.48 0.00 0.2714 0.2714 -0.2714 -0.2714 nan 0.40 1.4684e-05 9.512e-06 8.1482e-05 5.6821e-05 75.7 MiB 0.48 75.7 MiB 0.07 8 16 1 6.79088e+06 0 166176. 575.005 0.15 0.000912133 0.000836449 20206 45088 -1 18 1 1 1 141 56 0.7726 nan -0.7726 -0.7726 0 0 202963. 702.294 0.01 0.00 0.04 -1 -1 0.01 0.000776852 0.0007249 + fixed_k6_frac_N8_22nm.xml single_ff.v common 1.51 vpr 75.95 MiB -1 -1 0.08 20852 1 0.02 -1 -1 33716 -1 -1 1 2 0 0 success v8.0.0-12401-g2b0120e4a-dirty release VTR_ASSERT_LEVEL=3 GNU 13.3.0 on Linux-6.8.0-57-generic x86_64 2025-04-13T13:41:01 srivatsan-Precision-Tower-5810 /home/alex/vtr-verilog-to-routing 77776 2 1 3 3 1 3 4 17 17 289 -1 unnamed_device -1 -1 22 24 9 1 1 7 76.0 MiB 0.47 0.00 0.930505 0.74674 -1.43836 -0.74674 0.74674 0.39 1.1513e-05 7.851e-06 8.3564e-05 6.0773e-05 76.0 MiB 0.47 76.0 MiB 0.07 20 31 1 6.79088e+06 13472 414966. 1435.87 0.24 0.000928712 0.000851847 22510 95286 -1 32 1 2 2 231 42 0.74674 0.74674 -1.43836 -0.74674 0 0 503264. 1741.40 0.03 0.00 0.08 -1 -1 0.03 0.000833737 0.000775898 + fixed_k6_frac_N8_22nm.xml ch_intrinsics.v common 2.74 vpr 76.62 MiB -1 -1 0.26 22392 3 0.07 -1 -1 37308 -1 -1 67 99 1 0 success v8.0.0-12401-g2b0120e4a-dirty release VTR_ASSERT_LEVEL=3 GNU 13.3.0 on Linux-6.8.0-57-generic x86_64 2025-04-13T13:41:01 srivatsan-Precision-Tower-5810 /home/alex/vtr-verilog-to-routing 78456 99 130 240 229 1 225 297 17 17 289 -1 unnamed_device -1 -1 978 866 19107 2257 1105 15745 76.6 MiB 0.61 0.00 2.26688 1.84068 -122.242 -1.84068 1.84068 0.39 0.000595647 0.000527536 0.0138425 0.0123349 76.6 MiB 0.61 76.6 MiB 0.13 34 1974 43 6.79088e+06 1.45062e+06 618332. 2139.56 0.79 0.175076 0.154945 25102 150614 -1 1739 14 569 895 60631 18120 2.0466 2.0466 -143.082 -2.0466 -0.04337 -0.04337 787024. 2723.27 0.04 0.03 0.13 -1 -1 0.04 0.0355147 0.0319235 + fixed_k6_frac_N8_22nm.xml diffeq1.v common 9.26 vpr 78.62 MiB -1 -1 0.36 26868 15 0.31 -1 -1 37472 -1 -1 47 162 0 5 success v8.0.0-12401-g2b0120e4a-dirty release VTR_ASSERT_LEVEL=3 GNU 13.3.0 on Linux-6.8.0-57-generic x86_64 2025-04-13T13:41:01 srivatsan-Precision-Tower-5810 /home/alex/vtr-verilog-to-routing 80512 162 96 817 258 1 691 310 17 17 289 -1 unnamed_device -1 -1 7341 6689 25462 269 7038 18155 78.6 MiB 1.27 0.01 22.1608 21.0485 -1573.19 -21.0485 21.0485 0.38 0.00201699 0.00177192 0.0590804 0.052726 78.6 MiB 1.27 78.6 MiB 0.26 54 12827 26 6.79088e+06 2.61318e+06 949917. 3286.91 5.15 0.794403 0.715337 28846 232421 -1 11184 19 3449 7611 967200 252634 20.9913 20.9913 -1571.36 -20.9913 0 0 1.17392e+06 4061.99 0.06 0.26 0.21 -1 -1 0.06 0.158612 0.144189