From 2bcc816ff089b25af728276d03084879ba5005dc Mon Sep 17 00:00:00 2001
From: Yaman Umuroglu <yamanu@xilinx.com>
Date: Thu, 27 Jan 2022 15:33:48 +0100
Subject: [PATCH] [HLSCustomOp] update exp cycles for stride>1 1D DWS SWG

---
 .../fpgadataflow/convolutioninputgenerator1d.py | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/finn/custom_op/fpgadataflow/convolutioninputgenerator1d.py b/src/finn/custom_op/fpgadataflow/convolutioninputgenerator1d.py
index ef0f10e33..97ec89daa 100644
--- a/src/finn/custom_op/fpgadataflow/convolutioninputgenerator1d.py
+++ b/src/finn/custom_op/fpgadataflow/convolutioninputgenerator1d.py
@@ -264,7 +264,7 @@ class ConvolutionInputGenerator1D(HLSCustomOp):
         dilation_h, dilation_w = dilation
 
         # since mmv != 1 is not supported yet, we set mmv for now to 1
-        # mmv = 1
+        mmv = 1
         # see https://github.com/Xilinx/finn-hlslib/blob/master/slidingwindow.h
         if self.use_parallel_window_output():
             exp_cycles = k_w + ofm_dim_w
@@ -273,9 +273,18 @@ class ConvolutionInputGenerator1D(HLSCustomOp):
             cycles_write_block = ofm_dim_w * k_w * ifm_ch / simd
             exp_cycles = cycles_read_block + cycles_write_block
         elif self.get_nodeattr("depthwise") == 1:
-            cycles_read_block = ifm_ch / simd * (k_w - 1) - (k_w - 1)
-            cycles_write_block = ofm_dim_w * k_w * ifm_ch / simd
-            exp_cycles = cycles_read_block + cycles_write_block
+            if stride_h > 1 or stride_w > 1:
+                cycles_write_block = (ofm_dim_w * k_w * k_h * (ifm_ch / simd)) / mmv
+                cycles_read_block = stride_w * ifm_dim_w * (ifm_ch / simd)
+                max_cycles = max(cycles_write_block, cycles_read_block)
+                exp_cycles = (
+                    ifm_dim_w * k_h * dilation_h * (ifm_ch / simd)
+                    + ofm_dim_h * max_cycles
+                )
+            else:
+                cycles_read_block = ifm_ch / simd * (k_w - 1) - (k_w - 1)
+                cycles_write_block = ofm_dim_w * k_w * ifm_ch / simd
+                exp_cycles = cycles_read_block + cycles_write_block
         else:
             exp_cycles = 1 + ofm_dim_w * k_w * ifm_ch / simd
 
-- 
GitLab