Skip to content

Commit 680610e

Browse files
acomodikmurray
authored andcommitted
sub_tiles: fix direct mappings of physical to logical pins
Signed-off-by: Alessandro Comodi <[email protected]>
1 parent 6157d9c commit 680610e

File tree

4 files changed

+37
-64
lines changed

4 files changed

+37
-64
lines changed

libs/libarchfpga/src/physical_types.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@ struct t_physical_tile_type {
619619

620620
/* Unordered map indexed by the logical block index.
621621
* tile_block_pin_directs_map[logical block index][logical block pin] -> physical tile pin */
622-
std::unordered_map<int, vtr::bimap<t_logical_pin, t_physical_pin>> tile_block_pin_directs_map;
622+
std::unordered_map<int, std::unordered_map<int, vtr::bimap<t_logical_pin, t_physical_pin>>> tile_block_pin_directs_map;
623623

624624
/* Returns the indices of pins that contain a clock for this physical logic block */
625625
std::vector<int> get_clock_pins_indices() const;
@@ -690,11 +690,9 @@ struct t_sub_tile {
690690
*/
691691
struct t_logical_pin {
692692
int pin = -1;
693-
int sub_tile_index = -1;
694693

695-
t_logical_pin(int index, int value) {
694+
t_logical_pin(int value) {
696695
pin = value;
697-
sub_tile_index = index;
698696
}
699697

700698
bool operator==(const t_logical_pin o) const {

libs/libarchfpga/src/read_xml_arch_file.cpp

Lines changed: 33 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ e_side string_to_side(std::string side_str);
274274
static void link_physical_logical_types(std::vector<t_physical_tile_type>& PhysicalTileTypes,
275275
std::vector<t_logical_block_type>& LogicalBlockTypes);
276276

277-
static void check_port_direct_mappings(t_physical_tile_type_ptr physical_tile, t_logical_block_type_ptr logical_block);
277+
static void check_port_direct_mappings(t_physical_tile_type_ptr physical_tile, t_sub_tile* sub_tile, t_logical_block_type_ptr logical_block);
278278

279279
static const t_physical_tile_port* get_port_by_name(t_sub_tile* sub_tile, const char* port_name);
280280
static const t_port* get_port_by_name(t_logical_block_type_ptr type, const char* port_name);
@@ -3145,7 +3145,7 @@ static void ProcessTileEquivalentSites(pugi::xml_node Parent,
31453145
if (0 == strcmp(LogicalBlockType->pb_type->name, Prop.c_str())) {
31463146
SubTile->equivalent_sites.push_back(LogicalBlockType);
31473147

3148-
check_port_direct_mappings(PhysicalTileType, LogicalBlockType);
3148+
check_port_direct_mappings(PhysicalTileType, SubTile, LogicalBlockType);
31493149
}
31503150

31513151
CurSite = CurSite.next_sibling(CurSite.name());
@@ -3168,12 +3168,12 @@ static void ProcessEquivalentSiteDirectConnection(pugi::xml_node Parent,
31683168

31693169
for (int npin = 0; npin < num_pins; npin++) {
31703170
t_physical_pin physical_pin(npin);
3171-
t_logical_pin logical_pin(SubTile->index, npin);
3171+
t_logical_pin logical_pin(npin);
31723172

31733173
directs_map.insert(logical_pin, physical_pin);
31743174
}
31753175

3176-
PhysicalTileType->tile_block_pin_directs_map[LogicalBlockType->index] = directs_map;
3176+
PhysicalTileType->tile_block_pin_directs_map[LogicalBlockType->index][SubTile->index] = directs_map;
31773177
}
31783178

31793179
static void ProcessEquivalentSiteCustomConnection(pugi::xml_node Parent,
@@ -3194,6 +3194,7 @@ static void ProcessEquivalentSiteCustomConnection(pugi::xml_node Parent,
31943194
vtr::bimap<t_logical_pin, t_physical_pin> directs_map;
31953195

31963196
CurDirect = Parent.first_child();
3197+
31973198
while (CurDirect) {
31983199
check_node(CurDirect, "direct", loc_data);
31993200

@@ -3220,7 +3221,7 @@ static void ProcessEquivalentSiteCustomConnection(pugi::xml_node Parent,
32203221
int num_pins = from_pins.second - from_pins.first;
32213222
for (int i = 0; i < num_pins; i++) {
32223223
t_physical_pin physical_pin(from_pins.first + i);
3223-
t_logical_pin logical_pin(SubTile->index, to_pins.first + i);
3224+
t_logical_pin logical_pin(to_pins.first + i);
32243225

32253226
auto result = directs_map.insert(logical_pin, physical_pin);
32263227
if (!result.second) {
@@ -3234,7 +3235,7 @@ static void ProcessEquivalentSiteCustomConnection(pugi::xml_node Parent,
32343235
CurDirect = CurDirect.next_sibling(CurDirect.name());
32353236
}
32363237

3237-
PhysicalTileType->tile_block_pin_directs_map[LogicalBlockType->index] = directs_map;
3238+
PhysicalTileType->tile_block_pin_directs_map[LogicalBlockType->index][SubTile->index] = directs_map;
32383239
}
32393240

32403241
static void ProcessPinLocations(pugi::xml_node Locations,
@@ -5060,23 +5061,26 @@ static void link_physical_logical_types(std::vector<t_physical_tile_type>& Physi
50605061
std::sort(equivalent_tiles.begin(), equivalent_tiles.end(), criteria);
50615062

50625063
for (int pin = 0; pin < logical_block.pb_type->num_pins; pin++) {
5063-
for (auto& tile : logical_block.equivalent_tiles) {
5064-
auto direct_map = tile->tile_block_pin_directs_map.at(logical_block.index);
5064+
for (auto& tile : equivalent_tiles) {
5065+
auto direct_maps = tile->tile_block_pin_directs_map.at(logical_block.index);
5066+
50655067
for (auto& sub_tile : tile->sub_tiles) {
50665068
auto equiv_sites = sub_tile.equivalent_sites;
50675069
if (std::find(equiv_sites.begin(), equiv_sites.end(), &logical_block) == equiv_sites.end()) {
50685070
continue;
50695071
}
50705072

5071-
auto result = direct_map.find(t_logical_pin(sub_tile.index, pin));
5073+
auto direct_map = direct_maps.at(sub_tile.index);
5074+
5075+
auto result = direct_map.find(t_logical_pin(pin));
50725076
if (result == direct_map.end()) {
50735077
archfpga_throw(__FILE__, __LINE__,
50745078
"Logical pin %d not present in pin mapping between Tile %s and Block %s.\n",
50755079
pin, tile->name, logical_block.name);
50765080
}
50775081

5078-
int sub_tile_index = result->second.pin;
5079-
int phy_index = sub_tile.sub_tile_to_tile_pin_indices[sub_tile_index];
5082+
int sub_tile_pin_index = result->second.pin;
5083+
int phy_index = sub_tile.sub_tile_to_tile_pin_indices[sub_tile_pin_index];
50805084

50815085
bool is_ignored = tile->is_ignored_pin[phy_index];
50825086
bool is_global = tile->is_pin_global[phy_index];
@@ -5102,44 +5106,38 @@ static void link_physical_logical_types(std::vector<t_physical_tile_type>& Physi
51025106
}
51035107
}
51045108

5105-
static void check_port_direct_mappings(t_physical_tile_type_ptr physical_tile, t_logical_block_type_ptr logical_block) {
5109+
static void check_port_direct_mappings(t_physical_tile_type_ptr physical_tile, t_sub_tile* sub_tile, t_logical_block_type_ptr logical_block) {
51065110
auto pb_type = logical_block->pb_type;
51075111

5108-
if (pb_type->num_pins > physical_tile->num_pins) {
5112+
if (pb_type->num_pins > (sub_tile->num_phy_pins / sub_tile->capacity.total())) {
51095113
archfpga_throw(__FILE__, __LINE__,
5110-
"Logical Block (%s) has more pins than the Physical Tile (%s).\n",
5111-
logical_block->name, physical_tile->name);
5114+
"Logical Block (%s) has more pins than the Sub Tile (%s).\n",
5115+
logical_block->name, sub_tile->name);
51125116
}
51135117

5114-
auto& pin_direct_mapping = physical_tile->tile_block_pin_directs_map.at(logical_block->index);
5118+
auto& pin_direct_maps = physical_tile->tile_block_pin_directs_map.at(logical_block->index);
5119+
auto pin_direct_map = pin_direct_maps.at(sub_tile->index);
51155120

5116-
if (pb_type->num_pins != (int)pin_direct_mapping.size()) {
5121+
if (pb_type->num_pins != (int)pin_direct_map.size()) {
51175122
archfpga_throw(__FILE__, __LINE__,
5118-
"Logical block (%s) and Physical tile (%s) have a different number of ports.\n",
5123+
"Logical block (%s) and Sub tile (%s) have a different number of ports.\n",
51195124
logical_block->name, physical_tile->name);
51205125
}
51215126

5122-
for (auto pin_map : pin_direct_mapping) {
5127+
for (auto pin_map : pin_direct_map) {
51235128
auto block_port = get_port_by_pin(logical_block, pin_map.first.pin);
51245129

5125-
for (auto& sub_tile : physical_tile->sub_tiles) {
5126-
auto equivalent_sites = sub_tile.equivalent_sites;
5127-
if (std::find(equivalent_sites.begin(), equivalent_sites.end(), logical_block) == equivalent_sites.end()) {
5128-
continue;
5129-
}
5130-
5131-
auto sub_tile_port = get_port_by_pin(&sub_tile, pin_map.second.pin);
5130+
auto sub_tile_port = get_port_by_pin(sub_tile, pin_map.second.pin);
51325131

5133-
VTR_ASSERT(block_port != nullptr);
5134-
VTR_ASSERT(sub_tile_port != nullptr);
5132+
VTR_ASSERT(block_port != nullptr);
5133+
VTR_ASSERT(sub_tile_port != nullptr);
51355134

5136-
if (sub_tile_port->type != block_port->type
5137-
|| sub_tile_port->num_pins != block_port->num_pins
5138-
|| sub_tile_port->equivalent != block_port->equivalent) {
5139-
archfpga_throw(__FILE__, __LINE__,
5140-
"Logical block (%s) and Physical tile (%s) do not have equivalent port specifications.\n",
5141-
logical_block->name, sub_tile.name);
5142-
}
5135+
if (sub_tile_port->type != block_port->type
5136+
|| sub_tile_port->num_pins != block_port->num_pins
5137+
|| sub_tile_port->equivalent != block_port->equivalent) {
5138+
archfpga_throw(__FILE__, __LINE__,
5139+
"Logical block (%s) and Physical tile (%s) do not have equivalent port specifications. Sub tile port %s, logical block port %s\n",
5140+
logical_block->name, sub_tile->name, sub_tile_port->name, block_port->name);
51435141
}
51445142
}
51455143
}

vpr/src/util/vpr_utils.cpp

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2248,32 +2248,13 @@ t_physical_tile_type_ptr get_physical_tile_type(const ClusterBlockId blk) {
22482248
}
22492249
}
22502250

2251-
int get_logical_pin(t_physical_tile_type_ptr physical_tile,
2252-
t_logical_block_type_ptr logical_block,
2253-
int pin) {
2254-
t_physical_pin physical_pin(pin);
2255-
2256-
auto direct_map = physical_tile->tile_block_pin_directs_map.at(logical_block->index);
2257-
auto result = direct_map.find(physical_pin);
2258-
2259-
if (result == direct_map.inverse_end()) {
2260-
VTR_LOG_WARN(
2261-
"Couldn't find the corresponding logical pin of the physical pin %d."
2262-
"Physical Tile: %s, Logical Block: %s.\n",
2263-
pin, physical_tile->name, logical_block->name);
2264-
return OPEN;
2265-
}
2266-
2267-
return result->second.pin;
2268-
}
2269-
22702251
int get_sub_tile_physical_pin(int sub_tile_index,
22712252
t_physical_tile_type_ptr physical_tile,
22722253
t_logical_block_type_ptr logical_block,
22732254
int pin) {
2274-
t_logical_pin logical_pin(sub_tile_index, pin);
2255+
t_logical_pin logical_pin(pin);
22752256

2276-
const auto& direct_map = physical_tile->tile_block_pin_directs_map.at(logical_block->index);
2257+
const auto& direct_map = physical_tile->tile_block_pin_directs_map.at(logical_block->index).at(sub_tile_index);
22772258
auto result = direct_map.find(logical_pin);
22782259

22792260
if (result == direct_map.end()) {

vpr/src/util/vpr_utils.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,10 +174,6 @@ t_logical_block_type_ptr pick_best_logical_type(t_physical_tile_type_ptr physica
174174
//the best expected physical tile the block should use (if no valid placement).
175175
t_physical_tile_type_ptr get_physical_tile_type(const ClusterBlockId blk);
176176

177-
int get_logical_pin(t_physical_tile_type_ptr physical_tile,
178-
t_logical_block_type_ptr logical_block,
179-
int pin);
180-
181177
//Returns the physical pin index (within 'physical_tile') corresponding to the
182178
//logical index ('pin' of the first instance of 'logical_block' within the physcial tile.
183179
//

0 commit comments

Comments
 (0)