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
 |