From fa9ed7853441b9b2d40e48e6c5f799bfa71753e0 Mon Sep 17 00:00:00 2001 From: auphelia <jakobapk@web.de> Date: Fri, 3 Apr 2020 18:19:24 +0100 Subject: [PATCH] [HLSCustomOp] Add dynamically setting of AP_INT_MAX_W --- src/finn/custom_op/fpgadataflow/__init__.py | 7 +++++++ .../fpgadataflow/convolutioninputgenerator.py | 11 ++++++++--- .../custom_op/fpgadataflow/streamingfclayer_batch.py | 11 ++++++++--- .../custom_op/fpgadataflow/streamingmaxpool_batch.py | 3 +++ src/finn/custom_op/fpgadataflow/templates.py | 7 +++++-- 5 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/finn/custom_op/fpgadataflow/__init__.py b/src/finn/custom_op/fpgadataflow/__init__.py index 10f8b7fee..32c09d655 100644 --- a/src/finn/custom_op/fpgadataflow/__init__.py +++ b/src/finn/custom_op/fpgadataflow/__init__.py @@ -99,6 +99,7 @@ class HLSCustomOp(CustomOp): # generate top cpp file for ip generation path = self.get_nodeattr("code_gen_dir_ipgen") + self.code_gen_dict["$AP_INT_MAX_W$"] = [str(self.get_ap_int_max_w())] self.generate_params(model, path) self.global_includes() self.defines("ipgen") @@ -156,6 +157,7 @@ class HLSCustomOp(CustomOp): """Generates c++ code for simulation (npysim).""" node = self.onnx_node path = self.get_nodeattr("code_gen_dir_npysim") + self.code_gen_dict["$AP_INT_MAX_W$"] = [str(self.get_ap_int_max_w())] self.generate_params(model, path) self.global_includes() self.defines("npysim") @@ -429,3 +431,8 @@ compilation transformations? def get_outstream_width(self): """Returns output stream width, if implemented.""" raise Exception("get_outstream_width not implemented for this op") + + def get_ap_int_max_w(self): + instream = self.get_instream_width() + outstream = self.get_outstream_width() + return max([instream, outstream]) diff --git a/src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py b/src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py index e2a2f90b8..fe48af67f 100644 --- a/src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py +++ b/src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py @@ -73,6 +73,10 @@ class ConvolutionInputGenerator(HLSCustomOp): ishape = (1, ifm_dim, ifm_dim, ifm_ch) return ishape + def get_folded_input_shape(self): + """Assumption: No folding on input""" + return self.get_normal_input_shape() + def get_normal_output_shape(self): k = self.get_nodeattr("ConvKernelDim") ifm_dim = self.get_nodeattr("IFMDim") @@ -272,9 +276,10 @@ class ConvolutionInputGenerator(HLSCustomOp): def defines(self, var): numReps = 1 self.code_gen_dict["$DEFINES$"] = [ - """#define ConvKernelDim1 {}\n #define IFMChannels1 {} - #define Input_precision1 {}\n #define IFMDim1 {}\n #define OFMDim1 {} - #define SIMD1 {}\n #define Stride1 {}\n #define numReps {}""".format( + """#define ConvKernelDim1 {}\n #define IFMChannels1 {}\n + #define Input_precision1 {}\n #define IFMDim1 {}\n + #define OFMDim1 {}\n #define SIMD1 {}\n + #define Stride1 {}\n #define numReps {}""".format( self.get_nodeattr("ConvKernelDim"), self.get_nodeattr("IFMChannels"), self.get_input_datatype().bitwidth(), diff --git a/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py b/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py index 00b8287a3..301a39973 100644 --- a/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py +++ b/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py @@ -270,6 +270,11 @@ class StreamingFCLayer_Batch(HLSCustomOp): wp = self.get_weight_datatype().bitwidth() return pe * simd * wp + def get_ap_int_max_w(self): + temp_value = super().get_ap_int_max_w() + weightstream = self.get_weightstream_width() + return max([weightstream, temp_value]) + def get_folded_input_shape(self): mw = self.get_nodeattr("MW") simd = self.get_nodeattr("SIMD") @@ -714,9 +719,9 @@ class StreamingFCLayer_Batch(HLSCustomOp): numInputVectors = list(self.get_nodeattr("numInputVectors")) numReps = np.prod(numInputVectors) self.code_gen_dict["$DEFINES$"] = [ - """#define MW1 {}\n #define MH1 {}\n #define SIMD1 {}\n - #define PE1 {}\n #define WMEM1 {}\n #define TMEM1 {}\n - #define numReps {}""".format( + """#define MW1 {}\n #define MH1 {}\n + #define SIMD1 {}\n #define PE1 {}\n #define WMEM1 {}\n + #define TMEM1 {}\n #define numReps {}""".format( self.get_nodeattr("MW"), self.get_nodeattr("MH"), self.get_nodeattr("SIMD"), diff --git a/src/finn/custom_op/fpgadataflow/streamingmaxpool_batch.py b/src/finn/custom_op/fpgadataflow/streamingmaxpool_batch.py index 804da50f5..d7378b46c 100644 --- a/src/finn/custom_op/fpgadataflow/streamingmaxpool_batch.py +++ b/src/finn/custom_op/fpgadataflow/streamingmaxpool_batch.py @@ -64,6 +64,9 @@ class StreamingMaxPool_Batch(HLSCustomOp): ishape = (1, ifm_dim, ifm_dim, ifm_ch) return ishape + def get_folded_input_shape(self): + return self.get_normal_input_shape() + def get_normal_output_shape(self): k = self.get_nodeattr("PoolDim") ifm_dim = self.get_nodeattr("ImgDim") diff --git a/src/finn/custom_op/fpgadataflow/templates.py b/src/finn/custom_op/fpgadataflow/templates.py index 90a54b019..44a4def41 100644 --- a/src/finn/custom_op/fpgadataflow/templates.py +++ b/src/finn/custom_op/fpgadataflow/templates.py @@ -29,11 +29,12 @@ # template for single node execution docompute_template = """ -#define AP_INT_MAX_W 16384 +#define AP_INT_MAX_W $AP_INT_MAX_W$ #include "cnpy.h" #include "npy2apintstream.hpp" #include <vector> #include "bnn-library.h" + // includes for network parameters $GLOBALS$ @@ -60,8 +61,10 @@ $SAVEASCNPY$ # cpp file ipgen_template = """ -#define AP_INT_MAX_W 4096 +#define AP_INT_MAX_W $AP_INT_MAX_W$ + #include "bnn-library.h" + // includes for network parameters $GLOBALS$ -- GitLab