blob: 396ed5ec64ae553c31c4f0066e4454f5a4cf2cd2 [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,
Dwight Lidmanf53b3322021-10-08 11:58:08 +0200163 TensorType.UINT64: DataType.uint64,
164 TensorType.RESOURCE: DataType.resource,
165 TensorType.VARIANT: DataType.variant,
166 TensorType.UINT32: DataType.uint32,
Tim Hall79d07d22020-04-27 18:20:16 +0100167}
168
169datatype_inv_map = inverse_map(datatype_map)
170datatype_inv_map[DataType.quint8] = TensorType.UINT8
171
172datatype_inv_map[DataType.qint8] = TensorType.INT8
173datatype_inv_map[DataType.qint16] = TensorType.INT16
174datatype_inv_map[DataType.qint32] = TensorType.INT32
175
176
177datatype_map_numpy = {
178 TensorType.UINT8: np.uint8,
Dwight Lidmanf53b3322021-10-08 11:58:08 +0200179 TensorType.UINT32: np.uint32,
180 TensorType.UINT64: np.uint64,
Tim Hall79d07d22020-04-27 18:20:16 +0100181 TensorType.INT8: np.int8,
182 TensorType.INT16: np.int16,
183 TensorType.INT32: np.int32,
184 TensorType.INT64: np.int64,
185 TensorType.FLOAT16: np.float16,
186 TensorType.FLOAT32: np.float32,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200187 TensorType.FLOAT64: np.float64,
Tim Hall79d07d22020-04-27 18:20:16 +0100188 TensorType.BOOL: np.bool,
Jacob Bohlinf767b932020-08-13 15:32:45 +0200189 TensorType.COMPLEX64: np.complex64,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200190 TensorType.COMPLEX128: np.complex128,
Louis Verhaardf4e12be2020-12-18 14:23:06 +0100191 TensorType.STRING: np.uint8,
Dwight Lidmanf53b3322021-10-08 11:58:08 +0200192 TensorType.RESOURCE: None, # experimental type
193 TensorType.VARIANT: None, # experimental type
Tim Hall79d07d22020-04-27 18:20:16 +0100194}
195
196
197builtin_options_map = {
198 BuiltinOptions.Conv2DOptions: Conv2DOptions.Conv2DOptions,
199 BuiltinOptions.DepthwiseConv2DOptions: DepthwiseConv2DOptions.DepthwiseConv2DOptions,
200 BuiltinOptions.ConcatEmbeddingsOptions: ConcatEmbeddingsOptions.ConcatEmbeddingsOptions,
201 BuiltinOptions.LSHProjectionOptions: LSHProjectionOptions.LSHProjectionOptions,
202 BuiltinOptions.Pool2DOptions: Pool2DOptions.Pool2DOptions,
203 BuiltinOptions.SVDFOptions: SVDFOptions.SVDFOptions,
204 BuiltinOptions.RNNOptions: RNNOptions.RNNOptions,
205 BuiltinOptions.FullyConnectedOptions: FullyConnectedOptions.FullyConnectedOptions,
206 BuiltinOptions.SoftmaxOptions: SoftmaxOptions.SoftmaxOptions,
207 BuiltinOptions.ConcatenationOptions: ConcatenationOptions.ConcatenationOptions,
208 BuiltinOptions.AddOptions: AddOptions.AddOptions,
209 BuiltinOptions.L2NormOptions: L2NormOptions.L2NormOptions,
210 BuiltinOptions.LocalResponseNormalizationOptions: LocalResponseNormalizationOptions.LocalResponseNormalizationOptions, # noqa: E501
211 BuiltinOptions.LSTMOptions: LSTMOptions.LSTMOptions,
212 BuiltinOptions.ResizeBilinearOptions: ResizeBilinearOptions.ResizeBilinearOptions,
213 BuiltinOptions.CallOptions: CallOptions.CallOptions,
214 BuiltinOptions.ReshapeOptions: ReshapeOptions.ReshapeOptions,
215 BuiltinOptions.SkipGramOptions: SkipGramOptions.SkipGramOptions,
216 BuiltinOptions.SpaceToDepthOptions: SpaceToDepthOptions.SpaceToDepthOptions,
217 BuiltinOptions.EmbeddingLookupSparseOptions: EmbeddingLookupSparseOptions.EmbeddingLookupSparseOptions,
218 BuiltinOptions.MulOptions: MulOptions.MulOptions,
219 BuiltinOptions.PadOptions: PadOptions.PadOptions,
220 BuiltinOptions.GatherOptions: GatherOptions.GatherOptions,
221 BuiltinOptions.BatchToSpaceNDOptions: BatchToSpaceNDOptions.BatchToSpaceNDOptions,
222 BuiltinOptions.SpaceToBatchNDOptions: SpaceToBatchNDOptions.SpaceToBatchNDOptions,
223 BuiltinOptions.TransposeOptions: TransposeOptions.TransposeOptions,
224 BuiltinOptions.ReducerOptions: ReducerOptions.ReducerOptions,
225 BuiltinOptions.SubOptions: SubOptions.SubOptions,
226 BuiltinOptions.DivOptions: DivOptions.DivOptions,
227 BuiltinOptions.SqueezeOptions: SqueezeOptions.SqueezeOptions,
228 BuiltinOptions.SequenceRNNOptions: SequenceRNNOptions.SequenceRNNOptions,
229 BuiltinOptions.StridedSliceOptions: StridedSliceOptions.StridedSliceOptions,
230 BuiltinOptions.ExpOptions: ExpOptions.ExpOptions,
231 BuiltinOptions.TopKV2Options: TopKV2Options.TopKV2Options,
232 BuiltinOptions.SplitOptions: SplitOptions.SplitOptions,
233 BuiltinOptions.LogSoftmaxOptions: LogSoftmaxOptions.LogSoftmaxOptions,
234 BuiltinOptions.CastOptions: CastOptions.CastOptions,
235 BuiltinOptions.DequantizeOptions: DequantizeOptions.DequantizeOptions,
236 BuiltinOptions.MaximumMinimumOptions: MaximumMinimumOptions.MaximumMinimumOptions,
237 BuiltinOptions.ArgMaxOptions: ArgMaxOptions.ArgMaxOptions,
238 BuiltinOptions.LessOptions: LessOptions.LessOptions,
239 BuiltinOptions.NegOptions: NegOptions.NegOptions,
240 BuiltinOptions.PadV2Options: PadV2Options.PadV2Options,
241 BuiltinOptions.GreaterOptions: GreaterOptions.GreaterOptions,
242 BuiltinOptions.GreaterEqualOptions: GreaterEqualOptions.GreaterEqualOptions,
243 BuiltinOptions.LessEqualOptions: LessEqualOptions.LessEqualOptions,
244 BuiltinOptions.SelectOptions: SelectOptions.SelectOptions,
245 BuiltinOptions.SliceOptions: SliceOptions.SliceOptions,
246 BuiltinOptions.TransposeConvOptions: TransposeConvOptions.TransposeConvOptions,
247 BuiltinOptions.SparseToDenseOptions: SparseToDenseOptions.SparseToDenseOptions,
248 BuiltinOptions.TileOptions: TileOptions.TileOptions,
249 BuiltinOptions.ExpandDimsOptions: ExpandDimsOptions.ExpandDimsOptions,
250 BuiltinOptions.EqualOptions: EqualOptions.EqualOptions,
251 BuiltinOptions.NotEqualOptions: NotEqualOptions.NotEqualOptions,
252 BuiltinOptions.ShapeOptions: ShapeOptions.ShapeOptions,
253 BuiltinOptions.PowOptions: PowOptions.PowOptions,
254 BuiltinOptions.ArgMinOptions: ArgMinOptions.ArgMinOptions,
255 BuiltinOptions.FakeQuantOptions: FakeQuantOptions.FakeQuantOptions,
256 BuiltinOptions.PackOptions: PackOptions.PackOptions,
257 BuiltinOptions.LogicalOrOptions: LogicalOrOptions.LogicalOrOptions,
258 BuiltinOptions.OneHotOptions: OneHotOptions.OneHotOptions,
259 BuiltinOptions.LogicalAndOptions: LogicalAndOptions.LogicalAndOptions,
260 BuiltinOptions.LogicalNotOptions: LogicalNotOptions.LogicalNotOptions,
261 BuiltinOptions.UnpackOptions: UnpackOptions.UnpackOptions,
262 BuiltinOptions.FloorDivOptions: FloorDivOptions.FloorDivOptions,
263 BuiltinOptions.SquareOptions: SquareOptions.SquareOptions,
264 BuiltinOptions.ZerosLikeOptions: ZerosLikeOptions.ZerosLikeOptions,
265 BuiltinOptions.FillOptions: FillOptions.FillOptions,
266 BuiltinOptions.BidirectionalSequenceLSTMOptions: BidirectionalSequenceLSTMOptions.BidirectionalSequenceLSTMOptions,
267 BuiltinOptions.BidirectionalSequenceRNNOptions: BidirectionalSequenceRNNOptions.BidirectionalSequenceRNNOptions,
268 BuiltinOptions.UnidirectionalSequenceLSTMOptions: UnidirectionalSequenceLSTMOptions.UnidirectionalSequenceLSTMOptions, # noqa: E501
269 BuiltinOptions.FloorModOptions: FloorModOptions.FloorModOptions,
270 BuiltinOptions.RangeOptions: RangeOptions.RangeOptions,
271 BuiltinOptions.ResizeNearestNeighborOptions: ResizeNearestNeighborOptions.ResizeNearestNeighborOptions,
272 BuiltinOptions.LeakyReluOptions: LeakyReluOptions.LeakyReluOptions,
273 BuiltinOptions.SquaredDifferenceOptions: SquaredDifferenceOptions.SquaredDifferenceOptions,
274 BuiltinOptions.MirrorPadOptions: MirrorPadOptions.MirrorPadOptions,
275 BuiltinOptions.AbsOptions: AbsOptions.AbsOptions,
276 BuiltinOptions.SplitVOptions: SplitVOptions.SplitVOptions,
277 BuiltinOptions.UniqueOptions: UniqueOptions.UniqueOptions,
278 BuiltinOptions.ReverseV2Options: ReverseV2Options.ReverseV2Options,
279 BuiltinOptions.AddNOptions: AddNOptions.AddNOptions,
280 BuiltinOptions.GatherNdOptions: GatherNdOptions.GatherNdOptions,
281 BuiltinOptions.CosOptions: CosOptions.CosOptions,
282 BuiltinOptions.WhereOptions: WhereOptions.WhereOptions,
283 BuiltinOptions.RankOptions: RankOptions.RankOptions,
284 BuiltinOptions.ReverseSequenceOptions: ReverseSequenceOptions.ReverseSequenceOptions,
285 BuiltinOptions.MatrixDiagOptions: MatrixDiagOptions.MatrixDiagOptions,
286 BuiltinOptions.QuantizeOptions: QuantizeOptions.QuantizeOptions,
287 BuiltinOptions.MatrixSetDiagOptions: MatrixSetDiagOptions.MatrixSetDiagOptions,
288 BuiltinOptions.DensifyOptions: DensifyOptions.DensifyOptions,
289 BuiltinOptions.DepthToSpaceOptions: DepthToSpaceOptions.DepthToSpaceOptions,
Louis Verhaard678645b2020-06-15 15:22:47 +0200290 BuiltinOptions.HardSwishOptions: HardSwishOptions.HardSwishOptions,
Tim Hall79d07d22020-04-27 18:20:16 +0100291 BuiltinOptions.IfOptions: IfOptions.IfOptions,
292 BuiltinOptions.NonMaxSuppressionV4Options: NonMaxSuppressionV4Options.NonMaxSuppressionV4Options,
293 BuiltinOptions.NonMaxSuppressionV5Options: NonMaxSuppressionV5Options.NonMaxSuppressionV5Options,
294 BuiltinOptions.ScatterNdOptions: ScatterNdOptions.ScatterNdOptions,
295 BuiltinOptions.SegmentSumOptions: SegmentSumOptions.SegmentSumOptions,
296 BuiltinOptions.SelectV2Options: SelectV2Options.SelectV2Options,
297 BuiltinOptions.WhileOptions: WhileOptions.WhileOptions,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200298 BuiltinOptions.BatchMatMulOptions: BatchMatMulOptions.BatchMatMulOptions,
Tim Hall42abec12021-02-04 21:31:57 +0000299 BuiltinOptions.CumsumOptions: CumsumOptions.CumsumOptions,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200300 BuiltinOptions.CallOnceOptions: CallOnceOptions.CallOnceOptions,
301 BuiltinOptions.BroadcastToOptions: BroadcastToOptions.BroadcastToOptions,
302 BuiltinOptions.Rfft2dOptions: Rfft2dOptions.Rfft2dOptions,
303 BuiltinOptions.Conv3DOptions: Conv3DOptions.Conv3DOptions,
304 BuiltinOptions.HashtableOptions: HashtableOptions.HashtableOptions,
305 BuiltinOptions.HashtableFindOptions: HashtableFindOptions.HashtableFindOptions,
306 BuiltinOptions.HashtableImportOptions: HashtableImportOptions.HashtableImportOptions,
307 BuiltinOptions.HashtableSizeOptions: HashtableSizeOptions.HashtableSizeOptions,
Tim Hall79d07d22020-04-27 18:20:16 +0100308}
309
310builtin_options_inv_map = inverse_map(builtin_options_map)
311
312
313def underscore_to_camel_case(s):
314 return "".join(x.title() for x in s.split("_"))
315
316
317def padding_deserialize(x):
318 return padding_map[x]
319
320
321def padding_serialize(builder, x):
322 return padding_inv_map[x]
323
324
325def activation_deserialize(x):
326 return activation_function_map[x]
327
328
329def activation_serialize(builder, x):
330 return activation_function_inv_map[x]
331
332
333def datatype_deserialize(x):
334 return datatype_map[x]
335
336
337def datatype_serialize(builder, x):
338 return datatype_inv_map[x]
339
340
341def identity(x):
342 return x
343
344
345def identity_serialize(builder, x):
346 return x
347
348
349def write_byte_vector(builder, v):
350 builder.StartVector(1, len(v), 1)
351 for e in v[::-1]:
352 builder.PrependByte(e)
353 return builder.EndVector(len(v))
354
355
356def write_int_vector(builder, v):
357 builder.StartVector(4, len(v), 4)
358 for e in v[::-1]:
359 builder.PrependInt32(e)
360 return builder.EndVector(len(v))
361
362
363class OptionsSerializer:
Michael McGeagh6f725262020-12-03 15:21:36 +0000364 def __init__(self, name, members=None):
Tim Hall79d07d22020-04-27 18:20:16 +0100365 self.name = name
366 self.module = globals()[self.name]
367 self.cls = getattr(self.module, self.name)
368 self.builtin_opt_type = builtin_options_inv_map[self.cls]
Tim Hall79d07d22020-04-27 18:20:16 +0100369 self.members = []
Michael McGeagh6f725262020-12-03 15:21:36 +0000370 if members is not None:
371 for mem in members:
372 deserialize = identity
373 serialize = identity_serialize
374 is_vector = False
375 if isinstance(mem, tuple):
376 if len(mem) == 3:
377 mem, deserialize, serialize = mem
378 elif len(mem) == 2:
379 mem, is_vector = mem
380 deserialize = tuple
381 serialize = write_int_vector
382 else:
383 assert 0
384 underscore_mem = mem
385 camelcase_mem = underscore_to_camel_case(mem)
386 self.members.append((underscore_mem, camelcase_mem, deserialize, serialize, is_vector))
Tim Hall79d07d22020-04-27 18:20:16 +0100387
Tim Hallc8310b12020-06-17 14:53:11 +0100388 def deserialize(self, op_data):
389 builtin_options = op_data.BuiltinOptions()
Tim Hall79d07d22020-04-27 18:20:16 +0100390 attrs = {}
Tim Hallc8310b12020-06-17 14:53:11 +0100391 if builtin_options:
Tim Hall79d07d22020-04-27 18:20:16 +0100392 tfattrs = self.cls()
Tim Hallc8310b12020-06-17 14:53:11 +0100393 tfattrs.Init(builtin_options.Bytes, builtin_options.Pos)
Tim Hall79d07d22020-04-27 18:20:16 +0100394 for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members:
395 fun = camelcase_mem
396 if is_vector:
397 fun += "AsNumpy"
398
Fredrik Svedberg4bb989b2020-11-16 15:32:25 +0100399 attr = getattr(tfattrs, fun)()
400 try:
401 attrs[underscore_mem] = deserialize(attr)
402 except TypeError:
403 print("Warning: {0} could not read attribute '{1}'.".format(self.name, underscore_mem))
404
Tim Hall79d07d22020-04-27 18:20:16 +0100405 return attrs
406
407 def serialize(self, builder, attrs):
408 ser_attrs = []
409 for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members:
410 a = serialize(builder, attrs[underscore_mem])
411 ser_attrs.append((camelcase_mem, a))
412
413 getattr(self.module, self.name + "Start")(builder)
414
415 for camelcase_mem, a in ser_attrs:
416 getattr(self.module, self.name + "Add" + camelcase_mem)(builder, a)
417
418 return getattr(self.module, self.name + "End")(builder), None
419
420
421class CustomOptionsSerializer:
Tim Hallc8310b12020-06-17 14:53:11 +0100422 CUSTOM_OPTIONS_NPU_OP = [0x01, 0x04, 0x01] # NpuOp=1, FlexbufferFormat.UINT8=4, byte length=1
423 CUSTOM_OPTIONS_FORMAT_DEFAULT = 0
424
Tim Hall79d07d22020-04-27 18:20:16 +0100425 def __init__(self):
Tim Hall79d07d22020-04-27 18:20:16 +0100426 self.custom_opt_format = 0
427
Tim Hallc8310b12020-06-17 14:53:11 +0100428 def deserialize(self, op_data):
Tim Hall79d07d22020-04-27 18:20:16 +0100429 attrs = {}
Tim Hallc8310b12020-06-17 14:53:11 +0100430 custom_options = op_data.CustomOptionsAsNumpy()
431 attrs["custom_options"] = custom_options
432 attrs["custom_options_format"] = op_data.CustomOptionsFormat()
433
434 if np.array_equal(custom_options, self.CUSTOM_OPTIONS_NPU_OP):
Louis Verhaardaee5d752020-09-30 09:01:52 +0200435 attrs["custom_type"] = CustomType.ExistingNpuOp
Tim Hallc8310b12020-06-17 14:53:11 +0100436
Tim Hall79d07d22020-04-27 18:20:16 +0100437 return attrs
438
439 def serialize(self, builder, attrs):
Louis Verhaardaee5d752020-09-30 09:01:52 +0200440 custom_type = attrs.get("custom_type", CustomType.ThirdPartyOp)
Tim Hallc8310b12020-06-17 14:53:11 +0100441 self.custom_opt_format = attrs.get("custom_options_format", self.CUSTOM_OPTIONS_FORMAT_DEFAULT)
Tim Hall79d07d22020-04-27 18:20:16 +0100442
443 # Set NPU op custom options for the TensorFlow Lite custom operator
Louis Verhaardaee5d752020-09-30 09:01:52 +0200444 if custom_type == CustomType.NpuOp:
Tim Hallc8310b12020-06-17 14:53:11 +0100445 custom_options = self.CUSTOM_OPTIONS_NPU_OP
446 else:
447 custom_options = attrs.get("custom_options", [])
Tim Hall79d07d22020-04-27 18:20:16 +0100448
Tim Hallc8310b12020-06-17 14:53:11 +0100449 custom_options_bytes = struct.pack("<{0}B".format(len(custom_options)), *custom_options)
450 custom_offset = write_byte_vector(builder, custom_options_bytes)
Tim Hall79d07d22020-04-27 18:20:16 +0100451
452 return None, custom_offset
453
454
455padding_map = {
Michael McGeagh16895482020-12-14 15:51:20 +0000456 Padding.SAME: opPad.SAME,
457 Padding.VALID: opPad.VALID,
Tim Hall79d07d22020-04-27 18:20:16 +0100458}
459
460padding_inv_map = inverse_map(padding_map)
461
462
463activation_function_map = {
464 ActivationFunctionType.NONE: None,
Louis Verhaardaee5d752020-09-30 09:01:52 +0200465 ActivationFunctionType.RELU: Op.Relu,
466 ActivationFunctionType.RELU_N1_TO_1: Op.ReluN1To1,
467 ActivationFunctionType.RELU6: Op.Relu6,
468 ActivationFunctionType.TANH: Op.Tanh,
469 ActivationFunctionType.SIGN_BIT: Op.SignBit,
Tim Hall79d07d22020-04-27 18:20:16 +0100470}
471
472activation_function_inv_map = inverse_map(activation_function_map)
473
474fused_act = ("fused_activation_function", activation_deserialize, activation_serialize)
475padding = ("padding", padding_deserialize, padding_serialize)
476
Tim Hall79d07d22020-04-27 18:20:16 +0100477is_int_vec = True
478
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200479TFLITE_NO_INDICES = TensorIndices([], [], [])
480TFLITE_IFM_INDICES = TensorIndices([0], [], [])
481TFLITE_IFM_WEIGHTS_INDICES = TensorIndices([0], [1], [])
482TFLITE_IFM_WEIGHTS_BIAS_INDICES = TensorIndices([0], [1], [2])
483TFLITE_IFM_IFM2_INDICES = TensorIndices([0, 1], [], [])
484TFLITE_CONV2D_BACKPROP_INDICES = TensorIndices([2], [1], [3])
485TFLITE_TRANSPOSE_CONV_INDICES = TensorIndices([0], [1], [3])
486TFLITE_CONCAT_INDICES = TensorIndices([1, 2], [], [])
487TFLITE_SPLIT_IFM_INDICES = TensorIndices([1], [], [])
488TFLITE_BLOCK_LSTM_INDICES = TensorIndices([3], [4], [])
489
Tim Hall79d07d22020-04-27 18:20:16 +0100490builtin_operator_map = {
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200491 BuiltinOperator.ADD: (
492 Op.Add,
493 OptionsSerializer("AddOptions", (fused_act, "pot_scale_int16")),
494 TFLITE_IFM_IFM2_INDICES,
495 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200496 BuiltinOperator.AVERAGE_POOL_2D: (
497 Op.AvgPool,
498 OptionsSerializer(
499 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
500 ),
501 TFLITE_IFM_INDICES,
502 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200503 BuiltinOperator.CONCATENATION: (
504 Op.ConcatTFLite,
505 OptionsSerializer("ConcatenationOptions", ("axis", fused_act)),
506 TFLITE_CONCAT_INDICES,
507 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200508 BuiltinOperator.CONV_2D: (
509 Op.Conv2DBias,
510 OptionsSerializer(
511 "Conv2DOptions", ("dilation_h_factor", "dilation_w_factor", fused_act, padding, "stride_h", "stride_w")
512 ),
513 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
514 ),
515 BuiltinOperator.DEPTHWISE_CONV_2D: (
516 Op.DepthwiseConv2DBias,
517 OptionsSerializer(
518 "DepthwiseConv2DOptions",
519 ("depth_multiplier", "dilation_h_factor", "dilation_w_factor", fused_act, padding, "stride_h", "stride_w"),
520 ),
521 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
522 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200523 BuiltinOperator.DEPTH_TO_SPACE: (
524 Op.DepthToSpace,
525 OptionsSerializer("DepthToSpaceOptions", ("block_size",)),
526 TFLITE_NO_INDICES,
527 ),
528 BuiltinOperator.DEQUANTIZE: (Op.Dequantize, OptionsSerializer("DequantizeOptions"), TFLITE_IFM_INDICES),
529 BuiltinOperator.EMBEDDING_LOOKUP: (Op.EmbeddingLookup, None, TFLITE_NO_INDICES),
530 BuiltinOperator.FLOOR: (Op.Floor, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100531 BuiltinOperator.FULLY_CONNECTED: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200532 Op.FullyConnected,
erik.andersson@arm.com0cbb1662021-02-22 15:47:07 +0100533 OptionsSerializer(
Dwight Lidman8a12da12021-07-19 13:43:05 +0200534 "FullyConnectedOptions", ("asymmetric_quantize_inputs", fused_act, "keep_num_dims", "weights_format")
erik.andersson@arm.com0cbb1662021-02-22 15:47:07 +0100535 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200536 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100537 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200538 BuiltinOperator.HASHTABLE_LOOKUP: (Op.HashtableLookup, None, TFLITE_NO_INDICES),
539 BuiltinOperator.L2_NORMALIZATION: (Op.L2Norm, OptionsSerializer("L2NormOptions", (fused_act,)), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200540 BuiltinOperator.L2_POOL_2D: (
541 Op.L2Pool2D,
542 OptionsSerializer(
543 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
544 ),
545 TFLITE_NO_INDICES,
546 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100547 BuiltinOperator.LOCAL_RESPONSE_NORMALIZATION: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200548 Op.LRN,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200549 OptionsSerializer("LocalResponseNormalizationOptions", ("alpha", "beta", "bias", "radius")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200550 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100551 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200552 BuiltinOperator.LOGISTIC: (Op.Sigmoid, None, TFLITE_IFM_INDICES),
553 BuiltinOperator.LSH_PROJECTION: (
554 Op.LSHProjection,
555 OptionsSerializer("LSHProjectionOptions", ("type",)),
556 TFLITE_NO_INDICES,
557 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200558 BuiltinOperator.LSTM: (
559 Op.Lstm,
560 OptionsSerializer(
561 "LSTMOptions", ("asymmetric_quantize_inputs", "cell_clip", fused_act, "kernel_type", "proj_clip")
562 ),
563 TFLITE_IFM_WEIGHTS_INDICES,
564 ),
565 BuiltinOperator.MAX_POOL_2D: (
566 Op.MaxPool,
567 OptionsSerializer(
568 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
569 ),
570 TFLITE_IFM_INDICES,
571 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200572 BuiltinOperator.MUL: (Op.Mul, OptionsSerializer("MulOptions", (fused_act,)), TFLITE_IFM_IFM2_INDICES),
573 BuiltinOperator.RELU: (Op.Relu, None, TFLITE_IFM_INDICES),
574 BuiltinOperator.RELU_N1_TO_1: (Op.ReluN1To1, None, TFLITE_IFM_INDICES),
575 BuiltinOperator.RELU6: (Op.Relu6, None, TFLITE_IFM_INDICES),
576 BuiltinOperator.RESHAPE: (
577 Op.Reshape,
Dwight Lidmancfb42622021-08-11 12:28:51 +0200578 OptionsSerializer("ReshapeOptions", (("new_shape", is_int_vec),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200579 TFLITE_IFM_INDICES,
580 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100581 BuiltinOperator.RESIZE_BILINEAR: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200582 Op.ResizeBilinear,
Tim Hall79d07d22020-04-27 18:20:16 +0100583 OptionsSerializer("ResizeBilinearOptions", ("align_corners", "half_pixel_centers")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200584 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100585 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200586 BuiltinOperator.RNN: (
587 Op.Rnn,
588 OptionsSerializer("RNNOptions", ("asymmetric_quantize_inputs", fused_act)),
589 TFLITE_IFM_WEIGHTS_INDICES,
590 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200591 BuiltinOperator.SOFTMAX: (Op.Softmax, OptionsSerializer("SoftmaxOptions", ("beta",)), TFLITE_IFM_INDICES),
592 BuiltinOperator.SPACE_TO_DEPTH: (
593 Op.SpaceToDepth,
594 OptionsSerializer("SpaceToDepthOptions", ("block_size",)),
595 TFLITE_NO_INDICES,
596 ),
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200597 BuiltinOperator.SVDF: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200598 Op.Svdf,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200599 OptionsSerializer("SVDFOptions", ("asymmetric_quantize_inputs", fused_act, "rank")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200600 TFLITE_NO_INDICES,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200601 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200602 BuiltinOperator.TANH: (Op.Tanh, None, TFLITE_IFM_INDICES),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200603 BuiltinOperator.CONCAT_EMBEDDINGS: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200604 Op.ConcatEmbeddings,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200605 OptionsSerializer(
606 "ConcatEmbeddingsOptions",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200607 (
Dwight Lidman8a12da12021-07-19 13:43:05 +0200608 "embedding_dim_per_channel",
609 "embedding_dim_per_channel_as_numpy",
610 "embedding_dim_per_channel_is_none",
611 "embedding_dim_per_channel_length",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200612 "num_channels",
613 "num_columns_per_channel",
614 "num_columns_per_channel_as_numpy",
Dwight Lidman8a12da12021-07-19 13:43:05 +0200615 "num_columns_per_channel_is_none",
616 "num_columns_per_channel_length",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200617 ),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200618 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200619 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200620 ),
621 BuiltinOperator.SKIP_GRAM: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200622 Op.SkipGram,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200623 OptionsSerializer("SkipGramOptions", ("include_all_ngrams", "max_skip_size", "ngram_size")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200624 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200625 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200626 BuiltinOperator.CALL: (Op.Call, OptionsSerializer("CallOptions", ("subgraph",)), TFLITE_NO_INDICES),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200627 BuiltinOperator.EMBEDDING_LOOKUP_SPARSE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200628 Op.EmbeddingLookupSparse,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200629 OptionsSerializer("EmbeddingLookupSparseOptions", ("combiner",)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200630 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200631 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200632 BuiltinOperator.PAD: (Op.Pad, OptionsSerializer("PadOptions"), TFLITE_IFM_INDICES),
633 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_RNN: (
634 Op.UnidirectionalSequenceRnn,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200635 OptionsSerializer("SequenceRNNOptions", ("asymmetric_quantize_inputs", fused_act, "time_major")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200636 TFLITE_IFM_WEIGHTS_INDICES,
637 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200638 BuiltinOperator.GATHER: (
639 Op.GatherV2,
640 OptionsSerializer("GatherOptions", ("axis", "batch_dims")),
641 TFLITE_NO_INDICES,
642 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200643 BuiltinOperator.BATCH_TO_SPACE_ND: (
644 Op.BatchToSpaceND,
645 OptionsSerializer("BatchToSpaceNDOptions"),
646 TFLITE_NO_INDICES,
647 ),
648 BuiltinOperator.SPACE_TO_BATCH_ND: (
649 Op.SpaceToBatchND,
650 OptionsSerializer("SpaceToBatchNDOptions"),
651 TFLITE_NO_INDICES,
652 ),
James Ward6bf16132021-09-08 11:14:20 +0100653 BuiltinOperator.TRANSPOSE: (Op.Transpose, OptionsSerializer("TransposeOptions"), TFLITE_IFM_IFM2_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200654 BuiltinOperator.MEAN: (Op.Mean, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_IFM_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200655 BuiltinOperator.SUB: (
656 Op.Sub,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200657 OptionsSerializer("SubOptions", (fused_act, "pot_scale_int16")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200658 TFLITE_IFM_IFM2_INDICES,
659 ),
660 BuiltinOperator.DIV: (Op.Div, OptionsSerializer("DivOptions", (fused_act,)), TFLITE_NO_INDICES),
661 BuiltinOperator.SQUEEZE: (
662 Op.Squeeze,
Dwight Lidmancfb42622021-08-11 12:28:51 +0200663 OptionsSerializer("SqueezeOptions", (("squeeze_dims", is_int_vec),),),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200664 TFLITE_IFM_INDICES,
665 ),
666 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_LSTM: (
667 Op.UnidirectionalSequenceLstm,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200668 OptionsSerializer(
669 "UnidirectionalSequenceLSTMOptions",
670 ("asymmetric_quantize_inputs", "cell_clip", fused_act, "proj_clip", "time_major"),
671 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200672 TFLITE_IFM_WEIGHTS_INDICES,
673 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100674 BuiltinOperator.STRIDED_SLICE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200675 Op.StridedSlice,
Tim Hall79d07d22020-04-27 18:20:16 +0100676 OptionsSerializer(
Dwight Lidman8a12da12021-07-19 13:43:05 +0200677 "StridedSliceOptions", ("begin_mask", "ellipsis_mask", "end_mask", "new_axis_mask", "shrink_axis_mask")
Tim Hall79d07d22020-04-27 18:20:16 +0100678 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200679 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100680 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200681 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_RNN: (
682 Op.BidirectionalSequenceRnn,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200683 OptionsSerializer(
684 "BidirectionalSequenceRNNOptions", ("asymmetric_quantize_inputs", fused_act, "merge_outputs", "time_major")
685 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200686 TFLITE_IFM_WEIGHTS_INDICES,
687 ),
James Ward6bf16132021-09-08 11:14:20 +0100688 BuiltinOperator.EXP: (Op.Exp, OptionsSerializer("ExpOptions"), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200689 BuiltinOperator.TOPK_V2: (Op.TopKV2, OptionsSerializer("TopKV2Options"), TFLITE_NO_INDICES),
690 BuiltinOperator.SPLIT: (Op.Split, OptionsSerializer("SplitOptions", ("num_splits",)), TFLITE_SPLIT_IFM_INDICES),
691 BuiltinOperator.LOG_SOFTMAX: (Op.LogSoftmax, OptionsSerializer("LogSoftmaxOptions"), TFLITE_NO_INDICES),
692 BuiltinOperator.DELEGATE: (Op.Delegate, None, TFLITE_NO_INDICES),
693 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_LSTM: (
694 Op.BidirectionalSequenceLstm,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200695 OptionsSerializer(
696 "BidirectionalSequenceLSTMOptions",
697 ("asymmetric_quantize_inputs", "cell_clip", fused_act, "merge_outputs", "proj_clip", "time_major"),
698 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200699 TFLITE_IFM_WEIGHTS_INDICES,
700 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100701 BuiltinOperator.CAST: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200702 Op.Cast,
Tim Hall79d07d22020-04-27 18:20:16 +0100703 OptionsSerializer(
704 "CastOptions",
705 (
706 ("in_data_type", datatype_deserialize, datatype_serialize),
707 ("out_data_type", datatype_deserialize, datatype_serialize),
708 ),
709 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200710 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100711 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200712 BuiltinOperator.PRELU: (Op.Prelu, None, TFLITE_NO_INDICES),
713 BuiltinOperator.MAXIMUM: (Op.Maximum, OptionsSerializer("MaximumMinimumOptions"), TFLITE_IFM_IFM2_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100714 BuiltinOperator.ARG_MAX: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200715 Op.ArgMax,
Tim Hall79d07d22020-04-27 18:20:16 +0100716 OptionsSerializer("ArgMaxOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200717 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100718 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200719 BuiltinOperator.MINIMUM: (Op.Minimum, OptionsSerializer("MaximumMinimumOptions"), TFLITE_IFM_IFM2_INDICES),
720 BuiltinOperator.LESS: (Op.Less, OptionsSerializer("LessOptions"), TFLITE_NO_INDICES),
721 BuiltinOperator.NEG: (Op.Neg, OptionsSerializer("NegOptions"), TFLITE_NO_INDICES),
722 BuiltinOperator.PADV2: (Op.PadV2, OptionsSerializer("PadV2Options"), TFLITE_NO_INDICES),
723 BuiltinOperator.GREATER: (Op.Greater, OptionsSerializer("GreaterOptions"), TFLITE_NO_INDICES),
724 BuiltinOperator.GREATER_EQUAL: (Op.GreaterEqual, OptionsSerializer("GreaterEqualOptions"), TFLITE_NO_INDICES),
725 BuiltinOperator.LESS_EQUAL: (Op.LessEqual, OptionsSerializer("LessEqualOptions"), TFLITE_NO_INDICES),
726 BuiltinOperator.SELECT: (Op.Select, OptionsSerializer("SelectOptions"), TFLITE_NO_INDICES),
727 BuiltinOperator.SLICE: (Op.Slice, OptionsSerializer("SliceOptions"), TFLITE_IFM_INDICES),
728 BuiltinOperator.SIN: (Op.Sin, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100729 BuiltinOperator.TRANSPOSE_CONV: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200730 Op.Conv2DBackpropInput,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200731 OptionsSerializer("TransposeConvOptions", (padding, "stride_h", "stride_w")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200732 TFLITE_CONV2D_BACKPROP_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100733 ),
734 BuiltinOperator.SPARSE_TO_DENSE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200735 Op.SparseToDense,
Tim Hall79d07d22020-04-27 18:20:16 +0100736 OptionsSerializer("SparseToDenseOptions", ("validate_indices",)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200737 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100738 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200739 BuiltinOperator.TILE: (Op.Tile, OptionsSerializer("TileOptions"), TFLITE_NO_INDICES),
740 BuiltinOperator.EXPAND_DIMS: (Op.ExpandDims, OptionsSerializer("ExpandDimsOptions"), TFLITE_IFM_INDICES),
741 BuiltinOperator.EQUAL: (Op.Equal, OptionsSerializer("EqualOptions"), TFLITE_NO_INDICES),
742 BuiltinOperator.NOT_EQUAL: (Op.NotEqual, OptionsSerializer("NotEqualOptions"), TFLITE_NO_INDICES),
743 BuiltinOperator.LOG: (Op.Log, None, TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200744 BuiltinOperator.SUM: (Op.Sum, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200745 BuiltinOperator.SQRT: (Op.Sqrt, None, TFLITE_NO_INDICES),
746 BuiltinOperator.RSQRT: (Op.Rsqrt, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100747 BuiltinOperator.SHAPE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200748 Op.Shape,
Tim Hall79d07d22020-04-27 18:20:16 +0100749 OptionsSerializer("ShapeOptions", (("out_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200750 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100751 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200752 BuiltinOperator.POW: (Op.Pow, OptionsSerializer("PowOptions"), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100753 BuiltinOperator.ARG_MIN: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200754 Op.ArgMin,
Tim Hall79d07d22020-04-27 18:20:16 +0100755 OptionsSerializer("ArgMinOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200756 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100757 ),
758 BuiltinOperator.FAKE_QUANT: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200759 Op.FakeQuantWithMinMaxArgs,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200760 OptionsSerializer("FakeQuantOptions", ("max", "min", "narrow_range", "num_bits")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200761 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100762 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200763 BuiltinOperator.REDUCE_PROD: (Op.Prod, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
764 BuiltinOperator.REDUCE_MAX: (Op.Max, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
765 BuiltinOperator.PACK: (Op.Pack, OptionsSerializer("PackOptions", ("axis", "values_count")), TFLITE_IFM_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200766 BuiltinOperator.LOGICAL_OR: (Op.LogicalOr, OptionsSerializer("LogicalOrOptions"), TFLITE_NO_INDICES),
767 BuiltinOperator.ONE_HOT: (Op.OneHot, OptionsSerializer("OneHotOptions", ("axis",)), TFLITE_NO_INDICES),
768 BuiltinOperator.LOGICAL_AND: (Op.LogicalAnd, OptionsSerializer("LogicalAndOptions"), TFLITE_NO_INDICES),
769 BuiltinOperator.LOGICAL_NOT: (Op.LogicalNot, OptionsSerializer("LogicalNotOptions"), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200770 BuiltinOperator.UNPACK: (Op.Unpack, OptionsSerializer("UnpackOptions", ("axis", "num")), TFLITE_IFM_INDICES),
771 BuiltinOperator.REDUCE_MIN: (Op.Min, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200772 BuiltinOperator.FLOOR_DIV: (Op.FloorDiv, OptionsSerializer("FloorDivOptions"), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200773 BuiltinOperator.REDUCE_ANY: (Op.Any, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200774 BuiltinOperator.SQUARE: (Op.Square, OptionsSerializer("SquareOptions"), TFLITE_NO_INDICES),
775 BuiltinOperator.ZEROS_LIKE: (Op.ZerosLike, OptionsSerializer("ZerosLikeOptions"), TFLITE_NO_INDICES),
776 BuiltinOperator.FILL: (Op.Fill, OptionsSerializer("FillOptions"), TFLITE_NO_INDICES),
777 BuiltinOperator.FLOOR_MOD: (Op.FloorMod, OptionsSerializer("FloorModOptions"), TFLITE_NO_INDICES),
778 BuiltinOperator.RANGE: (Op.Range, OptionsSerializer("RangeOptions"), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100779 BuiltinOperator.RESIZE_NEAREST_NEIGHBOR: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200780 Op.ResizeNearestNeighbor,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200781 OptionsSerializer("ResizeNearestNeighborOptions", ("align_corners", "half_pixel_centers")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200782 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100783 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200784 BuiltinOperator.LEAKY_RELU: (Op.LeakyRelu, OptionsSerializer("LeakyReluOptions", ("alpha",)), TFLITE_IFM_INDICES),
785 BuiltinOperator.SQUARED_DIFFERENCE: (
786 Op.SquaredDifference,
787 OptionsSerializer("SquaredDifferenceOptions"),
788 TFLITE_NO_INDICES,
789 ),
790 BuiltinOperator.MIRROR_PAD: (Op.MirrorPad, OptionsSerializer("MirrorPadOptions", ("mode",)), TFLITE_NO_INDICES),
791 BuiltinOperator.ABS: (Op.Abs, OptionsSerializer("AbsOptions"), TFLITE_IFM_INDICES),
792 BuiltinOperator.SPLIT_V: (Op.SplitV, OptionsSerializer("SplitVOptions", ("num_splits",)), TFLITE_IFM_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100793 BuiltinOperator.UNIQUE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200794 Op.Unique,
Tim Hall79d07d22020-04-27 18:20:16 +0100795 OptionsSerializer("UniqueOptions", (("idx_out_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200796 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100797 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200798 BuiltinOperator.CEIL: (Op.Ceil, None, TFLITE_NO_INDICES),
799 BuiltinOperator.REVERSE_V2: (Op.ReverseV2, OptionsSerializer("ReverseV2Options"), TFLITE_NO_INDICES),
800 BuiltinOperator.ADD_N: (Op.AddN, OptionsSerializer("AddNOptions"), TFLITE_NO_INDICES),
801 BuiltinOperator.GATHER_ND: (Op.GatherNd, OptionsSerializer("GatherNdOptions"), TFLITE_NO_INDICES),
802 BuiltinOperator.COS: (Op.Cos, OptionsSerializer("CosOptions"), TFLITE_NO_INDICES),
803 BuiltinOperator.WHERE: (Op.Where, OptionsSerializer("WhereOptions"), TFLITE_NO_INDICES),
804 BuiltinOperator.RANK: (Op.Rank, OptionsSerializer("RankOptions"), TFLITE_NO_INDICES),
805 BuiltinOperator.ELU: (Op.Elu, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100806 BuiltinOperator.REVERSE_SEQUENCE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200807 Op.ReverseSequence,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200808 OptionsSerializer("ReverseSequenceOptions", ("batch_dim", "seq_dim")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200809 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100810 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200811 BuiltinOperator.MATRIX_DIAG: (Op.MatrixDiag, OptionsSerializer("MatrixDiagOptions"), TFLITE_NO_INDICES),
812 BuiltinOperator.QUANTIZE: (Op.Quantize, OptionsSerializer("QuantizeOptions"), TFLITE_IFM_INDICES),
813 BuiltinOperator.MATRIX_SET_DIAG: (Op.MatrixSetDiag, OptionsSerializer("MatrixSetDiagOptions"), TFLITE_NO_INDICES),
814 BuiltinOperator.ROUND: (Op.Round, None, TFLITE_NO_INDICES),
815 BuiltinOperator.HARD_SWISH: (Op.HardSwish, OptionsSerializer("HardSwishOptions"), TFLITE_IFM_INDICES),
816 BuiltinOperator.IF: (
817 Op.If,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200818 OptionsSerializer("IfOptions", ("else_subgraph_index", "then_subgraph_index")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200819 TFLITE_NO_INDICES,
820 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200821 BuiltinOperator.WHILE: (
822 Op.While,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200823 OptionsSerializer("WhileOptions", ("body_subgraph_index", "cond_subgraph_index")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200824 TFLITE_NO_INDICES,
Louis Verhaardaee5d752020-09-30 09:01:52 +0200825 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200826 BuiltinOperator.NON_MAX_SUPPRESSION_V4: (
827 Op.NonMaxSuppressionV4,
828 OptionsSerializer("NonMaxSuppressionV4Options"),
829 TFLITE_NO_INDICES,
830 ),
831 BuiltinOperator.NON_MAX_SUPPRESSION_V5: (
832 Op.NonMaxSuppressionV5,
833 OptionsSerializer("NonMaxSuppressionV5Options"),
834 TFLITE_NO_INDICES,
835 ),
836 BuiltinOperator.SCATTER_ND: (Op.ScatterNd, OptionsSerializer("ScatterNdOptions"), TFLITE_NO_INDICES),
837 BuiltinOperator.SELECT_V2: (Op.SelectV2, OptionsSerializer("SelectV2Options"), TFLITE_NO_INDICES),
838 BuiltinOperator.DENSIFY: (Op.Densify, OptionsSerializer("DensifyOptions"), TFLITE_NO_INDICES),
839 BuiltinOperator.SEGMENT_SUM: (Op.SegmentSum, OptionsSerializer("SegmentSumOptions"), TFLITE_NO_INDICES),
840 BuiltinOperator.BATCH_MATMUL: (
841 Op.BatchMatMul,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200842 OptionsSerializer("BatchMatMulOptions", ("adj_x", "adj_y", "asymmetric_quantize_inputs")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200843 TFLITE_NO_INDICES,
844 ),
845 BuiltinOperator.CUMSUM: (
846 Op.Cumsum,
847 OptionsSerializer("CumsumOptions", ("exclusive", "reverse")),
848 TFLITE_NO_INDICES,
849 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200850 BuiltinOperator.CALL_ONCE: (
851 Op.CallOnce,
852 OptionsSerializer("CallOnceOptions", ("init_subgraph_index",)),
853 TFLITE_NO_INDICES,
854 ),
855 BuiltinOperator.BROADCAST_TO: (Op.BroadcastTo, OptionsSerializer("BroadcastToOptions"), TFLITE_NO_INDICES),
856 BuiltinOperator.RFFT2D: (Op.Rfft2D, OptionsSerializer("Rfft2dOptions"), TFLITE_NO_INDICES),
857 BuiltinOperator.CONV_3D: (
858 Op.Conv3D,
859 OptionsSerializer(
860 "Conv3DOptions",
861 (
862 "dilation_d_factor",
863 "dilation_h_factor",
864 "dilation_w_factor",
865 fused_act,
866 padding,
867 "stride_d",
868 "stride_h",
869 "stride_w",
870 ),
871 ),
872 TFLITE_NO_INDICES,
873 ),
874 BuiltinOperator.IMAG: (Op.Imag, None, TFLITE_NO_INDICES),
875 BuiltinOperator.REAL: (Op.Real, None, TFLITE_NO_INDICES),
876 BuiltinOperator.COMPLEX_ABS: (Op.ComplexAbs, None, TFLITE_NO_INDICES),
877 BuiltinOperator.HASHTABLE: (
878 Op.Hashtable,
879 OptionsSerializer("HashtableOptions", ("key_dtype", "table_id", "value_dtype")),
880 TFLITE_NO_INDICES,
881 ),
882 BuiltinOperator.HASHTABLE_FIND: (Op.HashtableFind, OptionsSerializer("HashtableFindOptions"), TFLITE_NO_INDICES),
883 BuiltinOperator.HASHTABLE_IMPORT: (
884 Op.HashtableImport,
885 OptionsSerializer("HashtableImportOptions"),
886 TFLITE_NO_INDICES,
887 ),
888 BuiltinOperator.HASHTABLE_SIZE: (Op.HashtableSize, OptionsSerializer("HashtableSizeOptions"), TFLITE_NO_INDICES),
889 BuiltinOperator.REDUCE_ALL: (Op.ReduceAll, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
890 BuiltinOperator.CONV_3D_TRANSPOSE: (
891 Op.Conv3DTranspose,
892 OptionsSerializer(
893 "Conv3DOptions",
894 (
895 "dilation_d_factor",
896 "dilation_h_factor",
897 "dilation_w_factor",
898 fused_act,
899 padding,
900 "stride_d",
901 "stride_h",
902 "stride_w",
903 ),
904 ),
905 TFLITE_NO_INDICES,
906 ),
Tim Hallb94bcd42021-09-07 14:24:51 +0100907 BuiltinOperator.CUSTOM: (Op.Custom, CustomOptionsSerializer(), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100908}
909
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200910builtin_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 +0100911
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200912builtin_operator_inv_map[Op.CustomNpuOp] = (BuiltinOperator.CUSTOM, CustomOptionsSerializer(), TFLITE_NO_INDICES)
Michael McGeagh219ec072020-11-09 11:11:26 +0000913
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000914BUILTIN_OPERATOR_UNKNOWN = "UNKNOWN"
915
916
917def builtin_type_name(builtin):
918 return next(k for k, v in vars(BuiltinOperator).items() if v == builtin)
919
Michael McGeagh219ec072020-11-09 11:11:26 +0000920
921def optype_to_builtintype(op_type):
922 if op_type in builtin_operator_inv_map:
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000923 return builtin_type_name(builtin_operator_inv_map[op_type][0])
Michael McGeagh219ec072020-11-09 11:11:26 +0000924 else:
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000925 return BUILTIN_OPERATOR_UNKNOWN