Skip to content

Commit 7a0dfbc

Browse files
Update tileable_rr_graph_gsb.cpp
1 parent 729ae80 commit 7a0dfbc

File tree

1 file changed

+105
-10
lines changed

1 file changed

+105
-10
lines changed

vpr/src/tileable_rr_graph/tileable_rr_graph_gsb.cpp

Lines changed: 105 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,7 +1200,6 @@ RRGSB build_one_tileable_rr_gsb(const DeviceGrid& grids,
12001200
***********************************************************************/
12011201
void 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

Comments
 (0)