Skip to content

Commit 6d340a0

Browse files
committed
equivalent: reorder physical/logical equivalent tiles based on pin differences
This change enables a sorting of the logical block and physical tiles equivalent counterpart lists based on the differences in the number of pins. This ordering allows to select the "best" corresponding candidate of a logical/physical type when there is the need to access its data. This also allows to not rely on the `pick_random_type` function Signed-off-by: Alessandro Comodi <[email protected]>
1 parent 3b8d7a3 commit 6d340a0

16 files changed

+60
-43
lines changed

libs/libarchfpga/src/read_xml_arch_file.cpp

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4805,8 +4805,24 @@ static void link_physical_logical_types(std::vector<t_physical_tile_type>& Physi
48054805
for (auto& physical_tile : PhysicalTileTypes) {
48064806
if (physical_tile.index == EMPTY_TYPE_INDEX) continue;
48074807

4808+
auto& equivalent_sites = physical_tile.equivalent_sites;
4809+
4810+
auto criteria = [physical_tile](const t_logical_block_type* lhs, const t_logical_block_type* rhs) {
4811+
int num_physical_pins = physical_tile.num_pins / physical_tile.capacity;
4812+
4813+
int lhs_num_logical_pins = lhs->pb_type->num_pins;
4814+
int rhs_num_logical_pins = rhs->pb_type->num_pins;
4815+
4816+
int lhs_diff_num_pins = num_physical_pins - lhs_num_logical_pins;
4817+
int rhs_diff_num_pins = num_physical_pins - rhs_num_logical_pins;
4818+
4819+
return lhs_diff_num_pins < rhs_diff_num_pins;
4820+
};
4821+
4822+
std::sort(equivalent_sites.begin(), equivalent_sites.end(), criteria);
4823+
48084824
for (auto& logical_block : LogicalBlockTypes) {
4809-
for (auto site : physical_tile.equivalent_sites) {
4825+
for (auto site : equivalent_sites) {
48104826
if (0 == strcmp(logical_block.name, site->pb_type->name)) {
48114827
logical_block.equivalent_tiles.push_back(&physical_tile);
48124828

@@ -4819,14 +4835,30 @@ static void link_physical_logical_types(std::vector<t_physical_tile_type>& Physi
48194835
for (auto& logical_block : LogicalBlockTypes) {
48204836
if (logical_block.index == EMPTY_TYPE_INDEX) continue;
48214837

4822-
if ((int)logical_block.equivalent_tiles.size() <= 0) {
4838+
auto& equivalent_tiles = logical_block.equivalent_tiles;
4839+
4840+
if ((int)equivalent_tiles.size() <= 0) {
48234841
archfpga_throw(__FILE__, __LINE__,
48244842
"Logical Block %s does not have any equivalent tiles.\n", logical_block.name);
48254843
}
48264844

48274845
std::unordered_map<int, bool> ignored_pins_check_map;
48284846
std::unordered_map<int, bool> global_pins_check_map;
48294847

4848+
auto criteria = [logical_block](const t_physical_tile_type* lhs, const t_physical_tile_type* rhs) {
4849+
int num_logical_pins = logical_block.pb_type->num_pins;
4850+
4851+
int lhs_num_physical_pins = lhs->num_pins / lhs->capacity;
4852+
int rhs_num_physical_pins = rhs->num_pins / rhs->capacity;
4853+
4854+
int lhs_diff_num_pins = lhs_num_physical_pins - num_logical_pins;
4855+
int rhs_diff_num_pins = rhs_num_physical_pins - num_logical_pins;
4856+
4857+
return lhs_diff_num_pins < rhs_diff_num_pins;
4858+
};
4859+
4860+
std::sort(equivalent_tiles.begin(), equivalent_tiles.end(), criteria);
4861+
48304862
for (int pin = 0; pin < logical_block.pb_type->num_pins; pin++) {
48314863
for (auto& tile : logical_block.equivalent_tiles) {
48324864
auto direct_map = tile->tile_block_pin_directs_map.at(logical_block.index);

vpr/src/base/SetupGrid.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -686,7 +686,7 @@ float calculate_device_utilization(const DeviceGrid& grid, std::map<t_logical_bl
686686
continue;
687687
}
688688

689-
t_physical_tile_type_ptr type = pick_random_physical_type(kv.first);
689+
t_physical_tile_type_ptr type = pick_best_physical_type(kv.first);
690690

691691
size_t count = kv.second;
692692

vpr/src/base/ShowSetup.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ void printClusteredNetlistStats() {
7575

7676
for (auto blk_id : cluster_ctx.clb_nlist.blocks()) {
7777
auto logical_block = cluster_ctx.clb_nlist.block_type(blk_id);
78-
auto physical_tile = pick_random_physical_type(logical_block);
78+
auto physical_tile = pick_best_physical_type(logical_block);
7979
num_blocks_type[logical_block->index]++;
8080
if (is_io_type(physical_tile)) {
8181
for (j = 0; j < logical_block->pb_type->num_pins; j++) {

vpr/src/base/check_netlist.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ static int check_connections_to_global_clb_pins(ClusterNetId net_id, int verbosi
9292
for (auto pin_id : cluster_ctx.clb_nlist.net_pins(net_id)) {
9393
ClusterBlockId blk_id = cluster_ctx.clb_nlist.pin_block(pin_id);
9494
auto logical_type = cluster_ctx.clb_nlist.block_type(blk_id);
95-
auto physical_type = pick_random_physical_type(logical_type);
95+
auto physical_type = pick_best_physical_type(logical_type);
9696

9797
int log_index = cluster_ctx.clb_nlist.pin_physical_index(pin_id);
9898
int pin_index = get_physical_pin(physical_type, logical_type, log_index);

vpr/src/base/read_netlist.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -949,7 +949,7 @@ static void load_external_nets_and_cb(ClusteredNetlist& clb_nlist) {
949949
* and blocks point back to net pins */
950950
for (auto blk_id : clb_nlist.blocks()) {
951951
block_type = clb_nlist.block_type(blk_id);
952-
auto tile_type = pick_random_physical_type(block_type);
952+
auto tile_type = pick_best_physical_type(block_type);
953953
for (j = 0; j < block_type->pb_type->num_pins; j++) {
954954
int physical_pin = get_physical_pin(tile_type, block_type, j);
955955

@@ -999,7 +999,7 @@ static void load_external_nets_and_cb(ClusteredNetlist& clb_nlist) {
999999
for (auto pin_id : clb_nlist.net_sinks(net_id)) {
10001000
bool is_ignored_net = clb_nlist.net_is_ignored(net_id);
10011001
block_type = clb_nlist.block_type(clb_nlist.pin_block(pin_id));
1002-
auto tile_type = pick_random_physical_type(block_type);
1002+
auto tile_type = pick_best_physical_type(block_type);
10031003
int logical_pin = clb_nlist.pin_logical_index(pin_id);
10041004
int physical_pin = get_physical_pin(tile_type, block_type, logical_pin);
10051005

vpr/src/base/read_place.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ void read_user_pad_loc(const char* pad_loc_file) {
161161
hash_table = alloc_hash_table();
162162
for (auto blk_id : cluster_ctx.clb_nlist.blocks()) {
163163
auto logical_block = cluster_ctx.clb_nlist.block_type(blk_id);
164-
if (is_io_type(pick_random_physical_type(logical_block))) {
164+
if (is_io_type(pick_best_physical_type(logical_block))) {
165165
insert_in_hash_table(hash_table, cluster_ctx.clb_nlist.block_name(blk_id).c_str(), size_t(blk_id));
166166
place_ctx.block_locs[blk_id].loc.x = OPEN; /* Mark as not seen yet. */
167167
}
@@ -268,7 +268,7 @@ void read_user_pad_loc(const char* pad_loc_file) {
268268

269269
for (auto blk_id : cluster_ctx.clb_nlist.blocks()) {
270270
auto logical_block = cluster_ctx.clb_nlist.block_type(blk_id);
271-
auto type = pick_random_physical_type(logical_block);
271+
auto type = pick_best_physical_type(logical_block);
272272
if (is_io_type(type) && place_ctx.block_locs[blk_id].loc.x == OPEN) {
273273
vpr_throw(VPR_ERROR_PLACE_F, pad_loc_file, 0,
274274
"IO block %s location was not specified in the pad file.\n", cluster_ctx.clb_nlist.block_name(blk_id).c_str());

vpr/src/draw/draw.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2736,7 +2736,7 @@ static void draw_reset_blk_color(ClusterBlockId blk_id) {
27362736

27372737
t_draw_state* draw_state = get_draw_state_vars();
27382738

2739-
draw_state->block_color[blk_id] = get_block_type_color(pick_random_physical_type(logical_block));
2739+
draw_state->block_color[blk_id] = get_block_type_color(pick_best_physical_type(logical_block));
27402740
}
27412741

27422742
/**

vpr/src/draw/draw_types.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ ezgl::rectangle t_draw_coords::get_absolute_clb_bbox(const ClusterBlockId clb_in
9595

9696
ezgl::rectangle t_draw_coords::get_absolute_clb_bbox(int grid_x, int grid_y, int sub_block_index) {
9797
auto& device_ctx = g_vpr_ctx.device();
98-
return get_pb_bbox(grid_x, grid_y, sub_block_index, *pick_random_logical_type(device_ctx.grid[grid_x][grid_y].type)->pb_graph_head);
98+
return get_pb_bbox(grid_x, grid_y, sub_block_index, *pick_best_logical_type(device_ctx.grid[grid_x][grid_y].type)->pb_graph_head);
9999
}
100100

101101
#endif // NO_GRAPHICS

vpr/src/draw/intra_logic_block.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ void draw_internal_init_blk() {
9696
continue;
9797
}
9898

99-
auto logical_block = pick_random_logical_type(&type);
99+
auto logical_block = pick_best_logical_type(&type);
100100
pb_graph_head_node = logical_block->pb_graph_head;
101101
int type_descriptor_index = type.index;
102102

vpr/src/pack/output_clustering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ static void print_stats() {
6464

6565
for (auto blk_id : cluster_ctx.clb_nlist.blocks()) {
6666
auto logical_block = cluster_ctx.clb_nlist.block_type(blk_id);
67-
auto physical_tile = pick_random_physical_type(logical_block);
67+
auto physical_tile = pick_best_physical_type(logical_block);
6868
for (ipin = 0; ipin < logical_block->pb_type->num_pins; ipin++) {
6969
int physical_pin = get_physical_pin(physical_tile, logical_block, ipin);
7070
auto pin_class = physical_tile->pin_class[physical_pin];

vpr/src/place/initial_placement.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ static void initial_placement_blocks(int* free_locations, enum e_pad_loc_type pa
286286
auto logical_block = cluster_ctx.clb_nlist.block_type(blk_id);
287287

288288
/* Don't do IOs if the user specifies IOs; we'll read those locations later. */
289-
if (!(is_io_type(pick_random_physical_type(logical_block)) && pad_loc_type == USER)) {
289+
if (!(is_io_type(pick_best_physical_type(logical_block)) && pad_loc_type == USER)) {
290290
/* Randomly select a free location of the appropriate type for blk_id.
291291
* We have a linearized list of all the free locations that can
292292
* accommodate a block of that type in free_locations[itype].
@@ -317,7 +317,7 @@ static void initial_placement_blocks(int* free_locations, enum e_pad_loc_type pa
317317
place_ctx.block_locs[blk_id].loc = to;
318318

319319
//Mark IOs as fixed if specifying a (fixed) random placement
320-
if (is_io_type(pick_random_physical_type(logical_block)) && pad_loc_type == RANDOM) {
320+
if (is_io_type(pick_best_physical_type(logical_block)) && pad_loc_type == RANDOM) {
321321
place_ctx.block_locs[blk_id].is_fixed = true;
322322
}
323323

vpr/src/place/place_macro.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ static void find_all_the_macro(int* num_of_macro, std::vector<ClusterBlockId>& p
7878
num_macro = 0;
7979
for (auto blk_id : cluster_ctx.clb_nlist.blocks()) {
8080
auto logical_block = cluster_ctx.clb_nlist.block_type(blk_id);
81-
auto physical_tile = pick_random_physical_type(logical_block);
81+
auto physical_tile = pick_best_physical_type(logical_block);
8282

8383
num_blk_pins = cluster_ctx.clb_nlist.block_type(blk_id)->pb_type->num_pins;
8484
for (to_iblk_pin = 0; to_iblk_pin < num_blk_pins; to_iblk_pin++) {

vpr/src/place/uniform_move_generator.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ e_create_move UniformMoveGenerator::propose_move(t_pl_blocks_to_be_moved& blocks
1818

1919
t_pl_loc to;
2020

21-
auto type = pick_random_physical_type(cluster_from_type);
21+
auto type = pick_best_physical_type(cluster_from_type);
2222

2323
if (!find_to_loc_uniform(type, rlim, from, to)) {
2424
return e_create_move::ABORT;

vpr/src/power/power.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ static void power_usage_blocks(t_power_usage* power_usage) {
624624
pb = cluster_ctx.clb_nlist.block_pb(iblk);
625625
logical_block = cluster_ctx.clb_nlist.block_type(iblk);
626626
} else {
627-
logical_block = pick_random_logical_type(physical_tile);
627+
logical_block = pick_best_logical_type(physical_tile);
628628
}
629629

630630
/* Calculate power of this CLB */

vpr/src/util/vpr_utils.cpp

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ std::vector<AtomPinId> find_clb_pin_connected_atom_pins(ClusterBlockId clb, int
317317
auto& clb_nlist = g_vpr_ctx.clustering().clb_nlist;
318318

319319
auto logical_block = clb_nlist.block_type(clb);
320-
auto physical_tile = pick_random_physical_type(logical_block);
320+
auto physical_tile = pick_best_physical_type(logical_block);
321321

322322
int physical_pin = get_physical_pin(physical_tile, logical_block, logical_pin);
323323

@@ -2151,30 +2151,15 @@ bool is_tile_compatible(t_physical_tile_type_ptr physical_tile, t_logical_block_
21512151
return std::find(equivalent_tiles.begin(), equivalent_tiles.end(), physical_tile) != equivalent_tiles.end();
21522152
}
21532153

2154-
t_physical_tile_type_ptr pick_random_physical_type(t_logical_block_type_ptr logical_block) {
2155-
auto equivalent_tiles = logical_block->equivalent_tiles;
2156-
2157-
size_t num_equivalent_tiles = equivalent_tiles.size();
2158-
int index = 0;
2159-
2160-
if (num_equivalent_tiles > 1) {
2161-
index = vtr::irand((int)equivalent_tiles.size() - 1);
2162-
}
2163-
2164-
return equivalent_tiles[index];
2154+
/**
2155+
* This function returns the most common physical tile type given a logical block
2156+
*/
2157+
t_physical_tile_type_ptr pick_best_physical_type(t_logical_block_type_ptr logical_block) {
2158+
return logical_block->equivalent_tiles[0];
21652159
}
21662160

2167-
t_logical_block_type_ptr pick_random_logical_type(t_physical_tile_type_ptr physical_tile) {
2168-
auto equivalent_sites = physical_tile->equivalent_sites;
2169-
2170-
size_t num_equivalent_sites = equivalent_sites.size();
2171-
int index = 0;
2172-
2173-
if (num_equivalent_sites > 1) {
2174-
index = vtr::irand((int)equivalent_sites.size() - 1);
2175-
}
2176-
2177-
return equivalent_sites[index];
2161+
t_logical_block_type_ptr pick_best_logical_type(t_physical_tile_type_ptr physical_tile) {
2162+
return physical_tile->equivalent_sites[0];
21782163
}
21792164

21802165
int get_logical_pin(t_physical_tile_type_ptr physical_tile,

vpr/src/util/vpr_utils.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,8 @@ void place_sync_external_block_connections(ClusterBlockId iblk);
170170
int get_max_num_pins(t_logical_block_type_ptr logical_block);
171171

172172
bool is_tile_compatible(t_physical_tile_type_ptr physical_tile, t_logical_block_type_ptr logical_block);
173-
t_physical_tile_type_ptr pick_random_physical_type(t_logical_block_type_ptr logical_block);
174-
t_logical_block_type_ptr pick_random_logical_type(t_physical_tile_type_ptr physical_tile);
173+
t_physical_tile_type_ptr pick_best_physical_type(t_logical_block_type_ptr logical_block);
174+
t_logical_block_type_ptr pick_best_logical_type(t_physical_tile_type_ptr physical_tile);
175175

176176
int get_logical_pin(t_physical_tile_type_ptr physical_tile,
177177
t_logical_block_type_ptr logical_block,

0 commit comments

Comments
 (0)