# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

load("//rules:kelvin_v2.bzl", "kelvin_v2_binary")
load("//rules:utils.bzl", "template_rule")
load("//tests/cocotb/rvv/arithmetics:rvv_arithmetic.bzl", "rvv_arithmetic_test", "rvv_reduction_test", "rvv_widen_arithmetic_test")

package(default_visibility = ["//visibility:public"])

MATH_OPS = [
    "add",
    "sub",
    "mul",
    "div",
]

REDUCTION_OPS = [
    "redsum",
    "redmin",
    "redmax",
]

# tuple format DTYPE (sew, sign, dtype, vl)
DTYPES = [
    ("8", "i", "int8", "16"),
    ("16", "i", "int16", "8"),
    ("32", "i", "int32", "4"),
    ("8", "u", "uint8", "16"),
    ("16", "u", "uint16", "8"),
    ("32", "u", "uint32", "4"),
]

WIDEN_DTYPES = [
    ("i", "int8", "int16", "8", "16", "8", "256"),
    ("i", "int16", "int32", "16", "32", "4", "256"),
]

MATH_OP_TYPE_PAIRS = [
    (op, sew, sign, dtype, vl)
    for op in MATH_OPS
    for (sew, sign, dtype, vl) in DTYPES
]

MATH_WIDEN_OP_TYPE_PAIRS = [
    (op, sign, in_dtype, out_dtype, in_sew, out_sew, vl_step, num_test_values)
    for op in MATH_OPS[:3]
    for (sign, in_dtype, out_dtype, in_sew, out_sew, vl_step, num_test_values) in WIDEN_DTYPES
]

REDUCTION_OP_TYPE_PAIRS = [
    (op, sew, sign, dtype, vl)
    for op in REDUCTION_OPS
    for (sew, sign, dtype, vl) in DTYPES
]

# Division has different op code for signed and usigned
template_rule(
    rvv_arithmetic_test,
    {
        "template_{}_{}_m1".format(op, dtype): {
            "dtype": dtype,
            "sew": sew,
            "sign": sign,
            "num_operands": vl,
            "math_op": ["divu" if op == "div" and dtype[0] == "u" else op][0],
            "in_data_size": "16",
            "out_data_size": "16",
        }
        for (op, sew, sign, dtype, vl) in MATH_OP_TYPE_PAIRS
    },
)

template_rule(
    rvv_reduction_test,
    {
        "template_{}_{}_m1".format(op, dtype): {
            "dtype": dtype,
            "sew": sew,
            "sign": sign,
            "num_operands": vl,
            # redmin and redmax have different operators for signed/unsigned
            "reduction_op": op + "u" if ((op == "redmin" or op == "redmax") and dtype[0] == "u") else op,
            "in_data_size": "16",
            "out_data_size": "16",
        }
        for (op, sew, sign, dtype, vl) in REDUCTION_OP_TYPE_PAIRS
    },
)

template_rule(
    rvv_widen_arithmetic_test,
    {
        "template_widen_{}_{}_{}".format(op, in_dtype, out_dtype): {
            "in_dtype": in_dtype,
            "out_dtype": out_dtype,
            "in_sew": in_sew,
            "out_sew": out_sew,
            "sign": sign,
            "step_operands": vl_step,
            "math_op": op,
            "num_test_values": num_test_values,
        }
        for (op, sign, in_dtype, out_dtype, in_sew, out_sew, vl_step, num_test_values) in MATH_WIDEN_OP_TYPE_PAIRS
    },
)

template_rule(
    kelvin_v2_binary,
    {
        "rvv_{}_{}_m1".format(op, dtype): {
            "srcs": ["template_{}_{}_m1".format(op, dtype)],
        }
        for (op, _, _, dtype, _) in MATH_OP_TYPE_PAIRS + REDUCTION_OP_TYPE_PAIRS
    },
)

template_rule(
    kelvin_v2_binary,
    {
        "rvv_widen_{}_{}_{}".format(op, in_dtype, out_dtype): {
            "srcs": ["template_widen_{}_{}_{}".format(op, in_dtype, out_dtype)],
        }
        for (op, _, in_dtype, out_dtype, _, _, _, _) in MATH_WIDEN_OP_TYPE_PAIRS
    },
)

filegroup(
    name = "rvv_arith_tests",
    srcs = [
        ":rvv_{}_{}_m1.elf".format(op, dtype)
        for (op, _, _, dtype, _) in MATH_OP_TYPE_PAIRS + REDUCTION_OP_TYPE_PAIRS
    ] + [
        "rvv_widen_{}_{}_{}".format(op, in_dtype, out_dtype)
        for (op, _, in_dtype, out_dtype, _, _, _, _) in MATH_WIDEN_OP_TYPE_PAIRS
    ],
)
