
// Copyright (c) 2020-2024, ARM Limited.
//
//    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.

/*
  Syntax:
    DEF_ATTRIBUTE(ATTRIBUTE_NAME, NUM_ARGS_IN_ATTRIBUTES, ARG0_TYPE, ARG0_SCALAR_OR_VECTOR, ARGS0_NAME, ...)

  Description:
    ATTRIBUTE_NAME: corresponding attribute name, must match corresponding "table XXXAttribute" in tosa.fbs
    NUM_ARGS_IN_ATTRIBUTES: number of arguments in this attribute
    ARG0_TYPE: data type of arg0 in attribute
    ARG0_SCALAR_OR_VECTOR: is arg0 a scalar(S) or a vector(V)
    ARG0_NAME: name of arg0
    ...: variadic variables for more arguments, depending on NUM_ARGS_IN_ATTRIBUTES
*/

DEF_ATTRIBUTE(Pool, 6,
              int32_t, V, pad,
              int32_t, V, kernel,
              int32_t, V, stride,
              int32_t, S, input_zp,
              int32_t, S, output_zp,
              DType,   S, acc_type)

DEF_ATTRIBUTE(Conv, 7,
              int32_t, V, pad,
              int32_t, V, stride,
              int32_t, V, dilation,
              int32_t, S, input_zp,
              int32_t, S, weight_zp,
              bool,    S, local_bound,
              DType,   S, acc_type)

DEF_ATTRIBUTE(TransposeConv, 7,
              int32_t, V, out_pad,
              int32_t, V, stride,
              int32_t, V, output_shape,
              int32_t, S, input_zp,
              int32_t, S, weight_zp,
              bool,    S, local_bound,
              DType,   S, acc_type)

DEF_ATTRIBUTE(Pad, 2,
              uint8_t, V, pad_const,
              DType,   S, type)

DEF_ATTRIBUTE(Axis, 1,
              int32_t, S, axis)

DEF_ATTRIBUTE(Resize, 4,
              int16_t, V, scale,
              int16_t, V, offset,
              int16_t, V, border,
              ResizeMode, S, mode)

DEF_ATTRIBUTE(Clamp, 3,
              uint8_t, V, min_val,
              uint8_t, V, max_val,
              DType,   S, type)

DEF_ATTRIBUTE(Rescale, 7,
              int32_t, S, input_zp,
              int32_t, S, output_zp,
              bool, S, scale32,
              bool, S, double_round,
              bool, S, per_channel,
              bool, S, input_unsigned,
              bool, S, output_unsigned)

DEF_ATTRIBUTE(Mul, 1,
              int32_t, S, shift)

DEF_ATTRIBUTE(ArithmeticRightShift, 1,
              bool, S, round)

DEF_ATTRIBUTE(CondIf, 2,
              string, S, then_graph,
              string, S, else_graph)

DEF_ATTRIBUTE(WhileLoop, 2,
              string, S, cond_graph,
              string, S, body_graph)

DEF_ATTRIBUTE(Transpose, 1,
              int32_t, V, perms)

DEF_ATTRIBUTE(Table, 1,
              int16_t, V, table)

DEF_ATTRIBUTE(MatMul, 2,
              int32_t, S, a_zp,
              int32_t, S, b_zp)

DEF_ATTRIBUTE(FullyConnected, 2,
              int32_t, S, input_zp,
              int32_t, S, weight_zp)

DEF_ATTRIBUTE(Negate, 2,
              int32_t, S, input1_zp,
              int32_t, S, output_zp)

DEF_ATTRIBUTE(Custom, 3,
              string, S, operator_name,
              string, S, domain_name,
              uint8_t, V, implementation_attrs)

DEF_ATTRIBUTE(FFT, 2,
              bool, S, inverse,
              bool, S, local_bound)

DEF_ATTRIBUTE(RFFT, 1,
              bool, S, local_bound)
