blob: 193b2af7a24e9f0a853e965b3dc8ac77a1718890 [file] [log] [blame]
Eric Kunzee5e26762020-10-13 16:11:07 -07001
Kevin Cheng3a478572021-01-22 17:21:02 -08002// Copyright (c) 2020-2021, ARM Limited.
Eric Kunzee5e26762020-10-13 16:11:07 -07003//
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#include "op_factory.h"
17#include "activation_funcs.h"
18#include "comparison.h"
19#include "control_flow.h"
20#include "custom.h"
21#include "data_layout.h"
22#include "data_nodes.h"
23#include "ewise_binary.h"
24#include "ewise_ternary.h"
25#include "ewise_unary.h"
26#include "image.h"
27#include "reduction.h"
28#include "scatter_gather.h"
29#include "tensor_ops.h"
30#include "type_conversion.h"
31
32using namespace TosaReference;
33using namespace tosa;
34
Kevin Chengacb550f2021-06-29 15:32:19 -070035GraphNode* OpFactory::newOp(SubgraphTraverser* sgt,
36 TosaSerializationHandler* tsh,
Eric Kunzee5e26762020-10-13 16:11:07 -070037 Op opType,
38 TosaAttributeBase* attribute,
39 TosaQuantInfoBase* qinfo,
40 uint64_t id,
41 DType inputDType,
42 int inputRank,
43 DType outputDType,
44 int outputRank,
45 DType weightDType,
46 int weightRank)
47{
48 switch (opType)
49 {
50 // tensor_ops
51 case Op_ARGMAX:
52 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpArgMax, FLOAT);
Kevin Cheng3a478572021-01-22 17:21:02 -080053 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpArgMax, INT8);
Eric Kunzee5e26762020-10-13 16:11:07 -070054 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpArgMax, INT16);
55 break;
56 case Op_AVG_POOL2D:
57 DEF_FACTORY_ONE_TYPE(OpAvgPool2d, FLOAT);
Kevin Cheng3a478572021-01-22 17:21:02 -080058 DEF_FACTORY_ONE_TYPE(OpAvgPool2d, INT8);
Eric Kunzee5e26762020-10-13 16:11:07 -070059 DEF_FACTORY_ONE_TYPE(OpAvgPool2d, INT16);
60 break;
61 case Op_CONV2D:
62 DEF_FACTORY_TWO_TYPE(OpConv2d, FLOAT, FLOAT);
Kevin Cheng3a478572021-01-22 17:21:02 -080063 DEF_FACTORY_TWO_TYPE(OpConv2d, INT8, INT4);
64 DEF_FACTORY_TWO_TYPE(OpConv2d, INT8, INT8);
Eric Kunzee5e26762020-10-13 16:11:07 -070065 DEF_FACTORY_TWO_TYPE(OpConv2d, INT16, INT8);
66 break;
67 case Op_DEPTHWISE_CONV2D:
68 DEF_FACTORY_TWO_TYPE(OpDepthwiseConv2d, FLOAT, FLOAT);
Kevin Cheng3a478572021-01-22 17:21:02 -080069 DEF_FACTORY_TWO_TYPE(OpDepthwiseConv2d, INT8, INT4);
70 DEF_FACTORY_TWO_TYPE(OpDepthwiseConv2d, INT8, INT8);
Eric Kunzee5e26762020-10-13 16:11:07 -070071 DEF_FACTORY_TWO_TYPE(OpDepthwiseConv2d, INT16, INT8);
72 break;
73 case Op_FULLY_CONNECTED:
74 DEF_FACTORY_TWO_TYPE(OpFullyConnected, FLOAT, FLOAT);
Kevin Cheng3a478572021-01-22 17:21:02 -080075 DEF_FACTORY_TWO_TYPE(OpFullyConnected, INT8, INT4);
76 DEF_FACTORY_TWO_TYPE(OpFullyConnected, INT8, INT8);
Eric Kunzee5e26762020-10-13 16:11:07 -070077 DEF_FACTORY_TWO_TYPE(OpFullyConnected, INT16, INT8);
78 break;
79 case Op_MATMUL:
80 DEF_FACTORY_ONE_TYPE(OpMatMul, FLOAT);
Kevin Cheng3a478572021-01-22 17:21:02 -080081 DEF_FACTORY_ONE_TYPE(OpMatMul, INT8);
Eric Kunzee5e26762020-10-13 16:11:07 -070082 DEF_FACTORY_ONE_TYPE(OpMatMul, INT16);
83 break;
84 case Op_MAX_POOL2D:
85 DEF_FACTORY_ONE_TYPE(OpMaxPool2d, FLOAT);
Kevin Cheng3a478572021-01-22 17:21:02 -080086 DEF_FACTORY_ONE_TYPE(OpMaxPool2d, INT8);
Eric Kunzee5e26762020-10-13 16:11:07 -070087 DEF_FACTORY_ONE_TYPE(OpMaxPool2d, INT16);
88 break;
89 case Op_TRANSPOSE_CONV2D:
90 DEF_FACTORY_TWO_TYPE(OpTransposeConv2d, FLOAT, FLOAT);
Kevin Cheng3a478572021-01-22 17:21:02 -080091 DEF_FACTORY_TWO_TYPE(OpTransposeConv2d, INT8, INT4);
92 DEF_FACTORY_TWO_TYPE(OpTransposeConv2d, INT8, INT8);
Eric Kunzee5e26762020-10-13 16:11:07 -070093 DEF_FACTORY_TWO_TYPE(OpTransposeConv2d, INT16, INT8);
94 break;
95
96 // activation_funcs
97 case Op_CLAMP:
98 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpClamp, FLOAT);
Kevin Cheng3a478572021-01-22 17:21:02 -080099 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpClamp, INT8);
Eric Kunzee5e26762020-10-13 16:11:07 -0700100 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpClamp, INT16);
101 break;
102 case Op_RELUN:
103 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpReluN, FLOAT);
104 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpReluN, INT32);
105 break;
106 case Op_SIGMOID:
107 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSigmoid, FLOAT);
108 break;
109 case Op_TANH:
110 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTanh, FLOAT);
111 break;
112
113 // ewise_binary
114 case Op_ADD:
115 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpAdd, FLOAT);
116 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpAdd, INT32);
117 break;
118 case Op_ARITHMETIC_RIGHT_SHIFT:
119 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpArithmeticRightShift, INT8);
120 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpArithmeticRightShift, INT16);
121 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpArithmeticRightShift, INT32);
122 break;
123 case Op_BITWISE_AND:
Kevin Cheng3a478572021-01-22 17:21:02 -0800124 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseAnd, INT8);
Eric Kunzee5e26762020-10-13 16:11:07 -0700125 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseAnd, INT16);
126 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseAnd, INT32);
127 break;
128 case Op_BITWISE_OR:
Kevin Cheng3a478572021-01-22 17:21:02 -0800129 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseOr, INT8);
Eric Kunzee5e26762020-10-13 16:11:07 -0700130 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseOr, INT16);
131 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseOr, INT32);
132 break;
133 case Op_BITWISE_XOR:
Kevin Cheng3a478572021-01-22 17:21:02 -0800134 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseXor, INT8);
Eric Kunzee5e26762020-10-13 16:11:07 -0700135 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseXor, INT16);
136 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseXor, INT32);
137 break;
Matthew Haddon459443c2021-08-23 16:43:13 +0100138 case Op_INTDIV:
139 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpIntdiv, INT32);
Kevin Cheng14d7f7a2021-05-12 10:44:49 -0700140 break;
Eric Kunzee5e26762020-10-13 16:11:07 -0700141 case Op_LOGICAL_AND:
142 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalAnd, BOOL);
143 break;
144 case Op_LOGICAL_LEFT_SHIFT:
145 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalLeftShift, INT8);
146 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalLeftShift, INT16);
147 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalLeftShift, INT32);
148 break;
149 case Op_LOGICAL_RIGHT_SHIFT:
150 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalRightShift, INT8);
151 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalRightShift, INT16);
152 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalRightShift, INT32);
153 break;
154 case Op_LOGICAL_OR:
155 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalOr, BOOL);
156 break;
157 case Op_LOGICAL_XOR:
158 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalOr, BOOL);
159 break;
160 case Op_MAXIMUM:
161 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpMaximum, FLOAT);
162 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpMaximum, INT32);
163 break;
164 case Op_MINIMUM:
165 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpMinimum, FLOAT);
166 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpMinimum, INT32);
167 break;
168 case Op_MUL:
169 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpMul, FLOAT, FLOAT);
170 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpMul, INT8, INT32);
171 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpMul, INT16, INT32);
172 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpMul, INT32, INT32);
173 break;
174 case Op_POW:
175 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpPow, FLOAT);
176 break;
177 case Op_SUB:
178 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSub, FLOAT);
179 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSub, INT32);
180 break;
181 case Op_TABLE:
Kevin Cheng571f7182021-05-24 17:20:01 -0700182 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTable, INT8);
183 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTable, INT16);
Eric Kunzee5e26762020-10-13 16:11:07 -0700184 break;
185
186 // ewise_unary
187 case Op_ABS:
188 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpAbs, FLOAT);
189 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpAbs, INT32);
190 break;
191 case Op_BITWISE_NOT:
Kevin Cheng3a478572021-01-22 17:21:02 -0800192 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseNot, INT8);
Eric Kunzee5e26762020-10-13 16:11:07 -0700193 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseNot, INT16);
194 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpBitwiseNot, INT32);
195 break;
196 case Op_CEIL:
197 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpCeil, FLOAT);
198 break;
199 case Op_CLZ:
200 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpClz, INT32);
201 break;
202 case Op_EXP:
203 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpExp, FLOAT);
204 break;
205 case Op_FLOOR:
206 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpFloor, FLOAT);
207 break;
208 case Op_LOG:
209 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLog, FLOAT);
210 break;
211 case Op_LOGICAL_NOT:
212 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpLogicalNot, BOOL);
213 break;
214 case Op_NEGATE:
215 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpNegate, FLOAT);
Kevin Cheng3a478572021-01-22 17:21:02 -0800216 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpNegate, INT8);
Eric Kunzee5e26762020-10-13 16:11:07 -0700217 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpNegate, INT16);
218 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpNegate, INT32);
219 break;
220 case Op_RECIPROCAL:
221 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpReciprocal, FLOAT);
222 break;
223 case Op_RSQRT:
224 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpRsqrt, FLOAT);
225 break;
226
227 // ewise_ternary
228 case Op_SELECT:
229 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSelect, FLOAT);
Eric Kunzee5e26762020-10-13 16:11:07 -0700230 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSelect, INT8);
231 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSelect, INT16);
232 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSelect, INT32);
233 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSelect, BOOL);
234 break;
235
236 // comparison
237 case Op_EQUAL:
238 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpEqual, FLOAT);
239 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpEqual, INT32);
240 break;
241 case Op_GREATER:
242 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpGreater, FLOAT);
243 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpGreater, INT32);
244 break;
245 case Op_GREATER_EQUAL:
246 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpGreaterEqual, FLOAT);
247 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpGreaterEqual, INT32);
248 break;
249
250 // reduction
251 case Op_REDUCE_ALL:
252 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceAll, BOOL);
253 break;
254 case Op_REDUCE_ANY:
255 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceAny, BOOL);
256 break;
257 case Op_REDUCE_MAX:
258 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceMax, FLOAT);
Kevin Cheng3a478572021-01-22 17:21:02 -0800259 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceMax, INT8);
Eric Kunzee5e26762020-10-13 16:11:07 -0700260 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceMax, INT16);
261 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceMax, INT32);
262 break;
263 case Op_REDUCE_MIN:
264 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceMin, FLOAT);
Kevin Cheng3a478572021-01-22 17:21:02 -0800265 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceMin, INT8);
Eric Kunzee5e26762020-10-13 16:11:07 -0700266 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceMin, INT16);
267 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceMin, INT32);
268 break;
269 case Op_REDUCE_PRODUCT:
270 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceProduct, FLOAT);
271 break;
272 case Op_REDUCE_SUM:
273 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceSum, FLOAT);
274 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReduceSum, INT32);
275 break;
276
277 // data layout
278 case Op_CONCAT:
279 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpConcat, FLOAT);
Eric Kunzee5e26762020-10-13 16:11:07 -0700280 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpConcat, INT8);
281 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpConcat, INT16);
282 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpConcat, INT32);
283 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpConcat, BOOL);
284 break;
285 case Op_PAD:
286 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpPad, FLOAT);
287 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpPad, INT32);
Eric Kunzee5e26762020-10-13 16:11:07 -0700288 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpPad, INT8);
289 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpPad, INT16);
290 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpPad, BOOL);
291 break;
292 case Op_RESHAPE:
293 DEF_FACTORY_RESHAPE(OpReshape, FLOAT);
Eric Kunzee5e26762020-10-13 16:11:07 -0700294 DEF_FACTORY_RESHAPE(OpReshape, INT8);
295 DEF_FACTORY_RESHAPE(OpReshape, INT16);
296 DEF_FACTORY_RESHAPE(OpReshape, INT32);
297 DEF_FACTORY_RESHAPE(OpReshape, BOOL);
298 break;
299 case Op_REVERSE:
300 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReverse, FLOAT);
Eric Kunzee5e26762020-10-13 16:11:07 -0700301 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReverse, INT8);
302 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReverse, INT16);
303 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReverse, INT32);
304 DEF_FACTORY_RANK1_6_ONE_RANK_ONE_TYPE(OpReverse, BOOL);
305 break;
306 case Op_SLICE:
307 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSlice, FLOAT);
Eric Kunzee5e26762020-10-13 16:11:07 -0700308 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSlice, INT8);
309 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSlice, INT16);
310 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSlice, INT32);
311 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpSlice, BOOL);
312 break;
313 case Op_TILE:
314 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTile, FLOAT);
Eric Kunzee5e26762020-10-13 16:11:07 -0700315 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTile, INT8);
316 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTile, INT16);
317 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTile, INT32);
318 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTile, BOOL);
319 break;
320 case Op_TRANSPOSE:
321 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTranspose, BOOL);
322 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTranspose, FLOAT);
Eric Kunzee5e26762020-10-13 16:11:07 -0700323 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTranspose, INT8);
324 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTranspose, INT16);
325 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpTranspose, INT32);
326 break;
327
328 // scatter_gather
329 case Op_GATHER:
Kevin Cheng3a478572021-01-22 17:21:02 -0800330 DEF_FACTORY_ONE_TYPE(OpGather, INT8);
Kevin Cheng77d0f762020-11-24 10:26:32 -0800331 DEF_FACTORY_ONE_TYPE(OpGather, INT16);
332 DEF_FACTORY_ONE_TYPE(OpGather, INT32);
333 DEF_FACTORY_ONE_TYPE(OpGather, FLOAT);
334 break;
335 case Op_SCATTER:
Kevin Cheng3a478572021-01-22 17:21:02 -0800336 DEF_FACTORY_ONE_TYPE(OpScatter, INT8);
Kevin Cheng77d0f762020-11-24 10:26:32 -0800337 DEF_FACTORY_ONE_TYPE(OpScatter, INT16);
338 DEF_FACTORY_ONE_TYPE(OpScatter, INT32);
339 DEF_FACTORY_ONE_TYPE(OpScatter, FLOAT);
340 break;
Eric Kunzee5e26762020-10-13 16:11:07 -0700341
342 // image
343 case Op_RESIZE:
344 DEF_FACTORY_TWO_TYPE_RESIZE(OpResize, INT8, INT32);
345 DEF_FACTORY_TWO_TYPE_RESIZE(OpResize, INT8, INT8);
346 DEF_FACTORY_TWO_TYPE_RESIZE(OpResize, INT16, INT48);
347 DEF_FACTORY_TWO_TYPE_RESIZE(OpResize, INT16, INT16);
Kevin Cheng77d0f762020-11-24 10:26:32 -0800348 DEF_FACTORY_TWO_TYPE_RESIZE(OpResize, FLOAT, FLOAT);
Eric Kunzee5e26762020-10-13 16:11:07 -0700349 break;
350
351 // data_nodes
352 case Op_CONST:
Kevin Chengacb550f2021-06-29 15:32:19 -0700353 return new OpConst(sgt, id);
Eric Kunzee5e26762020-10-13 16:11:07 -0700354 case Op_IDENTITY:
355 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpIdentity, FLOAT);
356 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpIdentity, INT32);
Eric Kunzee5e26762020-10-13 16:11:07 -0700357 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpIdentity, INT8);
358 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpIdentity, INT16);
359 DEF_FACTORY_RANK0_6_ONE_RANK_ONE_TYPE(OpIdentity, BOOL);
360 break;
Eric Kunzee5e26762020-10-13 16:11:07 -0700361
362 // type_conversion
363 case Op_CAST:
364 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, BOOL, INT8);
365 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, BOOL, INT16);
366 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, BOOL, INT32);
367 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT8, BOOL);
368 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT8, INT16);
369 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT8, INT32);
370 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT8, FLOAT);
371 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT16, BOOL);
372 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT16, INT8);
373 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT16, INT32);
374 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT16, FLOAT);
375 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT32, BOOL);
376 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT32, INT8);
377 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT32, INT16);
378 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, INT32, FLOAT);
379 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, FLOAT, INT8);
380 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, FLOAT, INT16);
381 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpCast, FLOAT, INT32);
382 break;
383 case Op_RESCALE:
Kevin Cheng3a478572021-01-22 17:21:02 -0800384 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT8, INT8);
385 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT8, INT16);
386 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT8, INT32);
387 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT16, INT8);
Eric Kunzee5e26762020-10-13 16:11:07 -0700388 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT16, INT16);
389 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT16, INT32);
Kevin Cheng3a478572021-01-22 17:21:02 -0800390 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT32, INT8);
Eric Kunzee5e26762020-10-13 16:11:07 -0700391 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT32, INT16);
392 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT32, INT32);
Kevin Cheng3a478572021-01-22 17:21:02 -0800393 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT48, INT8);
Eric Kunzee5e26762020-10-13 16:11:07 -0700394 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT48, INT16);
395 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT48, INT32);
Kevin Cheng3a478572021-01-22 17:21:02 -0800396 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, UINT8, INT8);
397 DEF_FACTORY_RANK0_6_ONE_RANK_TWO_TYPE(OpRescale, INT8, UINT8);
Eric Kunzee5e26762020-10-13 16:11:07 -0700398 break;
399
400 // custom
401 case Op_CUSTOM:
Kevin Chengacb550f2021-06-29 15:32:19 -0700402 return new OpCustom(sgt, id);
Eric Kunzee5e26762020-10-13 16:11:07 -0700403
404 // control_flow
405 case Op_COND_IF:
Kevin Chengacb550f2021-06-29 15:32:19 -0700406 return new OpCondIf(sgt, tsh, attribute, id);
Eric Kunzee5e26762020-10-13 16:11:07 -0700407 case Op_WHILE_LOOP:
Kevin Chengacb550f2021-06-29 15:32:19 -0700408 return new OpWhileLoop(sgt, tsh, attribute, id);
Eric Kunzee5e26762020-10-13 16:11:07 -0700409
410 // Ops not recognized
411 default:
412 goto done;
413
414 } // End of switch(opType)
415
416done:
417 return nullptr;
418}