Update RESHAPE and TILE conformance testing

Signed-off-by: Won Jeon <won.jeon@arm.com>
Change-Id: Iaf59472cb32e03a92bad87ae9dba1b7548f20268
diff --git a/verif/generator/datagenerator.py b/verif/generator/datagenerator.py
index b5ef35d..743475c 100644
--- a/verif/generator/datagenerator.py
+++ b/verif/generator/datagenerator.py
@@ -78,7 +78,7 @@
             size_bytes = size * 2
             # Create buffer of bytes and initialize to zero
             buffer = (ct.c_ubyte * size_bytes)(0)
-        elif dtype == "INT32":
+        elif dtype == "INT32" or dtype == "SHAPE":
             # Create buffer and initialize to zero
             buffer = (ct.c_int32 * size)(0)
             size_bytes = size * 4
diff --git a/verif/generator/tosa_arg_gen.py b/verif/generator/tosa_arg_gen.py
index 00490fa..a655a50 100644
--- a/verif/generator/tosa_arg_gen.py
+++ b/verif/generator/tosa_arg_gen.py
@@ -731,7 +731,11 @@
                     # Change from inclusive to exclusive range
                     data_range = (data_range[0], data_range[1] + 1)
                 # Ignore lazy data gen option and create data array using any range limits
-                arr = testGen.getRandTensor(shape, dtype, data_range)
+
+                if "fixed_data" in argsDict and argsDict["fixed_data"][idx] is not None:
+                    arr = np.int64(argsDict["fixed_data"][idx])
+                else:
+                    arr = testGen.getRandTensor(shape, dtype, data_range)
                 if roundMode:
                     arr = np.round(arr)
                 if idx < pCount:
@@ -751,7 +755,13 @@
         for idx, shape in enumerate(shapeList):
 
             tens_meta = {}
-            tens_meta["generator"] = gtu.DataGenType(dg_type).name
+            if "fixed_data" in argsDict and argsDict["fixed_data"][idx] is not None:
+                tens_meta["generator"] = gtu.DataGenType(
+                    gtu.DataGenType.FIXED_DATA
+                ).name
+            else:
+                tens_meta["generator"] = gtu.DataGenType(dg_type).name
+
             tens_meta["data_type"] = gtu.DTYPE_ATTRIBUTES[dtypeList[idx]]["json"]
             tens_meta["shape"] = [int(i) for i in shape]
             tens_meta["input_pos"] = idx
@@ -764,23 +774,30 @@
 
             if dg_type == gtu.DataGenType.PSEUDO_RANDOM:
                 info = {}
-                # TODO - generate seed for this generator based on test
-                info["rng_seed"] = 42
+                if (
+                    tens_meta["generator"]
+                    == gtu.DataGenType(gtu.DataGenType.FIXED_DATA).name
+                ):
+                    info["data"] = [int(i) for i in argsDict["fixed_data"][idx]]
+                    tens_meta["fixed_data_info"] = info
+                else:
+                    # TODO - generate seed for this generator based on test
+                    info["rng_seed"] = 42
 
-                data_range = None
-                if "data_range_list" in argsDict:
-                    data_range = argsDict["data_range_list"][idx]["range"]
-                    if "round" in argsDict["data_range_list"][idx]:
-                        info["round"] = argsDict["data_range_list"][idx]["round"]
-                elif "data_range" in argsDict:
-                    data_range = argsDict["data_range"]
+                    data_range = None
+                    if "data_range_list" in argsDict:
+                        data_range = argsDict["data_range_list"][idx]["range"]
+                        if "round" in argsDict["data_range_list"][idx]:
+                            info["round"] = argsDict["data_range_list"][idx]["round"]
+                    elif "data_range" in argsDict:
+                        data_range = argsDict["data_range"]
 
-                if data_range is None:
-                    data_range = testGen.getDTypeRange(
-                        dtypeList[idx], high_inclusive=True
-                    )
-                info["range"] = [str(v) for v in data_range]
-                tens_meta["pseudo_random_info"] = info
+                    if data_range is None:
+                        data_range = testGen.getDTypeRange(
+                            dtypeList[idx], high_inclusive=True
+                        )
+                    info["range"] = [str(v) for v in data_range]
+                    tens_meta["pseudo_random_info"] = info
             elif dg_type == gtu.DataGenType.DOT_PRODUCT:
                 info = {}
                 info["s"] = argsDict["s"]
@@ -812,6 +829,9 @@
                 dg_tens_meta[temp_name] = tens_meta
                 # Create data now using the temporary name to access meta details
                 data = testGen.dgl.get_tensor_data(temp_name, tens_data)
+                if tens_meta["data_type"] == "SHAPE":
+                    # Tensor type SHAPE and Numpy file type must be the same
+                    data = np.int64(data)
                 # Remove the item as we will give it the correct name later
                 del dg_tens_meta[temp_name]
 
@@ -1014,6 +1034,27 @@
         return placeholders
 
     @staticmethod
+    def tvgReshape(testGen, op, dtypeList, shapeList, argsDict, error_name=None):
+        dtypeList[1] = DType.SHAPE
+        shapeList[1] = [len(argsDict["new_shape"])]
+        # Create a new list for the pre-generated data in argsDict["fixed_data"]
+        argsDict["fixed_data"] = [None, argsDict["new_shape"]]
+
+        return TosaTensorValuesGen.tvgLazyGenDefault(
+            testGen, op, dtypeList, shapeList, argsDict, error_name
+        )
+
+    @staticmethod
+    def tvgTile(testGen, op, dtypeList, shapeList, argsDict, error_name=None):
+        dtypeList[1] = DType.SHAPE
+        shapeList[1] = [len(argsDict["multiples"])]
+        argsDict["fixed_data"] = [None, argsDict["multiples"]]
+
+        return TosaTensorValuesGen.tvgLazyGenDefault(
+            testGen, op, dtypeList, shapeList, argsDict, error_name
+        )
+
+    @staticmethod
     def tvgSelect(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
         # Set datatype of condition tensor to boolean
         dtypeList[0] = DType.BOOL
diff --git a/verif/generator/tosa_test_gen.py b/verif/generator/tosa_test_gen.py
index 67ac367..159ee83 100644
--- a/verif/generator/tosa_test_gen.py
+++ b/verif/generator/tosa_test_gen.py
@@ -1558,22 +1558,14 @@
     ):
         assert len(inputs) == 2
         a = inputs[0]
-        # second input is not properly generated yet
-        # new_shape = inputs[1]
-
-        # modify inputs[1] by a shape tensor from new_shape arg value
-        new_shape_attr = args_dict["new_shape"]
-        shape_array = np.array(new_shape_attr)
-        shape = shape_array.shape
-        new_shape = self.ser.addPlaceholder(shape, DType.SHAPE, shape_array)
-        inputs[1] = new_shape
-
+        shape = inputs[1]
+        shape_attr = args_dict["new_shape"]
         result_tensor = OutputShaper.reshapeOp(
-            self.ser, self.rng, a, new_shape_attr, error_name
+            self.ser, self.rng, a, shape_attr, error_name
         )
 
         # Invalidate Input/Output list for error if checks.
-        input_list = [a.name, new_shape.name]
+        input_list = [a.name, shape.name]
         output_list = [result_tensor.name]
         pCount, cCount = op["operands"]
         num_operands = pCount + cCount
@@ -1725,16 +1717,8 @@
     ):
         assert len(inputs) == 2
         a = inputs[0]
-        # second input is not properly generated yet
-        # multiples = inputs[1]
-
-        # modify inputs[1] by a shape tensor from multiples arg value
+        multiples = inputs[1]
         multiples_attr = args_dict["multiples"]
-        shape_array = np.int64(np.array(multiples_attr))
-        shape = shape_array.shape
-        multiples = self.ser.addPlaceholder(shape, DType.SHAPE, shape_array)
-        inputs[1] = multiples
-
         result_tensor = OutputShaper.tileOp(
             self.ser, self.rng, a, multiples_attr, error_name
         )
@@ -4236,7 +4220,7 @@
             "build_fcn": (
                 build_reshape,
                 TosaTensorGen.tgBasic,
-                TosaTensorValuesGen.tvgLazyGenDefault,
+                TosaTensorValuesGen.tvgReshape,
                 TosaArgGen.agReshape,
             ),
             "types": TYPE_FIB,
@@ -4302,7 +4286,7 @@
             "build_fcn": (
                 build_tile,
                 TosaTensorGen.tgBasic,
-                TosaTensorValuesGen.tvgLazyGenDefault,
+                TosaTensorValuesGen.tvgTile,
                 TosaArgGen.agTile,
             ),
             "types": TYPE_FIB,
diff --git a/verif/generator/tosa_utils.py b/verif/generator/tosa_utils.py
index 3d733f4..33db95f 100644
--- a/verif/generator/tosa_utils.py
+++ b/verif/generator/tosa_utils.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2021-2023, ARM Limited.
+# Copyright (c) 2021-2024, ARM Limited.
 # SPDX-License-Identifier: Apache-2.0
 import struct
 import sys
@@ -49,13 +49,14 @@
     OP_BOUNDARY = 2
     OP_FULLSET = 3
     OP_SPECIAL = 4
+    FIXED_DATA = 5
 
 
 def dtypeIsSupportedByCompliance(dtype):
     """Types supported by the new data generation and compliance flow."""
     if isinstance(dtype, list) or isinstance(dtype, tuple):
         dtype = dtype[0]
-    return dtype in (DType.FP32, DType.FP16)
+    return dtype in (DType.FP32, DType.FP16, DType.SHAPE)
 
 
 def getOpNameFromOpListName(opName):