79 lines
3.7 KiB
C
79 lines
3.7 KiB
C
/****************************************************************************
|
|
|
|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
|
|
|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
|
be copied by any method or incorporated into another program without
|
|
the express written consent of Aerospace C.Power. This Information or any portion
|
|
thereof remains the property of Aerospace C.Power. The Information contained herein
|
|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
|
liability for its use in any way and conveys no license or title under
|
|
any patent or copyright and makes no representation or warranty that this
|
|
Information is free from patent or copyright infringement.
|
|
|
|
****************************************************************************/
|
|
#ifndef CNN_K3D_H
|
|
#define CNN_K3D_H
|
|
#include "os_types_api.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/** \defgroup cnn k3d API
|
|
* @brief cnn k3d APIs
|
|
* These functions could be used for mid_filter or depth calculation
|
|
* The formular for depth calculation is as below, where x is the input image, Z is the output, f_x_ir, L and d0, whose units are all millimeter, are constant independent from x,
|
|
* Z = f_x_ir * L / (f_x_ir * L / d0 - x)
|
|
* CNN engine will be used in these functions, except for cpu_prelu_ddr, cpu_prelu_before_depth, cpu_prelu_before_point, cpu_prelu_iram.
|
|
* For any features, every column will occupy a size which is a multiple of 32 bytes. Here column means the last dimension of a tensor
|
|
* For example, if a tensor of type int16_t named A is of size 4 * 30 * 300, it will be saved in the memory of this form so that every column occupies 608 bytes:
|
|
* A[0][0][0], A[0][0][1], ..., A[0][0][299], 0, 0, 0, ..., 0, A[0][1][0], A[0][1][1], ..., A[0][1][299], 0, 0, 0, 0, ..., 0, ..., A[0][29][0], ..., A[0][29][299], 0, ..., 0, A[1][0][0], ...
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
|
|
/** @addtogroup cnn_k3d_APIs
|
|
* @{
|
|
*/
|
|
|
|
enum cnn_k3d_driver_to_do {
|
|
mid_filter_only = 2,
|
|
mid_filter_and_depth = 3,
|
|
depth_only = 4
|
|
};
|
|
|
|
struct cnn_k3d_config_bean {
|
|
uint32_t input_addr; // where the input is put
|
|
uint32_t output_addr; // where the output will be put
|
|
uint16_t input_height; // height of input image
|
|
uint16_t input_width; // width of input image
|
|
uint16_t output_height; // height of output image, you don't need to set it, this will be set after calculation
|
|
uint16_t output_width; // width of output image, you don't need to set it, this will be set after calculation
|
|
uint16_t padding_to_same; // 1: use "SAME" mode for padding, 0: use "VALID" mode for padding, ref: tensorflow doc
|
|
enum cnn_k3d_driver_to_do to_do; // 2: middle filter only, 3: middle filter and depth calculation, 4: depth calculation only
|
|
uint8_t feature_signed; // non-zero: input are signed numbers, zero: input are unsigned numbers, only valid when to_do is not 4 cause input need to be signed when to_do is 4
|
|
uint8_t int8_mode; // non-zero: 8bit mode, zero: 16bit mode, only valid when to_do is 2
|
|
int16_t F_L_d0_mu; // the value of f_x_ir * L / d0 in the formular for depth calculation, this number should be in form of S(16, 4), i.e. int16_t, with fraction of 4bits
|
|
uint16_t F_L_mu; // the value of f_x_ir * L in the formular for depth calculation, this number should be in form of US(16, 1), i.e. uint16_t, with fraction of 1bits
|
|
};
|
|
|
|
/* @brief cnn_k3d_driver() - do a middle filter or depth calculation in 16bit mode, middle filter's kernel is 3
|
|
* @param config: config info of the pooling process
|
|
* @return 0 -- succeed
|
|
* @return 2 -- input height is 0
|
|
* @return 3 -- input width is 0
|
|
*/
|
|
uint8_t cnn_k3d_driver(struct cnn_k3d_config_bean *config);
|
|
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif |