From 1db418840597ac96fc245ceeee53f34b07fa6e61 Mon Sep 17 00:00:00 2001
From: auphelia <jakobapk@web.de>
Date: Tue, 7 Jan 2020 16:46:12 +0000
Subject: [PATCH] [code generation] Added "_npysim" to all involved files

---
 src/finn/custom_op/fpgadataflow/__init__.py     | 12 ++++++------
 .../fpgadataflow/streamingfclayer_batch.py      | 17 +++++++----------
 .../fpgadataflow/streamingmaxpool_batch.py      | 11 ++++-------
 src/finn/transformation/fpgadataflow/cleanup.py |  4 ++--
 .../{codegen.py => codegen_npysim.py}           | 10 +++++-----
 src/finn/transformation/fpgadataflow/compile.py |  2 +-
 tests/fpgadataflow/test_code_gen_trafo.py       |  4 ++--
 tests/fpgadataflow/test_compilation_trafo.py    |  4 ++--
 .../fpgadataflow/test_convert_to_hls_layers.py  |  4 ++--
 tests/fpgadataflow/test_fpgadataflow_fclayer.py |  4 ++--
 .../test_layer_streaming_maxpool_batch.py       |  4 ++--
 11 files changed, 35 insertions(+), 41 deletions(-)
 rename src/finn/transformation/fpgadataflow/{codegen.py => codegen_npysim.py} (81%)

diff --git a/src/finn/custom_op/fpgadataflow/__init__.py b/src/finn/custom_op/fpgadataflow/__init__.py
index f275263a4..c0d5d6cc1 100644
--- a/src/finn/custom_op/fpgadataflow/__init__.py
+++ b/src/finn/custom_op/fpgadataflow/__init__.py
@@ -42,11 +42,11 @@ class HLSCustomOp(CustomOp):
     def get_nodeattr_types(self):
         return {
             "backend": ("s", True, "fpgadataflow"),
-            "code_gen_dir": ("s", False, ""),
+            "code_gen_dir_npysim": ("s", False, ""),
             "executable_path": ("s", False, ""),
         }
 
-    def code_generation(self, model):
+    def code_generation_npysim(self, model):
         node = self.onnx_node
         self.generate_params(model)
         self.global_includes()
@@ -63,13 +63,13 @@ class HLSCustomOp(CustomOp):
             # transform list into long string separated by '\n'
             code_gen_line = "\n".join(self.code_gen_dict[key])
             template = template.replace(key, code_gen_line)
-        code_gen_dir = self.get_nodeattr("code_gen_dir")
+        code_gen_dir = self.get_nodeattr("code_gen_dir_npysim")
         f = open(os.path.join(code_gen_dir, "execute_{}.cpp".format(node.op_type)), "w")
         f.write(template)
         f.close()
 
     def compile_singlenode_code(self):
-        code_gen_dir = self.get_nodeattr("code_gen_dir")
+        code_gen_dir = self.get_nodeattr("code_gen_dir_npysim")
         builder = CppBuilder()
         # to enable additional debug features please uncommand the next line
         # builder.append_includes("-DDEBUG")
@@ -87,7 +87,7 @@ class HLSCustomOp(CustomOp):
 
     def dynamic_input_to_npy(self, context, count):
         node = self.onnx_node
-        code_gen_dir = self.get_nodeattr("code_gen_dir")
+        code_gen_dir = self.get_nodeattr("code_gen_dir_npysim")
         if code_gen_dir == "":
             raise Exception(
                 """
@@ -106,7 +106,7 @@ Found no codegen dir for this node, did you run the codegen transformation?
     def npy_to_dynamic_output(self, context):
         # TODO support multi-output nodes as needed
         node = self.onnx_node
-        code_gen_dir = self.get_nodeattr("code_gen_dir")
+        code_gen_dir = self.get_nodeattr("code_gen_dir_npysim")
         output = np.load("{}/output.npy".format(code_gen_dir))
         context[node.output[0]] = output
 
diff --git a/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py b/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py
index 975da666f..081020fff 100644
--- a/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py
+++ b/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py
@@ -14,9 +14,6 @@ class StreamingFCLayer_Batch(HLSCustomOp):
 
     def get_nodeattr_types(self):
         my_attrs = {
-            # "backend": ("s", True, "fpgadataflow"),
-            # "code_gen_dir": ("s", True, ""),
-            # "executable_path": ("s", True, ""),
             "PE": ("i", True, 0),
             "SIMD": ("i", True, 0),
             "MW": ("i", True, 0),
@@ -91,7 +88,7 @@ class StreamingFCLayer_Batch(HLSCustomOp):
 
         # verify that all necessary attributes exist
         try:
-            self.get_nodeattr("code_gen_dir")
+            self.get_nodeattr("code_gen_dir_npysim")
             self.get_nodeattr("executable_path")
             self.get_nodeattr("resType")
             self.get_nodeattr("MW")
@@ -109,7 +106,7 @@ class StreamingFCLayer_Batch(HLSCustomOp):
             info_messages.append(
                 """The necessary attributes do not exist.
                 StreamingFCLayer_Batch needs the following attributes:
-                code_gen_dir, executable_path, resType, MW, MH, SIMD, PE,
+                code_gen_dir_npysim, executable_path, resType, MW, MH, SIMD, PE,
                 inputDataType, weightDataType, outputDataType, ActVal,
                 binaryXnorMode, noActivation"""
             )
@@ -283,7 +280,7 @@ class StreamingFCLayer_Batch(HLSCustomOp):
             weight_tensor, export_wdt, "weights", True, True
         )
         # write weights into params.h
-        code_gen_dir = self.get_nodeattr("code_gen_dir")
+        code_gen_dir = self.get_nodeattr("code_gen_dir_npysim")
         f_weights = open("{}/params.h".format(code_gen_dir), "w")
 
         if export_wdt.bitwidth() != 1:
@@ -324,7 +321,7 @@ class StreamingFCLayer_Batch(HLSCustomOp):
                     threshold_tensor, tdt, "thresholds", False, True
                 )
                 # write thresholds into thresh.h
-                code_gen_dir = self.get_nodeattr("code_gen_dir")
+                code_gen_dir = self.get_nodeattr("code_gen_dir_npysim")
                 f_thresh = open("{}/thresh.h".format(code_gen_dir), "w")
                 tdt_hls = tdt.get_hls_datatype_str()
                 # use binary to export bipolar activations
@@ -357,7 +354,7 @@ class StreamingFCLayer_Batch(HLSCustomOp):
         nf = mh // pe
 
         # TODO ensure codegen dir exists
-        code_gen_dir = self.get_nodeattr("code_gen_dir")
+        code_gen_dir = self.get_nodeattr("code_gen_dir_npysim")
         # create a npy file fore each input of the node (in_ind is input index)
         in_ind = 0
         for inputs in node.input:
@@ -419,7 +416,7 @@ class StreamingFCLayer_Batch(HLSCustomOp):
         ]
 
     def read_npy_data(self):
-        code_gen_dir = self.get_nodeattr("code_gen_dir")
+        code_gen_dir = self.get_nodeattr("code_gen_dir_npysim")
         dtype = self.get_input_datatype()
         if dtype == DataType.BIPOLAR:
             # use binary for bipolar storage
@@ -466,7 +463,7 @@ class StreamingFCLayer_Batch(HLSCustomOp):
         ]
 
     def dataoutstrm(self):
-        code_gen_dir = self.get_nodeattr("code_gen_dir")
+        code_gen_dir = self.get_nodeattr("code_gen_dir_npysim")
         dtype = self.get_output_datatype()
         if dtype == DataType.BIPOLAR:
             # use binary for bipolar storage
diff --git a/src/finn/custom_op/fpgadataflow/streamingmaxpool_batch.py b/src/finn/custom_op/fpgadataflow/streamingmaxpool_batch.py
index 92f499b67..d331ffe04 100644
--- a/src/finn/custom_op/fpgadataflow/streamingmaxpool_batch.py
+++ b/src/finn/custom_op/fpgadataflow/streamingmaxpool_batch.py
@@ -4,9 +4,6 @@ from finn.custom_op.fpgadataflow import HLSCustomOp
 class StreamingMaxPool_Batch(HLSCustomOp):
     def get_nodeattr_types(self):
         my_attrs = {
-            # "backend": ("s", True, "fpgadataflow"),
-            # "code_gen_dir": ("s", True, ""),
-            # "executable_path": ("s", True, ""),
             "ImgDim": ("i", True, 0),
             "PoolDim": ("i", True, 0),
             "NumChannels": ("i", True, 0),
@@ -51,7 +48,7 @@ class StreamingMaxPool_Batch(HLSCustomOp):
 
         # verify that all necessary attributes exist
         try:
-            self.get_nodeattr("code_gen_dir")
+            self.get_nodeattr("code_gen_dir_npysim")
             self.get_nodeattr("executable_path")
             self.get_nodeattr("ImgDim")
             self.get_nodeattr("PoolDim")
@@ -61,7 +58,7 @@ class StreamingMaxPool_Batch(HLSCustomOp):
             info_messages.append(
                 """The necessary attributes do not exist.
                 StreamingMaxPool_Batch  needs the following attributes:
-                code_gen_dir, executable_path, ImgDim, PoolDim, NumChannels"""
+                code_gen_dir_npysim, executable_path, ImgDim, PoolDim, NumChannels"""
             )
 
         # verify the number of inputs
@@ -89,7 +86,7 @@ class StreamingMaxPool_Batch(HLSCustomOp):
 
     def read_npy_data(self):
         node = self.onnx_node
-        code_gen_dir = self.get_nodeattr("code_gen_dir")
+        code_gen_dir = self.get_nodeattr("code_gen_dir_npysim")
         # c++ code to read out an npy file
         # and put it in hls::stream in the correct order
         self.code_gen_dict["$READNPYDATA$"] = []
@@ -188,7 +185,7 @@ class StreamingMaxPool_Batch(HLSCustomOp):
         self.code_gen_dict["$DATAOUTSTREAM$"].append("}")
 
     def save_as_npy(self):
-        code_gen_dir = self.get_nodeattr("code_gen_dir")
+        code_gen_dir = self.get_nodeattr("code_gen_dir_npysim")
         numReps = 1
         self.code_gen_dict["$SAVEASCNPY$"] = [
             """cnpy::npy_save("{}/output.npy",&output_data_vector[0],
diff --git a/src/finn/transformation/fpgadataflow/cleanup.py b/src/finn/transformation/fpgadataflow/cleanup.py
index 1632d3443..d0090f3ac 100644
--- a/src/finn/transformation/fpgadataflow/cleanup.py
+++ b/src/finn/transformation/fpgadataflow/cleanup.py
@@ -22,10 +22,10 @@ class CleanUp(Transformation):
                     try:
                         # lookup op_type in registry of CustomOps
                         inst = registry.custom_op[op_type](node)
-                        code_gen_dir = inst.get_nodeattr("code_gen_dir")
+                        code_gen_dir = inst.get_nodeattr("code_gen_dir_npysim")
                         if os.path.isdir(code_gen_dir):
                             shutil.rmtree(code_gen_dir)
-                        inst.set_nodeattr("code_gen_dir", "")
+                        inst.set_nodeattr("code_gen_dir_npysim", "")
                         inst.set_nodeattr("executable_path", "")
                     except KeyError:
                         # exception if op_type is not supported
diff --git a/src/finn/transformation/fpgadataflow/codegen.py b/src/finn/transformation/fpgadataflow/codegen_npysim.py
similarity index 81%
rename from src/finn/transformation/fpgadataflow/codegen.py
rename to src/finn/transformation/fpgadataflow/codegen_npysim.py
index 84078d90a..45a21b8b1 100644
--- a/src/finn/transformation/fpgadataflow/codegen.py
+++ b/src/finn/transformation/fpgadataflow/codegen_npysim.py
@@ -14,19 +14,19 @@ def _codegen_single_node(node, model):
         # lookup op_type in registry of CustomOps
         inst = registry.custom_op[op_type](node)
         # get the path of the code generation directory
-        code_gen_dir = inst.get_nodeattr("code_gen_dir")
+        code_gen_dir = inst.get_nodeattr("code_gen_dir_npysim")
         # ensure that there is a directory
         if code_gen_dir == "" or not os.path.isdir(code_gen_dir):
-            code_gen_dir = tmp.mkdtemp(prefix="code_gen_" + str(node.op_type) + "_")
-            inst.set_nodeattr("code_gen_dir", code_gen_dir)
+            code_gen_dir = tmp.mkdtemp(prefix="code_gen_npysim" + str(node.op_type) + "_")
+            inst.set_nodeattr("code_gen_dir_npysim", code_gen_dir)
         # ensure that there is generated code inside the dir
-        inst.code_generation(model)
+        inst.code_generation_npysim(model)
     except KeyError:
         # exception if op_type is not supported
         raise Exception("Custom op_type %s is currently not supported." % op_type)
 
 
-class CodeGen(Transformation):
+class CodeGen_npysim(Transformation):
     """Code generation for all nodes in model"""
 
     def apply(self, model):
diff --git a/src/finn/transformation/fpgadataflow/compile.py b/src/finn/transformation/fpgadataflow/compile.py
index 37df1c61d..c4f6a1a09 100644
--- a/src/finn/transformation/fpgadataflow/compile.py
+++ b/src/finn/transformation/fpgadataflow/compile.py
@@ -22,7 +22,7 @@ class Compile(Transformation):
                         # lookup op_type in registry of CustomOps
                         inst = registry.custom_op[op_type](node)
                         # ensure that code is generated
-                        assert inst.get_nodeattr("code_gen_dir") != ""
+                        assert inst.get_nodeattr("code_gen_dir_npysim") != ""
                         # call the compilation function for this node
                         inst.compile_singlenode_code()
                         # ensure that executable path is now set
diff --git a/tests/fpgadataflow/test_code_gen_trafo.py b/tests/fpgadataflow/test_code_gen_trafo.py
index 533710605..308f2c3b2 100644
--- a/tests/fpgadataflow/test_code_gen_trafo.py
+++ b/tests/fpgadataflow/test_code_gen_trafo.py
@@ -6,7 +6,7 @@ import finn.core.utils as util
 from finn.core.datatype import DataType
 from finn.core.modelwrapper import ModelWrapper
 from finn.transformation.fpgadataflow.cleanup import CleanUp
-from finn.transformation.fpgadataflow.codegen import CodeGen
+from finn.transformation.fpgadataflow.codegen_npysim import CodeGen_npysim
 
 
 def test_code_gen_trafo():
@@ -50,7 +50,7 @@ def test_code_gen_trafo():
     W = util.gen_finn_dt_tensor(wdt, (mw, mh))
     model.set_initializer("weights", W)
 
-    model = model.transform(CodeGen())
+    model = model.transform(CodeGen_npysim())
     for node in model.graph.node:
         code_gen_attribute = util.get_by_name(node.attribute, "code_gen_dir")
         tmp_dir = code_gen_attribute.s.decode("UTF-8")
diff --git a/tests/fpgadataflow/test_compilation_trafo.py b/tests/fpgadataflow/test_compilation_trafo.py
index f84ce34b5..d6e5d3f11 100644
--- a/tests/fpgadataflow/test_compilation_trafo.py
+++ b/tests/fpgadataflow/test_compilation_trafo.py
@@ -6,7 +6,7 @@ import finn.core.utils as util
 from finn.core.datatype import DataType
 from finn.core.modelwrapper import ModelWrapper
 from finn.transformation.fpgadataflow.cleanup import CleanUp
-from finn.transformation.fpgadataflow.codegen import CodeGen
+from finn.transformation.fpgadataflow.codegen_npysim import CodeGen_npysim
 from finn.transformation.fpgadataflow.compile import Compile
 
 
@@ -51,7 +51,7 @@ def test_compilation_trafo():
     W = util.gen_finn_dt_tensor(wdt, (mw, mh))
     model.set_initializer("weights", W)
 
-    model = model.transform(CodeGen())
+    model = model.transform(CodeGen_npysim())
     model = model.transform(Compile())
     for node in model.graph.node:
         compilation_attribute = util.get_by_name(node.attribute, "executable_path")
diff --git a/tests/fpgadataflow/test_convert_to_hls_layers.py b/tests/fpgadataflow/test_convert_to_hls_layers.py
index 32792e136..21dda4481 100644
--- a/tests/fpgadataflow/test_convert_to_hls_layers.py
+++ b/tests/fpgadataflow/test_convert_to_hls_layers.py
@@ -15,7 +15,7 @@ from finn.core.modelwrapper import ModelWrapper
 from finn.custom_op.fpgadataflow.streamingfclayer_batch import StreamingFCLayer_Batch
 from finn.transformation.bipolar_to_xnor import ConvertBipolarMatMulToXnorPopcount
 from finn.transformation.fold_constants import FoldConstants
-from finn.transformation.fpgadataflow.codegen import CodeGen
+from finn.transformation.fpgadataflow.codegen_npysim import CodeGen_npysim
 from finn.transformation.fpgadataflow.compile import Compile
 from finn.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames
 from finn.transformation.infer_shapes import InferShapes
@@ -82,7 +82,7 @@ def test_convert_to_hls_layers_lfc_w1a1():
     fc3w.set_nodeattr("SIMD", 1024)
     fc3w.set_nodeattr("PE", 10)
 
-    model = model.transform(CodeGen())
+    model = model.transform(CodeGen_npysim())
     model = model.transform(Compile())
 
     raw_i = get_data("finn", "data/onnx/mnist-conv/test_data_set_0/input_0.pb")
diff --git a/tests/fpgadataflow/test_fpgadataflow_fclayer.py b/tests/fpgadataflow/test_fpgadataflow_fclayer.py
index 0df66c4af..00ba44e6f 100644
--- a/tests/fpgadataflow/test_fpgadataflow_fclayer.py
+++ b/tests/fpgadataflow/test_fpgadataflow_fclayer.py
@@ -10,7 +10,7 @@ from finn.core.modelwrapper import ModelWrapper
 from finn.core.utils import calculate_signed_dot_prod_range, gen_finn_dt_tensor
 from finn.custom_op.multithreshold import multithreshold
 from finn.transformation.fpgadataflow.cleanup import CleanUp
-from finn.transformation.fpgadataflow.codegen import CodeGen
+from finn.transformation.fpgadataflow.codegen_npysim import CodeGen_npysim
 from finn.transformation.fpgadataflow.compile import Compile
 
 
@@ -147,7 +147,7 @@ def test_fpgadataflow_fclayer(idt, wdt, act, nf, sf, mw, mh):
         else:
             tdt = DataType.INT32
     model = make_single_fclayer_modelwrapper(W, pe, simd, wdt, idt, odt, T, tdt)
-    model = model.transform(CodeGen())
+    model = model.transform(CodeGen_npysim())
     model = model.transform(Compile())
     # prepare input data
     input_dict = prepare_inputs(x, idt, wdt)
diff --git a/tests/fpgadataflow/test_layer_streaming_maxpool_batch.py b/tests/fpgadataflow/test_layer_streaming_maxpool_batch.py
index 4a7ca1b5c..32b1c60fc 100644
--- a/tests/fpgadataflow/test_layer_streaming_maxpool_batch.py
+++ b/tests/fpgadataflow/test_layer_streaming_maxpool_batch.py
@@ -5,7 +5,7 @@ import finn.core.onnx_exec as oxe
 from finn.core.datatype import DataType
 from finn.core.modelwrapper import ModelWrapper
 from finn.transformation.fpgadataflow.cleanup import CleanUp
-from finn.transformation.fpgadataflow.codegen import CodeGen
+from finn.transformation.fpgadataflow.codegen_npysim import CodeGen_npysim
 from finn.transformation.fpgadataflow.compile import Compile
 
 
@@ -112,7 +112,7 @@ def test_layer_streaming_maxpool_batch():
     ).reshape(2, 2, 4, 4)
     print(input_tensor)
 
-    model = model.transform(CodeGen())
+    model = model.transform(CodeGen_npysim())
     model = model.transform(Compile())
 
     input_dict = {"in": input_tensor}
-- 
GitLab