blob: 053a8b780b4e44ac97f8b176766bc0840d2c8e47 [file] [log] [blame]
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17// Contains all the entry points to the C Neural Networks API.
18// We do basic validation of the operands and then call the class
19// that implements the functionality.
20
21#define LOG_TAG "NeuralNetworks"
22
Jean-Luc Brouillet4c02adb2017-09-12 12:03:41 -070023#include "NeuralNetworks.h"
24
Slava Shklyaevc958cd82020-12-10 16:55:55 +000025#include <ControlFlow.h>
26#include <LegacyUtils.h>
27#include <MetaModel.h>
28#include <Tracing.h>
Slava Shklyaev9f29f432020-08-13 13:16:03 +010029#include <nnapi/Types.h>
Xusong Wang062ec502019-11-27 11:44:03 -080030
31#include <algorithm>
32#include <cstddef>
33#include <memory>
Slava Shklyaeva6d95b12020-11-27 17:29:10 +000034#include <utility>
Xusong Wang062ec502019-11-27 11:44:03 -080035#include <vector>
36
Michael Butler2f6a6282019-01-24 02:36:37 -080037#include "BurstBuilder.h"
David Gross67f891d2017-09-10 14:31:58 -070038#include "CompilationBuilder.h"
Miao Wange0227242019-12-20 16:07:39 -080039#include "Event.h"
David Gross7e03e902017-09-13 10:45:21 -070040#include "ExecutionBuilder.h"
Slava Shklyaeva1812872020-11-11 15:41:18 +000041#include "ExecutionCallback.h"
Przemysław Szczepaniaka6c206a2021-01-13 18:03:15 +000042#include "FeatureLevel.h"
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -070043#include "Manager.h"
Jean-Luc Brouillet4fb1e852017-08-20 18:16:36 -070044#include "Memory.h"
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -070045#include "ModelBuilder.h"
Slava Shklyaevc39dd5e2019-01-23 16:09:51 +000046#include "NeuralNetworksExtensions.h"
Miao Wang043e2492019-01-16 16:00:00 -080047#include "NeuralNetworksOEM.h"
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -070048
Przemysław Szczepaniaka7e069f2021-03-17 14:07:40 +000049#ifdef NN_COMPATIBILITY_LIBRARY_BUILD
50#include "NeuralNetworksSupportLibraryImpl.h"
51#endif // NN_COMPATIBILITY_LIBRARY_BUILD
52
Slava Shklyaev1aed7a22020-02-11 16:13:53 +000053using namespace android::nn;
Michael Butler6bf05b22019-07-11 11:45:01 -070054
David Gross6600d542017-09-13 12:31:13 -070055// Make sure the constants defined in the header files have not changed values.
56// IMPORTANT: When adding new values, update kNumberOfDataTypes or kNumberOfDataTypesOEM
57// in Utils.h.
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -070058static_assert(ANEURALNETWORKS_FLOAT32 == 0, "ANEURALNETWORKS_FLOAT32 has changed");
59static_assert(ANEURALNETWORKS_INT32 == 1, "ANEURALNETWORKS_INT32 has changed");
60static_assert(ANEURALNETWORKS_UINT32 == 2, "ANEURALNETWORKS_UINT32 has changed");
Michael K. Sandersfdc76f22018-10-12 09:07:36 +010061static_assert(ANEURALNETWORKS_TENSOR_FLOAT32 == 3, "ANEURALNETWORKS_TENSOR_FLOAT32 has changed");
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -070062static_assert(ANEURALNETWORKS_TENSOR_INT32 == 4, "ANEURALNETWORKS_TENSOR_INT32 has changed");
David Gross6600d542017-09-13 12:31:13 -070063static_assert(ANEURALNETWORKS_TENSOR_QUANT8_ASYMM == 5,
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -070064 "ANEURALNETWORKS_TENSOR_QUANT8_ASYMM has changed");
Lev Proleev17a5d3b2018-10-02 14:15:58 +010065static_assert(ANEURALNETWORKS_BOOL == 6, "ANEURALNETWORKS_BOOL has changed");
Lev Proleevfcb50682018-11-13 15:44:31 +000066static_assert(ANEURALNETWORKS_TENSOR_QUANT16_SYMM == 7,
67 "ANEURALNETWORKS_TENSOR_QUANT16_SYMM has changed");
Michael K. Sandersfdc76f22018-10-12 09:07:36 +010068static_assert(ANEURALNETWORKS_TENSOR_FLOAT16 == 8, "ANEURALNETWORKS_TENSOR_FLOAT16 has changed");
Slava Shklyaev62ac7892018-11-26 21:03:50 +000069static_assert(ANEURALNETWORKS_TENSOR_BOOL8 == 9, "ANEURALNETWORKS_TENSOR_BOOL8 has changed");
Xusong Wangb5388102018-12-05 15:04:07 -080070static_assert(ANEURALNETWORKS_FLOAT16 == 10, "ANEURALNETWORKS_FLOAT16 has changed");
Przemyslaw Szczepaniakf0589ad2018-11-08 14:56:06 +000071static_assert(ANEURALNETWORKS_TENSOR_QUANT8_SYMM_PER_CHANNEL == 11,
72 "ANEURALNETWORKS_TENSOR_QUANT8_SYMM_PER_CHANNEL has changed");
Xusong Wang81c1b362019-01-17 11:30:09 -080073static_assert(ANEURALNETWORKS_TENSOR_QUANT16_ASYMM == 12,
74 "ANEURALNETWORKS_TENSOR_QUANT16_ASYMM has changed");
Xusong Wang1cbaefc2019-01-30 14:16:56 -080075static_assert(ANEURALNETWORKS_TENSOR_QUANT8_SYMM == 13,
76 "ANEURALNETWORKS_TENSOR_QUANT8_SYMM has changed");
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -070077static_assert(ANEURALNETWORKS_OEM_SCALAR == 10000, "ANEURALNETWORKS_OEM_SCALAR has changed");
David Gross6600d542017-09-13 12:31:13 -070078static_assert(ANEURALNETWORKS_TENSOR_OEM_BYTE == 10001,
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -070079 "ANEURALNETWORKS_TENSOR_OEM_BYTE has changed");
Jean-Luc Brouillet873c0082017-07-25 00:17:50 -070080
David Gross6600d542017-09-13 12:31:13 -070081// IMPORTANT: When adding new values, update kNumberOfOperationTypes or
82// kNumberOfOperationTypesOEMin Utils.h.
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -070083static_assert(ANEURALNETWORKS_ADD == 0, "ANEURALNETWORKS_ADD has changed");
Miao Wang043e2492019-01-16 16:00:00 -080084static_assert(ANEURALNETWORKS_AVERAGE_POOL_2D == 1, "ANEURALNETWORKS_AVERAGE_POOL_2D has changed");
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -070085static_assert(ANEURALNETWORKS_CONCATENATION == 2, "ANEURALNETWORKS_CONCATENATION has changed");
86static_assert(ANEURALNETWORKS_CONV_2D == 3, "ANEURALNETWORKS_CONV_2D has changed");
David Gross6600d542017-09-13 12:31:13 -070087static_assert(ANEURALNETWORKS_DEPTHWISE_CONV_2D == 4,
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -070088 "ANEURALNETWORKS_DEPTHWISE_CONV_2D has changed");
Miao Wang043e2492019-01-16 16:00:00 -080089static_assert(ANEURALNETWORKS_DEPTH_TO_SPACE == 5, "ANEURALNETWORKS_DEPTH_TO_SPACE has changed");
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -070090static_assert(ANEURALNETWORKS_DEQUANTIZE == 6, "ANEURALNETWORKS_DEQUANTIZE has changed");
David Gross6600d542017-09-13 12:31:13 -070091static_assert(ANEURALNETWORKS_EMBEDDING_LOOKUP == 7,
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -070092 "ANEURALNETWORKS_EMBEDDING_LOOKUP has changed");
93static_assert(ANEURALNETWORKS_FLOOR == 8, "ANEURALNETWORKS_FLOOR has changed");
Miao Wang043e2492019-01-16 16:00:00 -080094static_assert(ANEURALNETWORKS_FULLY_CONNECTED == 9, "ANEURALNETWORKS_FULLY_CONNECTED has changed");
David Gross6600d542017-09-13 12:31:13 -070095static_assert(ANEURALNETWORKS_HASHTABLE_LOOKUP == 10,
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -070096 "ANEURALNETWORKS_HASHTABLE_LOOKUP has changed");
David Gross6600d542017-09-13 12:31:13 -070097static_assert(ANEURALNETWORKS_L2_NORMALIZATION == 11,
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -070098 "ANEURALNETWORKS_L2_NORMALIZATION has changed");
99static_assert(ANEURALNETWORKS_L2_POOL_2D == 12, "ANEURALNETWORKS_L2_POOL has changed");
David Gross6600d542017-09-13 12:31:13 -0700100static_assert(ANEURALNETWORKS_LOCAL_RESPONSE_NORMALIZATION == 13,
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -0700101 "ANEURALNETWORKS_LOCAL_RESPONSE_NORMALIZATION has changed");
102static_assert(ANEURALNETWORKS_LOGISTIC == 14, "ANEURALNETWORKS_LOGISTIC has changed");
Miao Wang043e2492019-01-16 16:00:00 -0800103static_assert(ANEURALNETWORKS_LSH_PROJECTION == 15, "ANEURALNETWORKS_LSH_PROJECTION has changed");
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -0700104static_assert(ANEURALNETWORKS_LSTM == 16, "ANEURALNETWORKS_LSTM has changed");
105static_assert(ANEURALNETWORKS_MAX_POOL_2D == 17, "ANEURALNETWORKS_MAX_POOL has changed");
106static_assert(ANEURALNETWORKS_MUL == 18, "ANEURALNETWORKS_MUL has changed");
107static_assert(ANEURALNETWORKS_RELU == 19, "ANEURALNETWORKS_RELU has changed");
108static_assert(ANEURALNETWORKS_RELU1 == 20, "ANEURALNETWORKS_RELU1 has changed");
109static_assert(ANEURALNETWORKS_RELU6 == 21, "ANEURALNETWORKS_RELU6 has changed");
110static_assert(ANEURALNETWORKS_RESHAPE == 22, "ANEURALNETWORKS_RESHAPE has changed");
Miao Wang043e2492019-01-16 16:00:00 -0800111static_assert(ANEURALNETWORKS_RESIZE_BILINEAR == 23, "ANEURALNETWORKS_RESIZE_BILINEAR has changed");
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -0700112static_assert(ANEURALNETWORKS_RNN == 24, "ANEURALNETWORKS_RNN has changed");
113static_assert(ANEURALNETWORKS_SOFTMAX == 25, "ANEURALNETWORKS_SOFTMAX has changed");
Miao Wang043e2492019-01-16 16:00:00 -0800114static_assert(ANEURALNETWORKS_SPACE_TO_DEPTH == 26, "ANEURALNETWORKS_SPACE_TO_DEPTH has changed");
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -0700115static_assert(ANEURALNETWORKS_SVDF == 27, "ANEURALNETWORKS_SVDF has changed");
116static_assert(ANEURALNETWORKS_TANH == 28, "ANEURALNETWORKS_TANH has changed");
Miao Wang582b8b32018-01-29 23:30:05 -0800117
Miao Wang043e2492019-01-16 16:00:00 -0800118static_assert(ANEURALNETWORKS_BATCH_TO_SPACE_ND == 29,
119 "ANEURALNETWORKS_BATCH_TO_SPACE_ND has changed");
Miao Wang582b8b32018-01-29 23:30:05 -0800120static_assert(ANEURALNETWORKS_DIV == 30, "ANEURALNETWORKS_DIV has changed");
121static_assert(ANEURALNETWORKS_MEAN == 31, "ANEURALNETWORKS_MEAN has changed");
122static_assert(ANEURALNETWORKS_PAD == 32, "ANEURALNETWORKS_PAD has changed");
Miao Wang043e2492019-01-16 16:00:00 -0800123static_assert(ANEURALNETWORKS_SPACE_TO_BATCH_ND == 33,
124 "ANEURALNETWORKS_SPACE_TO_BATCH_ND has changed");
Miao Wang582b8b32018-01-29 23:30:05 -0800125static_assert(ANEURALNETWORKS_SQUEEZE == 34, "ANEURALNETWORKS_SQUEEZE has changed");
126static_assert(ANEURALNETWORKS_STRIDED_SLICE == 35, "ANEURALNETWORKS_STRIDED_SLICE has changed");
127static_assert(ANEURALNETWORKS_SUB == 36, "ANEURALNETWORKS_TANH has changed");
128static_assert(ANEURALNETWORKS_TRANSPOSE == 37, "ANEURALNETWORKS_TRANSPOSE has changed");
129
Xusong Wang1cbaefc2019-01-30 14:16:56 -0800130static_assert(ANEURALNETWORKS_ABS == 38, "ANEURALNETWORKS_ABS has changed");
131static_assert(ANEURALNETWORKS_ARGMAX == 39, "ANEURALNETWORKS_ARGMAX has changed");
132static_assert(ANEURALNETWORKS_ARGMIN == 40, "ANEURALNETWORKS_ARGMIN has changed");
133static_assert(ANEURALNETWORKS_AXIS_ALIGNED_BBOX_TRANSFORM == 41,
134 "ANEURALNETWORKS_AXIS_ALIGNED_BBOX_TRANSFORM has changed");
135static_assert(ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_LSTM == 42,
136 "ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_LSTM has changed");
137static_assert(ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_RNN == 43,
138 "ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_RNN has changed");
139static_assert(ANEURALNETWORKS_BOX_WITH_NMS_LIMIT == 44,
140 "ANEURALNETWORKS_BOX_WITH_NMS_LIMIT has changed");
141static_assert(ANEURALNETWORKS_CAST == 45, "ANEURALNETWORKS_CAST has changed");
142static_assert(ANEURALNETWORKS_CHANNEL_SHUFFLE == 46, "ANEURALNETWORKS_CHANNEL_SHUFFLE has changed");
143static_assert(ANEURALNETWORKS_DETECTION_POSTPROCESSING == 47,
144 "ANEURALNETWORKS_DETECTION_POSTPROCESSING has changed");
145static_assert(ANEURALNETWORKS_EQUAL == 48, "ANEURALNETWORKS_EQUAL has changed");
146static_assert(ANEURALNETWORKS_EXP == 49, "ANEURALNETWORKS_EXP has changed");
147static_assert(ANEURALNETWORKS_EXPAND_DIMS == 50, "ANEURALNETWORKS_EXPAND_DIMS has changed");
148static_assert(ANEURALNETWORKS_GATHER == 51, "ANEURALNETWORKS_GATHER has changed");
149static_assert(ANEURALNETWORKS_GENERATE_PROPOSALS == 52,
150 "ANEURALNETWORKS_GENERATE_PROPOSALS has changed");
151static_assert(ANEURALNETWORKS_GREATER == 53, "ANEURALNETWORKS_GREATER has changed");
152static_assert(ANEURALNETWORKS_GREATER_EQUAL == 54, "ANEURALNETWORKS_GREATER_EQUAL has changed");
153static_assert(ANEURALNETWORKS_GROUPED_CONV_2D == 55, "ANEURALNETWORKS_GROUPED_CONV_2D has changed");
154static_assert(ANEURALNETWORKS_HEATMAP_MAX_KEYPOINT == 56,
155 "ANEURALNETWORKS_HEATMAP_MAX_KEYPOINT has changed");
156static_assert(ANEURALNETWORKS_INSTANCE_NORMALIZATION == 57,
157 "ANEURALNETWORKS_INSTANCE_NORMALIZATION has changed");
158static_assert(ANEURALNETWORKS_LESS == 58, "ANEURALNETWORKS_LESS has changed");
159static_assert(ANEURALNETWORKS_LESS_EQUAL == 59, "ANEURALNETWORKS_LESS_EQUAL has changed");
160static_assert(ANEURALNETWORKS_LOG == 60, "ANEURALNETWORKS_LOG has changed");
161static_assert(ANEURALNETWORKS_LOGICAL_AND == 61, "ANEURALNETWORKS_LOGICAL_AND has changed");
162static_assert(ANEURALNETWORKS_LOGICAL_NOT == 62, "ANEURALNETWORKS_LOGICAL_NOT has changed");
163static_assert(ANEURALNETWORKS_LOGICAL_OR == 63, "ANEURALNETWORKS_LOGICAL_OR has changed");
164static_assert(ANEURALNETWORKS_LOG_SOFTMAX == 64, "ANEURALNETWORKS_LOG_SOFTMAX has changed");
165static_assert(ANEURALNETWORKS_MAXIMUM == 65, "ANEURALNETWORKS_MAXIMUM has changed");
166static_assert(ANEURALNETWORKS_MINIMUM == 66, "ANEURALNETWORKS_MINIMUM has changed");
167static_assert(ANEURALNETWORKS_NEG == 67, "ANEURALNETWORKS_NEG has changed");
168static_assert(ANEURALNETWORKS_NOT_EQUAL == 68, "ANEURALNETWORKS_NOT_EQUAL has changed");
169static_assert(ANEURALNETWORKS_PAD_V2 == 69, "ANEURALNETWORKS_PAD_V2 has changed");
170static_assert(ANEURALNETWORKS_POW == 70, "ANEURALNETWORKS_POW has changed");
171static_assert(ANEURALNETWORKS_PRELU == 71, "ANEURALNETWORKS_PRELU has changed");
172static_assert(ANEURALNETWORKS_QUANTIZE == 72, "ANEURALNETWORKS_QUANTIZE has changed");
173static_assert(ANEURALNETWORKS_QUANTIZED_16BIT_LSTM == 73,
174 "ANEURALNETWORKS_QUANTIZED_16BIT_LSTM has changed");
175static_assert(ANEURALNETWORKS_RANDOM_MULTINOMIAL == 74,
176 "ANEURALNETWORKS_RANDOM_MULTINOMIAL has changed");
177static_assert(ANEURALNETWORKS_REDUCE_ALL == 75, "ANEURALNETWORKS_REDUCE_ALL has changed");
178static_assert(ANEURALNETWORKS_REDUCE_ANY == 76, "ANEURALNETWORKS_REDUCE_ANY has changed");
179static_assert(ANEURALNETWORKS_REDUCE_MAX == 77, "ANEURALNETWORKS_REDUCE_MAX has changed");
180static_assert(ANEURALNETWORKS_REDUCE_MIN == 78, "ANEURALNETWORKS_REDUCE_MIN has changed");
181static_assert(ANEURALNETWORKS_REDUCE_PROD == 79, "ANEURALNETWORKS_REDUCE_PROD has changed");
182static_assert(ANEURALNETWORKS_REDUCE_SUM == 80, "ANEURALNETWORKS_REDUCE_SUM has changed");
183static_assert(ANEURALNETWORKS_ROI_ALIGN == 81, "ANEURALNETWORKS_ROI_ALIGN has changed");
184static_assert(ANEURALNETWORKS_ROI_POOLING == 82, "ANEURALNETWORKS_ROI_POOLING has changed");
185static_assert(ANEURALNETWORKS_RSQRT == 83, "ANEURALNETWORKS_RSQRT has changed");
186static_assert(ANEURALNETWORKS_SELECT == 84, "ANEURALNETWORKS_SELECT has changed");
187static_assert(ANEURALNETWORKS_SIN == 85, "ANEURALNETWORKS_SIN has changed");
188static_assert(ANEURALNETWORKS_SLICE == 86, "ANEURALNETWORKS_SLICE has changed");
189static_assert(ANEURALNETWORKS_SPLIT == 87, "ANEURALNETWORKS_SPLIT has changed");
190static_assert(ANEURALNETWORKS_SQRT == 88, "ANEURALNETWORKS_SQRT has changed");
191static_assert(ANEURALNETWORKS_TILE == 89, "ANEURALNETWORKS_TILE has changed");
192static_assert(ANEURALNETWORKS_TOPK_V2 == 90, "ANEURALNETWORKS_TOPK_V2 has changed");
193static_assert(ANEURALNETWORKS_TRANSPOSE_CONV_2D == 91,
194 "ANEURALNETWORKS_TRANSPOSE_CONV_2D has changed");
195static_assert(ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_LSTM == 92,
196 "ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_LSTM has changed");
197static_assert(ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_RNN == 93,
198 "ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_RNN has changed");
Lev Proleev9d72ee02020-01-10 16:27:18 +0000199static_assert(ANEURALNETWORKS_RESIZE_NEAREST_NEIGHBOR == 94,
200 "ANEURALNETWORKS_RESIZE_NEAREST_NEIGHBOR has changed");
Viet Dangd0137f72019-12-04 16:18:08 +0000201static_assert(ANEURALNETWORKS_QUANTIZED_LSTM == 95, "ANEURALNETWORKS_QUANTIZED_LSTM has changed");
Lev Proleev9d72ee02020-01-10 16:27:18 +0000202static_assert(ANEURALNETWORKS_IF == 96, "ANEURALNETWORKS_IF has changed");
203static_assert(ANEURALNETWORKS_WHILE == 97, "ANEURALNETWORKS_WHILE has changed");
204static_assert(ANEURALNETWORKS_ELU == 98, "ANEURALNETWORKS_ELU has changed");
Lev Proleev476f3262020-01-10 16:28:28 +0000205static_assert(ANEURALNETWORKS_HARD_SWISH == 99, "ANEURALNETWORKS_HARD_SWISH has changed");
Lev Proleeva5fc9542020-01-20 11:17:10 +0000206static_assert(ANEURALNETWORKS_FILL == 100, "ANEURALNETWORKS_FILL has changed");
207static_assert(ANEURALNETWORKS_RANK == 101, "ANEURALNETWORKS_RANK has changed");
Xusong Wang1cbaefc2019-01-30 14:16:56 -0800208
Miao Wang043e2492019-01-16 16:00:00 -0800209static_assert(ANEURALNETWORKS_OEM_OPERATION == 10000, "ANEURALNETWORKS_OEM_OPERATION has changed");
Miao Wangfb767892017-09-08 16:51:10 -0700210
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -0700211static_assert(ANEURALNETWORKS_FUSED_NONE == 0, "ANEURALNETWORKS_FUSED_NONE has changed");
212static_assert(ANEURALNETWORKS_FUSED_RELU == 1, "ANEURALNETWORKS_FUSED_RELU has changed");
213static_assert(ANEURALNETWORKS_FUSED_RELU1 == 2, "ANEURALNETWORKS_FUSED_RELU1 has changed");
214static_assert(ANEURALNETWORKS_FUSED_RELU6 == 3, "ANEURALNETWORKS_FUSED_RELU6 has changed");
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700215
216static_assert(ANEURALNETWORKS_PREFER_LOW_POWER == 0,
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -0700217 "ANEURALNETWORKS_PREFER_LOW_POWER has changed");
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700218static_assert(ANEURALNETWORKS_PREFER_FAST_SINGLE_ANSWER == 1,
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -0700219 "ANEURALNETWORKS_PREFER_FAST_SINGLE_ANSWER has changed");
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700220static_assert(ANEURALNETWORKS_PREFER_SUSTAINED_SPEED == 2,
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -0700221 "ANEURALNETWORKS_PREFER_SUSTAINED_SPEED has changed");
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700222
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -0700223static_assert(ANEURALNETWORKS_NO_ERROR == 0, "ANEURALNETWORKS_NO_ERROR has changed");
224static_assert(ANEURALNETWORKS_OUT_OF_MEMORY == 1, "ANEURALNETWORKS_OUT_OF_MEMORY has changed");
225static_assert(ANEURALNETWORKS_INCOMPLETE == 2, "ANEURALNETWORKS_INCOMPLETE has changed");
Miao Wang043e2492019-01-16 16:00:00 -0800226static_assert(ANEURALNETWORKS_UNEXPECTED_NULL == 3, "ANEURALNETWORKS_UNEXPECTED_NULL has changed");
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -0700227static_assert(ANEURALNETWORKS_BAD_DATA == 4, "ANEURALNETWORKS_BAD_DATA has changed");
228static_assert(ANEURALNETWORKS_OP_FAILED == 5, "ANEURALNETWORKS_OP_FAILED has changed");
229static_assert(ANEURALNETWORKS_BAD_STATE == 6, "ANEURALNETWORKS_BAD_STATE has changed");
Xusong Wang603ebb62018-11-07 15:03:29 -0800230static_assert(ANEURALNETWORKS_UNMAPPABLE == 7, "ANEURALNETWORKS_UNMAPPABLE has changed");
231static_assert(ANEURALNETWORKS_OUTPUT_INSUFFICIENT_SIZE == 8,
232 "ANEURALNETWORKS_OUTPUT_INSUFFICIENT_SIZE has changed");
Miao Wangd144e072019-01-23 14:17:14 -0800233static_assert(ANEURALNETWORKS_UNAVAILABLE_DEVICE == 9,
234 "ANEURALNETWORKS_UNAVAILABLE_DEVICE has changed");
Michael Butlerd86176e2019-12-11 17:59:49 -0800235static_assert(ANEURALNETWORKS_MISSED_DEADLINE_TRANSIENT == 10,
236 "ANEURALNETWORKS_MISSED_DEADLINE_TRANSIENT has changed");
237static_assert(ANEURALNETWORKS_MISSED_DEADLINE_PERSISTENT == 11,
238 "ANEURALNETWORKS_MISSED_DEADLINE_PERSISTENT has changed");
239static_assert(ANEURALNETWORKS_RESOURCE_EXHAUSTED_TRANSIENT == 12,
240 "ANEURALNETWORKS_RESOURCE_EXHAUSTED_TRANSIENT has changed");
241static_assert(ANEURALNETWORKS_RESOURCE_EXHAUSTED_PERSISTENT == 13,
242 "ANEURALNETWORKS_RESOURCE_EXHAUSTED_PERSISTENT has changed");
243static_assert(ANEURALNETWORKS_DEAD_OBJECT == 14, "ANEURALNETWORKS_DEAD_OBJECT has changed");
Jean-Luc Brouillete1e65582017-10-11 22:34:04 -0700244
245static_assert(ANEURALNETWORKS_MAX_SIZE_OF_IMMEDIATELY_COPIED_VALUES == 128,
246 "ANEURALNETWORKS_MAX_SIZE_OF_IMMEDIATELY_COPIED_VALUES has changed");
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700247
Miao Wang043e2492019-01-16 16:00:00 -0800248static_assert(ANEURALNETWORKS_DEVICE_UNKNOWN == 0, "ANEURALNETWORKS_DEVICE_UNKNOWN has changed");
249static_assert(ANEURALNETWORKS_DEVICE_OTHER == 1, "ANEURALNETWORKS_DEVICE_OTHER has changed");
250static_assert(ANEURALNETWORKS_DEVICE_CPU == 2, "ANEURALNETWORKS_DEVICE_CPU has changed");
251static_assert(ANEURALNETWORKS_DEVICE_GPU == 3, "ANEURALNETWORKS_DEVICE_GPU has changed");
252static_assert(ANEURALNETWORKS_DEVICE_ACCELERATOR == 4,
253 "ANEURALNETWORKS_DEVICE_ACCELERATOR has changed");
254
David Gross257ee7a2019-01-23 14:59:10 -0800255static_assert(ANEURALNETWORKS_DURATION_ON_HARDWARE == 0,
256 "ANEURALNETWORKS_DURATION_ON_HARDWARE has changed");
257static_assert(ANEURALNETWORKS_DURATION_IN_DRIVER == 1,
258 "ANEURALNETWORKS_DURATION_IN_DRIVER has changed");
Miao Wang9cc46762020-01-21 14:59:54 -0800259static_assert(ANEURALNETWORKS_FENCED_DURATION_ON_HARDWARE == 2,
260 "ANEURALNETWORKS_FENCED_DURATION_ON_HARDWARE has changed");
261static_assert(ANEURALNETWORKS_FENCED_DURATION_IN_DRIVER == 3,
262 "ANEURALNETWORKS_FENCED_DURATION_IN_DRIVER has changed");
David Gross257ee7a2019-01-23 14:59:10 -0800263
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700264// Make sure that the constants are compatible with the values defined in
265// hardware/interfaces/neuralnetworks/1.0/types.hal.
Miao Wang0638da02017-09-13 15:53:28 -0700266static_assert(static_cast<int32_t>(OperandType::OEM) == ANEURALNETWORKS_OEM_SCALAR,
Michael Butlerc375aae2017-09-11 21:10:36 -0700267 "OEM != ANEURALNETWORKS_OEM");
Miao Wang0638da02017-09-13 15:53:28 -0700268static_assert(static_cast<int32_t>(OperandType::FLOAT32) == ANEURALNETWORKS_FLOAT32,
Jean-Luc Brouillet873c0082017-07-25 00:17:50 -0700269 "FLOAT32 != ANEURALNETWORKS_FLOAT32");
Miao Wang0638da02017-09-13 15:53:28 -0700270static_assert(static_cast<int32_t>(OperandType::INT32) == ANEURALNETWORKS_INT32,
Jean-Luc Brouillet873c0082017-07-25 00:17:50 -0700271 "INT32 != ANEURALNETWORKS_INT32");
Miao Wang0638da02017-09-13 15:53:28 -0700272static_assert(static_cast<int32_t>(OperandType::UINT32) == ANEURALNETWORKS_UINT32,
Jean-Luc Brouillet873c0082017-07-25 00:17:50 -0700273 "UINT32 != ANEURALNETWORKS_UINT32");
Miao Wang0638da02017-09-13 15:53:28 -0700274static_assert(static_cast<int32_t>(OperandType::TENSOR_OEM_BYTE) == ANEURALNETWORKS_TENSOR_OEM_BYTE,
Michael Butlerc375aae2017-09-11 21:10:36 -0700275 "TENSOR_OEM_BYTE != ANEURALNETWORKS_TENSOR_OEM_BYTE");
Miao Wang0638da02017-09-13 15:53:28 -0700276static_assert(static_cast<int32_t>(OperandType::TENSOR_FLOAT32) == ANEURALNETWORKS_TENSOR_FLOAT32,
Jean-Luc Brouillet873c0082017-07-25 00:17:50 -0700277 "TENSOR_FLOAT32 != ANEURALNETWORKS_TENSOR_FLOAT32");
Miao Wang0638da02017-09-13 15:53:28 -0700278static_assert(static_cast<int32_t>(OperandType::TENSOR_QUANT8_ASYMM) ==
Miao Wang043e2492019-01-16 16:00:00 -0800279 ANEURALNETWORKS_TENSOR_QUANT8_ASYMM,
Miao Wangcd67a3c2017-08-02 18:58:17 -0700280 "TENSOR_QUANT8_ASYMM != ANEURALNETWORKS_TENSOR_QUANT8_ASYMM");
Jean-Luc Brouillet873c0082017-07-25 00:17:50 -0700281
Miao Wang0638da02017-09-13 15:53:28 -0700282static_assert(static_cast<int32_t>(OperationType::ADD) == ANEURALNETWORKS_ADD,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700283 "OperationType::ADD != ANEURALNETWORKS_ADD");
Jean-Luc Brouillet4c02adb2017-09-12 12:03:41 -0700284static_assert(static_cast<int32_t>(OperationType::AVERAGE_POOL_2D) ==
Miao Wang043e2492019-01-16 16:00:00 -0800285 ANEURALNETWORKS_AVERAGE_POOL_2D,
Miao Wangfb767892017-09-08 16:51:10 -0700286 "OperationType::AVERAGE_POOL_2D != ANEURALNETWORKS_AVERAGE_POOL_2D");
Miao Wang0638da02017-09-13 15:53:28 -0700287static_assert(static_cast<int32_t>(OperationType::CONV_2D) == ANEURALNETWORKS_CONV_2D,
Miao Wangfb767892017-09-08 16:51:10 -0700288 "OperationType::CONV_2D != ANEURALNETWORKS_CONV_2D");
Miao Wang0638da02017-09-13 15:53:28 -0700289static_assert(static_cast<int32_t>(OperationType::DEPTHWISE_CONV_2D) ==
Miao Wang043e2492019-01-16 16:00:00 -0800290 ANEURALNETWORKS_DEPTHWISE_CONV_2D,
Miao Wangfb767892017-09-08 16:51:10 -0700291 "OperationType::DEPTHWISE_CONV_2D != ANEURALNETWORKS_DEPTHWISE_CONV_2D");
Miao Wang043e2492019-01-16 16:00:00 -0800292static_assert(static_cast<int32_t>(OperationType::DEPTH_TO_SPACE) == ANEURALNETWORKS_DEPTH_TO_SPACE,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700293 "OperationType::DEPTH_TO_SPACE != ANEURALNETWORKS_DEPTH_TO_SPACE");
Miao Wang0638da02017-09-13 15:53:28 -0700294static_assert(static_cast<int32_t>(OperationType::DEQUANTIZE) == ANEURALNETWORKS_DEQUANTIZE,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700295 "OperationType::DEQUANTIZE != ANEURALNETWORKS_DEQUANTIZE");
Miao Wang0638da02017-09-13 15:53:28 -0700296static_assert(static_cast<int32_t>(OperationType::EMBEDDING_LOOKUP) ==
Miao Wang043e2492019-01-16 16:00:00 -0800297 ANEURALNETWORKS_EMBEDDING_LOOKUP,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700298 "OperationType::EMBEDDING_LOOKUP != ANEURALNETWORKS_EMBEDDING_LOOKUP");
Miao Wang0638da02017-09-13 15:53:28 -0700299static_assert(static_cast<int32_t>(OperationType::FLOOR) == ANEURALNETWORKS_FLOOR,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700300 "OperationType::FLOOR != ANEURALNETWORKS_FLOOR");
Miao Wang0638da02017-09-13 15:53:28 -0700301static_assert(static_cast<int32_t>(OperationType::FULLY_CONNECTED) ==
Miao Wang043e2492019-01-16 16:00:00 -0800302 ANEURALNETWORKS_FULLY_CONNECTED,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700303 "OperationType::FULLY_CONNECTED != ANEURALNETWORKS_FULLY_CONNECTED");
Miao Wang0638da02017-09-13 15:53:28 -0700304static_assert(static_cast<int32_t>(OperationType::HASHTABLE_LOOKUP) ==
Miao Wang043e2492019-01-16 16:00:00 -0800305 ANEURALNETWORKS_HASHTABLE_LOOKUP,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700306 "OperationType::HASHTABLE_LOOKUP != ANEURALNETWORKS_HASHTABLE_LOOKUP");
Miao Wang0638da02017-09-13 15:53:28 -0700307static_assert(static_cast<int32_t>(OperationType::L2_NORMALIZATION) ==
Miao Wang043e2492019-01-16 16:00:00 -0800308 ANEURALNETWORKS_L2_NORMALIZATION,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700309 "OperationType::L2_NORMALIZATION != ANEURALNETWORKS_L2_NORMALIZATION");
Miao Wang0638da02017-09-13 15:53:28 -0700310static_assert(static_cast<int32_t>(OperationType::L2_POOL_2D) == ANEURALNETWORKS_L2_POOL_2D,
Miao Wangfb767892017-09-08 16:51:10 -0700311 "OperationType::L2_POOL_2D != ANEURALNETWORKS_L2_POOL_2D");
Miao Wang0638da02017-09-13 15:53:28 -0700312static_assert(static_cast<int32_t>(OperationType::LOCAL_RESPONSE_NORMALIZATION) ==
Miao Wang043e2492019-01-16 16:00:00 -0800313 ANEURALNETWORKS_LOCAL_RESPONSE_NORMALIZATION,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700314 "OperationType::LOCAL_RESPONSE_NORMALIZATION != "
315 "ANEURALNETWORKS_LOCAL_RESPONSE_NORMALIZATION");
Miao Wang0638da02017-09-13 15:53:28 -0700316static_assert(static_cast<int32_t>(OperationType::LOGISTIC) == ANEURALNETWORKS_LOGISTIC,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700317 "OperationType::LOGISTIC != ANEURALNETWORKS_LOGISTIC");
Miao Wang043e2492019-01-16 16:00:00 -0800318static_assert(static_cast<int32_t>(OperationType::LSH_PROJECTION) == ANEURALNETWORKS_LSH_PROJECTION,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700319 "OperationType::LSH_PROJECTION != ANEURALNETWORKS_LSH_PROJECTION");
Miao Wang0638da02017-09-13 15:53:28 -0700320static_assert(static_cast<int32_t>(OperationType::LSTM) == ANEURALNETWORKS_LSTM,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700321 "OperationType::LSTM != ANEURALNETWORKS_LSTM");
Miao Wang0638da02017-09-13 15:53:28 -0700322static_assert(static_cast<int32_t>(OperationType::MAX_POOL_2D) == ANEURALNETWORKS_MAX_POOL_2D,
Miao Wangfb767892017-09-08 16:51:10 -0700323 "OperationType::MAX_POOL_2D != ANEURALNETWORKS_MAX_POOL_2D");
Miao Wang0638da02017-09-13 15:53:28 -0700324static_assert(static_cast<int32_t>(OperationType::MUL) == ANEURALNETWORKS_MUL,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700325 "OperationType::MUL != ANEURALNETWORKS_MUL");
Miao Wang0638da02017-09-13 15:53:28 -0700326static_assert(static_cast<int32_t>(OperationType::RELU) == ANEURALNETWORKS_RELU,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700327 "OperationType::RELU != ANEURALNETWORKS_RELU");
Miao Wang0638da02017-09-13 15:53:28 -0700328static_assert(static_cast<int32_t>(OperationType::RELU1) == ANEURALNETWORKS_RELU1,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700329 "OperationType::RELU1 != ANEURALNETWORKS_RELU1");
Miao Wang0638da02017-09-13 15:53:28 -0700330static_assert(static_cast<int32_t>(OperationType::RELU6) == ANEURALNETWORKS_RELU6,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700331 "OperationType::RELU6 != ANEURALNETWORKS_RELU6");
Miao Wang0638da02017-09-13 15:53:28 -0700332static_assert(static_cast<int32_t>(OperationType::RESHAPE) == ANEURALNETWORKS_RESHAPE,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700333 "OperationType::RESHAPE != ANEURALNETWORKS_RESHAPE");
Miao Wang0638da02017-09-13 15:53:28 -0700334static_assert(static_cast<int32_t>(OperationType::RESIZE_BILINEAR) ==
Miao Wang043e2492019-01-16 16:00:00 -0800335 ANEURALNETWORKS_RESIZE_BILINEAR,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700336 "OperationType::RESIZE_BILINEAR != ANEURALNETWORKS_RESIZE_BILINEAR");
Miao Wang0638da02017-09-13 15:53:28 -0700337static_assert(static_cast<int32_t>(OperationType::RNN) == ANEURALNETWORKS_RNN,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700338 "OperationType::RNN != ANEURALNETWORKS_RNN");
Miao Wang0638da02017-09-13 15:53:28 -0700339static_assert(static_cast<int32_t>(OperationType::SOFTMAX) == ANEURALNETWORKS_SOFTMAX,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700340 "OperationType::SOFTMAX != ANEURALNETWORKS_SOFTMAX");
Miao Wang043e2492019-01-16 16:00:00 -0800341static_assert(static_cast<int32_t>(OperationType::SPACE_TO_DEPTH) == ANEURALNETWORKS_SPACE_TO_DEPTH,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700342 "OperationType::SPACE_TO_DEPTH != ANEURALNETWORKS_SPACE_TO_DEPTH");
Miao Wang0638da02017-09-13 15:53:28 -0700343static_assert(static_cast<int32_t>(OperationType::SVDF) == ANEURALNETWORKS_SVDF,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700344 "OperationType::SVDF != ANEURALNETWORKS_SVDF");
Miao Wang0638da02017-09-13 15:53:28 -0700345static_assert(static_cast<int32_t>(OperationType::TANH) == ANEURALNETWORKS_TANH,
Jean-Luc Brouillet37541b42017-08-31 18:07:29 -0700346 "OperationType::TANH != ANEURALNETWORKS_TANH");
347
Xusong Wang1cbaefc2019-01-30 14:16:56 -0800348static_assert(static_cast<int32_t>(FusedActivationFunc::NONE) == ANEURALNETWORKS_FUSED_NONE,
349 "FusedActivationFunc::NONE != ANEURALNETWORKS_FUSED_NONE");
350static_assert(static_cast<int32_t>(FusedActivationFunc::RELU) == ANEURALNETWORKS_FUSED_RELU,
351 "FusedActivationFunc::RELU != ANEURALNETWORKS_FUSED_RELU");
352static_assert(static_cast<int32_t>(FusedActivationFunc::RELU1) == ANEURALNETWORKS_FUSED_RELU1,
353 "FusedActivationFunc::RELU1 != ANEURALNETWORKS_FUSED_RELU1");
354static_assert(static_cast<int32_t>(FusedActivationFunc::RELU6) == ANEURALNETWORKS_FUSED_RELU6,
355 "FusedActivationFunc::RELU6 != ANEURALNETWORKS_FUSED_RELU6");
356
357// Make sure that the constants are compatible with the values defined in
358// hardware/interfaces/neuralnetworks/1.1/types.hal.
Miao Wang043e2492019-01-16 16:00:00 -0800359static_assert(static_cast<int32_t>(OperationType::BATCH_TO_SPACE_ND) ==
360 ANEURALNETWORKS_BATCH_TO_SPACE_ND,
Miao Wang582b8b32018-01-29 23:30:05 -0800361 "OperationType::BATCH_TO_SPACE_ND != ANEURALNETWORKS_BATCH_TO_SPACE_ND");
362static_assert(static_cast<int32_t>(OperationType::DIV) == ANEURALNETWORKS_DIV,
363 "OperationType::DIV != ANEURALNETWORKS_DIV");
364static_assert(static_cast<int32_t>(OperationType::MEAN) == ANEURALNETWORKS_MEAN,
365 "OperationType::MEAN != ANEURALNETWORKS_MEAN");
366static_assert(static_cast<int32_t>(OperationType::PAD) == ANEURALNETWORKS_PAD,
367 "OperationType::PAD != ANEURALNETWORKS_PAD");
368static_assert(static_cast<int32_t>(OperationType::SPACE_TO_BATCH_ND) ==
Miao Wang043e2492019-01-16 16:00:00 -0800369 ANEURALNETWORKS_SPACE_TO_BATCH_ND,
Miao Wang582b8b32018-01-29 23:30:05 -0800370 "OperationType::SPACE_TO_BATCH_ND != ANEURALNETWORKS_SPACE_TO_BATCH_ND");
371static_assert(static_cast<int32_t>(OperationType::SQUEEZE) == ANEURALNETWORKS_SQUEEZE,
372 "OperationType::SQUEEZE != ANEURALNETWORKS_SQUEEZE");
Miao Wang043e2492019-01-16 16:00:00 -0800373static_assert(static_cast<int32_t>(OperationType::STRIDED_SLICE) == ANEURALNETWORKS_STRIDED_SLICE,
Miao Wang582b8b32018-01-29 23:30:05 -0800374 "OperationType::STRIDED_SLICE != ANEURALNETWORKS_STRIDED_SLICE");
375static_assert(static_cast<int32_t>(OperationType::SUB) == ANEURALNETWORKS_SUB,
376 "OperationType::SUB != ANEURALNETWORKS_SUB");
377static_assert(static_cast<int32_t>(OperationType::TRANSPOSE) == ANEURALNETWORKS_TRANSPOSE,
378 "OperationType::TRANSPOSE != ANEURALNETWORKS_TRANSPOSE");
379
Miao Wang043e2492019-01-16 16:00:00 -0800380// Make sure that the constants are compatible with the values defined in
381// hardware/interfaces/neuralnetworks/1.2/types.hal.
Xusong Wang1cbaefc2019-01-30 14:16:56 -0800382static_assert(static_cast<int32_t>(OperandType::BOOL) == ANEURALNETWORKS_BOOL,
383 "BOOL != ANEURALNETWORKS_BOOL");
384static_assert(static_cast<int32_t>(OperandType::TENSOR_QUANT16_SYMM) ==
385 ANEURALNETWORKS_TENSOR_QUANT16_SYMM,
386 "TENSOR_QUANT16_SYMM != ANEURALNETWORKS_TENSOR_QUANT16_SYMM");
387static_assert(static_cast<int32_t>(OperandType::TENSOR_FLOAT16) == ANEURALNETWORKS_TENSOR_FLOAT16,
388 "TENSOR_FLOAT16 != ANEURALNETWORKS_TENSOR_FLOAT16");
389static_assert(static_cast<int32_t>(OperandType::TENSOR_BOOL8) == ANEURALNETWORKS_TENSOR_BOOL8,
390 "TENSOR_BOOL8 != ANEURALNETWORKS_TENSOR_BOOL8");
391static_assert(static_cast<int32_t>(OperandType::FLOAT16) == ANEURALNETWORKS_FLOAT16,
392 "FLOAT16 != ANEURALNETWORKS_FLOAT16");
393static_assert(static_cast<int32_t>(OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL) ==
394 ANEURALNETWORKS_TENSOR_QUANT8_SYMM_PER_CHANNEL,
395 "TENSOR_QUANT8_SYMM_PER_CHANNEL != ANEURALNETWORKS_TENSOR_QUANT8_SYMM_PER_CHANNEL");
396static_assert(static_cast<int32_t>(OperandType::TENSOR_QUANT16_ASYMM) ==
397 ANEURALNETWORKS_TENSOR_QUANT16_ASYMM,
398 "TENSOR_QUANT16_ASYMM != ANEURALNETWORKS_TENSOR_QUANT16_ASYMM");
399static_assert(static_cast<int32_t>(OperandType::TENSOR_QUANT8_SYMM) ==
400 ANEURALNETWORKS_TENSOR_QUANT8_SYMM,
401 "TENSOR_QUANT8_SYMM != ANEURALNETWORKS_TENSOR_QUANT8_SYMM");
402
403static_assert(static_cast<int32_t>(OperationType::ABS) == ANEURALNETWORKS_ABS,
404 "OperationType::ABS != ANEURALNETWORKS_ABS");
405static_assert(static_cast<int32_t>(OperationType::ARGMAX) == ANEURALNETWORKS_ARGMAX,
406 "OperationType::ARGMAX != ANEURALNETWORKS_ARGMAX");
407static_assert(static_cast<int32_t>(OperationType::ARGMIN) == ANEURALNETWORKS_ARGMIN,
408 "OperationType::ARGMIN != ANEURALNETWORKS_ARGMIN");
409static_assert(static_cast<int32_t>(OperationType::AXIS_ALIGNED_BBOX_TRANSFORM) ==
410 ANEURALNETWORKS_AXIS_ALIGNED_BBOX_TRANSFORM,
411 "OperationType::AXIS_ALIGNED_BBOX_TRANSFORM != "
412 "ANEURALNETWORKS_AXIS_ALIGNED_BBOX_TRANSFORM");
413static_assert(static_cast<int32_t>(OperationType::BIDIRECTIONAL_SEQUENCE_LSTM) ==
414 ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_LSTM,
415 "OperationType::BIDIRECTIONAL_SEQUENCE_LSTM != "
416 "ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_LSTM");
417static_assert(
418 static_cast<int32_t>(OperationType::BIDIRECTIONAL_SEQUENCE_RNN) ==
419 ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_RNN,
420 "OperationType::BIDIRECTIONAL_SEQUENCE_RNN != ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_RNN");
421static_assert(static_cast<int32_t>(OperationType::BOX_WITH_NMS_LIMIT) ==
422 ANEURALNETWORKS_BOX_WITH_NMS_LIMIT,
423 "OperationType::BOX_WITH_NMS_LIMIT != ANEURALNETWORKS_BOX_WITH_NMS_LIMIT");
424static_assert(static_cast<int32_t>(OperationType::CAST) == ANEURALNETWORKS_CAST,
425 "OperationType::CAST != ANEURALNETWORKS_CAST");
426static_assert(static_cast<int32_t>(OperationType::CHANNEL_SHUFFLE) ==
427 ANEURALNETWORKS_CHANNEL_SHUFFLE,
428 "OperationType::CHANNEL_SHUFFLE != ANEURALNETWORKS_CHANNEL_SHUFFLE");
429static_assert(
430 static_cast<int32_t>(OperationType::DETECTION_POSTPROCESSING) ==
431 ANEURALNETWORKS_DETECTION_POSTPROCESSING,
432 "OperationType::DETECTION_POSTPROCESSING != ANEURALNETWORKS_DETECTION_POSTPROCESSING");
433static_assert(static_cast<int32_t>(OperationType::EQUAL) == ANEURALNETWORKS_EQUAL,
434 "OperationType::EQUAL != ANEURALNETWORKS_EQUAL");
435static_assert(static_cast<int32_t>(OperationType::EXP) == ANEURALNETWORKS_EXP,
436 "OperationType::EXP != ANEURALNETWORKS_EXP");
437static_assert(static_cast<int32_t>(OperationType::EXPAND_DIMS) == ANEURALNETWORKS_EXPAND_DIMS,
438 "OperationType::EXPAND_DIMS != ANEURALNETWORKS_EXPAND_DIMS");
439static_assert(static_cast<int32_t>(OperationType::GATHER) == ANEURALNETWORKS_GATHER,
440 "OperationType::GATHER != ANEURALNETWORKS_GATHER");
441static_assert(static_cast<int32_t>(OperationType::GENERATE_PROPOSALS) ==
442 ANEURALNETWORKS_GENERATE_PROPOSALS,
443 "OperationType::GENERATE_PROPOSALS != ANEURALNETWORKS_GENERATE_PROPOSALS");
444static_assert(static_cast<int32_t>(OperationType::GREATER) == ANEURALNETWORKS_GREATER,
445 "OperationType::GREATER != ANEURALNETWORKS_GREATER");
446static_assert(static_cast<int32_t>(OperationType::GREATER_EQUAL) == ANEURALNETWORKS_GREATER_EQUAL,
447 "OperationType::GREATER_EQUAL != ANEURALNETWORKS_GREATER_EQUAL");
448static_assert(static_cast<int32_t>(OperationType::GROUPED_CONV_2D) ==
449 ANEURALNETWORKS_GROUPED_CONV_2D,
450 "OperationType::GROUPED_CONV_2D != ANEURALNETWORKS_GROUPED_CONV_2D");
451static_assert(static_cast<int32_t>(OperationType::HEATMAP_MAX_KEYPOINT) ==
452 ANEURALNETWORKS_HEATMAP_MAX_KEYPOINT,
453 "OperationType::HEATMAP_MAX_KEYPOINT != ANEURALNETWORKS_HEATMAP_MAX_KEYPOINT");
454static_assert(static_cast<int32_t>(OperationType::INSTANCE_NORMALIZATION) ==
455 ANEURALNETWORKS_INSTANCE_NORMALIZATION,
456 "OperationType::INSTANCE_NORMALIZATION != ANEURALNETWORKS_INSTANCE_NORMALIZATION");
457static_assert(static_cast<int32_t>(OperationType::LESS) == ANEURALNETWORKS_LESS,
458 "OperationType::LESS != ANEURALNETWORKS_LESS");
459static_assert(static_cast<int32_t>(OperationType::LESS_EQUAL) == ANEURALNETWORKS_LESS_EQUAL,
460 "OperationType::LESS_EQUAL != ANEURALNETWORKS_LESS_EQUAL");
461static_assert(static_cast<int32_t>(OperationType::LOG) == ANEURALNETWORKS_LOG,
462 "OperationType::LOG != ANEURALNETWORKS_LOG");
463static_assert(static_cast<int32_t>(OperationType::LOGICAL_AND) == ANEURALNETWORKS_LOGICAL_AND,
464 "OperationType::LOGICAL_AND != ANEURALNETWORKS_LOGICAL_AND");
465static_assert(static_cast<int32_t>(OperationType::LOGICAL_NOT) == ANEURALNETWORKS_LOGICAL_NOT,
466 "OperationType::LOGICAL_NOT != ANEURALNETWORKS_LOGICAL_NOT");
467static_assert(static_cast<int32_t>(OperationType::LOGICAL_OR) == ANEURALNETWORKS_LOGICAL_OR,
468 "OperationType::LOGICAL_OR != ANEURALNETWORKS_LOGICAL_OR");
469static_assert(static_cast<int32_t>(OperationType::LOG_SOFTMAX) == ANEURALNETWORKS_LOG_SOFTMAX,
470 "OperationType::LOG_SOFTMAX != ANEURALNETWORKS_LOG_SOFTMAX");
471static_assert(static_cast<int32_t>(OperationType::MAXIMUM) == ANEURALNETWORKS_MAXIMUM,
472 "OperationType::MAXIMUM != ANEURALNETWORKS_MAXIMUM");
473static_assert(static_cast<int32_t>(OperationType::MINIMUM) == ANEURALNETWORKS_MINIMUM,
474 "OperationType::MINIMUM != ANEURALNETWORKS_MINIMUM");
475static_assert(static_cast<int32_t>(OperationType::NEG) == ANEURALNETWORKS_NEG,
476 "OperationType::NEG != ANEURALNETWORKS_NEG");
477static_assert(static_cast<int32_t>(OperationType::NOT_EQUAL) == ANEURALNETWORKS_NOT_EQUAL,
478 "OperationType::NOT_EQUAL != ANEURALNETWORKS_NOT_EQUAL");
479static_assert(static_cast<int32_t>(OperationType::PAD_V2) == ANEURALNETWORKS_PAD_V2,
480 "OperationType::PAD_V2 != ANEURALNETWORKS_PAD_V2");
481static_assert(static_cast<int32_t>(OperationType::POW) == ANEURALNETWORKS_POW,
482 "OperationType::POW != ANEURALNETWORKS_POW");
483static_assert(static_cast<int32_t>(OperationType::PRELU) == ANEURALNETWORKS_PRELU,
484 "OperationType::PRELU != ANEURALNETWORKS_PRELU");
485static_assert(static_cast<int32_t>(OperationType::QUANTIZE) == ANEURALNETWORKS_QUANTIZE,
486 "OperationType::QUANTIZE != ANEURALNETWORKS_QUANTIZE");
487static_assert(static_cast<int32_t>(OperationType::QUANTIZED_16BIT_LSTM) ==
488 ANEURALNETWORKS_QUANTIZED_16BIT_LSTM,
489 "OperationType::QUANTIZED_16BIT_LSTM != ANEURALNETWORKS_QUANTIZED_16BIT_LSTM");
490static_assert(static_cast<int32_t>(OperationType::RANDOM_MULTINOMIAL) ==
491 ANEURALNETWORKS_RANDOM_MULTINOMIAL,
492 "OperationType::RANDOM_MULTINOMIAL != ANEURALNETWORKS_RANDOM_MULTINOMIAL");
493static_assert(static_cast<int32_t>(OperationType::REDUCE_ALL) == ANEURALNETWORKS_REDUCE_ALL,
494 "OperationType::REDUCE_ALL != ANEURALNETWORKS_REDUCE_ALL");
495static_assert(static_cast<int32_t>(OperationType::REDUCE_ANY) == ANEURALNETWORKS_REDUCE_ANY,
496 "OperationType::REDUCE_ANY != ANEURALNETWORKS_REDUCE_ANY");
497static_assert(static_cast<int32_t>(OperationType::REDUCE_MAX) == ANEURALNETWORKS_REDUCE_MAX,
498 "OperationType::REDUCE_MAX != ANEURALNETWORKS_REDUCE_MAX");
499static_assert(static_cast<int32_t>(OperationType::REDUCE_MIN) == ANEURALNETWORKS_REDUCE_MIN,
500 "OperationType::REDUCE_MIN != ANEURALNETWORKS_REDUCE_MIN");
501static_assert(static_cast<int32_t>(OperationType::REDUCE_PROD) == ANEURALNETWORKS_REDUCE_PROD,
502 "OperationType::REDUCE_PROD != ANEURALNETWORKS_REDUCE_PROD");
503static_assert(static_cast<int32_t>(OperationType::REDUCE_SUM) == ANEURALNETWORKS_REDUCE_SUM,
504 "OperationType::REDUCE_SUM != ANEURALNETWORKS_REDUCE_SUM");
505static_assert(static_cast<int32_t>(OperationType::ROI_ALIGN) == ANEURALNETWORKS_ROI_ALIGN,
506 "OperationType::ROI_ALIGN != ANEURALNETWORKS_ROI_ALIGN");
507static_assert(static_cast<int32_t>(OperationType::ROI_POOLING) == ANEURALNETWORKS_ROI_POOLING,
508 "OperationType::ROI_POOLING != ANEURALNETWORKS_ROI_POOLING");
509static_assert(static_cast<int32_t>(OperationType::RSQRT) == ANEURALNETWORKS_RSQRT,
510 "OperationType::RSQRT != ANEURALNETWORKS_RSQRT");
511static_assert(static_cast<int32_t>(OperationType::SELECT) == ANEURALNETWORKS_SELECT,
512 "OperationType::SELECT != ANEURALNETWORKS_SELECT");
513static_assert(static_cast<int32_t>(OperationType::SIN) == ANEURALNETWORKS_SIN,
514 "OperationType::SIN != ANEURALNETWORKS_SIN");
515static_assert(static_cast<int32_t>(OperationType::SLICE) == ANEURALNETWORKS_SLICE,
516 "OperationType::SLICE != ANEURALNETWORKS_SLICE");
517static_assert(static_cast<int32_t>(OperationType::SPLIT) == ANEURALNETWORKS_SPLIT,
518 "OperationType::SPLIT != ANEURALNETWORKS_SPLIT");
519static_assert(static_cast<int32_t>(OperationType::SQRT) == ANEURALNETWORKS_SQRT,
520 "OperationType::SQRT != ANEURALNETWORKS_SQRT");
521static_assert(static_cast<int32_t>(OperationType::TILE) == ANEURALNETWORKS_TILE,
522 "OperationType::TILE != ANEURALNETWORKS_TILE");
523static_assert(static_cast<int32_t>(OperationType::TOPK_V2) == ANEURALNETWORKS_TOPK_V2,
524 "OperationType::TOPK_V2 != ANEURALNETWORKS_TOPK_V2");
525static_assert(static_cast<int32_t>(OperationType::TRANSPOSE_CONV_2D) ==
526 ANEURALNETWORKS_TRANSPOSE_CONV_2D,
527 "OperationType::TRANSPOSE_CONV_2D != ANEURALNETWORKS_TRANSPOSE_CONV_2D");
528static_assert(static_cast<int32_t>(OperationType::UNIDIRECTIONAL_SEQUENCE_LSTM) ==
529 ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_LSTM,
530 "OperationType::UNIDIRECTIONAL_SEQUENCE_LSTM != "
531 "ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_LSTM");
532static_assert(static_cast<int32_t>(OperationType::UNIDIRECTIONAL_SEQUENCE_RNN) ==
533 ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_RNN,
534 "OperationType::UNIDIRECTIONAL_SEQUENCE_RNN != "
535 "ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_RNN");
Xusong Wang7ff997e2019-02-07 15:57:04 -0800536static_assert(static_cast<int32_t>(OperationType::RESIZE_NEAREST_NEIGHBOR) ==
537 ANEURALNETWORKS_RESIZE_NEAREST_NEIGHBOR,
538 "OperationType::RESIZE_NEAREST_NEIGHBOR != ANEURALNETWORKS_RESIZE_NEAREST_NEIGHBOR");
Lev Proleev9d72ee02020-01-10 16:27:18 +0000539static_assert(static_cast<int32_t>(OperationType::QUANTIZED_LSTM) == ANEURALNETWORKS_QUANTIZED_LSTM,
540 "OperationType::QUANTIZED_LSTM != ANEURALNETWORKS_QUANTIZED_LSTM");
541static_assert(static_cast<int32_t>(OperationType::IF) == ANEURALNETWORKS_IF,
542 "OperationType::IF != ANEURALNETWORKS_IF");
543static_assert(static_cast<int32_t>(OperationType::WHILE) == ANEURALNETWORKS_WHILE,
544 "OperationType::WHILE != ANEURALNETWORKS_WHILE");
545static_assert(static_cast<int32_t>(OperationType::ELU) == ANEURALNETWORKS_ELU,
546 "OperationType::ELU != ANEURALNETWORKS_ELU");
Lev Proleev476f3262020-01-10 16:28:28 +0000547static_assert(static_cast<int32_t>(OperationType::HARD_SWISH) == ANEURALNETWORKS_HARD_SWISH,
548 "OperationType::HARD_SWISH != ANEURALNETWORKS_HARD_SWISH");
Lev Proleeva5fc9542020-01-20 11:17:10 +0000549static_assert(static_cast<int32_t>(OperationType::FILL) == ANEURALNETWORKS_FILL,
550 "OperationType::FILL != ANEURALNETWORKS_FILL");
551static_assert(static_cast<int32_t>(OperationType::RANK) == ANEURALNETWORKS_RANK,
552 "OperationType::RANK != ANEURALNETWORKS_RANK");
Xusong Wang1cbaefc2019-01-30 14:16:56 -0800553
Miao Wang043e2492019-01-16 16:00:00 -0800554static_assert(static_cast<int32_t>(DeviceType::OTHER) == ANEURALNETWORKS_DEVICE_OTHER,
555 "DeviceType::OTHER != ANEURALNETWORKS_DEVICE_OTHER");
556static_assert(static_cast<int32_t>(DeviceType::CPU) == ANEURALNETWORKS_DEVICE_CPU,
557 "DeviceType::CPU != ANEURALNETWORKS_DEVICE_CPU");
558static_assert(static_cast<int32_t>(DeviceType::GPU) == ANEURALNETWORKS_DEVICE_GPU,
559 "DeviceType::GPU != ANEURALNETWORKS_DEVICE_GPU");
560static_assert(static_cast<int32_t>(DeviceType::ACCELERATOR) == ANEURALNETWORKS_DEVICE_ACCELERATOR,
561 "DeviceType::ACCELERATOR != ANEURALNETWORKS_DEVICE_ACCELERATOR");
562
Michael Butlere6785e42019-12-12 16:25:03 -0800563// Make sure that the constants are compatible with the values defined in
564// hardware/interfaces/neuralnetworks/1.3/types.hal.
Slava Shklyaev9f29f432020-08-13 13:16:03 +0100565static_assert(android::nn::convertToCanonicalPriority(ANEURALNETWORKS_PRIORITY_LOW) ==
566 Priority::LOW,
Michael Butlere6785e42019-12-12 16:25:03 -0800567 "ANEURALNETWORKS_PRIORITY_LOW does not map to Priority::LOW");
Slava Shklyaev9f29f432020-08-13 13:16:03 +0100568static_assert(android::nn::convertToCanonicalPriority(ANEURALNETWORKS_PRIORITY_MEDIUM) ==
Michael Butlere6785e42019-12-12 16:25:03 -0800569 Priority::MEDIUM,
570 "ANEURALNETWORKS_PRIORITY_MEDIUM does not map to Priority::MEDIUM");
Slava Shklyaev9f29f432020-08-13 13:16:03 +0100571static_assert(android::nn::convertToCanonicalPriority(ANEURALNETWORKS_PRIORITY_HIGH) ==
572 Priority::HIGH,
Michael Butlere6785e42019-12-12 16:25:03 -0800573 "ANEURALNETWORKS_PRIORITY_HIGH does not map to Priority::HIGH");
574
Przemyslaw Szczepaniakf0589ad2018-11-08 14:56:06 +0000575// Asserts for ANeuralNetworksOperandType memory layout
576static_assert(offsetof(ANeuralNetworksOperandType, type) == 0,
577 "ANeuralNetworksOperandType.type offset != 0");
578static_assert(offsetof(ANeuralNetworksOperandType, dimensionCount) == 4,
579 "ANeuralNetworksOperandType.dimensionCount offset != 4");
580static_assert(offsetof(ANeuralNetworksOperandType, dimensions) == 8,
581 "ANeuralNetworksOperandType.dimensions offset != 8");
582static_assert(offsetof(ANeuralNetworksOperandType, scale) == 8 + sizeof(void*),
583 "ANeuralNetworksOperandType.scale offset != 8 + sizeof(void*)");
584static_assert(offsetof(ANeuralNetworksOperandType, zeroPoint) == 12 + sizeof(void*),
585 "ANeuralNetworksOperandType.zeroPoint offset != 12 + sizeof(void*)");
Przemyslaw Szczepaniakdbe87062018-12-19 12:07:03 +0000586static_assert(sizeof(ANeuralNetworksOperandType) == 16 + sizeof(void*),
Przemyslaw Szczepaniakf0589ad2018-11-08 14:56:06 +0000587 "ANeuralNetworksOperandType size changed");
588static_assert(alignof(ANeuralNetworksOperandType) == alignof(void*),
589 "ANeuralNetworksOperandType alignment changed");
590
591// Asserts for ANeuralNetworksSymmPerChannelQuantParams memory layout
Przemyslaw Szczepaniakdbe87062018-12-19 12:07:03 +0000592static_assert(offsetof(ANeuralNetworksSymmPerChannelQuantParams, channelDim) == 0,
Przemyslaw Szczepaniakf0589ad2018-11-08 14:56:06 +0000593 "ANeuralNetworksSymmPerChannelQuantParams.channelDim offset != 4 + sizeof(void*)");
Przemyslaw Szczepaniakdbe87062018-12-19 12:07:03 +0000594static_assert(offsetof(ANeuralNetworksSymmPerChannelQuantParams, scaleCount) == 4,
595 "ANeuralNetworksSymmPerChannelQuantParams.scaleCount offset != 0");
596static_assert(offsetof(ANeuralNetworksSymmPerChannelQuantParams, scales) == 8,
597 "ANeuralNetworksSymmPerChannelQuantParams.scales offset != 4");
Przemyslaw Szczepaniakf0589ad2018-11-08 14:56:06 +0000598static_assert(sizeof(ANeuralNetworksSymmPerChannelQuantParams) == 8 + sizeof(void*),
599 "ANeuralNetworksSymmPerChannelQuantParams size != 8 + sizeof(void*)");
600static_assert(alignof(ANeuralNetworksSymmPerChannelQuantParams) == alignof(void*),
601 "ANeuralNetworksOperandType alignment changed");
602
Xusong Wang7d4a14f2019-01-14 16:31:15 -0800603// Asserts for compilation caching
604static_assert(ANEURALNETWORKS_BYTE_SIZE_OF_CACHE_TOKEN == 32,
605 "ANEURALNETWORKS_BYTE_SIZE_OF_CACHE_TOKEN has changed");
Slava Shklyaev9f29f432020-08-13 13:16:03 +0100606static_assert(ANEURALNETWORKS_BYTE_SIZE_OF_CACHE_TOKEN == kByteSizeOfCacheToken,
607 "ANEURALNETWORKS_BYTE_SIZE_OF_CACHE_TOKEN != kByteSizeOfCacheToken");
Xusong Wang7d4a14f2019-01-14 16:31:15 -0800608
Michael Butlerd86176e2019-12-11 17:59:49 -0800609// Asserts for compilation priority
Michael Butlere6785e42019-12-12 16:25:03 -0800610static_assert(ANEURALNETWORKS_PRIORITY_LOW == 90, "ANEURALNETWORKS_PRIORITY_LOW has changed");
611static_assert(ANEURALNETWORKS_PRIORITY_MEDIUM == 100,
612 "ANEURALNETWORKS_PRIORITY_MEDIUM has changed");
613static_assert(ANEURALNETWORKS_PRIORITY_HIGH == 110, "ANEURALNETWORKS_PRIORITY_HIGH has changed");
Michael Butlerd86176e2019-12-11 17:59:49 -0800614static_assert(ANEURALNETWORKS_PRIORITY_DEFAULT == ANEURALNETWORKS_PRIORITY_MEDIUM,
615 "ANEURALNETWORKS_PRIORITY_DEFAULT has changed");
616
Przemysław Szczepaniaka6c206a2021-01-13 18:03:15 +0000617// Asserts for feature levels
618static_assert(ANEURALNETWORKS_FEATURE_LEVEL_1 == 27, "ANEURALNETWORKS_FEATURE_LEVEL_1 has changed");
619static_assert(ANEURALNETWORKS_FEATURE_LEVEL_2 == 28, "ANEURALNETWORKS_FEATURE_LEVEL_2 has changed");
620static_assert(ANEURALNETWORKS_FEATURE_LEVEL_3 == 29, "ANEURALNETWORKS_FEATURE_LEVEL_3 has changed");
621static_assert(ANEURALNETWORKS_FEATURE_LEVEL_4 == 30, "ANEURALNETWORKS_FEATURE_LEVEL_4 has changed");
622static_assert(ANEURALNETWORKS_FEATURE_LEVEL_5 == 31, "ANEURALNETWORKS_FEATURE_LEVEL_5 has changed");
623
Michael Butler9e59b9a2021-04-19 00:13:20 -0700624#ifdef NN_COMPATIBILITY_LIBRARY_BUILD
625
626static_assert(sizeof(SL_ANeuralNetworksPerformanceInfo) == sizeof(float) * 2,
627 "SL_ANeuralNetworksPerformanceInfo size changed");
628static_assert(sizeof(SL_ANeuralNetworksOperandPerformanceInfo) ==
629 sizeof(float) * 2 + sizeof(int32_t),
630 "SL_ANeuralNetworksOperandPerformanceInfo size changed");
631static_assert(sizeof(SL_ANeuralNetworksExtensionOperandTypeInformation) == 8,
632 "SL_ANeuralNetworksExtensionOperandTypeInformation size changed");
633
634static_assert(SL_ANEURALNETWORKS_CAPABILITIES_PERFORMANCE_RELAXED_SCALAR == 0,
635 "SL_ANEURALNETWORKS_CAPABILITIES_PERFORMANCE_RELAXED_SCALAR has changed");
636static_assert(SL_ANEURALNETWORKS_CAPABILITIES_PERFORMANCE_RELAXED_TENSOR == 1,
637 "SL_ANEURALNETWORKS_CAPABILITIES_PERFORMANCE_RELAXED_TENSOR has changed");
638static_assert(SL_ANEURALNETWORKS_CAPABILITIES_PERFORMANCE_IF == 2,
639 "SL_ANEURALNETWORKS_CAPABILITIES_PERFORMANCE_IF has changed");
640static_assert(SL_ANEURALNETWORKS_CAPABILITIES_PERFORMANCE_WHILE == 3,
641 "SL_ANEURALNETWORKS_CAPABILITIES_PERFORMANCE_WHILE has changed");
642
643#endif // NN_COMPATIBILITY_LIBRARY_BUILD
644
Miao Wang8eaf5d22018-10-01 11:54:50 -0700645int ANeuralNetworks_getDeviceCount(uint32_t* numDevices) {
646 if (numDevices == nullptr) {
647 LOG(ERROR) << "ANeuralNetworks_getDeviceCount passed a nullptr";
648 return ANEURALNETWORKS_UNEXPECTED_NULL;
649 }
650 *numDevices = DeviceManager::get()->getDrivers().size();
651 return ANEURALNETWORKS_NO_ERROR;
652}
653
654int ANeuralNetworks_getDevice(uint32_t devIndex, ANeuralNetworksDevice** device) {
655 if (device == nullptr) {
656 LOG(ERROR) << "ANeuralNetworks_getDevice passed a nullptr";
657 return ANEURALNETWORKS_UNEXPECTED_NULL;
658 }
659 const std::vector<std::shared_ptr<Device>>& devices = DeviceManager::get()->getDrivers();
660 if (devIndex >= devices.size()) {
661 LOG(ERROR) << "ANeuralNetworks_getDevice passed an invalid device index";
662 return ANEURALNETWORKS_BAD_DATA;
663 }
664 *device = reinterpret_cast<ANeuralNetworksDevice*>(devices.at(devIndex).get());
665 return ANEURALNETWORKS_NO_ERROR;
666}
667
668int ANeuralNetworksDevice_getName(const ANeuralNetworksDevice* device, const char** name) {
669 if (device == nullptr || name == nullptr) {
670 LOG(ERROR) << "ANeuralNetworksDevice_getName passed a nullptr";
671 return ANEURALNETWORKS_UNEXPECTED_NULL;
672 }
673 const Device* d = reinterpret_cast<const Device*>(device);
Michael Butler4bd54922019-08-09 16:44:42 -0700674 *name = d->getName().c_str();
Miao Wang8eaf5d22018-10-01 11:54:50 -0700675 return ANEURALNETWORKS_NO_ERROR;
676}
677
678int ANeuralNetworksDevice_getVersion(const ANeuralNetworksDevice* device, const char** version) {
679 if (device == nullptr || version == nullptr) {
680 LOG(ERROR) << "ANeuralNetworksDevice_getVersion passed a nullptr";
681 return ANEURALNETWORKS_UNEXPECTED_NULL;
682 }
683 const Device* d = reinterpret_cast<const Device*>(device);
Michael Butler4bd54922019-08-09 16:44:42 -0700684 *version = d->getVersionString().c_str();
Miao Wang8eaf5d22018-10-01 11:54:50 -0700685 return ANEURALNETWORKS_NO_ERROR;
686}
687
Miao Wang043e2492019-01-16 16:00:00 -0800688int ANeuralNetworksDevice_getType(const ANeuralNetworksDevice* device, int32_t* type) {
689 if (device == nullptr || type == nullptr) {
690 LOG(ERROR) << "ANeuralNetworksDevice_getType passed a nullptr";
691 return ANEURALNETWORKS_UNEXPECTED_NULL;
692 }
693 const Device* d = reinterpret_cast<const Device*>(device);
694 int32_t dType = d->getType();
695 if (dType < 0) {
696 return ANEURALNETWORKS_OP_FAILED;
697 }
698 *type = d->getType();
699 return ANEURALNETWORKS_NO_ERROR;
700}
701
Miao Wang8eaf5d22018-10-01 11:54:50 -0700702int ANeuralNetworksDevice_getFeatureLevel(const ANeuralNetworksDevice* device,
703 int64_t* featureLevel) {
704 if (device == nullptr || featureLevel == nullptr) {
705 LOG(ERROR) << "ANeuralNetworksDevice_getFeatureLevel passed a nullptr";
706 return ANEURALNETWORKS_UNEXPECTED_NULL;
707 }
708 Device* d = reinterpret_cast<Device*>(const_cast<ANeuralNetworksDevice*>(device));
Xusong Wang14d31482018-10-25 18:49:54 -0700709 int64_t dFeatureLevel = d->getFeatureLevel();
Miao Wang8eaf5d22018-10-01 11:54:50 -0700710 if (dFeatureLevel < 0) {
711 return ANEURALNETWORKS_BAD_STATE;
712 }
713 *featureLevel = dFeatureLevel;
714 return ANEURALNETWORKS_NO_ERROR;
715}
716
Michael Butlerd86176e2019-12-11 17:59:49 -0800717int ANeuralNetworksDevice_wait(const ANeuralNetworksDevice* device) {
Michael Butlerbf258232019-12-16 18:32:45 -0800718 if (device == nullptr) {
719 LOG(ERROR) << "ANeuralNetworksDevice_wait passed a nullptr";
720 return ANEURALNETWORKS_UNEXPECTED_NULL;
721 }
722 const Device* d = reinterpret_cast<const Device*>(device);
723 return d->wait();
Michael Butlerd86176e2019-12-11 17:59:49 -0800724}
725
Miao Wang72386ae2018-10-02 13:29:00 -0700726int ANeuralNetworksModel_getSupportedOperationsForDevices(
727 const ANeuralNetworksModel* model, const ANeuralNetworksDevice* const* devices,
728 uint32_t numDevices, bool* supportedOps) {
729 NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksModel_getSupportedOperationsForDevices");
730 if (model == nullptr || devices == nullptr || supportedOps == nullptr) {
731 LOG(ERROR) << "ANeuralNetworksModel_getSupportedOperationsForDevices passed a nullptr";
732 return ANEURALNETWORKS_UNEXPECTED_NULL;
733 }
Xusong Wang14d31482018-10-25 18:49:54 -0700734 if (numDevices == 0) {
735 LOG(ERROR) << "ANeuralNetworksModel_getSupportedOperationsForDevices passed an empty "
736 "device list";
737 return ANEURALNETWORKS_BAD_DATA;
738 }
Miao Wang72386ae2018-10-02 13:29:00 -0700739 const ModelBuilder* m = reinterpret_cast<const ModelBuilder*>(model);
740 if (!m->isFinished() || !m->isValid()) {
741 LOG(ERROR) << "ANeuralNetworksModel_getSupportedOperationsForDevices passed an unfinished "
742 "or invalid Model";
743 return ANEURALNETWORKS_BAD_STATE;
744 }
745
Slava Shklyaev9f29f432020-08-13 13:16:03 +0100746 const Model canonicalModel = m->makeModel();
Miao Wang72386ae2018-10-02 13:29:00 -0700747 const std::vector<uint32_t>& opMap = m->getSortedOperationMapping();
748 // init the output array to false for all the operations.
749 std::fill(supportedOps, supportedOps + opMap.size(), false);
750 for (uint32_t i = 0; i < numDevices; i++) {
751 if (devices[i] == nullptr) {
752 LOG(ERROR) << "ANeuralNetworksModel_getSupportedOperationsForDevices passed a nullptr "
753 "as a device";
754 return ANEURALNETWORKS_UNEXPECTED_NULL;
755 }
756 for (uint32_t j = i + 1; j < numDevices; j++) {
757 if (devices[i] == devices[j]) {
758 LOG(ERROR) << "ANeuralNetworksModel_getSupportedOperationsForDevices passed "
759 "duplicate devices";
760 return ANEURALNETWORKS_BAD_DATA;
761 }
762 }
763
764 Device* d = reinterpret_cast<Device*>(const_cast<ANeuralNetworksDevice*>(devices[i]));
Slava Shklyaev9f29f432020-08-13 13:16:03 +0100765 const MetaModel metaModel(canonicalModel, DeviceManager::get()->strictSlicing());
Michael Butler8bedada2019-10-15 16:26:47 -0700766 const std::vector<bool> supportsByDevice = d->getSupportedOperations(metaModel);
Miao Wang72386ae2018-10-02 13:29:00 -0700767 for (uint32_t j = 0; j < supportsByDevice.size(); j++) {
768 uint32_t originalIdx = opMap[j];
769 supportedOps[originalIdx] |= supportsByDevice[j];
770 }
771 }
772 return ANEURALNETWORKS_NO_ERROR;
773}
774
775int ANeuralNetworksCompilation_createForDevices(ANeuralNetworksModel* model,
776 const ANeuralNetworksDevice* const* devices,
777 uint32_t numDevices,
778 ANeuralNetworksCompilation** compilation) {
779 NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksCompilation_createForDevices");
780 if (model == nullptr || devices == nullptr || compilation == nullptr) {
781 LOG(ERROR) << "ANeuralNetworksCompilation_createForDevices passed a nullptr";
782 return ANEURALNETWORKS_UNEXPECTED_NULL;
783 }
784
Xusong Wang14d31482018-10-25 18:49:54 -0700785 if (numDevices == 0) {
786 LOG(ERROR) << "ANeuralNetworksCompilation_createForDevices passed an empty device list";
787 return ANEURALNETWORKS_BAD_DATA;
788 }
789
Miao Wang72386ae2018-10-02 13:29:00 -0700790 std::vector<std::shared_ptr<Device>> selectedDevices;
791 for (uint32_t i = 0; i < numDevices; i++) {
792 if (devices[i] == nullptr) {
793 LOG(ERROR)
794 << "ANeuralNetworksCompilation_createForDevices passed a nullptr as a device";
795 return ANEURALNETWORKS_UNEXPECTED_NULL;
796 }
797 for (uint32_t j = i + 1; j < numDevices; j++) {
798 if (devices[i] == devices[j]) {
799 LOG(ERROR)
800 << "ANeuralNetworksCompilation_createForDevices passed duplicate devices";
801 return ANEURALNETWORKS_BAD_DATA;
802 }
803 }
804 for (auto& device : DeviceManager::get()->getDrivers()) {
805 if (device.get() == reinterpret_cast<const Device*>(devices[i])) {
806 // Find a match
807 selectedDevices.push_back(device);
808 break;
809 }
810 }
811 }
812
813 if (selectedDevices.size() != numDevices) {
814 LOG(ERROR) << "ANeuralNetworksCompilation_createForDevices passed an invalid device set";
815 return ANEURALNETWORKS_BAD_DATA;
816 }
817 ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
818 CompilationBuilder* c = nullptr;
Miao Wang8814d9a2019-01-30 14:26:19 -0800819 // No CPU fallback when user specifies the list of devices manually.
David Grossd665cf12019-03-28 13:38:16 -0700820 int result = m->createCompilation(&c, selectedDevices, /* explicitDeviceList */ true);
Miao Wang72386ae2018-10-02 13:29:00 -0700821 *compilation = reinterpret_cast<ANeuralNetworksCompilation*>(c);
822 return result;
823}
824
David Grossa203d9a2018-11-15 21:10:05 -0800825int ANeuralNetworksExecution_compute(ANeuralNetworksExecution* execution) {
826 NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_compute");
827 if (!execution) {
828 LOG(ERROR) << "ANeuralNetworksExecution_compute passed a nullptr";
829 return ANEURALNETWORKS_UNEXPECTED_NULL;
830 }
831 // TODO validate the rest
832
833 ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
834 return r->computeSynchronously();
835}
836
David Gross257ee7a2019-01-23 14:59:10 -0800837int ANeuralNetworksExecution_setMeasureTiming(ANeuralNetworksExecution* execution, bool measure) {
838 NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_setMeasureTiming");
839 if (!execution) {
840 LOG(ERROR) << "ANeuralNetworksExecution_setMeasureTiming passed a nullptr";
841 return ANEURALNETWORKS_UNEXPECTED_NULL;
842 }
843 ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
844 return r->setMeasureTiming(measure);
845}
846
847int ANeuralNetworksExecution_getDuration(const ANeuralNetworksExecution* execution,
848 int32_t durationCode, uint64_t* duration) {
849 NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_getDuration");
850 if (!execution || !duration) {
851 LOG(ERROR) << "ANeuralNetworksExecution_getDuration passed a nullptr";
852 return ANEURALNETWORKS_UNEXPECTED_NULL;
853 }
854 switch (durationCode) {
855 case ANEURALNETWORKS_DURATION_ON_HARDWARE:
856 case ANEURALNETWORKS_DURATION_IN_DRIVER:
Miao Wang9cbac792020-02-06 13:01:34 -0800857 case ANEURALNETWORKS_FENCED_DURATION_ON_HARDWARE:
858 case ANEURALNETWORKS_FENCED_DURATION_IN_DRIVER:
David Gross257ee7a2019-01-23 14:59:10 -0800859 break;
860 default:
861 LOG(ERROR) << "ANeuralNetworksExecution_getDuration passed a bad durationCode "
862 << durationCode;
863 return ANEURALNETWORKS_BAD_DATA;
864 }
865 const ExecutionBuilder* r = reinterpret_cast<const ExecutionBuilder*>(execution);
866 return r->getDuration(durationCode, duration);
867}
868
Michael Butlerbbcc1eb2019-01-17 17:53:56 -0800869int ANeuralNetworksBurst_create(ANeuralNetworksCompilation* compilation,
870 ANeuralNetworksBurst** burst) {
871 NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksBurst_create");
872 if (!compilation || !burst) {
873 LOG(ERROR) << "ANeuralNetworksBurst_create passed a nullptr";
874 return ANEURALNETWORKS_UNEXPECTED_NULL;
875 }
876
Michael Butler2f6a6282019-01-24 02:36:37 -0800877 CompilationBuilder* c = reinterpret_cast<CompilationBuilder*>(compilation);
878 BurstBuilder* b = nullptr;
879 int result = c->createBurst(&b);
880 *burst = reinterpret_cast<ANeuralNetworksBurst*>(b);
881 return result;
Michael Butlerbbcc1eb2019-01-17 17:53:56 -0800882}
883
884void ANeuralNetworksBurst_free(ANeuralNetworksBurst* burst) {
885 NNTRACE_RT(NNTRACE_PHASE_TERMINATION, "ANeuralNetworksBurst_free");
886 // No validation. Free of nullptr is valid.
Michael Butler2f6a6282019-01-24 02:36:37 -0800887 BurstBuilder* b = reinterpret_cast<BurstBuilder*>(burst);
888 delete b;
Michael Butlerbbcc1eb2019-01-17 17:53:56 -0800889}
890
891int ANeuralNetworksExecution_burstCompute(ANeuralNetworksExecution* execution,
892 ANeuralNetworksBurst* burst) {
893 NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_burstCompute");
894 if (!execution || !burst) {
895 LOG(ERROR) << "ANeuralNetworksExecution_burstCompute passed a nullptr";
896 return ANEURALNETWORKS_UNEXPECTED_NULL;
897 }
898
Michael Butler2f6a6282019-01-24 02:36:37 -0800899 ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
900 BurstBuilder* b = reinterpret_cast<BurstBuilder*>(burst);
901
902 if (r->getCompilation() != b->getCompilation()) {
903 LOG(ERROR) << "ANeuralNetworksBurst and ANeuralNetworksExecution "
904 "used in ANeuralNetworksExecution_burstCompute must "
905 "originate from the same ANeuralNetworksCompilation";
906 return ANEURALNETWORKS_BAD_DATA;
907 }
908
909 const bool locked = b->tryLock();
910 if (!locked) {
911 LOG(ERROR) << "ANeuralNetworksBurst is already being used in another "
912 "call to ANeuralNetworksExecution_burstCompute";
913 return ANEURALNETWORKS_BAD_STATE;
914 }
915
916 const int n = r->burstCompute(b);
917 b->unlock();
918
919 return n;
Michael Butlerbbcc1eb2019-01-17 17:53:56 -0800920}
921
Xusong Wang062ec502019-11-27 11:44:03 -0800922int ANeuralNetworksMemoryDesc_create(ANeuralNetworksMemoryDesc** desc) {
923 NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksMemoryDesc_create");
924 if (desc != nullptr) {
925 *desc = nullptr;
926 }
927 if (!desc) {
928 LOG(ERROR) << "ANeuralNetworksMemoryDesc_create passed a nullptr";
929 return ANEURALNETWORKS_UNEXPECTED_NULL;
930 }
931 auto mb = std::make_unique<MemoryBuilder>();
932 *desc = reinterpret_cast<ANeuralNetworksMemoryDesc*>(mb.release());
933 return ANEURALNETWORKS_NO_ERROR;
Xusong Wangb0dc8f92019-12-13 10:43:03 -0800934}
935
Xusong Wang062ec502019-11-27 11:44:03 -0800936void ANeuralNetworksMemoryDesc_free(ANeuralNetworksMemoryDesc* desc) {
937 NNTRACE_RT(NNTRACE_PHASE_TERMINATION, "ANeuralNetworksMemoryDesc_free");
938 // No validation. Free of nullptr is valid.
939 MemoryBuilder* mb = reinterpret_cast<MemoryBuilder*>(desc);
940 delete mb;
Xusong Wangb0dc8f92019-12-13 10:43:03 -0800941}
942
Xusong Wang062ec502019-11-27 11:44:03 -0800943int ANeuralNetworksMemoryDesc_addInputRole(ANeuralNetworksMemoryDesc* desc,
944 const ANeuralNetworksCompilation* compilation,
945 uint32_t index, float frequency) {
946 NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksMemoryDesc_addInputRole");
947 if (!desc || !compilation) {
948 LOG(ERROR) << "ANeuralNetworksMemoryDesc_addInputRole passed a nullptr";
949 return ANEURALNETWORKS_UNEXPECTED_NULL;
950 }
951 MemoryBuilder* mb = reinterpret_cast<MemoryBuilder*>(desc);
952 const CompilationBuilder* c = reinterpret_cast<const CompilationBuilder*>(compilation);
953 return mb->addRole(*c, IOType::INPUT, index, frequency);
Xusong Wangb0dc8f92019-12-13 10:43:03 -0800954}
955
Xusong Wang062ec502019-11-27 11:44:03 -0800956int ANeuralNetworksMemoryDesc_addOutputRole(ANeuralNetworksMemoryDesc* desc,
957 const ANeuralNetworksCompilation* compilation,
958 uint32_t index, float frequency) {
959 NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksMemoryDesc_addOutputRole");
960 if (!desc || !compilation) {
961 LOG(ERROR) << "ANeuralNetworksMemoryDesc_addOutputRole passed a nullptr";
962 return ANEURALNETWORKS_UNEXPECTED_NULL;
963 }
964 MemoryBuilder* mb = reinterpret_cast<MemoryBuilder*>(desc);
965 const CompilationBuilder* c = reinterpret_cast<const CompilationBuilder*>(compilation);
966 return mb->addRole(*c, IOType::OUTPUT, index, frequency);
Xusong Wangb0dc8f92019-12-13 10:43:03 -0800967}
968
Xusong Wang062ec502019-11-27 11:44:03 -0800969int ANeuralNetworksMemoryDesc_setDimensions(ANeuralNetworksMemoryDesc* desc, uint32_t rank,
970 const uint32_t* dimensions) {
971 NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksMemoryDesc_setDimensions");
972 if (!desc || (!dimensions && rank > 0)) {
973 LOG(ERROR) << "ANeuralNetworksMemoryDesc_setDimensions passed a nullptr";
974 return ANEURALNETWORKS_UNEXPECTED_NULL;
975 }
976 const std::vector<uint32_t> dims(dimensions, dimensions + rank);
977 MemoryBuilder* mb = reinterpret_cast<MemoryBuilder*>(desc);
978 return mb->setDimensions(dims);
Xusong Wangb0dc8f92019-12-13 10:43:03 -0800979}
980
Xusong Wang062ec502019-11-27 11:44:03 -0800981int ANeuralNetworksMemoryDesc_finish(ANeuralNetworksMemoryDesc* desc) {
982 NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksMemoryDesc_finish");
983 if (!desc) {
984 LOG(ERROR) << "ANeuralNetworksMemoryDesc_finish passed a nullptr";
985 return ANEURALNETWORKS_UNEXPECTED_NULL;
986 }
987 MemoryBuilder* mb = reinterpret_cast<MemoryBuilder*>(desc);
988 return mb->finish();
Xusong Wangb0dc8f92019-12-13 10:43:03 -0800989}
990
Xusong Wang550e2a52019-11-27 12:18:19 -0800991int ANeuralNetworksMemory_createFromDesc(const ANeuralNetworksMemoryDesc* desc,
992 ANeuralNetworksMemory** memory) {
993 NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksMemory_createFromDesc");
994 if (memory != nullptr) {
995 *memory = nullptr;
996 }
997 if (!desc || !memory) {
998 LOG(ERROR) << "ANeuralNetworksMemory_createFromDesc passed a nullptr";
999 return ANEURALNETWORKS_UNEXPECTED_NULL;
1000 }
1001 const MemoryBuilder* mb = reinterpret_cast<const MemoryBuilder*>(desc);
1002 auto [n, m] = mb->allocate();
1003 if (n != ANEURALNETWORKS_NO_ERROR) {
1004 return n;
1005 }
1006 *memory = reinterpret_cast<ANeuralNetworksMemory*>(m.release());
1007 return ANEURALNETWORKS_NO_ERROR;
Xusong Wangb0dc8f92019-12-13 10:43:03 -08001008}
1009
Xusong Wang52b860b2019-11-27 16:23:36 -08001010int ANeuralNetworksMemory_copy(const ANeuralNetworksMemory* src, const ANeuralNetworksMemory* dst) {
1011 NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksMemory_copy");
1012 if (!src || !dst) {
1013 LOG(ERROR) << "ANeuralNetworksMemory_copy passed a nullptr";
1014 return ANEURALNETWORKS_UNEXPECTED_NULL;
1015 }
Slava Shklyaev9f29f432020-08-13 13:16:03 +01001016 const RuntimeMemory* s = reinterpret_cast<const RuntimeMemory*>(src);
1017 const RuntimeMemory* d = reinterpret_cast<const RuntimeMemory*>(dst);
1018 return RuntimeMemory::copy(*s, *d);
Xusong Wangb0dc8f92019-12-13 10:43:03 -08001019}
1020
Miao Wang7c5d98f2017-09-12 18:30:33 -07001021int ANeuralNetworksMemory_createFromFd(size_t size, int prot, int fd, size_t offset,
Miao Wange9ddab62017-09-05 14:41:05 -07001022 ANeuralNetworksMemory** memory) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001023 NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksMemory_createFromFd");
Michael Butler90fddbd2019-08-02 15:04:00 -07001024 *memory = nullptr; // WARNING: b/138965390
1025 int n = ANEURALNETWORKS_NO_ERROR;
1026 std::unique_ptr<MemoryFd> m;
1027 std::tie(n, m) = MemoryFd::create(size, prot, fd, offset);
Jean-Luc Brouillet4fb1e852017-08-20 18:16:36 -07001028 if (n != ANEURALNETWORKS_NO_ERROR) {
1029 return n;
1030 }
1031 *memory = reinterpret_cast<ANeuralNetworksMemory*>(m.release());
1032 return ANEURALNETWORKS_NO_ERROR;
1033}
1034
Miao Wang484e9702019-01-16 13:42:15 -08001035int ANeuralNetworksMemory_createFromAHardwareBuffer(const AHardwareBuffer* ahwb,
1036 ANeuralNetworksMemory** memory) {
1037 NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksMemory_createFromAHardwareBuffer");
Michael Butler90fddbd2019-08-02 15:04:00 -07001038 *memory = nullptr; // WARNING: b/138965390
1039 int n = ANEURALNETWORKS_NO_ERROR;
1040 std::unique_ptr<MemoryAHWB> m;
1041 std::tie(n, m) = MemoryAHWB::create(*ahwb);
Miao Wang484e9702019-01-16 13:42:15 -08001042 if (n != ANEURALNETWORKS_NO_ERROR) {
1043 return n;
1044 }
1045 *memory = reinterpret_cast<ANeuralNetworksMemory*>(m.release());
1046 return ANEURALNETWORKS_NO_ERROR;
1047}
1048
Jean-Luc Brouillet4fb1e852017-08-20 18:16:36 -07001049void ANeuralNetworksMemory_free(ANeuralNetworksMemory* memory) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001050 NNTRACE_RT(NNTRACE_PHASE_TERMINATION, "ANeuralNetworksMemory_free");
Jean-Luc Brouillet4fb1e852017-08-20 18:16:36 -07001051 // No validation. Free of nullptr is valid.
Slava Shklyaev9f29f432020-08-13 13:16:03 +01001052 RuntimeMemory* m = reinterpret_cast<RuntimeMemory*>(memory);
Jean-Luc Brouillet4fb1e852017-08-20 18:16:36 -07001053 delete m;
1054}
1055
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001056int ANeuralNetworksModel_create(ANeuralNetworksModel** model) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001057 NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_create");
Miao Wangf759e292017-10-04 19:45:45 -07001058 initVLogMask();
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001059 if (!model) {
Jean-Luc Brouillet873c0082017-07-25 00:17:50 -07001060 LOG(ERROR) << "ANeuralNetworksModel_create passed a nullptr";
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001061 return ANEURALNETWORKS_UNEXPECTED_NULL;
1062 }
Przemyslaw Szczepaniakad3966b2018-04-20 14:22:10 +01001063 ModelBuilder* m = new (std::nothrow) ModelBuilder();
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001064 if (m == nullptr) {
1065 *model = nullptr;
1066 return ANEURALNETWORKS_OUT_OF_MEMORY;
1067 }
1068 *model = reinterpret_cast<ANeuralNetworksModel*>(m);
1069 return ANEURALNETWORKS_NO_ERROR;
1070}
1071
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001072void ANeuralNetworksModel_free(ANeuralNetworksModel* model) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001073 NNTRACE_RT(NNTRACE_PHASE_TERMINATION, "ANeuralNetworksModel_free");
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001074 // No validation. Free of nullptr is valid.
1075 ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
1076 delete m;
1077}
1078
David Gross18651322017-09-11 14:47:58 -07001079int ANeuralNetworksModel_finish(ANeuralNetworksModel* model) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001080 NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_finish");
David Gross18651322017-09-11 14:47:58 -07001081 if (!model) {
1082 LOG(ERROR) << "ANeuralNetworksModel_finish passed a nullptr";
1083 return ANEURALNETWORKS_UNEXPECTED_NULL;
1084 }
1085 ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
1086 return m->finish();
1087}
1088
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001089int ANeuralNetworksModel_addOperand(ANeuralNetworksModel* model,
1090 const ANeuralNetworksOperandType* type) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001091 NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_addOperand");
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001092 if (!model || !type) {
Jean-Luc Brouillet873c0082017-07-25 00:17:50 -07001093 LOG(ERROR) << "ANeuralNetworksModel_addOperand passed a nullptr";
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001094 return ANEURALNETWORKS_UNEXPECTED_NULL;
1095 }
1096 ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001097 return m->addOperand(*type);
1098}
1099
1100int ANeuralNetworksModel_setOperandValue(ANeuralNetworksModel* model, int32_t index,
1101 const void* buffer, size_t length) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001102 NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_setOperandValue");
Miao Wang369997a2018-05-14 11:46:23 -07001103 if (!model || (!buffer && length != 0)) {
Jean-Luc Brouillet873c0082017-07-25 00:17:50 -07001104 LOG(ERROR) << "ANeuralNetworksModel_setOperandValue passed a nullptr";
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001105 return ANEURALNETWORKS_UNEXPECTED_NULL;
1106 }
1107 ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
1108 return m->setOperandValue(index, buffer, length);
1109}
1110
Jean-Luc Brouillet4fb1e852017-08-20 18:16:36 -07001111int ANeuralNetworksModel_setOperandValueFromMemory(ANeuralNetworksModel* model, int32_t index,
1112 const ANeuralNetworksMemory* memory,
Miao Wang0638da02017-09-13 15:53:28 -07001113 size_t offset, size_t length) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001114 NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_setOperandValueFromMemory");
Jean-Luc Brouillet4fb1e852017-08-20 18:16:36 -07001115 if (!model || !memory) {
1116 LOG(ERROR) << "ANeuralNetworksModel_setOperandValue passed a nullptr";
1117 return ANEURALNETWORKS_UNEXPECTED_NULL;
1118 }
Slava Shklyaev9f29f432020-08-13 13:16:03 +01001119 const RuntimeMemory* mem = reinterpret_cast<const RuntimeMemory*>(memory);
Jean-Luc Brouillet4fb1e852017-08-20 18:16:36 -07001120 ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
1121 return m->setOperandValueFromMemory(index, mem, offset, length);
1122}
1123
Slava Shklyaev71126b22019-12-13 16:53:12 +00001124int ANeuralNetworksModel_setOperandValueFromModel(ANeuralNetworksModel* model, int32_t index,
1125 const ANeuralNetworksModel* value) {
1126 NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_setOperandValueFromModel");
1127 if (!model || !value) {
1128 LOG(ERROR) << "ANeuralNetworksModel_setOperandValueFromModel passed a nullptr";
1129 return ANEURALNETWORKS_UNEXPECTED_NULL;
1130 }
1131 const ModelBuilder* val = reinterpret_cast<const ModelBuilder*>(value);
1132 ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
1133 return m->setOperandValueFromModel(index, val);
Slava Shklyaev2692e2b2019-11-04 17:45:01 +00001134}
1135
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001136int ANeuralNetworksModel_addOperation(ANeuralNetworksModel* model,
Jean-Luc Brouillet4c02adb2017-09-12 12:03:41 -07001137 ANeuralNetworksOperationType type, uint32_t inputCount,
1138 const uint32_t* inputs, uint32_t outputCount,
1139 const uint32_t* outputs) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001140 NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_addOperation");
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001141 if (!model || !inputs || !outputs) {
Jean-Luc Brouillet873c0082017-07-25 00:17:50 -07001142 LOG(ERROR) << "ANeuralNetworksModel_addOperation passed a nullptr";
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001143 return ANEURALNETWORKS_UNEXPECTED_NULL;
1144 }
1145 ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
Jean-Luc Brouillet4c02adb2017-09-12 12:03:41 -07001146 return m->addOperation(type, inputCount, inputs, outputCount, outputs);
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001147}
1148
Przemyslaw Szczepaniakdbe87062018-12-19 12:07:03 +00001149int ANeuralNetworksModel_setOperandSymmPerChannelQuantParams(
1150 ANeuralNetworksModel* model, int32_t index,
1151 const ANeuralNetworksSymmPerChannelQuantParams* channelQuant) {
1152 NNTRACE_RT(NNTRACE_PHASE_PREPARATION,
1153 "ANeuralNetworksModel_setOperandSymmPerChannelQuantParams");
1154 if (!model || !channelQuant) {
1155 LOG(ERROR) << "ANeuralNetworksModel_setOperandSymmPerChannelQuantParams passed a nullptr";
1156 return ANEURALNETWORKS_UNEXPECTED_NULL;
1157 }
1158 ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
1159 return m->setOperandSymmPerChannelQuantParams(index, *channelQuant);
1160}
1161
Jean-Luc Brouilleta8f44ec2017-10-04 20:41:35 -07001162int ANeuralNetworksModel_identifyInputsAndOutputs(ANeuralNetworksModel* model, uint32_t inputCount,
1163 const uint32_t* inputs, uint32_t outputCount,
1164 const uint32_t* outputs) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001165 NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_identifyInputsAndOutputs");
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001166 if (!model || !inputs || !outputs) {
Jean-Luc Brouilleta8f44ec2017-10-04 20:41:35 -07001167 LOG(ERROR) << ("ANeuralNetworksModel_identifyInputsAndOutputs passed a nullptr");
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001168 return ANEURALNETWORKS_UNEXPECTED_NULL;
1169 }
1170 ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
Jean-Luc Brouilleta8f44ec2017-10-04 20:41:35 -07001171 return m->identifyInputsAndOutputs(inputCount, inputs, outputCount, outputs);
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001172}
1173
Miao Wang043e2492019-01-16 16:00:00 -08001174int ANeuralNetworksModel_relaxComputationFloat32toFloat16(ANeuralNetworksModel* model, bool allow) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001175 NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_relaxComputationFloat32toFloat16");
Michael Butler795b33c2018-02-13 17:25:57 -08001176 if (!model) {
1177 LOG(ERROR) << ("ANeuralNetworksModel_relaxComputationFloat32toFloat16 passed a nullptr");
1178 return ANEURALNETWORKS_UNEXPECTED_NULL;
1179 }
1180 ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
1181 return m->relaxComputationFloat32toFloat16(allow);
1182}
1183
David Gross67f891d2017-09-10 14:31:58 -07001184int ANeuralNetworksCompilation_create(ANeuralNetworksModel* model,
1185 ANeuralNetworksCompilation** compilation) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001186 NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksCompilation_create");
David Gross67f891d2017-09-10 14:31:58 -07001187 if (!model || !compilation) {
1188 LOG(ERROR) << "ANeuralNetworksCompilation_create passed a nullptr";
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001189 return ANEURALNETWORKS_UNEXPECTED_NULL;
1190 }
1191
1192 ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
David Gross18651322017-09-11 14:47:58 -07001193 CompilationBuilder* c = nullptr;
Michael Butler3a038ab2021-04-15 13:17:18 -07001194
1195 const auto& drivers = DeviceManager::get()->getDrivers();
1196 std::vector<std::shared_ptr<Device>> nonUpdatableDrivers;
1197 nonUpdatableDrivers.reserve(drivers.size());
1198 std::copy_if(drivers.begin(), drivers.end(), std::back_inserter(nonUpdatableDrivers),
1199 [](const auto& driver) { return !driver->isUpdatable(); });
1200
1201 int result = m->createCompilation(&c, nonUpdatableDrivers);
David Gross67f891d2017-09-10 14:31:58 -07001202 *compilation = reinterpret_cast<ANeuralNetworksCompilation*>(c);
David Gross18651322017-09-11 14:47:58 -07001203 return result;
David Gross67f891d2017-09-10 14:31:58 -07001204}
1205
1206void ANeuralNetworksCompilation_free(ANeuralNetworksCompilation* compilation) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001207 NNTRACE_RT(NNTRACE_PHASE_TERMINATION, "ANeuralNetworksCompilation_free");
David Gross67f891d2017-09-10 14:31:58 -07001208 // No validation. Free of nullptr is valid.
David Gross67f891d2017-09-10 14:31:58 -07001209 CompilationBuilder* c = reinterpret_cast<CompilationBuilder*>(compilation);
1210 delete c;
1211}
1212
1213int ANeuralNetworksCompilation_setPreference(ANeuralNetworksCompilation* compilation,
Miao Wang0638da02017-09-13 15:53:28 -07001214 int32_t preference) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001215 NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksCompilation_setPreference");
David Gross67f891d2017-09-10 14:31:58 -07001216 if (!compilation) {
1217 LOG(ERROR) << "ANeuralNetworksCompilation_setPreference passed a nullptr";
1218 return ANEURALNETWORKS_UNEXPECTED_NULL;
1219 }
David Gross67f891d2017-09-10 14:31:58 -07001220 CompilationBuilder* c = reinterpret_cast<CompilationBuilder*>(compilation);
David Gross84cc7502017-09-13 19:24:00 -07001221 return c->setPreference(preference);
David Gross67f891d2017-09-10 14:31:58 -07001222}
1223
Xusong Wang7d4a14f2019-01-14 16:31:15 -08001224int ANeuralNetworksCompilation_setCaching(ANeuralNetworksCompilation* compilation,
1225 const char* cacheDir, const uint8_t* token) {
1226 NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksCompilation_setCaching");
1227 if (!compilation || !cacheDir || !token) {
1228 LOG(ERROR) << "ANeuralNetworksCompilation_setCaching passed a nullptr";
1229 return ANEURALNETWORKS_UNEXPECTED_NULL;
1230 }
1231 CompilationBuilder* c = reinterpret_cast<CompilationBuilder*>(compilation);
1232 return c->setCaching(cacheDir, token);
1233}
1234
David Gross84cc7502017-09-13 19:24:00 -07001235int ANeuralNetworksCompilation_finish(ANeuralNetworksCompilation* compilation) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001236 NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksCompilation_finish");
David Gross67f891d2017-09-10 14:31:58 -07001237 if (!compilation) {
David Gross84cc7502017-09-13 19:24:00 -07001238 LOG(ERROR) << "ANeuralNetworksCompilation_finish passed a nullptr";
David Gross67f891d2017-09-10 14:31:58 -07001239 return ANEURALNETWORKS_UNEXPECTED_NULL;
1240 }
David Gross67f891d2017-09-10 14:31:58 -07001241 CompilationBuilder* c = reinterpret_cast<CompilationBuilder*>(compilation);
David Gross84cc7502017-09-13 19:24:00 -07001242 return c->finish();
David Gross67f891d2017-09-10 14:31:58 -07001243}
1244
Michael Butlerd86176e2019-12-11 17:59:49 -08001245int ANeuralNetworksCompilation_setPriority(ANeuralNetworksCompilation* compilation, int priority) {
1246 NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksCompilation_setPriority");
Michael Butlerbf258232019-12-16 18:32:45 -08001247 if (!compilation) {
1248 LOG(ERROR) << "ANeuralNetworksCompilation_setPriority passed a nullptr";
1249 return ANEURALNETWORKS_UNEXPECTED_NULL;
1250 }
1251 CompilationBuilder* c = reinterpret_cast<CompilationBuilder*>(compilation);
1252 return c->setPriority(priority);
Michael Butlerd86176e2019-12-11 17:59:49 -08001253}
1254
1255int ANeuralNetworksCompilation_setTimeout(ANeuralNetworksCompilation* compilation,
1256 uint64_t duration) {
1257 NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "ANeuralNetworksCompilation_setTimeout");
Michael Butlerbf258232019-12-16 18:32:45 -08001258 if (!compilation) {
1259 LOG(ERROR) << "ANeuralNetworksCompilation_setTimeout passed a nullptr";
1260 return ANEURALNETWORKS_UNEXPECTED_NULL;
1261 }
1262 CompilationBuilder* c = reinterpret_cast<CompilationBuilder*>(compilation);
1263 return c->setTimeoutDuration(duration);
Michael Butlerd86176e2019-12-11 17:59:49 -08001264}
1265
David Gross7e03e902017-09-13 10:45:21 -07001266int ANeuralNetworksExecution_create(ANeuralNetworksCompilation* compilation,
1267 ANeuralNetworksExecution** execution) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001268 NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_create");
David Gross7e03e902017-09-13 10:45:21 -07001269 if (!compilation || !execution) {
1270 LOG(ERROR) << "ANeuralNetworksExecution_create passed a nullptr";
David Gross67f891d2017-09-10 14:31:58 -07001271 return ANEURALNETWORKS_UNEXPECTED_NULL;
1272 }
1273
1274 CompilationBuilder* c = reinterpret_cast<CompilationBuilder*>(compilation);
David Gross7e03e902017-09-13 10:45:21 -07001275 ExecutionBuilder* r = nullptr;
1276 int result = c->createExecution(&r);
1277 *execution = reinterpret_cast<ANeuralNetworksExecution*>(r);
David Gross18651322017-09-11 14:47:58 -07001278 return result;
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001279}
1280
David Gross7e03e902017-09-13 10:45:21 -07001281void ANeuralNetworksExecution_free(ANeuralNetworksExecution* execution) {
Mika Raentof11c5032018-06-27 14:02:01 +01001282 NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_free");
David Grossbc0e3f02019-08-07 12:12:12 -07001283 // Free of nullptr is valid.
David Gross7e03e902017-09-13 10:45:21 -07001284 ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
David Grossbc0e3f02019-08-07 12:12:12 -07001285 if (r && r->inFlight()) {
1286 LOG(ERROR) << "ANeuralNetworksExecution_free passed an in-flight ANeuralNetworksExecution"
1287 << " and is therefore ignored";
1288 return;
1289 }
David Gross15ebba42017-09-13 19:33:14 -07001290 delete r;
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001291}
1292
Xusong Wang9d3c7bf2018-10-31 08:37:25 -07001293int ANeuralNetworksExecution_getOutputOperandRank(ANeuralNetworksExecution* execution,
1294 int32_t index, uint32_t* rank) {
1295 NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_getOutputOperandRank");
1296 if (!execution || !rank) {
1297 LOG(ERROR) << "ANeuralNetworksExecution_getOutputOperandRank passed a nullptr";
1298 return ANEURALNETWORKS_UNEXPECTED_NULL;
1299 }
1300 ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
1301 return r->getOutputOperandRank(index, rank);
1302}
1303
1304int ANeuralNetworksExecution_getOutputOperandDimensions(ANeuralNetworksExecution* execution,
1305 int32_t index, uint32_t* dimensions) {
1306 NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_getOutputOperandDimensions");
1307 if (!execution || !dimensions) {
1308 LOG(ERROR) << "ANeuralNetworksExecution_getOutputOperandDimensions passed a nullptr";
1309 return ANEURALNETWORKS_UNEXPECTED_NULL;
1310 }
1311 ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
1312 return r->getOutputOperandDimensions(index, dimensions);
1313}
1314
David Gross7e03e902017-09-13 10:45:21 -07001315int ANeuralNetworksExecution_setInput(ANeuralNetworksExecution* execution, int32_t index,
1316 const ANeuralNetworksOperandType* type, const void* buffer,
1317 size_t length) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001318 NNTRACE_RT(NNTRACE_PHASE_INPUTS_AND_OUTPUTS, "ANeuralNetworksExecution_setInput");
Miao Wang2a8b52e2018-03-15 10:43:59 -07001319 if (!execution || (!buffer && length != 0)) {
David Gross7e03e902017-09-13 10:45:21 -07001320 LOG(ERROR) << "ANeuralNetworksExecution_setInput passed a nullptr";
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001321 return ANEURALNETWORKS_UNEXPECTED_NULL;
1322 }
David Gross7e03e902017-09-13 10:45:21 -07001323 ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
Jean-Luc Brouilletd409e2c2017-09-27 23:59:20 -07001324 return r->setInput(index, type, buffer, length);
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001325}
1326
David Gross7e03e902017-09-13 10:45:21 -07001327int ANeuralNetworksExecution_setInputFromMemory(ANeuralNetworksExecution* execution, int32_t index,
1328 const ANeuralNetworksOperandType* type,
Miao Wang0638da02017-09-13 15:53:28 -07001329 const ANeuralNetworksMemory* memory, size_t offset,
1330 size_t length) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001331 NNTRACE_RT(NNTRACE_PHASE_INPUTS_AND_OUTPUTS, "ANeuralNetworksExecution_setInputFromMemory");
David Gross7e03e902017-09-13 10:45:21 -07001332 if (!execution || !memory) {
1333 LOG(ERROR) << "ANeuralNetworksExecution_setInputFromMemory passed a nullptr";
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001334 return ANEURALNETWORKS_UNEXPECTED_NULL;
1335 }
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001336
Slava Shklyaev9f29f432020-08-13 13:16:03 +01001337 const RuntimeMemory* m = reinterpret_cast<const RuntimeMemory*>(memory);
David Gross7e03e902017-09-13 10:45:21 -07001338 ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
Jean-Luc Brouillet4fb1e852017-08-20 18:16:36 -07001339 return r->setInputFromMemory(index, type, m, offset, length);
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001340}
1341
David Gross7e03e902017-09-13 10:45:21 -07001342int ANeuralNetworksExecution_setOutput(ANeuralNetworksExecution* execution, int32_t index,
1343 const ANeuralNetworksOperandType* type, void* buffer,
1344 size_t length) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001345 NNTRACE_RT(NNTRACE_PHASE_INPUTS_AND_OUTPUTS, "ANeuralNetworksExecution_setOutput");
Miao Wang2a8b52e2018-03-15 10:43:59 -07001346 if (!execution || (!buffer && length != 0)) {
David Gross7e03e902017-09-13 10:45:21 -07001347 LOG(ERROR) << "ANeuralNetworksExecution_setOutput passed a nullptr";
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001348 return ANEURALNETWORKS_UNEXPECTED_NULL;
1349 }
David Gross7e03e902017-09-13 10:45:21 -07001350 ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
Jean-Luc Brouilletd409e2c2017-09-27 23:59:20 -07001351 return r->setOutput(index, type, buffer, length);
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001352}
1353
David Gross7e03e902017-09-13 10:45:21 -07001354int ANeuralNetworksExecution_setOutputFromMemory(ANeuralNetworksExecution* execution, int32_t index,
1355 const ANeuralNetworksOperandType* type,
Miao Wang0638da02017-09-13 15:53:28 -07001356 const ANeuralNetworksMemory* memory, size_t offset,
1357 size_t length) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001358 NNTRACE_RT(NNTRACE_PHASE_INPUTS_AND_OUTPUTS, "ANeuralNetworksExecution_setOutputFromMemory");
David Gross7e03e902017-09-13 10:45:21 -07001359 if (!execution || !memory) {
1360 LOG(ERROR) << "ANeuralNetworksExecution_setOutputFromMemory passed a nullptr";
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001361 return ANEURALNETWORKS_UNEXPECTED_NULL;
1362 }
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001363
David Gross7e03e902017-09-13 10:45:21 -07001364 ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
Slava Shklyaev9f29f432020-08-13 13:16:03 +01001365 const RuntimeMemory* m = reinterpret_cast<const RuntimeMemory*>(memory);
Jean-Luc Brouillet4fb1e852017-08-20 18:16:36 -07001366 return r->setOutputFromMemory(index, type, m, offset, length);
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001367}
1368
David Gross15ebba42017-09-13 19:33:14 -07001369int ANeuralNetworksExecution_startCompute(ANeuralNetworksExecution* execution,
1370 ANeuralNetworksEvent** event) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001371 NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_startCompute");
Miao Wange0227242019-12-20 16:07:39 -08001372 if (!event) {
David Gross7e03e902017-09-13 10:45:21 -07001373 LOG(ERROR) << "ANeuralNetworksExecution_startCompute passed a nullptr";
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001374 return ANEURALNETWORKS_UNEXPECTED_NULL;
1375 }
Miao Wange0227242019-12-20 16:07:39 -08001376 if (!execution) {
1377 LOG(ERROR) << "ANeuralNetworksExecution_startCompute passed a nullptr";
1378 *event = nullptr;
1379 return ANEURALNETWORKS_UNEXPECTED_NULL;
1380 }
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001381 // TODO validate the rest
1382
David Gross7e03e902017-09-13 10:45:21 -07001383 ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
David Gross15ebba42017-09-13 19:33:14 -07001384
Slava Shklyaeva6d95b12020-11-27 17:29:10 +00001385 std::shared_ptr<ExecutionCallback> callback;
David Gross15ebba42017-09-13 19:33:14 -07001386 *event = nullptr;
1387
Slava Shklyaeva6d95b12020-11-27 17:29:10 +00001388 int n = r->computeAsynchronously(&callback);
David Gross15ebba42017-09-13 19:33:14 -07001389 if (n != ANEURALNETWORKS_NO_ERROR) {
1390 return n;
1391 }
Slava Shklyaeva6d95b12020-11-27 17:29:10 +00001392 auto e = std::make_unique<CallbackEvent>(std::move(callback));
David Gross15ebba42017-09-13 19:33:14 -07001393 *event = reinterpret_cast<ANeuralNetworksEvent*>(e.release());
1394 return ANEURALNETWORKS_NO_ERROR;
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001395}
1396
Michael Butlerd86176e2019-12-11 17:59:49 -08001397int ANeuralNetworksExecution_setTimeout(ANeuralNetworksExecution* execution, uint64_t duration) {
1398 NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_setTimeout");
Michael Butlerbf258232019-12-16 18:32:45 -08001399 if (!execution) {
1400 LOG(ERROR) << "ANeuralNetworksExecution_setTimeout passed a nullptr";
1401 return ANEURALNETWORKS_UNEXPECTED_NULL;
1402 }
1403
1404 ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
1405 return r->setTimeoutDuration(duration);
Michael Butlerd86176e2019-12-11 17:59:49 -08001406}
1407
David Gross15ebba42017-09-13 19:33:14 -07001408int ANeuralNetworksEvent_wait(ANeuralNetworksEvent* event) {
Mika Raento0bb84c72018-04-23 22:06:45 +01001409 NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksEvent_wait");
David Gross15ebba42017-09-13 19:33:14 -07001410 if (event == nullptr) {
1411 LOG(ERROR) << "ANeuralNetworksEvent_wait passed a nullptr";
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001412 return ANEURALNETWORKS_UNEXPECTED_NULL;
1413 }
1414
Miao Wange0227242019-12-20 16:07:39 -08001415 IEvent* e = reinterpret_cast<IEvent*>(event);
Xusong Wang2d704a52021-02-08 20:48:10 -08001416 return convertErrorStatusToResultCode(e->wait());
David Gross15ebba42017-09-13 19:33:14 -07001417}
1418
1419void ANeuralNetworksEvent_free(ANeuralNetworksEvent* event) {
Mika Raentof11c5032018-06-27 14:02:01 +01001420 NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksEvent_free");
David Gross15ebba42017-09-13 19:33:14 -07001421 // No validation. Free of nullptr is valid.
1422 if (event) {
Miao Wange0227242019-12-20 16:07:39 -08001423 IEvent* e = reinterpret_cast<IEvent*>(event);
1424 e->wait();
David Gross15ebba42017-09-13 19:33:14 -07001425 delete e;
1426 }
Jean-Luc Brouilleta09d6992017-07-12 01:37:27 -07001427}
Slava Shklyaevc39dd5e2019-01-23 16:09:51 +00001428
Slava Shklyaev1b72d332020-02-11 16:14:25 +00001429int ANeuralNetworksExecution_setLoopTimeout(ANeuralNetworksExecution* execution,
1430 uint64_t duration) {
1431 NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_setLoopTimeout");
1432 if (!execution) {
1433 LOG(ERROR) << "ANeuralNetworksExecution_setLoopTimeout passed a nullptr";
1434 return ANEURALNETWORKS_UNEXPECTED_NULL;
1435 }
1436
1437 ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
1438 return r->setLoopTimeout(duration);
Slava Shklyaev1f11e4e2020-01-22 16:25:33 +00001439}
1440
1441uint64_t ANeuralNetworks_getDefaultLoopTimeout() {
1442 return operation_while::kTimeoutNsDefault;
1443}
1444
1445uint64_t ANeuralNetworks_getMaximumLoopTimeout() {
1446 return operation_while::kTimeoutNsMaximum;
1447}
1448
Slava Shklyaevc39dd5e2019-01-23 16:09:51 +00001449int ANeuralNetworksDevice_getExtensionSupport(const ANeuralNetworksDevice* device,
1450 const char* extensionName,
1451 bool* isExtensionSupported) {
1452 if (device == nullptr || extensionName == nullptr || isExtensionSupported == nullptr) {
1453 LOG(ERROR) << "ANeuralNetworksDevice_getExtensionSupport passed a nullptr";
1454 return ANEURALNETWORKS_UNEXPECTED_NULL;
1455 }
1456
Michael Butler4bd54922019-08-09 16:44:42 -07001457 const Device* d = reinterpret_cast<const Device*>(device);
1458 const auto& supportedExtensions = d->getSupportedExtensions();
1459 *isExtensionSupported = std::any_of(supportedExtensions.begin(), supportedExtensions.end(),
1460 [extensionName](const auto& supportedExtension) {
1461 return supportedExtension.name == extensionName;
1462 });
Slava Shklyaevc39dd5e2019-01-23 16:09:51 +00001463
1464 return ANEURALNETWORKS_NO_ERROR;
1465}
1466
1467int ANeuralNetworksModel_getExtensionOperandType(ANeuralNetworksModel* model,
1468 const char* extensionName,
1469 uint16_t operandCodeWithinExtension,
1470 int32_t* type) {
1471 NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_getExtensionOperandType");
1472 if (!model || !extensionName || !type) {
1473 LOG(ERROR) << "ANeuralNetworksModel_getExtensionOperandType passed a nullptr";
1474 return ANEURALNETWORKS_UNEXPECTED_NULL;
1475 }
1476 ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
1477 return m->getExtensionType(extensionName, operandCodeWithinExtension, type);
1478}
1479
1480int ANeuralNetworksModel_getExtensionOperationType(ANeuralNetworksModel* model,
1481 const char* extensionName,
1482 uint16_t operationCodeWithinExtension,
1483 ANeuralNetworksOperationType* type) {
1484 NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_getExtensionOperationType");
1485 if (!model || !extensionName || !type) {
1486 LOG(ERROR) << "ANeuralNetworksModel_getExtensionOperationType passed a nullptr";
1487 return ANEURALNETWORKS_UNEXPECTED_NULL;
1488 }
1489 ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
1490 return m->getExtensionType(extensionName, operationCodeWithinExtension, type);
1491}
1492
1493int ANeuralNetworksModel_setOperandExtensionData(ANeuralNetworksModel* model, int32_t index,
1494 const void* data, size_t length) {
1495 NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksModel_setOperandExtensionData");
1496 if (!model || (!data && length != 0)) {
1497 LOG(ERROR) << "ANeuralNetworksModel_setOperandExtensionData passed a nullptr";
1498 return ANEURALNETWORKS_UNEXPECTED_NULL;
1499 }
1500 ModelBuilder* m = reinterpret_cast<ModelBuilder*>(model);
1501 return m->setOperandExtensionData(index, data, length);
1502}
Miao Wange0227242019-12-20 16:07:39 -08001503
Miao Wang9cc46762020-01-21 14:59:54 -08001504int ANeuralNetworksEvent_createFromSyncFenceFd(int syncFenceFd, ANeuralNetworksEvent** event) {
Miao Wange0227242019-12-20 16:07:39 -08001505 if (event == nullptr) {
1506 LOG(ERROR) << "ANeuralNetworksEvent_createFromSyncFenceFd passed a nullptr";
1507 return ANEURALNETWORKS_UNEXPECTED_NULL;
1508 }
Miao Wang9cc46762020-01-21 14:59:54 -08001509 if (syncFenceFd <= 0) {
Miao Wange0227242019-12-20 16:07:39 -08001510 LOG(ERROR) << "ANeuralNetworksEvent_createFromSyncFenceFd passed an invalid fd: "
Miao Wang9cc46762020-01-21 14:59:54 -08001511 << syncFenceFd;
Miao Wange0227242019-12-20 16:07:39 -08001512 *event = nullptr;
1513 return ANEURALNETWORKS_BAD_DATA;
1514 }
Xusong Wang2d704a52021-02-08 20:48:10 -08001515 std::unique_ptr<SyncFenceEvent> e =
1516 std::make_unique<SyncFenceEvent>(syncFenceFd, nullptr, nullptr);
Miao Wange0227242019-12-20 16:07:39 -08001517 *event = reinterpret_cast<ANeuralNetworksEvent*>(e.release());
1518 return ANEURALNETWORKS_NO_ERROR;
1519}
1520
Miao Wang9cc46762020-01-21 14:59:54 -08001521int ANeuralNetworksEvent_getSyncFenceFd(const ANeuralNetworksEvent* event, int* syncFenceFd) {
1522 if (syncFenceFd == nullptr) {
Miao Wange0227242019-12-20 16:07:39 -08001523 LOG(ERROR) << "ANeuralNetworksEvent_getSyncFenceFd passed a nullptr";
1524 return ANEURALNETWORKS_UNEXPECTED_NULL;
1525 }
Miao Wang9cc46762020-01-21 14:59:54 -08001526 *syncFenceFd = -1;
Miao Wange0227242019-12-20 16:07:39 -08001527 if (event == nullptr) {
1528 LOG(ERROR) << "ANeuralNetworksEvent_getSyncFenceFd passed a nullptr";
1529 return ANEURALNETWORKS_UNEXPECTED_NULL;
1530 }
1531 const IEvent* e = reinterpret_cast<const IEvent*>(event);
1532 // The client owns the dupped fd, and is responsible for closing it.
Miao Wang9cc46762020-01-21 14:59:54 -08001533 *syncFenceFd = e->getSyncFenceFd(/*shouldDup*/ true);
1534 if (*syncFenceFd <= 0) {
Miao Wange0227242019-12-20 16:07:39 -08001535 LOG(ERROR) << "ANeuralNetworksEvent_getSyncFenceFd unable to get valid sync_fence fd";
Miao Wang9cc46762020-01-21 14:59:54 -08001536 *syncFenceFd = -1;
Xusong Wang42d437c2021-05-27 10:13:24 -07001537 return ANEURALNETWORKS_BAD_DATA;
Miao Wange0227242019-12-20 16:07:39 -08001538 }
1539 return ANEURALNETWORKS_NO_ERROR;
1540}
1541
1542int ANeuralNetworksExecution_startComputeWithDependencies(
1543 ANeuralNetworksExecution* execution, const ANeuralNetworksEvent* const* dependencies,
Miao Wang9cc46762020-01-21 14:59:54 -08001544 uint32_t numOfDependencies, uint64_t duration, ANeuralNetworksEvent** event) {
Miao Wange0227242019-12-20 16:07:39 -08001545 NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_startComputeWithDependencies");
1546 if (!event) {
1547 LOG(ERROR) << "ANeuralNetworksExecution_startComputeWithDependencies passed a nullptr";
1548 return ANEURALNETWORKS_UNEXPECTED_NULL;
1549 }
Miao Wang9cc46762020-01-21 14:59:54 -08001550 if ((!dependencies && numOfDependencies != 0) || !execution) {
Miao Wange0227242019-12-20 16:07:39 -08001551 LOG(ERROR) << "ANeuralNetworksExecution_startComputeWithDependencies passed a nullptr";
1552 *event = nullptr;
1553 return ANEURALNETWORKS_UNEXPECTED_NULL;
1554 }
1555 ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
1556
Miao Wang9cc46762020-01-21 14:59:54 -08001557 std::vector<int> waitForList;
1558 for (uint32_t i = 0; i < numOfDependencies; i++) {
Miao Wange0227242019-12-20 16:07:39 -08001559 if (!dependencies[i]) {
1560 LOG(ERROR) << "ANeuralNetworksExecution_startComputeWithDependencies passed a nullptr";
1561 *event = nullptr;
1562 return ANEURALNETWORKS_UNEXPECTED_NULL;
1563 }
1564 const IEvent* e = reinterpret_cast<const IEvent*>(dependencies[i]);
Miao Wang9cc46762020-01-21 14:59:54 -08001565 int syncFenceFd = e->getSyncFenceFd(/*should_dup*/ false);
1566 if (syncFenceFd < 0) {
Miao Wange0227242019-12-20 16:07:39 -08001567 e->wait();
1568 } else {
Miao Wang9cc46762020-01-21 14:59:54 -08001569 waitForList.push_back(syncFenceFd);
Miao Wange0227242019-12-20 16:07:39 -08001570 }
1571 }
David Gross948ffa82020-08-14 15:30:49 -07001572
1573 if (r->getCompilation()->hasDynamicTemporaries()) {
1574 // The current implementation of fenced execution does not support
1575 // dynamic temporaries. Fall back to non fenced execution.
1576 LOG(INFO) << "ANeuralNetworksExecution_startComputeWithDependencies falling back"
1577 << " to ANeuralNetworksExecution_startCompute"
1578 << " because of boundary operands of unknown size";
1579 for (int syncFenceFd : waitForList) {
1580 if (syncFenceFd > 0) {
1581 auto w = syncWait(syncFenceFd, -1);
1582 if (w != FenceState::SIGNALED) {
1583 VLOG(EXECUTION) << "syncWait failed, fd: " << syncFenceFd;
1584 *event = nullptr;
1585 return ANEURALNETWORKS_OP_FAILED;
1586 }
1587 }
1588 }
1589 return ANeuralNetworksExecution_startCompute(execution, event);
1590 }
1591
Miao Wang9cc46762020-01-21 14:59:54 -08001592 int syncFenceToSignal = -1;
1593 int n = r->computeFenced(waitForList, duration, &syncFenceToSignal);
Xusong Wang2d704a52021-02-08 20:48:10 -08001594 std::unique_ptr<SyncFenceEvent> e = std::make_unique<SyncFenceEvent>(
1595 syncFenceToSignal, r->getExecuteFencedInfoCallback(),
1596 // TODO(miaowang): support dynamic output shape only with memory domain.
1597 // For now just return empty output shapes.
1598 [r](ErrorStatus status) { return r->finishComputation(status, {}); });
Miao Wange0227242019-12-20 16:07:39 -08001599 if (n != ANEURALNETWORKS_NO_ERROR) {
1600 *event = nullptr;
1601 } else {
1602 *event = reinterpret_cast<ANeuralNetworksEvent*>(e.release());
1603 }
1604 return n;
1605}
Przemysław Szczepaniaka6c206a2021-01-13 18:03:15 +00001606
1607int64_t ANeuralNetworks_getRuntimeFeatureLevel() {
1608 return kCurrentNNAPIRuntimeFeatureLevel;
1609}
Xusong Wang811f94f2021-02-16 10:43:33 -08001610
1611int ANeuralNetworksExecution_enableInputAndOutputPadding(ANeuralNetworksExecution* execution,
1612 bool enable) {
1613 NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_enableInputAndOutputPadding");
1614 if (!execution) {
1615 LOG(ERROR) << "ANeuralNetworksExecution_enableInputAndOutputPadding passed a nullptr";
1616 return ANEURALNETWORKS_UNEXPECTED_NULL;
1617 }
1618 ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
1619 return r->enableInputAndOutputPadding(enable);
1620}
Xusong Wangacb13852021-02-18 18:22:18 -08001621
1622int ANeuralNetworksCompilation_getPreferredMemoryAlignmentForInput(
1623 const ANeuralNetworksCompilation* compilation, uint32_t index, uint32_t* alignment) {
1624 NNTRACE_RT(NNTRACE_PHASE_COMPILATION,
1625 "ANeuralNetworksCompilation_getPreferredMemoryAlignmentForInput");
1626 if (!compilation || !alignment) {
1627 LOG(ERROR) << "ANeuralNetworksCompilation_getPreferredMemoryAlignmentForInput passed a "
1628 "nullptr";
1629 return ANEURALNETWORKS_UNEXPECTED_NULL;
1630 }
1631 const CompilationBuilder* c = reinterpret_cast<const CompilationBuilder*>(compilation);
1632 return c->getPreferredMemoryAlignmentForInput(index, alignment);
1633}
1634
1635int ANeuralNetworksCompilation_getPreferredMemoryPaddingForInput(
1636 const ANeuralNetworksCompilation* compilation, uint32_t index, uint32_t* padding) {
1637 NNTRACE_RT(NNTRACE_PHASE_COMPILATION,
1638 "ANeuralNetworksCompilation_getPreferredMemoryPaddingForInput");
1639 if (!compilation || !padding) {
1640 LOG(ERROR) << "ANeuralNetworksCompilation_getPreferredMemoryPaddingForInput passed a "
1641 "nullptr";
1642 return ANEURALNETWORKS_UNEXPECTED_NULL;
1643 }
1644 const CompilationBuilder* c = reinterpret_cast<const CompilationBuilder*>(compilation);
1645 return c->getPreferredMemoryPaddingForInput(index, padding);
1646}
1647
1648int ANeuralNetworksCompilation_getPreferredMemoryAlignmentForOutput(
1649 const ANeuralNetworksCompilation* compilation, uint32_t index, uint32_t* alignment) {
1650 NNTRACE_RT(NNTRACE_PHASE_COMPILATION,
1651 "ANeuralNetworksCompilation_getPreferredMemoryAlignmentForOutput");
1652 if (!compilation || !alignment) {
1653 LOG(ERROR) << "ANeuralNetworksCompilation_getPreferredMemoryAlignmentForOutput passed a "
1654 "nullptr";
1655 return ANEURALNETWORKS_UNEXPECTED_NULL;
1656 }
1657 const CompilationBuilder* c = reinterpret_cast<const CompilationBuilder*>(compilation);
1658 return c->getPreferredMemoryAlignmentForOutput(index, alignment);
1659}
1660
1661int ANeuralNetworksCompilation_getPreferredMemoryPaddingForOutput(
1662 const ANeuralNetworksCompilation* compilation, uint32_t index, uint32_t* padding) {
1663 NNTRACE_RT(NNTRACE_PHASE_COMPILATION,
1664 "ANeuralNetworksCompilation_getPreferredMemoryPaddingForOutput");
1665 if (!compilation || !padding) {
1666 LOG(ERROR) << "ANeuralNetworksCompilation_getPreferredMemoryPaddingForOutput passed a "
1667 "nullptr";
1668 return ANEURALNETWORKS_UNEXPECTED_NULL;
1669 }
1670 const CompilationBuilder* c = reinterpret_cast<const CompilationBuilder*>(compilation);
1671 return c->getPreferredMemoryPaddingForOutput(index, padding);
1672}
Xusong Wang2d704a52021-02-08 20:48:10 -08001673
1674int ANeuralNetworksExecution_setReusable(ANeuralNetworksExecution* execution, bool reusable) {
1675 NNTRACE_RT(NNTRACE_PHASE_EXECUTION, "ANeuralNetworksExecution_setReusable");
1676 if (!execution) {
1677 LOG(ERROR) << "ANeuralNetworksExecution_setReusable passed a nullptr";
1678 return ANEURALNETWORKS_UNEXPECTED_NULL;
1679 }
1680 ExecutionBuilder* r = reinterpret_cast<ExecutionBuilder*>(execution);
1681 return r->setReusable(reusable);
1682}
Przemysław Szczepaniaka7e069f2021-03-17 14:07:40 +00001683
1684#ifdef NN_COMPATIBILITY_LIBRARY_BUILD
1685
Michael Butler9e59b9a2021-04-19 00:13:20 -07001686int SL_ANeuralNetworksCompilation_setCachingFromFds(ANeuralNetworksCompilation* compilation,
1687 const int* modelCacheFds,
1688 const uint32_t numModelCacheFiles,
1689 const int* dataCacheFds,
1690 const uint32_t numDataCacheFiles,
1691 const uint8_t* token) {
1692 NNTRACE_RT(NNTRACE_PHASE_COMPILATION, "SL_ANeuralNetworksCompilation_setCachingFromFds");
Slava Shklyaev2fd3d4d2021-04-16 15:31:57 +01001693 if (!compilation || (numModelCacheFiles != 0 && !modelCacheFds) ||
1694 (numDataCacheFiles != 0 && !dataCacheFds) || !token) {
Michael Butler9e59b9a2021-04-19 00:13:20 -07001695 LOG(ERROR) << "SL_ANeuralNetworksCompilation_setCachingFromFds passed a nullptr";
Slava Shklyaev2fd3d4d2021-04-16 15:31:57 +01001696 return ANEURALNETWORKS_UNEXPECTED_NULL;
1697 }
Slava Shklyaeve5553f02021-04-23 17:17:57 +01001698 CompilationBuilder* c = reinterpret_cast<CompilationBuilder*>(compilation);
1699 return c->setCachingFromFds(modelCacheFds, numModelCacheFiles, dataCacheFds, numDataCacheFiles,
1700 token);
Slava Shklyaev2fd3d4d2021-04-16 15:31:57 +01001701}
1702
Michael Butler9e59b9a2021-04-19 00:13:20 -07001703int SL_ANeuralNetworksDevice_getNumberOfCacheFilesNeeded(const ANeuralNetworksDevice* device,
1704 uint32_t* numModelCacheFiles,
1705 uint32_t* numDataCacheFiles) {
1706 if (numModelCacheFiles) *numModelCacheFiles = 0;
1707 if (numDataCacheFiles) *numDataCacheFiles = 0;
1708
1709 if (device == nullptr || numModelCacheFiles == nullptr || numDataCacheFiles == nullptr) {
1710 LOG(ERROR) << "SL_ANeuralNetworksDevice_getNumberOfCacheFilesNeeded passed a nullptr";
1711 return ANEURALNETWORKS_UNEXPECTED_NULL;
1712 }
1713
Michael Butlerf675ffa2021-04-19 14:35:35 -07001714 const Device* d = reinterpret_cast<const Device*>(device);
1715 std::tie(*numModelCacheFiles, *numDataCacheFiles) = d->getNumberOfCacheFilesNeeded();
1716 return ANEURALNETWORKS_NO_ERROR;
Michael Butler9e59b9a2021-04-19 00:13:20 -07001717}
1718
1719int SL_ANeuralNetworksDevice_getPerformanceInfo(
1720 const ANeuralNetworksDevice* device, int32_t performanceInfoKind,
1721 SL_ANeuralNetworksPerformanceInfo* performanceInfo) {
1722 if (performanceInfo) *performanceInfo = {.execTime = 0.0f, .powerUsage = 0.0f};
1723
1724 if (device == nullptr || performanceInfo == nullptr) {
1725 LOG(ERROR) << "SL_ANeuralNetworksDevice_getPerformanceInfo passed a nullptr";
1726 return ANEURALNETWORKS_UNEXPECTED_NULL;
1727 }
1728
Michael Butlerf675ffa2021-04-19 14:35:35 -07001729 constexpr auto conv = [](const Capabilities::PerformanceInfo& info) {
1730 return SL_ANeuralNetworksPerformanceInfo{.execTime = info.execTime,
1731 .powerUsage = info.powerUsage};
1732 };
1733
1734 const Device* d = reinterpret_cast<const Device*>(device);
1735 const Capabilities& capabilities = d->getCapabilities();
1736
Michael Butler9e59b9a2021-04-19 00:13:20 -07001737 switch (performanceInfoKind) {
1738 case SL_ANEURALNETWORKS_CAPABILITIES_PERFORMANCE_RELAXED_SCALAR:
Michael Butlerf675ffa2021-04-19 14:35:35 -07001739 *performanceInfo = conv(capabilities.relaxedFloat32toFloat16PerformanceScalar);
1740 return ANEURALNETWORKS_NO_ERROR;
Michael Butler9e59b9a2021-04-19 00:13:20 -07001741 case SL_ANEURALNETWORKS_CAPABILITIES_PERFORMANCE_RELAXED_TENSOR:
Michael Butlerf675ffa2021-04-19 14:35:35 -07001742 *performanceInfo = conv(capabilities.relaxedFloat32toFloat16PerformanceTensor);
1743 return ANEURALNETWORKS_NO_ERROR;
Michael Butler9e59b9a2021-04-19 00:13:20 -07001744 case SL_ANEURALNETWORKS_CAPABILITIES_PERFORMANCE_IF:
Michael Butlerf675ffa2021-04-19 14:35:35 -07001745 *performanceInfo = conv(capabilities.ifPerformance);
1746 return ANEURALNETWORKS_NO_ERROR;
1747 case SL_ANEURALNETWORKS_CAPABILITIES_PERFORMANCE_WHILE:
1748 *performanceInfo = conv(capabilities.whilePerformance);
1749 return ANEURALNETWORKS_NO_ERROR;
Michael Butler9e59b9a2021-04-19 00:13:20 -07001750 }
1751
Michael Butlerf675ffa2021-04-19 14:35:35 -07001752 LOG(ERROR) << "SL_ANeuralNetworksDevice_getPerformanceInfo passed unknown performanceInfoKind "
1753 << performanceInfoKind;
1754 return ANEURALNETWORKS_BAD_DATA;
Michael Butler9e59b9a2021-04-19 00:13:20 -07001755}
1756
1757int SL_ANeuralNetworksDevice_forEachOperandPerformanceInfo(
1758 const ANeuralNetworksDevice* device, void* context,
1759 void (*callback)(SL_ANeuralNetworksOperandPerformanceInfo, void*)) {
1760 if (device == nullptr || context == nullptr || callback == nullptr) {
1761 LOG(ERROR) << "SL_ANeuralNetworksDevice_forEachOperandPerformanceInfo passed a nullptr";
1762 return ANEURALNETWORKS_UNEXPECTED_NULL;
1763 }
1764
Michael Butlerf675ffa2021-04-19 14:35:35 -07001765 constexpr auto conv = [](const Capabilities::OperandPerformance& operandPerformance) {
1766 return SL_ANeuralNetworksOperandPerformanceInfo{
1767 .operandType = static_cast<int32_t>(operandPerformance.type),
1768 .performanceInfo = {.execTime = operandPerformance.info.execTime,
1769 .powerUsage = operandPerformance.info.powerUsage},
1770 };
1771 };
1772
1773 const Device* d = reinterpret_cast<const Device*>(device);
1774 const Capabilities& capabilities = d->getCapabilities();
1775
1776 for (const auto& operandPerformance : capabilities.operandPerformance.asVector()) {
1777 const SL_ANeuralNetworksOperandPerformanceInfo opPerf = conv(operandPerformance);
1778 callback(opPerf, context);
1779 }
1780 return ANEURALNETWORKS_NO_ERROR;
Michael Butler9e59b9a2021-04-19 00:13:20 -07001781}
1782
1783int SL_ANeuralNetworksDevice_getVendorExtensionCount(const ANeuralNetworksDevice* device,
1784 uint32_t* vendorExtensionCount) {
1785 if (vendorExtensionCount) *vendorExtensionCount = 0;
1786
1787 if (device == nullptr || vendorExtensionCount == nullptr) {
1788 LOG(ERROR) << "SL_ANeuralNetworksDevice_getVendorExtensionCount passed a nullptr";
1789 return ANEURALNETWORKS_UNEXPECTED_NULL;
1790 }
1791
Michael Butlerf675ffa2021-04-19 14:35:35 -07001792 const Device* d = reinterpret_cast<const Device*>(device);
1793 *vendorExtensionCount = d->getSupportedExtensions().size();
1794 return ANEURALNETWORKS_NO_ERROR;
Michael Butler9e59b9a2021-04-19 00:13:20 -07001795}
1796
1797int SL_ANeuralNetworksDevice_getVendorExtensionName(const ANeuralNetworksDevice* device,
1798 uint32_t vendorExtensionIndex,
1799 const char** extensionName) {
1800 if (extensionName) *extensionName = nullptr;
1801
1802 if (device == nullptr || extensionName == nullptr) {
1803 LOG(ERROR) << "SL_ANeuralNetworksDevice_getVendorExtensionName passed a nullptr";
1804 return ANEURALNETWORKS_UNEXPECTED_NULL;
1805 }
1806
1807 const Device* d = reinterpret_cast<const Device*>(device);
1808 const auto& extensions = d->getSupportedExtensions();
1809
1810 if (vendorExtensionIndex >= extensions.size()) {
1811 LOG(ERROR)
1812 << "SL_ANeuralNetworksDevice_getVendorExtensionName passed a vendorExtensionIndex "
1813 "that is out of range";
1814 return ANEURALNETWORKS_BAD_DATA;
1815 }
Michael Butlerf675ffa2021-04-19 14:35:35 -07001816 const auto& extension = extensions[vendorExtensionIndex];
Michael Butler9e59b9a2021-04-19 00:13:20 -07001817
Michael Butlerf675ffa2021-04-19 14:35:35 -07001818 *extensionName = extension.name.c_str();
1819 return ANEURALNETWORKS_NO_ERROR;
Michael Butler9e59b9a2021-04-19 00:13:20 -07001820}
1821
1822int SL_ANeuralNetworksDevice_forEachVendorExtensionOperandTypeInformation(
1823 const ANeuralNetworksDevice* device, uint32_t vendorExtensionIndex, void* context,
1824 void (*callback)(SL_ANeuralNetworksExtensionOperandTypeInformation, void*)) {
1825 if (device == nullptr || context == nullptr || callback == nullptr) {
1826 LOG(ERROR)
1827 << "SL_ANeuralNetworksDevice_forEachVendorExtensionOperandTypeInformation passed a "
1828 "nullptr";
1829 return ANEURALNETWORKS_UNEXPECTED_NULL;
1830 }
1831
1832 const Device* d = reinterpret_cast<const Device*>(device);
1833 const auto& extensions = d->getSupportedExtensions();
1834
1835 if (vendorExtensionIndex >= extensions.size()) {
1836 LOG(ERROR)
1837 << "SL_ANeuralNetworksDevice_forEachVendorExtensionOperandTypeInformation passed a "
1838 "vendorExtensionIndex that is out of range";
1839 return ANEURALNETWORKS_BAD_DATA;
1840 }
Michael Butlerf675ffa2021-04-19 14:35:35 -07001841 const auto& operandTypes = extensions[vendorExtensionIndex].operandTypes;
Michael Butler9e59b9a2021-04-19 00:13:20 -07001842
Michael Butlerf675ffa2021-04-19 14:35:35 -07001843 constexpr auto conv = [](const Extension::OperandTypeInformation& operandTypeInfo) {
1844 return SL_ANeuralNetworksExtensionOperandTypeInformation{
1845 .byteSize = operandTypeInfo.byteSize,
1846 .type = operandTypeInfo.type,
1847 .isTensor = operandTypeInfo.isTensor,
1848 };
1849 };
1850
1851 for (const auto& operandTypeInfo : operandTypes) {
1852 const SL_ANeuralNetworksExtensionOperandTypeInformation opTypeInfo = conv(operandTypeInfo);
1853 callback(opTypeInfo, context);
1854 }
1855 return ANEURALNETWORKS_NO_ERROR;
Michael Butler9e59b9a2021-04-19 00:13:20 -07001856}
1857
Przemysław Szczepaniaka7e069f2021-03-17 14:07:40 +00001858#define NNCL_FUNC(symbol) .symbol = symbol
1859
1860NnApiSLDriverImplFL5 slDriverImpl{
1861 .base{.implFeatureLevel = ANEURALNETWORKS_FEATURE_LEVEL_5},
1862 NNCL_FUNC(ANeuralNetworksBurst_create),
1863 NNCL_FUNC(ANeuralNetworksBurst_free),
1864 NNCL_FUNC(ANeuralNetworksCompilation_createForDevices),
1865 NNCL_FUNC(ANeuralNetworksCompilation_finish),
1866 NNCL_FUNC(ANeuralNetworksCompilation_free),
1867 NNCL_FUNC(ANeuralNetworksCompilation_getPreferredMemoryAlignmentForInput),
1868 NNCL_FUNC(ANeuralNetworksCompilation_getPreferredMemoryAlignmentForOutput),
1869 NNCL_FUNC(ANeuralNetworksCompilation_getPreferredMemoryPaddingForInput),
1870 NNCL_FUNC(ANeuralNetworksCompilation_getPreferredMemoryPaddingForOutput),
1871 NNCL_FUNC(ANeuralNetworksCompilation_setCaching),
1872 NNCL_FUNC(ANeuralNetworksCompilation_setPreference),
1873 NNCL_FUNC(ANeuralNetworksCompilation_setPriority),
1874 NNCL_FUNC(ANeuralNetworksCompilation_setTimeout),
1875 NNCL_FUNC(ANeuralNetworksDevice_getExtensionSupport),
Lev Proleev5dfac862021-05-06 13:00:21 +01001876 NNCL_FUNC(ANeuralNetworksDevice_getFeatureLevel),
Przemysław Szczepaniaka7e069f2021-03-17 14:07:40 +00001877 NNCL_FUNC(ANeuralNetworksDevice_getName),
1878 NNCL_FUNC(ANeuralNetworksDevice_getType),
1879 NNCL_FUNC(ANeuralNetworksDevice_getVersion),
1880 NNCL_FUNC(ANeuralNetworksDevice_wait),
1881 NNCL_FUNC(ANeuralNetworksEvent_createFromSyncFenceFd),
1882 NNCL_FUNC(ANeuralNetworksEvent_free),
1883 NNCL_FUNC(ANeuralNetworksEvent_getSyncFenceFd),
1884 NNCL_FUNC(ANeuralNetworksEvent_wait),
1885 NNCL_FUNC(ANeuralNetworksExecution_burstCompute),
1886 NNCL_FUNC(ANeuralNetworksExecution_compute),
1887 NNCL_FUNC(ANeuralNetworksExecution_create),
1888 NNCL_FUNC(ANeuralNetworksExecution_enableInputAndOutputPadding),
1889 NNCL_FUNC(ANeuralNetworksExecution_free),
1890 NNCL_FUNC(ANeuralNetworksExecution_getDuration),
1891 NNCL_FUNC(ANeuralNetworksExecution_getOutputOperandDimensions),
1892 NNCL_FUNC(ANeuralNetworksExecution_getOutputOperandRank),
1893 NNCL_FUNC(ANeuralNetworksExecution_setInput),
1894 NNCL_FUNC(ANeuralNetworksExecution_setInputFromMemory),
1895 NNCL_FUNC(ANeuralNetworksExecution_setLoopTimeout),
1896 NNCL_FUNC(ANeuralNetworksExecution_setMeasureTiming),
1897 NNCL_FUNC(ANeuralNetworksExecution_setOutput),
1898 NNCL_FUNC(ANeuralNetworksExecution_setOutputFromMemory),
1899 NNCL_FUNC(ANeuralNetworksExecution_setReusable),
1900 NNCL_FUNC(ANeuralNetworksExecution_setTimeout),
1901 NNCL_FUNC(ANeuralNetworksExecution_startComputeWithDependencies),
1902 NNCL_FUNC(ANeuralNetworksMemoryDesc_addInputRole),
1903 NNCL_FUNC(ANeuralNetworksMemoryDesc_addOutputRole),
1904 NNCL_FUNC(ANeuralNetworksMemoryDesc_create),
1905 NNCL_FUNC(ANeuralNetworksMemoryDesc_finish),
1906 NNCL_FUNC(ANeuralNetworksMemoryDesc_free),
1907 NNCL_FUNC(ANeuralNetworksMemoryDesc_setDimensions),
1908 NNCL_FUNC(ANeuralNetworksMemory_copy),
1909 NNCL_FUNC(ANeuralNetworksMemory_createFromAHardwareBuffer),
1910 NNCL_FUNC(ANeuralNetworksMemory_createFromDesc),
1911 NNCL_FUNC(ANeuralNetworksMemory_createFromFd),
1912 NNCL_FUNC(ANeuralNetworksMemory_free),
1913 NNCL_FUNC(ANeuralNetworksModel_addOperand),
1914 NNCL_FUNC(ANeuralNetworksModel_addOperation),
1915 NNCL_FUNC(ANeuralNetworksModel_create),
1916 NNCL_FUNC(ANeuralNetworksModel_finish),
1917 NNCL_FUNC(ANeuralNetworksModel_free),
1918 NNCL_FUNC(ANeuralNetworksModel_getExtensionOperandType),
1919 NNCL_FUNC(ANeuralNetworksModel_getExtensionOperationType),
1920 NNCL_FUNC(ANeuralNetworksModel_getSupportedOperationsForDevices),
1921 NNCL_FUNC(ANeuralNetworksModel_identifyInputsAndOutputs),
1922 NNCL_FUNC(ANeuralNetworksModel_relaxComputationFloat32toFloat16),
1923 NNCL_FUNC(ANeuralNetworksModel_setOperandExtensionData),
1924 NNCL_FUNC(ANeuralNetworksModel_setOperandSymmPerChannelQuantParams),
1925 NNCL_FUNC(ANeuralNetworksModel_setOperandValue),
1926 NNCL_FUNC(ANeuralNetworksModel_setOperandValueFromMemory),
1927 NNCL_FUNC(ANeuralNetworksModel_setOperandValueFromModel),
1928 NNCL_FUNC(ANeuralNetworks_getDefaultLoopTimeout),
1929 NNCL_FUNC(ANeuralNetworks_getDevice),
1930 NNCL_FUNC(ANeuralNetworks_getDeviceCount),
1931 NNCL_FUNC(ANeuralNetworks_getMaximumLoopTimeout),
1932 NNCL_FUNC(ANeuralNetworks_getRuntimeFeatureLevel),
Michael Butler9e59b9a2021-04-19 00:13:20 -07001933 NNCL_FUNC(SL_ANeuralNetworksCompilation_setCachingFromFds),
1934 NNCL_FUNC(SL_ANeuralNetworksDevice_getNumberOfCacheFilesNeeded),
1935 NNCL_FUNC(SL_ANeuralNetworksDevice_getPerformanceInfo),
1936 NNCL_FUNC(SL_ANeuralNetworksDevice_forEachOperandPerformanceInfo),
1937 NNCL_FUNC(SL_ANeuralNetworksDevice_getVendorExtensionCount),
1938 NNCL_FUNC(SL_ANeuralNetworksDevice_getVendorExtensionName),
1939 NNCL_FUNC(SL_ANeuralNetworksDevice_forEachVendorExtensionOperandTypeInformation),
Przemysław Szczepaniaka7e069f2021-03-17 14:07:40 +00001940};
1941
1942#undef NNCL_FUNC
1943
1944__BEGIN_DECLS
1945NnApiSLDriverImpl* ANeuralNetworks_getSLDriverImpl() {
1946 return reinterpret_cast<NnApiSLDriverImpl*>(&slDriverImpl);
1947}
1948__END_DECLS
1949
1950#endif // NN_COMPATIBILITY_LIBRARY_BUILD