11bd4fe43Sopenharmony_ci/*
21bd4fe43Sopenharmony_ci * Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED.
31bd4fe43Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
41bd4fe43Sopenharmony_ci * you may not use this file except in compliance with the License.
51bd4fe43Sopenharmony_ci * You may obtain a copy of the License at
61bd4fe43Sopenharmony_ci *
71bd4fe43Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
81bd4fe43Sopenharmony_ci *
91bd4fe43Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
101bd4fe43Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
111bd4fe43Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121bd4fe43Sopenharmony_ci * See the License for the specific language governing permissions and
131bd4fe43Sopenharmony_ci * limitations under the License.
141bd4fe43Sopenharmony_ci */
151bd4fe43Sopenharmony_ci
161bd4fe43Sopenharmony_ci#ifndef _HI_NNIE_H_
171bd4fe43Sopenharmony_ci#define _HI_NNIE_H_
181bd4fe43Sopenharmony_ci
191bd4fe43Sopenharmony_ci#include "hi_comm_svp.h"
201bd4fe43Sopenharmony_ci#include "hi_common.h"
211bd4fe43Sopenharmony_ci
221bd4fe43Sopenharmony_ci#ifdef __cplusplus
231bd4fe43Sopenharmony_ci#if __cplusplus
241bd4fe43Sopenharmony_ciextern "C" {
251bd4fe43Sopenharmony_ci#endif
261bd4fe43Sopenharmony_ci#endif
271bd4fe43Sopenharmony_ci
281bd4fe43Sopenharmony_ci/* SVP_NNIE Error Code */
291bd4fe43Sopenharmony_citypedef enum hiEN_SVP_NNIE_ERR_CODE_E {
301bd4fe43Sopenharmony_ci    ERR_SVP_NNIE_SYS_TIMEOUT = 0x40, /* SVP_NNIE process timeout */
311bd4fe43Sopenharmony_ci    ERR_SVP_NNIE_QUERY_TIMEOUT = 0x41, /* SVP_NNIE query timeout */
321bd4fe43Sopenharmony_ci    ERR_SVP_NNIE_CFG_ERR = 0x42, /* SVP_NNIE Configure error */
331bd4fe43Sopenharmony_ci    ERR_SVP_NNIE_OPEN_FILE = 0x43, /* SVP NNIE open file error */
341bd4fe43Sopenharmony_ci    ERR_SVP_NNIE_READ_FILE = 0x44, /* SVP NNIE read file error */
351bd4fe43Sopenharmony_ci    ERR_SVP_NNIE_WRITE_FILE = 0x45, /* SVP NNIE write file error */
361bd4fe43Sopenharmony_ci
371bd4fe43Sopenharmony_ci    ERR_SVP_NNIE_BUTT
381bd4fe43Sopenharmony_ci} EN_SVP_NNIE_ERR_CODE_E;
391bd4fe43Sopenharmony_ci/* Invalid device ID */
401bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_INVALID_DEVID     HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID)
411bd4fe43Sopenharmony_ci/* Invalid channel ID */
421bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_INVALID_CHNID     HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID)
431bd4fe43Sopenharmony_ci/* At least one parameter is illegal. For example, an illegal enumeration value exists. */
441bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_ILLEGAL_PARAM     HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM)
451bd4fe43Sopenharmony_ci/* The channel exists. */
461bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_EXIST             HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST)
471bd4fe43Sopenharmony_ci/* The UN exists. */
481bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_UNEXIST           HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST)
491bd4fe43Sopenharmony_ci/* A null point is used. */
501bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_NULL_PTR          HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR)
511bd4fe43Sopenharmony_ci/* Try to enable or initialize the system, device, or channel before configuring attributes. */
521bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_NOT_CONFIG        HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG)
531bd4fe43Sopenharmony_ci/* The operation is not supported currently. */
541bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_NOT_SURPPORT      HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT)
551bd4fe43Sopenharmony_ci/* The operation, changing static attributes for example, is not permitted. */
561bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_NOT_PERM          HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM)
571bd4fe43Sopenharmony_ci/* A failure caused by the malloc memory occurs. */
581bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_NOMEM             HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM)
591bd4fe43Sopenharmony_ci/* A failure caused by the malloc buffer occurs. */
601bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_NOBUF             HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF)
611bd4fe43Sopenharmony_ci/* The buffer is empty. */
621bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_BUF_EMPTY         HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY)
631bd4fe43Sopenharmony_ci/* No buffer is provided for storing new data. */
641bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_BUF_FULL          HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL)
651bd4fe43Sopenharmony_ci/* The system is not ready because it may be not initialized or loaded. */
661bd4fe43Sopenharmony_ci/* The error code is returned when a device file fails to be opened. */
671bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_NOTREADY          HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY)
681bd4fe43Sopenharmony_ci/* The source address or target address is incorrect during the operations */
691bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_BADADDR           HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_BADADDR)
701bd4fe43Sopenharmony_ci/* The resource is busy during the operations */
711bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_BUSY              HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY)
721bd4fe43Sopenharmony_ci/* SVP_NNIE process timeout */
731bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_SYS_TIMEOUT       HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, ERR_SVP_NNIE_SYS_TIMEOUT)
741bd4fe43Sopenharmony_ci/* SVP_NNIE query timeout */
751bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_QUERY_TIMEOUT     HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, ERR_SVP_NNIE_QUERY_TIMEOUT)
761bd4fe43Sopenharmony_ci/* SVP_NNIE configure error */
771bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_CFG_ERR           HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, ERR_SVP_NNIE_CFG_ERR)
781bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_OPEN_FILE         HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, ERR_SVP_NNIE_OPEN_FILE)
791bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_READ_FILE         HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, ERR_SVP_NNIE_READ_FILE)
801bd4fe43Sopenharmony_ci#define HI_ERR_SVP_NNIE_WRITE_FILE        HI_DEF_ERR(HI_ID_SVP_NNIE, EN_ERR_LEVEL_ERROR, ERR_SVP_NNIE_WRITE_FILE)
811bd4fe43Sopenharmony_ci
821bd4fe43Sopenharmony_ci/* macro */
831bd4fe43Sopenharmony_ci#define SVP_NNIE_MAX_NET_SEG_NUM          8 /* NNIE max segment num that the net being cut into */
841bd4fe43Sopenharmony_ci#define SVP_NNIE_MAX_INPUT_NUM            16 /* NNIE max input num in each seg */
851bd4fe43Sopenharmony_ci#define SVP_NNIE_MAX_OUTPUT_NUM           16 /* NNIE max output num in each seg */
861bd4fe43Sopenharmony_ci#define SVP_NNIE_MAX_ROI_LAYER_NUM_OF_SEG 2 /* NNIE max roi layer num in each seg */
871bd4fe43Sopenharmony_ci#define SVP_NNIE_MAX_ROI_LAYER_NUM        4 /* NNIE max roi layer num */
881bd4fe43Sopenharmony_ci#define SVP_NNIE_NODE_NAME_LEN            32 /* NNIE node name length */
891bd4fe43Sopenharmony_ci
901bd4fe43Sopenharmony_ci/* NNIE core id */
911bd4fe43Sopenharmony_citypedef enum hiSVP_NNIE_ID_E {
921bd4fe43Sopenharmony_ci    SVP_NNIE_ID_0 = 0x0,
931bd4fe43Sopenharmony_ci
941bd4fe43Sopenharmony_ci    SVP_NNIE_ID_BUTT
951bd4fe43Sopenharmony_ci} SVP_NNIE_ID_E;
961bd4fe43Sopenharmony_ci
971bd4fe43Sopenharmony_ci/* Run Mode */
981bd4fe43Sopenharmony_citypedef enum hiSVP_NNIE_RUN_MODE_E {
991bd4fe43Sopenharmony_ci    SVP_NNIE_RUN_MODE_CHIP = 0x0, /* on SOC chip running */
1001bd4fe43Sopenharmony_ci    SVP_NNIE_RUN_MODE_FUNC_SIM = 0x1, /* functional simultaion */
1011bd4fe43Sopenharmony_ci
1021bd4fe43Sopenharmony_ci    SVP_NNIE_RUN_MODE_BUTT
1031bd4fe43Sopenharmony_ci} SVP_NNIE_RUN_MODE_E;
1041bd4fe43Sopenharmony_ci
1051bd4fe43Sopenharmony_ci/* Network type */
1061bd4fe43Sopenharmony_citypedef enum hiSVP_NNIE_NET_TYPE_E {
1071bd4fe43Sopenharmony_ci    SVP_NNIE_NET_TYPE_CNN = 0x0, /* Non-ROI input cnn net */
1081bd4fe43Sopenharmony_ci    SVP_NNIE_NET_TYPE_ROI = 0x1, /* With ROI input cnn net */
1091bd4fe43Sopenharmony_ci    SVP_NNIE_NET_TYPE_RECURRENT = 0x2, /* RNN or LSTM net */
1101bd4fe43Sopenharmony_ci
1111bd4fe43Sopenharmony_ci    SVP_NNIE_NET_TYPE_BUTT
1121bd4fe43Sopenharmony_ci} SVP_NNIE_NET_TYPE_E;
1131bd4fe43Sopenharmony_ci
1141bd4fe43Sopenharmony_ci/* Node information */
1151bd4fe43Sopenharmony_citypedef struct hiSVP_NNIE_NODE_S {
1161bd4fe43Sopenharmony_ci    SVP_BLOB_TYPE_E enType;
1171bd4fe43Sopenharmony_ci    union {
1181bd4fe43Sopenharmony_ci        struct {
1191bd4fe43Sopenharmony_ci            HI_U32 u32Width;
1201bd4fe43Sopenharmony_ci            HI_U32 u32Height;
1211bd4fe43Sopenharmony_ci            HI_U32 u32Chn;
1221bd4fe43Sopenharmony_ci        } stWhc;
1231bd4fe43Sopenharmony_ci        HI_U32 u32Dim;
1241bd4fe43Sopenharmony_ci    } unShape;
1251bd4fe43Sopenharmony_ci    HI_U32 u32NodeId;
1261bd4fe43Sopenharmony_ci    HI_CHAR szName[SVP_NNIE_NODE_NAME_LEN]; /* Report layer bottom name or data layer bottom name */
1271bd4fe43Sopenharmony_ci} SVP_NNIE_NODE_S;
1281bd4fe43Sopenharmony_ci
1291bd4fe43Sopenharmony_ci/* Roi/Psroi Pooling type */
1301bd4fe43Sopenharmony_citypedef enum hiSVP_NNIE_ROIPOOL_TYPE_E {
1311bd4fe43Sopenharmony_ci    SVP_NNIE_ROIPOOL_TYPE_NORMAL = 0x0, /* Roipooling */
1321bd4fe43Sopenharmony_ci    SVP_NNIE_ROIPOOL_TYPE_PS = 0x1, /* Position-Sensitive roipooling */
1331bd4fe43Sopenharmony_ci
1341bd4fe43Sopenharmony_ci    SVP_NNIE_ROIPOOL_TYPE_BUTT
1351bd4fe43Sopenharmony_ci} SVP_NNIE_ROIPOOL_TYPE_E;
1361bd4fe43Sopenharmony_ci
1371bd4fe43Sopenharmony_ci/* RoiPooling information */
1381bd4fe43Sopenharmony_citypedef struct hiSVP_NNIE_ROIPOOL_INFO_S {
1391bd4fe43Sopenharmony_ci    HI_U32 u32SrcHeight; /* ROI/PSROI Pooling  src height */
1401bd4fe43Sopenharmony_ci    HI_U32 u32SrcWidth; /* ROI/PSROI Pooling src width */
1411bd4fe43Sopenharmony_ci    HI_U32 u32SrcMapNum; /* Input featrue map channel */
1421bd4fe43Sopenharmony_ci
1431bd4fe43Sopenharmony_ci    HI_U32 u32DstHeight; /* ROI/PSROI Pooling dst height */
1441bd4fe43Sopenharmony_ci    HI_U32 u32DstWidth; /* ROI/PSROI Pooling dst width */
1451bd4fe43Sopenharmony_ci    HI_U32 u32DstMapNum; /* Output featrue map channel */
1461bd4fe43Sopenharmony_ci
1471bd4fe43Sopenharmony_ci    HI_U32 u32DinWidthRamOffset;
1481bd4fe43Sopenharmony_ci    HI_U32 u32DinHeightRamOffset;
1491bd4fe43Sopenharmony_ci    HI_U32 u32TotalDinWidthRamOffset;
1501bd4fe43Sopenharmony_ci    HI_U32 u32TotalDinHeightRamOffset;
1511bd4fe43Sopenharmony_ci
1521bd4fe43Sopenharmony_ci    HI_U32 u32BlockMaxHeight; /* Block max height */
1531bd4fe43Sopenharmony_ci    HI_U32 u32BlockNum; /* Block number */
1541bd4fe43Sopenharmony_ci    HI_U32 u32BboxMaxNum; /* Bbox max number */
1551bd4fe43Sopenharmony_ci    HI_U32 u32SpatialScale;
1561bd4fe43Sopenharmony_ci
1571bd4fe43Sopenharmony_ci    HI_BOOL bNormPPMode; /* whether use PingPang mode */
1581bd4fe43Sopenharmony_ci    HI_BOOL bTotalPPMode; /* whether use PingPang mode */
1591bd4fe43Sopenharmony_ci    HI_BOOL bHighPrec; /* whether use high precision mode */
1601bd4fe43Sopenharmony_ci    SVP_NNIE_ROIPOOL_TYPE_E enRoiPoolType; /* ROIPooling or PSROIPooling */
1611bd4fe43Sopenharmony_ci    HI_CHAR szName[SVP_NNIE_NODE_NAME_LEN]; /* Report layer bottom name or data layer bottom name */
1621bd4fe43Sopenharmony_ci} SVP_NNIE_ROIPOOL_INFO_S;
1631bd4fe43Sopenharmony_ci
1641bd4fe43Sopenharmony_ci/* Segment information */
1651bd4fe43Sopenharmony_citypedef struct hiSVP_NNIE_SEG_S {
1661bd4fe43Sopenharmony_ci    SVP_NNIE_NET_TYPE_E enNetType;
1671bd4fe43Sopenharmony_ci    HI_U16 u16SrcNum;
1681bd4fe43Sopenharmony_ci    HI_U16 u16DstNum;
1691bd4fe43Sopenharmony_ci    HI_U16 u16RoiPoolNum;
1701bd4fe43Sopenharmony_ci    HI_U16 u16MaxStep;
1711bd4fe43Sopenharmony_ci
1721bd4fe43Sopenharmony_ci    HI_U32 u32InstOffset;
1731bd4fe43Sopenharmony_ci    HI_U32 u32InstLen;
1741bd4fe43Sopenharmony_ci
1751bd4fe43Sopenharmony_ci    SVP_NNIE_NODE_S astSrcNode[SVP_NNIE_MAX_INPUT_NUM];
1761bd4fe43Sopenharmony_ci    SVP_NNIE_NODE_S astDstNode[SVP_NNIE_MAX_OUTPUT_NUM];
1771bd4fe43Sopenharmony_ci    HI_U32 au32RoiIdx[SVP_NNIE_MAX_ROI_LAYER_NUM_OF_SEG]; /* Roipooling info index */
1781bd4fe43Sopenharmony_ci} SVP_NNIE_SEG_S;
1791bd4fe43Sopenharmony_ci
1801bd4fe43Sopenharmony_ci/* NNIE model */
1811bd4fe43Sopenharmony_citypedef struct hiSVP_NNIE_MODEL_S {
1821bd4fe43Sopenharmony_ci    SVP_NNIE_RUN_MODE_E enRunMode;
1831bd4fe43Sopenharmony_ci
1841bd4fe43Sopenharmony_ci    HI_U32 u32TmpBufSize; /* temp buffer size */
1851bd4fe43Sopenharmony_ci    HI_U32 u32NetSegNum;
1861bd4fe43Sopenharmony_ci    SVP_NNIE_SEG_S astSeg[SVP_NNIE_MAX_NET_SEG_NUM];
1871bd4fe43Sopenharmony_ci    SVP_NNIE_ROIPOOL_INFO_S astRoiInfo[SVP_NNIE_MAX_ROI_LAYER_NUM]; /* ROIPooling info */
1881bd4fe43Sopenharmony_ci
1891bd4fe43Sopenharmony_ci    SVP_MEM_INFO_S stBase;
1901bd4fe43Sopenharmony_ci} SVP_NNIE_MODEL_S;
1911bd4fe43Sopenharmony_ci
1921bd4fe43Sopenharmony_citypedef struct hiSVP_NNIE_FORWARD_CTRL_S {
1931bd4fe43Sopenharmony_ci    HI_U32 u32SrcNum; /* input node num, [1, 16] */
1941bd4fe43Sopenharmony_ci    HI_U32 u32DstNum; /* output node num, [1, 16] */
1951bd4fe43Sopenharmony_ci    HI_U32 u32NetSegId; /* net segment index running on NNIE */
1961bd4fe43Sopenharmony_ci    SVP_NNIE_ID_E enNnieId; /* device target which running the seg */
1971bd4fe43Sopenharmony_ci    SVP_MEM_INFO_S stTmpBuf; /* auxiliary temp mem */
1981bd4fe43Sopenharmony_ci    SVP_MEM_INFO_S stTskBuf; /* auxiliary task mem */
1991bd4fe43Sopenharmony_ci} SVP_NNIE_FORWARD_CTRL_S;
2001bd4fe43Sopenharmony_ci
2011bd4fe43Sopenharmony_citypedef struct hiSVP_NNIE_FORWARD_WITHBBOX_CTRL_S {
2021bd4fe43Sopenharmony_ci    HI_U32 u32SrcNum; /* input node num, [1, 16] */
2031bd4fe43Sopenharmony_ci    HI_U32 u32DstNum; /* output node num, [1, 16] */
2041bd4fe43Sopenharmony_ci    HI_U32 u32ProposalNum; /* elment num of  roi array */
2051bd4fe43Sopenharmony_ci    HI_U32 u32NetSegId; /* net segment index running on NNIE */
2061bd4fe43Sopenharmony_ci    SVP_NNIE_ID_E enNnieId; /* device target which running the seg */
2071bd4fe43Sopenharmony_ci    SVP_MEM_INFO_S stTmpBuf; /* auxiliary temp mem */
2081bd4fe43Sopenharmony_ci    SVP_MEM_INFO_S stTskBuf; /* auxiliary task mem */
2091bd4fe43Sopenharmony_ci} SVP_NNIE_FORWARD_WITHBBOX_CTRL_S;
2101bd4fe43Sopenharmony_ci
2111bd4fe43Sopenharmony_ci#ifdef __cplusplus
2121bd4fe43Sopenharmony_ci#if __cplusplus
2131bd4fe43Sopenharmony_ci}
2141bd4fe43Sopenharmony_ci#endif
2151bd4fe43Sopenharmony_ci#endif
2161bd4fe43Sopenharmony_ci#endif /* _HI_NNIE_H_ */
217