blob: 02e91c774d1e082aca67fd77439c36595a654b95 [file] [log] [blame]
erik.andersson@arm.com460c6892021-02-24 14:38:09 +01001# Copyright (C) 2020-2021 Arm Limited or its affiliates. All rights reserved.
Tim Hall79d07d22020-04-27 18:20:16 +01002#
3# SPDX-License-Identifier: Apache-2.0
4#
5# Licensed under the Apache License, Version 2.0 (the License); you may
6# not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an AS IS BASIS, WITHOUT
13# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
Tim Hall79d07d22020-04-27 18:20:16 +010016# Description:
17# TensorFlow Lite mapping functions used by both reader and writer.
18# Contains a mapping from the various TensorFlow Lite enums and options structs, generated by the FlatBuffer code
19# generator, to Vela's internal format.
Tim Hall79d07d22020-04-27 18:20:16 +010020import struct
21
Diego Russoea6111a2020-04-14 18:41:58 +010022import numpy as np
23
Tim Hall79d07d22020-04-27 18:20:16 +010024from .data_type import DataType
Louis Verhaardaee5d752020-09-30 09:01:52 +020025from .operation import CustomType
26from .operation import Op
Michael McGeagh16895482020-12-14 15:51:20 +000027from .operation import Padding as opPad
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +020028from .operation import TensorIndices
Diego Russoe8a10452020-04-21 17:39:10 +010029from .tflite import AbsOptions
30from .tflite import AddNOptions
Tim Hall79d07d22020-04-27 18:20:16 +010031from .tflite import AddOptions
Tim Hall79d07d22020-04-27 18:20:16 +010032from .tflite import ArgMaxOptions
Tim Hall79d07d22020-04-27 18:20:16 +010033from .tflite import ArgMinOptions
Jacob Bohlin8daf6b72020-09-15 16:28:35 +020034from .tflite import BatchMatMulOptions
Diego Russoe8a10452020-04-21 17:39:10 +010035from .tflite import BatchToSpaceNDOptions
Tim Hall79d07d22020-04-27 18:20:16 +010036from .tflite import BidirectionalSequenceLSTMOptions
37from .tflite import BidirectionalSequenceRNNOptions
Dwight Lidman8a12da12021-07-19 13:43:05 +020038from .tflite import BroadcastToOptions
39from .tflite import CallOnceOptions
Diego Russoe8a10452020-04-21 17:39:10 +010040from .tflite import CallOptions
41from .tflite import CastOptions
42from .tflite import ConcatEmbeddingsOptions
43from .tflite import ConcatenationOptions
44from .tflite import Conv2DOptions
Dwight Lidman8a12da12021-07-19 13:43:05 +020045from .tflite import Conv3DOptions
Tim Hall79d07d22020-04-27 18:20:16 +010046from .tflite import CosOptions
Tim Hall42abec12021-02-04 21:31:57 +000047from .tflite import CumsumOptions
Tim Hall79d07d22020-04-27 18:20:16 +010048from .tflite import DensifyOptions
49from .tflite import DepthToSpaceOptions
Diego Russoe8a10452020-04-21 17:39:10 +010050from .tflite import DepthwiseConv2DOptions
51from .tflite import DequantizeOptions
52from .tflite import DivOptions
53from .tflite import EmbeddingLookupSparseOptions
54from .tflite import EqualOptions
55from .tflite import ExpandDimsOptions
56from .tflite import ExpOptions
57from .tflite import FakeQuantOptions
58from .tflite import FillOptions
59from .tflite import FloorDivOptions
60from .tflite import FloorModOptions
61from .tflite import FullyConnectedOptions
62from .tflite import GatherNdOptions
63from .tflite import GatherOptions
64from .tflite import GreaterEqualOptions
65from .tflite import GreaterOptions
Louis Verhaard678645b2020-06-15 15:22:47 +020066from .tflite import HardSwishOptions
Dwight Lidman8a12da12021-07-19 13:43:05 +020067from .tflite import HashtableFindOptions
68from .tflite import HashtableImportOptions
69from .tflite import HashtableOptions
70from .tflite import HashtableSizeOptions
Tim Hall79d07d22020-04-27 18:20:16 +010071from .tflite import IfOptions
Diego Russoe8a10452020-04-21 17:39:10 +010072from .tflite import L2NormOptions
73from .tflite import LeakyReluOptions
74from .tflite import LessEqualOptions
75from .tflite import LessOptions
76from .tflite import LocalResponseNormalizationOptions
77from .tflite import LogicalAndOptions
78from .tflite import LogicalNotOptions
79from .tflite import LogicalOrOptions
80from .tflite import LogSoftmaxOptions
81from .tflite import LSHProjectionOptions
82from .tflite import LSTMOptions
83from .tflite import MatrixDiagOptions
84from .tflite import MatrixSetDiagOptions
85from .tflite import MaximumMinimumOptions
86from .tflite import MirrorPadOptions
87from .tflite import MulOptions
88from .tflite import NegOptions
Tim Hall79d07d22020-04-27 18:20:16 +010089from .tflite import NonMaxSuppressionV4Options
90from .tflite import NonMaxSuppressionV5Options
Diego Russoe8a10452020-04-21 17:39:10 +010091from .tflite import NotEqualOptions
92from .tflite import OneHotOptions
93from .tflite import PackOptions
94from .tflite import PadOptions
95from .tflite import PadV2Options
96from .tflite import Pool2DOptions
97from .tflite import PowOptions
98from .tflite import QuantizeOptions
99from .tflite import RangeOptions
100from .tflite import RankOptions
101from .tflite import ReducerOptions
102from .tflite import ReshapeOptions
103from .tflite import ResizeBilinearOptions
104from .tflite import ResizeNearestNeighborOptions
105from .tflite import ReverseSequenceOptions
106from .tflite import ReverseV2Options
Dwight Lidman8a12da12021-07-19 13:43:05 +0200107from .tflite import Rfft2dOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100108from .tflite import RNNOptions
Tim Hall79d07d22020-04-27 18:20:16 +0100109from .tflite import ScatterNdOptions
110from .tflite import SegmentSumOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100111from .tflite import SelectOptions
Tim Hall79d07d22020-04-27 18:20:16 +0100112from .tflite import SelectV2Options
Diego Russoe8a10452020-04-21 17:39:10 +0100113from .tflite import SequenceRNNOptions
114from .tflite import ShapeOptions
115from .tflite import SkipGramOptions
116from .tflite import SliceOptions
117from .tflite import SoftmaxOptions
118from .tflite import SpaceToBatchNDOptions
119from .tflite import SpaceToDepthOptions
120from .tflite import SparseToDenseOptions
121from .tflite import SplitOptions
122from .tflite import SplitVOptions
123from .tflite import SquaredDifferenceOptions
124from .tflite import SquareOptions
125from .tflite import SqueezeOptions
126from .tflite import StridedSliceOptions
127from .tflite import SubOptions
128from .tflite import SVDFOptions
129from .tflite import TileOptions
130from .tflite import TopKV2Options
131from .tflite import TransposeConvOptions
132from .tflite import TransposeOptions
133from .tflite import UnidirectionalSequenceLSTMOptions
134from .tflite import UniqueOptions
135from .tflite import UnpackOptions
136from .tflite import WhereOptions
Tim Hall79d07d22020-04-27 18:20:16 +0100137from .tflite import WhileOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100138from .tflite import ZerosLikeOptions
139from .tflite.ActivationFunctionType import ActivationFunctionType
Diego Russoea6111a2020-04-14 18:41:58 +0100140from .tflite.BuiltinOperator import BuiltinOperator
141from .tflite.BuiltinOptions import BuiltinOptions
142from .tflite.Padding import Padding
Diego Russoe8a10452020-04-21 17:39:10 +0100143from .tflite.TensorType import TensorType
Tim Hall79d07d22020-04-27 18:20:16 +0100144
145
146def inverse_map(map):
147 return {v: k for k, v in map.items()}
148
149
150datatype_map = {
151 TensorType.UINT8: DataType.uint8,
152 TensorType.INT8: DataType.int8,
153 TensorType.INT16: DataType.int16,
154 TensorType.INT32: DataType.int32,
155 TensorType.INT64: DataType.int64,
156 TensorType.FLOAT16: DataType.float16,
157 TensorType.FLOAT32: DataType.float32,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200158 TensorType.FLOAT64: DataType.float64,
Tim Hall79d07d22020-04-27 18:20:16 +0100159 TensorType.STRING: DataType.string,
160 TensorType.BOOL: DataType.bool,
Jacob Bohlinf767b932020-08-13 15:32:45 +0200161 TensorType.COMPLEX64: DataType.complex64,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200162 TensorType.COMPLEX128: DataType.complex128,
Tim Hall79d07d22020-04-27 18:20:16 +0100163}
164
165datatype_inv_map = inverse_map(datatype_map)
166datatype_inv_map[DataType.quint8] = TensorType.UINT8
167
168datatype_inv_map[DataType.qint8] = TensorType.INT8
169datatype_inv_map[DataType.qint16] = TensorType.INT16
170datatype_inv_map[DataType.qint32] = TensorType.INT32
171
172
173datatype_map_numpy = {
174 TensorType.UINT8: np.uint8,
175 TensorType.INT8: np.int8,
176 TensorType.INT16: np.int16,
177 TensorType.INT32: np.int32,
178 TensorType.INT64: np.int64,
179 TensorType.FLOAT16: np.float16,
180 TensorType.FLOAT32: np.float32,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200181 TensorType.FLOAT64: np.float64,
Tim Hall79d07d22020-04-27 18:20:16 +0100182 TensorType.BOOL: np.bool,
Jacob Bohlinf767b932020-08-13 15:32:45 +0200183 TensorType.COMPLEX64: np.complex64,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200184 TensorType.COMPLEX128: np.complex128,
Louis Verhaardf4e12be2020-12-18 14:23:06 +0100185 TensorType.STRING: np.uint8,
Tim Hall79d07d22020-04-27 18:20:16 +0100186}
187
188
189builtin_options_map = {
190 BuiltinOptions.Conv2DOptions: Conv2DOptions.Conv2DOptions,
191 BuiltinOptions.DepthwiseConv2DOptions: DepthwiseConv2DOptions.DepthwiseConv2DOptions,
192 BuiltinOptions.ConcatEmbeddingsOptions: ConcatEmbeddingsOptions.ConcatEmbeddingsOptions,
193 BuiltinOptions.LSHProjectionOptions: LSHProjectionOptions.LSHProjectionOptions,
194 BuiltinOptions.Pool2DOptions: Pool2DOptions.Pool2DOptions,
195 BuiltinOptions.SVDFOptions: SVDFOptions.SVDFOptions,
196 BuiltinOptions.RNNOptions: RNNOptions.RNNOptions,
197 BuiltinOptions.FullyConnectedOptions: FullyConnectedOptions.FullyConnectedOptions,
198 BuiltinOptions.SoftmaxOptions: SoftmaxOptions.SoftmaxOptions,
199 BuiltinOptions.ConcatenationOptions: ConcatenationOptions.ConcatenationOptions,
200 BuiltinOptions.AddOptions: AddOptions.AddOptions,
201 BuiltinOptions.L2NormOptions: L2NormOptions.L2NormOptions,
202 BuiltinOptions.LocalResponseNormalizationOptions: LocalResponseNormalizationOptions.LocalResponseNormalizationOptions, # noqa: E501
203 BuiltinOptions.LSTMOptions: LSTMOptions.LSTMOptions,
204 BuiltinOptions.ResizeBilinearOptions: ResizeBilinearOptions.ResizeBilinearOptions,
205 BuiltinOptions.CallOptions: CallOptions.CallOptions,
206 BuiltinOptions.ReshapeOptions: ReshapeOptions.ReshapeOptions,
207 BuiltinOptions.SkipGramOptions: SkipGramOptions.SkipGramOptions,
208 BuiltinOptions.SpaceToDepthOptions: SpaceToDepthOptions.SpaceToDepthOptions,
209 BuiltinOptions.EmbeddingLookupSparseOptions: EmbeddingLookupSparseOptions.EmbeddingLookupSparseOptions,
210 BuiltinOptions.MulOptions: MulOptions.MulOptions,
211 BuiltinOptions.PadOptions: PadOptions.PadOptions,
212 BuiltinOptions.GatherOptions: GatherOptions.GatherOptions,
213 BuiltinOptions.BatchToSpaceNDOptions: BatchToSpaceNDOptions.BatchToSpaceNDOptions,
214 BuiltinOptions.SpaceToBatchNDOptions: SpaceToBatchNDOptions.SpaceToBatchNDOptions,
215 BuiltinOptions.TransposeOptions: TransposeOptions.TransposeOptions,
216 BuiltinOptions.ReducerOptions: ReducerOptions.ReducerOptions,
217 BuiltinOptions.SubOptions: SubOptions.SubOptions,
218 BuiltinOptions.DivOptions: DivOptions.DivOptions,
219 BuiltinOptions.SqueezeOptions: SqueezeOptions.SqueezeOptions,
220 BuiltinOptions.SequenceRNNOptions: SequenceRNNOptions.SequenceRNNOptions,
221 BuiltinOptions.StridedSliceOptions: StridedSliceOptions.StridedSliceOptions,
222 BuiltinOptions.ExpOptions: ExpOptions.ExpOptions,
223 BuiltinOptions.TopKV2Options: TopKV2Options.TopKV2Options,
224 BuiltinOptions.SplitOptions: SplitOptions.SplitOptions,
225 BuiltinOptions.LogSoftmaxOptions: LogSoftmaxOptions.LogSoftmaxOptions,
226 BuiltinOptions.CastOptions: CastOptions.CastOptions,
227 BuiltinOptions.DequantizeOptions: DequantizeOptions.DequantizeOptions,
228 BuiltinOptions.MaximumMinimumOptions: MaximumMinimumOptions.MaximumMinimumOptions,
229 BuiltinOptions.ArgMaxOptions: ArgMaxOptions.ArgMaxOptions,
230 BuiltinOptions.LessOptions: LessOptions.LessOptions,
231 BuiltinOptions.NegOptions: NegOptions.NegOptions,
232 BuiltinOptions.PadV2Options: PadV2Options.PadV2Options,
233 BuiltinOptions.GreaterOptions: GreaterOptions.GreaterOptions,
234 BuiltinOptions.GreaterEqualOptions: GreaterEqualOptions.GreaterEqualOptions,
235 BuiltinOptions.LessEqualOptions: LessEqualOptions.LessEqualOptions,
236 BuiltinOptions.SelectOptions: SelectOptions.SelectOptions,
237 BuiltinOptions.SliceOptions: SliceOptions.SliceOptions,
238 BuiltinOptions.TransposeConvOptions: TransposeConvOptions.TransposeConvOptions,
239 BuiltinOptions.SparseToDenseOptions: SparseToDenseOptions.SparseToDenseOptions,
240 BuiltinOptions.TileOptions: TileOptions.TileOptions,
241 BuiltinOptions.ExpandDimsOptions: ExpandDimsOptions.ExpandDimsOptions,
242 BuiltinOptions.EqualOptions: EqualOptions.EqualOptions,
243 BuiltinOptions.NotEqualOptions: NotEqualOptions.NotEqualOptions,
244 BuiltinOptions.ShapeOptions: ShapeOptions.ShapeOptions,
245 BuiltinOptions.PowOptions: PowOptions.PowOptions,
246 BuiltinOptions.ArgMinOptions: ArgMinOptions.ArgMinOptions,
247 BuiltinOptions.FakeQuantOptions: FakeQuantOptions.FakeQuantOptions,
248 BuiltinOptions.PackOptions: PackOptions.PackOptions,
249 BuiltinOptions.LogicalOrOptions: LogicalOrOptions.LogicalOrOptions,
250 BuiltinOptions.OneHotOptions: OneHotOptions.OneHotOptions,
251 BuiltinOptions.LogicalAndOptions: LogicalAndOptions.LogicalAndOptions,
252 BuiltinOptions.LogicalNotOptions: LogicalNotOptions.LogicalNotOptions,
253 BuiltinOptions.UnpackOptions: UnpackOptions.UnpackOptions,
254 BuiltinOptions.FloorDivOptions: FloorDivOptions.FloorDivOptions,
255 BuiltinOptions.SquareOptions: SquareOptions.SquareOptions,
256 BuiltinOptions.ZerosLikeOptions: ZerosLikeOptions.ZerosLikeOptions,
257 BuiltinOptions.FillOptions: FillOptions.FillOptions,
258 BuiltinOptions.BidirectionalSequenceLSTMOptions: BidirectionalSequenceLSTMOptions.BidirectionalSequenceLSTMOptions,
259 BuiltinOptions.BidirectionalSequenceRNNOptions: BidirectionalSequenceRNNOptions.BidirectionalSequenceRNNOptions,
260 BuiltinOptions.UnidirectionalSequenceLSTMOptions: UnidirectionalSequenceLSTMOptions.UnidirectionalSequenceLSTMOptions, # noqa: E501
261 BuiltinOptions.FloorModOptions: FloorModOptions.FloorModOptions,
262 BuiltinOptions.RangeOptions: RangeOptions.RangeOptions,
263 BuiltinOptions.ResizeNearestNeighborOptions: ResizeNearestNeighborOptions.ResizeNearestNeighborOptions,
264 BuiltinOptions.LeakyReluOptions: LeakyReluOptions.LeakyReluOptions,
265 BuiltinOptions.SquaredDifferenceOptions: SquaredDifferenceOptions.SquaredDifferenceOptions,
266 BuiltinOptions.MirrorPadOptions: MirrorPadOptions.MirrorPadOptions,
267 BuiltinOptions.AbsOptions: AbsOptions.AbsOptions,
268 BuiltinOptions.SplitVOptions: SplitVOptions.SplitVOptions,
269 BuiltinOptions.UniqueOptions: UniqueOptions.UniqueOptions,
270 BuiltinOptions.ReverseV2Options: ReverseV2Options.ReverseV2Options,
271 BuiltinOptions.AddNOptions: AddNOptions.AddNOptions,
272 BuiltinOptions.GatherNdOptions: GatherNdOptions.GatherNdOptions,
273 BuiltinOptions.CosOptions: CosOptions.CosOptions,
274 BuiltinOptions.WhereOptions: WhereOptions.WhereOptions,
275 BuiltinOptions.RankOptions: RankOptions.RankOptions,
276 BuiltinOptions.ReverseSequenceOptions: ReverseSequenceOptions.ReverseSequenceOptions,
277 BuiltinOptions.MatrixDiagOptions: MatrixDiagOptions.MatrixDiagOptions,
278 BuiltinOptions.QuantizeOptions: QuantizeOptions.QuantizeOptions,
279 BuiltinOptions.MatrixSetDiagOptions: MatrixSetDiagOptions.MatrixSetDiagOptions,
280 BuiltinOptions.DensifyOptions: DensifyOptions.DensifyOptions,
281 BuiltinOptions.DepthToSpaceOptions: DepthToSpaceOptions.DepthToSpaceOptions,
Louis Verhaard678645b2020-06-15 15:22:47 +0200282 BuiltinOptions.HardSwishOptions: HardSwishOptions.HardSwishOptions,
Tim Hall79d07d22020-04-27 18:20:16 +0100283 BuiltinOptions.IfOptions: IfOptions.IfOptions,
284 BuiltinOptions.NonMaxSuppressionV4Options: NonMaxSuppressionV4Options.NonMaxSuppressionV4Options,
285 BuiltinOptions.NonMaxSuppressionV5Options: NonMaxSuppressionV5Options.NonMaxSuppressionV5Options,
286 BuiltinOptions.ScatterNdOptions: ScatterNdOptions.ScatterNdOptions,
287 BuiltinOptions.SegmentSumOptions: SegmentSumOptions.SegmentSumOptions,
288 BuiltinOptions.SelectV2Options: SelectV2Options.SelectV2Options,
289 BuiltinOptions.WhileOptions: WhileOptions.WhileOptions,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200290 BuiltinOptions.BatchMatMulOptions: BatchMatMulOptions.BatchMatMulOptions,
Tim Hall42abec12021-02-04 21:31:57 +0000291 BuiltinOptions.CumsumOptions: CumsumOptions.CumsumOptions,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200292 BuiltinOptions.CallOnceOptions: CallOnceOptions.CallOnceOptions,
293 BuiltinOptions.BroadcastToOptions: BroadcastToOptions.BroadcastToOptions,
294 BuiltinOptions.Rfft2dOptions: Rfft2dOptions.Rfft2dOptions,
295 BuiltinOptions.Conv3DOptions: Conv3DOptions.Conv3DOptions,
296 BuiltinOptions.HashtableOptions: HashtableOptions.HashtableOptions,
297 BuiltinOptions.HashtableFindOptions: HashtableFindOptions.HashtableFindOptions,
298 BuiltinOptions.HashtableImportOptions: HashtableImportOptions.HashtableImportOptions,
299 BuiltinOptions.HashtableSizeOptions: HashtableSizeOptions.HashtableSizeOptions,
Tim Hall79d07d22020-04-27 18:20:16 +0100300}
301
302builtin_options_inv_map = inverse_map(builtin_options_map)
303
304
305def underscore_to_camel_case(s):
306 return "".join(x.title() for x in s.split("_"))
307
308
309def padding_deserialize(x):
310 return padding_map[x]
311
312
313def padding_serialize(builder, x):
314 return padding_inv_map[x]
315
316
317def activation_deserialize(x):
318 return activation_function_map[x]
319
320
321def activation_serialize(builder, x):
322 return activation_function_inv_map[x]
323
324
325def datatype_deserialize(x):
326 return datatype_map[x]
327
328
329def datatype_serialize(builder, x):
330 return datatype_inv_map[x]
331
332
333def identity(x):
334 return x
335
336
337def identity_serialize(builder, x):
338 return x
339
340
341def write_byte_vector(builder, v):
342 builder.StartVector(1, len(v), 1)
343 for e in v[::-1]:
344 builder.PrependByte(e)
345 return builder.EndVector(len(v))
346
347
348def write_int_vector(builder, v):
349 builder.StartVector(4, len(v), 4)
350 for e in v[::-1]:
351 builder.PrependInt32(e)
352 return builder.EndVector(len(v))
353
354
355class OptionsSerializer:
Michael McGeagh6f725262020-12-03 15:21:36 +0000356 def __init__(self, name, members=None):
Tim Hall79d07d22020-04-27 18:20:16 +0100357 self.name = name
358 self.module = globals()[self.name]
359 self.cls = getattr(self.module, self.name)
360 self.builtin_opt_type = builtin_options_inv_map[self.cls]
Tim Hall79d07d22020-04-27 18:20:16 +0100361 self.members = []
Michael McGeagh6f725262020-12-03 15:21:36 +0000362 if members is not None:
363 for mem in members:
364 deserialize = identity
365 serialize = identity_serialize
366 is_vector = False
367 if isinstance(mem, tuple):
368 if len(mem) == 3:
369 mem, deserialize, serialize = mem
370 elif len(mem) == 2:
371 mem, is_vector = mem
372 deserialize = tuple
373 serialize = write_int_vector
374 else:
375 assert 0
376 underscore_mem = mem
377 camelcase_mem = underscore_to_camel_case(mem)
378 self.members.append((underscore_mem, camelcase_mem, deserialize, serialize, is_vector))
Tim Hall79d07d22020-04-27 18:20:16 +0100379
Tim Hallc8310b12020-06-17 14:53:11 +0100380 def deserialize(self, op_data):
381 builtin_options = op_data.BuiltinOptions()
Tim Hall79d07d22020-04-27 18:20:16 +0100382 attrs = {}
Tim Hallc8310b12020-06-17 14:53:11 +0100383 if builtin_options:
Tim Hall79d07d22020-04-27 18:20:16 +0100384 tfattrs = self.cls()
Tim Hallc8310b12020-06-17 14:53:11 +0100385 tfattrs.Init(builtin_options.Bytes, builtin_options.Pos)
Tim Hall79d07d22020-04-27 18:20:16 +0100386 for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members:
387 fun = camelcase_mem
388 if is_vector:
389 fun += "AsNumpy"
390
Fredrik Svedberg4bb989b2020-11-16 15:32:25 +0100391 attr = getattr(tfattrs, fun)()
392 try:
393 attrs[underscore_mem] = deserialize(attr)
394 except TypeError:
395 print("Warning: {0} could not read attribute '{1}'.".format(self.name, underscore_mem))
396
Tim Hall79d07d22020-04-27 18:20:16 +0100397 return attrs
398
399 def serialize(self, builder, attrs):
400 ser_attrs = []
401 for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members:
402 a = serialize(builder, attrs[underscore_mem])
403 ser_attrs.append((camelcase_mem, a))
404
405 getattr(self.module, self.name + "Start")(builder)
406
407 for camelcase_mem, a in ser_attrs:
408 getattr(self.module, self.name + "Add" + camelcase_mem)(builder, a)
409
410 return getattr(self.module, self.name + "End")(builder), None
411
412
413class CustomOptionsSerializer:
Tim Hallc8310b12020-06-17 14:53:11 +0100414 CUSTOM_OPTIONS_NPU_OP = [0x01, 0x04, 0x01] # NpuOp=1, FlexbufferFormat.UINT8=4, byte length=1
415 CUSTOM_OPTIONS_FORMAT_DEFAULT = 0
416
Tim Hall79d07d22020-04-27 18:20:16 +0100417 def __init__(self):
Tim Hall79d07d22020-04-27 18:20:16 +0100418 self.custom_opt_format = 0
419
Tim Hallc8310b12020-06-17 14:53:11 +0100420 def deserialize(self, op_data):
Tim Hall79d07d22020-04-27 18:20:16 +0100421 attrs = {}
Tim Hallc8310b12020-06-17 14:53:11 +0100422 custom_options = op_data.CustomOptionsAsNumpy()
423 attrs["custom_options"] = custom_options
424 attrs["custom_options_format"] = op_data.CustomOptionsFormat()
425
426 if np.array_equal(custom_options, self.CUSTOM_OPTIONS_NPU_OP):
Louis Verhaardaee5d752020-09-30 09:01:52 +0200427 attrs["custom_type"] = CustomType.ExistingNpuOp
Tim Hallc8310b12020-06-17 14:53:11 +0100428
Tim Hall79d07d22020-04-27 18:20:16 +0100429 return attrs
430
431 def serialize(self, builder, attrs):
Louis Verhaardaee5d752020-09-30 09:01:52 +0200432 custom_type = attrs.get("custom_type", CustomType.ThirdPartyOp)
Tim Hallc8310b12020-06-17 14:53:11 +0100433 self.custom_opt_format = attrs.get("custom_options_format", self.CUSTOM_OPTIONS_FORMAT_DEFAULT)
Tim Hall79d07d22020-04-27 18:20:16 +0100434
435 # Set NPU op custom options for the TensorFlow Lite custom operator
Louis Verhaardaee5d752020-09-30 09:01:52 +0200436 if custom_type == CustomType.NpuOp:
Tim Hallc8310b12020-06-17 14:53:11 +0100437 custom_options = self.CUSTOM_OPTIONS_NPU_OP
438 else:
439 custom_options = attrs.get("custom_options", [])
Tim Hall79d07d22020-04-27 18:20:16 +0100440
Tim Hallc8310b12020-06-17 14:53:11 +0100441 custom_options_bytes = struct.pack("<{0}B".format(len(custom_options)), *custom_options)
442 custom_offset = write_byte_vector(builder, custom_options_bytes)
Tim Hall79d07d22020-04-27 18:20:16 +0100443
444 return None, custom_offset
445
446
447padding_map = {
Michael McGeagh16895482020-12-14 15:51:20 +0000448 Padding.SAME: opPad.SAME,
449 Padding.VALID: opPad.VALID,
Tim Hall79d07d22020-04-27 18:20:16 +0100450}
451
452padding_inv_map = inverse_map(padding_map)
453
454
455activation_function_map = {
456 ActivationFunctionType.NONE: None,
Louis Verhaardaee5d752020-09-30 09:01:52 +0200457 ActivationFunctionType.RELU: Op.Relu,
458 ActivationFunctionType.RELU_N1_TO_1: Op.ReluN1To1,
459 ActivationFunctionType.RELU6: Op.Relu6,
460 ActivationFunctionType.TANH: Op.Tanh,
461 ActivationFunctionType.SIGN_BIT: Op.SignBit,
Tim Hall79d07d22020-04-27 18:20:16 +0100462}
463
464activation_function_inv_map = inverse_map(activation_function_map)
465
466fused_act = ("fused_activation_function", activation_deserialize, activation_serialize)
467padding = ("padding", padding_deserialize, padding_serialize)
468
Tim Hall79d07d22020-04-27 18:20:16 +0100469is_int_vec = True
470
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200471TFLITE_NO_INDICES = TensorIndices([], [], [])
472TFLITE_IFM_INDICES = TensorIndices([0], [], [])
473TFLITE_IFM_WEIGHTS_INDICES = TensorIndices([0], [1], [])
474TFLITE_IFM_WEIGHTS_BIAS_INDICES = TensorIndices([0], [1], [2])
475TFLITE_IFM_IFM2_INDICES = TensorIndices([0, 1], [], [])
476TFLITE_CONV2D_BACKPROP_INDICES = TensorIndices([2], [1], [3])
477TFLITE_TRANSPOSE_CONV_INDICES = TensorIndices([0], [1], [3])
478TFLITE_CONCAT_INDICES = TensorIndices([1, 2], [], [])
479TFLITE_SPLIT_IFM_INDICES = TensorIndices([1], [], [])
480TFLITE_BLOCK_LSTM_INDICES = TensorIndices([3], [4], [])
481
Tim Hall79d07d22020-04-27 18:20:16 +0100482builtin_operator_map = {
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200483 BuiltinOperator.ADD: (
484 Op.Add,
485 OptionsSerializer("AddOptions", (fused_act, "pot_scale_int16")),
486 TFLITE_IFM_IFM2_INDICES,
487 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200488 BuiltinOperator.AVERAGE_POOL_2D: (
489 Op.AvgPool,
490 OptionsSerializer(
491 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
492 ),
493 TFLITE_IFM_INDICES,
494 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200495 BuiltinOperator.CONCATENATION: (
496 Op.ConcatTFLite,
497 OptionsSerializer("ConcatenationOptions", ("axis", fused_act)),
498 TFLITE_CONCAT_INDICES,
499 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200500 BuiltinOperator.CONV_2D: (
501 Op.Conv2DBias,
502 OptionsSerializer(
503 "Conv2DOptions", ("dilation_h_factor", "dilation_w_factor", fused_act, padding, "stride_h", "stride_w")
504 ),
505 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
506 ),
507 BuiltinOperator.DEPTHWISE_CONV_2D: (
508 Op.DepthwiseConv2DBias,
509 OptionsSerializer(
510 "DepthwiseConv2DOptions",
511 ("depth_multiplier", "dilation_h_factor", "dilation_w_factor", fused_act, padding, "stride_h", "stride_w"),
512 ),
513 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
514 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200515 BuiltinOperator.DEPTH_TO_SPACE: (
516 Op.DepthToSpace,
517 OptionsSerializer("DepthToSpaceOptions", ("block_size",)),
518 TFLITE_NO_INDICES,
519 ),
520 BuiltinOperator.DEQUANTIZE: (Op.Dequantize, OptionsSerializer("DequantizeOptions"), TFLITE_IFM_INDICES),
521 BuiltinOperator.EMBEDDING_LOOKUP: (Op.EmbeddingLookup, None, TFLITE_NO_INDICES),
522 BuiltinOperator.FLOOR: (Op.Floor, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100523 BuiltinOperator.FULLY_CONNECTED: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200524 Op.FullyConnected,
erik.andersson@arm.com0cbb1662021-02-22 15:47:07 +0100525 OptionsSerializer(
Dwight Lidman8a12da12021-07-19 13:43:05 +0200526 "FullyConnectedOptions", ("asymmetric_quantize_inputs", fused_act, "keep_num_dims", "weights_format")
erik.andersson@arm.com0cbb1662021-02-22 15:47:07 +0100527 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200528 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100529 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200530 BuiltinOperator.HASHTABLE_LOOKUP: (Op.HashtableLookup, None, TFLITE_NO_INDICES),
531 BuiltinOperator.L2_NORMALIZATION: (Op.L2Norm, OptionsSerializer("L2NormOptions", (fused_act,)), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200532 BuiltinOperator.L2_POOL_2D: (
533 Op.L2Pool2D,
534 OptionsSerializer(
535 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
536 ),
537 TFLITE_NO_INDICES,
538 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100539 BuiltinOperator.LOCAL_RESPONSE_NORMALIZATION: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200540 Op.LRN,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200541 OptionsSerializer("LocalResponseNormalizationOptions", ("alpha", "beta", "bias", "radius")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200542 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100543 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200544 BuiltinOperator.LOGISTIC: (Op.Sigmoid, None, TFLITE_IFM_INDICES),
545 BuiltinOperator.LSH_PROJECTION: (
546 Op.LSHProjection,
547 OptionsSerializer("LSHProjectionOptions", ("type",)),
548 TFLITE_NO_INDICES,
549 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200550 BuiltinOperator.LSTM: (
551 Op.Lstm,
552 OptionsSerializer(
553 "LSTMOptions", ("asymmetric_quantize_inputs", "cell_clip", fused_act, "kernel_type", "proj_clip")
554 ),
555 TFLITE_IFM_WEIGHTS_INDICES,
556 ),
557 BuiltinOperator.MAX_POOL_2D: (
558 Op.MaxPool,
559 OptionsSerializer(
560 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
561 ),
562 TFLITE_IFM_INDICES,
563 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200564 BuiltinOperator.MUL: (Op.Mul, OptionsSerializer("MulOptions", (fused_act,)), TFLITE_IFM_IFM2_INDICES),
565 BuiltinOperator.RELU: (Op.Relu, None, TFLITE_IFM_INDICES),
566 BuiltinOperator.RELU_N1_TO_1: (Op.ReluN1To1, None, TFLITE_IFM_INDICES),
567 BuiltinOperator.RELU6: (Op.Relu6, None, TFLITE_IFM_INDICES),
568 BuiltinOperator.RESHAPE: (
569 Op.Reshape,
Dwight Lidmancfb42622021-08-11 12:28:51 +0200570 OptionsSerializer("ReshapeOptions", (("new_shape", is_int_vec),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200571 TFLITE_IFM_INDICES,
572 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100573 BuiltinOperator.RESIZE_BILINEAR: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200574 Op.ResizeBilinear,
Tim Hall79d07d22020-04-27 18:20:16 +0100575 OptionsSerializer("ResizeBilinearOptions", ("align_corners", "half_pixel_centers")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200576 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100577 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200578 BuiltinOperator.RNN: (
579 Op.Rnn,
580 OptionsSerializer("RNNOptions", ("asymmetric_quantize_inputs", fused_act)),
581 TFLITE_IFM_WEIGHTS_INDICES,
582 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200583 BuiltinOperator.SOFTMAX: (Op.Softmax, OptionsSerializer("SoftmaxOptions", ("beta",)), TFLITE_IFM_INDICES),
584 BuiltinOperator.SPACE_TO_DEPTH: (
585 Op.SpaceToDepth,
586 OptionsSerializer("SpaceToDepthOptions", ("block_size",)),
587 TFLITE_NO_INDICES,
588 ),
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200589 BuiltinOperator.SVDF: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200590 Op.Svdf,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200591 OptionsSerializer("SVDFOptions", ("asymmetric_quantize_inputs", fused_act, "rank")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200592 TFLITE_NO_INDICES,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200593 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200594 BuiltinOperator.TANH: (Op.Tanh, None, TFLITE_IFM_INDICES),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200595 BuiltinOperator.CONCAT_EMBEDDINGS: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200596 Op.ConcatEmbeddings,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200597 OptionsSerializer(
598 "ConcatEmbeddingsOptions",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200599 (
Dwight Lidman8a12da12021-07-19 13:43:05 +0200600 "embedding_dim_per_channel",
601 "embedding_dim_per_channel_as_numpy",
602 "embedding_dim_per_channel_is_none",
603 "embedding_dim_per_channel_length",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200604 "num_channels",
605 "num_columns_per_channel",
606 "num_columns_per_channel_as_numpy",
Dwight Lidman8a12da12021-07-19 13:43:05 +0200607 "num_columns_per_channel_is_none",
608 "num_columns_per_channel_length",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200609 ),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200610 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200611 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200612 ),
613 BuiltinOperator.SKIP_GRAM: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200614 Op.SkipGram,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200615 OptionsSerializer("SkipGramOptions", ("include_all_ngrams", "max_skip_size", "ngram_size")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200616 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200617 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200618 BuiltinOperator.CALL: (Op.Call, OptionsSerializer("CallOptions", ("subgraph",)), TFLITE_NO_INDICES),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200619 BuiltinOperator.EMBEDDING_LOOKUP_SPARSE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200620 Op.EmbeddingLookupSparse,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200621 OptionsSerializer("EmbeddingLookupSparseOptions", ("combiner",)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200622 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200623 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200624 BuiltinOperator.PAD: (Op.Pad, OptionsSerializer("PadOptions"), TFLITE_IFM_INDICES),
625 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_RNN: (
626 Op.UnidirectionalSequenceRnn,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200627 OptionsSerializer("SequenceRNNOptions", ("asymmetric_quantize_inputs", fused_act, "time_major")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200628 TFLITE_IFM_WEIGHTS_INDICES,
629 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200630 BuiltinOperator.GATHER: (
631 Op.GatherV2,
632 OptionsSerializer("GatherOptions", ("axis", "batch_dims")),
633 TFLITE_NO_INDICES,
634 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200635 BuiltinOperator.BATCH_TO_SPACE_ND: (
636 Op.BatchToSpaceND,
637 OptionsSerializer("BatchToSpaceNDOptions"),
638 TFLITE_NO_INDICES,
639 ),
640 BuiltinOperator.SPACE_TO_BATCH_ND: (
641 Op.SpaceToBatchND,
642 OptionsSerializer("SpaceToBatchNDOptions"),
643 TFLITE_NO_INDICES,
644 ),
645 BuiltinOperator.TRANSPOSE: (Op.Transpose, OptionsSerializer("TransposeOptions"), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200646 BuiltinOperator.MEAN: (Op.Mean, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_IFM_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200647 BuiltinOperator.SUB: (
648 Op.Sub,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200649 OptionsSerializer("SubOptions", (fused_act, "pot_scale_int16")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200650 TFLITE_IFM_IFM2_INDICES,
651 ),
652 BuiltinOperator.DIV: (Op.Div, OptionsSerializer("DivOptions", (fused_act,)), TFLITE_NO_INDICES),
653 BuiltinOperator.SQUEEZE: (
654 Op.Squeeze,
Dwight Lidmancfb42622021-08-11 12:28:51 +0200655 OptionsSerializer("SqueezeOptions", (("squeeze_dims", is_int_vec),),),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200656 TFLITE_IFM_INDICES,
657 ),
658 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_LSTM: (
659 Op.UnidirectionalSequenceLstm,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200660 OptionsSerializer(
661 "UnidirectionalSequenceLSTMOptions",
662 ("asymmetric_quantize_inputs", "cell_clip", fused_act, "proj_clip", "time_major"),
663 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200664 TFLITE_IFM_WEIGHTS_INDICES,
665 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100666 BuiltinOperator.STRIDED_SLICE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200667 Op.StridedSlice,
Tim Hall79d07d22020-04-27 18:20:16 +0100668 OptionsSerializer(
Dwight Lidman8a12da12021-07-19 13:43:05 +0200669 "StridedSliceOptions", ("begin_mask", "ellipsis_mask", "end_mask", "new_axis_mask", "shrink_axis_mask")
Tim Hall79d07d22020-04-27 18:20:16 +0100670 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200671 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100672 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200673 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_RNN: (
674 Op.BidirectionalSequenceRnn,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200675 OptionsSerializer(
676 "BidirectionalSequenceRNNOptions", ("asymmetric_quantize_inputs", fused_act, "merge_outputs", "time_major")
677 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200678 TFLITE_IFM_WEIGHTS_INDICES,
679 ),
680 BuiltinOperator.EXP: (Op.Exp, OptionsSerializer("ExpOptions"), TFLITE_IFM_INDICES),
681 BuiltinOperator.TOPK_V2: (Op.TopKV2, OptionsSerializer("TopKV2Options"), TFLITE_NO_INDICES),
682 BuiltinOperator.SPLIT: (Op.Split, OptionsSerializer("SplitOptions", ("num_splits",)), TFLITE_SPLIT_IFM_INDICES),
683 BuiltinOperator.LOG_SOFTMAX: (Op.LogSoftmax, OptionsSerializer("LogSoftmaxOptions"), TFLITE_NO_INDICES),
684 BuiltinOperator.DELEGATE: (Op.Delegate, None, TFLITE_NO_INDICES),
685 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_LSTM: (
686 Op.BidirectionalSequenceLstm,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200687 OptionsSerializer(
688 "BidirectionalSequenceLSTMOptions",
689 ("asymmetric_quantize_inputs", "cell_clip", fused_act, "merge_outputs", "proj_clip", "time_major"),
690 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200691 TFLITE_IFM_WEIGHTS_INDICES,
692 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100693 BuiltinOperator.CAST: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200694 Op.Cast,
Tim Hall79d07d22020-04-27 18:20:16 +0100695 OptionsSerializer(
696 "CastOptions",
697 (
698 ("in_data_type", datatype_deserialize, datatype_serialize),
699 ("out_data_type", datatype_deserialize, datatype_serialize),
700 ),
701 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200702 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100703 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200704 BuiltinOperator.PRELU: (Op.Prelu, None, TFLITE_NO_INDICES),
705 BuiltinOperator.MAXIMUM: (Op.Maximum, OptionsSerializer("MaximumMinimumOptions"), TFLITE_IFM_IFM2_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100706 BuiltinOperator.ARG_MAX: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200707 Op.ArgMax,
Tim Hall79d07d22020-04-27 18:20:16 +0100708 OptionsSerializer("ArgMaxOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200709 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100710 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200711 BuiltinOperator.MINIMUM: (Op.Minimum, OptionsSerializer("MaximumMinimumOptions"), TFLITE_IFM_IFM2_INDICES),
712 BuiltinOperator.LESS: (Op.Less, OptionsSerializer("LessOptions"), TFLITE_NO_INDICES),
713 BuiltinOperator.NEG: (Op.Neg, OptionsSerializer("NegOptions"), TFLITE_NO_INDICES),
714 BuiltinOperator.PADV2: (Op.PadV2, OptionsSerializer("PadV2Options"), TFLITE_NO_INDICES),
715 BuiltinOperator.GREATER: (Op.Greater, OptionsSerializer("GreaterOptions"), TFLITE_NO_INDICES),
716 BuiltinOperator.GREATER_EQUAL: (Op.GreaterEqual, OptionsSerializer("GreaterEqualOptions"), TFLITE_NO_INDICES),
717 BuiltinOperator.LESS_EQUAL: (Op.LessEqual, OptionsSerializer("LessEqualOptions"), TFLITE_NO_INDICES),
718 BuiltinOperator.SELECT: (Op.Select, OptionsSerializer("SelectOptions"), TFLITE_NO_INDICES),
719 BuiltinOperator.SLICE: (Op.Slice, OptionsSerializer("SliceOptions"), TFLITE_IFM_INDICES),
720 BuiltinOperator.SIN: (Op.Sin, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100721 BuiltinOperator.TRANSPOSE_CONV: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200722 Op.Conv2DBackpropInput,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200723 OptionsSerializer("TransposeConvOptions", (padding, "stride_h", "stride_w")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200724 TFLITE_CONV2D_BACKPROP_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100725 ),
726 BuiltinOperator.SPARSE_TO_DENSE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200727 Op.SparseToDense,
Tim Hall79d07d22020-04-27 18:20:16 +0100728 OptionsSerializer("SparseToDenseOptions", ("validate_indices",)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200729 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100730 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200731 BuiltinOperator.TILE: (Op.Tile, OptionsSerializer("TileOptions"), TFLITE_NO_INDICES),
732 BuiltinOperator.EXPAND_DIMS: (Op.ExpandDims, OptionsSerializer("ExpandDimsOptions"), TFLITE_IFM_INDICES),
733 BuiltinOperator.EQUAL: (Op.Equal, OptionsSerializer("EqualOptions"), TFLITE_NO_INDICES),
734 BuiltinOperator.NOT_EQUAL: (Op.NotEqual, OptionsSerializer("NotEqualOptions"), TFLITE_NO_INDICES),
735 BuiltinOperator.LOG: (Op.Log, None, TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200736 BuiltinOperator.SUM: (Op.Sum, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200737 BuiltinOperator.SQRT: (Op.Sqrt, None, TFLITE_NO_INDICES),
738 BuiltinOperator.RSQRT: (Op.Rsqrt, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100739 BuiltinOperator.SHAPE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200740 Op.Shape,
Tim Hall79d07d22020-04-27 18:20:16 +0100741 OptionsSerializer("ShapeOptions", (("out_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200742 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100743 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200744 BuiltinOperator.POW: (Op.Pow, OptionsSerializer("PowOptions"), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100745 BuiltinOperator.ARG_MIN: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200746 Op.ArgMin,
Tim Hall79d07d22020-04-27 18:20:16 +0100747 OptionsSerializer("ArgMinOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200748 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100749 ),
750 BuiltinOperator.FAKE_QUANT: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200751 Op.FakeQuantWithMinMaxArgs,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200752 OptionsSerializer("FakeQuantOptions", ("max", "min", "narrow_range", "num_bits")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200753 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100754 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200755 BuiltinOperator.REDUCE_PROD: (Op.Prod, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
756 BuiltinOperator.REDUCE_MAX: (Op.Max, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
757 BuiltinOperator.PACK: (Op.Pack, OptionsSerializer("PackOptions", ("axis", "values_count")), TFLITE_IFM_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200758 BuiltinOperator.LOGICAL_OR: (Op.LogicalOr, OptionsSerializer("LogicalOrOptions"), TFLITE_NO_INDICES),
759 BuiltinOperator.ONE_HOT: (Op.OneHot, OptionsSerializer("OneHotOptions", ("axis",)), TFLITE_NO_INDICES),
760 BuiltinOperator.LOGICAL_AND: (Op.LogicalAnd, OptionsSerializer("LogicalAndOptions"), TFLITE_NO_INDICES),
761 BuiltinOperator.LOGICAL_NOT: (Op.LogicalNot, OptionsSerializer("LogicalNotOptions"), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200762 BuiltinOperator.UNPACK: (Op.Unpack, OptionsSerializer("UnpackOptions", ("axis", "num")), TFLITE_IFM_INDICES),
763 BuiltinOperator.REDUCE_MIN: (Op.Min, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200764 BuiltinOperator.FLOOR_DIV: (Op.FloorDiv, OptionsSerializer("FloorDivOptions"), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200765 BuiltinOperator.REDUCE_ANY: (Op.Any, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200766 BuiltinOperator.SQUARE: (Op.Square, OptionsSerializer("SquareOptions"), TFLITE_NO_INDICES),
767 BuiltinOperator.ZEROS_LIKE: (Op.ZerosLike, OptionsSerializer("ZerosLikeOptions"), TFLITE_NO_INDICES),
768 BuiltinOperator.FILL: (Op.Fill, OptionsSerializer("FillOptions"), TFLITE_NO_INDICES),
769 BuiltinOperator.FLOOR_MOD: (Op.FloorMod, OptionsSerializer("FloorModOptions"), TFLITE_NO_INDICES),
770 BuiltinOperator.RANGE: (Op.Range, OptionsSerializer("RangeOptions"), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100771 BuiltinOperator.RESIZE_NEAREST_NEIGHBOR: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200772 Op.ResizeNearestNeighbor,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200773 OptionsSerializer("ResizeNearestNeighborOptions", ("align_corners", "half_pixel_centers")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200774 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100775 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200776 BuiltinOperator.LEAKY_RELU: (Op.LeakyRelu, OptionsSerializer("LeakyReluOptions", ("alpha",)), TFLITE_IFM_INDICES),
777 BuiltinOperator.SQUARED_DIFFERENCE: (
778 Op.SquaredDifference,
779 OptionsSerializer("SquaredDifferenceOptions"),
780 TFLITE_NO_INDICES,
781 ),
782 BuiltinOperator.MIRROR_PAD: (Op.MirrorPad, OptionsSerializer("MirrorPadOptions", ("mode",)), TFLITE_NO_INDICES),
783 BuiltinOperator.ABS: (Op.Abs, OptionsSerializer("AbsOptions"), TFLITE_IFM_INDICES),
784 BuiltinOperator.SPLIT_V: (Op.SplitV, OptionsSerializer("SplitVOptions", ("num_splits",)), TFLITE_IFM_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100785 BuiltinOperator.UNIQUE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200786 Op.Unique,
Tim Hall79d07d22020-04-27 18:20:16 +0100787 OptionsSerializer("UniqueOptions", (("idx_out_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200788 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100789 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200790 BuiltinOperator.CEIL: (Op.Ceil, None, TFLITE_NO_INDICES),
791 BuiltinOperator.REVERSE_V2: (Op.ReverseV2, OptionsSerializer("ReverseV2Options"), TFLITE_NO_INDICES),
792 BuiltinOperator.ADD_N: (Op.AddN, OptionsSerializer("AddNOptions"), TFLITE_NO_INDICES),
793 BuiltinOperator.GATHER_ND: (Op.GatherNd, OptionsSerializer("GatherNdOptions"), TFLITE_NO_INDICES),
794 BuiltinOperator.COS: (Op.Cos, OptionsSerializer("CosOptions"), TFLITE_NO_INDICES),
795 BuiltinOperator.WHERE: (Op.Where, OptionsSerializer("WhereOptions"), TFLITE_NO_INDICES),
796 BuiltinOperator.RANK: (Op.Rank, OptionsSerializer("RankOptions"), TFLITE_NO_INDICES),
797 BuiltinOperator.ELU: (Op.Elu, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100798 BuiltinOperator.REVERSE_SEQUENCE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200799 Op.ReverseSequence,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200800 OptionsSerializer("ReverseSequenceOptions", ("batch_dim", "seq_dim")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200801 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100802 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200803 BuiltinOperator.MATRIX_DIAG: (Op.MatrixDiag, OptionsSerializer("MatrixDiagOptions"), TFLITE_NO_INDICES),
804 BuiltinOperator.QUANTIZE: (Op.Quantize, OptionsSerializer("QuantizeOptions"), TFLITE_IFM_INDICES),
805 BuiltinOperator.MATRIX_SET_DIAG: (Op.MatrixSetDiag, OptionsSerializer("MatrixSetDiagOptions"), TFLITE_NO_INDICES),
806 BuiltinOperator.ROUND: (Op.Round, None, TFLITE_NO_INDICES),
807 BuiltinOperator.HARD_SWISH: (Op.HardSwish, OptionsSerializer("HardSwishOptions"), TFLITE_IFM_INDICES),
808 BuiltinOperator.IF: (
809 Op.If,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200810 OptionsSerializer("IfOptions", ("else_subgraph_index", "then_subgraph_index")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200811 TFLITE_NO_INDICES,
812 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200813 BuiltinOperator.WHILE: (
814 Op.While,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200815 OptionsSerializer("WhileOptions", ("body_subgraph_index", "cond_subgraph_index")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200816 TFLITE_NO_INDICES,
Louis Verhaardaee5d752020-09-30 09:01:52 +0200817 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200818 BuiltinOperator.NON_MAX_SUPPRESSION_V4: (
819 Op.NonMaxSuppressionV4,
820 OptionsSerializer("NonMaxSuppressionV4Options"),
821 TFLITE_NO_INDICES,
822 ),
823 BuiltinOperator.NON_MAX_SUPPRESSION_V5: (
824 Op.NonMaxSuppressionV5,
825 OptionsSerializer("NonMaxSuppressionV5Options"),
826 TFLITE_NO_INDICES,
827 ),
828 BuiltinOperator.SCATTER_ND: (Op.ScatterNd, OptionsSerializer("ScatterNdOptions"), TFLITE_NO_INDICES),
829 BuiltinOperator.SELECT_V2: (Op.SelectV2, OptionsSerializer("SelectV2Options"), TFLITE_NO_INDICES),
830 BuiltinOperator.DENSIFY: (Op.Densify, OptionsSerializer("DensifyOptions"), TFLITE_NO_INDICES),
831 BuiltinOperator.SEGMENT_SUM: (Op.SegmentSum, OptionsSerializer("SegmentSumOptions"), TFLITE_NO_INDICES),
832 BuiltinOperator.BATCH_MATMUL: (
833 Op.BatchMatMul,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200834 OptionsSerializer("BatchMatMulOptions", ("adj_x", "adj_y", "asymmetric_quantize_inputs")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200835 TFLITE_NO_INDICES,
836 ),
837 BuiltinOperator.CUMSUM: (
838 Op.Cumsum,
839 OptionsSerializer("CumsumOptions", ("exclusive", "reverse")),
840 TFLITE_NO_INDICES,
841 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200842 BuiltinOperator.CALL_ONCE: (
843 Op.CallOnce,
844 OptionsSerializer("CallOnceOptions", ("init_subgraph_index",)),
845 TFLITE_NO_INDICES,
846 ),
847 BuiltinOperator.BROADCAST_TO: (Op.BroadcastTo, OptionsSerializer("BroadcastToOptions"), TFLITE_NO_INDICES),
848 BuiltinOperator.RFFT2D: (Op.Rfft2D, OptionsSerializer("Rfft2dOptions"), TFLITE_NO_INDICES),
849 BuiltinOperator.CONV_3D: (
850 Op.Conv3D,
851 OptionsSerializer(
852 "Conv3DOptions",
853 (
854 "dilation_d_factor",
855 "dilation_h_factor",
856 "dilation_w_factor",
857 fused_act,
858 padding,
859 "stride_d",
860 "stride_h",
861 "stride_w",
862 ),
863 ),
864 TFLITE_NO_INDICES,
865 ),
866 BuiltinOperator.IMAG: (Op.Imag, None, TFLITE_NO_INDICES),
867 BuiltinOperator.REAL: (Op.Real, None, TFLITE_NO_INDICES),
868 BuiltinOperator.COMPLEX_ABS: (Op.ComplexAbs, None, TFLITE_NO_INDICES),
869 BuiltinOperator.HASHTABLE: (
870 Op.Hashtable,
871 OptionsSerializer("HashtableOptions", ("key_dtype", "table_id", "value_dtype")),
872 TFLITE_NO_INDICES,
873 ),
874 BuiltinOperator.HASHTABLE_FIND: (Op.HashtableFind, OptionsSerializer("HashtableFindOptions"), TFLITE_NO_INDICES),
875 BuiltinOperator.HASHTABLE_IMPORT: (
876 Op.HashtableImport,
877 OptionsSerializer("HashtableImportOptions"),
878 TFLITE_NO_INDICES,
879 ),
880 BuiltinOperator.HASHTABLE_SIZE: (Op.HashtableSize, OptionsSerializer("HashtableSizeOptions"), TFLITE_NO_INDICES),
881 BuiltinOperator.REDUCE_ALL: (Op.ReduceAll, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
882 BuiltinOperator.CONV_3D_TRANSPOSE: (
883 Op.Conv3DTranspose,
884 OptionsSerializer(
885 "Conv3DOptions",
886 (
887 "dilation_d_factor",
888 "dilation_h_factor",
889 "dilation_w_factor",
890 fused_act,
891 padding,
892 "stride_d",
893 "stride_h",
894 "stride_w",
895 ),
896 ),
897 TFLITE_NO_INDICES,
898 ),
Tim Hallb94bcd42021-09-07 14:24:51 +0100899 BuiltinOperator.CUSTOM: (Op.Custom, CustomOptionsSerializer(), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100900}
901
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200902builtin_operator_inv_map = {v[0]: (k, v[1], v[2]) for k, v in builtin_operator_map.items()}
Tim Hall79d07d22020-04-27 18:20:16 +0100903
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200904builtin_operator_inv_map[Op.CustomNpuOp] = (BuiltinOperator.CUSTOM, CustomOptionsSerializer(), TFLITE_NO_INDICES)
Michael McGeagh219ec072020-11-09 11:11:26 +0000905
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000906BUILTIN_OPERATOR_UNKNOWN = "UNKNOWN"
907
908
909def builtin_type_name(builtin):
910 return next(k for k, v in vars(BuiltinOperator).items() if v == builtin)
911
Michael McGeagh219ec072020-11-09 11:11:26 +0000912
913def optype_to_builtintype(op_type):
914 if op_type in builtin_operator_inv_map:
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000915 return builtin_type_name(builtin_operator_inv_map[op_type][0])
Michael McGeagh219ec072020-11-09 11:11:26 +0000916 else:
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000917 return BUILTIN_OPERATOR_UNKNOWN