/* * Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED. * 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 _HI_NNIE_H_ #define _HI_NNIE_H_ #include "hi_comm_svp.h" #include "hi_common.h" #ifdef __cplusplus #if __cplusplus extern "C" { #endif #endif /* SVP_NNIE Error Code */ typedef enum hiEN_SVP_NNIE_ERR_CODE_E { ERR_SVP_NNIE_SYS_TIMEOUT = 0x40, /* SVP_NNIE process timeout */ ERR_SVP_NNIE_QUERY_TIMEOUT = 0x41, /* SVP_NNIE query timeout */ ERR_SVP_NNIE_CFG_ERR = 0x42, /* SVP_NNIE Configure error */ ERR_SVP_NNIE_OPEN_FILE = 0x43, /* SVP NNIE open file error */ ERR_SVP_NNIE_READ_FILE = 0x44, /* SVP NNIE read file error */ ERR_SVP_NNIE_WRITE_FILE = 0x45, /* SVP NNIE write file error */ ERR_SVP_NNIE_BUTT } EN_SVP_NNIE_ERR_CODE_E; /* Invalid device ID */ #define HI_ERR_SVP_NNIE_INVALID_DEVID HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) /* Invalid channel ID */ #define HI_ERR_SVP_NNIE_INVALID_CHNID HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) /* At least one parameter is illegal. For example, an illegal enumeration value exists. */ #define HI_ERR_SVP_NNIE_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) /* The channel exists. */ #define HI_ERR_SVP_NNIE_EXIST HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) /* The UN exists. */ #define HI_ERR_SVP_NNIE_UNEXIST HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) /* A null point is used. */ #define HI_ERR_SVP_NNIE_NULL_PTR HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) /* Try to enable or initialize the system, device, or channel before configuring attributes. */ #define HI_ERR_SVP_NNIE_NOT_CONFIG HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) /* The operation is not supported currently. */ #define HI_ERR_SVP_NNIE_NOT_SURPPORT HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) /* The operation, changing static attributes for example, is not permitted. */ #define HI_ERR_SVP_NNIE_NOT_PERM HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) /* A failure caused by the malloc memory occurs. */ #define HI_ERR_SVP_NNIE_NOMEM HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) /* A failure caused by the malloc buffer occurs. */ #define HI_ERR_SVP_NNIE_NOBUF HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) /* The buffer is empty. */ #define HI_ERR_SVP_NNIE_BUF_EMPTY HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) /* No buffer is provided for storing new data. */ #define HI_ERR_SVP_NNIE_BUF_FULL HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) /* The system is not ready because it may be not initialized or loaded. */ /* The error code is returned when a device file fails to be opened. */ #define HI_ERR_SVP_NNIE_NOTREADY HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) /* The source address or target address is incorrect during the operations */ #define HI_ERR_SVP_NNIE_BADADDR HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_BADADDR) /* The resource is busy during the operations */ #define HI_ERR_SVP_NNIE_BUSY HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) /* SVP_NNIE process timeout */ #define HI_ERR_SVP_NNIE_SYS_TIMEOUT HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, ERR_SVP_NNIE_SYS_TIMEOUT) /* SVP_NNIE query timeout */ #define HI_ERR_SVP_NNIE_QUERY_TIMEOUT HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, ERR_SVP_NNIE_QUERY_TIMEOUT) /* SVP_NNIE configure error */ #define HI_ERR_SVP_NNIE_CFG_ERR HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, ERR_SVP_NNIE_CFG_ERR) #define HI_ERR_SVP_NNIE_OPEN_FILE HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, ERR_SVP_NNIE_OPEN_FILE) #define HI_ERR_SVP_NNIE_READ_FILE HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, ERR_SVP_NNIE_READ_FILE) #define HI_ERR_SVP_NNIE_WRITE_FILE HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, ERR_SVP_NNIE_WRITE_FILE) /* macro */ #define SVP_NNIE_MAX_NET_SEG_NUM 8 /* NNIE max segment num that the net being cut into */ #define SVP_NNIE_MAX_INPUT_NUM 16 /* NNIE max input num in each seg */ #define SVP_NNIE_MAX_OUTPUT_NUM 16 /* NNIE max output num in each seg */ #define SVP_NNIE_MAX_ROI_LAYER_NUM_OF_SEG 2 /* NNIE max roi layer num in each seg */ #define SVP_NNIE_MAX_ROI_LAYER_NUM 4 /* NNIE max roi layer num */ #define SVP_NNIE_NODE_NAME_LEN 32 /* NNIE node name length */ /* NNIE core id */ typedef enum hiSVP_NNIE_ID_E { SVP_NNIE_ID_0 = 0x0, SVP_NNIE_ID_BUTT } SVP_NNIE_ID_E; /* Run Mode */ typedef enum hiSVP_NNIE_RUN_MODE_E { SVP_NNIE_RUN_MODE_CHIP = 0x0, /* on SOC chip running */ SVP_NNIE_RUN_MODE_FUNC_SIM = 0x1, /* functional simultaion */ SVP_NNIE_RUN_MODE_BUTT } SVP_NNIE_RUN_MODE_E; /* Network type */ typedef enum hiSVP_NNIE_NET_TYPE_E { SVP_NNIE_NET_TYPE_CNN = 0x0, /* Non-ROI input cnn net */ SVP_NNIE_NET_TYPE_ROI = 0x1, /* With ROI input cnn net */ SVP_NNIE_NET_TYPE_RECURRENT = 0x2, /* RNN or LSTM net */ SVP_NNIE_NET_TYPE_BUTT } SVP_NNIE_NET_TYPE_E; /* Node information */ typedef struct hiSVP_NNIE_NODE_S { SVP_BLOB_TYPE_E enType; union { struct { HI_U32 u32Width; HI_U32 u32Height; HI_U32 u32Chn; } stWhc; HI_U32 u32Dim; } unShape; HI_U32 u32NodeId; HI_CHAR szName[SVP_NNIE_NODE_NAME_LEN]; /* Report layer bottom name or data layer bottom name */ } SVP_NNIE_NODE_S; /* Roi/Psroi Pooling type */ typedef enum hiSVP_NNIE_ROIPOOL_TYPE_E { SVP_NNIE_ROIPOOL_TYPE_NORMAL = 0x0, /* Roipooling */ SVP_NNIE_ROIPOOL_TYPE_PS = 0x1, /* Position-Sensitive roipooling */ SVP_NNIE_ROIPOOL_TYPE_BUTT } SVP_NNIE_ROIPOOL_TYPE_E; /* RoiPooling information */ typedef struct hiSVP_NNIE_ROIPOOL_INFO_S { HI_U32 u32SrcHeight; /* ROI/PSROI Pooling src height */ HI_U32 u32SrcWidth; /* ROI/PSROI Pooling src width */ HI_U32 u32SrcMapNum; /* Input featrue map channel */ HI_U32 u32DstHeight; /* ROI/PSROI Pooling dst height */ HI_U32 u32DstWidth; /* ROI/PSROI Pooling dst width */ HI_U32 u32DstMapNum; /* Output featrue map channel */ HI_U32 u32DinWidthRamOffset; HI_U32 u32DinHeightRamOffset; HI_U32 u32TotalDinWidthRamOffset; HI_U32 u32TotalDinHeightRamOffset; HI_U32 u32BlockMaxHeight; /* Block max height */ HI_U32 u32BlockNum; /* Block number */ HI_U32 u32BboxMaxNum; /* Bbox max number */ HI_U32 u32SpatialScale; HI_BOOL bNormPPMode; /* whether use PingPang mode */ HI_BOOL bTotalPPMode; /* whether use PingPang mode */ HI_BOOL bHighPrec; /* whether use high precision mode */ SVP_NNIE_ROIPOOL_TYPE_E enRoiPoolType; /* ROIPooling or PSROIPooling */ HI_CHAR szName[SVP_NNIE_NODE_NAME_LEN]; /* Report layer bottom name or data layer bottom name */ } SVP_NNIE_ROIPOOL_INFO_S; /* Segment information */ typedef struct hiSVP_NNIE_SEG_S { SVP_NNIE_NET_TYPE_E enNetType; HI_U16 u16SrcNum; HI_U16 u16DstNum; HI_U16 u16RoiPoolNum; HI_U16 u16MaxStep; HI_U32 u32InstOffset; HI_U32 u32InstLen; SVP_NNIE_NODE_S astSrcNode[SVP_NNIE_MAX_INPUT_NUM]; SVP_NNIE_NODE_S astDstNode[SVP_NNIE_MAX_OUTPUT_NUM]; HI_U32 au32RoiIdx[SVP_NNIE_MAX_ROI_LAYER_NUM_OF_SEG]; /* Roipooling info index */ } SVP_NNIE_SEG_S; /* NNIE model */ typedef struct hiSVP_NNIE_MODEL_S { SVP_NNIE_RUN_MODE_E enRunMode; HI_U32 u32TmpBufSize; /* temp buffer size */ HI_U32 u32NetSegNum; SVP_NNIE_SEG_S astSeg[SVP_NNIE_MAX_NET_SEG_NUM]; SVP_NNIE_ROIPOOL_INFO_S astRoiInfo[SVP_NNIE_MAX_ROI_LAYER_NUM]; /* ROIPooling info */ SVP_MEM_INFO_S stBase; } SVP_NNIE_MODEL_S; typedef struct hiSVP_NNIE_FORWARD_CTRL_S { HI_U32 u32SrcNum; /* input node num, [1, 16] */ HI_U32 u32DstNum; /* output node num, [1, 16] */ HI_U32 u32NetSegId; /* net segment index running on NNIE */ SVP_NNIE_ID_E enNnieId; /* device target which running the seg */ SVP_MEM_INFO_S stTmpBuf; /* auxiliary temp mem */ SVP_MEM_INFO_S stTskBuf; /* auxiliary task mem */ } SVP_NNIE_FORWARD_CTRL_S; typedef struct hiSVP_NNIE_FORWARD_WITHBBOX_CTRL_S { HI_U32 u32SrcNum; /* input node num, [1, 16] */ HI_U32 u32DstNum; /* output node num, [1, 16] */ HI_U32 u32ProposalNum; /* elment num of roi array */ HI_U32 u32NetSegId; /* net segment index running on NNIE */ SVP_NNIE_ID_E enNnieId; /* device target which running the seg */ SVP_MEM_INFO_S stTmpBuf; /* auxiliary temp mem */ SVP_MEM_INFO_S stTskBuf; /* auxiliary task mem */ } SVP_NNIE_FORWARD_WITHBBOX_CTRL_S; #ifdef __cplusplus #if __cplusplus } #endif #endif #endif /* _HI_NNIE_H_ */