[ref model] Change RescaleOp attrs to inputs

This patch implements changes required for RescaleOp's
multiplier and shift changing from attributes to inputs

Signed-off-by: Tai Ly <tai.ly@arm.com>
Change-Id: I178919727e3220c749dad0ebce141e695868fee0
diff --git a/verif/generator/tosa_arg_gen.py b/verif/generator/tosa_arg_gen.py
index 592c491..cbfffae 100644
--- a/verif/generator/tosa_arg_gen.py
+++ b/verif/generator/tosa_arg_gen.py
@@ -744,6 +744,10 @@
                         arr = np.int64(argsDict["fixed_data"][idx])
                     elif dtype == DType.INT8:
                         arr = np.int8(argsDict["fixed_data"][idx])
+                    elif dtype == DType.INT16:
+                        arr = np.int16(argsDict["fixed_data"][idx])
+                    elif dtype == DType.INT32:
+                        arr = np.int32(argsDict["fixed_data"][idx])
                     else:
                         assert False, "Unsupported fixed_data type"
                 else:
@@ -1060,6 +1064,26 @@
         )
 
     @staticmethod
+    def tvgRescale(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
+        scale32 = argsDict["scale"]
+        multiplier_arr = argsDict["multiplier"]
+        shift_arr = argsDict["shift"]
+
+        if scale32:
+            dtypeList[1] = DType.INT32
+        else:
+            dtypeList[1] = DType.INT16
+        shapeList[1] = [len(multiplier_arr)]
+        dtypeList[2] = DType.INT8
+        shapeList[2] = [len(shift_arr)]
+        # Create a new list for the pre-generated data in argsDict["fixed_data"]
+        argsDict["fixed_data"] = [None, multiplier_arr, shift_arr]
+
+        return TosaTensorValuesGen.tvgLazyGenDefault(
+            testGen, opName, dtypeList, shapeList, argsDict, error_name
+        )
+
+    @staticmethod
     def tvgPad(testGen, opName, dtypeList, shapeList, argsDict, error_name=None):
         # argsDict["pad"] is 2D array, need to flatten it to get list of values
         pad_values = argsDict["pad"].flatten()
@@ -2842,6 +2866,43 @@
                             # Illegal condition.  ERROR_IF(!scale32 && double_round)
                             continue
 
+                        if per_channel:
+                            nc = shapeList[0][-1]
+                        else:
+                            nc = 1
+
+                        in_type_width = gtu.dtypeWidth(inDtype)
+                        out_type_width = gtu.dtypeWidth(outDtype)
+
+                        # Calculate scale based on:
+                        # scale = a *(2^output_width)/(2^input_width))
+
+                        a = np.float32(testGen.rng.random(size=[nc]))
+                        scale_arr = a * np.float32(
+                            (1 << out_type_width) / (1 << in_type_width)
+                        )
+
+                        if scale32:
+                            # Cap the scaling at 2^31 - 1 for scale32
+                            scale_arr = np.clip(
+                                scale_arr, 1.0 / (1 << 31), (1 << 31) - 1
+                            )
+                        else:
+                            # Cap the scaling at 2^15 - 1 for scale16
+                            scale_arr = np.clip(scale_arr, 1.0 / (1 << 31), 32767.0)
+
+                        # print('{} {} -> {}'.format(out_type_width, in_type_width, scale_arr))
+
+                        multiplier_arr = np.int32(np.zeros(shape=[nc]))
+                        shift_arr = np.int32(np.zeros(shape=[nc]))
+                        for i in range(nc):
+                            (
+                                multiplier_arr[i],
+                                shift_arr[i],
+                            ) = TosaQuantGen.computeMultiplierAndShift(
+                                scale_arr[i], scale32
+                            )
+
                         arg_list.append(
                             (
                                 "out{}_sc{}_dr{}_pc{}".format(
@@ -2855,6 +2916,8 @@
                                     "scale": scale32,
                                     "double_round": double_round,
                                     "per_channel": per_channel,
+                                    "multiplier": multiplier_arr,
+                                    "shift": shift_arr,
                                 },
                             )
                         )