
// Copyright (c) 2022, 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.

// THIS FILE IS GENERATED. DO NOT EDIT!
// See scripts/operator_api/generate_api.py

#ifndef OPERATORS_H_
#define OPERATORS_H_

#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

    // Note status needs to be aligned with graph_status
    enum tosa_status_t
    {
        tosa_status_valid         = 0,
        tosa_status_unpredictable = 1,
        tosa_status_error         = 2
    };

    enum tosa_mode_t
    {
        tosa_mode_unknown  = 0,
        tosa_mode_nearest  = 1,
        tosa_mode_bilinear = 2,
        tosa_mode_min      = 3,
        tosa_mode_max      = 4
    };

    enum tosa_datatype_t
    {
        {% for dataType in dataTypes: -%}
            {{dataType}} = {{loop.index-1}},
        {% endfor -%}
    };

    struct tosa_tensor_t
    {
        int32_t* shape;
        int32_t num_dims;
        tosa_datatype_t data_type;
        uint8_t* data;
        size_t size;
    };

    {% for operator in operators: %}
        tosa_status_t tosa_run_{{ operator.name }} (
            {%- for arg in operator.arguments: -%}
                {% if arg.type != "tosa_tensor_t" -%}const {% endif -%}{{arg.type}} client_{{arg.name}}{{arg.shape}}
                {% if loop.index < operator.arguments|length %},{% endif %}
            {%- endfor -%});
    {% endfor %}

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif // OPERATORS_H_