@@ -1200,7 +1200,6 @@ RRGSB build_one_tileable_rr_gsb(const DeviceGrid& grids,
12001200 ***********************************************************************/
12011201void build_edges_for_one_tileable_rr_gsb (RRGraphBuilder& rr_graph_builder,
12021202 const RRGSB& rr_gsb,
1203- const t_bend_track2track_map& sb_bend_conn,
12041203 const t_track2pin_map& track2ipin_map,
12051204 const t_pin2track_map& opin2track_map,
12061205 const t_track2track_map& track2track_map,
@@ -1251,6 +1250,67 @@ void build_edges_for_one_tileable_rr_gsb(RRGraphBuilder& rr_graph_builder,
12511250 }
12521251 }
12531252 }
1253+ // /* Create edges between bend nodes */
1254+ // for (auto iter = sb_bend_conn.begin(); iter != sb_bend_conn.end(); ++iter) {
1255+ // rr_graph_builder.create_edge(iter->first, iter->second, rr_node_driver_switches[iter->second], false);
1256+ // edge_count++;
1257+ // }
1258+ num_edges_to_create += edge_count;
1259+ }
1260+
1261+ void build_edges_for_one_tileable_rr_gsb_vib (RRGraphBuilder& rr_graph_builder,
1262+ const RRGSB& rr_gsb,
1263+ const t_bend_track2track_map& sb_bend_conn,
1264+ const t_track2pin_map& track2ipin_map,
1265+ const t_pin2track_map& opin2track_map,
1266+ const t_track2track_map& track2track_map,
1267+ const vtr::vector<RRNodeId, RRSwitchId>& rr_node_driver_switches,
1268+ size_t & num_edges_to_create) {
1269+ size_t edge_count = 0 ;
1270+ /* Walk through each sides */
1271+ for (size_t side = 0 ; side < rr_gsb.get_num_sides (); ++side) {
1272+ SideManager side_manager (side);
1273+ enum e_side gsb_side = side_manager.get_side ();
1274+
1275+ /* Find OPINs */
1276+ for (size_t inode = 0 ; inode < rr_gsb.get_num_opin_nodes (gsb_side); ++inode) {
1277+ const RRNodeId& opin_node = rr_gsb.get_opin_node (gsb_side, inode);
1278+
1279+ for (size_t to_side = 0 ; to_side < opin2track_map[gsb_side][inode].size (); ++to_side) {
1280+ /* 1. create edges between OPINs and CHANX|CHANY, using opin2track_map */
1281+ /* add edges to the opin_node */
1282+ for (const RRNodeId& track_node : opin2track_map[gsb_side][inode][to_side]) {
1283+ rr_graph_builder.create_edge (opin_node, track_node, rr_node_driver_switches[track_node], false );
1284+ edge_count++;
1285+ }
1286+ }
1287+ }
1288+
1289+ /* Find CHANX or CHANY */
1290+ /* For TRACKs to IPINs, we only care LEFT and TOP sides
1291+ * Skip RIGHT and BOTTOM for the ipin2track_map since they should be handled in other GSBs
1292+ */
1293+ if ((side_manager.get_side () == rr_gsb.get_cb_chan_side (CHANX))
1294+ || (side_manager.get_side () == rr_gsb.get_cb_chan_side (CHANY))) {
1295+ /* 2. create edges between CHANX|CHANY and IPINs, using ipin2track_map */
1296+ for (size_t inode = 0 ; inode < rr_gsb.get_chan_width (gsb_side); ++inode) {
1297+ const RRNodeId& chan_node = rr_gsb.get_chan_node (gsb_side, inode);
1298+ for (const RRNodeId& ipin_node : track2ipin_map[gsb_side][inode]) {
1299+ rr_graph_builder.create_edge (chan_node, ipin_node, rr_node_driver_switches[ipin_node], false );
1300+ edge_count++;
1301+ }
1302+ }
1303+ }
1304+
1305+ /* 3. create edges between CHANX|CHANY and CHANX|CHANY, using track2track_map */
1306+ for (size_t inode = 0 ; inode < rr_gsb.get_chan_width (gsb_side); ++inode) {
1307+ const RRNodeId& chan_node = rr_gsb.get_chan_node (gsb_side, inode);
1308+ for (const RRNodeId& track_node : track2track_map[gsb_side][inode]) {
1309+ rr_graph_builder.create_edge (chan_node, track_node, rr_node_driver_switches[track_node], false );
1310+ edge_count++;
1311+ }
1312+ }
1313+ }
12541314 /* Create edges between bend nodes */
12551315 for (auto iter = sb_bend_conn.begin (); iter != sb_bend_conn.end (); ++iter) {
12561316 rr_graph_builder.create_edge (iter->first , iter->second , rr_node_driver_switches[iter->second ], false );
@@ -1753,8 +1813,7 @@ t_vib_map build_vib_map(const RRGraphView& rr_graph,
17531813 const std::vector<t_segment_inf>& segment_inf,
17541814 const size_t & layer,
17551815 const vtr::Point<size_t >& gsb_coordinate,
1756- const vtr::Point<size_t >& actual_coordinate,
1757- std::vector<std::vector<std::vector<std::map<std::string, size_t >>>> medium_mux_name2medium_index) {
1816+ const vtr::Point<size_t >& actual_coordinate) {
17581817 VTR_ASSERT (rr_gsb.get_x () == gsb_coordinate.x () && rr_gsb.get_y () == gsb_coordinate.y ());
17591818
17601819 t_vib_map vib_map;
@@ -1788,6 +1847,11 @@ t_vib_map build_vib_map(const RRGraphView& rr_graph,
17881847 " Can not find from node %s:%d!\n " , from.type_name , from.phy_pin_index );
17891848 continue ;
17901849 }
1850+ if (!rr_gsb.is_opin_node (from_node)) {
1851+ VTR_LOGF_ERROR (__FILE__, __LINE__,
1852+ " Opin node %d is not in the GSB (%d, %d)\n " , from_node, rr_gsb.get_x (), rr_gsb.get_y ());
1853+ exit (1 );
1854+ }
17911855 }
17921856 else if (from.from_type == SEGMENT) {
17931857 char from_dir = from.seg_dir ;
@@ -1827,15 +1891,24 @@ t_vib_map build_vib_map(const RRGraphView& rr_graph,
18271891 }
18281892 from_node = rr_gsb.get_chan_node (side, track_list[seg_id]);
18291893 VTR_ASSERT (IN_PORT == rr_gsb.get_chan_node_direction (side, track_list[seg_id]));
1830- VTR_ASSERT (rr_gsb.is_chan_node (from_node));
1894+ if (!rr_gsb.is_chan_node (from_node)) {
1895+ VTR_LOGF_ERROR (__FILE__, __LINE__,
1896+ " Wire node %d is not in the GSB (%d, %d)\n " , from_node, rr_gsb.get_x (), rr_gsb.get_y ());
1897+ exit (1 );
1898+ }
1899+
18311900 }
18321901
18331902
18341903 }
18351904 else if (from.from_type == MUX) {
1836- size_t from_mux_index = medium_mux_name2medium_index[layer][actual_coordinate. x ()][actual_coordinate. y ()][ from.type_name ] ;
1905+ size_t from_mux_index = vib-> medium_mux_index_by_name ( from.type_name ) ;
18371906 from_node = rr_graph.node_lookup ().find_node (layer, actual_coordinate.x (), actual_coordinate.y (), MEDIUM, from_mux_index);
1838- VTR_ASSERT (rr_gsb.is_medium_node (from_node));
1907+ if (!rr_gsb.is_medium_node (from_node)) {
1908+ VTR_LOGF_ERROR (__FILE__, __LINE__,
1909+ " Medium node %d is not in the GSB (%d, %d)\n " , from_node, rr_gsb.get_x (), rr_gsb.get_y ());
1910+ exit (1 );
1911+ }
18391912 }
18401913 else {
18411914 VTR_LOGF_ERROR (__FILE__, __LINE__,
@@ -1885,6 +1958,11 @@ t_vib_map build_vib_map(const RRGraphView& rr_graph,
18851958 " Can not find from node %s:%d!\n " , to.type_name , to.phy_pin_index );
18861959 continue ;
18871960 }
1961+ if (!rr_gsb.is_ipin_node (to_node)) {
1962+ VTR_LOGF_ERROR (__FILE__, __LINE__,
1963+ " Medium node %d is not in the GSB (%d, %d)\n " , to_node, rr_gsb.get_x (), rr_gsb.get_y ());
1964+ exit (1 );
1965+ }
18881966 }
18891967 else if (to.from_type == SEGMENT) {
18901968 char to_dir = to.seg_dir ;
@@ -1927,7 +2005,11 @@ t_vib_map build_vib_map(const RRGraphView& rr_graph,
19272005 VTR_ASSERT (track_status == TRACK_START);
19282006 to_node = rr_gsb.get_chan_node (side, track_list[seg_id]);
19292007 VTR_ASSERT (OUT_PORT == rr_gsb.get_chan_node_direction (side, track_list[seg_id]));
1930- VTR_ASSERT (rr_gsb.is_chan_node (to_node));
2008+ if (!rr_gsb.is_chan_node (to_node)) {
2009+ VTR_LOGF_ERROR (__FILE__, __LINE__,
2010+ " Medium node %d is not in the GSB (%d, %d)\n " , to_node, rr_gsb.get_x (), rr_gsb.get_y ());
2011+ exit (1 );
2012+ }
19312013 }
19322014
19332015
@@ -1964,6 +2046,11 @@ t_vib_map build_vib_map(const RRGraphView& rr_graph,
19642046 " Can not find from node %s:%d!\n " , from.type_name , from.phy_pin_index );
19652047 continue ;
19662048 }
2049+ if (!rr_gsb.is_opin_node (from_node)) {
2050+ VTR_LOGF_ERROR (__FILE__, __LINE__,
2051+ " Medium node %d is not in the GSB (%d, %d)\n " , from_node, rr_gsb.get_x (), rr_gsb.get_y ());
2052+ exit (1 );
2053+ }
19672054 }
19682055 else if (from.from_type == SEGMENT) {
19692056 char from_dir = from.seg_dir ;
@@ -2003,15 +2090,23 @@ t_vib_map build_vib_map(const RRGraphView& rr_graph,
20032090 }
20042091 from_node = rr_gsb.get_chan_node (side, track_list[seg_id]);
20052092 VTR_ASSERT (IN_PORT == rr_gsb.get_chan_node_direction (side, track_list[seg_id]));
2006- VTR_ASSERT (rr_gsb.is_chan_node (from_node));
2093+ if (!rr_gsb.is_chan_node (from_node)) {
2094+ VTR_LOGF_ERROR (__FILE__, __LINE__,
2095+ " Medium node %d is not in the GSB (%d, %d)\n " , from_node, rr_gsb.get_x (), rr_gsb.get_y ());
2096+ exit (1 );
2097+ }
20072098 }
20082099
20092100
20102101 }
20112102 else if (from.from_type == MUX) {
2012- size_t from_mux_index = medium_mux_name2medium_index[layer][actual_coordinate. x ()][actual_coordinate. y ()][ from.type_name ] ;
2103+ size_t from_mux_index = vib-> medium_mux_index_by_name ( from.type_name ) ;
20132104 from_node = rr_graph.node_lookup ().find_node (layer, actual_coordinate.x (), actual_coordinate.y (), MEDIUM, from_mux_index);
2014- VTR_ASSERT (rr_gsb.is_medium_node (from_node));
2105+ if (!rr_gsb.is_medium_node (from_node)) {
2106+ VTR_LOGF_ERROR (__FILE__, __LINE__,
2107+ " Medium node %d is not in the GSB (%d, %d)\n " , from_node, rr_gsb.get_x (), rr_gsb.get_y ());
2108+ exit (1 );
2109+ }
20152110 }
20162111 else {
20172112 VTR_LOGF_ERROR (__FILE__, __LINE__,
0 commit comments