/*
 * SPDX-FileCopyrightText: Copyright 2021-2022 Arm Limited and/or its affiliates <open-source-office@arm.com>
 * SPDX-License-Identifier: Apache-2.0
 *
 * 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.
 */
#ifndef TENSORFLOW_LITE_MICRO_LOCAL_HPP
#define TENSORFLOW_LITE_MICRO_LOCAL_HPP

/* We include all our TensorFlow Lite Micro headers here */

/**
 * TensorFlow Lite Micro sources can generate a lot of warnings from the usage
 * of a single macro (TF_LITE_REMOVE_VIRTUAL_DELETE). Suppress the known ones
 * here to prevent them from masking warnings that might be generated by our
 * application sources.
 */
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wunused-parameter"
    #include "tensorflow/lite/micro/micro_mutable_op_resolver.h"
    #include "tensorflow/lite/micro/micro_interpreter.h"
    #include "tensorflow/lite/micro/all_ops_resolver.h"
    #pragma clang diagnostic pop
#elif defined(__GNUC__)
    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wunused-parameter"
    #include "tensorflow/lite/micro/micro_mutable_op_resolver.h"
    #include "tensorflow/lite/micro/micro_interpreter.h"
    #include "tensorflow/lite/micro/all_ops_resolver.h"
    #pragma GCC diagnostic pop
#else
    #include "tensorflow/lite/micro/micro_mutable_op_resolver.h"
    #include "tensorflow/lite/micro/micro_interpreter.h"
    #include "tensorflow/lite/micro/all_ops_resolver.h"
#endif

#include "tensorflow/lite/c/common.h"
#include "tensorflow/lite/micro/kernels/micro_ops.h"
#include "tensorflow/lite/micro/tflite_bridge/op_resolver_bridge.h"
#include "tensorflow/lite/schema/schema_generated.h"
#include "tensorflow/lite/schema/schema_utils.h"

#if defined (TESTS)
    #include "tensorflow/lite/micro/test_helpers.h"
#endif /* defined (TESTS) */

namespace arm {
namespace app {

    /** Struct for quantization parameters. */
    struct QuantParams {
        float   scale   = 1.0;
        int     offset  = 0;
    };

    /**
     * @brief       Gets the quantization parameters from a tensor
     * @param[in]   tensor  pointer to the tensor.
     * @return      QuantParams object.
     */
    QuantParams GetTensorQuantParams(TfLiteTensor* tensor);

} /* namespace app */
} /* namespace arm */

/**
 * @brief Prints the tensor flow version in use to stdout.
 */
void PrintTensorFlowVersion();

/**
 * @brief   String logging functionality expected to be defined
 *          by TensorFlow Lite Micro's error reporter.
 * @param[in]   s   Pointer to the string.
 */
extern "C" void DebugLog(const char* s) __attribute__((__weak__));

#endif /* TENSORFLOW_LITE_MICRO_LOCAL_HPP */
