From 93c5a6859237fcfff13f62cf5ab2997d941e80fd Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 21 Jul 2023 23:21:53 -0700 Subject: [PATCH] [core] developing top-level nets for tiles --- openfpga/src/annotation/fabric_tile.cpp | 226 +++++++++++++++++- openfpga/src/annotation/fabric_tile.h | 29 ++- openfpga/src/base/openfpga_naming.cpp | 9 +- openfpga/src/base/openfpga_naming.h | 2 + .../build_top_module_child_tile_instance.cpp | 115 +++++---- 5 files changed, 329 insertions(+), 52 deletions(-) diff --git a/openfpga/src/annotation/fabric_tile.cpp b/openfpga/src/annotation/fabric_tile.cpp index 14880b8e0..cfe3985c4 100644 --- a/openfpga/src/annotation/fabric_tile.cpp +++ b/openfpga/src/annotation/fabric_tile.cpp @@ -78,6 +78,84 @@ FabricTileId FabricTile::find_tile(const vtr::Point& coord) const { return tile_coord2id_lookup_[coord.x()][coord.y()]; } +FabricTileId FabricTile::find_tile_by_pb_coordinate(const vtr::Point& coord) const { + if (coord.x() >= pb_coord2id_lookup_.size()) { + VTR_LOG_ERROR( + "Programmable block coordinate [%lu][%lu] exceeds the maximum range [%lu][%lu]!\n", + coord.x(), coord.y(), pb_coord2id_lookup_.size(), + pb_coord2id_lookup_[0].size()); + return FabricTileId::INVALID(); + } + if (coord.y() >= pb_coord2id_lookup_[coord.x()].size()) { + VTR_LOG_ERROR( + "Programmable block coordinate [%lu][%lu] exceeds the maximum range [%lu][%lu]!\n", + coord.x(), coord.y(), pb_coord2id_lookup_.size(), + pb_coord2id_lookup_[0].size()); + return FabricTileId::INVALID(); + } + return pb_coord2id_lookup_[coord.x()][coord.y()]; +} + +FabricTileId FabricTile::find_tile_by_cb_coordinate(const t_rr_type& cb_type, const vtr::Point& coord) const { + switch (cb_type) { + case CHANX: { + if (coord.x() >= cbx_coord2id_lookup_.size()) { + VTR_LOG_ERROR( + "X-direction connection block coordinate [%lu][%lu] exceeds the maximum range [%lu][%lu]!\n", + coord.x(), coord.y(), cbx_coord2id_lookup_.size(), + cbx_coord2id_lookup_[0].size()); + return FabricTileId::INVALID(); + } + if (coord.y() >= cbx_coord2id_lookup_[coord.x()].size()) { + VTR_LOG_ERROR( + "X-direction connection block coordinate [%lu][%lu] exceeds the maximum range [%lu][%lu]!\n", + coord.x(), coord.y(), cbx_coord2id_lookup_.size(), + cbx_coord2id_lookup_[0].size()); + return FabricTileId::INVALID(); + } + return cbx_coord2id_lookup_[coord.x()][coord.y()]; + } + case CHANY: { + if (coord.x() >= cby_coord2id_lookup_.size()) { + VTR_LOG_ERROR( + "Y-direction connection block coordinate [%lu][%lu] exceeds the maximum range [%lu][%lu]!\n", + coord.x(), coord.y(), cby_coord2id_lookup_.size(), + cby_coord2id_lookup_[0].size()); + return FabricTileId::INVALID(); + } + if (coord.y() >= cby_coord2id_lookup_[coord.x()].size()) { + VTR_LOG_ERROR( + "Y-direction connection block coordinate [%lu][%lu] exceeds the maximum range [%lu][%lu]!\n", + coord.x(), coord.y(), cby_coord2id_lookup_.size(), + cby_coord2id_lookup_[0].size()); + return FabricTileId::INVALID(); + } + return cby_coord2id_lookup_[coord.x()][coord.y()]; + } + default: + VTR_LOG("Invalid type of connection block!\n"); + exit(1); + } +} + +FabricTileId FabricTile::find_tile_by_sb_coordinate(const vtr::Point& coord) const { + if (coord.x() >= sb_coord2id_lookup_.size()) { + VTR_LOG_ERROR( + "Switch block coordinate [%lu][%lu] exceeds the maximum range [%lu][%lu]!\n", + coord.x(), coord.y(), sb_coord2id_lookup_.size(), + sb_coord2id_lookup_[0].size()); + return FabricTileId::INVALID(); + } + if (coord.y() >= sb_coord2id_lookup_[coord.x()].size()) { + VTR_LOG_ERROR( + "Switch block coordinate [%lu][%lu] exceeds the maximum range [%lu][%lu]!\n", + coord.x(), coord.y(), sb_coord2id_lookup_.size(), + sb_coord2id_lookup_[0].size()); + return FabricTileId::INVALID(); + } + return sb_coord2id_lookup_[coord.x()][coord.y()]; +} + bool FabricTile::pb_in_tile(const FabricTileId& tile_id, const vtr::Point& coord, const bool& use_gsb_coord) const { @@ -204,8 +282,16 @@ FabricTileId FabricTile::create_tile(const vtr::Point& coord) { void FabricTile::init(const vtr::Point& max_coord) { tile_coord2id_lookup_.resize(max_coord.x()); + pb_coord2id_lookup_.resize(max_coord.x()); + cbx_coord2id_lookup_.resize(max_coord.x()); + cby_coord2id_lookup_.resize(max_coord.x()); + sb_coord2id_lookup_.resize(max_coord.x()); for (size_t ix = 0; ix < max_coord.x(); ++ix) { tile_coord2id_lookup_[ix].resize(max_coord.y(), FabricTileId::INVALID()); + pb_coord2id_lookup_[ix].resize(max_coord.y(), FabricTileId::INVALID()); + cbx_coord2id_lookup_[ix].resize(max_coord.y(), FabricTileId::INVALID()); + cby_coord2id_lookup_[ix].resize(max_coord.y(), FabricTileId::INVALID()); + sb_coord2id_lookup_[ix].resize(max_coord.y(), FabricTileId::INVALID()); } tile_coord2unique_tile_ids_.resize(max_coord.x()); for (size_t ix = 0; ix < max_coord.x(); ++ix) { @@ -240,10 +326,130 @@ bool FabricTile::register_tile_in_lookup(const FabricTileId& tile_id, return true; } +bool FabricTile::register_pb_in_lookup(const FabricTileId& tile_id, + const vtr::Point& coord) { + if (coord.x() >= pb_coord2id_lookup_.size()) { + VTR_LOG_ERROR( + "Fast look-up has not been re-allocated properly! Given x='%lu' exceeds " + "the upper-bound '%lu'!\n", + coord.x(), pb_coord2id_lookup_.size()); + return false; + } + if (coord.y() >= pb_coord2id_lookup_[coord.x()].size()) { + VTR_LOG_ERROR( + "Fast look-up has not been re-allocated properly! Given y='%lu' exceeds " + "the upper-bound '%lu'!\n", + coord.y(), pb_coord2id_lookup_[coord.x()].size()); + return false; + } + /* Throw error if this coord is already registered! */ + if (pb_coord2id_lookup_[coord.x()][coord.y()]) { + VTR_LOG_ERROR("Programmable block at [%lu][%lu] has already been registered!\n"); + return false; + } + pb_coord2id_lookup_[coord.x()][coord.y()] = tile_id; + + return true; +} + +bool FabricTile::register_cbx_in_lookup(const FabricTileId& tile_id, + const vtr::Point& coord) { + if (coord.x() >= cbx_coord2id_lookup_.size()) { + VTR_LOG_ERROR( + "Fast look-up has not been re-allocated properly! Given x='%lu' exceeds " + "the upper-bound '%lu'!\n", + coord.x(), cbx_coord2id_lookup_.size()); + return false; + } + if (coord.y() >= cbx_coord2id_lookup_[coord.x()].size()) { + VTR_LOG_ERROR( + "Fast look-up has not been re-allocated properly! Given y='%lu' exceeds " + "the upper-bound '%lu'!\n", + coord.y(), cbx_coord2id_lookup_[coord.x()].size()); + return false; + } + /* Throw error if this coord is already registered! */ + if (cbx_coord2id_lookup_[coord.x()][coord.y()]) { + VTR_LOG_ERROR("X-direction connection block at [%lu][%lu] has already been registered!\n"); + return false; + } + cbx_coord2id_lookup_[coord.x()][coord.y()] = tile_id; + + return true; +} + +bool FabricTile::register_cby_in_lookup(const FabricTileId& tile_id, + const vtr::Point& coord) { + if (coord.x() >= cby_coord2id_lookup_.size()) { + VTR_LOG_ERROR( + "Fast look-up has not been re-allocated properly! Given x='%lu' exceeds " + "the upper-bound '%lu'!\n", + coord.x(), cby_coord2id_lookup_.size()); + return false; + } + if (coord.y() >= cby_coord2id_lookup_[coord.x()].size()) { + VTR_LOG_ERROR( + "Fast look-up has not been re-allocated properly! Given y='%lu' exceeds " + "the upper-bound '%lu'!\n", + coord.y(), cby_coord2id_lookup_[coord.x()].size()); + return false; + } + /* Throw error if this coord is already registered! */ + if (cby_coord2id_lookup_[coord.x()][coord.y()]) { + VTR_LOG_ERROR("Y-direction connection block at [%lu][%lu] has already been registered!\n"); + return false; + } + cby_coord2id_lookup_[coord.x()][coord.y()] = tile_id; + + return true; +} + +bool FabricTile::register_sb_in_lookup(const FabricTileId& tile_id, + const vtr::Point& coord) { + if (coord.x() >= sb_coord2id_lookup_.size()) { + VTR_LOG_ERROR( + "Fast look-up has not been re-allocated properly! Given x='%lu' exceeds " + "the upper-bound '%lu'!\n", + coord.x(), sb_coord2id_lookup_.size()); + return false; + } + if (coord.y() >= sb_coord2id_lookup_[coord.x()].size()) { + VTR_LOG_ERROR( + "Fast look-up has not been re-allocated properly! Given y='%lu' exceeds " + "the upper-bound '%lu'!\n", + coord.y(), sb_coord2id_lookup_[coord.x()].size()); + return false; + } + /* Throw error if this coord is already registered! */ + if (sb_coord2id_lookup_[coord.x()][coord.y()]) { + VTR_LOG_ERROR("Switch block at [%lu][%lu] has already been registered!\n"); + return false; + } + sb_coord2id_lookup_[coord.x()][coord.y()] = tile_id; + + return true; +} + void FabricTile::invalidate_tile_in_lookup(const vtr::Point& coord) { tile_coord2id_lookup_[coord.x()][coord.y()] = FabricTileId::INVALID(); } +void FabricTile::invalidate_pb_in_lookup(const vtr::Point& coord) { + pb_coord2id_lookup_[coord.x()][coord.y()] = FabricTileId::INVALID(); +} + +void FabricTile::invalidate_cbx_in_lookup(const vtr::Point& coord) { + cbx_coord2id_lookup_[coord.x()][coord.y()] = FabricTileId::INVALID(); +} + +void FabricTile::invalidate_cby_in_lookup(const vtr::Point& coord) { + cby_coord2id_lookup_[coord.x()][coord.y()] = FabricTileId::INVALID(); +} + +void FabricTile::invalidate_sb_in_lookup(const vtr::Point& coord) { + sb_coord2id_lookup_[coord.x()][coord.y()] = FabricTileId::INVALID(); +} + bool FabricTile::set_tile_coordinate(const FabricTileId& tile_id, const vtr::Point& coord) { VTR_ASSERT(valid_tile_id(tile_id)); @@ -255,35 +461,41 @@ bool FabricTile::set_tile_coordinate(const FabricTileId& tile_id, return register_tile_in_lookup(tile_id, coord); } -void FabricTile::add_pb_coordinate(const FabricTileId& tile_id, +int FabricTile::add_pb_coordinate(const FabricTileId& tile_id, const vtr::Point& coord, const vtr::Point& gsb_coord) { VTR_ASSERT(valid_tile_id(tile_id)); pb_coords_[tile_id].push_back(coord); pb_gsb_coords_[tile_id].push_back(gsb_coord); + /* Register in fast look-up */ + return register_pb_in_lookup(tile_id, coord); } -void FabricTile::add_cb_coordinate(const FabricTileId& tile_id, +int FabricTile::add_cb_coordinate(const FabricTileId& tile_id, const t_rr_type& cb_type, const vtr::Point& coord) { VTR_ASSERT(valid_tile_id(tile_id)); switch (cb_type) { case CHANX: cbx_coords_[tile_id].push_back(coord); - break; + /* Register in fast look-up */ + return register_cbx_in_lookup(tile_id, coord); case CHANY: cby_coords_[tile_id].push_back(coord); - break; + /* Register in fast look-up */ + return register_cby_in_lookup(tile_id, coord); default: VTR_LOG("Invalid type of connection block!\n"); exit(1); } } -void FabricTile::add_sb_coordinate(const FabricTileId& tile_id, +int FabricTile::add_sb_coordinate(const FabricTileId& tile_id, const vtr::Point& coord) { VTR_ASSERT(valid_tile_id(tile_id)); sb_coords_[tile_id].push_back(coord); + /* Register in fast look-up */ + return register_sb_in_lookup(tile_id, coord); } void FabricTile::clear() { @@ -295,6 +507,10 @@ void FabricTile::clear() { cby_coords_.clear(); sb_coords_.clear(); tile_coord2id_lookup_.clear(); + pb_coord2id_lookup_.clear(); + cbx_coord2id_lookup_.clear(); + cby_coord2id_lookup_.clear(); + sb_coord2id_lookup_.clear(); tile_coord2unique_tile_ids_.clear(); unique_tile_ids_.clear(); } diff --git a/openfpga/src/annotation/fabric_tile.h b/openfpga/src/annotation/fabric_tile.h index 903ec42f2..dee4a783a 100644 --- a/openfpga/src/annotation/fabric_tile.h +++ b/openfpga/src/annotation/fabric_tile.h @@ -36,6 +36,12 @@ class FabricTile { FabricTileId unique_tile(const vtr::Point& coord) const; /** @brief Find the tile info with a given coordinate */ FabricTileId find_tile(const vtr::Point& coord) const; + /** @brief Find the id of a tile, with a given coordinate of the programmable block under the tile */ + FabricTileId find_tile_by_pb_coordinate(const vtr::Point& coord) const; + /** @brief Find the id of a tile, with a given coordinate of the connection block under the tile */ + FabricTileId find_tile_by_cb_coordinate(const t_rr_type& cb_type, const vtr::Point& coord) const; + /** @brief Find the id of a tile, with a given coordinate of the switch block under the tile */ + FabricTileId find_tile_by_sb_coordinate(const vtr::Point& coord) const; /** @brief Find the coordinate of the unique tile w.r.t the tile with a tile * id */ vtr::Point unique_tile_coordinate(const FabricTileId& tile_id) const; @@ -75,12 +81,12 @@ class FabricTile { FabricTileId create_tile(const vtr::Point& coord); bool set_tile_coordinate(const FabricTileId& tile_id, const vtr::Point& coord); - void add_pb_coordinate(const FabricTileId& tile_id, + int add_pb_coordinate(const FabricTileId& tile_id, const vtr::Point& coord, const vtr::Point& gsb_coord); - void add_cb_coordinate(const FabricTileId& tile_id, const t_rr_type& cb_type, + int add_cb_coordinate(const FabricTileId& tile_id, const t_rr_type& cb_type, const vtr::Point& coord); - void add_sb_coordinate(const FabricTileId& tile_id, + int add_sb_coordinate(const FabricTileId& tile_id, const vtr::Point& coord); /** @brief Build a list of unique tiles by comparing the coordinates in * DeviceRRGSB */ @@ -105,8 +111,20 @@ class FabricTile { private: /* Internal builders */ void invalidate_tile_in_lookup(const vtr::Point& coord); + void invalidate_pb_in_lookup(const vtr::Point& coord); + void invalidate_cbx_in_lookup(const vtr::Point& coord); + void invalidate_cby_in_lookup(const vtr::Point& coord); + void invalidate_sb_in_lookup(const vtr::Point& coord); bool register_tile_in_lookup(const FabricTileId& tile_id, const vtr::Point& coord); + bool register_pb_in_lookup(const FabricTileId& tile_id, + const vtr::Point& coord); + bool register_cbx_in_lookup(const FabricTileId& tile_id, + const vtr::Point& coord); + bool register_cby_in_lookup(const FabricTileId& tile_id, + const vtr::Point& coord); + bool register_sb_in_lookup(const FabricTileId& tile_id, + const vtr::Point& coord); private: /* Internal Data */ vtr::vector ids_; @@ -124,6 +142,11 @@ class FabricTile { vtr::vector>> cbx_coords_; vtr::vector>> cby_coords_; vtr::vector>> sb_coords_; + /* A few fast lookup to spot tile by coordinate of programmable blocks, connection blocks and switch blocks */ + std::vector> pb_coord2id_lookup_; + std::vector> cbx_coord2id_lookup_; + std::vector> cby_coord2id_lookup_; + std::vector> sb_coord2id_lookup_; /* A fast lookup to spot tile by coordinate */ std::vector> tile_coord2id_lookup_; std::vector> diff --git a/openfpga/src/base/openfpga_naming.cpp b/openfpga/src/base/openfpga_naming.cpp index e14a608e7..2551585d2 100644 --- a/openfpga/src/base/openfpga_naming.cpp +++ b/openfpga/src/base/openfpga_naming.cpp @@ -498,13 +498,20 @@ std::string generate_switch_block_module_name( } /********************************************************************* - * Generate the module name for a switch block with a given index + * Generate the module name for a tile module with a given coordinate *********************************************************************/ std::string generate_tile_module_name(const vtr::Point& tile_coord) { return std::string("tile_" + std::to_string(tile_coord.x()) + "__" + std::to_string(tile_coord.y()) + "_"); } +/********************************************************************* + * Generate the port name for a tile. Note that use the index to make the tile port name unique! + *********************************************************************/ +std::string generate_tile_module_port_name(const std::string& prefix, const std::string& port_name) { + return prefix + port_name; +} + /********************************************************************* * Generate the netlist name of a grid block **********************************************************************/ diff --git a/openfpga/src/base/openfpga_naming.h b/openfpga/src/base/openfpga_naming.h index f828de5cf..8efe39a68 100644 --- a/openfpga/src/base/openfpga_naming.h +++ b/openfpga/src/base/openfpga_naming.h @@ -112,6 +112,8 @@ std::string generate_connection_block_module_name( std::string generate_tile_module_name(const vtr::Point& tile_coord); +std::string generate_tile_module_port_name(const vtr::Point& tile_coord, const std::string& port_name); + std::string generate_tile_module_netlist_name(const std::string& block_name, const std::string& postfix); diff --git a/openfpga/src/fabric/build_top_module_child_tile_instance.cpp b/openfpga/src/fabric/build_top_module_child_tile_instance.cpp index ef5a42d18..ccd05a3d9 100644 --- a/openfpga/src/fabric/build_top_module_child_tile_instance.cpp +++ b/openfpga/src/fabric/build_top_module_child_tile_instance.cpp @@ -278,17 +278,22 @@ static void add_top_module_tile_io_children( *******************************************************************/ static int build_top_module_tile_nets_between_sb_and_pb( ModuleManager& module_manager, const ModuleId& top_module, - const ModuleId& tile_module, const size_t& tile_instance_id, + const ModuleId& curr_tile_module, + const vtr::Matrix& tile_instance_ids, + const size_t& curr_tile_instance_id, const DeviceGrid& grids, const VprDeviceAnnotation& vpr_device_annotation, const DeviceRRGSB& device_rr_gsb, const RRGraphView& rr_graph, const RRGSB& rr_gsb, const FabricTile& fabric_tile, const FabricTileId& fabric_tile_id, - const bool& frame_view, const bool& verbose) { + const bool& compact_routing_hierarchy, + const bool& verbose) { /* Skip those Switch blocks that do not exist */ if (false == rr_gsb.is_sb_exist()) { return CMD_EXEC_SUCCESS; } + vtr::Point sink_tile_coord = fabric_tile.tile_coordinate(curr_fabric_tile_id); + /* We could have two different coordinators, one is the instance, the other is * the module */ vtr::Point instance_sb_coordinate(rr_gsb.get_sb_x(), @@ -312,9 +317,6 @@ static int build_top_module_tile_nets_between_sb_and_pb( /* Collect sink-related information */ std::string sink_sb_module_name = generate_switch_block_module_name(module_sb_coordinate); - ModuleId sink_sb_module = module_manager.find_module(sink_sb_module_name); - VTR_ASSERT(true == module_manager.valid_module_id(sink_sb_module)); - size_t sink_sb_instance = sb_instance; /* Connect grid output pins (OPIN) to switch block grid pins */ for (size_t side = 0; side < module_sb.get_num_sides(); ++side) { @@ -323,19 +325,28 @@ static int build_top_module_tile_nets_between_sb_and_pb( inode < module_sb.get_num_opin_nodes(side_manager.get_side()); ++inode) { /* Collect source-related information */ - /* Generate the grid module name by considering if it locates on the - * border */ vtr::Point grid_coordinate( rr_graph.node_xlow( rr_gsb.get_opin_node(side_manager.get_side(), inode)), rr_graph.node_ylow( rr_gsb.get_opin_node(side_manager.get_side(), inode))); - std::string src_grid_module_name = - generate_grid_block_module_name_in_top_module( - std::string(GRID_MODULE_NAME_PREFIX), grids, grid_coordinate); - ModuleId src_grid_module = - module_manager.find_module(src_grid_module_name); - VTR_ASSERT(true == module_manager.valid_module_id(src_grid_module)); + /* Check if the grid is inside the tile, if not, create ports */ + if (fabric_tile.pb_in_tile(fabric_tile_id, grid_coordinate)) { + continue; + } + + /* Find the source tile id, coordinate etc., which is required to find source tile module and port */ + FabricTileId src_fabric_tile_id = fabric_tile.find_tile_by_pb_coordinate(grid_coordinate); + size_t pb_idx_in_src_fabric_tile = fabric_tile.find_pb_index_in_tile(src_fabric_tile_id, grid_coordinate); + vtr::Point src_tile_coord = fabric_tile.tile_coordinate(src_fabric_tile_id); + vtr::Point src_unique_tile_coord = fabric_tile.unique_tile_coordinate(src_fabric_tile_id); + FabricTileId src_unique_tile = fabric_tile.unique_tile(src_tile_coord); + vtr::Point src_pb_coord_in_unique_tile = fabric_tile.pb_coordinates(src_unique_tile)[pb_idx_in_src_fabric_tile]; + std::string src_tile_module_name = + generate_tile_module_name(src_unique_tile_coord); + ModuleId src_tile_module = + module_manager.find_module(src_tile_module_name); + VTR_ASSERT(true == module_manager.valid_module_id(src_tile_module)); size_t src_grid_pin_index = rr_graph.node_pin_num( rr_gsb.get_opin_node(side_manager.get_side(), inode)); @@ -358,12 +369,14 @@ static int build_top_module_tile_nets_between_sb_and_pb( get_rr_graph_single_node_side( rr_graph, rr_gsb.get_opin_node(side_manager.get_side(), inode)), src_grid_pin_info); - ModulePortId src_grid_port_id = - module_manager.find_module_port(src_grid_module, src_grid_port_name); - VTR_ASSERT(true == module_manager.valid_module_port_id(src_grid_module, - src_grid_port_id)); - BasicPort src_grid_port = - module_manager.module_port(src_grid_module, src_grid_port_id); + std::string src_grid_module_name = generate_grid_block_module_name_in_top_module(std::string(GRID_MODULE_NAME_PREFIX), grids, src_pb_coord_in_unique_tile); + std::string src_tile_grid_port_name = generate_tile_module_port_name(src_grid_module_name, src_grid_port_name); + ModulePortId src_tile_grid_port_id = + module_manager.find_module_port(src_tile_module, src_tile_grid_port_name); + VTR_ASSERT(true == module_manager.valid_module_port_id(src_tile_module, + src_tile_grid_port_id)); + BasicPort src_tile_grid_port = + module_manager.module_port(src_tile_module, src_tile_grid_port_id); /* Collect sink-related information */ vtr::Point sink_sb_port_coord( @@ -377,19 +390,37 @@ static int build_top_module_tile_nets_between_sb_and_pb( rr_graph, module_sb.get_opin_node(side_manager.get_side(), inode)), grids, vpr_device_annotation, rr_graph, module_sb.get_opin_node(side_manager.get_side(), inode)); - ModulePortId sink_sb_port_id = - module_manager.find_module_port(sink_sb_module, sink_sb_port_name); - VTR_ASSERT(true == module_manager.valid_module_port_id(sink_sb_module, - sink_sb_port_id)); - BasicPort sink_sb_port = - module_manager.module_port(sink_sb_module, sink_sb_port_id); + std::string sink_tile_sb_port_name = generate_tile_module_port_name(sink_sb_module_name, sink_sb_port_name); + ModulePortId sink_tile_sb_port_id = + module_manager.find_module_port(tile_module, sink_tile_sb_port_name); + VTR_ASSERT(true == module_manager.valid_module_port_id(tile_module, + sink_tile_sb_port_id)); + BasicPort sink_tile_sb_port = + module_manager.module_port(tile_module, sink_tile_sb_port_id); - /* Check if the grid is inside the tile, if not, create ports */ - if (fabric_tile.pb_in_tile(fabric_tile_id, grid_coordinate)) { - continue; - } - /* TODO: Create nets */ - if (!frame_view) { + /* Create nets */ + VTR_LOGV(verbose, + "Build inter-tile nets between switch block '%s' in tile[%lu][%lu] and " + "programmable block in tile[%lu][%lu]\n", + sink_sb_module_name.c_str(), + sink_tile_coord.x(), sink_tile_coord.y(), + src_tile_coord.x(), src_tile_coord.y()); + size_t src_tile_instance = + tile_instance_ids[src_tile_coord.x(), src_tile_coord.y()]; + + /* Source and sink port should match in size */ + VTR_ASSERT(src_tile_grid_port.get_width() == sink_tile_sb_port.get_width()); + + /* Create a net for each pin */ + for (size_t pin_id = 0; pin_id < src_tile_grid_port.pins().size(); + ++pin_id) { + ModuleNetId net = create_module_source_pin_net( + module_manager, top_module, src_tile_module, src_tile_instance, + src_tile_grid_port_id, src_tile_grid_port.pins()[pin_id]); + /* Configure the net sink */ + module_manager.add_module_net_sink( + top_module, net, curr_tile_module, curr_tile_instance_id, + sink_tile_sb_port_id, sink_tile_sb_port.pins()[pin_id]); } } } @@ -460,7 +491,7 @@ static int build_top_module_tile_nets_between_cb_and_pb( const DeviceRRGSB& device_rr_gsb, const RRGraphView& rr_graph, const RRGSB& rr_gsb, const FabricTile& fabric_tile, const FabricTileId& fabric_tile_id, const t_rr_type& cb_type, - const bool& frame_view, + const bool& compact_routing_hierarchy, const bool& verbose) { /* We could have two different coordinators, one is the instance, the other is * the module */ @@ -568,8 +599,6 @@ static int build_top_module_tile_nets_between_cb_and_pb( continue; } /* TODO: Create nets */ - if (!frame_view) { - } } } return CMD_EXEC_SUCCESS; @@ -622,7 +651,8 @@ static int build_top_module_tile_nets_between_sb_and_cb( const DeviceRRGSB& device_rr_gsb, const RRGraphView& rr_graph, const RRGSB& rr_gsb, const FabricTile& fabric_tile, const FabricTileId& fabric_tile_id, - const bool& frame_view, const bool& verbose) { + const bool& compact_routing_hierarchy, + const bool& verbose) { /* We could have two different coordinators, one is the instance, the other is * the module */ vtr::Point instance_sb_coordinate(rr_gsb.get_sb_x(), @@ -721,8 +751,6 @@ static int build_top_module_tile_nets_between_sb_and_cb( continue; } /* TODO: Create nets */ - if (!frame_view) { - } } return CMD_EXEC_SUCCESS; } @@ -735,7 +763,8 @@ static int build_top_module_tile_nets_between_pbs( const ModuleId& tile_module, const size_t& tile_instance_id, const DeviceGrid& grids, const VprDeviceAnnotation& vpr_device_annotation, const vtr::Point& pb_coord, const size_t& pb_instance, - const bool& frame_view, const bool& verbose) { + const bool& compact_routing_hierarchy, + const bool& verbose) { t_physical_tile_type_ptr phy_tile = grids.get_physical_type(pb_coord.x(), pb_coord.y()); /* Empty type does not require a module */ @@ -877,8 +906,8 @@ static int add_top_module_nets_around_one_tile( fabric_tile.sb_coordinates(fabric_tile_id)[isb]; const RRGSB& rr_gsb = device_rr_gsb.get_gsb(sb_coord); status_code = build_top_module_tile_nets_between_sb_and_pb( - module_manager, top_module, tile_module, tile_instance_id, grids, vpr_device_annotation, device_rr_gsb, - rr_graph_view, rr_gsb, fabric_tile, fabric_tile_id, verbose); + module_manager, top_module, tile_module, tile_instance_ids, tile_instance_id, grids, vpr_device_annotation, device_rr_gsb, + rr_graph_view, rr_gsb, fabric_tile, fabric_tile_id, true, verbose); if (status_code != CMD_EXEC_SUCCESS) { return CMD_EXEC_FATAL_ERROR; } @@ -895,7 +924,7 @@ static int add_top_module_nets_around_one_tile( status_code = build_top_module_tile_nets_between_cb_and_pb( module_manager, tile_module, grids, vpr_device_annotation, device_rr_gsb, rr_graph_view, rr_gsb, fabric_tile, fabric_tile_id, - cb_type, pb_instances, cb_instances.at(cb_type)[icb], true, frame_view, + cb_type, pb_instances, cb_instances.at(cb_type)[icb], true, verbose); if (status_code != CMD_EXEC_SUCCESS) { return CMD_EXEC_FATAL_ERROR; @@ -912,7 +941,7 @@ static int add_top_module_nets_around_one_tile( status_code = build_top_module_tile_nets_between_sb_and_cb( module_manager, tile_module, device_rr_gsb, rr_graph_view, rr_gsb, fabric_tile, fabric_tile_id, cb_instances, sb_instances[isb], true, - frame_view, verbose); + verbose); if (status_code != CMD_EXEC_SUCCESS) { return CMD_EXEC_FATAL_ERROR; } @@ -925,7 +954,7 @@ static int add_top_module_nets_around_one_tile( fabric_tile.pb_coordinates(fabric_tile_id)[ipb]; status_code = build_top_module_tile_nets_between_pbs( module_manager, tile_module, grids, vpr_device_annotation, pb_coord, - pb_instances[ipb], frame_view, verbose); + pb_instances[ipb], verbose); if (status_code != CMD_EXEC_SUCCESS) { return CMD_EXEC_FATAL_ERROR; }