Skip to content

Commit 8cb5a3b

Browse files
committed
vpr: remove equivalent sites from the physical tile type
Signed-off-by: Alessandro Comodi <[email protected]>
1 parent 2a46080 commit 8cb5a3b

File tree

9 files changed

+47
-21
lines changed

9 files changed

+47
-21
lines changed

libs/libarchfpga/src/arch_util.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,18 @@ t_logical_block_type SetupEmptyLogicalType() {
536536
return type;
537537
}
538538

539+
std::unordered_set<t_logical_block_type_ptr> get_equivalent_sites_set(t_physical_tile_type_ptr type) {
540+
std::unordered_set<t_logical_block_type_ptr> equivalent_sites;
541+
542+
for (auto& sub_tile : type->sub_tiles) {
543+
for (auto& logical_block : sub_tile.equivalent_sites) {
544+
equivalent_sites.insert(logical_block);
545+
}
546+
}
547+
548+
return equivalent_sites;
549+
}
550+
539551
void alloc_and_load_default_child_for_pb_type(t_pb_type* pb_type,
540552
char* new_name,
541553
t_pb_type* copy) {

libs/libarchfpga/src/arch_util.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define ARCH_UTIL_H
33

44
#include <regex>
5+
#include <unordered_set>
56
#include "physical_types.h"
67

78
class InstPort {
@@ -48,6 +49,8 @@ t_port* findPortByName(const char* name, t_pb_type* pb_type, int* high_index, in
4849
t_physical_tile_type SetupEmptyPhysicalType();
4950
t_logical_block_type SetupEmptyLogicalType();
5051

52+
std::unordered_set<t_logical_block_type_ptr> get_equivalent_sites_set(t_physical_tile_type_ptr type);
53+
5154
void alloc_and_load_default_child_for_pb_type(t_pb_type* pb_type,
5255
char* new_name,
5356
t_pb_type* copy);

libs/libarchfpga/src/echo_arch.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
#include <cstring>
22
#include <cstdlib>
33
#include <vector>
4+
#include <unordered_set>
45

56
#include "echo_arch.h"
67
#include "arch_types.h"
8+
#include "arch_util.h"
79
#include "vtr_list.h"
810
#include "vtr_util.h"
911
#include "vtr_memory.h"
@@ -103,7 +105,9 @@ void EchoArch(const char* EchoFile,
103105
int index = Type.index;
104106
fprintf(Echo, "\tindex: %d\n", index);
105107

106-
for (auto LogicalBlock : Type.equivalent_sites) {
108+
auto equivalent_sites = get_equivalent_sites_set(&Type);
109+
110+
for (auto LogicalBlock : equivalent_sites) {
107111
fprintf(Echo, "\nEquivalent Site: %s\n", LogicalBlock->name);
108112
}
109113
fprintf(Echo, "\n");

libs/libarchfpga/src/physical_types.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,7 @@ constexpr int DEFAULT_SWITCH = -2;
575575
struct t_physical_tile_type {
576576
char* name = nullptr;
577577
int num_pins = 0;
578+
int num_inst_pins = 0;
578579
int num_input_pins = 0;
579580
int num_output_pins = 0;
580581
int num_clock_pins = 0;
@@ -609,8 +610,6 @@ struct t_physical_tile_type {
609610

610611
std::vector<t_sub_tile> sub_tiles;
611612

612-
std::vector<t_logical_block_type_ptr> equivalent_sites;
613-
614613
/* Unordered map indexed by the logical block index.
615614
* tile_block_pin_directs_map[logical block index][logical block pin] -> physical tile pin */
616615
std::unordered_map<int, vtr::bimap<t_logical_pin, t_physical_pin>> tile_block_pin_directs_map;

libs/libarchfpga/src/read_xml_arch_file.cpp

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2903,14 +2903,16 @@ static void MarkIoTypes(std::vector<t_physical_tile_type>& PhysicalTileTypes) {
29032903
type.is_input_type = false;
29042904
type.is_output_type = false;
29052905

2906-
for (const auto& equivalent_site : type.equivalent_sites) {
2906+
auto equivalent_sites = get_equivalent_sites_set(&type);
2907+
2908+
for (const auto& equivalent_site : equivalent_sites) {
29072909
if (block_type_contains_blif_model(equivalent_site, MODEL_INPUT)) {
29082910
type.is_input_type = true;
29092911
break;
29102912
}
29112913
}
29122914

2913-
for (const auto& equivalent_site : type.equivalent_sites) {
2915+
for (const auto& equivalent_site : equivalent_sites) {
29142916
if (block_type_contains_blif_model(equivalent_site, MODEL_OUTPUT)) {
29152917
type.is_output_type = true;
29162918
break;
@@ -3110,7 +3112,6 @@ static void ProcessTileEquivalentSites(pugi::xml_node Parent,
31103112
}
31113113

31123114
if (0 == strcmp(LogicalBlockType->pb_type->name, Prop.c_str())) {
3113-
PhysicalTileType->equivalent_sites.push_back(LogicalBlockType);
31143115
SubTile->equivalent_sites.push_back(LogicalBlockType);
31153116

31163117
check_port_direct_mappings(PhysicalTileType, LogicalBlockType);
@@ -3460,6 +3461,7 @@ static void ProcessSubTiles(pugi::xml_node Node,
34603461
PhysicalTileType->num_output_pins += capacity * pin_counts.output;
34613462
PhysicalTileType->num_clock_pins += capacity * pin_counts.clock;
34623463
PhysicalTileType->num_pins += capacity * pin_counts.total();
3464+
PhysicalTileType->num_inst_pins += pin_counts.total();
34633465

34643466
/* Assign drivers and receivers count to Physical Tile Type */
34653467
PhysicalTileType->num_receivers += capacity * pin_counts.input;
@@ -4960,16 +4962,17 @@ static void link_physical_logical_types(std::vector<t_physical_tile_type>& Physi
49604962
for (auto& physical_tile : PhysicalTileTypes) {
49614963
if (physical_tile.index == EMPTY_TYPE_INDEX) continue;
49624964

4963-
auto& equivalent_sites = physical_tile.equivalent_sites;
4965+
auto eq_sites_set = get_equivalent_sites_set(&physical_tile);
4966+
auto equivalent_sites = std::vector<t_logical_block_type_ptr>(eq_sites_set.begin(), eq_sites_set.end());
49644967

49654968
auto criteria = [&physical_tile](const t_logical_block_type* lhs, const t_logical_block_type* rhs) {
4966-
int num_physical_pins = physical_tile.num_pins / physical_tile.capacity;
4969+
int num_pins = physical_tile.num_inst_pins;
49674970

49684971
int lhs_num_logical_pins = lhs->pb_type->num_pins;
49694972
int rhs_num_logical_pins = rhs->pb_type->num_pins;
49704973

4971-
int lhs_diff_num_pins = num_physical_pins - lhs_num_logical_pins;
4972-
int rhs_diff_num_pins = num_physical_pins - rhs_num_logical_pins;
4974+
int lhs_diff_num_pins = num_pins - lhs_num_logical_pins;
4975+
int rhs_diff_num_pins = num_pins - rhs_num_logical_pins;
49734976

49744977
return lhs_diff_num_pins < rhs_diff_num_pins;
49754978
};
@@ -4980,7 +4983,6 @@ static void link_physical_logical_types(std::vector<t_physical_tile_type>& Physi
49804983
for (auto site : equivalent_sites) {
49814984
if (0 == strcmp(logical_block.name, site->pb_type->name)) {
49824985
logical_block.equivalent_tiles.push_back(&physical_tile);
4983-
49844986
break;
49854987
}
49864988
}
@@ -5003,11 +5005,11 @@ static void link_physical_logical_types(std::vector<t_physical_tile_type>& Physi
50035005
auto criteria = [&logical_block](const t_physical_tile_type* lhs, const t_physical_tile_type* rhs) {
50045006
int num_logical_pins = logical_block.pb_type->num_pins;
50055007

5006-
int lhs_num_physical_pins = lhs->num_pins / lhs->capacity;
5007-
int rhs_num_physical_pins = rhs->num_pins / rhs->capacity;
5008+
int lhs_num_pins = lhs->num_inst_pins;
5009+
int rhs_num_pins = rhs->num_inst_pins;
50085010

5009-
int lhs_diff_num_pins = lhs_num_physical_pins - num_logical_pins;
5010-
int rhs_diff_num_pins = rhs_num_physical_pins - num_logical_pins;
5011+
int lhs_diff_num_pins = lhs_num_pins - num_logical_pins;
5012+
int rhs_diff_num_pins = rhs_num_pins - num_logical_pins;
50115013

50125014
return lhs_diff_num_pins < rhs_diff_num_pins;
50135015
};

vpr/src/place/compressed_grid.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "compressed_grid.h"
2+
#include "arch_util.h"
23
#include "globals.h"
34

45
std::vector<t_compressed_block_grid> create_compressed_block_grids() {
@@ -11,7 +12,9 @@ std::vector<t_compressed_block_grid> create_compressed_block_grids() {
1112
for (size_t y = 0; y < grid.height(); ++y) {
1213
const t_grid_tile& tile = grid[x][y];
1314
if (tile.width_offset == 0 && tile.height_offset == 0) {
14-
for (auto& block : tile.type->equivalent_sites) {
15+
auto equivalent_sites = get_equivalent_sites_set(tile.type);
16+
17+
for (auto& block : equivalent_sites) {
1518
//Only record at block root location
1619
block_locations[block->index].emplace_back(x, y);
1720
}

vpr/src/place/move_utils.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -632,8 +632,8 @@ bool find_to_loc_uniform(t_logical_block_type_ptr type,
632632

633633
auto to_type = grid[to.x][to.y].type;
634634

635-
//Each x/y location contains only a single type, so we can pick a random
636-
//z (capcity) location
635+
//Each x/y location possibly contains multiple sub tiles, so we need to pick
636+
//a z location within a compatible sub tile.
637637
to.z = vtr::irand(to_type->capacity - 1);
638638

639639
VTR_ASSERT_MSG(is_tile_compatible(to_type, type), "Type must be compatible");

vpr/src/route/clock_connection_builders.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "clock_connection_builders.h"
22

33
#include "globals.h"
4+
#include "arch_util.h"
45
#include "rr_graph2.h"
56

67
#include "vtr_assert.h"
@@ -264,7 +265,8 @@ void ClockToPinsConnection::create_switches(const ClockRRGraphBuilder& clock_gra
264265

265266
// Ignore grid locations that do not have blocks
266267
bool has_pb_type = false;
267-
for (auto logical_block : type->equivalent_sites) {
268+
auto equivalent_sites = get_equivalent_sites_set(type);
269+
for (auto logical_block : equivalent_sites) {
268270
if (logical_block->pb_type) {
269271
has_pb_type = true;
270272
break;

vpr/src/util/vpr_utils.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ static std::tuple<int, int, int> get_pin_index_for_inst(t_physical_tile_type_ptr
208208

209209
if (pin_index < total_pin_counts) {
210210
int pins_per_inst = sub_tile.num_phy_pins / sub_tile.capacity.total();
211-
int inst_num = (pin_index - pin_offset) / sub_tile.capacity.total();
211+
int inst_num = (pin_index - pin_offset) / pins_per_inst;
212212
int inst_index = (pin_index - pin_offset) % pins_per_inst;
213213

214214
return std::make_tuple(inst_index, inst_num, sub_tile.index);
@@ -2067,6 +2067,7 @@ void print_switch_usage() {
20672067
* }
20682068
*/
20692069

2070+
// TODO FIX THIS!
20702071
void place_sync_external_block_connections(ClusterBlockId iblk) {
20712072
auto& cluster_ctx = g_vpr_ctx.clustering();
20722073
auto& clb_nlist = cluster_ctx.clb_nlist;
@@ -2128,7 +2129,7 @@ t_physical_tile_type_ptr pick_best_physical_type(t_logical_block_type_ptr logica
21282129
}
21292130

21302131
t_logical_block_type_ptr pick_best_logical_type(t_physical_tile_type_ptr physical_tile) {
2131-
return physical_tile->equivalent_sites[0];
2132+
return physical_tile->sub_tiles[0].equivalent_sites[0];
21322133
}
21332134

21342135
t_physical_tile_type_ptr get_physical_tile_type(const ClusterBlockId blk) {

0 commit comments

Comments
 (0)