From 4b5f0d592eafd1587dd4b129d919eb0bac49b460 Mon Sep 17 00:00:00 2001
From: auphelia <jakobapk@web.de>
Date: Fri, 20 Dec 2019 16:32:16 +0000
Subject: [PATCH] [Test] Added test cases for slidingwindow (SIMD = IFMChannels

---
 .../test_fpgadataflow_convinputgenerator.py   | 49 ++++++++++++++++---
 1 file changed, 42 insertions(+), 7 deletions(-)

diff --git a/tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py b/tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py
index 2dab3b162..cb58f1ef5 100644
--- a/tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py
+++ b/tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py
@@ -1,3 +1,5 @@
+import pytest
+
 import numpy as np
 from onnx import TensorProto, helper
 
@@ -37,7 +39,33 @@ def im2col_indices(x, k, stride):
 
     cols = x[:, l, i, j]
     C = x.shape[1]
+    # cols = cols.transpose(0, 2, 1)
     cols = cols.transpose(1, 2, 0).reshape(k * k * C, -1)
+    cols = cols.transpose(1, 0)
+
+    # rearranging the output so it matches with finn-hlslib function
+    # swapping the columns according to the input channel
+    # if C > 1 :
+    parts = {}
+    for ch in range(C):
+        parts[ch] = []
+
+    for i in range(cols.shape[1]):
+        if i % C == 0:
+            parts[0].append(i)
+        elif (i + (C - 1)) % C == 0:
+            parts[1].append(i)
+        elif (i + (C - 2)) % C == 0:
+            parts[2].append(i)
+        elif (i + (C - 3)) % C == 0:
+            parts[3].append(i)
+    permutation = []
+    for i in parts:
+        for num in parts[i]:
+            permutation.append(num)
+
+    i = np.argsort(permutation)
+    cols = cols[:, i]
     return cols
 
 
@@ -96,16 +124,23 @@ def prepare_inputs(input_tensor, idt):
         return {"inp": input_tensor}
 
 
-def test_fpgadataflow_slidingwindow():
-    idt = DataType.BIPOLAR
-    k = 2
-    stride = 1
-    ifm_ch = 1
-    ifm_dim = 3
+# input datatype
+@pytest.mark.parametrize("idt", [DataType.BIPOLAR, DataType.INT2])
+# kernel size
+@pytest.mark.parametrize("k", [2, 4])
+# input dimension
+@pytest.mark.parametrize("ifm_dim", [4, 6, 8])
+# input channels
+@pytest.mark.parametrize("ifm_ch", [1, 2, 3, 4])
+# Stride
+@pytest.mark.parametrize("stride", [1, 2])
+def test_fpgadataflow_slidingwindow(idt, k, ifm_dim, ifm_ch, stride):
+    simd = ifm_ch
+
     ofm_dim = int(((ifm_dim - k) / stride) + 1)
-    simd = 1
 
     x = gen_finn_dt_tensor(idt, (1, ifm_ch, ifm_dim, ifm_dim))
+    # x_values = np
     model = make_single_slidingwindow_modelwrapper(
         k, ifm_ch, ifm_dim, ofm_dim, simd, stride, idt
     )
-- 
GitLab