/**
  ******************************************************************************
  * @file    lite_pad_generic.h
  * @author  AIS
  * @brief   header file of AI platform lite padding kernel datatypes
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2022 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  @verbatim
  @endverbatim
  ******************************************************************************
  */
#ifndef LITE_PADDING_DQNN_H
#define LITE_PADDING_DQNN_H
#pragma once

#include "ai_lite_interface.h"

/******************************************************************************/
/*  Forward Functions Section                                                 */
/******************************************************************************/

/*!
 * @brief Handles padding with 8 bits input/output in constant mode - Lite I/F
 * Channel 1st Format Input and Output
 * @ingroup lite_padding_dqnn
 */
LITE_API_ENTRY

void forward_lite_pad_8bit_ch1st_3x3_constant(ai_ptr_const in_data_tensor,
                                              ai_ptr out_data_tensor,
                                              const ai_handle fill_value,
                                              const ai_i32 height_in,
                                              const ai_i32 channel_in,
                                              const ai_ptr_offset ch_stride_in,
                                              const ai_ptr_offset h_stride_in,
                                              const ai_ptr_offset h_stride_pad);

/*!
 * @brief Handles padding with 8 bits input/output in constant mode - Lite I/F
 * @ingroup lite_padding_dqnn
 */
LITE_API_ENTRY
void forward_lite_pad_constant(ai_ptr_const in_data,
                               ai_ptr out_data,
                               const ai_handle fill_value,
                               const ai_i16 in_bits,
                               const ai_i32 height_in,
                               const ai_ptr_offset ch_stride_in,
                               const ai_ptr_offset h_stride_in,
                               const ai_ptr_offset h_stride_pad,
                               const ai_ptr_offset h_stride_pad_b,
                               const ai_ptr_offset w_stride_pad,
                               const ai_ptr_offset w_stride_pad_r);

/*!
 * @brief Handles padding with 8 bits input/output in edge mode - Lite I/F
 * @ingroup lite_padding_dqnn
 */
void forward_lite_pad_edge(ai_ptr_const in_data_tensor,
                           ai_ptr out_data,
                           const ai_i32 height_in,
                           const ai_i16 pads_y,
                           const ai_i16 pads_x_r,
                           const ai_ptr_offset h_stride_in,
                           const ai_ptr_offset w_stride_in,
                           const ai_ptr_offset h_stride_out,
                           const ai_ptr_offset h_stride_pad,
                           const ai_ptr_offset w_stride_pad,
                           const ai_ptr_offset h_stride_pad_b);

/*!
 * @brief Handles padding with 8 bits input/output in reflect mode - Lite I/F
 * @ingroup lite_padding_dqnn
 */
void forward_lite_pad_reflect(ai_ptr_const in_data,
                              ai_ptr out_data,
                              const ai_i32 depth,
                              const ai_i32 height_in,
                              const ai_i32 width_in,
                              const ai_i32 height_out,
                              const ai_i32 width_out,
                              const ai_ptr_offset h_stride_in,
                              const ai_ptr_offset w_stride_in,
                              const ai_ptr_offset h_stride_out,
                              const ai_ptr_offset w_stride_out,
                              const ai_i16 pads_x,
                              const ai_i16 pads_y,
                              const ai_i16 pads_y_b,
                              const ai_ptr_offset h_stride_pad,
                              const ai_ptr_offset w_stride_pad,
                              const ai_ptr_offset w_stride_pad_r);

#endif    /*LITE_PADDING_GENERIC_H*/
