Note
Click here to download the full example code
4.2. Dimension based floorplanningΒΆ
This example demonstate how to optimized different dimension of the homogeneus FPGA fabric to increse the utilzation of each module in the design.
import glob
import math
import logging
import spydrnet as sdn
from spydrnet_physical.util import OpenFPGA, initial_hetero_placement
from spydrnet_physical.util import FPGAGridGen, FloorPlanViz
logger = logging.getLogger("spydrnet_logs")
sdn.enable_file_logging(LOG_LEVEL="INFO")
STYLE_SHEET = """
.over_util {fill:#b22222 !important}
text{font-family: Lato; font-style: italic; font-size: 350px;}
"""
SCALE = 100
CPP = math.floor(0.46 * SCALE)
SC_HEIGHT = math.floor(2.72 * SCALE)
PROP = "VERILOG.InlineConstraints"
def main():
"""
Main method
"""
proj = "../homogeneous_fabric"
source_files = glob.glob(f"{proj}/*_Verilog/lb/*.v")
source_files += glob.glob(f"{proj}/*_Verilog/routing/*.v")
source_files += glob.glob(f"{proj}/*_Verilog/sub_module/*.v")
source_files += glob.glob(f"{proj}/*_Verilog/fpga_top.v")
# Create OpenFPGA object
fpga = OpenFPGA(grid=(4, 4), verilog_files=source_files)
# Convert wires to bus structure
fpga.merge_all_grid_ios()
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
# Floorplan visualization
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
fpga_grid = FPGAGridGen(
design_name="FPGA4x4",
layout="4x4",
arch_file=f"{proj}/FPGA44_Task/arch/k6_N10_tileable.xml",
release_root=None,
)
fpga.SC_HEIGHT = SC_HEIGHT
fpga.CPP = CPP
fpga.SC_GRID = CPP * SC_HEIGHT
fpga_grid.enumerate_grid()
fpga.load_grid(fpga_grid)
fpga.annotate_area_information(f"{proj}/area_info.txt", skipline=1)
fpga.register_placement_creator(initial_hetero_placement)
fpga.show_utilization_data()
# ====================================================================
# Dimension based floorplanning
# ====================================================================
m = {}
m["clb_w"], m["clb_h"] = 200, 30
m["cbx11_w"], m["cbx11_h"] = 116, 16
m["bottom_cbx_w"], m["bottom_cbx_h"] = 180, 10
m["top_cbx_w"], m["top_cbx_h"] = 180, 10
m["cby11_w"], m["cby11_h"] = 100, 20
m["left_cby_w"], m["left_cby_h"] = 60, 30
m["right_cby_w"], m["right_cby_h"] = 60, 30
# ====================================================================
fpga.placement_creator.update_shaping_param(m)
fpga.placement_creator.derive_sb_paramters()
fpga.placement_creator.create_shapes()
# # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
# # Adding Margin
# # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
shapes = fpga.placement_creator.module_shapes
for module in ["grid_clb"]:
shapes[module]["POINTS"][0] -= 16
shapes[module]["POINTS"][1] -= 2
shapes[module]["PLACEMENT"][0] += 8
shapes[module]["PLACEMENT"][1] += 1
for module in ["cbx_1__0_", "cbx_1__1_", "cbx_1__4_"]:
shapes[module]["POINTS"][0] -= 16
shapes[module]["PLACEMENT"][0] += 8
for module in ["cby_0__1_", "cby_1__1_", "cby_4__1_"]:
shapes[module]["POINTS"][1] -= 2
shapes[module]["PLACEMENT"][1] += 1
fpga.create_placement()
fpga.show_placement_data(filename="_homogeneous_placement.txt")
fpga.show_utilization_data()
fpga.design_top_stat()
fpga.save_shaping_data("*", scale=1/SCALE)
fpga.update_module_label(
get_label=lambda x: f"{int(x.data[PROP]['WIDTH'])/CPP:.1f}x{int(x.data[PROP]['HEIGHT'])/SC_HEIGHT:.1f} [{x.utilization:.2%}]")
# Highlight over utilized modules
additional_styles = fpga.get_overutils_styles()
# # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
# # Adjust Floorplan
# # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
fp = FloorPlanViz(fpga.top_module)
fp.compose(skip_connections=True, skip_pins=True)
fp.custom_style_sheet = STYLE_SHEET + additional_styles
dwg = fp.get_svg()
dwg.add(fpga.placement_creator.design_grid.render_grid(return_group=True))
pattern = dwg.pattern(size=(2 * CPP, 2 * SC_HEIGHT),
patternUnits="userSpaceOnUse")
pattern.add(dwg.circle(center=(4, 4), r=4, fill="black"))
pattern.add(dwg.circle(center=(4, SC_HEIGHT + 4), r=4, fill="red"))
dwg.defs.add(pattern)
dwg.defs.elements[0].elements[0].attribs["fill"] = pattern.get_funciri()
dwg.saveas("_fpga_auto_initial_placement_adjusted.svg",
pretty=True, indent=4)
if __name__ == "__main__":
main()
Placement information
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
INSTANCE MODULE LOC_X LOC_Y WIDTH HEIGHT SHAPE POINTS
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
grid_clb_1__1_ grid_clb 3128 3536 3864 4896 rect
grid_clb_1__2_ grid_clb 3128 10608 3864 4896 rect
grid_clb_1__3_ grid_clb 3128 17680 3864 4896 rect
grid_clb_1__4_ grid_clb 3128 24752 3864 4896 rect
grid_clb_2__1_ grid_clb 9108 3536 3864 4896 rect
grid_clb_2__2_ grid_clb 9108 10608 3864 4896 rect
grid_clb_2__3_ grid_clb 9108 17680 3864 4896 rect
grid_clb_2__4_ grid_clb 9108 24752 3864 4896 rect
grid_clb_3__1_ grid_clb 15088 3536 3864 4896 rect
grid_clb_3__2_ grid_clb 15088 10608 3864 4896 rect
grid_clb_3__3_ grid_clb 15088 17680 3864 4896 rect
grid_clb_3__4_ grid_clb 15088 24752 3864 4896 rect
grid_clb_4__1_ grid_clb 21068 3536 3864 4896 rect
grid_clb_4__2_ grid_clb 21068 10608 3864 4896 rect
grid_clb_4__3_ grid_clb 21068 17680 3864 4896 rect
grid_clb_4__4_ grid_clb 21068 24752 3864 4896 rect
sb_0__0_ sb_0__0_ 920 544 2530 3264 cross
sb_0__1_ sb_0__1_ 920 8160 2760 2720 cross
sb_0__2_ sb_0__1_ 920 15232 2760 2720 cross
sb_0__3_ sb_0__1_ 920 22304 2760 2720 cross
sb_0__4_ sb_0__4_ 920 29376 2530 3264 cross
sb_1__0_ sb_1__0_ 6670 544 2760 3808 cross
sb_2__0_ sb_1__0_ 12650 544 2760 3808 cross
sb_3__0_ sb_1__0_ 18630 544 2760 3808 cross
sb_1__1_ sb_1__1_ 6440 7616 3220 3808 cross
sb_1__2_ sb_1__1_ 6440 14688 3220 3808 cross
sb_1__3_ sb_1__1_ 6440 21760 3220 3808 cross
sb_2__1_ sb_1__1_ 12420 7616 3220 3808 cross
sb_2__2_ sb_1__1_ 12420 14688 3220 3808 cross
sb_2__3_ sb_1__1_ 12420 21760 3220 3808 cross
sb_3__1_ sb_1__1_ 18400 7616 3220 3808 cross
sb_3__2_ sb_1__1_ 18400 14688 3220 3808 cross
sb_3__3_ sb_1__1_ 18400 21760 3220 3808 cross
sb_1__4_ sb_1__4_ 6670 28832 2760 3808 cross
sb_2__4_ sb_1__4_ 12650 28832 2760 3808 cross
sb_3__4_ sb_1__4_ 18630 28832 2760 3808 cross
sb_4__0_ sb_4__0_ 24610 544 2530 3264 cross
sb_4__1_ sb_4__1_ 24380 8160 2760 2720 cross
sb_4__2_ sb_4__1_ 24380 15232 2760 2720 cross
sb_4__3_ sb_4__1_ 24380 22304 2760 2720 cross
sb_4__4_ sb_4__4_ 24610 29376 2530 3264 cross
cbx_1__1_ cbx_1__1_ 4048 8704 2024 1632 rect
cbx_1__2_ cbx_1__1_ 4048 15776 2024 1632 rect
cbx_1__3_ cbx_1__1_ 4048 22848 2024 1632 rect
cbx_2__1_ cbx_1__1_ 10028 8704 2024 1632 rect
cbx_2__2_ cbx_1__1_ 10028 15776 2024 1632 rect
cbx_2__3_ cbx_1__1_ 10028 22848 2024 1632 rect
cbx_3__1_ cbx_1__1_ 16008 8704 2024 1632 rect
cbx_3__2_ cbx_1__1_ 16008 15776 2024 1632 rect
cbx_3__3_ cbx_1__1_ 16008 22848 2024 1632 rect
cbx_4__1_ cbx_1__1_ 21988 8704 2024 1632 rect
cbx_4__2_ cbx_1__1_ 21988 15776 2024 1632 rect
cbx_4__3_ cbx_1__1_ 21988 22848 2024 1632 rect
cby_1__1_ cby_1__1_ 7360 4624 1380 2720 rect
cby_1__2_ cby_1__1_ 7360 11696 1380 2720 rect
cby_1__3_ cby_1__1_ 7360 18768 1380 2720 rect
cby_1__4_ cby_1__1_ 7360 25840 1380 2720 rect
cby_2__1_ cby_1__1_ 13340 4624 1380 2720 rect
cby_2__2_ cby_1__1_ 13340 11696 1380 2720 rect
cby_2__3_ cby_1__1_ 13340 18768 1380 2720 rect
cby_2__4_ cby_1__1_ 13340 25840 1380 2720 rect
cby_3__1_ cby_1__1_ 19320 4624 1380 2720 rect
cby_3__2_ cby_1__1_ 19320 11696 1380 2720 rect
cby_3__3_ cby_1__1_ 19320 18768 1380 2720 rect
cby_3__4_ cby_1__1_ 19320 25840 1380 2720 rect
cby_0__1_ cby_0__1_ 920 4080 1840 3808 rect
cby_0__2_ cby_0__1_ 920 11152 1840 3808 rect
cby_0__3_ cby_0__1_ 920 18224 1840 3808 rect
cby_0__4_ cby_0__1_ 920 25296 1840 3808 rect
cbx_1__4_ cbx_1__4_ 3818 29920 2484 2720 rect
cbx_2__4_ cbx_1__4_ 9798 29920 2484 2720 rect
cbx_3__4_ cbx_1__4_ 15778 29920 2484 2720 rect
cbx_4__4_ cbx_1__4_ 21758 29920 2484 2720 rect
cby_4__4_ cby_4__1_ 25300 25296 1840 3808 rect
cby_4__3_ cby_4__1_ 25300 18224 1840 3808 rect
cby_4__2_ cby_4__1_ 25300 11152 1840 3808 rect
cby_4__1_ cby_4__1_ 25300 4080 1840 3808 rect
cbx_4__0_ cbx_1__0_ 21758 544 2484 2720 rect
cbx_3__0_ cbx_1__0_ 15778 544 2484 2720 rect
cbx_2__0_ cbx_1__0_ 9798 544 2484 2720 rect
cbx_1__0_ cbx_1__0_ 3818 544 2484 2720 rect
Total running time of the script: ( 0 minutes 0.000 seconds)