
// Copyright (c) 2020, 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_OPERATOR(MLIR_NAME, SCHEMA_NAME, REF_IMPL_NAME, OPTIONS, QUANT_INFO)

  Description:
    MLIR_NAME: the symbolic string of this op, must match tosa_ops.td
    SCHEMA_NAME: corresponding operator name, must match "enum Op" in serialization/tosa.fbs
    REF_IMPL_NAME: name used internally in tosa reference implementation
    OPTIONS: compile time constant options of this op, corresponding to operator_option.def
    QUANT_INFO: quantization infomation of this op, corresponding to quant_info.def
*/


/* tensor operators */
DEF_OPERATOR(argmax,                  ARGMAX,                   ArgMax,                 Axis,             None)
DEF_OPERATOR(avg_pool2d,              AVG_POOL2D,               AvgPool2d,              Pool2d,           Unary)
DEF_OPERATOR(conv2d,                  CONV2D,                   Conv2d,                 Conv2d,           Conv)
DEF_OPERATOR(conv3d,                  CONV3D,                   Conv3d,                 None,             None)
DEF_OPERATOR(depthwise_conv2d,        DEPTHWISE_CONV2D,         DepthwiseConv2d,        Conv2d,           Conv)
DEF_OPERATOR(fully_connected,         FULLY_CONNECTED,          FullyConnected,         None,             Conv)
DEF_OPERATOR(matmul,                  MATMUL,                   MatMul,                 None,             MatMul)
DEF_OPERATOR(max_pool2d,              MAX_POOL2D,               MaxPool2d,              Pool2d,           None)
DEF_OPERATOR(transpose_conv2d,        TRANSPOSE_CONV2D,         TransposeConv2d,        TransposeConv2d,  Conv)

/* activation */
DEF_OPERATOR(clamp,                   CLAMP,                    Clamp,                  Clamp,            None)
DEF_OPERATOR(reluN,                   RELUN,                    ReluN,                  ReluN,            None)
DEF_OPERATOR(sigmoid,                 SIGMOID,                  Sigmoid,                None,             None)
DEF_OPERATOR(tanh,                    TANH,                     Tanh,                   None,             None)

/* elementwise - binary */
DEF_OPERATOR(add,                     ADD,                      Add,                    None,             None)
DEF_OPERATOR(arithmetic_right_shift,  ARITHMETIC_RIGHT_SHIFT,   ArithmeticRightShift,   ArithmeticRightShift, None)
DEF_OPERATOR(bitwise_and,             BITWISE_AND,              BitwiseAnd,             None,             None)
DEF_OPERATOR(bitwise_or,              BITWISE_OR,               BitwiseOr,              None,             None)
DEF_OPERATOR(bitwise_xor,             BITWISE_XOR,              BitwiseXor,             None,             None)
DEF_OPERATOR(logical_and,             LOGICAL_AND,              LogicalAnd,             None,             None)
DEF_OPERATOR(logical_left_shift,      LOGICAL_LEFT_SHIFT,       LogicalLeftShift,       None,             None)
DEF_OPERATOR(logical_right_shift,     LOGICAL_RIGHT_SHIFT,      LogicalRightShift,      None,             None)
DEF_OPERATOR(logical_or,              LOGICAL_OR,               LogicalOr,              None,             None)
DEF_OPERATOR(logical_xor,             LOGICAL_XOR,              LogicalXor,             None,             None)
DEF_OPERATOR(maximum,                 MAXIMUM,                  Maximum,                None,             None)
DEF_OPERATOR(minimum,                 MINIMUM,                  Minimum,                None,             None)
DEF_OPERATOR(mul,                     MUL,                      Mul,                    Mul,              None)
DEF_OPERATOR(pow,                     POW,                      Pow,                    None,             None)
DEF_OPERATOR(sub,                     SUB,                      Sub,                    None,             None)
DEF_OPERATOR(table,                   TABLE,                    Table,                  None,             None)

/* elementwise - unary */
DEF_OPERATOR(abs,                     ABS,                      Abs,                    None,             None)
DEF_OPERATOR(bitwise_not,             BITWISE_NOT,              BitwiseNot,             None,             None)
DEF_OPERATOR(ceil,                    CEIL,                     Ceil,                   None,             None)
DEF_OPERATOR(clz,                     CLZ,                      Clz,                    None,             None)
DEF_OPERATOR(exp,                     EXP,                      Exp,                    None,             None)
DEF_OPERATOR(floor,                   FLOOR,                    Floor,                  None,             None)
DEF_OPERATOR(log,                     LOG,                      Log,                    None,             None)
DEF_OPERATOR(logical_not,             LOGICAL_NOT,              LogicalNot,             None,             None)
DEF_OPERATOR(negate,                  NEGATE,                   Negate,                 None,             Unary)
DEF_OPERATOR(reciprocal,              RECIPROCAL,               Reciprocal,             None,             None)
DEF_OPERATOR(rsqrt,                   RSQRT,                    Rsqrt,                  None,             None)

/* elementwise - ternary */
DEF_OPERATOR(select,                  SELECT,                   Select,                 None,             None)

/* logical */
DEF_OPERATOR(equal,                   EQUAL,                    Equal,                  None,             None)
DEF_OPERATOR(greater,                 GREATER,                  Greater,                None,             None)
DEF_OPERATOR(greater_equal,           GREATER_EQUAL,            GreaterEqual,           None,             None)

/* reduction */
DEF_OPERATOR(reduce_any,              REDUCE_ANY,               ReduceAny,              Reduce,           None)
DEF_OPERATOR(reduce_all,              REDUCE_ALL,               ReduceAll,              Reduce,           None)
DEF_OPERATOR(reduce_max,              REDUCE_MAX,               ReduceMax,              Reduce,           None)
DEF_OPERATOR(reduce_min,              REDUCE_MIN,               ReduceMin,              Reduce,           None)
DEF_OPERATOR(reduce_prod,             REDUCE_PRODUCT,           ReduceProduct,          Reduce,           None)
DEF_OPERATOR(reduce_sum,              REDUCE_SUM,               ReduceSum,              Reduce,           None)

/* memory operation */
DEF_OPERATOR(concat,                  CONCAT,                   Concat,                 Axis,             None)
DEF_OPERATOR(pad,                     PAD,                      Pad,                    None,             Pad)
DEF_OPERATOR(reshape,                 RESHAPE,                  Reshape,                Reshape,          None)
DEF_OPERATOR(reverse,                 REVERSE,                  Reverse,                Reverse,          None)
DEF_OPERATOR(slice,                   SLICE,                    Slice,                  Slice,            None)
DEF_OPERATOR(tile,                    TILE,                     Tile,                   Tile,             None)
DEF_OPERATOR(transpose,               TRANSPOSE,                Transpose,              None,             None)

/* gather/scatter */
DEF_OPERATOR(gather,                  GATHER,                   Gather,                 Axis,             None)

/* image */
DEF_OPERATOR(resize,                  RESIZE,                   Resize,                 Resize,           None)

/* quantization */
DEF_OPERATOR(cast,                    CAST,                     Cast,                   None,             None)
DEF_OPERATOR(rescale,                 RESCALE,                  Rescale,                Rescale,          None)

/* data nodes */
DEF_OPERATOR(const,                   CONST,                    Const,                  None,             None)
DEF_OPERATOR(placeholder,             PLACEHOLDER,              Placeholder,            None,             None)
DEF_OPERATOR(identity,                IDENTITY,                 Identity,               None,             None)
DEF_OPERATOR(identityn,               IDENTITYN,                IdentityN,              None,             None)

/* custom operations */
DEF_OPERATOR(custom,                  CUSTOM,                   Custom,                 None,             None)

/* control flow operators */
DEF_OPERATOR(cond_if,                 COND_IF,                  CondIf,                 CondIf,           None)
DEF_OPERATOR(while_loop,              WHILE_LOOP,               WhileLoop,              WhileLoop,        None)
