blob: 4fb9c51d048eb3929f228f0a2532a7df48374e09 [file] [log] [blame]
/*
* 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 int8_t* input1, const int8_t* input2,
const int32_t input1_offset, const int32_t input1_mult,
const int32_t input1_shift, const int32_t input2_offset,
const int32_t input2_mult, const int32_t input2_shift,
const int32_t left_shift, int8_t* output,
const int32_t output_offset, const int32_t output_mult,
const int32_t output_shift,
const int32_t output_activation_min,
const int32_t output_activation_max,
const int32_t block_size);
void ElementwiseAddS16(const int16_t* input1, const int16_t* input2,
const int32_t input1_offset, const int32_t input1_mult,
const int32_t input1_shift, const int32_t input2_offset,
const int32_t input2_mult, const int32_t input2_shift,
const int32_t left_shift, int16_t* output,
const int32_t output_offset, const int32_t output_mult,
const int32_t output_shift,
const int32_t output_activation_min,
const int32_t output_activation_max,
const int32_t block_size);
void ElementwiseAddS32(const int32_t* input1, const int32_t* input2,
int32_t* output, const int32_t output_activation_min,
const int32_t output_activation_max,
const int32_t block_size);
void LeakyReluS8(const int8_t* input, int8_t* output, const int32_t block_size,
const int32_t input_zero_point,
const int32_t output_zero_point,
const int32_t output_multiplier_alpha,
const int32_t output_shift_alpha,
const int32_t output_multiplier_identity,
const int32_t output_shift_identity);
void LeakyReluS16(const int16_t* input, int16_t* output,
const int32_t block_size, const int32_t input_zero_point,
const int32_t output_zero_point,
const int32_t output_multiplier_alpha,
const int32_t output_shift_alpha,
const int32_t output_multiplier_identity,
const int32_t output_shift_identity);
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 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);
} // namespace kelvin::opt
#endif // TFLM_OPT_OPT_H_