ソースを参照

CMSIS-NN: Add full code coverage for test_arm_convolve_1x1_fast

Change-Id: I00d70b286f6e6a0cf63768dbae66671d734ab340
Måns Nilsson 5 年 前
コミット
96c5f76b40

+ 2 - 2
CMSIS/NN/Tests/UnitTest/PregeneratedData/kernel1x1/bias.txt

@@ -1,2 +1,2 @@
-# 1
-4.000000000000000000e+00
+# 17
+1.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00

+ 226 - 65
CMSIS/NN/Tests/UnitTest/PregeneratedData/kernel1x1/input.txt

@@ -1,65 +1,226 @@
-# 1,8,8,4
-0.000000000000000000e+00,-1.000000000000000000e+00,-5.000000000000000000e+00,-6.000000000000000000e+00
-1.000000000000000000e+00,-5.000000000000000000e+00,0.000000000000000000e+00,5.000000000000000000e+00
-2.000000000000000000e+00,-6.000000000000000000e+00,1.000000000000000000e+00,-1.000000000000000000e+00
-6.000000000000000000e+00,-2.000000000000000000e+00,-1.000000000000000000e+00,2.000000000000000000e+00
-6.000000000000000000e+00,5.000000000000000000e+00,6.000000000000000000e+00,-1.000000000000000000e+00
-2.000000000000000000e+00,-2.000000000000000000e+00,4.000000000000000000e+00,4.000000000000000000e+00
-3.000000000000000000e+00,-5.000000000000000000e+00,-6.000000000000000000e+00,3.000000000000000000e+00
--4.000000000000000000e+00,-4.000000000000000000e+00,-6.000000000000000000e+00,-3.000000000000000000e+00
--6.000000000000000000e+00,5.000000000000000000e+00,-3.000000000000000000e+00,2.000000000000000000e+00
-0.000000000000000000e+00,-2.000000000000000000e+00,0.000000000000000000e+00,-5.000000000000000000e+00
--3.000000000000000000e+00,-2.000000000000000000e+00,1.000000000000000000e+00,4.000000000000000000e+00
-2.000000000000000000e+00,4.000000000000000000e+00,-3.000000000000000000e+00,-5.000000000000000000e+00
-4.000000000000000000e+00,1.000000000000000000e+00,-1.000000000000000000e+00,6.000000000000000000e+00
--1.000000000000000000e+00,4.000000000000000000e+00,-7.000000000000000000e+00,6.000000000000000000e+00
--7.000000000000000000e+00,1.000000000000000000e+00,-3.000000000000000000e+00,-3.000000000000000000e+00
--6.000000000000000000e+00,3.000000000000000000e+00,-6.000000000000000000e+00,-1.000000000000000000e+00
--4.000000000000000000e+00,1.000000000000000000e+00,-6.000000000000000000e+00,-3.000000000000000000e+00
-6.000000000000000000e+00,3.000000000000000000e+00,-3.000000000000000000e+00,-1.000000000000000000e+00
--5.000000000000000000e+00,1.000000000000000000e+00,-4.000000000000000000e+00,-7.000000000000000000e+00
-0.000000000000000000e+00,-4.000000000000000000e+00,-5.000000000000000000e+00,2.000000000000000000e+00
-0.000000000000000000e+00,4.000000000000000000e+00,-3.000000000000000000e+00,-3.000000000000000000e+00
-1.000000000000000000e+00,0.000000000000000000e+00,-4.000000000000000000e+00,-4.000000000000000000e+00
--4.000000000000000000e+00,6.000000000000000000e+00,-5.000000000000000000e+00,-1.000000000000000000e+00
--5.000000000000000000e+00,-2.000000000000000000e+00,1.000000000000000000e+00,-5.000000000000000000e+00
-3.000000000000000000e+00,-7.000000000000000000e+00,-7.000000000000000000e+00,4.000000000000000000e+00
--6.000000000000000000e+00,-7.000000000000000000e+00,4.000000000000000000e+00,2.000000000000000000e+00
-0.000000000000000000e+00,-6.000000000000000000e+00,-7.000000000000000000e+00,4.000000000000000000e+00
--4.000000000000000000e+00,0.000000000000000000e+00,6.000000000000000000e+00,5.000000000000000000e+00
-4.000000000000000000e+00,-1.000000000000000000e+00,-2.000000000000000000e+00,4.000000000000000000e+00
--2.000000000000000000e+00,-6.000000000000000000e+00,-3.000000000000000000e+00,2.000000000000000000e+00
-5.000000000000000000e+00,-5.000000000000000000e+00,1.000000000000000000e+00,-7.000000000000000000e+00
--1.000000000000000000e+00,2.000000000000000000e+00,-6.000000000000000000e+00,3.000000000000000000e+00
--3.000000000000000000e+00,-3.000000000000000000e+00,-3.000000000000000000e+00,5.000000000000000000e+00
-1.000000000000000000e+00,-2.000000000000000000e+00,-3.000000000000000000e+00,6.000000000000000000e+00
-1.000000000000000000e+00,3.000000000000000000e+00,5.000000000000000000e+00,-6.000000000000000000e+00
--1.000000000000000000e+00,-1.000000000000000000e+00,2.000000000000000000e+00,6.000000000000000000e+00
--5.000000000000000000e+00,-3.000000000000000000e+00,3.000000000000000000e+00,-1.000000000000000000e+00
--6.000000000000000000e+00,-6.000000000000000000e+00,-6.000000000000000000e+00,4.000000000000000000e+00
-5.000000000000000000e+00,0.000000000000000000e+00,-3.000000000000000000e+00,0.000000000000000000e+00
-1.000000000000000000e+00,6.000000000000000000e+00,-4.000000000000000000e+00,-1.000000000000000000e+00
--5.000000000000000000e+00,-1.000000000000000000e+00,-2.000000000000000000e+00,5.000000000000000000e+00
--5.000000000000000000e+00,-7.000000000000000000e+00,3.000000000000000000e+00,-6.000000000000000000e+00
-5.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,-7.000000000000000000e+00
-4.000000000000000000e+00,5.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
-2.000000000000000000e+00,0.000000000000000000e+00,-5.000000000000000000e+00,4.000000000000000000e+00
--1.000000000000000000e+00,6.000000000000000000e+00,-5.000000000000000000e+00,-1.000000000000000000e+00
--7.000000000000000000e+00,-4.000000000000000000e+00,4.000000000000000000e+00,4.000000000000000000e+00
-3.000000000000000000e+00,2.000000000000000000e+00,4.000000000000000000e+00,6.000000000000000000e+00
-5.000000000000000000e+00,6.000000000000000000e+00,-6.000000000000000000e+00,5.000000000000000000e+00
--7.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,-6.000000000000000000e+00
--5.000000000000000000e+00,4.000000000000000000e+00,6.000000000000000000e+00,3.000000000000000000e+00
-1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,-2.000000000000000000e+00
-3.000000000000000000e+00,-1.000000000000000000e+00,-3.000000000000000000e+00,3.000000000000000000e+00
-2.000000000000000000e+00,0.000000000000000000e+00,-4.000000000000000000e+00,-1.000000000000000000e+00
--2.000000000000000000e+00,-4.000000000000000000e+00,6.000000000000000000e+00,5.000000000000000000e+00
-6.000000000000000000e+00,-7.000000000000000000e+00,-4.000000000000000000e+00,-2.000000000000000000e+00
-5.000000000000000000e+00,4.000000000000000000e+00,2.000000000000000000e+00,-7.000000000000000000e+00
-6.000000000000000000e+00,-7.000000000000000000e+00,1.000000000000000000e+00,-3.000000000000000000e+00
-2.000000000000000000e+00,2.000000000000000000e+00,-4.000000000000000000e+00,6.000000000000000000e+00
-5.000000000000000000e+00,3.000000000000000000e+00,-3.000000000000000000e+00,2.000000000000000000e+00
-4.000000000000000000e+00,0.000000000000000000e+00,-6.000000000000000000e+00,2.000000000000000000e+00
--1.000000000000000000e+00,4.000000000000000000e+00,-5.000000000000000000e+00,-1.000000000000000000e+00
-4.000000000000000000e+00,5.000000000000000000e+00,-3.000000000000000000e+00,-1.000000000000000000e+00
--2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+# 1,15,15,4
+1.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+3.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00
+1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00

+ 5 - 5
CMSIS/NN/Tests/UnitTest/PregeneratedData/kernel1x1/kernel.txt

@@ -1,5 +1,5 @@
-# 1,1,4,1
-4.000000000000000000e+00
--2.000000000000000000e+00
-0.000000000000000000e+00
-5.000000000000000000e+00
+# 1,1,4,17
+1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00
+2.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00
+1.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
+2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,2.000000000000000000e+00,1.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00

+ 3 - 3
CMSIS/NN/Tests/UnitTest/PregeneratedData/kernel1x1/params.txt

@@ -1,7 +1,7 @@
 4
-1
-8
-8
+17
+15
+15
 1
 1
 1

+ 18 - 2
CMSIS/NN/Tests/UnitTest/TestCases/TestData/kernel1x1/biases_data.h

@@ -21,7 +21,23 @@
 // Generated by generate_test_data.py
 #include <stdint.h>
 
-const int32_t kernel1x1_biases[1] =
+const int32_t kernel1x1_biases[17] =
 {
-  203
+  2159,
+  6477,
+  6477,
+  6477,
+  4318,
+  6477,
+  2159,
+  4318,
+  2159,
+  6477,
+  2159,
+  2159,
+  4318,
+  9716,
+  6477,
+  3238,
+  6477
 };

+ 9 - 9
CMSIS/NN/Tests/UnitTest/TestCases/TestData/kernel1x1/config_data.h

@@ -19,22 +19,22 @@
 
 #pragma once
 // Generated by generate_test_data.py
-#define KERNEL1X1_OUT_CH 1
+#define KERNEL1X1_OUT_CH 17
 #define KERNEL1X1_IN_CH 4
-#define KERNEL1X1_CONV_W 8
-#define KERNEL1X1_CONV_H 8
+#define KERNEL1X1_CONV_W 15
+#define KERNEL1X1_CONV_H 15
 #define KERNEL1X1_FILTER_X 1
 #define KERNEL1X1_FILTER_Y 1
 #define KERNEL1X1_STRIDE_X 1
 #define KERNEL1X1_STRIDE_Y 1
 #define KERNEL1X1_PAD_X 0
 #define KERNEL1X1_PAD_Y 0
-#define KERNEL1X1_OUT_CONV_W 8
-#define KERNEL1X1_OUT_CONV_H 8
-#define KERNEL1X1_DST_SIZE 64
-#define KERNEL1X1_INPUT_SIZE 256
-#define KERNEL1X1_INPUT_OFFSET 0
-#define KERNEL1X1_OUTPUT_OFFSET 0
+#define KERNEL1X1_OUT_CONV_W 15
+#define KERNEL1X1_OUT_CONV_H 15
+#define KERNEL1X1_DST_SIZE 3825
+#define KERNEL1X1_INPUT_SIZE 900
+#define KERNEL1X1_INPUT_OFFSET 128
+#define KERNEL1X1_OUTPUT_OFFSET -1
 #define KERNEL1X1_OUT_ACTIVATION_MIN -128
 #define KERNEL1X1_OUT_ACTIVATION_MAX 127
 #define KERNEL1X1_INPUT_BATCHES 1

+ 901 - 257
CMSIS/NN/Tests/UnitTest/TestCases/TestData/kernel1x1/input_data.h

@@ -21,262 +21,906 @@
 // Generated by generate_test_data.py
 #include <stdint.h>
 
-const q7_t kernel1x1_input[256] =
+const q7_t kernel1x1_input[900] =
 {
-  0,
-  -2,
-  -10,
-  -12,
-  2,
-  -10,
-  0,
-  10,
-  4,
-  -12,
-  2,
-  -2,
-  12,
-  -4,
-  -2,
-  4,
-  12,
-  10,
-  12,
-  -2,
-  4,
-  -4,
-  8,
-  8,
-  6,
-  -10,
-  -12,
-  6,
-  -8,
-  -8,
-  -12,
-  -6,
-  -12,
-  10,
-  -6,
-  4,
-  0,
-  -4,
-  0,
-  -10,
-  -6,
-  -4,
-  2,
-  8,
-  4,
-  8,
-  -6,
-  -10,
-  8,
-  2,
-  -2,
-  12,
-  -2,
-  8,
-  -14,
-  12,
-  -14,
-  2,
-  -6,
-  -6,
-  -12,
-  6,
-  -12,
-  -2,
-  -8,
-  2,
-  -12,
-  -6,
-  12,
-  6,
-  -6,
-  -2,
-  -10,
-  2,
-  -8,
-  -14,
-  0,
-  -8,
-  -10,
-  4,
-  0,
-  8,
-  -6,
-  -6,
-  2,
-  0,
-  -8,
-  -8,
-  -8,
-  12,
-  -10,
-  -2,
-  -10,
-  -4,
-  2,
-  -10,
-  6,
-  -14,
-  -14,
-  8,
-  -12,
-  -14,
-  8,
-  4,
-  0,
-  -12,
-  -14,
-  8,
-  -8,
-  0,
-  12,
-  10,
-  8,
-  -2,
-  -4,
-  8,
-  -4,
-  -12,
-  -6,
-  4,
-  10,
-  -10,
-  2,
-  -14,
-  -2,
-  4,
-  -12,
-  6,
-  -6,
-  -6,
-  -6,
-  10,
-  2,
-  -4,
-  -6,
-  12,
-  2,
-  6,
-  10,
-  -12,
-  -2,
-  -2,
-  4,
-  12,
-  -10,
-  -6,
-  6,
-  -2,
-  -12,
-  -12,
-  -12,
-  8,
-  10,
-  0,
-  -6,
-  0,
-  2,
-  12,
-  -8,
-  -2,
-  -10,
-  -2,
-  -4,
-  10,
-  -10,
-  -14,
-  6,
-  -12,
-  10,
-  2,
-  6,
-  -14,
-  8,
-  10,
-  6,
-  2,
-  4,
-  0,
-  -10,
-  8,
-  -2,
-  12,
-  -10,
-  -2,
-  -14,
-  -8,
-  8,
-  8,
-  6,
-  4,
-  8,
-  12,
-  10,
-  12,
-  -12,
-  10,
-  -14,
-  0,
-  0,
-  -12,
-  -10,
-  8,
-  12,
-  6,
-  2,
-  2,
-  4,
-  -4,
-  6,
-  -2,
-  -6,
-  6,
-  4,
-  0,
-  -8,
-  -2,
-  -4,
-  -8,
-  12,
-  10,
-  12,
-  -14,
-  -8,
-  -4,
-  10,
-  8,
-  4,
-  -14,
-  12,
-  -14,
-  2,
-  -6,
-  4,
-  4,
-  -8,
-  12,
-  10,
-  6,
-  -6,
-  4,
-  8,
-  0,
-  -12,
-  4,
-  -2,
-  8,
-  -10,
-  -2,
-  8,
-  10,
-  -6,
-  -2,
-  -4,
-  4,
-  2,
-  2
+  -77,
+  -26,
+  -26,
+  -77,
+  -77,
+  -77,
+  -26,
+  25,
+  -26,
+  25,
+  -77,
+  -26,
+  -26,
+  -26,
+  -77,
+  25,
+  -26,
+  25,
+  -26,
+  -77,
+  25,
+  -77,
+  25,
+  25,
+  25,
+  -26,
+  25,
+  -77,
+  25,
+  -77,
+  -77,
+  -77,
+  25,
+  -26,
+  -26,
+  -26,
+  -26,
+  25,
+  -26,
+  -77,
+  -77,
+  -77,
+  25,
+  -77,
+  -26,
+  -77,
+  25,
+  25,
+  -77,
+  -26,
+  -77,
+  -26,
+  -77,
+  25,
+  25,
+  -77,
+  -77,
+  25,
+  25,
+  -26,
+  -77,
+  -26,
+  -77,
+  -26,
+  -26,
+  -26,
+  -77,
+  25,
+  25,
+  -77,
+  -26,
+  25,
+  -26,
+  -26,
+  -77,
+  25,
+  -26,
+  -77,
+  -77,
+  -26,
+  -26,
+  -77,
+  -77,
+  -26,
+  25,
+  25,
+  -26,
+  25,
+  -77,
+  -77,
+  25,
+  25,
+  25,
+  -77,
+  -77,
+  -26,
+  -26,
+  25,
+  25,
+  -26,
+  25,
+  -26,
+  -26,
+  25,
+  25,
+  25,
+  25,
+  25,
+  -26,
+  25,
+  -77,
+  -26,
+  -77,
+  -26,
+  25,
+  25,
+  -77,
+  -26,
+  -26,
+  -26,
+  -77,
+  25,
+  -77,
+  -26,
+  -26,
+  -26,
+  25,
+  25,
+  25,
+  25,
+  -77,
+  -26,
+  -77,
+  -77,
+  -77,
+  25,
+  25,
+  -26,
+  25,
+  -77,
+  -77,
+  -26,
+  25,
+  -77,
+  -26,
+  -26,
+  25,
+  -26,
+  -77,
+  25,
+  -77,
+  25,
+  25,
+  -26,
+  -77,
+  -26,
+  -26,
+  -77,
+  25,
+  -26,
+  -77,
+  25,
+  -77,
+  -77,
+  25,
+  25,
+  -26,
+  -26,
+  25,
+  25,
+  -26,
+  -77,
+  -77,
+  -26,
+  -26,
+  -77,
+  -26,
+  -77,
+  -26,
+  25,
+  -77,
+  -26,
+  -26,
+  -77,
+  -26,
+  25,
+  -77,
+  25,
+  -77,
+  25,
+  -26,
+  -26,
+  -77,
+  25,
+  -26,
+  -77,
+  25,
+  -77,
+  -77,
+  -77,
+  25,
+  -26,
+  25,
+  25,
+  -77,
+  -77,
+  -77,
+  -26,
+  25,
+  -77,
+  -26,
+  -26,
+  -77,
+  -26,
+  -77,
+  -77,
+  -26,
+  -77,
+  -77,
+  -77,
+  -77,
+  -77,
+  -77,
+  -26,
+  25,
+  -26,
+  -26,
+  -77,
+  25,
+  -77,
+  25,
+  -26,
+  -77,
+  -26,
+  -77,
+  25,
+  25,
+  -77,
+  25,
+  -26,
+  25,
+  25,
+  25,
+  -77,
+  -26,
+  -77,
+  -77,
+  25,
+  -26,
+  -26,
+  -26,
+  -77,
+  -77,
+  -77,
+  -77,
+  -77,
+  -26,
+  25,
+  -26,
+  25,
+  -77,
+  25,
+  -26,
+  25,
+  -26,
+  -77,
+  25,
+  -77,
+  25,
+  -26,
+  25,
+  -77,
+  -77,
+  -77,
+  -26,
+  25,
+  -26,
+  -26,
+  -26,
+  -26,
+  -77,
+  -77,
+  25,
+  25,
+  -26,
+  25,
+  25,
+  25,
+  -26,
+  -26,
+  -26,
+  -26,
+  -77,
+  -77,
+  25,
+  -77,
+  -77,
+  25,
+  25,
+  -77,
+  -77,
+  -77,
+  -77,
+  25,
+  -26,
+  -26,
+  -77,
+  25,
+  25,
+  25,
+  -77,
+  -26,
+  25,
+  25,
+  -77,
+  -77,
+  25,
+  25,
+  -26,
+  -77,
+  25,
+  25,
+  25,
+  -26,
+  25,
+  25,
+  -26,
+  -77,
+  -26,
+  -77,
+  25,
+  -77,
+  25,
+  -77,
+  25,
+  25,
+  25,
+  -26,
+  25,
+  25,
+  25,
+  -77,
+  -26,
+  -77,
+  -77,
+  -26,
+  25,
+  -77,
+  25,
+  25,
+  -77,
+  25,
+  25,
+  -77,
+  -77,
+  -26,
+  25,
+  25,
+  25,
+  -26,
+  -77,
+  25,
+  25,
+  -77,
+  -26,
+  -26,
+  -77,
+  -26,
+  -26,
+  -26,
+  -26,
+  25,
+  -26,
+  -26,
+  -26,
+  -26,
+  -77,
+  25,
+  25,
+  -26,
+  25,
+  -26,
+  -26,
+  -26,
+  -77,
+  25,
+  -26,
+  -26,
+  -26,
+  25,
+  -77,
+  -77,
+  -77,
+  -77,
+  -26,
+  -77,
+  -77,
+  25,
+  -26,
+  -77,
+  25,
+  25,
+  -77,
+  -77,
+  -77,
+  25,
+  25,
+  -26,
+  -26,
+  -77,
+  -77,
+  -26,
+  -77,
+  25,
+  -77,
+  -26,
+  25,
+  25,
+  25,
+  -77,
+  -26,
+  25,
+  -77,
+  -77,
+  25,
+  -26,
+  -26,
+  25,
+  -26,
+  -77,
+  -26,
+  -26,
+  -26,
+  -77,
+  -77,
+  -77,
+  -26,
+  -26,
+  -26,
+  -26,
+  25,
+  -26,
+  25,
+  -26,
+  -26,
+  -77,
+  25,
+  -26,
+  -77,
+  25,
+  -26,
+  -77,
+  -26,
+  -26,
+  -77,
+  -77,
+  -77,
+  25,
+  25,
+  -26,
+  25,
+  25,
+  -26,
+  -77,
+  25,
+  25,
+  -26,
+  -77,
+  -26,
+  25,
+  -26,
+  25,
+  -77,
+  -26,
+  -77,
+  25,
+  -77,
+  -77,
+  -26,
+  -26,
+  25,
+  -26,
+  -77,
+  -26,
+  25,
+  25,
+  -77,
+  -77,
+  25,
+  25,
+  25,
+  -26,
+  -77,
+  -77,
+  -77,
+  25,
+  -26,
+  25,
+  25,
+  -77,
+  -77,
+  -77,
+  25,
+  -77,
+  -77,
+  -26,
+  -26,
+  -26,
+  25,
+  -26,
+  -26,
+  25,
+  -26,
+  -77,
+  -77,
+  25,
+  -77,
+  -26,
+  -26,
+  25,
+  25,
+  25,
+  25,
+  25,
+  -77,
+  25,
+  -77,
+  25,
+  -26,
+  25,
+  -77,
+  25,
+  25,
+  -77,
+  -77,
+  -26,
+  -77,
+  -77,
+  25,
+  25,
+  -26,
+  -77,
+  -77,
+  25,
+  -77,
+  -26,
+  -26,
+  -26,
+  -26,
+  -77,
+  25,
+  -77,
+  -26,
+  25,
+  -26,
+  25,
+  25,
+  25,
+  25,
+  -26,
+  -77,
+  -77,
+  25,
+  -26,
+  -26,
+  25,
+  25,
+  -26,
+  25,
+  -26,
+  -26,
+  -26,
+  -26,
+  -26,
+  -26,
+  -26,
+  25,
+  25,
+  25,
+  25,
+  -26,
+  -77,
+  -26,
+  -77,
+  25,
+  -26,
+  -77,
+  -26,
+  25,
+  -26,
+  -26,
+  25,
+  25,
+  25,
+  -77,
+  -26,
+  25,
+  25,
+  -77,
+  25,
+  -77,
+  -26,
+  -26,
+  -77,
+  25,
+  -77,
+  -26,
+  -77,
+  -77,
+  25,
+  -26,
+  -77,
+  25,
+  -77,
+  -77,
+  25,
+  -77,
+  -26,
+  -26,
+  -26,
+  25,
+  25,
+  -77,
+  -26,
+  -26,
+  25,
+  -26,
+  -77,
+  -77,
+  -26,
+  -26,
+  -77,
+  -77,
+  25,
+  -26,
+  25,
+  -77,
+  -26,
+  -77,
+  -77,
+  -77,
+  -77,
+  -26,
+  -77,
+  -77,
+  25,
+  -26,
+  25,
+  -26,
+  -77,
+  -77,
+  -26,
+  -77,
+  25,
+  -26,
+  25,
+  -26,
+  25,
+  -77,
+  25,
+  -77,
+  -77,
+  -77,
+  -26,
+  -77,
+  -77,
+  25,
+  -77,
+  25,
+  -77,
+  25,
+  -26,
+  25,
+  -77,
+  -77,
+  -77,
+  -77,
+  -77,
+  -77,
+  -26,
+  -26,
+  25,
+  -77,
+  -77,
+  25,
+  25,
+  -26,
+  25,
+  25,
+  -26,
+  -26,
+  25,
+  -77,
+  -26,
+  25,
+  25,
+  -77,
+  -77,
+  25,
+  -26,
+  -26,
+  -26,
+  -26,
+  -77,
+  -77,
+  -77,
+  -26,
+  -26,
+  -26,
+  -77,
+  -77,
+  25,
+  25,
+  25,
+  -26,
+  -26,
+  25,
+  -77,
+  -26,
+  -26,
+  -77,
+  -77,
+  -26,
+  -77,
+  -26,
+  -26,
+  -26,
+  -26,
+  25,
+  -77,
+  -26,
+  -26,
+  25,
+  -77,
+  25,
+  -26,
+  25,
+  -26,
+  -26,
+  -26,
+  -26,
+  -26,
+  -26,
+  -26,
+  -77,
+  -77,
+  25,
+  -26,
+  -77,
+  -26,
+  -77,
+  -26,
+  25,
+  25,
+  25,
+  25,
+  -77,
+  -26,
+  25,
+  25,
+  25,
+  -77,
+  -77,
+  -26,
+  -77,
+  25,
+  25,
+  -77,
+  25,
+  25,
+  -26,
+  -26,
+  25,
+  -26,
+  -77,
+  -77,
+  -77,
+  25,
+  -26,
+  25,
+  -77,
+  -77,
+  -77,
+  25,
+  25,
+  25,
+  25,
+  -26,
+  25,
+  -77,
+  25,
+  -26,
+  -77,
+  -77,
+  -77,
+  -26,
+  25,
+  -26,
+  -77,
+  25,
+  -77,
+  -26,
+  -77,
+  -77,
+  -77,
+  25,
+  -77,
+  25,
+  -26,
+  -77,
+  -77,
+  -26,
+  -26,
+  -26,
+  -77,
+  -77,
+  25,
+  -26,
+  25,
+  -77,
+  -77,
+  -77,
+  25,
+  -26,
+  -26,
+  25,
+  -77,
+  -77,
+  -77,
+  -77,
+  -26,
+  -77,
+  25,
+  -26,
+  -26,
+  -77,
+  -26,
+  25,
+  25,
+  -26,
+  -77,
+  -77,
+  -77,
+  -26,
+  25,
+  -77,
+  -77,
+  -77,
+  -77,
+  25,
+  -77,
+  -77,
+  25,
+  -26,
+  -77,
+  -26,
+  -77,
+  -26,
+  25,
+  25,
+  -26,
+  -77,
+  25,
+  -26,
+  25,
+  25,
+  -77,
+  25,
+  -26,
+  -77,
+  -26,
+  -77,
+  25,
+  -26,
+  25,
+  -26,
+  -77,
+  -77,
+  -77,
+  -26,
+  -26,
+  25,
+  -77,
+  25,
+  -26,
+  25,
+  25,
+  25,
+  -77,
+  -77,
+  -26,
+  -77,
+  -77,
+  -26,
+  25,
+  -26,
+  -26,
+  -26,
+  -26,
+  -26
 };

+ 18 - 2
CMSIS/NN/Tests/UnitTest/TestCases/TestData/kernel1x1/output_mult_data.h

@@ -21,7 +21,23 @@
 // Generated by generate_test_data.py
 #include <stdint.h>
 
-const int32_t kernel1x1_output_mult[1] =
+const int32_t kernel1x1_output_mult[17] =
 {
-  1352745605
+  2053179100,
+  2053179100,
+  2053179100,
+  2053179100,
+  2053179100,
+  2053179100,
+  2053179100,
+  2053179100,
+  2053179100,
+  2053179100,
+  2053179100,
+  2053179100,
+  2053179100,
+  1368786067,
+  2053179100,
+  1368786067,
+  2053179100
 };

+ 3809 - 48
CMSIS/NN/Tests/UnitTest/TestCases/TestData/kernel1x1/output_ref_data.h

@@ -21,70 +21,3831 @@
 // Generated by generate_test_data.py
 #include <stdint.h>
 
-const q7_t kernel1x1_output_ref[64] =
+const q7_t kernel1x1_output_ref[3825] =
 {
-  -24,
-  43,
+  10,
+  14,
+  17,
+  12,
+  16,
+  13,
+  16,
+  13,
+  9,
+  15,
+  10,
+  14,
+  10,
+  11,
+  15,
+  10,
+  15,
+  15,
+  18,
+  21,
+  17,
+  20,
+  18,
+  19,
+  12,
+  14,
+  17,
+  15,
+  17,
+  13,
+  12,
+  15,
+  10,
+  20,
+  13,
+  18,
+  21,
+  15,
+  20,
+  17,
+  20,
+  16,
+  14,
+  20,
+  13,
+  22,
+  15,
+  13,
+  17,
+  12,
+  18,
+  15,
+  19,
+  22,
+  17,
+  21,
+  19,
+  20,
+  14,
+  16,
+  20,
+  15,
+  22,
+  16,
+  13,
+  16,
+  11,
+  20,
+  12,
+  17,
+  21,
+  14,
+  20,
+  16,
+  20,
+  17,
+  12,
+  20,
+  12,
+  20,
+  14,
+  14,
+  19,
+  13,
+  18,
+  19,
+  22,
+  28,
+  21,
+  27,
+  24,
+  24,
+  16,
+  19,
+  25,
+  19,
+  24,
+  20,
+  18,
+  22,
+  14,
+  27,
+  14,
+  18,
+  24,
+  16,
+  23,
+  19,
+  21,
+  17,
+  14,
+  23,
+  14,
+  21,
+  17,
+  17,
+  22,
+  14,
+  22,
+  9,
+  12,
+  16,
+  11,
+  15,
+  14,
+  12,
+  10,
+  11,
+  17,
+  9,
+  16,
+  14,
+  12,
+  14,
+  8,
+  15,
+  15,
+  19,
+  24,
+  17,
+  23,
+  20,
+  21,
+  16,
+  16,
+  23,
+  15,
+  23,
+  18,
+  16,
+  20,
+  13,
+  22,
+  12,
+  17,
+  21,
+  14,
+  20,
+  16,
+  20,
+  17,
+  12,
+  20,
+  12,
+  20,
+  14,
+  14,
+  19,
+  13,
+  18,
+  11,
+  14,
+  18,
+  13,
+  17,
+  14,
+  16,
+  12,
+  9,
+  15,
+  11,
+  12,
+  10,
+  12,
+  16,
+  10,
+  17,
+  18,
+  21,
+  26,
+  20,
+  25,
+  22,
+  23,
+  15,
+  17,
+  22,
+  18,
+  21,
+  17,
+  16,
+  20,
+  13,
+  25,
+  11,
+  15,
+  17,
+  13,
+  16,
+  14,
+  16,
+  12,
+  11,
+  15,
+  11,
+  16,
+  11,
+  10,
+  13,
+  9,
+  15,
+  13,
+  18,
+  22,
+  15,
+  21,
+  16,
+  22,
+  18,
+  11,
+  19,
+  13,
+  18,
+  12,
+  14,
+  20,
+  14,
+  19,
+  16,
+  21,
+  25,
+  18,
+  24,
+  19,
+  25,
+  19,
+  14,
+  21,
+  16,
+  21,
+  14,
+  15,
+  21,
+  15,
+  22,
+  11,
+  15,
+  17,
+  13,
+  16,
+  14,
+  16,
+  12,
+  11,
+  15,
+  11,
+  16,
+  11,
+  10,
+  13,
+  9,
+  15,
+  15,
+  19,
+  22,
+  17,
+  21,
+  19,
+  20,
+  14,
+  16,
+  20,
+  15,
+  22,
+  16,
+  13,
+  16,
+  11,
+  20,
+  17,
+  20,
+  25,
+  19,
+  24,
+  22,
+  21,
+  14,
+  18,
+  23,
+  17,
+  23,
+  19,
+  16,
+  19,
+  12,
+  24,
+  15,
+  19,
+  22,
+  17,
+  21,
+  19,
+  20,
+  14,
+  16,
+  20,
+  15,
+  22,
+  16,
+  13,
+  16,
+  11,
+  20,
+  11,
+  14,
+  17,
+  13,
+  16,
+  15,
+  14,
+  10,
+  12,
+  16,
+  11,
+  16,
+  13,
+  11,
+  13,
+  8,
+  16,
+  11,
+  14,
+  17,
+  13,
+  16,
+  15,
+  14,
+  10,
+  12,
+  16,
+  11,
+  16,
+  13,
+  11,
+  13,
+  8,
+  16,
+  19,
+  24,
+  29,
+  21,
+  28,
+  24,
+  27,
+  20,
+  20,
+  27,
+  19,
+  29,
+  21,
+  18,
+  23,
+  16,
+  26,
+  17,
+  20,
+  24,
+  19,
+  23,
+  20,
+  22,
+  14,
+  15,
+  19,
+  17,
+  18,
+  14,
+  14,
+  18,
+  12,
+  23,
+  12,
+  15,
+  19,
+  14,
+  18,
+  17,
+  15,
+  11,
+  14,
+  19,
+  12,
+  19,
+  16,
+  13,
+  15,
+  9,
+  18,
+  17,
+  22,
+  27,
+  19,
+  26,
+  21,
+  26,
+  20,
+  16,
+  24,
+  17,
+  24,
+  17,
+  17,
+  23,
+  16,
+  24,
+  18,
+  22,
+  27,
+  20,
+  26,
+  23,
+  24,
+  17,
+  19,
+  25,
+  18,
+  26,
+  20,
+  17,
+  21,
+  14,
+  25,
+  21,
+  26,
+  32,
+  23,
+  31,
+  26,
+  30,
+  22,
+  21,
+  29,
+  21,
+  30,
+  22,
+  20,
+  26,
+  18,
+  29,
+  13,
+  18,
+  21,
+  15,
+  20,
+  17,
+  20,
+  16,
+  14,
+  20,
+  13,
+  22,
+  15,
+  13,
+  17,
+  12,
+  18,
+  18,
+  22,
+  26,
+  20,
+  25,
+  21,
+  25,
+  17,
+  16,
+  21,
+  18,
+  21,
+  15,
+  15,
+  20,
+  14,
+  24,
+  13,
+  17,
+  20,
+  15,
+  19,
+  16,
+  19,
+  14,
+  12,
+  17,
+  13,
+  17,
+  12,
+  12,
+  16,
+  11,
+  18,
+  12,
+  17,
+  19,
+  14,
+  18,
+  15,
+  19,
+  15,
+  12,
+  17,
+  12,
+  19,
+  12,
+  11,
+  15,
+  11,
+  16,
+  19,
+  23,
+  28,
+  21,
+  27,
+  23,
+  26,
+  18,
+  18,
+  24,
+  19,
+  24,
+  18,
+  17,
+  22,
+  15,
+  26,
+  14,
+  19,
+  23,
+  16,
+  22,
+  19,
+  21,
+  17,
+  16,
+  23,
+  14,
+  25,
+  18,
+  15,
+  19,
+  13,
+  20,
+  13,
+  16,
+  18,
+  15,
+  17,
+  16,
+  16,
+  10,
+  13,
+  15,
+  13,
+  16,
+  12,
+  10,
+  12,
+  8,
+  17,
+  14,
+  18,
+  24,
+  16,
+  23,
+  19,
+  21,
+  17,
+  14,
+  23,
+  14,
+  21,
+  17,
+  17,
+  22,
+  14,
+  22,
+  12,
+  16,
+  20,
+  14,
+  19,
+  15,
+  19,
+  15,
+  10,
+  17,
+  12,
+  15,
+  11,
+  13,
+  18,
+  12,
+  18,
+  16,
+  20,
+  25,
+  18,
+  24,
+  20,
+  23,
+  17,
+  15,
+  22,
+  16,
+  21,
+  16,
+  16,
+  21,
+  14,
+  23,
+  15,
+  20,
+  22,
+  17,
+  21,
+  18,
+  22,
+  16,
+  15,
+  19,
+  15,
+  22,
+  14,
+  12,
+  16,
+  12,
+  19,
+  13,
+  17,
+  21,
+  15,
+  20,
+  18,
+  18,
+  14,
+  15,
+  21,
+  13,
+  22,
+  17,
+  14,
+  17,
+  11,
+  19,
+  15,
+  18,
+  23,
+  17,
+  22,
+  19,
+  20,
+  14,
+  14,
+  20,
+  15,
+  18,
+  15,
+  15,
+  19,
+  12,
+  22,
+  9,
+  14,
+  16,
+  11,
+  15,
+  12,
+  16,
+  14,
+  9,
+  15,
+  9,
+  16,
+  10,
+  10,
+  14,
+  10,
+  13,
+  16,
+  21,
+  26,
+  18,
+  25,
+  21,
+  24,
+  19,
+  17,
+  25,
+  16,
+  26,
+  19,
+  17,
+  22,
+  15,
+  23,
+  13,
+  18,
+  23,
+  15,
+  22,
+  18,
+  21,
+  18,
+  14,
+  23,
+  13,
+  23,
+  17,
+  16,
+  21,
+  14,
+  20,
+  10,
+  14,
+  17,
+  12,
+  16,
+  13,
+  16,
+  13,
+  9,
+  15,
+  10,
+  14,
+  10,
+  11,
+  15,
+  10,
+  15,
+  16,
+  19,
+  23,
+  18,
+  22,
+  20,
+  20,
+  13,
+  16,
+  20,
+  16,
+  20,
+  16,
+  14,
+  17,
+  11,
+  22,
+  10,
+  14,
+  17,
+  12,
+  16,
+  13,
+  16,
+  13,
+  9,
+  15,
+  10,
+  14,
+  10,
+  11,
+  15,
+  10,
+  15,
+  16,
+  21,
+  24,
+  18,
+  23,
+  20,
+  23,
+  17,
+  17,
+  22,
+  16,
+  25,
+  17,
+  14,
+  18,
+  13,
+  21,
+  14,
+  19,
+  22,
+  16,
+  21,
+  17,
+  22,
+  17,
+  13,
+  19,
+  14,
+  20,
+  13,
+  13,
+  18,
+  13,
+  19,
+  11,
+  16,
+  19,
+  13,
+  18,
+  14,
+  19,
+  16,
+  10,
+  17,
+  11,
+  17,
+  11,
+  12,
+  17,
+  12,
+  16,
+  9,
+  12,
+  16,
+  11,
+  15,
+  14,
+  12,
+  10,
+  11,
+  17,
+  9,
+  16,
+  14,
+  12,
+  14,
+  8,
+  15,
+  20,
+  24,
+  30,
+  22,
+  29,
+  25,
+  27,
+  19,
+  20,
+  27,
+  20,
+  27,
+  21,
+  19,
+  24,
+  16,
+  28,
+  10,
+  13,
+  15,
+  12,
+  14,
+  13,
+  13,
+  9,
+  10,
+  13,
+  10,
+  13,
+  10,
+  9,
+  11,
+  7,
+  14,
+  14,
+  17,
+  22,
+  16,
+  21,
+  19,
+  18,
+  13,
+  15,
+  21,
+  14,
+  20,
+  17,
+  15,
+  18,
+  11,
+  21,
+  8,
+  12,
+  14,
+  10,
+  13,
+  11,
+  13,
+  11,
+  8,
+  13,
+  8,
+  13,
+  9,
+  9,
+  12,
+  8,
+  12,
+  8,
+  11,
+  14,
+  10,
+  13,
+  12,
+  11,
+  9,
+  9,
+  14,
+  8,
+  13,
+  11,
+  10,
+  12,
+  7,
+  13,
+  10,
+  13,
+  15,
+  12,
+  14,
+  13,
+  13,
+  9,
+  10,
+  13,
+  10,
+  13,
+  10,
+  9,
+  11,
+  7,
+  14,
+  12,
+  16,
+  21,
+  14,
+  20,
+  17,
+  18,
+  15,
+  13,
+  21,
+  12,
+  20,
+  16,
+  15,
+  19,
+  12,
+  19,
+  16,
+  19,
+  25,
+  18,
+  24,
+  21,
+  21,
+  15,
+  16,
+  23,
+  16,
+  21,
+  18,
+  17,
+  21,
+  13,
+  24,
+  14,
+  18,
+  20,
+  16,
+  19,
+  17,
+  19,
+  13,
+  14,
+  17,
+  14,
+  19,
+  13,
+  11,
+  14,
+  10,
+  18,
+  16,
+  19,
+  25,
+  18,
+  24,
+  21,
+  21,
+  15,
+  16,
+  23,
+  16,
+  21,
+  18,
+  17,
+  21,
+  13,
+  24,
+  15,
+  20,
+  26,
+  17,
+  25,
+  20,
+  24,
+  20,
+  15,
+  25,
+  15,
+  24,
+  18,
+  18,
+  24,
+  16,
+  23,
+  14,
+  17,
+  20,
+  16,
+  19,
+  18,
+  17,
+  11,
+  15,
+  18,
+  14,
+  19,
+  15,
+  12,
+  14,
+  9,
+  19,
+  11,
+  15,
+  19,
+  13,
+  18,
+  15,
+  17,
+  14,
+  11,
+  18,
+  11,
+  17,
+  13,
+  13,
+  17,
+  11,
+  17,
+  7,
+  10,
+  12,
+  9,
+  11,
+  10,
+  10,
+  8,
+  7,
+  11,
+  7,
+  10,
+  8,
+  8,
+  10,
+  6,
+  11,
+  18,
+  23,
+  27,
+  20,
+  26,
+  22,
+  26,
+  19,
+  18,
+  24,
+  18,
+  26,
+  18,
+  16,
+  21,
+  15,
+  24,
+  17,
+  22,
+  25,
+  19,
+  24,
+  20,
+  25,
+  18,
+  16,
+  21,
+  17,
+  23,
+  15,
+  14,
+  19,
+  14,
+  22,
+  12,
+  15,
+  20,
+  14,
+  19,
+  16,
+  17,
+  13,
+  11,
+  18,
+  12,
+  15,
+  13,
+  14,
+  18,
+  11,
+  19,
+  14,
+  18,
+  24,
+  16,
+  23,
+  19,
+  21,
+  17,
+  14,
+  23,
+  14,
+  21,
+  17,
+  17,
+  22,
+  14,
+  22,
+  15,
+  18,
+  21,
+  17,
+  20,
+  18,
+  19,
+  12,
+  14,
+  17,
+  15,
+  17,
+  13,
+  12,
+  15,
+  10,
+  20,
+  14,
+  18,
+  22,
+  16,
+  21,
+  18,
+  20,
+  15,
+  14,
+  20,
+  14,
+  20,
+  15,
+  14,
+  18,
+  12,
+  20,
+  17,
+  20,
+  24,
+  19,
+  23,
+  20,
+  22,
+  14,
+  15,
+  19,
+  17,
+  18,
+  14,
+  14,
+  18,
+  12,
+  23,
+  20,
+  25,
+  30,
+  22,
+  29,
+  24,
+  29,
+  21,
+  19,
+  26,
+  20,
+  27,
+  19,
+  18,
+  24,
+  17,
+  27,
+  14,
+  18,
+  22,
+  16,
+  21,
+  18,
+  20,
+  15,
+  14,
+  20,
+  14,
+  20,
+  15,
+  14,
+  18,
+  12,
+  20,
+  11,
+  14,
+  18,
+  13,
+  17,
+  14,
+  16,
+  12,
+  9,
+  15,
+  11,
+  12,
+  10,
+  12,
+  16,
+  10,
+  17,
+  13,
+  18,
+  22,
+  15,
+  21,
+  16,
+  22,
+  18,
+  11,
+  19,
+  13,
+  18,
+  12,
+  14,
+  20,
+  14,
+  19,
+  13,
+  16,
+  18,
+  15,
+  17,
+  16,
+  16,
+  10,
+  13,
+  15,
+  13,
+  16,
+  12,
+  10,
+  12,
+  8,
+  17,
+  15,
+  19,
+  22,
+  17,
+  21,
+  19,
+  20,
+  14,
+  16,
+  20,
+  15,
+  22,
+  16,
+  13,
+  16,
+  11,
+  20,
+  14,
+  19,
+  23,
+  16,
+  22,
+  19,
+  21,
+  17,
+  16,
+  23,
+  14,
+  25,
+  18,
+  15,
+  19,
+  13,
+  20,
+  11,
+  16,
+  20,
+  13,
+  19,
+  16,
+  18,
+  16,
+  13,
+  21,
+  11,
+  22,
+  16,
+  14,
+  18,
+  12,
+  17,
+  13,
+  18,
+  23,
+  15,
+  22,
+  18,
+  21,
+  18,
+  14,
+  23,
+  13,
+  23,
+  17,
+  16,
+  21,
+  14,
+  20,
+  18,
+  23,
+  29,
+  20,
+  28,
+  23,
+  27,
+  21,
+  18,
+  27,
+  18,
+  27,
+  20,
+  19,
+  25,
+  17,
+  26,
+  13,
+  18,
+  23,
+  15,
+  22,
+  18,
+  21,
+  18,
+  14,
+  23,
+  13,
+  23,
+  17,
+  16,
+  21,
+  14,
+  20,
+  12,
+  15,
+  20,
+  14,
+  19,
+  16,
+  17,
+  13,
+  11,
+  18,
+  12,
+  15,
+  13,
+  14,
+  18,
+  11,
+  19,
+  19,
+  22,
+  28,
+  21,
+  27,
+  24,
+  24,
+  16,
+  19,
+  25,
+  19,
+  24,
+  20,
+  18,
+  22,
+  14,
+  27,
+  20,
+  24,
+  30,
+  22,
+  29,
+  25,
+  27,
+  19,
+  20,
+  27,
+  20,
+  27,
+  21,
+  19,
+  24,
+  16,
+  28,
+  11,
+  14,
+  19,
+  13,
+  18,
+  16,
+  15,
+  12,
+  12,
+  19,
+  11,
+  17,
+  15,
+  14,
+  17,
+  10,
+  18,
+  12,
+  16,
+  20,
+  14,
+  19,
+  15,
+  19,
+  15,
+  10,
+  17,
+  12,
+  15,
+  11,
+  13,
+  18,
+  12,
+  18,
+  17,
+  22,
+  26,
+  19,
+  25,
+  22,
+  24,
+  18,
+  19,
+  25,
+  17,
+  28,
+  20,
+  16,
+  20,
+  14,
+  23,
+  12,
+  15,
+  19,
+  14,
+  18,
+  17,
+  15,
+  11,
+  14,
+  19,
+  12,
+  19,
+  16,
+  13,
+  15,
+  9,
+  18,
+  18,
+  23,
+  29,
+  20,
+  28,
+  23,
+  27,
+  21,
+  18,
+  27,
+  18,
+  27,
+  20,
+  19,
+  25,
+  17,
+  26,
+  13,
+  18,
+  22,
+  15,
+  21,
+  16,
+  22,
+  18,
+  11,
+  19,
+  13,
+  18,
+  12,
+  14,
+  20,
+  14,
+  19,
+  12,
+  16,
+  19,
+  14,
+  18,
+  16,
+  17,
+  13,
+  13,
+  18,
+  12,
+  19,
+  14,
+  12,
+  15,
+  10,
+  17,
+  17,
+  21,
+  25,
+  19,
+  24,
+  21,
+  23,
+  16,
+  17,
+  22,
+  17,
+  23,
+  17,
+  15,
+  19,
+  13,
+  23,
+  14,
+  18,
+  22,
+  16,
+  21,
+  18,
+  20,
+  15,
+  14,
+  20,
+  14,
+  20,
+  15,
+  14,
+  18,
+  12,
+  20,
+  16,
+  21,
+  25,
+  18,
+  24,
+  19,
+  25,
+  19,
+  14,
+  21,
+  16,
+  21,
+  14,
+  15,
+  21,
+  15,
+  22,
+  15,
+  19,
+  24,
+  17,
+  23,
+  20,
+  21,
+  16,
+  16,
+  23,
+  15,
+  23,
+  18,
+  16,
+  20,
+  13,
+  22,
+  14,
+  19,
+  22,
+  16,
+  21,
+  17,
+  22,
+  17,
+  13,
+  19,
+  14,
+  20,
+  13,
+  13,
+  18,
+  13,
+  19,
+  10,
+  15,
+  18,
+  12,
+  17,
+  14,
+  17,
+  15,
+  11,
+  18,
+  10,
+  19,
+  13,
+  12,
+  16,
+  11,
+  15,
+  9,
+  12,
+  15,
+  11,
+  14,
+  12,
+  13,
+  10,
+  8,
+  13,
+  9,
+  11,
+  9,
+  10,
+  13,
+  8,
+  14,
+  11,
+  16,
+  19,
+  13,
+  18,
+  14,
+  19,
+  16,
+  10,
+  17,
+  11,
+  17,
+  11,
+  12,
+  17,
+  12,
+  16,
+  11,
+  16,
+  20,
+  13,
+  19,
+  16,
+  18,
+  16,
+  13,
+  21,
+  11,
+  22,
+  16,
+  14,
+  18,
+  12,
+  17,
+  16,
+  21,
+  25,
+  18,
+  24,
+  19,
+  25,
+  19,
+  14,
+  21,
+  16,
+  21,
+  14,
+  15,
+  21,
+  15,
+  22,
+  11,
+  14,
+  17,
+  13,
+  16,
+  15,
+  14,
+  10,
+  12,
+  16,
+  11,
+  16,
+  13,
+  11,
+  13,
+  8,
+  16,
+  12,
+  17,
+  19,
+  14,
+  18,
+  15,
+  19,
+  15,
+  12,
+  17,
+  12,
+  19,
+  12,
+  11,
+  15,
+  11,
+  16,
+  15,
+  20,
+  26,
+  17,
+  25,
+  20,
+  24,
+  20,
+  15,
+  25,
+  15,
+  24,
+  18,
+  18,
+  24,
+  16,
+  23,
+  10,
+  15,
+  18,
+  12,
+  17,
+  14,
+  17,
+  15,
+  11,
+  18,
+  10,
+  19,
+  13,
+  12,
+  16,
+  11,
+  15,
+  18,
+  22,
+  27,
+  20,
+  26,
+  23,
+  24,
+  17,
+  19,
+  25,
+  18,
+  26,
+  20,
+  17,
+  21,
+  14,
+  25,
+  13,
+  16,
+  20,
+  15,
+  19,
+  17,
+  17,
+  12,
+  13,
+  18,
+  13,
+  17,
+  14,
+  13,
+  16,
+  10,
+  19,
+  8,
+  11,
+  14,
+  10,
+  13,
+  12,
+  11,
+  9,
+  9,
+  14,
+  8,
+  13,
+  11,
+  10,
+  12,
+  7,
+  13,
+  14,
+  18,
+  22,
+  16,
+  21,
+  18,
+  20,
+  15,
+  14,
+  20,
+  14,
+  20,
+  15,
+  14,
+  18,
+  12,
+  20,
+  17,
+  21,
+  27,
+  19,
+  26,
+  22,
+  24,
+  18,
+  17,
+  25,
+  17,
+  24,
+  19,
+  18,
+  23,
+  15,
+  25,
+  15,
+  18,
+  23,
+  17,
+  22,
+  19,
+  20,
+  14,
+  14,
+  20,
+  15,
+  18,
+  15,
+  15,
+  19,
+  12,
+  22,
+  11,
+  16,
+  19,
+  13,
+  18,
+  14,
+  19,
+  16,
+  10,
+  17,
+  11,
+  17,
+  11,
+  12,
+  17,
+  12,
+  16,
+  9,
+  13,
+  16,
+  11,
+  15,
+  13,
+  14,
+  12,
+  10,
+  16,
+  9,
+  16,
+  12,
+  11,
+  14,
+  9,
+  14,
+  16,
+  21,
+  25,
+  18,
+  24,
+  19,
+  25,
+  19,
+  14,
+  21,
+  16,
+  21,
+  14,
+  15,
+  21,
+  15,
+  22,
+  13,
+  18,
+  23,
+  15,
+  22,
+  18,
+  21,
+  18,
+  14,
+  23,
+  13,
+  23,
+  17,
+  16,
+  21,
+  14,
+  20,
+  13,
+  18,
+  23,
+  15,
+  22,
+  18,
+  21,
+  18,
+  14,
+  23,
+  13,
+  23,
+  17,
+  16,
+  21,
+  14,
+  20,
+  18,
+  23,
+  27,
+  20,
+  26,
+  22,
+  26,
+  19,
+  18,
+  24,
+  18,
+  26,
+  18,
+  16,
+  21,
+  15,
+  24,
+  14,
+  18,
+  20,
+  16,
+  19,
+  17,
+  19,
+  13,
+  14,
+  17,
+  14,
+  19,
+  13,
+  11,
+  14,
+  10,
+  18,
+  12,
+  15,
+  18,
+  14,
+  17,
+  15,
+  16,
+  11,
+  11,
+  15,
+  12,
+  14,
+  11,
+  11,
+  14,
+  9,
+  17,
+  13,
+  17,
+  21,
+  15,
+  20,
+  18,
+  18,
+  14,
+  15,
+  21,
+  13,
+  22,
+  17,
+  14,
+  17,
+  11,
+  19,
+  11,
+  16,
+  20,
+  13,
+  19,
+  16,
+  18,
+  16,
+  13,
+  21,
+  11,
+  22,
+  16,
+  14,
+  18,
+  12,
+  17,
+  18,
+  23,
+  29,
+  20,
+  28,
+  23,
+  27,
+  21,
+  18,
+  27,
+  18,
+  27,
+  20,
+  19,
+  25,
+  17,
+  26,
+  13,
+  16,
+  18,
+  15,
+  17,
+  16,
+  16,
+  10,
+  13,
+  15,
+  13,
+  16,
+  12,
+  10,
+  12,
+  8,
+  17,
+  14,
+  19,
+  24,
+  16,
+  23,
+  18,
+  23,
+  19,
+  13,
+  22,
+  14,
+  21,
+  15,
+  16,
+  22,
+  15,
+  21,
+  11,
+  14,
+  18,
+  13,
+  17,
+  14,
+  16,
+  12,
+  9,
+  15,
+  11,
+  12,
+  10,
+  12,
+  16,
+  10,
+  17,
+  13,
+  17,
+  20,
+  15,
+  19,
+  16,
+  19,
+  14,
+  12,
+  17,
+  13,
+  17,
+  12,
+  12,
+  16,
+  11,
+  18,
+  18,
+  22,
+  27,
+  20,
+  26,
+  23,
+  24,
+  17,
+  19,
+  25,
+  18,
+  26,
+  20,
+  17,
+  21,
+  14,
+  25,
+  14,
+  17,
+  20,
+  16,
+  19,
+  18,
+  17,
+  11,
+  15,
+  18,
+  14,
+  19,
+  15,
+  12,
+  14,
+  9,
+  19,
+  16,
+  20,
+  23,
+  18,
+  22,
+  19,
+  22,
+  15,
+  15,
+  19,
+  16,
+  20,
+  14,
+  13,
+  17,
+  12,
+  21,
+  21,
+  26,
+  32,
+  23,
+  31,
+  26,
+  30,
+  22,
+  21,
+  29,
+  21,
+  30,
+  22,
+  20,
+  26,
+  18,
+  29,
+  15,
+  20,
+  22,
+  17,
+  21,
+  18,
+  22,
+  16,
+  15,
+  19,
+  15,
+  22,
+  14,
+  12,
+  16,
+  12,
+  19,
+  16,
+  21,
+  24,
+  18,
+  23,
+  20,
+  23,
+  17,
+  17,
+  22,
+  16,
+  25,
+  17,
+  14,
+  18,
+  13,
+  21,
+  12,
+  15,
+  19,
+  14,
+  18,
+  17,
+  15,
+  11,
+  14,
+  19,
+  12,
+  19,
+  16,
+  13,
+  15,
+  9,
+  18,
+  17,
+  20,
+  24,
+  19,
+  23,
+  20,
+  22,
+  14,
+  15,
+  19,
+  17,
+  18,
+  14,
+  14,
+  18,
+  12,
+  23,
+  14,
+  17,
+  20,
+  16,
+  19,
+  18,
+  17,
+  11,
+  15,
+  18,
+  14,
+  19,
+  15,
+  12,
+  14,
+  9,
+  19,
+  13,
+  17,
+  20,
+  15,
+  19,
+  16,
+  19,
+  14,
+  12,
+  17,
+  13,
+  17,
+  12,
+  12,
+  16,
+  11,
+  18,
+  12,
+  15,
+  20,
+  14,
+  19,
+  16,
+  17,
+  13,
+  11,
+  18,
+  12,
+  15,
+  13,
+  14,
+  18,
+  11,
+  19,
+  18,
+  23,
+  27,
+  20,
+  26,
+  22,
+  26,
+  19,
+  18,
+  24,
+  18,
+  26,
+  18,
+  16,
+  21,
+  15,
+  24,
+  18,
+  23,
+  29,
+  20,
+  28,
+  23,
+  27,
+  21,
+  18,
+  27,
+  18,
+  27,
+  20,
+  19,
+  25,
+  17,
+  26,
+  14,
+  17,
+  21,
+  16,
+  20,
+  17,
+  19,
+  13,
+  12,
+  17,
+  14,
+  15,
+  12,
+  13,
+  17,
+  11,
+  20,
+  17,
+  22,
+  27,
+  19,
+  26,
+  21,
+  26,
+  20,
+  16,
+  24,
+  17,
+  24,
+  17,
+  17,
+  23,
+  16,
+  24,
+  15,
+  19,
+  24,
+  17,
+  23,
+  20,
+  21,
+  16,
+  16,
+  23,
+  15,
+  23,
+  18,
+  16,
+  20,
+  13,
+  22,
+  14,
+  18,
+  22,
+  16,
+  21,
+  18,
+  20,
+  15,
+  14,
+  20,
+  14,
+  20,
+  15,
+  14,
+  18,
+  12,
+  20,
+  21,
+  26,
+  32,
+  23,
+  31,
+  26,
+  30,
+  22,
+  21,
+  29,
+  21,
+  30,
+  22,
+  20,
+  26,
+  18,
+  29,
+  10,
+  13,
+  17,
+  12,
+  16,
+  14,
+  14,
+  11,
+  10,
+  16,
+  10,
+  14,
+  12,
+  12,
+  15,
+  9,
+  16,
+  13,
+  17,
+  21,
+  15,
+  20,
+  18,
+  18,
+  14,
+  15,
+  21,
+  13,
+  22,
+  17,
+  14,
+  17,
+  11,
+  19,
+  18,
+  22,
+  27,
+  20,
+  26,
+  23,
+  24,
+  17,
+  19,
+  25,
+  18,
+  26,
+  20,
+  17,
+  21,
+  14,
+  25,
+  14,
+  19,
+  23,
+  16,
+  22,
+  19,
+  21,
+  17,
+  16,
+  23,
+  14,
+  25,
+  18,
+  15,
+  19,
+  13,
+  20,
+  17,
+  22,
+  26,
+  19,
+  25,
+  22,
+  24,
+  18,
+  19,
+  25,
+  17,
+  28,
+  20,
+  16,
+  20,
+  14,
+  23,
+  10,
+  14,
+  17,
+  12,
+  16,
+  13,
+  16,
+  13,
+  9,
+  15,
+  10,
+  14,
+  10,
+  11,
+  15,
+  10,
+  15,
+  11,
+  14,
+  19,
+  13,
+  18,
+  16,
+  15,
+  12,
+  12,
+  19,
+  11,
+  17,
+  15,
+  14,
+  17,
+  10,
+  18,
+  11,
+  16,
+  19,
+  13,
+  18,
+  14,
+  19,
+  16,
+  10,
+  17,
+  11,
+  17,
+  11,
+  12,
+  17,
+  12,
+  16,
+  15,
+  18,
+  22,
+  17,
+  21,
+  20,
+  18,
+  12,
+  17,
+  21,
+  15,
+  22,
+  18,
+  14,
+  16,
+  10,
+  21,
+  13,
+  17,
+  20,
+  15,
+  19,
+  16,
+  19,
+  14,
+  12,
+  17,
+  13,
+  17,
+  12,
+  12,
+  16,
+  11,
+  18,
+  14,
+  19,
+  23,
+  16,
+  22,
+  19,
+  21,
+  17,
+  16,
+  23,
+  14,
+  25,
+  18,
+  15,
+  19,
+  13,
+  20,
+  12,
+  17,
+  21,
+  14,
+  20,
+  16,
+  20,
+  17,
+  12,
+  20,
+  12,
+  20,
+  14,
+  14,
+  19,
+  13,
+  18,
+  10,
+  14,
+  17,
+  12,
+  16,
+  13,
+  16,
+  13,
+  9,
+  15,
+  10,
+  14,
+  10,
+  11,
+  15,
+  10,
+  15,
+  17,
+  22,
+  25,
+  19,
+  24,
+  20,
+  25,
+  18,
+  16,
+  21,
+  17,
+  23,
+  15,
+  14,
+  19,
+  14,
+  22,
+  8,
+  12,
+  14,
+  10,
+  13,
+  11,
+  13,
+  11,
+  8,
+  13,
+  8,
+  13,
+  9,
+  9,
+  12,
+  8,
+  12,
+  9,
+  12,
+  15,
+  11,
+  14,
+  12,
+  13,
+  10,
+  8,
+  13,
+  9,
+  11,
+  9,
+  10,
+  13,
+  8,
+  14,
+  17,
+  22,
+  25,
+  19,
+  24,
+  20,
+  25,
+  18,
+  16,
+  21,
+  17,
+  23,
+  15,
+  14,
+  19,
+  14,
+  22,
+  11,
+  14,
+  17,
+  13,
+  16,
+  15,
+  14,
+  10,
+  12,
+  16,
+  11,
+  16,
+  13,
+  11,
+  13,
+  8,
+  16,
+  17,
+  22,
+  25,
+  19,
+  24,
+  20,
+  25,
+  18,
+  16,
+  21,
+  17,
+  23,
+  15,
+  14,
+  19,
+  14,
+  22,
+  16,
+  21,
+  24,
+  18,
+  23,
+  20,
+  23,
+  17,
+  17,
+  22,
+  16,
+  25,
+  17,
+  14,
+  18,
+  13,
+  21,
+  10,
+  13,
+  15,
+  12,
+  14,
+  13,
+  13,
+  9,
+  10,
+  13,
+  10,
+  13,
+  10,
+  9,
+  11,
+  7,
+  14,
+  11,
+  14,
+  18,
+  13,
+  17,
+  14,
+  16,
+  12,
+  9,
+  15,
+  11,
+  12,
+  10,
+  12,
+  16,
+  10,
+  17,
+  16,
+  19,
+  25,
+  18,
+  24,
+  21,
+  21,
+  15,
+  16,
+  23,
+  16,
+  21,
+  18,
+  17,
+  21,
+  13,
+  24,
+  9,
+  12,
+  16,
+  11,
+  15,
+  14,
+  12,
+  10,
+  11,
+  17,
+  9,
+  16,
+  14,
+  12,
+  14,
+  8,
+  15,
+  10,
+  13,
+  15,
+  12,
+  14,
+  13,
+  13,
+  9,
+  10,
+  13,
+  10,
+  13,
+  10,
+  9,
+  11,
+  7,
+  14,
+  10,
+  15,
+  18,
+  12,
+  17,
+  14,
+  17,
+  15,
+  11,
+  18,
+  10,
+  19,
+  13,
+  12,
+  16,
+  11,
+  15,
+  19,
+  24,
+  29,
+  21,
+  28,
+  24,
+  27,
+  20,
+  20,
+  27,
+  19,
+  29,
+  21,
+  18,
+  23,
+  16,
+  26,
+  18,
+  22,
+  27,
+  20,
+  26,
+  23,
+  24,
+  17,
+  19,
+  25,
+  18,
+  26,
+  20,
+  17,
+  21,
+  14,
+  25,
+  18,
+  22,
+  26,
+  20,
+  25,
+  21,
+  25,
+  17,
+  16,
+  21,
+  18,
+  21,
+  15,
+  15,
+  20,
+  14,
+  24,
+  14,
+  17,
+  21,
+  16,
+  20,
+  17,
+  19,
+  13,
+  12,
+  17,
+  14,
+  15,
+  12,
+  13,
+  17,
+  11,
+  20,
+  11,
+  15,
+  19,
+  13,
+  18,
+  15,
+  17,
+  14,
+  11,
+  18,
+  11,
+  17,
+  13,
+  13,
+  17,
+  11,
+  17,
+  12,
+  15,
+  18,
+  14,
+  17,
+  15,
+  16,
+  11,
+  11,
+  15,
+  12,
+  14,
+  11,
+  11,
+  14,
+  9,
+  17,
+  14,
+  17,
+  20,
+  16,
+  19,
+  18,
+  17,
+  11,
+  15,
+  18,
+  14,
+  19,
+  15,
+  12,
+  14,
+  9,
+  19,
+  16,
+  21,
+  26,
+  18,
+  25,
+  21,
+  24,
+  19,
+  17,
+  25,
+  16,
+  26,
+  19,
+  17,
+  22,
+  15,
+  23,
+  14,
+  17,
+  22,
+  16,
+  21,
+  19,
+  18,
+  13,
+  15,
+  21,
+  14,
+  20,
+  17,
+  15,
+  18,
+  11,
+  21,
+  9,
+  12,
+  15,
+  11,
+  14,
+  12,
+  13,
+  10,
+  8,
+  13,
+  9,
+  11,
+  9,
+  10,
+  13,
+  8,
+  14,
+  14,
+  18,
+  22,
+  16,
+  21,
+  18,
+  20,
+  15,
+  14,
+  20,
+  14,
+  20,
+  15,
+  14,
+  18,
+  12,
+  20,
+  14,
+  17,
+  22,
+  16,
+  21,
+  19,
+  18,
+  13,
+  15,
+  21,
+  14,
+  20,
+  17,
+  15,
+  18,
+  11,
+  21,
+  16,
+  19,
+  25,
+  18,
+  24,
+  21,
+  21,
+  15,
+  16,
+  23,
+  16,
+  21,
+  18,
+  17,
+  21,
+  13,
+  24,
+  15,
+  19,
+  24,
+  17,
+  23,
+  20,
+  21,
+  16,
+  16,
+  23,
+  15,
+  23,
+  18,
+  16,
+  20,
+  13,
+  22,
+  14,
+  18,
+  22,
+  16,
+  21,
+  18,
+  20,
+  15,
+  14,
+  20,
+  14,
+  20,
+  15,
+  14,
+  18,
+  12,
+  20,
+  14,
+  17,
+  21,
+  16,
+  20,
+  17,
+  19,
+  13,
+  12,
+  17,
+  14,
+  15,
+  12,
+  13,
+  17,
+  11,
+  20,
+  11,
+  15,
+  17,
+  13,
+  16,
+  14,
+  16,
+  12,
+  11,
+  15,
+  11,
+  16,
+  11,
+  10,
+  13,
+  9,
+  15,
+  21,
+  26,
+  32,
+  23,
+  31,
+  26,
+  30,
+  22,
+  21,
+  29,
+  21,
+  30,
+  22,
+  20,
+  26,
+  18,
+  29,
+  18,
+  22,
+  26,
+  20,
+  25,
+  21,
+  25,
+  17,
+  16,
+  21,
+  18,
+  21,
+  15,
+  15,
+  20,
+  14,
+  24,
+  12,
+  15,
+  19,
+  14,
+  18,
+  17,
+  15,
+  11,
+  14,
+  19,
+  12,
+  19,
+  16,
+  13,
+  15,
+  9,
+  18,
+  13,
+  18,
+  22,
+  15,
+  21,
+  16,
+  22,
+  18,
+  11,
+  19,
+  13,
+  18,
+  12,
+  14,
+  20,
+  14,
+  19,
+  16,
+  21,
+  26,
+  18,
+  25,
+  21,
+  24,
+  19,
+  17,
+  25,
+  16,
+  26,
+  19,
+  17,
+  22,
+  15,
+  23,
+  10,
+  14,
+  18,
+  12,
+  17,
+  15,
+  15,
+  13,
+  12,
+  19,
+  10,
+  19,
+  15,
+  13,
+  16,
+  10,
+  16,
+  17,
+  22,
+  25,
+  19,
+  24,
+  20,
+  25,
+  18,
+  16,
+  21,
+  17,
+  23,
+  15,
+  14,
+  19,
+  14,
+  22,
+  13,
+  16,
+  18,
+  15,
+  17,
+  16,
+  16,
+  10,
+  13,
+  15,
+  13,
+  16,
+  12,
+  10,
+  12,
+  8,
+  17,
+  18,
+  23,
+  29,
+  20,
+  28,
+  23,
+  27,
+  21,
+  18,
+  27,
+  18,
+  27,
+  20,
+  19,
+  25,
+  17,
+  26,
+  16,
+  19,
+  25,
+  18,
+  24,
+  21,
+  21,
+  15,
+  16,
+  23,
+  16,
+  21,
+  18,
+  17,
+  21,
+  13,
+  24,
+  10,
+  13,
+  15,
+  12,
+  14,
+  13,
+  13,
+  9,
+  10,
+  13,
+  10,
+  13,
+  10,
+  9,
+  11,
+  7,
+  14,
+  16,
+  20,
+  24,
+  18,
+  23,
+  21,
+  21,
+  15,
+  18,
+  23,
+  16,
+  25,
+  19,
+  15,
+  18,
+  12,
+  22,
+  8,
+  12,
+  14,
+  10,
+  13,
+  11,
+  13,
+  11,
+  8,
+  13,
+  8,
+  13,
+  9,
+  9,
+  12,
+  8,
+  12,
+  15,
+  20,
+  22,
+  17,
+  21,
+  18,
+  22,
+  16,
+  15,
+  19,
+  15,
+  22,
+  14,
+  12,
+  16,
+  12,
   19,
-  42,
+  11,
+  14,
+  17,
+  13,
+  16,
+  15,
+  14,
+  10,
+  12,
+  16,
+  11,
+  16,
+  13,
+  11,
+  13,
+  8,
+  16,
+  9,
+  13,
+  16,
+  11,
+  15,
   13,
-  36,
-  41,
-  -19,
-  -20,
-  -17,
+  14,
+  12,
+  10,
+  16,
+  9,
+  16,
+  12,
+  11,
+  14,
+  9,
+  14,
+  14,
+  18,
+  24,
   16,
-  -21,
-  48,
+  23,
+  19,
+  21,
+  17,
+  14,
+  23,
+  14,
+  21,
+  17,
+  17,
   22,
-  -41,
-  -31,
-  -29,
+  14,
+  22,
+  14,
+  17,
+  21,
+  16,
+  20,
+  17,
+  19,
+  13,
+  12,
+  17,
+  14,
+  15,
+  12,
+  13,
+  17,
+  11,
+  20,
+  10,
+  15,
+  18,
+  12,
+  17,
+  14,
+  17,
+  15,
+  11,
+  18,
+  10,
+  19,
+  13,
+  12,
+  16,
+  11,
+  15,
+  9,
+  12,
+  15,
+  11,
+  14,
+  12,
+  13,
+  10,
+  8,
+  13,
+  9,
+  11,
+  9,
+  10,
+  13,
+  8,
+  14,
+  12,
+  16,
+  21,
+  14,
+  20,
+  17,
+  18,
+  15,
+  13,
+  21,
+  12,
+  20,
+  16,
+  15,
+  19,
+  12,
+  19,
   17,
-  -53,
   22,
-  -19,
-  -12,
-  -29,
-  -37,
-  50,
-  4,
-  36,
+  27,
+  19,
+  26,
+  21,
+  26,
+  20,
+  16,
+  24,
+  17,
+  24,
+  17,
+  17,
+  23,
+  16,
+  24,
+  10,
+  13,
+  15,
+  12,
+  14,
+  13,
+  13,
+  9,
+  10,
+  13,
+  10,
+  13,
+  10,
+  9,
+  11,
+  7,
+  14,
+  9,
+  12,
+  16,
+  11,
+  15,
+  14,
+  12,
+  10,
+  11,
+  17,
+  9,
+  16,
+  14,
+  12,
+  14,
+  8,
+  15,
+  9,
+  14,
+  16,
+  11,
+  15,
+  12,
+  16,
+  14,
+  9,
+  15,
+  9,
+  16,
+  10,
+  10,
+  14,
+  10,
   13,
-  42,
+  13,
+  17,
+  21,
+  15,
+  20,
+  18,
   18,
-  -1,
+  14,
+  15,
+  21,
+  13,
+  22,
+  17,
+  14,
+  17,
   11,
+  19,
+  18,
+  22,
+  26,
+  20,
+  25,
+  21,
+  25,
+  17,
+  16,
+  21,
+  18,
+  21,
+  15,
+  15,
+  20,
+  14,
+  24,
+  15,
+  18,
   23,
-  42,
-  -28,
-  32,
-  -15,
+  17,
+  22,
+  19,
+  20,
+  14,
+  14,
+  20,
+  15,
+  18,
+  15,
+  15,
+  19,
   12,
+  22,
+  17,
+  22,
+  26,
+  19,
+  25,
+  22,
   24,
-  -9,
+  18,
+  19,
+  25,
+  17,
+  28,
+  20,
+  16,
+  20,
+  14,
+  23,
+  10,
+  13,
+  17,
+  12,
+  16,
+  14,
+  14,
   11,
-  -32,
-  -13,
+  10,
+  16,
+  10,
+  14,
+  12,
+  12,
   15,
-  32,
-  -17,
-  4,
-  42,
-  37,
-  -54,
-  -9,
-  -4,
-  33,
+  9,
+  16,
+  17,
+  21,
+  27,
+  19,
+  26,
+  22,
+  24,
+  18,
+  17,
+  25,
+  17,
+  24,
+  19,
+  18,
+  23,
+  15,
+  25,
+  10,
+  13,
+  15,
+  12,
+  14,
+  13,
+  13,
+  9,
+  10,
+  13,
+  10,
+  13,
+  10,
+  9,
+  11,
   7,
+  14,
+  16,
+  21,
+  24,
+  18,
+  23,
+  20,
+  23,
+  17,
+  17,
+  22,
+  16,
+  25,
+  17,
+  14,
+  18,
+  13,
+  21,
+  20,
+  25,
+  30,
+  22,
   29,
-  32,
-  -19,
+  24,
+  29,
+  21,
+  19,
+  26,
+  20,
   27,
-  38,
-  28,
-  30,
-  -13,
-  5,
-  -3
+  19,
+  18,
+  24,
+  17,
+  27,
+  9,
+  12,
+  15,
+  11,
+  14,
+  12,
+  13,
+  10,
+  8,
+  13,
+  9,
+  11,
+  9,
+  10,
+  13,
+  8,
+  14,
+  15,
+  19,
+  23,
+  17,
+  22,
+  18,
+  22,
+  16,
+  13,
+  19,
+  15,
+  18,
+  13,
+  14,
+  19,
+  13,
+  21,
+  14,
+  18,
+  22,
+  16,
+  21,
+  18,
+  20,
+  15,
+  14,
+  20,
+  14,
+  20,
+  15,
+  14,
+  18,
+  12,
+  20
 };

+ 18 - 2
CMSIS/NN/Tests/UnitTest/TestCases/TestData/kernel1x1/output_shift_data.h

@@ -21,7 +21,23 @@
 // Generated by generate_test_data.py
 #include <stdint.h>
 
-const int32_t kernel1x1_output_shift[1] =
+const int32_t kernel1x1_output_shift[17] =
 {
-  -5
+  -11,
+  -11,
+  -11,
+  -11,
+  -11,
+  -11,
+  -11,
+  -11,
+  -11,
+  -11,
+  -11,
+  -11,
+  -11,
+  -11,
+  -11,
+  -11,
+  -11
 };

+ 1 - 1
CMSIS/NN/Tests/UnitTest/TestCases/TestData/kernel1x1/test_data.h

@@ -20,9 +20,9 @@
 
 // Generated by generate_test_data.py
 #include "config_data.h"
+#include "output_ref_data.h"
 #include "output_shift_data.h"
 #include "output_mult_data.h"
-#include "output_ref_data.h"
 #include "biases_data.h"
 #include "weights_data.h"
 #include "input_data.h"

+ 68 - 4
CMSIS/NN/Tests/UnitTest/TestCases/TestData/kernel1x1/weights_data.h

@@ -21,10 +21,74 @@
 // Generated by generate_test_data.py
 #include <stdint.h>
 
-const q7_t kernel1x1_weights[4] =
+const q7_t kernel1x1_weights[68] =
 {
-  102,
-  -51,
-  0,
+  42,
+  42,
+  85,
+  127,
+  42,
+  85,
+  85,
+  127,
+  85,
+  85,
+  127,
+  127,
+  42,
+  42,
+  85,
+  127,
+  85,
+  85,
+  127,
+  127,
+  85,
+  42,
+  85,
+  127,
+  42,
+  127,
+  127,
+  127,
+  42,
+  127,
+  85,
+  42,
+  85,
+  42,
+  42,
+  127,
+  127,
+  85,
+  85,
+  85,
+  42,
+  42,
+  85,
+  127,
+  127,
+  127,
+  42,
+  127,
+  127,
+  42,
+  42,
+  85,
+  127,
+  64,
+  127,
+  64,
+  85,
+  85,
+  127,
+  42,
+  64,
+  127,
+  127,
+  64,
+  85,
+  42,
+  127,
   127
 };

+ 94 - 66
CMSIS/NN/Tests/UnitTest/generate_test_data.py

@@ -18,19 +18,20 @@
 #
 import os
 import sys
-import argparse
 import math
+import argparse
 import numpy as np
 import warnings as w
 
-from abc import ABC, abstractmethod
 from packaging import version
+from abc import ABC, abstractmethod
 
 w.filterwarnings('ignore', category=FutureWarning)
 try:
     import tensorflow as tf
 except Exception as e:
-    sys.exit(e)
+    print(e)
+    sys.exit(1)
 
 REQUIRED_MINIMUM_TENSORFLOW_VERSION = version.parse("2.0.0b0")
 DEFAULT_TESTDATA_SET = 'basic'
@@ -78,8 +79,8 @@ class TestSettings(ABC):
     INT_MAX = 32767
     INT_MIN = -32767
 
-    def __init__(self, args, randmin, randmax, in_ch, out_ch, x_in, y_in, w_x, w_y, stride_x, stride_y, batches, pad,
-                 input_scale, output_scale, in_zero_point, out_zero_point):
+    def __init__(self, args, in_ch, out_ch, x_in, y_in, w_x, w_y, stride_x, stride_y, pad, randmin, randmax,
+                 outminrange=-128, outmaxrange=127, batches=1):
 
         self.minrange = -128
         self.maxrange = 127
@@ -99,19 +100,15 @@ class TestSettings(ABC):
         self.batches = batches
 
         self.has_padding = pad
-        self.padding = 'VALID'
-        self.pad_x = 0
-        self.pad_y = 0
-        self.x_output = 0
-        self.y_output = 0
 
         self.scaling_factors = []
 
-        self.input_scale = input_scale
-        self.output_scale = output_scale
-        self.input_zero_point = in_zero_point
-        self.output_zero_point = out_zero_point
+        minrange = randmin - 1
+        maxrange = randmax + 1
 
+        (self.input_scale, self.input_zero_point) = self.derive_scale_and_zeropoint_from_min_max(minrange, maxrange)
+        (self.output_scale, self.output_zero_point) = self.derive_scale_and_zeropoint_from_min_max(outminrange,
+                                                                                                   outmaxrange)
         self.generated_header_files = []
         self.pregenerated_data_dir = self.PREGEN
         self.testdataset = DEFAULT_TESTDATA_SET
@@ -122,6 +119,8 @@ class TestSettings(ABC):
         self.bias_table_file = self.pregenerated_data_dir + self.testdataset + '/' + 'bias.txt'
         self.parameters_file = self.pregenerated_data_dir + self.testdataset + '/' + 'params.txt'
 
+        self.set_output_dims_and_padding()
+
         self.regenerate_new_weights = args.regenerate_weights
         self.regenerate_new_input = args.regenerate_input
         self.regenerate_new_bias = args.regenerate_biases
@@ -135,7 +134,20 @@ class TestSettings(ABC):
 
         self.headers_dir = self.OUTDIR + self.testdataset + '/'
 
-        self.set_padding_and_output_width_heigth()
+    def clamp_int8(self, result):
+        int8_min = self.minrange
+        int8_max = self.maxrange
+        if result < int8_min:
+            result = int8_min
+        elif result > int8_max:
+            result = int8_max
+        return result
+
+    def derive_scale_and_zeropoint_from_min_max(self, minrange, maxrange):
+        scale = (maxrange - minrange) / ((self.maxrange * 1.0) - self.minrange)
+        zeropoint = self.minrange + int(-minrange / scale + 0.5)
+        zeropoint = max(-128, min(zeropoint, 128))
+        return (scale, zeropoint)
 
     def save_multiple_dim_array_in_txt(self, file, data):
         header = ','.join(map(str, data.shape))
@@ -185,13 +197,19 @@ class TestSettings(ABC):
 
         return tf.convert_to_tensor(np_float_array)
 
-    def get_data(self, dims, npfile, regenerate):
+    def get_randomized_data(self, dims, npfile, regenerate, decimals=0):
         if not os.path.exists(npfile) or regenerate:
             regendir = os.path.dirname(npfile)
             if not os.path.exists(regendir):
                 os.makedirs(regendir)
-            data = tf.Variable(tf.random.uniform(dims, minval=self.mins, maxval=self.maxs, dtype=tf.dtypes.int32))
-            data = tf.cast(data, dtype=tf.float32)
+            if decimals == 0:
+                data = tf.Variable(tf.random.uniform(dims, minval=self.mins, maxval=self.maxs, dtype=tf.dtypes.int32))
+                data = tf.cast(data, dtype=tf.float32)
+            else:
+                data = tf.Variable(tf.random.uniform(dims, minval=self.mins, maxval=self.maxs, dtype=tf.dtypes.float32))
+                data = np.around(data.numpy(), decimals)
+                data = tf.convert_to_tensor(data)
+
             print("Saving data to {}".format(npfile))
             self.save_multiple_dim_array_in_txt(npfile, data.numpy())
         else:
@@ -237,13 +255,13 @@ class TestSettings(ABC):
             f.write("#define {}_OUT_CONV_H {}\n".format(prefix, self.y_output))
             f.write("#define {}_DST_SIZE {}\n".format(prefix, self.x_output * self.y_output * self.output_ch))
             f.write("#define {}_INPUT_SIZE {}\n".format(prefix, self.x_input * self.y_input * self.input_ch))
-            f.write("#define {}_INPUT_OFFSET {}\n".format(prefix, self.input_zero_point))
+            f.write("#define {}_INPUT_OFFSET {}\n".format(prefix, -self.input_zero_point))
             f.write("#define {}_OUTPUT_OFFSET {}\n".format(prefix, self.output_zero_point))
             f.write("#define {}_OUT_ACTIVATION_MIN {}\n".format(prefix, self.minrange))
             f.write("#define {}_OUT_ACTIVATION_MAX {}\n".format(prefix, self.maxrange))
             f.write("#define {}_INPUT_BATCHES {}\n".format(prefix, self.batches))
 
-    def generate_c_array(self, name, array, datatype="q7_t"):
+    def generate_c_array(self, name, array, datatype="q7_t", const="const "):
         if not os.path.exists(self.headers_dir):
             os.makedirs(self.headers_dir)
 
@@ -267,17 +285,17 @@ class TestSettings(ABC):
             f.write("#pragma once\n")
             f.write("// Generated by {}\n".format(os.path.basename(__file__)))
             f.write("#include <stdint.h>\n\n")
-            f.write("const " + datatype + " " + self.testdataset + '_' + name + "[%d] =\n{\n" % size)
+            f.write(const + datatype + " " + self.testdataset + '_' + name + "[%d] =\n{\n" % size)
             for i in range(size - 1):
                 f.write("  %d,\n" % w[i])
             f.write("  %d\n" % w[size - 1])
             f.write("};\n")
 
-    def set_padding_and_output_width_heigth(self):
+    def set_output_dims_and_padding(self):
         if self.has_padding:
-            self.padding = 'SAME'
             self.x_output = math.ceil(float(self.x_input) / float(self.stride_x))
             self.y_output = math.ceil(float(self.y_input) / float(self.stride_y))
+            self.padding = 'SAME'
             pad_along_width = max((self.x_output - 1) * self.stride_x + self.filter_x - self.x_input, 0)
             pad_along_height = max((self.y_output - 1) * self.stride_y + self.filter_y - self.y_input, 0)
             pad_top = pad_along_height // 2
@@ -285,9 +303,9 @@ class TestSettings(ABC):
             self.pad_x = pad_left
             self.pad_y = pad_top
         else:
-            self.padding = 'VALID'
             self.x_output = math.ceil(float(self.x_input - self.filter_x + 1) / float(self.stride_x))
             self.y_output = math.ceil(float(self.y_input - self.filter_y + 1) / float(self.stride_y))
+            self.padding = 'VALID'
             self.pad_x = 0
             self.pad_y = 0
 
@@ -298,10 +316,10 @@ class TestSettings(ABC):
 
 class ConvSettings(TestSettings):
 
-    def __init__(self, args, randmin=-7, randmax=7, in_ch=1, out_ch=1, x_in=7, y_in=7, w_x=3, w_y=3, stride_x=2,
-                 stride_y=2, batches=1, pad=True, input_scale=0.5, output_scale=1.0, in_zero_point=0, out_zero_point=0):
-        super().__init__(args, randmin, randmax, in_ch, out_ch, x_in, y_in, w_x, w_y, stride_x, stride_y, batches, pad,
-                         input_scale, output_scale, in_zero_point, out_zero_point)
+    def __init__(self, args, in_ch=1, out_ch=1, x_in=7, y_in=7, w_x=3, w_y=3, stride_x=2, stride_y=2,
+                 pad=True, randmin=-7, randmax=7, outminrange=-128, outmaxrange=127, batches=1):
+        super().__init__(args, in_ch, out_ch, x_in, y_in, w_x, w_y, stride_x, stride_y, pad, randmin, randmax,
+                         outminrange, outmaxrange, batches)
 
     def quantize_bias(self, nparray):
         num_channels = self.output_ch
@@ -321,15 +339,19 @@ class ConvSettings(TestSettings):
 
         return np.asarray(quantized_values)
 
+    def reshape_kernel(self, kernel):
+        kernel = tf.reshape(kernel, [self.output_ch, self.filter_y, self.filter_x, self.input_ch])
+        kernel = tf.transpose(kernel, (1, 2, 0, 3))
+        kernel = tf.transpose(kernel, (0, 1, 3, 2))
+        return kernel
+
     def quantize_input(self, value):
         result = round(value / self.input_scale) + self.input_zero_point
-        int8_min = self.minrange
-        int8_max = self.maxrange
-        if result < int8_min:
-            result = int8_min
-        elif result > int8_max:
-            result = int8_max
-        return result
+        return self.clamp_int8(result)
+
+    def quantize_output(self, value):
+        result = round(value / self.output_scale) + self.output_zero_point
+        return self.clamp_int8(result)
 
     def quantize_filter(self, nparray):
         quantized_values = []
@@ -353,6 +375,9 @@ class ConvSettings(TestSettings):
             for x in range(per_channel_size):
                 chs = channel * channel_stride + x * stride
                 quantized_value = round(round(values[chs]) / self.scaling_factors[channel])
+
+                # Clamp
+                quantized_value = min(127, max(-127, quantized_value))
                 quantized_values.append(quantized_value)
 
         return np.asarray(quantized_values)
@@ -363,8 +388,7 @@ class ConvSettings(TestSettings):
         per_channel_shift = []
 
         if len(self.scaling_factors) != num_channels:
-            print("missing scaling factors")
-            sys.exit(1)
+            raise RuntimeError("Missing scaling factors")
 
         def quantize_scale(scale):
             significand, shift = math.frexp(scale)
@@ -382,47 +406,55 @@ class ConvSettings(TestSettings):
         self.generate_c_array("output_shift", per_channel_shift, datatype='int32_t')
 
     def convolution(self, indata, weights, bias=None):
+        indata = tf.cast(indata, dtype=tf.dtypes.float32)
+        weights = tf.cast(weights, dtype=tf.dtypes.float32)
+        bias = tf.cast(bias, dtype=tf.dtypes.float32)
+
         out = tf.nn.conv2d(indata, weights, strides=[1, self.stride_x, self.stride_y, 1], padding=self.padding)
 
         if tf.TensorShape([self.batches, self.y_output, self.x_output, self.output_ch]).as_list() != \
            out.shape.as_list():
-            print("Shape mismatch, need to regenerate data?")
-            sys.exit(1)
+            raise RuntimeError("Shape mismatch, need to regenerate data?")
+
+        out = tf.nn.bias_add(out, bias)
+        out = tf.clip_by_value(out, self.minrange, self.maxrange)
 
-        b = tf.nn.bias_add(out, bias)
-        conv = tf.clip_by_value(b, self.minrange, self.maxrange)
-        return conv
+        return out
 
     def generate_data(self, input_data=None, weights=None, biases=None):
-        # Generate unless hardcoded data provided
+        # Tensorflow Lite has a different kernel format compared to Tensorflow
+        reshaped_weights = None
+
+        # Generate or load saved data unless hardcoded data provided
         if input_data is not None:
             input_data = tf.reshape(input_data, [self.batches, self.y_input, self.x_input, self.input_ch])
         else:
-            input_data = self.get_data([self.batches, self.y_input, self.x_input, self.input_ch],
-                                       self.inputs_table_file,
-                                       regenerate=self.regenerate_new_input)
+            input_data = self.get_randomized_data([self.batches, self.y_input, self.x_input, self.input_ch],
+                                                  self.inputs_table_file,
+                                                  regenerate=self.regenerate_new_input)
         if weights is not None:
             weights = tf.reshape(weights, [self.filter_y, self.filter_x, self.input_ch, self.output_ch])
         else:
-            weights = self.get_data([self.filter_y, self.filter_x, self.input_ch, self.output_ch],
-                                    self.kernel_table_file,
-                                    regenerate=self.regenerate_new_weights)
+            weights = self.get_randomized_data([self.filter_y, self.filter_x, self.input_ch, self.output_ch],
+                                               self.kernel_table_file,
+                                               regenerate=self.regenerate_new_weights)
+        reshaped_weights = self.reshape_kernel(weights)
         if biases is not None:
             biases = tf.reshape(biases, [self.output_ch])
         else:
-            biases = self.get_data([self.output_ch], self.bias_table_file, regenerate=self.regenerate_new_bias)
+            biases = self.get_randomized_data([self.output_ch],
+                                              self.bias_table_file,
+                                              regenerate=self.regenerate_new_bias)
+
+        # Generate conv reference
+        conv = self.convolution(input_data, reshaped_weights, biases)
 
         # Quantize and write to C headers
         self.generate_c_array("input", self.convert_tensor(input_data, self.quantize_input))
         self.generate_c_array("weights", self.convert_tensor_np(weights, self.quantize_filter))
         self.generate_c_array("biases", self.convert_tensor_np(biases, self.quantize_bias), "int32_t")
-
-        # Generate conv reference
-        conv = self.convolution(input_data, weights, biases)
-        self.generate_c_array("output_ref", conv)
-
-        # Generate per output channel requantization mult/shift parameters
         self.generate_quantize_per_channel_multiplier()
+        self.generate_c_array("output_ref", self.convert_tensor(conv, self.quantize_output))
 
         self.write_c_config_header()
         self.write_c_header_wrapper()
@@ -431,10 +463,9 @@ class ConvSettings(TestSettings):
 class PoolingSettings(TestSettings):
 
     def __init__(self, args, randmin=-7, randmax=7, in_ch=1, out_ch=1, x_in=7, y_in=7, w_x=3, w_y=3, stride_x=2,
-                 stride_y=2, batches=1, pad=True, input_scale=0.5, output_scale=1.0, in_zero_point=0, out_zero_point=0):
+                 stride_y=2, batches=1, pad=True):
 
-        super().__init__(args, randmin, randmax, in_ch, out_ch, x_in, y_in, w_x, w_y, stride_x, stride_y, batches, pad,
-                         input_scale, output_scale, in_zero_point, out_zero_point)
+        super().__init__(args, randmin, randmax, in_ch, out_ch, x_in, y_in, w_x, w_y, stride_x, stride_y, batches, pad)
 
     def generate_data(self, input_data=None, weights=None, biases=None):
         # TODO
@@ -449,13 +480,10 @@ if __name__ == '__main__':
     args = parse_args()
 
     if args.type == 'conv':
-        # basic
-        # generator = ConvSettings(args, x_in=5, y_in=8, w_x=2, w_y=4, stride_x=1, stride_y=1, pad=False)
-        # kernel1x1
-        # generator = ConvSettings(args, in_ch=4, x_in=8, y_in=8, w_x=1, w_y=1, stride_x=1, stride_y=1, pad=False)
-        # stride2pad1
-        generator = ConvSettings(args, x_in=7, y_in=7, w_x=3, w_y=3, stride_x=2, stride_y=2)
+        generator = ConvSettings(args, in_ch=4, out_ch=17, x_in=15, y_in=15, w_x=1, w_y=1, stride_x=1, stride_y=1,
+                                 pad=False, randmin=1, randmax=4, outminrange=-126, outmaxrange=127)
+
     elif args.type == 'pooling':
-        generator = PoolingSettings(args)
+        generator = PoolingSettings(args, x_in=6, y_in=5, stride_x=1, stride_y=2, w_x=2, w_y=2)
 
     generator.generate_data()