/*
 * Copyright 2024 Google LLC
 *
 * 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 TFLM_OPT_OPT_H_
#define TFLM_OPT_OPT_H_

/* clang-format off */
#include <cstring>
#include "tensorflow/lite/kernels/internal/runtime_shape.h"
#include "tensorflow/lite/kernels/internal/types.h"
/* clang-format on */

namespace kelvin::opt {
void* Memcpy(void* dst, const void* src, size_t n);
void ElementwiseAddS8(const tflite::ArithmeticParams& params,
                      const tflite::RuntimeShape& input1_shape,
                      const int8_t* input1_data,
                      const tflite::RuntimeShape& input2_shape,
                      const int8_t* input2_data,
                      const tflite::RuntimeShape& output_shape,
                      int8_t* output_data);
void ElementwiseAddS16(const tflite::ArithmeticParams& params,
                       const tflite::RuntimeShape& input1_shape,
                       const int16_t* input1_data,
                       const tflite::RuntimeShape& input2_shape,
                       const int16_t* input2_data,
                       const tflite::RuntimeShape& output_shape,
                       int16_t* output_data);
void ElementwiseAddS32(const tflite::ArithmeticParams& params,
                       const tflite::RuntimeShape& input1_shape,
                       const int32_t* input1_data,
                       const tflite::RuntimeShape& input2_shape,
                       const int32_t* input2_data,
                       const tflite::RuntimeShape& output_shape,
                       int32_t* output_data);
void LeakyReluS8(const tflite::LeakyReluParams& params,
                 const tflite::RuntimeShape& input_shape,
                 const int8_t* input_data,
                 const tflite::RuntimeShape& output_shape, int8_t* output_data);
void LeakyReluS16(const tflite::LeakyReluParams& params,
                  const tflite::RuntimeShape& input_shape,
                  const int16_t* input_data,
                  const tflite::RuntimeShape& output_shape,
                  int16_t* output_data);
void ConvS16B32(const tflite::ConvParams& params,
                const int32_t* output_multiplier, const int32_t* output_shift,
                const tflite::RuntimeShape& input_shape,
                const int16_t* input_data,
                const tflite::RuntimeShape& filter_shape,
                const int8_t* filter_data,
                const tflite::RuntimeShape& bias_shape,
                const int32_t* bias_data,
                const tflite::RuntimeShape& output_shape, int16_t* output_data);
void ConvS16B64(const tflite::ConvParams& params,
                const int32_t* output_multiplier, const int32_t* output_shift,
                const tflite::RuntimeShape& input_shape,
                const int16_t* input_data,
                const tflite::RuntimeShape& filter_shape,
                const int8_t* filter_data,
                const tflite::RuntimeShape& bias_shape,
                const int64_t* bias_data,
                const tflite::RuntimeShape& output_shape, int16_t* output_data);
void ConvS8(const tflite::ConvParams& params, const int32_t* output_multiplier,
            const int32_t* output_shift,
            const tflite::RuntimeShape& input_shape, const int8_t* input_data,
            const tflite::RuntimeShape& filter_shape, const int8_t* filter_data,
            const tflite::RuntimeShape& bias_shape, const int32_t* bias_data,
            const tflite::RuntimeShape& output_shape, int8_t* output_data);
void DepthwiseConvS8(
    const tflite::DepthwiseParams& params, const int32_t* output_multiplier,
    const int32_t* output_shift, const tflite::RuntimeShape& input_shape,
    const int8_t* input_data, const tflite::RuntimeShape& filter_shape,
    const int8_t* filter_data, const tflite::RuntimeShape& bias_shape,
    const int32_t* bias_data, const tflite::RuntimeShape& output_shape,
    int8_t* output_data);
void DepthwiseConvS16(
    const tflite::DepthwiseParams& params, const int32_t* output_multiplier,
    const int32_t* output_shift, const tflite::RuntimeShape& input_shape,
    const int16_t* input_data, const tflite::RuntimeShape& filter_shape,
    const int8_t* filter_data, const tflite::RuntimeShape& bias_shape,
    const int64_t* bias_data, const tflite::RuntimeShape& output_shape,
    int16_t* output_data);
void MaxPoolS8(const tflite::PoolParams& params,
               const tflite::RuntimeShape& input_shape,
               const int8_t* input_data,
               const tflite::RuntimeShape& output_shape, int8_t* output_data);
void MaxPoolS16(const tflite::PoolParams& params,
                const tflite::RuntimeShape& input_shape,
                const int16_t* input_data,
                const tflite::RuntimeShape& output_shape, int16_t* output_data);
void MulS8(const tflite::ArithmeticParams& params,
           const tflite::RuntimeShape& input1_shape, const int8_t* input1_data,
           const tflite::RuntimeShape& input2_shape, const int8_t* input2_data,
           const tflite::RuntimeShape& output_shape, int8_t* output_data);
void MulS16(const tflite::ArithmeticParams& params,
            const tflite::RuntimeShape& input1_shape,
            const int16_t* input1_data,
            const tflite::RuntimeShape& input2_shape,
            const int16_t* input2_data,
            const tflite::RuntimeShape& output_shape, int16_t* output_data);
void LogisticS8(int32_t input_zero_point, int32_t input_range_radius,
                int32_t input_multiplier, int32_t input_left_shift,
                int32_t input_size, const int8_t* input_data,
                int8_t* output_data);
void ResizeNearestNeighborS8(
    const tflite::ResizeNearestNeighborParams& op_params,
    const tflite::RuntimeShape& unextended_input_shape,
    const int8_t* input_data, const tflite::RuntimeShape& output_size_shape,
    const int32_t* output_size_data,
    const tflite::RuntimeShape& unextended_output_shape, int8_t* output_data);

}  // namespace kelvin::opt

#endif  // TFLM_OPT_OPT_H_
