diff --git a/src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py b/src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py index 91460fdac4f072b0954da1152fa578cd3338fd80..4bf9bbf568842e4527093aa763a89e2aedcf2f76 100644 --- a/src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py +++ b/src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py @@ -36,6 +36,12 @@ class ConvolutionInputGenerator(HLSCustomOp): def verify_node(self): pass + def bram_estimation(self): + pass + + def lut_estimation(self): + pass + def get_input_datatype(self): return DataType[self.get_nodeattr("inputDataType")] diff --git a/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py b/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py index 8d3d063c7a35bb86c72f1fcc1886c1821dd10c6a..7bbd6e9b00e9e166eaa63dc5daac5cb4b33193b3 100644 --- a/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py +++ b/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py @@ -1,5 +1,5 @@ import os - +import math import numpy as np from finn.backend.fpgadataflow.utils import numpy_to_hls_code @@ -141,6 +141,27 @@ class StreamingFCLayer_Batch(HLSCustomOp): return info_messages + def bram_estimation(self): + P = self.get_nodeattr("PE") + Q = self.get_nodeattr("SIMD") + wdt = self.get_weight_datatype() + W = wdt.bitwidth() + D_in = self.get_instream_width() + D_out = self.get_outstream_width() + omega = (D_in * D_out) / (Q * P) + return P * (math.ceil(omega / 512)) * (math.ceil((Q * W) / 36)) + + def lut_estimation(self): + P = self.get_nodeattr("PE") + Q = self.get_nodeattr("SIMD") + wdt = self.get_weight_datatype() + W = wdt.bitwidth() + tdt = DataType.INT32 + A = tdt.bitwidth() + c0 = 300 + c1 = 1.1 + return c0 + c1 * (P * Q) * (W * A) + def get_input_datatype(self): return DataType[self.get_nodeattr("inputDataType")]