Merge pull request #304 from lnis-uofu/tileable_rr_graph

Tileable rr graph
This commit is contained in:
tangxifan 2021-04-26 14:11:16 -06:00 committed by GitHub
commit 64704f52eb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 25 deletions

View File

@ -210,7 +210,8 @@
<pinlocations pattern="custom"> <pinlocations pattern="custom">
<loc side="left"></loc> <loc side="left"></loc>
<loc side="top"></loc> <loc side="top"></loc>
<loc side="right">mult_8.a[0:5] mult_8.b[0:5] mult_8.out[0:10]</loc> <loc side="right" yoffset="0">mult_8.a[0:2] mult_8.b[0:2] mult_8.out[0:5]</loc>
<loc side="right" yoffset="1">mult_8.a[3:5] mult_8.b[3:5] mult_8.out[6:10]</loc>
<loc side="bottom">mult_8.a[6:7] mult_8.b[6:7] mult_8.out[11:15]</loc> <loc side="bottom">mult_8.a[6:7] mult_8.b[6:7] mult_8.out[11:15]</loc>
</pinlocations> </pinlocations>
</tile> </tile>

View File

@ -219,10 +219,10 @@
<pinlocations pattern="custom"> <pinlocations pattern="custom">
<loc side="left" yoffset="0">mult_16.a[0:2] mult_16.b[0:2] mult_16.out[0:5]</loc> <loc side="left" yoffset="0">mult_16.a[0:2] mult_16.b[0:2] mult_16.out[0:5]</loc>
<loc side="left" yoffset="1">mult_16.a[3:5] mult_16.b[3:5] mult_16.out[6:10]</loc> <loc side="left" yoffset="1">mult_16.a[3:5] mult_16.b[3:5] mult_16.out[6:10]</loc>
<loc side="top"></loc> <loc side="top" yoffset="1">mult_16.a[6:7] mult_16.b[6:7] mult_16.out[11:15]</loc>
<loc side="right" yoffset="0">mult_16.a[8:10] mult_16.b[8:10] mult_16.out[16:21]</loc> <loc side="right" yoffset="0">mult_16.a[8:10] mult_16.b[8:10] mult_16.out[16:21]</loc>
<loc side="right" yoffset="1">mult_16.a[11:13] mult_16.b[11:13] mult_16.out[22:26]</loc> <loc side="right" yoffset="1">mult_16.a[11:13] mult_16.b[11:13] mult_16.out[22:26]</loc>
<loc side="bottom">mult_16.a[6:7] mult_16.b[6:7] mult_16.out[11:15] mult_16.a[14:15] mult_16.b[14:15] mult_16.out[27:31]</loc> <loc side="bottom">mult_16.a[14:15] mult_16.b[14:15] mult_16.out[27:31]</loc>
</pinlocations> </pinlocations>
</tile> </tile>
</tiles> </tiles>

View File

@ -821,9 +821,35 @@ RRGSB build_one_tileable_rr_gsb(const DeviceGrid& grids,
opin_grid_side[1] = NUM_SIDES; opin_grid_side[1] = NUM_SIDES;
} }
/* SideManager: TOP => 0, RIGHT => 1, BOTTOM => 2, LEFT => 3 */ /* Add IPIN nodes from adjacent grids: the 4 grids sitting on the 4 corners of the Switch Block
*
* - The concept of top/bottom side of connection block in GSB domain:
*
* | Grid[x][y+1] |
* | BOTTOM side |
* +-----------------------+
* |
* v
* +-----------------------+
* | TOP side |
* | X- Connection Block |
* | BOTTOM side |
* +-----------------------+
* ^
* |
* +-----------------------+
* | TOP side |
* | Grid[x][y] |
*
* - The concept of top/bottom side of connection block in GSB domain:
*
* ---------------+ +---------------------- ... ---------------------+ +----------------
* Grid[x][y+1] |->| Y- Connection Block Y- Connection Block |<-| Grid[x+1][y+1]
* RIGHT side | | LEFT side ... RIGHT side | | LEFT side
* --------------+ +---------------------- ... ---------------------+ +----------------
*
*/
for (size_t side = 0; side < rr_gsb.get_num_sides(); ++side) { for (size_t side = 0; side < rr_gsb.get_num_sides(); ++side) {
/* Local variables inside this for loop */
SideManager side_manager(side); SideManager side_manager(side);
size_t ix; size_t ix;
size_t iy; size_t iy;
@ -832,42 +858,34 @@ RRGSB build_one_tileable_rr_gsb(const DeviceGrid& grids,
enum e_side ipin_rr_node_grid_side; enum e_side ipin_rr_node_grid_side;
switch (side) { switch (side) {
case TOP: /* TOP = 0 */ case TOP:
/* For the bording, we should take special care */ /* Consider the routing channel that is connected to the left side of the switch block */
/* Check if left side chan width is 0 or not */
chan_side = LEFT; chan_side = LEFT;
/* Build the connection block: ipin and ipin_grid_side */ /* The input pins of the routing channel come from the bottom side of Grid[x][y+1] */
/* BOTTOM side INPUT Pins of Grid[x][y+1] */
ix = rr_gsb.get_sb_x(); ix = rr_gsb.get_sb_x();
iy = rr_gsb.get_sb_y() + 1; iy = rr_gsb.get_sb_y() + 1;
ipin_rr_node_grid_side = BOTTOM; ipin_rr_node_grid_side = BOTTOM;
break; break;
case RIGHT: /* RIGHT = 1 */ case RIGHT:
/* For the bording, we should take special care */ /* Consider the routing channel that is connected to the top side of the switch block */
/* Check if TOP side chan width is 0 or not */
chan_side = TOP; chan_side = TOP;
/* Build the connection block: ipin and ipin_grid_side */ /* The input pins of the routing channel come from the left side of Grid[x+1][y+1] */
/* LEFT side INPUT Pins of Grid[x+1][y+1] */
ix = rr_gsb.get_sb_x() + 1; ix = rr_gsb.get_sb_x() + 1;
iy = rr_gsb.get_sb_y() + 1; iy = rr_gsb.get_sb_y() + 1;
ipin_rr_node_grid_side = LEFT; ipin_rr_node_grid_side = LEFT;
break; break;
case BOTTOM: /* BOTTOM = 2*/ case BOTTOM:
/* For the bording, we should take special care */ /* Consider the routing channel that is connected to the left side of the switch block */
/* Check if left side chan width is 0 or not */
chan_side = LEFT; chan_side = LEFT;
/* Build the connection block: ipin and ipin_grid_side */ /* The input pins of the routing channel come from the top side of Grid[x][y] */
/* TOP side INPUT Pins of Grid[x][y] */
ix = rr_gsb.get_sb_x(); ix = rr_gsb.get_sb_x();
iy = rr_gsb.get_sb_y(); iy = rr_gsb.get_sb_y();
ipin_rr_node_grid_side = TOP; ipin_rr_node_grid_side = TOP;
break; break;
case LEFT: /* LEFT = 3 */ case LEFT:
/* For the bording, we should take special care */ /* Consider the routing channel that is connected to the top side of the switch block */
/* Check if left side chan width is 0 or not */
chan_side = TOP; chan_side = TOP;
/* Build the connection block: ipin and ipin_grid_side */ /* The input pins of the routing channel come from the right side of Grid[x][y+1] */
/* RIGHT side INPUT Pins of Grid[x][y+1] */
ix = rr_gsb.get_sb_x(); ix = rr_gsb.get_sb_x();
iy = rr_gsb.get_sb_y() + 1; iy = rr_gsb.get_sb_y() + 1;
ipin_rr_node_grid_side = RIGHT; ipin_rr_node_grid_side = RIGHT;