Main Compliance: TRANSPOSE_CONV2D support

Update data generator for main compliance values.
Add test generation support.
Fixed test set by including large 65k tests that were missing.

Signed-off-by: Jeremy Johnson <jeremy.johnson@arm.com>
Change-Id: I8668c774e01c17e5d999aadf99c317e2dd893857
diff --git a/verif/generator/tosa_arg_gen.py b/verif/generator/tosa_arg_gen.py
index 8501caa..91d2d62 100644
--- a/verif/generator/tosa_arg_gen.py
+++ b/verif/generator/tosa_arg_gen.py
@@ -2186,6 +2186,8 @@
             assert len(filter_shape) == 4
 
         k_shape = tuple(filter_shape[1:3])
+        # compliance size - KS
+        k_size = gtu.product((*k_shape, ifm_shape[3]))
 
         if not testGen.args.level8k:
             # Generate comprehensive argument lists
@@ -2283,6 +2285,19 @@
                     ow = (ifm_shape[2] - 1) * s[1] + p[2] + p[3] + k_shape[1]
                     os = [ifm_shape[0], oh, ow, filter_shape[0]]
 
+                    # N*OH*OW*OC
+                    dots = gtu.product((ifm_shape[0], oh, ow, filter_shape[0]))
+                    args_dict = {
+                        "acc_type": accum_dtype,
+                        "stride": s,
+                        "pad": p,
+                        "kernel": k_shape,
+                        "ks": k_size,
+                        "dot_products": dots,
+                        "shape": ifm_shape,
+                        "out_shape": os,
+                    }
+
                     # Support for larger values than 9 needs different delimiter
                     delim = "" if max(s + p) <= 9 else "x"
                     arg_list.append(
@@ -2293,11 +2308,19 @@
                                 delim.join([str(x) for x in p]),
                                 "x".join([str(x) for x in os]),
                             ),
-                            [accum_dtype, s, p, os],
+                            args_dict,
                         )
                     )
                 n += 1
 
+        arg_list = TosaArgGen._add_data_generators(
+            testGen,
+            opName,
+            dtypes[0],
+            arg_list,
+            error_name,
+        )
+        # Return list of tuples: (arg_str, args_dict)
         return arg_list
 
     @staticmethod
diff --git a/verif/generator/tosa_error_if.py b/verif/generator/tosa_error_if.py
index 5874123..a5a834f 100644
--- a/verif/generator/tosa_error_if.py
+++ b/verif/generator/tosa_error_if.py
@@ -2701,7 +2701,7 @@
     @staticmethod
     def ivNonPositiveOutputShape(**kwargs):
         args = kwargs["args"]
-        output_shape = args[3]
+        output_shape = args["out_shape"]
         if output_shape[1] <= 0 or output_shape[2] <= 0:
             # Negative output shape
             return True
diff --git a/verif/generator/tosa_test_gen.py b/verif/generator/tosa_test_gen.py
index 6867979..39b064d 100644
--- a/verif/generator/tosa_test_gen.py
+++ b/verif/generator/tosa_test_gen.py
@@ -324,6 +324,7 @@
             Op.CONV2D,
             Op.FULLY_CONNECTED,
             Op.DEPTHWISE_CONV2D,
+            Op.TRANSPOSE_CONV2D,
         )
         if (
             errorName
@@ -987,19 +988,21 @@
     def build_transpose_conv2d(
         self,
         op,
-        ifm,
-        filter,
-        bias,
-        accum_dtype,
-        stride,
-        out_pad,
-        output_shape,
+        inputs,
+        args_dict,
         validator_fcns=None,
         error_name=None,
         qinfo=None,
     ):
+        assert len(inputs) == 3
+        ifm, filter, bias = inputs
+        accum_dtype = args_dict["acc_type"]
+        strides = args_dict["stride"]
+        out_pad = args_dict["pad"]
+        output_shape = args_dict["out_shape"]
+
         assert len(out_pad) == 4
-        result_tens = OutputShaper.transposeConv2DOp(
+        result_tensor = OutputShaper.transposeConv2DOp(
             self.ser, self.rng, ifm, output_shape, accum_dtype, error_name
         )
 
@@ -1010,12 +1013,12 @@
         ):
             qinfo = [
                 TosaQuantGen.getZeroPoint(self, ifm.dtype),
-                TosaQuantGen.getZeroPoint(self, result_tens.dtype),
+                TosaQuantGen.getZeroPoint(self, result_tensor.dtype),
             ]
 
         # Invalidate Input/Output list for error_if checks.
         input_list = [ifm.name, filter.name, bias.name]
-        output_list = [result_tens.name]
+        output_list = [result_tensor.name]
         num_operands = sum(op["operands"])
         input_list, output_list = TosaErrorIfArgGen.eiInvalidateInputOutputList(
             self, error_name, input_list, output_list
@@ -1028,16 +1031,16 @@
             op=op,
             input_dtype=ifm.dtype,
             weight_dtype=filter.dtype,
-            output_dtype=result_tens.dtype,
+            output_dtype=result_tensor.dtype,
             qinfo=qinfo,
             input_list=input_list,
             num_operands=num_operands,
             output_list=output_list,
             pad=out_pad,
-            stride=stride,
+            stride=strides,
             input_shape=ifm.shape,
             weight_shape=filter.shape,
-            output_shape=result_tens.shape,
+            output_shape=result_tensor.shape,
         ):
             return None
 
@@ -1046,11 +1049,16 @@
 
         attr = ts.TosaSerializerAttribute()
         attr.TransposeConvAttribute(
-            out_pad, stride, output_shape, qinfo[0], qinfo[1], local_bound
+            out_pad, strides, output_shape, qinfo[0], qinfo[1], local_bound
         )
 
         self.ser.addOperator(op["op"], input_list, output_list, attr)
-        return result_tens
+
+        compliance = self.tensorComplianceMetaData(
+            op, ifm.dtype, args_dict, result_tensor, error_name
+        )
+
+        return TosaTestGen.BuildInfo(result_tensor, compliance)
 
     def build_depthwise_conv2d(
         self,
@@ -3307,7 +3315,7 @@
             "build_fcn": (
                 build_transpose_conv2d,
                 TosaTensorGen.tgTransposeConv2D,
-                TosaTensorValuesGen.tvgDefault,
+                TosaTensorValuesGen.tvgLazyGenDefault,
                 TosaArgGen.agTransposeConv2D,
             ),
             "qgen": TosaQuantGen.qgConv,
@@ -3328,6 +3336,9 @@
                 TosaErrorValidator.evWrongRank,
                 TosaErrorValidator.evConvOutputShapeMismatch,
             ),
+            "data_gen": {
+                "fp": (gtu.DataGenType.DOT_PRODUCT,),
+            },
             "template": True,
         },
         # Activation functions