From b05a22cb1f69e5a0f6d01c8fd5ad14e9587b6d64 Mon Sep 17 00:00:00 2001 From: Ganesh Gore Date: Sat, 18 Jan 2025 19:17:57 -0700 Subject: [PATCH] Reviewed edge connections --- .../OpenFPGA_basic/06_generate_rrgraph.py | 41 +++++++++--------- .../baseline_l4/switchbox_main.xlsx | Bin 21693 -> 21631 bytes 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/examples/OpenFPGA_basic/06_generate_rrgraph.py b/examples/OpenFPGA_basic/06_generate_rrgraph.py index 7377c9b2..3c44c1e6 100644 --- a/examples/OpenFPGA_basic/06_generate_rrgraph.py +++ b/examples/OpenFPGA_basic/06_generate_rrgraph.py @@ -30,10 +30,14 @@ "SB_1__1_": None, "SB_1__6_": None, "SB_6__1_": None, + # "SB_1__*_": None, + # "SB_*__1_": None, + # "SB_*__6_": None, + # "SB_6__*_": None, "SB_1__*_": "./baseline_l4/switchbox_left.xlsx", - "SB_6__*_": "./baseline_l4/switchbox_right.xlsx", "SB_*__1_": "./baseline_l4/switchbox_bottom.xlsx", "SB_*__6_": "./baseline_l4/switchbox_top.xlsx", + "SB_6__*_": "./baseline_l4/switchbox_right.xlsx", "SB_*__*_": "./baseline_l4/switchbox_main.xlsx", } ) @@ -98,6 +102,8 @@ def main(): tap=tap, ) node_id += 1 + index_n = (index - 1) * 4 + # print(f"{side=} {seg_type=} {index_n=} {tap=} {node.loc.ptc=}") logger.info( "Creating Nodes %12s %s at locations %d %d [%d-%d nodes]", sb_patt[0], @@ -116,11 +122,6 @@ def main(): ) rrgraph_bin._print_node_metrics() - # print([f"{i.id:2d}" for i in rrgraph_bin.node_lookup[0][1].values()]) - # print([f"{i.id:2d}" for i in rrgraph_bin.node_lookup[0][2].values()]) - # print([f"{i.id:2d}" for i in rrgraph_bin.node_lookup[0][3].values()]) - # print([f"{i.id:2d}" for i in rrgraph_bin.node_lookup[0][4].values()]) - # exit(1) # Create edges # for X, Y in product(range(1, FPGA_GRID_X), range(1, FPGA_GRID_Y)): @@ -138,6 +139,7 @@ def main(): X - 1, Y - 1, ) + source_nodes = [] sink_nodes = [] df = sb_df[sb_patt[0]] @@ -176,27 +178,26 @@ def main(): if side in ("Left", "Right", "Top", "Bottom"): x_shift = { - "Left": X - tap - 1, + "Left": X - tap, "Right": X + tap, - "Bottom": X - 1, - "Top": X - 1, - }[side] + "Bottom": X, + "Top": X, + }[side] - 1 y_shift = { - "Left": Y - 1, - "Right": Y - 1, - "Bottom": Y - tap - 1, + "Left": Y, + "Right": Y, + "Bottom": Y - tap, "Top": Y + tap, - }[side] - trunc = 0 - x_shift = max(0, min(x_shift, rrgraph_bin.width - 3)) - y_shift = max(0, min(y_shift, rrgraph_bin.height - 3)) - trunc = x_shift - max(0, min(x_shift, rrgraph_bin.width - 3)) + }[side] - 1 + x_shift_src = max(0, min(x_shift, rrgraph_bin.width - 3)) + y_shift_src = max(0, min(y_shift, rrgraph_bin.height - 3)) + trunc = abs((x_shift - x_shift_src) + (y_shift - y_shift_src)) + 1 try: source_nodes.append( - rrgraph_bin.node_lookup[x_shift][y_shift][ + rrgraph_bin.node_lookup[x_shift_src][y_shift_src][ ( (seg_indx - 1) * 4, - 1 + abs(trunc), + trunc, { "Left": "Right", "Right": "Left", diff --git a/examples/OpenFPGA_basic/baseline_l4/switchbox_main.xlsx b/examples/OpenFPGA_basic/baseline_l4/switchbox_main.xlsx index 5c250c08a20a3b220f2d032404a51bea7879be01..8570fa09e1aa340ddb7fedb460429e18f54f43e7 100644 GIT binary patch delta 10518 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 delta 10680 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 DJ6|q;