
// Copyright (c) 2020-2021, 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_QUANTIZATION_INFO(NAME, NUM_ARGS_IN_OPTIONS, ARG0_TYPE, ARG0_SCALAR_OR_VECTOR, ARGS0_NAME, ...)

  Description:
    NAME: corresponding quantization info name, must match corresponding "table XXXQuantInfo" in tosa.fbs
    NUM_ARGS_IN_QINFO: number of arguments in this quantization info
    ARG0_TYPE: data type of arg0
    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_QINFO
*/


DEF_QUANTIZATION_INFO(Unary, 2,
                      int32_t, S, input_zp,
                      int32_t, S, output_zp)

DEF_QUANTIZATION_INFO(Conv, 2,
                      int32_t, S, input_zp,
                      int32_t, S, weight_zp)

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

DEF_QUANTIZATION_INFO(Pad, 1,
                      int32_t, S, input_zp)
