From e7eeed0f14e2d7d98aa5979bcabc34e05466db7d Mon Sep 17 00:00:00 2001
From: Hendrik Borras <hendrikborras@web.de>
Date: Fri, 8 Oct 2021 13:57:49 +0100
Subject: [PATCH] Add optional support for QONNX ingestion in the dataflow
 builder.

---
 src/finn/builder/build_dataflow.py        |  4 ++++
 src/finn/builder/build_dataflow_config.py |  5 +++++
 src/finn/builder/build_dataflow_steps.py  | 19 +++++++++++++++++++
 3 files changed, 28 insertions(+)

diff --git a/src/finn/builder/build_dataflow.py b/src/finn/builder/build_dataflow.py
index c4664a547..68733e59b 100644
--- a/src/finn/builder/build_dataflow.py
+++ b/src/finn/builder/build_dataflow.py
@@ -34,6 +34,7 @@ import pdb  # NOQA
 import sys
 import time
 import traceback
+from copy import deepcopy
 
 from finn.builder.build_dataflow_config import (
     DataflowBuildConfig,
@@ -66,6 +67,9 @@ def resolve_build_steps(cfg: DataflowBuildConfig, partial: bool = True):
     steps = cfg.steps
     if steps is None:
         steps = default_build_dataflow_steps
+    if cfg.expect_QONNX_as_input:
+        steps = deepcopy(steps)
+        steps.insert(0, "step_qonnx_to_finn")
     steps_as_fxns = []
     for transform_step in steps:
         if type(transform_step) is str:
diff --git a/src/finn/builder/build_dataflow_config.py b/src/finn/builder/build_dataflow_config.py
index 052a6c701..ca1a108d2 100644
--- a/src/finn/builder/build_dataflow_config.py
+++ b/src/finn/builder/build_dataflow_config.py
@@ -291,6 +291,11 @@ class DataflowBuildConfig:
     #: If given, stop at this step.
     stop_step: Optional[str] = None
 
+    #: If set to True, the dataflow builder will assume that the input ONNX file is
+    #: in the QONNX dialect. FINN will then try to convert the input to the
+    #: FINN-ONNX dialect.
+    expect_QONNX_as_input: Optional[bool] = False
+
     def _resolve_hls_clk_period(self):
         if self.hls_clk_period_ns is None:
             # use same clk for synth and hls if not explicitly specified
diff --git a/src/finn/builder/build_dataflow_steps.py b/src/finn/builder/build_dataflow_steps.py
index b9c065ed2..9af273163 100644
--- a/src/finn/builder/build_dataflow_steps.py
+++ b/src/finn/builder/build_dataflow_steps.py
@@ -31,6 +31,7 @@ import numpy as np
 import os
 from copy import deepcopy
 from distutils.dir_util import copy_tree
+from qonnx.util.cleanup import cleanup_model
 from shutil import copy
 
 import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls
@@ -94,6 +95,7 @@ from finn.transformation.infer_datatypes import InferDataTypes
 from finn.transformation.infer_shapes import InferShapes
 from finn.transformation.lower_convs_to_matmul import LowerConvsToMatMul
 from finn.transformation.move_reshape import RemoveCNVtoFCFlatten
+from finn.transformation.qonnx.convert_qonnx_to_finn import ConvertQONNXtoFINN
 from finn.transformation.streamline import Streamline
 from finn.transformation.streamline.reorder import MakeMaxPoolNHWC
 from finn.util.config import extract_model_config_to_json
@@ -187,6 +189,22 @@ def prepare_for_stitched_ip_rtlsim(verify_model, cfg):
     return verify_model
 
 
+def step_qonnx_to_finn(model: ModelWrapper, cfg: DataflowBuildConfig):
+    """
+    This runs the tidy-up step from QONNX and then converts the QONNX model
+    to the FINN-ONNX dialect.
+    """
+    # QONNX cleanup
+    model = cleanup_model(model)
+    # QONNX to FINN-ONNX
+    model = model.transform(ConvertQONNXtoFINN())
+
+    if VerificationStepType.TIDY_UP_PYTHON in cfg._resolve_verification_steps():
+        verify_step(model, cfg, "initial_python", need_parent=False)
+
+    return model
+
+
 def step_tidy_up(model: ModelWrapper, cfg: DataflowBuildConfig):
     """Run the tidy-up step on given model. This includes shape and datatype
     inference, constant folding, and giving nodes and tensors better names.
@@ -618,6 +636,7 @@ def step_deployment_package(model: ModelWrapper, cfg: DataflowBuildConfig):
 
 #: map step name strings to step functions
 build_dataflow_step_lookup = {
+    "step_qonnx_to_finn": step_qonnx_to_finn,
     "step_tidy_up": step_tidy_up,
     "step_streamline": step_streamline,
     "step_convert_to_hls": step_convert_to_hls,
-- 
GitLab