aboutsummaryrefslogtreecommitdiff
path: root/verif
diff options
context:
space:
mode:
authorWon Jeon <won.jeon@arm.com>2024-01-18 06:31:55 +0000
committerWon Jeon <won.jeon@arm.com>2024-01-23 16:56:33 +0000
commit64e4bfe627ded0ba44ff60b23db28c1ff5d73d13 (patch)
treee4744f2124d90882c97af2159c460ba1d7c46d86 /verif
parent8690a0873fac28acccbb0acb15c16e8337e14df1 (diff)
downloadreference_model-64e4bfe627ded0ba44ff60b23db28c1ff5d73d13.tar.gz
Update RESHAPE and TILE conformance testing
Signed-off-by: Won Jeon <won.jeon@arm.com> Change-Id: Iaf59472cb32e03a92bad87ae9dba1b7548f20268
Diffstat (limited to 'verif')
-rw-r--r--verif/generator/datagenerator.py2
-rw-r--r--verif/generator/tosa_arg_gen.py79
-rw-r--r--verif/generator/tosa_test_gen.py30
-rw-r--r--verif/generator/tosa_utils.py5
4 files changed, 71 insertions, 45 deletions
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 @@ class GenerateLibrary:
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 @@ class TosaTensorValuesGen:
# 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 @@ class TosaTensorValuesGen:
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 @@ class TosaTensorValuesGen:
if dg_type == gtu.DataGenType.PSEUDO_RANDOM:
info = {}
- # 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"]
-
- 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 (
+ 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"]
+
+ 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 @@ class TosaTensorValuesGen:
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 @@ class TosaTensorValuesGen:
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 @@ class TosaTestGen:
):
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 @@ class TosaTestGen:
):
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 @@ class TosaTestGen:
"build_fcn": (
build_reshape,
TosaTensorGen.tgBasic,
- TosaTensorValuesGen.tvgLazyGenDefault,
+ TosaTensorValuesGen.tvgReshape,
TosaArgGen.agReshape,
),
"types": TYPE_FIB,
@@ -4302,7 +4286,7 @@ class TosaTestGen:
"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 @@ class DataGenType(IntEnum):
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):