1/*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef OHOS_HDI_NNRT_V2_0_NNRTTYPES_H
17#define OHOS_HDI_NNRT_V2_0_NNRTTYPES_H
18
19#include <cstdbool>
20#include <cstdint>
21#include <map>
22#include <string>
23#include <vector>
24
25#ifndef HDI_BUFF_MAX_SIZE
26#define HDI_BUFF_MAX_SIZE (1024 * 200)
27#endif
28
29#ifndef HDI_CHECK_VALUE_RETURN
30#define HDI_CHECK_VALUE_RETURN(lv, compare, rv, ret) do { \
31    if ((lv) compare (rv)) { \
32        return ret; \
33    } \
34} while (false)
35#endif
36
37#ifndef HDI_CHECK_VALUE_RET_GOTO
38#define HDI_CHECK_VALUE_RET_GOTO(lv, compare, rv, ret, value, table) do { \
39    if ((lv) compare (rv)) { \
40        ret = value; \
41        goto table; \
42    } \
43} while (false)
44#endif
45
46namespace OHOS {
47class MessageParcel;
48}
49
50namespace OHOS {
51namespace HDI {
52namespace Nnrt {
53namespace V2_0 {
54
55using namespace OHOS;
56
57struct SharedBuffer {
58    int fd;
59    uint32_t bufferSize;
60    uint32_t offset;
61    uint32_t dataSize;
62};
63
64enum DeviceType : int32_t {
65    OTHER,
66    CPU,
67    GPU,
68    ACCELERATOR,
69};
70
71enum DeviceStatus : int32_t {
72    AVAILABLE,
73    BUSY,
74    OFFLINE,
75    UNKNOWN,
76};
77
78enum PerformanceMode : int32_t {
79    PERFORMANCE_NONE,
80    PERFORMANCE_LOW,
81    PERFORMANCE_MEDIUM,
82    PERFORMANCE_HIGH,
83    PERFORMANCE_EXTREME,
84};
85
86enum Priority : int32_t {
87    PRIORITY_NONE,
88    PRIORITY_LOW,
89    PRIORITY_MEDIUM,
90    PRIORITY_HIGH,
91};
92
93struct ModelConfig {
94    bool enableFloat16;
95    OHOS::HDI::Nnrt::V2_0::PerformanceMode mode;
96    OHOS::HDI::Nnrt::V2_0::Priority priority;
97    std::map<std::string, std::vector<int8_t>> extensions;
98};
99
100enum Format : int8_t {
101    FORMAT_NONE = -1,
102    FORMAT_NCHW = 0,
103    FORMAT_NHWC = 1,
104};
105
106struct QuantParam {
107    int32_t numBits;
108    int32_t zeroPoint;
109    double scale;
110} __attribute__ ((aligned(8)));
111
112enum DataType : int8_t {
113    DATA_TYPE_UNKNOWN = 0,
114    DATA_TYPE_BOOL = 30,
115    DATA_TYPE_INT8 = 32,
116    DATA_TYPE_INT16 = 33,
117    DATA_TYPE_INT32 = 34,
118    DATA_TYPE_INT64 = 35,
119    DATA_TYPE_UINT8 = 37,
120    DATA_TYPE_UINT16 = 38,
121    DATA_TYPE_UINT32 = 39,
122    DATA_TYPE_UINT64 = 40,
123    DATA_TYPE_FLOAT16 = 42,
124    DATA_TYPE_FLOAT32 = 43,
125    DATA_TYPE_FLOAT64 = 44,
126};
127
128struct IOTensor {
129    std::string name;
130    OHOS::HDI::Nnrt::V2_0::DataType dataType;
131    std::vector<int32_t> dimensions;
132    OHOS::HDI::Nnrt::V2_0::Format format;
133    OHOS::HDI::Nnrt::V2_0::SharedBuffer data;
134};
135
136enum QuantType : int8_t {
137    QUANT_TYPE_NONE,
138    QUANT_TYPE_ALL,
139};
140
141enum NodeType : uint32_t {
142    NODE_TYPE_NONE = 0,
143    NODE_TYPE_ACTIVATION = 2,
144    NODE_TYPE_ADD_FUSION = 5,
145    NODE_TYPE_ARGMAX_FUSION = 11,
146    NODE_TYPE_AVGPOOL_FUSION = 17,
147    NODE_TYPE_BATCH_TO_SPACE_ND = 22,
148    NODE_TYPE_BIAS_ADD = 23,
149    NODE_TYPE_CAST = 28,
150    NODE_TYPE_CONCAT = 31,
151    NODE_TYPE_CONV2D_FUSION = 35,
152    NODE_TYPE_CONV2D_TRANSPOSE_FUSION = 36,
153    NODE_TYPE_DIV_FUSION = 47,
154    NODE_TYPE_ELTWISE = 52,
155    NODE_TYPE_EXPAND_DIMS = 56,
156    NODE_TYPE_FILL = 66,
157    NODE_TYPE_FULL_CONNECTION = 67,
158    NODE_TYPE_FUSED_BATCH_NORM = 68,
159    NODE_TYPE_GATHER = 69,
160    NODE_TYPE_LAYER_NORM_FUSION = 75,
161    NODE_TYPE_LESS_EQUAL = 78,
162    NODE_TYPE_MATMUL_FUSION = 89,
163    NODE_TYPE_MAXIMUM = 90,
164    NODE_TYPE_MAX_POOL_FUSION = 92,
165    NODE_TYPE_MUL_FUSION = 99,
166    NODE_TYPE_ONE_HOT = 105,
167    NODE_TYPE_PAD_FUSION = 107,
168    NODE_TYPE_POW_FUSION = 110,
169    NODE_TYPE_PRELU_FUSION = 112,
170    NODE_TYPE_QUANT_DTYPE_CAST = 113,
171    NODE_TYPE_REDUCE_FUSION = 118,
172    NODE_TYPE_RESHAPE = 119,
173    NODE_TYPE_RESIZE = 120,
174    NODE_TYPE_RSQRT = 126,
175    NODE_TYPE_SCALE_FUSION = 127,
176    NODE_TYPE_SHAPE = 130,
177    NODE_TYPE_SLICE_FUSION = 135,
178    NODE_TYPE_SOFTMAX = 138,
179    NODE_TYPE_SPACE_TO_BATCH_ND = 141,
180    NODE_TYPE_SPLIT = 145,
181    NODE_TYPE_SQRT = 146,
182    NODE_TYPE_SQUEEZE = 147,
183    NODE_TYPE_SQUARED_DIFFERENCE = 149,
184    NODE_TYPE_STACK = 150,
185    NODE_TYPE_STRIDED_SLICE = 151,
186    NODE_TYPE_SUB_FUSION = 152,
187    NODE_TYPE_TILE_FUSION = 160,
188    NODE_TYPE_TOPK_FUSION = 161,
189    NODE_TYPE_TRANSPOSE = 162,
190    NODE_TYPE_UNSQUEEZE = 165,
191};
192
193enum ResizeMethod : int8_t {
194    RESIZE_METHOD_UNKNOWN = -1,
195    RESIZE_METHOD_LINEAR = 0,
196    RESIZE_METHOD_NEAREST = 1,
197    RESIZE_METHOD_CUBIC = 2,
198};
199
200enum CoordinateTransformMode : int8_t {
201    COORDINATE_TRANSFORM_MODE_ASYMMETRIC = 0,
202    COORDINATE_TRANSFORM_MODE_ALIGN_CORNERS = 1,
203    COORDINATE_TRANSFORM_MODE_HALF_PIXEL = 2,
204};
205
206enum NearestMode : int8_t {
207    NEAREST_MODE_NORMAL = 0,
208    NEAREST_MODE_ROUND_HALF_DOWN = 1,
209    NEAREST_MODE_ROUND_HALF_UP = 2,
210    NEAREST_MODE_FLOOR = 3,
211    NEAREST_MODE_CEIL = 4,
212};
213
214enum ActivationType : int8_t {
215    ACTIVATION_TYPE_NO_ACTIVATION = 0,
216    ACTIVATION_TYPE_RELU = 1,
217    ACTIVATION_TYPE_SIGMOID = 2,
218    ACTIVATION_TYPE_RELU6 = 3,
219    ACTIVATION_TYPE_ELU = 4,
220    ACTIVATION_TYPE_LEAKY_RELU = 5,
221    ACTIVATION_TYPE_ABS = 6,
222    ACTIVATION_TYPE_RELU1 = 7,
223    ACTIVATION_TYPE_SOFTSIGN = 8,
224    ACTIVATION_TYPE_SOFTPLUS = 9,
225    ACTIVATION_TYPE_TANH = 10,
226    ACTIVATION_TYPE_SELU = 11,
227    ACTIVATION_TYPE_HSWISH = 12,
228    ACTIVATION_TYPE_HSIGMOID = 13,
229    ACTIVATION_TYPE_THRESHOLDRELU = 14,
230    ACTIVATION_TYPE_LINEAR = 15,
231    ACTIVATION_TYPE_HARD_TANH = 16,
232    ACTIVATION_TYPE_SIGN = 17,
233    ACTIVATION_TYPE_SWISH = 18,
234    ACTIVATION_TYPE_GELU = 19,
235    ACTIVATION_TYPE_UNKNOWN = 20,
236};
237
238enum ReduceMode : int8_t {
239    REDUCE_MODE_MEAN = 0,
240    REDUCE_MODE_MAX = 1,
241    REDUCE_MODE_MIN = 2,
242    REDUCE_MODE_PROD = 3,
243    REDUCE_MODE_SUM = 4,
244    REDUCE_MODE_SUM_SQUARE = 5,
245    REDUCE_MODE_ASUM = 6,
246    REDUCE_MODE_ALL = 7,
247};
248
249enum EltwiseMode : int8_t {
250    ELTWISE_MODE_PROD = 0,
251    ELTWISE_MODE_SUM = 1,
252    ELTWISE_MODE_MAXIMUM = 2,
253    ELTWISE_MODE_UNKNOWN = 3,
254};
255
256enum PadMode : int8_t {
257    PAD_MODE_PAD = 0,
258    PAD_MODE_SAME = 1,
259    PAD_MODE_VALID = 2,
260};
261
262enum RoundMode : int8_t {
263    ROUND_MODE_FLOOR = 0,
264    ROUND_MODE_CEIL = 1,
265};
266
267enum PaddingMode : int8_t {
268    PADDING_MODE_CONSTANT = 0,
269    PADDING_MODE_REFLECT = 1,
270    PADDING_MODE_SYMMETRIC = 2,
271    PADDING_MODE_RESERVED = 3,
272};
273
274enum NNRT_ReturnCode : uint32_t {
275    NNRT_SUCCESS = 0,
276    NNRT_FAILED = 1,
277    NNRT_NULL_PTR = 2,
278    NNRT_INVALID_PARAMETER = 3,
279    NNRT_MEMORY_ERROR = 4,
280    NNRT_OUT_OF_MEMORY = 5,
281    NNRT_OPERATION_FORBIDDEN = 6,
282    NNRT_INVALID_FILE = 7,
283    NNRT_INVALID_PATH = 8,
284    NNRT_INSUFFICIENT_BUFFER = 9,
285    NNRT_NO_CHANGE = 10,
286    NNRT_NOT_SUPPORT = 11,
287    NNRT_SERVICE_ERROR = 12,
288    NNRT_DEVICE_ERROR = 13,
289    NNRT_DEVICE_BUSY = 14,
290    NNRT_CANCELLED = 15,
291    NNRT_PERMISSION_DENIED = 16,
292    NNRT_TIME_OUT = 17,
293    NNRT_INVALID_TENSOR = 18,
294    NNRT_INVALID_NODE = 19,
295    NNRT_INVALID_INPUT = 20,
296    NNRT_INVALID_OUTPUT = 21,
297    NNRT_INVALID_DATATYPE = 22,
298    NNRT_INVALID_FORMAT = 23,
299    NNRT_INVALID_TENSOR_NAME = 24,
300    NNRT_INVALID_SHAPE = 25,
301    NNRT_OUT_OF_DIMENTION_RANGES = 26,
302    NNRT_INVALID_BUFFER = 27,
303    NNRT_INVALID_BUFFER_SIZE = 28,
304    NNRT_INVALID_PERFORMANCE_MODE = 29,
305    NNRT_INVALID_PRIORITY = 30,
306    NNRT_INVALID_MODEL = 31,
307    NNRT_INVALID_MODEL_CACHE = 32,
308    NNRT_UNSUPPORTED_OP = 33,
309};
310
311bool SharedBufferBlockMarshalling(OHOS::MessageParcel &data, const OHOS::HDI::Nnrt::V2_0::SharedBuffer& dataBlock);
312
313bool SharedBufferBlockUnmarshalling(OHOS::MessageParcel &data, OHOS::HDI::Nnrt::V2_0::SharedBuffer& dataBlock);
314
315bool ModelConfigBlockMarshalling(OHOS::MessageParcel &data, const OHOS::HDI::Nnrt::V2_0::ModelConfig& dataBlock);
316
317bool ModelConfigBlockUnmarshalling(OHOS::MessageParcel &data, OHOS::HDI::Nnrt::V2_0::ModelConfig& dataBlock);
318
319bool QuantParamBlockMarshalling(OHOS::MessageParcel &data, const OHOS::HDI::Nnrt::V2_0::QuantParam& dataBlock);
320
321bool QuantParamBlockUnmarshalling(OHOS::MessageParcel &data, OHOS::HDI::Nnrt::V2_0::QuantParam& dataBlock);
322
323bool IOTensorBlockMarshalling(OHOS::MessageParcel &data, const OHOS::HDI::Nnrt::V2_0::IOTensor& dataBlock);
324
325bool IOTensorBlockUnmarshalling(OHOS::MessageParcel &data, OHOS::HDI::Nnrt::V2_0::IOTensor& dataBlock);
326
327
328} // V2_0
329} // Nnrt
330} // HDI
331} // OHOS
332
333#endif // OHOS_HDI_NNRT_V2_0_NNRTTYPES_H
334
335