From 1c80a4057e4ba51c6864f063d3805604f058a9f0 Mon Sep 17 00:00:00 2001
From: Yaman Umuroglu <maltanar@gmail.com>
Date: Sun, 23 Aug 2020 23:21:10 +0200
Subject: [PATCH] [Vitis] generate xml report after VitisLink

---
 .../transformation/fpgadataflow/templates.py  |  6 +++++
 .../fpgadataflow/vitis_build.py               | 24 +++++++++++++++++++
 2 files changed, 30 insertions(+)

diff --git a/src/finn/transformation/fpgadataflow/templates.py b/src/finn/transformation/fpgadataflow/templates.py
index b0684b7f1..b3b577cdc 100644
--- a/src/finn/transformation/fpgadataflow/templates.py
+++ b/src/finn/transformation/fpgadataflow/templates.py
@@ -444,3 +444,9 @@ export PLATFORM_REPO_PATHS=$REMOTE_PLATFORM_REPO_PATHS$
 python3.6 driver.py --exec_mode=$1 --batchsize=$2 --bitfile=$BITFILE$ \
     --inputfile=input.npy --outputfile=output.npy --platform=alveo
 """
+
+vitis_gen_xml_report_tcl_template = """
+open_project $VITIS_PROJ_PATH$/_x/link/vivado/vpl/prj/prj.xpr
+open_run impl_1
+report_utilization -hierarchical -hierarchical_depth 5 -file open_project $VITIS_PROJ_PATH$/synth_report.xml -format xml
+"""
diff --git a/src/finn/transformation/fpgadataflow/vitis_build.py b/src/finn/transformation/fpgadataflow/vitis_build.py
index c37d753f6..215944d97 100644
--- a/src/finn/transformation/fpgadataflow/vitis_build.py
+++ b/src/finn/transformation/fpgadataflow/vitis_build.py
@@ -51,6 +51,7 @@ from finn.transformation.fpgadataflow.make_pynq_driver import MakePYNQDriver
 from finn.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames
 from finn.util.basic import make_build_dir
 from finn.transformation.infer_data_layouts import InferDataLayouts
+from . import templates
 from enum import Enum
 
 
@@ -251,6 +252,12 @@ class VitisLink(Transformation):
         with open(link_dir + "/config.txt", "w") as f:
             f.write(config)
 
+        # create tcl script to generate resource report in XML format
+        gen_rep_xml = templates.vitis_gen_xml_report_tcl_template
+        gen_rep_xml.replace("$VITIS_PROJ_PATH$", link_dir)
+        with open(link_dir + "/gen_report_xml.tcl", "w") as f:
+            f.write(gen_rep_xml)
+
         # create a shell script and call Vitis
         script = link_dir + "/run_vitis_link.sh"
         working_dir = os.environ["PWD"]
@@ -278,6 +285,23 @@ class VitisLink(Transformation):
             "Vitis .xclbin file not created, check logs under %s" % link_dir
         )
         model.set_metadata_prop("bitfile", xclbin)
+
+        # run Vivado to gen xml report
+        gen_rep_xml_sh = link_dir + "/gen_report_xml.sh"
+        working_dir = os.environ["PWD"]
+        with open(gen_rep_xml_sh, "w") as f:
+            f.write("#!/bin/bash \n")
+            f.write("cd {}\n".format(link_dir))
+            f.write(
+                "vivado -mode tcl -source %s\n" % (link_dir + "/gen_report_xml.tcl")
+            )
+            f.write("cd {}\n".format(working_dir))
+        bash_command = ["bash", gen_rep_xml_sh]
+        process_genxml = subprocess.Popen(bash_command, stdout=subprocess.PIPE)
+        process_genxml.communicate()
+        # filename for the synth utilization report
+        synth_report_filename = link_dir + "/synth_report.xml"
+        model.set_metadata_prop("vivado_synth_rpt", synth_report_filename)
         return (model, False)
 
 
-- 
GitLab