From d1e78af1d3afe15d253e6f9e2eb0c4a66376dde3 Mon Sep 17 00:00:00 2001 From: amin1377 Date: Thu, 1 May 2025 19:11:58 -0400 Subject: [PATCH 1/8] [vpr][place] add a link between IOs during initial placement --- libs/libarchfpga/src/physical_types_util.cpp | 4 ++++ libs/libarchfpga/src/physical_types_util.h | 1 + vpr/src/place/initial_placement.cpp | 21 ++++++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/libs/libarchfpga/src/physical_types_util.cpp b/libs/libarchfpga/src/physical_types_util.cpp index 2ecc7fbd41c..6ba2d28132f 100644 --- a/libs/libarchfpga/src/physical_types_util.cpp +++ b/libs/libarchfpga/src/physical_types_util.cpp @@ -652,6 +652,10 @@ bool is_io_type(t_physical_tile_type_ptr type) { || is_output_type(type); } +bool is_io_type(t_logical_block_type_ptr logical_block) { + return is_io_type(pick_physical_type(logical_block)); +} + std::string block_type_pin_index_to_name(t_physical_tile_type_ptr type, int pin_physical_num, bool is_flat) { int max_ptc = get_tile_pin_max_ptc(type, is_flat); VTR_ASSERT(pin_physical_num < max_ptc); diff --git a/libs/libarchfpga/src/physical_types_util.h b/libs/libarchfpga/src/physical_types_util.h index a081683faeb..af7bdd1fa1e 100644 --- a/libs/libarchfpga/src/physical_types_util.h +++ b/libs/libarchfpga/src/physical_types_util.h @@ -126,6 +126,7 @@ bool is_input_type(t_physical_tile_type_ptr type); bool is_output_type(t_physical_tile_type_ptr type); ///@brief Returns true if the given physical tile type can implement either a .input or .output block type bool is_io_type(t_physical_tile_type_ptr type); +bool is_io_type(t_logical_block_type_ptr logical_block); /** * @brief Returns the corresponding physical pin based on the input parameters: diff --git a/vpr/src/place/initial_placement.cpp b/vpr/src/place/initial_placement.cpp index 3dc8650a3e2..6e23a963270 100644 --- a/vpr/src/place/initial_placement.cpp +++ b/vpr/src/place/initial_placement.cpp @@ -472,6 +472,7 @@ static std::vector find_centroid_loc(const t_pl_macro& pl_macro, find_layer = true; } std::vector connected_blocks_to_update; + std::unordered_set seen_blocks; //iterate over the from block pins for (ClusterPinId pin_id : cluster_ctx.clb_nlist.block_pins(head_blk)) { @@ -510,6 +511,7 @@ static std::vector find_centroid_loc(const t_pl_macro& pl_macro, VTR_ASSERT(tile_loc.layer_num != OPEN); layer_count[tile_loc.layer_num]++; } + seen_blocks.insert(cluster_ctx.clb_nlist.pin_block(sink_pin_id)); acc_x += tile_loc.x; acc_y += tile_loc.y; acc_weight++; @@ -530,12 +532,31 @@ static std::vector find_centroid_loc(const t_pl_macro& pl_macro, VTR_ASSERT(tile_loc.layer_num != OPEN); layer_count[tile_loc.layer_num]++; } + seen_blocks.insert(cluster_ctx.clb_nlist.pin_block(source_pin)); acc_x += tile_loc.x; acc_y += tile_loc.y; acc_weight++; } } + if (is_io_type(cluster_ctx.clb_nlist.block_type(head_blk)) && acc_weight != 0) { + for (const auto& block : cluster_ctx.clb_nlist.blocks()) { + if (seen_blocks.find(block) == seen_blocks.end()) { + continue; + } + if (block == head_blk) { + continue; + } + if (is_io_type(cluster_ctx.clb_nlist.block_type(block))) { + if (is_block_placed(block, block_locs)) { + acc_x += block_locs[block].loc.x; + acc_y += block_locs[block].loc.y; + acc_weight++; + } + } + } + } + //Calculate the centroid location if (acc_weight > 0) { centroid.x = acc_x / acc_weight; From b0d77230be83595d182d58eced652fa5178c649a Mon Sep 17 00:00:00 2001 From: amin1377 Date: Tue, 6 May 2025 09:30:46 -0400 Subject: [PATCH 2/8] [vpr][place] skip the block if it is seen before when adding the connection between io blocks --- vpr/src/place/initial_placement.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/vpr/src/place/initial_placement.cpp b/vpr/src/place/initial_placement.cpp index 6e23a963270..4cfbfa1798b 100644 --- a/vpr/src/place/initial_placement.cpp +++ b/vpr/src/place/initial_placement.cpp @@ -473,6 +473,7 @@ static std::vector find_centroid_loc(const t_pl_macro& pl_macro, } std::vector connected_blocks_to_update; std::unordered_set seen_blocks; + seen_blocks.insert(head_blk); //iterate over the from block pins for (ClusterPinId pin_id : cluster_ctx.clb_nlist.block_pins(head_blk)) { @@ -541,13 +542,10 @@ static std::vector find_centroid_loc(const t_pl_macro& pl_macro, if (is_io_type(cluster_ctx.clb_nlist.block_type(head_blk)) && acc_weight != 0) { for (const auto& block : cluster_ctx.clb_nlist.blocks()) { - if (seen_blocks.find(block) == seen_blocks.end()) { - continue; - } - if (block == head_blk) { - continue; - } if (is_io_type(cluster_ctx.clb_nlist.block_type(block))) { + if (seen_blocks.find(block) != seen_blocks.end()) { + continue; + } if (is_block_placed(block, block_locs)) { acc_x += block_locs[block].loc.x; acc_y += block_locs[block].loc.y; From c57cb6cfb121fd97bd08bce57f1a05c7f249e078 Mon Sep 17 00:00:00 2001 From: amin1377 Date: Wed, 7 May 2025 13:17:17 -0400 Subject: [PATCH 3/8] [vpr][place] increase rlim init place gradually --- vpr/src/place/initial_placement.cpp | 52 +++++++++++++++++------------ 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/vpr/src/place/initial_placement.cpp b/vpr/src/place/initial_placement.cpp index 4cfbfa1798b..0929e766c02 100644 --- a/vpr/src/place/initial_placement.cpp +++ b/vpr/src/place/initial_placement.cpp @@ -208,6 +208,7 @@ static bool find_centroid_neighbor(t_pl_loc& centroid_loc, bool search_for_empty, int r_lim, const BlkLocRegistry& blk_loc_registry, + const PartitionRegion& pr, vtr::RngContainer& rng); /** @@ -403,8 +404,9 @@ bool find_subtile_in_location(t_pl_loc& centroid, static bool find_centroid_neighbor(t_pl_loc& centroid_loc, t_logical_block_type_ptr block_type, bool search_for_empty, - int rlim, + int /*rlim*/, const BlkLocRegistry& blk_loc_registry, + const PartitionRegion& pr, vtr::RngContainer& rng) { const auto& compressed_block_grid = g_vpr_ctx.placement().compressed_block_grids[block_type->index]; const int num_layers = g_vpr_ctx.device().grid.get_num_layers(); @@ -415,39 +417,45 @@ static bool find_centroid_neighbor(t_pl_loc& centroid_loc, centroid_loc, num_layers); - //range limit (rlim) set a limit for the neighbor search in the centroid placement - //the neighbor location should be within the defined range to calculated centroid location - int first_rlim = rlim; + size_t max_dim = 0; + for (int layer = 0; layer < num_layers; layer++) { + max_dim = std::max(max_dim, std::max(compressed_block_grid.get_num_rows(layer), compressed_block_grid.get_num_columns(layer))); + } - auto search_range = get_compressed_grid_target_search_range(compressed_block_grid, + bool legal = false; + t_physical_tile_loc to_compressed_loc; + for (int rlim = 1; rlim <= max_dim/2; rlim++) { + auto search_range = get_compressed_grid_target_search_range(compressed_block_grid, compressed_centroid_loc[centroid_loc_layer_num], first_rlim); - int delta_cx = search_range.xmax - search_range.xmin; + int delta_cx = search_range.xmax - search_range.xmin; - //Block has not been placed yet, so the "from" coords will be (-1, -1) - int cx_from = OPEN; - int cy_from = OPEN; - int layer_from = centroid_loc_layer_num; + //Block has not been placed yet, so the "from" coords will be (-1, -1) + int cx_from = OPEN; + int cy_from = OPEN; + int layer_from = centroid_loc_layer_num; - t_physical_tile_loc to_compressed_loc; - bool legal = find_compatible_compressed_loc_in_range(block_type, - delta_cx, - {cx_from, cy_from, layer_from}, - search_range, - to_compressed_loc, - /*is_median=*/false, - centroid_loc_layer_num, - search_for_empty, - blk_loc_registry, - rng); + legal = find_compatible_compressed_loc_in_range(block_type, + delta_cx, + {cx_from, cy_from, layer_from}, + search_range, + to_compressed_loc, + /*is_median=*/false, + centroid_loc_layer_num, + search_for_empty, + blk_loc_registry, + rng); + } if (!legal) { return false; } compressed_grid_to_loc(block_type, to_compressed_loc, centroid_loc, rng); + bool found_subtile = find_subtile_in_location(centroid_loc, block_type, blk_loc_registry, pr, rng); + VTR_ASSERT(found_subtile); return legal; } @@ -908,7 +916,7 @@ static bool try_centroid_placement(const t_pl_macro& pl_macro, //centroid suggestion was either occupied or does not match block type //try to find a near location that meet these requirements if (!found_legal_subtile) { - bool neighbor_legal_loc = find_centroid_neighbor(centroid_loc, block_type, false, rlim, blk_loc_registry, rng); + bool neighbor_legal_loc = find_centroid_neighbor(centroid_loc, block_type, true, rlim, blk_loc_registry, pr, rng); if (!neighbor_legal_loc) { //no neighbor candidate found return false; } From 0e444005a225828bd16ba37ac43c51a4c87115d6 Mon Sep 17 00:00:00 2001 From: amin1377 Date: Wed, 7 May 2025 13:18:57 -0400 Subject: [PATCH 4/8] [vpr][place] remove seen_block --- vpr/src/place/initial_placement.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/vpr/src/place/initial_placement.cpp b/vpr/src/place/initial_placement.cpp index 0929e766c02..58e6d356193 100644 --- a/vpr/src/place/initial_placement.cpp +++ b/vpr/src/place/initial_placement.cpp @@ -427,7 +427,7 @@ static bool find_centroid_neighbor(t_pl_loc& centroid_loc, for (int rlim = 1; rlim <= max_dim/2; rlim++) { auto search_range = get_compressed_grid_target_search_range(compressed_block_grid, compressed_centroid_loc[centroid_loc_layer_num], - first_rlim); + rlim); int delta_cx = search_range.xmax - search_range.xmin; @@ -480,8 +480,6 @@ static std::vector find_centroid_loc(const t_pl_macro& pl_macro, find_layer = true; } std::vector connected_blocks_to_update; - std::unordered_set seen_blocks; - seen_blocks.insert(head_blk); //iterate over the from block pins for (ClusterPinId pin_id : cluster_ctx.clb_nlist.block_pins(head_blk)) { @@ -520,7 +518,6 @@ static std::vector find_centroid_loc(const t_pl_macro& pl_macro, VTR_ASSERT(tile_loc.layer_num != OPEN); layer_count[tile_loc.layer_num]++; } - seen_blocks.insert(cluster_ctx.clb_nlist.pin_block(sink_pin_id)); acc_x += tile_loc.x; acc_y += tile_loc.y; acc_weight++; @@ -541,7 +538,6 @@ static std::vector find_centroid_loc(const t_pl_macro& pl_macro, VTR_ASSERT(tile_loc.layer_num != OPEN); layer_count[tile_loc.layer_num]++; } - seen_blocks.insert(cluster_ctx.clb_nlist.pin_block(source_pin)); acc_x += tile_loc.x; acc_y += tile_loc.y; acc_weight++; @@ -551,9 +547,6 @@ static std::vector find_centroid_loc(const t_pl_macro& pl_macro, if (is_io_type(cluster_ctx.clb_nlist.block_type(head_blk)) && acc_weight != 0) { for (const auto& block : cluster_ctx.clb_nlist.blocks()) { if (is_io_type(cluster_ctx.clb_nlist.block_type(block))) { - if (seen_blocks.find(block) != seen_blocks.end()) { - continue; - } if (is_block_placed(block, block_locs)) { acc_x += block_locs[block].loc.x; acc_y += block_locs[block].loc.y; From 3d61bf11e9e70caf991456f9adf3f82bbab22606 Mon Sep 17 00:00:00 2001 From: amin1377 Date: Wed, 7 May 2025 13:23:47 -0400 Subject: [PATCH 5/8] [vpr][place] if block doens't have any connected block placed, place it close to other connected blocks --- vpr/src/place/initial_placement.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/vpr/src/place/initial_placement.cpp b/vpr/src/place/initial_placement.cpp index 58e6d356193..93840e9f98c 100644 --- a/vpr/src/place/initial_placement.cpp +++ b/vpr/src/place/initial_placement.cpp @@ -544,16 +544,27 @@ static std::vector find_centroid_loc(const t_pl_macro& pl_macro, } } - if (is_io_type(cluster_ctx.clb_nlist.block_type(head_blk)) && acc_weight != 0) { + if (is_io_type(cluster_ctx.clb_nlist.block_type(head_blk))) { for (const auto& block : cluster_ctx.clb_nlist.blocks()) { if (is_io_type(cluster_ctx.clb_nlist.block_type(block))) { if (is_block_placed(block, block_locs)) { acc_x += block_locs[block].loc.x; acc_y += block_locs[block].loc.y; + layer_count[block_locs[block].loc.layer]++; acc_weight++; } } } + } else { + if (acc_weight == 0) { + for (const auto& block : cluster_ctx.clb_nlist.blocks()) { + if (is_block_placed(block, block_locs)) { + acc_x += block_locs[block].loc.x; + acc_y += block_locs[block].loc.y; + layer_count[block_locs[block].loc.layer]++; + acc_weight++; + } + } } //Calculate the centroid location From d0ddc9f65dd88a1fc3c851bca139208d5d1dce1b Mon Sep 17 00:00:00 2001 From: amin1377 Date: Wed, 7 May 2025 14:10:37 -0400 Subject: [PATCH 6/8] [vpr][place] fix compile error --- vpr/src/place/initial_placement.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/vpr/src/place/initial_placement.cpp b/vpr/src/place/initial_placement.cpp index 93840e9f98c..8b592cf0c00 100644 --- a/vpr/src/place/initial_placement.cpp +++ b/vpr/src/place/initial_placement.cpp @@ -417,9 +417,11 @@ static bool find_centroid_neighbor(t_pl_loc& centroid_loc, centroid_loc, num_layers); - size_t max_dim = 0; + int max_dim = 0; for (int layer = 0; layer < num_layers; layer++) { - max_dim = std::max(max_dim, std::max(compressed_block_grid.get_num_rows(layer), compressed_block_grid.get_num_columns(layer))); + int num_rows = static_cast(compressed_block_grid.get_num_rows(layer)); + int num_cols = static_cast(compressed_block_grid.get_num_columns(layer)); + max_dim = std::max(max_dim, std::max(num_rows, num_cols)); } bool legal = false; @@ -564,6 +566,7 @@ static std::vector find_centroid_loc(const t_pl_macro& pl_macro, layer_count[block_locs[block].loc.layer]++; acc_weight++; } + } } } From 7dfd4f60384a1d9f83d0e0ca213f2587a0fc595e Mon Sep 17 00:00:00 2001 From: amin1377 Date: Fri, 9 May 2025 17:40:12 -0400 Subject: [PATCH 7/8] [vpr][place] remove virtual links between blocks during initial placement --- vpr/src/place/initial_placement.cpp | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/vpr/src/place/initial_placement.cpp b/vpr/src/place/initial_placement.cpp index 8b592cf0c00..722828d999d 100644 --- a/vpr/src/place/initial_placement.cpp +++ b/vpr/src/place/initial_placement.cpp @@ -546,30 +546,6 @@ static std::vector find_centroid_loc(const t_pl_macro& pl_macro, } } - if (is_io_type(cluster_ctx.clb_nlist.block_type(head_blk))) { - for (const auto& block : cluster_ctx.clb_nlist.blocks()) { - if (is_io_type(cluster_ctx.clb_nlist.block_type(block))) { - if (is_block_placed(block, block_locs)) { - acc_x += block_locs[block].loc.x; - acc_y += block_locs[block].loc.y; - layer_count[block_locs[block].loc.layer]++; - acc_weight++; - } - } - } - } else { - if (acc_weight == 0) { - for (const auto& block : cluster_ctx.clb_nlist.blocks()) { - if (is_block_placed(block, block_locs)) { - acc_x += block_locs[block].loc.x; - acc_y += block_locs[block].loc.y; - layer_count[block_locs[block].loc.layer]++; - acc_weight++; - } - } - } - } - //Calculate the centroid location if (acc_weight > 0) { centroid.x = acc_x / acc_weight; From 8c3ed8d1849d68d3402d573652134820842f259d Mon Sep 17 00:00:00 2001 From: amin1377 Date: Fri, 9 May 2025 18:25:06 -0400 Subject: [PATCH 8/8] [vpr][place] break out of loop if a legal location is found --- vpr/src/place/initial_placement.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/vpr/src/place/initial_placement.cpp b/vpr/src/place/initial_placement.cpp index 722828d999d..46863deaf32 100644 --- a/vpr/src/place/initial_placement.cpp +++ b/vpr/src/place/initial_placement.cpp @@ -449,6 +449,10 @@ static bool find_centroid_neighbor(t_pl_loc& centroid_loc, search_for_empty, blk_loc_registry, rng); + + if (legal) { + break; + } } if (!legal) {