FULL data gen mode for FP16

Signed-off-by: evacha01 <evan.chandler@arm.com>
Change-Id: I81bb322132daf25328a40342edc62d8e1db9edd6
diff --git a/verif/generator/tosa_arg_gen.py b/verif/generator/tosa_arg_gen.py
index cbfffae..c596645 100644
--- a/verif/generator/tosa_arg_gen.py
+++ b/verif/generator/tosa_arg_gen.py
@@ -828,6 +828,12 @@
                 if "axis" in argsDict:
                     info["axis"] = int(argsDict["axis"])
                 tens_meta["dot_product_info"] = info
+            elif dg_type == gtu.DataGenType.FULL_RANGE:
+                info = {}
+                info["start_val"] = int(
+                    testGen.randInt(0, gtu.DTYPE_ATTRIBUTES[dtypeList[idx]]["fullset"])
+                )
+                tens_meta["full_range_info"] = info
             else:
                 # TODO - other data gen type
                 assert False, "TODO: support other data gen types"
@@ -1795,7 +1801,7 @@
         pass
 
     @staticmethod
-    def _add_data_generators(testGen, opName, dtype, arg_list, error_name):
+    def _add_data_generators(testGen, opName, shapeList, dtype, arg_list, error_name):
         """Add extra tests for each type of data generator for this op."""
         if (
             error_name is None
@@ -1820,7 +1826,16 @@
         new_arg_list = []
         for dg_type in dataGenTypesList:
             for arg_str, args_dict in arg_list:
-                args_dict["dg_type"] = dg_type
+
+                if dg_type == gtu.DataGenType.FULL_RANGE:
+                    tensor_size = gtu.product(shapeList[0])
+                    if tensor_size >= gtu.DTYPE_ATTRIBUTES[dtype]["fullset"]:
+                        # Large enough tensor data size for full range, add a single test
+                        num_test_sets = 0
+                    else:
+                        # Not enough data size for full range of values, revert to random numbers
+                        dg_type = gtu.DataGenType.PSEUDO_RANDOM
+
                 if dg_type == gtu.DataGenType.PSEUDO_RANDOM:
                     if error_name is None:
                         num_test_sets = (
@@ -1829,6 +1844,7 @@
                             else 0
                         )
                     else:
+                        # Add single test for pseudo random
                         num_test_sets = 0
 
                 elif dg_type == gtu.DataGenType.DOT_PRODUCT:
@@ -1852,13 +1868,16 @@
 
                 if num_test_sets > 0:
                     for s in range(0, num_test_sets):
-                        new_arg_str = f"{arg_str}_s{s}" if arg_str else f"s{s}"
-                        new_args_dict = args_dict.copy()
-                        new_args_dict["s"] = s
-                        new_arg_list.append((new_arg_str, new_args_dict))
+                        set_arg_str = f"{arg_str}_s{s}" if arg_str else f"s{s}"
+                        set_args_dict = args_dict.copy()
+                        set_args_dict["s"] = s
+                        set_args_dict["dg_type"] = dg_type
+                        new_arg_list.append((set_arg_str, set_args_dict))
                 else:
                     # Default is a single test
-                    new_arg_list.append((arg_str, args_dict))
+                    new_args_dict = args_dict.copy()
+                    new_args_dict["dg_type"] = dg_type
+                    new_arg_list.append((arg_str, new_args_dict))
 
         return new_arg_list
 
@@ -1869,6 +1888,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtype,
             [("", {})],
             error_name,
@@ -1883,6 +1903,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtype,
             [("", {"num_test_sets": 3})],
             error_name,
@@ -1921,6 +1942,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtype,
             arg_list,
             error_name,
@@ -2160,6 +2182,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtypes[0],
             arg_list,
             error_name,
@@ -2194,6 +2217,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             input_dtype,
             arg_list,
             error_name,
@@ -2246,6 +2270,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtype,
             arg_list,
             error_name,
@@ -2402,6 +2427,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtypes[0],
             arg_list,
             error_name,
@@ -2482,6 +2508,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtype,
             arg_list,
             error_name,
@@ -2685,6 +2712,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtype,
             arg_list,
             error_name,
@@ -2774,6 +2802,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtype,
             arg_list,
             error_name,
@@ -2925,6 +2954,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             inDtype,
             arg_list,
             error_name,
@@ -2947,6 +2977,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtype,
             arg_list,
             error_name,
@@ -2967,6 +2998,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtype,
             arg_list,
             error_name,
@@ -2994,6 +3026,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtype,
             arg_list,
             error_name,
@@ -3019,6 +3052,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtype,
             arg_list,
             error_name,
@@ -3091,6 +3125,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtype,
             arg_list,
             error_name,
@@ -3137,6 +3172,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtype,
             arg_list,
             error_name,
@@ -3179,6 +3215,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtype,
             arg_list,
             error_name,
@@ -3214,6 +3251,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtype,
             arg_list,
             error_name,
@@ -3547,6 +3585,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtype,
             arg_list,
             error_name,
@@ -3586,6 +3625,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtype,
             arg_list,
             error_name,
@@ -3606,6 +3646,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtype,
             arg_list,
             error_name,
@@ -3624,6 +3665,7 @@
         arg_list = TosaArgGen._add_data_generators(
             testGen,
             opName,
+            shapeList,
             dtype,
             arg_list,
             error_name,
diff --git a/verif/generator/tosa_test_gen.py b/verif/generator/tosa_test_gen.py
index 415858c..a1f54c6 100644
--- a/verif/generator/tosa_test_gen.py
+++ b/verif/generator/tosa_test_gen.py
@@ -365,7 +365,7 @@
                 if "ksb" in argsDict
                 else int(argsDict["ks"]),
             }
-        elif argsDict["dg_type"] == gtu.DataGenType.OP_SPECIAL:
+        elif argsDict["dg_type"] == gtu.DataGenType.SPECIAL:
             mode = gtu.ComplianceMode.FP_SPECIAL
         elif "compliance" in op and "ulp" in op["compliance"]:
             mode = gtu.ComplianceMode.ULP
@@ -3959,7 +3959,7 @@
                 TosaErrorValidator.evWrongOutputList,
             ),
             "data_gen": {
-                "fp": (gtu.DataGenType.PSEUDO_RANDOM,),
+                "fp": (gtu.DataGenType.FULL_RANGE,),
             },
         },
         "bitwise_not": {
@@ -3996,7 +3996,7 @@
                 TosaErrorValidator.evWrongOutputList,
             ),
             "data_gen": {
-                "fp": (gtu.DataGenType.PSEUDO_RANDOM,),
+                "fp": (gtu.DataGenType.FULL_RANGE,),
             },
             "compliance": {"ulp": 0.5},
         },
@@ -4055,7 +4055,7 @@
                 TosaErrorValidator.evWrongOutputList,
             ),
             "data_gen": {
-                "fp": (gtu.DataGenType.PSEUDO_RANDOM,),
+                "fp": (gtu.DataGenType.FULL_RANGE,),
             },
         },
         "floor": {
@@ -4075,7 +4075,7 @@
                 TosaErrorValidator.evWrongOutputList,
             ),
             "data_gen": {
-                "fp": (gtu.DataGenType.PSEUDO_RANDOM,),
+                "fp": (gtu.DataGenType.FULL_RANGE,),
             },
             "compliance": {"ulp": 0.5},
         },
@@ -4096,7 +4096,7 @@
                 TosaErrorValidator.evWrongOutputList,
             ),
             "data_gen": {
-                "fp": (gtu.DataGenType.PSEUDO_RANDOM,),
+                "fp": (gtu.DataGenType.FULL_RANGE,),
             },
             "compliance": {"ulp": 5},
         },
@@ -4137,7 +4137,7 @@
                 TosaErrorValidator.evWrongOutputList,
             ),
             "data_gen": {
-                "fp": (gtu.DataGenType.PSEUDO_RANDOM,),
+                "fp": (gtu.DataGenType.FULL_RANGE,),
             },
         },
         "reciprocal": {
@@ -4157,7 +4157,7 @@
                 TosaErrorValidator.evWrongOutputList,
             ),
             "data_gen": {
-                "fp": (gtu.DataGenType.PSEUDO_RANDOM,),
+                "fp": (gtu.DataGenType.FULL_RANGE,),
             },
             "compliance": {"ulp": 1.0},
         },
@@ -4178,7 +4178,7 @@
                 TosaErrorValidator.evWrongOutputList,
             ),
             "data_gen": {
-                "fp": (gtu.DataGenType.PSEUDO_RANDOM,),
+                "fp": (gtu.DataGenType.FULL_RANGE,),
             },
             "compliance": {"ulp": 2},
         },
diff --git a/verif/generator/tosa_utils.py b/verif/generator/tosa_utils.py
index 384463f..6558bf8 100644
--- a/verif/generator/tosa_utils.py
+++ b/verif/generator/tosa_utils.py
@@ -13,22 +13,23 @@
 # Data type information dictionary
 # - str: filename abbreviation
 # - width: number of bytes needed for type
+# - fullset: precalculated number of possible values in the data type's range, equal to 2^width
 # - json: JSON type string
 DTYPE_ATTRIBUTES = {
-    DType.BOOL: {"str": "b", "width": 1, "json": "BOOL"},
-    DType.INT4: {"str": "i4", "width": 4, "json": "INT4"},
-    DType.INT8: {"str": "i8", "width": 8, "json": "INT8"},
-    DType.UINT8: {"str": "u8", "width": 8, "json": "UINT8"},
-    DType.INT16: {"str": "i16", "width": 16, "json": "INT16"},
-    DType.UINT16: {"str": "u16", "width": 16, "json": "UINT16"},
-    DType.INT32: {"str": "i32", "width": 32, "json": "INT32"},
-    DType.INT48: {"str": "i48", "width": 48, "json": "INT48"},
-    DType.SHAPE: {"str": "s", "width": 64, "json": "SHAPE"},
-    DType.FP16: {"str": "f16", "width": 16, "json": "FP16"},
-    DType.BF16: {"str": "bf16", "width": 16, "json": "BF16"},
-    DType.FP32: {"str": "f32", "width": 32, "json": "FP32"},
-    DType.FP8E4M3: {"str": "f8e4m3", "width": 8, "json": "FP8E4M3"},
-    DType.FP8E5M2: {"str": "f8e5m2", "width": 8, "json": "FP8E5M2"},
+    DType.BOOL: {"str": "b", "width": 1, "fullset": 2, "json": "BOOL"},
+    DType.INT4: {"str": "i4", "width": 4, "fullset": 16, "json": "INT4"},
+    DType.INT8: {"str": "i8", "width": 8, "fullset": 256, "json": "INT8"},
+    DType.UINT8: {"str": "u8", "width": 8, "fullset": 256, "json": "UINT8"},
+    DType.INT16: {"str": "i16", "width": 16, "fullset": 65536, "json": "INT16"},
+    DType.UINT16: {"str": "u16", "width": 16, "fullset": 65536, "json": "UINT16"},
+    DType.INT32: {"str": "i32", "width": 32, "fullset": 1 << 32, "json": "INT32"},
+    DType.INT48: {"str": "i48", "width": 48, "fullset": 1 << 48, "json": "INT48"},
+    DType.SHAPE: {"str": "s", "width": 64, "fullset": 1 << 64, "json": "SHAPE"},
+    DType.FP16: {"str": "f16", "width": 16, "fullset": 65536, "json": "FP16"},
+    DType.BF16: {"str": "bf16", "width": 16, "fullset": 65536, "json": "BF16"},
+    DType.FP32: {"str": "f32", "width": 32, "fullset": 1 << 32, "json": "FP32"},
+    DType.FP8E4M3: {"str": "f8e4m3", "width": 8, "fullset": 256, "json": "FP8E4M3"},
+    DType.FP8E5M2: {"str": "f8e5m2", "width": 8, "fullset": 256, "json": "FP8E5M2"},
 }
 
 
@@ -49,9 +50,9 @@
 
     PSEUDO_RANDOM = 0
     DOT_PRODUCT = 1
-    OP_BOUNDARY = 2
-    OP_FULLSET = 3
-    OP_SPECIAL = 4
+    BOUNDARY = 2
+    FULL_RANGE = 3
+    SPECIAL = 4
     FIXED_DATA = 5