From 7604d45abe0051b44694d6c5ab8ca5092af2b601 Mon Sep 17 00:00:00 2001
From: Yaman Umuroglu <maltanar@gmail.com>
Date: Tue, 13 Oct 2020 22:04:57 +0200
Subject: [PATCH] [Build] restrict to single AXI-lite, get interface name from
 attr

---
 .../fpgadataflow/make_zynq_proj.py            | 14 ++++++--
 .../fpgadataflow/vitis_build.py               | 36 ++++++++++++++-----
 2 files changed, 40 insertions(+), 10 deletions(-)

diff --git a/src/finn/transformation/fpgadataflow/make_zynq_proj.py b/src/finn/transformation/fpgadataflow/make_zynq_proj.py
index 1a4b67d1e..3c980a45e 100644
--- a/src/finn/transformation/fpgadataflow/make_zynq_proj.py
+++ b/src/finn/transformation/fpgadataflow/make_zynq_proj.py
@@ -136,6 +136,15 @@ class MakeZYNQProject(Transformation):
             if clk_ns > global_clk_ns:
                 global_clk_ns = clk_ns
 
+            ifnames = eval(kernel_model.set_metadata_prop("vivado_stitch_ifnames"))
+            assert (
+                len(ifnames["axilite"]) <= 1
+            ), "MakeZYNQProject supports max 1 AXI lite interface"
+            if len(ifnames["axilite"]) == 1:
+                axilite_intf_name = ifnames["axilite"][0]
+            else:
+                axilite_intf_name = None
+
             # gather info on connectivity
             # assume each node connected to outputs/inputs is DMA:
             # has axis, aximm and axilite
@@ -162,10 +171,11 @@ class MakeZYNQProject(Transformation):
                     "[get_bd_intf_pins smartconnect_0/S%02d_AXI]"
                     % (instance_names[node.name], aximm_idx)
                 )
+                assert axilite_intf_name is not None
                 config.append(
-                    "connect_bd_intf_net [get_bd_intf_pins %s/s_axi_control] "
+                    "connect_bd_intf_net [get_bd_intf_pins %s/%s] "
                     "[get_bd_intf_pins axi_interconnect_0/M%02d_AXI]"
-                    % (instance_names[node.name], axilite_idx)
+                    % (axilite_intf_name, instance_names[node.name], axilite_idx)
                 )
                 idma_idx += 1
                 aximm_idx += 1
diff --git a/src/finn/transformation/fpgadataflow/vitis_build.py b/src/finn/transformation/fpgadataflow/vitis_build.py
index b6fc62f57..d4d143421 100644
--- a/src/finn/transformation/fpgadataflow/vitis_build.py
+++ b/src/finn/transformation/fpgadataflow/vitis_build.py
@@ -95,6 +95,15 @@ class CreateVitisXO(Transformation):
         # NOTE: this assumes the graph is Vitis-compatible: max one axi lite interface
         # developed from instructions in UG1393 (v2019.2) and package_xo documentation
         # package_xo is responsible for generating the kernel xml
+        ifnames = eval(model.set_metadata_prop("vivado_stitch_ifnames"))
+        assert (
+            len(ifnames["axilite"]) <= 1
+        ), "CreateVitisXO supports max 1 AXI lite interface"
+        if len(ifnames["axilite"]) == 1:
+            axilite_intf_name = ifnames["axilite"][0]
+        else:
+            axilite_intf_name = None
+
         for node in model.graph.node:
             node_inst = getCustomOp(node)
             arg_id = 0
@@ -117,8 +126,10 @@ class CreateVitisXO(Transformation):
                 # add a axilite port if dynamic
                 # add a count parameter if dynamic
                 if node_inst.get_nodeattr("DynIters") == 1:
+                    assert axilite_intf_name is not None
                     args_string.append(
-                        "{numReps:0:%s:s_axi_control:0x4:0x10:uint:0}" % str(arg_id)
+                        "{numReps:0:%s:%s:0x4:0x10:uint:0}"
+                        % (str(arg_id), axilite_intf_name)
                     )
                     arg_id += 1
             elif node.op_type == "IODMA":
@@ -131,7 +142,8 @@ class CreateVitisXO(Transformation):
                 )
                 arg_id += 1
                 args_string.append(
-                    "{numReps:0:%s:s_axi_control:0x4:0x1C:uint:0}" % str(arg_id)
+                    "{numReps:0:%s:%s:0x4:0x1C:uint:0}"
+                    % (str(arg_id), axilite_intf_name)
                 )
                 arg_id += 1
 
@@ -175,8 +187,11 @@ class VitisLink(Transformation):
     """
 
     def __init__(
-        self, platform, f_mhz=200, strategy=VitisOptStrategy.PERFORMANCE,
-        enable_debug=False
+        self,
+        platform,
+        f_mhz=200,
+        strategy=VitisOptStrategy.PERFORMANCE,
+        enable_debug=False,
     ):
         super().__init__()
         self.platform = platform
@@ -316,9 +331,12 @@ class VitisBuild(Transformation):
     """Best-effort attempt at building the accelerator with Vitis."""
 
     def __init__(
-        self, fpga_part, period_ns, platform,
+        self,
+        fpga_part,
+        period_ns,
+        platform,
         strategy=VitisOptStrategy.PERFORMANCE,
-        enable_debug=False
+        enable_debug=False,
     ):
         super().__init__()
         self.fpga_part = fpga_part
@@ -372,8 +390,10 @@ class VitisBuild(Transformation):
         # Assemble design from kernels
         model = model.transform(
             VitisLink(
-                self.platform, round(1000 / self.period_ns), strategy=self.strategy,
-                enable_debug=self.enable_debug
+                self.platform,
+                round(1000 / self.period_ns),
+                strategy=self.strategy,
+                enable_debug=self.enable_debug,
             )
         )
         # set platform attribute for correct remote execution
-- 
GitLab