blob: 7b487ae47c594be7d2edb402a4ec61832c926c15 [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
Rickard Bolin2de898a2021-12-20 08:35:23 +000034from .tflite import AssignVariableOptions
Jacob Bohlin8daf6b72020-09-15 16:28:35 +020035from .tflite import BatchMatMulOptions
Diego Russoe8a10452020-04-21 17:39:10 +010036from .tflite import BatchToSpaceNDOptions
Tim Hall79d07d22020-04-27 18:20:16 +010037from .tflite import BidirectionalSequenceLSTMOptions
38from .tflite import BidirectionalSequenceRNNOptions
Dwight Lidman8a12da12021-07-19 13:43:05 +020039from .tflite import BroadcastToOptions
Rickard Bolind66f8012022-04-21 07:36:55 +000040from .tflite import BucketizeOptions
Dwight Lidman8a12da12021-07-19 13:43:05 +020041from .tflite import CallOnceOptions
Diego Russoe8a10452020-04-21 17:39:10 +010042from .tflite import CallOptions
43from .tflite import CastOptions
44from .tflite import ConcatEmbeddingsOptions
45from .tflite import ConcatenationOptions
46from .tflite import Conv2DOptions
Dwight Lidman8a12da12021-07-19 13:43:05 +020047from .tflite import Conv3DOptions
Tim Hall79d07d22020-04-27 18:20:16 +010048from .tflite import CosOptions
Tim Hall42abec12021-02-04 21:31:57 +000049from .tflite import CumsumOptions
Tim Hall79d07d22020-04-27 18:20:16 +010050from .tflite import DensifyOptions
51from .tflite import DepthToSpaceOptions
Diego Russoe8a10452020-04-21 17:39:10 +010052from .tflite import DepthwiseConv2DOptions
53from .tflite import DequantizeOptions
54from .tflite import DivOptions
Rickard Bolind66f8012022-04-21 07:36:55 +000055from .tflite import DynamicUpdateSliceOptions
Diego Russoe8a10452020-04-21 17:39:10 +010056from .tflite import EmbeddingLookupSparseOptions
57from .tflite import EqualOptions
58from .tflite import ExpandDimsOptions
59from .tflite import ExpOptions
60from .tflite import FakeQuantOptions
61from .tflite import FillOptions
62from .tflite import FloorDivOptions
63from .tflite import FloorModOptions
64from .tflite import FullyConnectedOptions
65from .tflite import GatherNdOptions
66from .tflite import GatherOptions
Rickard Bolind66f8012022-04-21 07:36:55 +000067from .tflite import GeluOptions
Diego Russoe8a10452020-04-21 17:39:10 +010068from .tflite import GreaterEqualOptions
69from .tflite import GreaterOptions
Louis Verhaard678645b2020-06-15 15:22:47 +020070from .tflite import HardSwishOptions
Dwight Lidman8a12da12021-07-19 13:43:05 +020071from .tflite import HashtableFindOptions
72from .tflite import HashtableImportOptions
73from .tflite import HashtableOptions
74from .tflite import HashtableSizeOptions
Tim Hall79d07d22020-04-27 18:20:16 +010075from .tflite import IfOptions
Diego Russoe8a10452020-04-21 17:39:10 +010076from .tflite import L2NormOptions
77from .tflite import LeakyReluOptions
78from .tflite import LessEqualOptions
79from .tflite import LessOptions
80from .tflite import LocalResponseNormalizationOptions
81from .tflite import LogicalAndOptions
82from .tflite import LogicalNotOptions
83from .tflite import LogicalOrOptions
84from .tflite import LogSoftmaxOptions
85from .tflite import LSHProjectionOptions
86from .tflite import LSTMOptions
87from .tflite import MatrixDiagOptions
88from .tflite import MatrixSetDiagOptions
89from .tflite import MaximumMinimumOptions
90from .tflite import MirrorPadOptions
91from .tflite import MulOptions
92from .tflite import NegOptions
Tim Hall79d07d22020-04-27 18:20:16 +010093from .tflite import NonMaxSuppressionV4Options
94from .tflite import NonMaxSuppressionV5Options
Diego Russoe8a10452020-04-21 17:39:10 +010095from .tflite import NotEqualOptions
96from .tflite import OneHotOptions
97from .tflite import PackOptions
98from .tflite import PadOptions
99from .tflite import PadV2Options
100from .tflite import Pool2DOptions
101from .tflite import PowOptions
102from .tflite import QuantizeOptions
Rickard Bolin2de898a2021-12-20 08:35:23 +0000103from .tflite import RandomOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100104from .tflite import RangeOptions
105from .tflite import RankOptions
Rickard Bolin2de898a2021-12-20 08:35:23 +0000106from .tflite import ReadVariableOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100107from .tflite import ReducerOptions
108from .tflite import ReshapeOptions
109from .tflite import ResizeBilinearOptions
110from .tflite import ResizeNearestNeighborOptions
111from .tflite import ReverseSequenceOptions
112from .tflite import ReverseV2Options
Dwight Lidman8a12da12021-07-19 13:43:05 +0200113from .tflite import Rfft2dOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100114from .tflite import RNNOptions
Tim Hall79d07d22020-04-27 18:20:16 +0100115from .tflite import ScatterNdOptions
116from .tflite import SegmentSumOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100117from .tflite import SelectOptions
Tim Hall79d07d22020-04-27 18:20:16 +0100118from .tflite import SelectV2Options
Diego Russoe8a10452020-04-21 17:39:10 +0100119from .tflite import SequenceRNNOptions
120from .tflite import ShapeOptions
121from .tflite import SkipGramOptions
122from .tflite import SliceOptions
123from .tflite import SoftmaxOptions
124from .tflite import SpaceToBatchNDOptions
125from .tflite import SpaceToDepthOptions
126from .tflite import SparseToDenseOptions
127from .tflite import SplitOptions
128from .tflite import SplitVOptions
129from .tflite import SquaredDifferenceOptions
130from .tflite import SquareOptions
131from .tflite import SqueezeOptions
132from .tflite import StridedSliceOptions
133from .tflite import SubOptions
134from .tflite import SVDFOptions
135from .tflite import TileOptions
136from .tflite import TopKV2Options
137from .tflite import TransposeConvOptions
138from .tflite import TransposeOptions
139from .tflite import UnidirectionalSequenceLSTMOptions
140from .tflite import UniqueOptions
141from .tflite import UnpackOptions
Rickard Bolin2de898a2021-12-20 08:35:23 +0000142from .tflite import VarHandleOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100143from .tflite import WhereOptions
Tim Hall79d07d22020-04-27 18:20:16 +0100144from .tflite import WhileOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100145from .tflite import ZerosLikeOptions
146from .tflite.ActivationFunctionType import ActivationFunctionType
Diego Russoea6111a2020-04-14 18:41:58 +0100147from .tflite.BuiltinOperator import BuiltinOperator
148from .tflite.BuiltinOptions import BuiltinOptions
149from .tflite.Padding import Padding
Diego Russoe8a10452020-04-21 17:39:10 +0100150from .tflite.TensorType import TensorType
Tim Hall79d07d22020-04-27 18:20:16 +0100151
152
153def inverse_map(map):
154 return {v: k for k, v in map.items()}
155
156
157datatype_map = {
158 TensorType.UINT8: DataType.uint8,
159 TensorType.INT8: DataType.int8,
160 TensorType.INT16: DataType.int16,
161 TensorType.INT32: DataType.int32,
162 TensorType.INT64: DataType.int64,
163 TensorType.FLOAT16: DataType.float16,
164 TensorType.FLOAT32: DataType.float32,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200165 TensorType.FLOAT64: DataType.float64,
Tim Hall79d07d22020-04-27 18:20:16 +0100166 TensorType.STRING: DataType.string,
167 TensorType.BOOL: DataType.bool,
Jacob Bohlinf767b932020-08-13 15:32:45 +0200168 TensorType.COMPLEX64: DataType.complex64,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200169 TensorType.COMPLEX128: DataType.complex128,
Dwight Lidmanf53b3322021-10-08 11:58:08 +0200170 TensorType.UINT64: DataType.uint64,
171 TensorType.RESOURCE: DataType.resource,
172 TensorType.VARIANT: DataType.variant,
173 TensorType.UINT32: DataType.uint32,
Rickard Bolind66f8012022-04-21 07:36:55 +0000174 TensorType.UINT16: DataType.uint16,
Tim Hall79d07d22020-04-27 18:20:16 +0100175}
176
177datatype_inv_map = inverse_map(datatype_map)
178datatype_inv_map[DataType.quint8] = TensorType.UINT8
179
180datatype_inv_map[DataType.qint8] = TensorType.INT8
181datatype_inv_map[DataType.qint16] = TensorType.INT16
182datatype_inv_map[DataType.qint32] = TensorType.INT32
183
184
185datatype_map_numpy = {
186 TensorType.UINT8: np.uint8,
Rickard Bolind66f8012022-04-21 07:36:55 +0000187 TensorType.UINT16: np.uint16,
Dwight Lidmanf53b3322021-10-08 11:58:08 +0200188 TensorType.UINT32: np.uint32,
189 TensorType.UINT64: np.uint64,
Tim Hall79d07d22020-04-27 18:20:16 +0100190 TensorType.INT8: np.int8,
191 TensorType.INT16: np.int16,
192 TensorType.INT32: np.int32,
193 TensorType.INT64: np.int64,
194 TensorType.FLOAT16: np.float16,
195 TensorType.FLOAT32: np.float32,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200196 TensorType.FLOAT64: np.float64,
Tim Hall79d07d22020-04-27 18:20:16 +0100197 TensorType.BOOL: np.bool,
Jacob Bohlinf767b932020-08-13 15:32:45 +0200198 TensorType.COMPLEX64: np.complex64,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200199 TensorType.COMPLEX128: np.complex128,
Louis Verhaardf4e12be2020-12-18 14:23:06 +0100200 TensorType.STRING: np.uint8,
Dwight Lidmanf53b3322021-10-08 11:58:08 +0200201 TensorType.RESOURCE: None, # experimental type
202 TensorType.VARIANT: None, # experimental type
Tim Hall79d07d22020-04-27 18:20:16 +0100203}
204
205
206builtin_options_map = {
207 BuiltinOptions.Conv2DOptions: Conv2DOptions.Conv2DOptions,
208 BuiltinOptions.DepthwiseConv2DOptions: DepthwiseConv2DOptions.DepthwiseConv2DOptions,
209 BuiltinOptions.ConcatEmbeddingsOptions: ConcatEmbeddingsOptions.ConcatEmbeddingsOptions,
210 BuiltinOptions.LSHProjectionOptions: LSHProjectionOptions.LSHProjectionOptions,
211 BuiltinOptions.Pool2DOptions: Pool2DOptions.Pool2DOptions,
212 BuiltinOptions.SVDFOptions: SVDFOptions.SVDFOptions,
213 BuiltinOptions.RNNOptions: RNNOptions.RNNOptions,
214 BuiltinOptions.FullyConnectedOptions: FullyConnectedOptions.FullyConnectedOptions,
215 BuiltinOptions.SoftmaxOptions: SoftmaxOptions.SoftmaxOptions,
216 BuiltinOptions.ConcatenationOptions: ConcatenationOptions.ConcatenationOptions,
217 BuiltinOptions.AddOptions: AddOptions.AddOptions,
218 BuiltinOptions.L2NormOptions: L2NormOptions.L2NormOptions,
219 BuiltinOptions.LocalResponseNormalizationOptions: LocalResponseNormalizationOptions.LocalResponseNormalizationOptions, # noqa: E501
220 BuiltinOptions.LSTMOptions: LSTMOptions.LSTMOptions,
221 BuiltinOptions.ResizeBilinearOptions: ResizeBilinearOptions.ResizeBilinearOptions,
222 BuiltinOptions.CallOptions: CallOptions.CallOptions,
223 BuiltinOptions.ReshapeOptions: ReshapeOptions.ReshapeOptions,
224 BuiltinOptions.SkipGramOptions: SkipGramOptions.SkipGramOptions,
225 BuiltinOptions.SpaceToDepthOptions: SpaceToDepthOptions.SpaceToDepthOptions,
226 BuiltinOptions.EmbeddingLookupSparseOptions: EmbeddingLookupSparseOptions.EmbeddingLookupSparseOptions,
227 BuiltinOptions.MulOptions: MulOptions.MulOptions,
228 BuiltinOptions.PadOptions: PadOptions.PadOptions,
229 BuiltinOptions.GatherOptions: GatherOptions.GatherOptions,
230 BuiltinOptions.BatchToSpaceNDOptions: BatchToSpaceNDOptions.BatchToSpaceNDOptions,
231 BuiltinOptions.SpaceToBatchNDOptions: SpaceToBatchNDOptions.SpaceToBatchNDOptions,
232 BuiltinOptions.TransposeOptions: TransposeOptions.TransposeOptions,
233 BuiltinOptions.ReducerOptions: ReducerOptions.ReducerOptions,
234 BuiltinOptions.SubOptions: SubOptions.SubOptions,
235 BuiltinOptions.DivOptions: DivOptions.DivOptions,
236 BuiltinOptions.SqueezeOptions: SqueezeOptions.SqueezeOptions,
237 BuiltinOptions.SequenceRNNOptions: SequenceRNNOptions.SequenceRNNOptions,
238 BuiltinOptions.StridedSliceOptions: StridedSliceOptions.StridedSliceOptions,
239 BuiltinOptions.ExpOptions: ExpOptions.ExpOptions,
240 BuiltinOptions.TopKV2Options: TopKV2Options.TopKV2Options,
241 BuiltinOptions.SplitOptions: SplitOptions.SplitOptions,
242 BuiltinOptions.LogSoftmaxOptions: LogSoftmaxOptions.LogSoftmaxOptions,
243 BuiltinOptions.CastOptions: CastOptions.CastOptions,
244 BuiltinOptions.DequantizeOptions: DequantizeOptions.DequantizeOptions,
245 BuiltinOptions.MaximumMinimumOptions: MaximumMinimumOptions.MaximumMinimumOptions,
246 BuiltinOptions.ArgMaxOptions: ArgMaxOptions.ArgMaxOptions,
247 BuiltinOptions.LessOptions: LessOptions.LessOptions,
248 BuiltinOptions.NegOptions: NegOptions.NegOptions,
249 BuiltinOptions.PadV2Options: PadV2Options.PadV2Options,
250 BuiltinOptions.GreaterOptions: GreaterOptions.GreaterOptions,
251 BuiltinOptions.GreaterEqualOptions: GreaterEqualOptions.GreaterEqualOptions,
252 BuiltinOptions.LessEqualOptions: LessEqualOptions.LessEqualOptions,
253 BuiltinOptions.SelectOptions: SelectOptions.SelectOptions,
254 BuiltinOptions.SliceOptions: SliceOptions.SliceOptions,
255 BuiltinOptions.TransposeConvOptions: TransposeConvOptions.TransposeConvOptions,
256 BuiltinOptions.SparseToDenseOptions: SparseToDenseOptions.SparseToDenseOptions,
257 BuiltinOptions.TileOptions: TileOptions.TileOptions,
258 BuiltinOptions.ExpandDimsOptions: ExpandDimsOptions.ExpandDimsOptions,
259 BuiltinOptions.EqualOptions: EqualOptions.EqualOptions,
260 BuiltinOptions.NotEqualOptions: NotEqualOptions.NotEqualOptions,
261 BuiltinOptions.ShapeOptions: ShapeOptions.ShapeOptions,
262 BuiltinOptions.PowOptions: PowOptions.PowOptions,
263 BuiltinOptions.ArgMinOptions: ArgMinOptions.ArgMinOptions,
264 BuiltinOptions.FakeQuantOptions: FakeQuantOptions.FakeQuantOptions,
265 BuiltinOptions.PackOptions: PackOptions.PackOptions,
266 BuiltinOptions.LogicalOrOptions: LogicalOrOptions.LogicalOrOptions,
267 BuiltinOptions.OneHotOptions: OneHotOptions.OneHotOptions,
268 BuiltinOptions.LogicalAndOptions: LogicalAndOptions.LogicalAndOptions,
269 BuiltinOptions.LogicalNotOptions: LogicalNotOptions.LogicalNotOptions,
270 BuiltinOptions.UnpackOptions: UnpackOptions.UnpackOptions,
271 BuiltinOptions.FloorDivOptions: FloorDivOptions.FloorDivOptions,
272 BuiltinOptions.SquareOptions: SquareOptions.SquareOptions,
273 BuiltinOptions.ZerosLikeOptions: ZerosLikeOptions.ZerosLikeOptions,
274 BuiltinOptions.FillOptions: FillOptions.FillOptions,
275 BuiltinOptions.BidirectionalSequenceLSTMOptions: BidirectionalSequenceLSTMOptions.BidirectionalSequenceLSTMOptions,
276 BuiltinOptions.BidirectionalSequenceRNNOptions: BidirectionalSequenceRNNOptions.BidirectionalSequenceRNNOptions,
277 BuiltinOptions.UnidirectionalSequenceLSTMOptions: UnidirectionalSequenceLSTMOptions.UnidirectionalSequenceLSTMOptions, # noqa: E501
278 BuiltinOptions.FloorModOptions: FloorModOptions.FloorModOptions,
279 BuiltinOptions.RangeOptions: RangeOptions.RangeOptions,
280 BuiltinOptions.ResizeNearestNeighborOptions: ResizeNearestNeighborOptions.ResizeNearestNeighborOptions,
281 BuiltinOptions.LeakyReluOptions: LeakyReluOptions.LeakyReluOptions,
282 BuiltinOptions.SquaredDifferenceOptions: SquaredDifferenceOptions.SquaredDifferenceOptions,
283 BuiltinOptions.MirrorPadOptions: MirrorPadOptions.MirrorPadOptions,
284 BuiltinOptions.AbsOptions: AbsOptions.AbsOptions,
285 BuiltinOptions.SplitVOptions: SplitVOptions.SplitVOptions,
286 BuiltinOptions.UniqueOptions: UniqueOptions.UniqueOptions,
287 BuiltinOptions.ReverseV2Options: ReverseV2Options.ReverseV2Options,
288 BuiltinOptions.AddNOptions: AddNOptions.AddNOptions,
289 BuiltinOptions.GatherNdOptions: GatherNdOptions.GatherNdOptions,
290 BuiltinOptions.CosOptions: CosOptions.CosOptions,
291 BuiltinOptions.WhereOptions: WhereOptions.WhereOptions,
292 BuiltinOptions.RankOptions: RankOptions.RankOptions,
293 BuiltinOptions.ReverseSequenceOptions: ReverseSequenceOptions.ReverseSequenceOptions,
294 BuiltinOptions.MatrixDiagOptions: MatrixDiagOptions.MatrixDiagOptions,
295 BuiltinOptions.QuantizeOptions: QuantizeOptions.QuantizeOptions,
296 BuiltinOptions.MatrixSetDiagOptions: MatrixSetDiagOptions.MatrixSetDiagOptions,
297 BuiltinOptions.DensifyOptions: DensifyOptions.DensifyOptions,
298 BuiltinOptions.DepthToSpaceOptions: DepthToSpaceOptions.DepthToSpaceOptions,
Louis Verhaard678645b2020-06-15 15:22:47 +0200299 BuiltinOptions.HardSwishOptions: HardSwishOptions.HardSwishOptions,
Tim Hall79d07d22020-04-27 18:20:16 +0100300 BuiltinOptions.IfOptions: IfOptions.IfOptions,
301 BuiltinOptions.NonMaxSuppressionV4Options: NonMaxSuppressionV4Options.NonMaxSuppressionV4Options,
302 BuiltinOptions.NonMaxSuppressionV5Options: NonMaxSuppressionV5Options.NonMaxSuppressionV5Options,
303 BuiltinOptions.ScatterNdOptions: ScatterNdOptions.ScatterNdOptions,
304 BuiltinOptions.SegmentSumOptions: SegmentSumOptions.SegmentSumOptions,
305 BuiltinOptions.SelectV2Options: SelectV2Options.SelectV2Options,
306 BuiltinOptions.WhileOptions: WhileOptions.WhileOptions,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200307 BuiltinOptions.BatchMatMulOptions: BatchMatMulOptions.BatchMatMulOptions,
Tim Hall42abec12021-02-04 21:31:57 +0000308 BuiltinOptions.CumsumOptions: CumsumOptions.CumsumOptions,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200309 BuiltinOptions.CallOnceOptions: CallOnceOptions.CallOnceOptions,
310 BuiltinOptions.BroadcastToOptions: BroadcastToOptions.BroadcastToOptions,
311 BuiltinOptions.Rfft2dOptions: Rfft2dOptions.Rfft2dOptions,
312 BuiltinOptions.Conv3DOptions: Conv3DOptions.Conv3DOptions,
313 BuiltinOptions.HashtableOptions: HashtableOptions.HashtableOptions,
314 BuiltinOptions.HashtableFindOptions: HashtableFindOptions.HashtableFindOptions,
315 BuiltinOptions.HashtableImportOptions: HashtableImportOptions.HashtableImportOptions,
316 BuiltinOptions.HashtableSizeOptions: HashtableSizeOptions.HashtableSizeOptions,
Rickard Bolin2de898a2021-12-20 08:35:23 +0000317 BuiltinOptions.VarHandleOptions: VarHandleOptions.VarHandleOptions,
318 BuiltinOptions.ReadVariableOptions: ReadVariableOptions.ReadVariableOptions,
319 BuiltinOptions.AssignVariableOptions: AssignVariableOptions.AssignVariableOptions,
320 BuiltinOptions.RandomOptions: RandomOptions.RandomOptions,
Rickard Bolind66f8012022-04-21 07:36:55 +0000321 BuiltinOptions.BucketizeOptions: BucketizeOptions.BucketizeOptions,
322 BuiltinOptions.DynamicUpdateSliceOptions: DynamicUpdateSliceOptions.DynamicUpdateSliceOptions,
323 BuiltinOptions.GeluOptions: GeluOptions.GeluOptions,
Tim Hall79d07d22020-04-27 18:20:16 +0100324}
325
Rickard Bolin2de898a2021-12-20 08:35:23 +0000326
Tim Hall79d07d22020-04-27 18:20:16 +0100327builtin_options_inv_map = inverse_map(builtin_options_map)
328
329
330def underscore_to_camel_case(s):
331 return "".join(x.title() for x in s.split("_"))
332
333
334def padding_deserialize(x):
335 return padding_map[x]
336
337
338def padding_serialize(builder, x):
339 return padding_inv_map[x]
340
341
342def activation_deserialize(x):
343 return activation_function_map[x]
344
345
346def activation_serialize(builder, x):
347 return activation_function_inv_map[x]
348
349
350def datatype_deserialize(x):
351 return datatype_map[x]
352
353
354def datatype_serialize(builder, x):
355 return datatype_inv_map[x]
356
357
358def identity(x):
359 return x
360
361
362def identity_serialize(builder, x):
363 return x
364
365
366def write_byte_vector(builder, v):
367 builder.StartVector(1, len(v), 1)
368 for e in v[::-1]:
369 builder.PrependByte(e)
370 return builder.EndVector(len(v))
371
372
373def write_int_vector(builder, v):
374 builder.StartVector(4, len(v), 4)
375 for e in v[::-1]:
376 builder.PrependInt32(e)
377 return builder.EndVector(len(v))
378
379
380class OptionsSerializer:
Michael McGeagh6f725262020-12-03 15:21:36 +0000381 def __init__(self, name, members=None):
Tim Hall79d07d22020-04-27 18:20:16 +0100382 self.name = name
383 self.module = globals()[self.name]
384 self.cls = getattr(self.module, self.name)
385 self.builtin_opt_type = builtin_options_inv_map[self.cls]
Tim Hall79d07d22020-04-27 18:20:16 +0100386 self.members = []
Michael McGeagh6f725262020-12-03 15:21:36 +0000387 if members is not None:
388 for mem in members:
389 deserialize = identity
390 serialize = identity_serialize
391 is_vector = False
392 if isinstance(mem, tuple):
393 if len(mem) == 3:
394 mem, deserialize, serialize = mem
395 elif len(mem) == 2:
396 mem, is_vector = mem
397 deserialize = tuple
398 serialize = write_int_vector
399 else:
400 assert 0
401 underscore_mem = mem
402 camelcase_mem = underscore_to_camel_case(mem)
403 self.members.append((underscore_mem, camelcase_mem, deserialize, serialize, is_vector))
Tim Hall79d07d22020-04-27 18:20:16 +0100404
Tim Hallc8310b12020-06-17 14:53:11 +0100405 def deserialize(self, op_data):
406 builtin_options = op_data.BuiltinOptions()
Tim Hall79d07d22020-04-27 18:20:16 +0100407 attrs = {}
Tim Hallc8310b12020-06-17 14:53:11 +0100408 if builtin_options:
Tim Hall79d07d22020-04-27 18:20:16 +0100409 tfattrs = self.cls()
Tim Hallc8310b12020-06-17 14:53:11 +0100410 tfattrs.Init(builtin_options.Bytes, builtin_options.Pos)
Tim Hall79d07d22020-04-27 18:20:16 +0100411 for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members:
412 fun = camelcase_mem
413 if is_vector:
414 fun += "AsNumpy"
415
Fredrik Svedberg4bb989b2020-11-16 15:32:25 +0100416 attr = getattr(tfattrs, fun)()
417 try:
418 attrs[underscore_mem] = deserialize(attr)
419 except TypeError:
420 print("Warning: {0} could not read attribute '{1}'.".format(self.name, underscore_mem))
421
Tim Hall79d07d22020-04-27 18:20:16 +0100422 return attrs
423
424 def serialize(self, builder, attrs):
425 ser_attrs = []
426 for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members:
427 a = serialize(builder, attrs[underscore_mem])
428 ser_attrs.append((camelcase_mem, a))
429
430 getattr(self.module, self.name + "Start")(builder)
431
432 for camelcase_mem, a in ser_attrs:
433 getattr(self.module, self.name + "Add" + camelcase_mem)(builder, a)
434
435 return getattr(self.module, self.name + "End")(builder), None
436
437
438class CustomOptionsSerializer:
Tim Hallc8310b12020-06-17 14:53:11 +0100439 CUSTOM_OPTIONS_NPU_OP = [0x01, 0x04, 0x01] # NpuOp=1, FlexbufferFormat.UINT8=4, byte length=1
440 CUSTOM_OPTIONS_FORMAT_DEFAULT = 0
441
Tim Hall79d07d22020-04-27 18:20:16 +0100442 def __init__(self):
Tim Hall79d07d22020-04-27 18:20:16 +0100443 self.custom_opt_format = 0
444
Tim Hallc8310b12020-06-17 14:53:11 +0100445 def deserialize(self, op_data):
Tim Hall79d07d22020-04-27 18:20:16 +0100446 attrs = {}
Tim Hallc8310b12020-06-17 14:53:11 +0100447 custom_options = op_data.CustomOptionsAsNumpy()
448 attrs["custom_options"] = custom_options
449 attrs["custom_options_format"] = op_data.CustomOptionsFormat()
450
451 if np.array_equal(custom_options, self.CUSTOM_OPTIONS_NPU_OP):
Louis Verhaardaee5d752020-09-30 09:01:52 +0200452 attrs["custom_type"] = CustomType.ExistingNpuOp
Tim Hallc8310b12020-06-17 14:53:11 +0100453
Tim Hall79d07d22020-04-27 18:20:16 +0100454 return attrs
455
456 def serialize(self, builder, attrs):
Louis Verhaardaee5d752020-09-30 09:01:52 +0200457 custom_type = attrs.get("custom_type", CustomType.ThirdPartyOp)
Tim Hallc8310b12020-06-17 14:53:11 +0100458 self.custom_opt_format = attrs.get("custom_options_format", self.CUSTOM_OPTIONS_FORMAT_DEFAULT)
Tim Hall79d07d22020-04-27 18:20:16 +0100459
460 # Set NPU op custom options for the TensorFlow Lite custom operator
Louis Verhaardaee5d752020-09-30 09:01:52 +0200461 if custom_type == CustomType.NpuOp:
Tim Hallc8310b12020-06-17 14:53:11 +0100462 custom_options = self.CUSTOM_OPTIONS_NPU_OP
463 else:
464 custom_options = attrs.get("custom_options", [])
Tim Hall79d07d22020-04-27 18:20:16 +0100465
Tim Hallc8310b12020-06-17 14:53:11 +0100466 custom_options_bytes = struct.pack("<{0}B".format(len(custom_options)), *custom_options)
467 custom_offset = write_byte_vector(builder, custom_options_bytes)
Tim Hall79d07d22020-04-27 18:20:16 +0100468
469 return None, custom_offset
470
471
472padding_map = {
Michael McGeagh16895482020-12-14 15:51:20 +0000473 Padding.SAME: opPad.SAME,
474 Padding.VALID: opPad.VALID,
Tim Hall79d07d22020-04-27 18:20:16 +0100475}
476
477padding_inv_map = inverse_map(padding_map)
478
479
480activation_function_map = {
481 ActivationFunctionType.NONE: None,
Louis Verhaardaee5d752020-09-30 09:01:52 +0200482 ActivationFunctionType.RELU: Op.Relu,
483 ActivationFunctionType.RELU_N1_TO_1: Op.ReluN1To1,
484 ActivationFunctionType.RELU6: Op.Relu6,
485 ActivationFunctionType.TANH: Op.Tanh,
486 ActivationFunctionType.SIGN_BIT: Op.SignBit,
Tim Hall79d07d22020-04-27 18:20:16 +0100487}
488
489activation_function_inv_map = inverse_map(activation_function_map)
490
491fused_act = ("fused_activation_function", activation_deserialize, activation_serialize)
492padding = ("padding", padding_deserialize, padding_serialize)
493
Tim Hall79d07d22020-04-27 18:20:16 +0100494is_int_vec = True
495
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200496TFLITE_NO_INDICES = TensorIndices([], [], [])
497TFLITE_IFM_INDICES = TensorIndices([0], [], [])
498TFLITE_IFM_WEIGHTS_INDICES = TensorIndices([0], [1], [])
499TFLITE_IFM_WEIGHTS_BIAS_INDICES = TensorIndices([0], [1], [2])
500TFLITE_IFM_IFM2_INDICES = TensorIndices([0, 1], [], [])
501TFLITE_CONV2D_BACKPROP_INDICES = TensorIndices([2], [1], [3])
502TFLITE_TRANSPOSE_CONV_INDICES = TensorIndices([0], [1], [3])
503TFLITE_CONCAT_INDICES = TensorIndices([1, 2], [], [])
504TFLITE_SPLIT_IFM_INDICES = TensorIndices([1], [], [])
505TFLITE_BLOCK_LSTM_INDICES = TensorIndices([3], [4], [])
506
Tim Hall79d07d22020-04-27 18:20:16 +0100507builtin_operator_map = {
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200508 BuiltinOperator.ADD: (
509 Op.Add,
510 OptionsSerializer("AddOptions", (fused_act, "pot_scale_int16")),
511 TFLITE_IFM_IFM2_INDICES,
512 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200513 BuiltinOperator.AVERAGE_POOL_2D: (
514 Op.AvgPool,
515 OptionsSerializer(
516 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
517 ),
518 TFLITE_IFM_INDICES,
519 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200520 BuiltinOperator.CONCATENATION: (
521 Op.ConcatTFLite,
522 OptionsSerializer("ConcatenationOptions", ("axis", fused_act)),
523 TFLITE_CONCAT_INDICES,
524 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200525 BuiltinOperator.CONV_2D: (
526 Op.Conv2DBias,
527 OptionsSerializer(
528 "Conv2DOptions", ("dilation_h_factor", "dilation_w_factor", fused_act, padding, "stride_h", "stride_w")
529 ),
530 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
531 ),
532 BuiltinOperator.DEPTHWISE_CONV_2D: (
533 Op.DepthwiseConv2DBias,
534 OptionsSerializer(
535 "DepthwiseConv2DOptions",
536 ("depth_multiplier", "dilation_h_factor", "dilation_w_factor", fused_act, padding, "stride_h", "stride_w"),
537 ),
538 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
539 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200540 BuiltinOperator.DEPTH_TO_SPACE: (
541 Op.DepthToSpace,
542 OptionsSerializer("DepthToSpaceOptions", ("block_size",)),
543 TFLITE_NO_INDICES,
544 ),
545 BuiltinOperator.DEQUANTIZE: (Op.Dequantize, OptionsSerializer("DequantizeOptions"), TFLITE_IFM_INDICES),
546 BuiltinOperator.EMBEDDING_LOOKUP: (Op.EmbeddingLookup, None, TFLITE_NO_INDICES),
547 BuiltinOperator.FLOOR: (Op.Floor, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100548 BuiltinOperator.FULLY_CONNECTED: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200549 Op.FullyConnected,
erik.andersson@arm.com0cbb1662021-02-22 15:47:07 +0100550 OptionsSerializer(
Dwight Lidman8a12da12021-07-19 13:43:05 +0200551 "FullyConnectedOptions", ("asymmetric_quantize_inputs", fused_act, "keep_num_dims", "weights_format")
erik.andersson@arm.com0cbb1662021-02-22 15:47:07 +0100552 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200553 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100554 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200555 BuiltinOperator.HASHTABLE_LOOKUP: (Op.HashtableLookup, None, TFLITE_NO_INDICES),
556 BuiltinOperator.L2_NORMALIZATION: (Op.L2Norm, OptionsSerializer("L2NormOptions", (fused_act,)), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200557 BuiltinOperator.L2_POOL_2D: (
558 Op.L2Pool2D,
559 OptionsSerializer(
560 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
561 ),
562 TFLITE_NO_INDICES,
563 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100564 BuiltinOperator.LOCAL_RESPONSE_NORMALIZATION: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200565 Op.LRN,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200566 OptionsSerializer("LocalResponseNormalizationOptions", ("alpha", "beta", "bias", "radius")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200567 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100568 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200569 BuiltinOperator.LOGISTIC: (Op.Sigmoid, None, TFLITE_IFM_INDICES),
570 BuiltinOperator.LSH_PROJECTION: (
571 Op.LSHProjection,
572 OptionsSerializer("LSHProjectionOptions", ("type",)),
573 TFLITE_NO_INDICES,
574 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200575 BuiltinOperator.LSTM: (
576 Op.Lstm,
577 OptionsSerializer(
578 "LSTMOptions", ("asymmetric_quantize_inputs", "cell_clip", fused_act, "kernel_type", "proj_clip")
579 ),
580 TFLITE_IFM_WEIGHTS_INDICES,
581 ),
582 BuiltinOperator.MAX_POOL_2D: (
583 Op.MaxPool,
584 OptionsSerializer(
585 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
586 ),
587 TFLITE_IFM_INDICES,
588 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200589 BuiltinOperator.MUL: (Op.Mul, OptionsSerializer("MulOptions", (fused_act,)), TFLITE_IFM_IFM2_INDICES),
590 BuiltinOperator.RELU: (Op.Relu, None, TFLITE_IFM_INDICES),
591 BuiltinOperator.RELU_N1_TO_1: (Op.ReluN1To1, None, TFLITE_IFM_INDICES),
592 BuiltinOperator.RELU6: (Op.Relu6, None, TFLITE_IFM_INDICES),
593 BuiltinOperator.RESHAPE: (
594 Op.Reshape,
Dwight Lidmancfb42622021-08-11 12:28:51 +0200595 OptionsSerializer("ReshapeOptions", (("new_shape", is_int_vec),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200596 TFLITE_IFM_INDICES,
597 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100598 BuiltinOperator.RESIZE_BILINEAR: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200599 Op.ResizeBilinear,
Tim Hall79d07d22020-04-27 18:20:16 +0100600 OptionsSerializer("ResizeBilinearOptions", ("align_corners", "half_pixel_centers")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200601 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100602 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200603 BuiltinOperator.RNN: (
604 Op.Rnn,
605 OptionsSerializer("RNNOptions", ("asymmetric_quantize_inputs", fused_act)),
606 TFLITE_IFM_WEIGHTS_INDICES,
607 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200608 BuiltinOperator.SOFTMAX: (Op.Softmax, OptionsSerializer("SoftmaxOptions", ("beta",)), TFLITE_IFM_INDICES),
609 BuiltinOperator.SPACE_TO_DEPTH: (
610 Op.SpaceToDepth,
611 OptionsSerializer("SpaceToDepthOptions", ("block_size",)),
612 TFLITE_NO_INDICES,
613 ),
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200614 BuiltinOperator.SVDF: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200615 Op.Svdf,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200616 OptionsSerializer("SVDFOptions", ("asymmetric_quantize_inputs", fused_act, "rank")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200617 TFLITE_NO_INDICES,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200618 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200619 BuiltinOperator.TANH: (Op.Tanh, None, TFLITE_IFM_INDICES),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200620 BuiltinOperator.CONCAT_EMBEDDINGS: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200621 Op.ConcatEmbeddings,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200622 OptionsSerializer(
623 "ConcatEmbeddingsOptions",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200624 (
Dwight Lidman8a12da12021-07-19 13:43:05 +0200625 "embedding_dim_per_channel",
626 "embedding_dim_per_channel_as_numpy",
627 "embedding_dim_per_channel_is_none",
628 "embedding_dim_per_channel_length",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200629 "num_channels",
630 "num_columns_per_channel",
631 "num_columns_per_channel_as_numpy",
Dwight Lidman8a12da12021-07-19 13:43:05 +0200632 "num_columns_per_channel_is_none",
633 "num_columns_per_channel_length",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200634 ),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200635 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200636 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200637 ),
638 BuiltinOperator.SKIP_GRAM: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200639 Op.SkipGram,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200640 OptionsSerializer("SkipGramOptions", ("include_all_ngrams", "max_skip_size", "ngram_size")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200641 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200642 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200643 BuiltinOperator.CALL: (Op.Call, OptionsSerializer("CallOptions", ("subgraph",)), TFLITE_NO_INDICES),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200644 BuiltinOperator.EMBEDDING_LOOKUP_SPARSE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200645 Op.EmbeddingLookupSparse,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200646 OptionsSerializer("EmbeddingLookupSparseOptions", ("combiner",)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200647 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200648 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200649 BuiltinOperator.PAD: (Op.Pad, OptionsSerializer("PadOptions"), TFLITE_IFM_INDICES),
650 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_RNN: (
651 Op.UnidirectionalSequenceRnn,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200652 OptionsSerializer("SequenceRNNOptions", ("asymmetric_quantize_inputs", fused_act, "time_major")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200653 TFLITE_IFM_WEIGHTS_INDICES,
654 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200655 BuiltinOperator.GATHER: (
656 Op.GatherV2,
657 OptionsSerializer("GatherOptions", ("axis", "batch_dims")),
658 TFLITE_NO_INDICES,
659 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200660 BuiltinOperator.BATCH_TO_SPACE_ND: (
661 Op.BatchToSpaceND,
662 OptionsSerializer("BatchToSpaceNDOptions"),
663 TFLITE_NO_INDICES,
664 ),
665 BuiltinOperator.SPACE_TO_BATCH_ND: (
666 Op.SpaceToBatchND,
667 OptionsSerializer("SpaceToBatchNDOptions"),
668 TFLITE_NO_INDICES,
669 ),
James Ward6bf16132021-09-08 11:14:20 +0100670 BuiltinOperator.TRANSPOSE: (Op.Transpose, OptionsSerializer("TransposeOptions"), TFLITE_IFM_IFM2_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200671 BuiltinOperator.MEAN: (Op.Mean, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_IFM_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200672 BuiltinOperator.SUB: (
673 Op.Sub,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200674 OptionsSerializer("SubOptions", (fused_act, "pot_scale_int16")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200675 TFLITE_IFM_IFM2_INDICES,
676 ),
677 BuiltinOperator.DIV: (Op.Div, OptionsSerializer("DivOptions", (fused_act,)), TFLITE_NO_INDICES),
678 BuiltinOperator.SQUEEZE: (
679 Op.Squeeze,
Jonas Ohlssond8575072022-03-30 10:30:25 +0200680 OptionsSerializer(
681 "SqueezeOptions",
682 (("squeeze_dims", is_int_vec),),
683 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200684 TFLITE_IFM_INDICES,
685 ),
686 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_LSTM: (
687 Op.UnidirectionalSequenceLstm,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200688 OptionsSerializer(
689 "UnidirectionalSequenceLSTMOptions",
690 ("asymmetric_quantize_inputs", "cell_clip", fused_act, "proj_clip", "time_major"),
691 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200692 TFLITE_IFM_WEIGHTS_INDICES,
693 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100694 BuiltinOperator.STRIDED_SLICE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200695 Op.StridedSlice,
Tim Hall79d07d22020-04-27 18:20:16 +0100696 OptionsSerializer(
Dwight Lidman8a12da12021-07-19 13:43:05 +0200697 "StridedSliceOptions", ("begin_mask", "ellipsis_mask", "end_mask", "new_axis_mask", "shrink_axis_mask")
Tim Hall79d07d22020-04-27 18:20:16 +0100698 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200699 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100700 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200701 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_RNN: (
702 Op.BidirectionalSequenceRnn,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200703 OptionsSerializer(
704 "BidirectionalSequenceRNNOptions", ("asymmetric_quantize_inputs", fused_act, "merge_outputs", "time_major")
705 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200706 TFLITE_IFM_WEIGHTS_INDICES,
707 ),
James Ward6bf16132021-09-08 11:14:20 +0100708 BuiltinOperator.EXP: (Op.Exp, OptionsSerializer("ExpOptions"), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200709 BuiltinOperator.TOPK_V2: (Op.TopKV2, OptionsSerializer("TopKV2Options"), TFLITE_NO_INDICES),
710 BuiltinOperator.SPLIT: (Op.Split, OptionsSerializer("SplitOptions", ("num_splits",)), TFLITE_SPLIT_IFM_INDICES),
711 BuiltinOperator.LOG_SOFTMAX: (Op.LogSoftmax, OptionsSerializer("LogSoftmaxOptions"), TFLITE_NO_INDICES),
712 BuiltinOperator.DELEGATE: (Op.Delegate, None, TFLITE_NO_INDICES),
713 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_LSTM: (
714 Op.BidirectionalSequenceLstm,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200715 OptionsSerializer(
716 "BidirectionalSequenceLSTMOptions",
717 ("asymmetric_quantize_inputs", "cell_clip", fused_act, "merge_outputs", "proj_clip", "time_major"),
718 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200719 TFLITE_IFM_WEIGHTS_INDICES,
720 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100721 BuiltinOperator.CAST: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200722 Op.Cast,
Tim Hall79d07d22020-04-27 18:20:16 +0100723 OptionsSerializer(
724 "CastOptions",
725 (
726 ("in_data_type", datatype_deserialize, datatype_serialize),
727 ("out_data_type", datatype_deserialize, datatype_serialize),
728 ),
729 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200730 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100731 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200732 BuiltinOperator.PRELU: (Op.Prelu, None, TFLITE_NO_INDICES),
733 BuiltinOperator.MAXIMUM: (Op.Maximum, OptionsSerializer("MaximumMinimumOptions"), TFLITE_IFM_IFM2_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100734 BuiltinOperator.ARG_MAX: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200735 Op.ArgMax,
Tim Hall79d07d22020-04-27 18:20:16 +0100736 OptionsSerializer("ArgMaxOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
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.MINIMUM: (Op.Minimum, OptionsSerializer("MaximumMinimumOptions"), TFLITE_IFM_IFM2_INDICES),
740 BuiltinOperator.LESS: (Op.Less, OptionsSerializer("LessOptions"), TFLITE_NO_INDICES),
741 BuiltinOperator.NEG: (Op.Neg, OptionsSerializer("NegOptions"), TFLITE_NO_INDICES),
742 BuiltinOperator.PADV2: (Op.PadV2, OptionsSerializer("PadV2Options"), TFLITE_NO_INDICES),
743 BuiltinOperator.GREATER: (Op.Greater, OptionsSerializer("GreaterOptions"), TFLITE_NO_INDICES),
744 BuiltinOperator.GREATER_EQUAL: (Op.GreaterEqual, OptionsSerializer("GreaterEqualOptions"), TFLITE_NO_INDICES),
745 BuiltinOperator.LESS_EQUAL: (Op.LessEqual, OptionsSerializer("LessEqualOptions"), TFLITE_NO_INDICES),
746 BuiltinOperator.SELECT: (Op.Select, OptionsSerializer("SelectOptions"), TFLITE_NO_INDICES),
747 BuiltinOperator.SLICE: (Op.Slice, OptionsSerializer("SliceOptions"), TFLITE_IFM_INDICES),
748 BuiltinOperator.SIN: (Op.Sin, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100749 BuiltinOperator.TRANSPOSE_CONV: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200750 Op.Conv2DBackpropInput,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200751 OptionsSerializer("TransposeConvOptions", (padding, "stride_h", "stride_w")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200752 TFLITE_CONV2D_BACKPROP_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100753 ),
754 BuiltinOperator.SPARSE_TO_DENSE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200755 Op.SparseToDense,
Tim Hall79d07d22020-04-27 18:20:16 +0100756 OptionsSerializer("SparseToDenseOptions", ("validate_indices",)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200757 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100758 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200759 BuiltinOperator.TILE: (Op.Tile, OptionsSerializer("TileOptions"), TFLITE_NO_INDICES),
760 BuiltinOperator.EXPAND_DIMS: (Op.ExpandDims, OptionsSerializer("ExpandDimsOptions"), TFLITE_IFM_INDICES),
761 BuiltinOperator.EQUAL: (Op.Equal, OptionsSerializer("EqualOptions"), TFLITE_NO_INDICES),
762 BuiltinOperator.NOT_EQUAL: (Op.NotEqual, OptionsSerializer("NotEqualOptions"), TFLITE_NO_INDICES),
763 BuiltinOperator.LOG: (Op.Log, None, TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200764 BuiltinOperator.SUM: (Op.Sum, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200765 BuiltinOperator.SQRT: (Op.Sqrt, None, TFLITE_NO_INDICES),
766 BuiltinOperator.RSQRT: (Op.Rsqrt, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100767 BuiltinOperator.SHAPE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200768 Op.Shape,
Tim Hall79d07d22020-04-27 18:20:16 +0100769 OptionsSerializer("ShapeOptions", (("out_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200770 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100771 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200772 BuiltinOperator.POW: (Op.Pow, OptionsSerializer("PowOptions"), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100773 BuiltinOperator.ARG_MIN: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200774 Op.ArgMin,
Tim Hall79d07d22020-04-27 18:20:16 +0100775 OptionsSerializer("ArgMinOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200776 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100777 ),
778 BuiltinOperator.FAKE_QUANT: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200779 Op.FakeQuantWithMinMaxArgs,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200780 OptionsSerializer("FakeQuantOptions", ("max", "min", "narrow_range", "num_bits")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200781 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100782 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200783 BuiltinOperator.REDUCE_PROD: (Op.Prod, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
784 BuiltinOperator.REDUCE_MAX: (Op.Max, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
785 BuiltinOperator.PACK: (Op.Pack, OptionsSerializer("PackOptions", ("axis", "values_count")), TFLITE_IFM_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200786 BuiltinOperator.LOGICAL_OR: (Op.LogicalOr, OptionsSerializer("LogicalOrOptions"), TFLITE_NO_INDICES),
787 BuiltinOperator.ONE_HOT: (Op.OneHot, OptionsSerializer("OneHotOptions", ("axis",)), TFLITE_NO_INDICES),
788 BuiltinOperator.LOGICAL_AND: (Op.LogicalAnd, OptionsSerializer("LogicalAndOptions"), TFLITE_NO_INDICES),
789 BuiltinOperator.LOGICAL_NOT: (Op.LogicalNot, OptionsSerializer("LogicalNotOptions"), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200790 BuiltinOperator.UNPACK: (Op.Unpack, OptionsSerializer("UnpackOptions", ("axis", "num")), TFLITE_IFM_INDICES),
791 BuiltinOperator.REDUCE_MIN: (Op.Min, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200792 BuiltinOperator.FLOOR_DIV: (Op.FloorDiv, OptionsSerializer("FloorDivOptions"), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200793 BuiltinOperator.REDUCE_ANY: (Op.Any, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200794 BuiltinOperator.SQUARE: (Op.Square, OptionsSerializer("SquareOptions"), TFLITE_NO_INDICES),
795 BuiltinOperator.ZEROS_LIKE: (Op.ZerosLike, OptionsSerializer("ZerosLikeOptions"), TFLITE_NO_INDICES),
796 BuiltinOperator.FILL: (Op.Fill, OptionsSerializer("FillOptions"), TFLITE_NO_INDICES),
797 BuiltinOperator.FLOOR_MOD: (Op.FloorMod, OptionsSerializer("FloorModOptions"), TFLITE_NO_INDICES),
798 BuiltinOperator.RANGE: (Op.Range, OptionsSerializer("RangeOptions"), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100799 BuiltinOperator.RESIZE_NEAREST_NEIGHBOR: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200800 Op.ResizeNearestNeighbor,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200801 OptionsSerializer("ResizeNearestNeighborOptions", ("align_corners", "half_pixel_centers")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200802 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100803 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200804 BuiltinOperator.LEAKY_RELU: (Op.LeakyRelu, OptionsSerializer("LeakyReluOptions", ("alpha",)), TFLITE_IFM_INDICES),
805 BuiltinOperator.SQUARED_DIFFERENCE: (
806 Op.SquaredDifference,
807 OptionsSerializer("SquaredDifferenceOptions"),
808 TFLITE_NO_INDICES,
809 ),
810 BuiltinOperator.MIRROR_PAD: (Op.MirrorPad, OptionsSerializer("MirrorPadOptions", ("mode",)), TFLITE_NO_INDICES),
811 BuiltinOperator.ABS: (Op.Abs, OptionsSerializer("AbsOptions"), TFLITE_IFM_INDICES),
812 BuiltinOperator.SPLIT_V: (Op.SplitV, OptionsSerializer("SplitVOptions", ("num_splits",)), TFLITE_IFM_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100813 BuiltinOperator.UNIQUE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200814 Op.Unique,
Tim Hall79d07d22020-04-27 18:20:16 +0100815 OptionsSerializer("UniqueOptions", (("idx_out_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200816 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100817 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200818 BuiltinOperator.CEIL: (Op.Ceil, None, TFLITE_NO_INDICES),
819 BuiltinOperator.REVERSE_V2: (Op.ReverseV2, OptionsSerializer("ReverseV2Options"), TFLITE_NO_INDICES),
820 BuiltinOperator.ADD_N: (Op.AddN, OptionsSerializer("AddNOptions"), TFLITE_NO_INDICES),
821 BuiltinOperator.GATHER_ND: (Op.GatherNd, OptionsSerializer("GatherNdOptions"), TFLITE_NO_INDICES),
822 BuiltinOperator.COS: (Op.Cos, OptionsSerializer("CosOptions"), TFLITE_NO_INDICES),
823 BuiltinOperator.WHERE: (Op.Where, OptionsSerializer("WhereOptions"), TFLITE_NO_INDICES),
824 BuiltinOperator.RANK: (Op.Rank, OptionsSerializer("RankOptions"), TFLITE_NO_INDICES),
825 BuiltinOperator.ELU: (Op.Elu, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100826 BuiltinOperator.REVERSE_SEQUENCE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200827 Op.ReverseSequence,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200828 OptionsSerializer("ReverseSequenceOptions", ("batch_dim", "seq_dim")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200829 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100830 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200831 BuiltinOperator.MATRIX_DIAG: (Op.MatrixDiag, OptionsSerializer("MatrixDiagOptions"), TFLITE_NO_INDICES),
832 BuiltinOperator.QUANTIZE: (Op.Quantize, OptionsSerializer("QuantizeOptions"), TFLITE_IFM_INDICES),
833 BuiltinOperator.MATRIX_SET_DIAG: (Op.MatrixSetDiag, OptionsSerializer("MatrixSetDiagOptions"), TFLITE_NO_INDICES),
834 BuiltinOperator.ROUND: (Op.Round, None, TFLITE_NO_INDICES),
835 BuiltinOperator.HARD_SWISH: (Op.HardSwish, OptionsSerializer("HardSwishOptions"), TFLITE_IFM_INDICES),
836 BuiltinOperator.IF: (
837 Op.If,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200838 OptionsSerializer("IfOptions", ("else_subgraph_index", "then_subgraph_index")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200839 TFLITE_NO_INDICES,
840 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200841 BuiltinOperator.WHILE: (
842 Op.While,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200843 OptionsSerializer("WhileOptions", ("body_subgraph_index", "cond_subgraph_index")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200844 TFLITE_NO_INDICES,
Louis Verhaardaee5d752020-09-30 09:01:52 +0200845 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200846 BuiltinOperator.NON_MAX_SUPPRESSION_V4: (
847 Op.NonMaxSuppressionV4,
848 OptionsSerializer("NonMaxSuppressionV4Options"),
849 TFLITE_NO_INDICES,
850 ),
851 BuiltinOperator.NON_MAX_SUPPRESSION_V5: (
852 Op.NonMaxSuppressionV5,
853 OptionsSerializer("NonMaxSuppressionV5Options"),
854 TFLITE_NO_INDICES,
855 ),
856 BuiltinOperator.SCATTER_ND: (Op.ScatterNd, OptionsSerializer("ScatterNdOptions"), TFLITE_NO_INDICES),
857 BuiltinOperator.SELECT_V2: (Op.SelectV2, OptionsSerializer("SelectV2Options"), TFLITE_NO_INDICES),
858 BuiltinOperator.DENSIFY: (Op.Densify, OptionsSerializer("DensifyOptions"), TFLITE_NO_INDICES),
859 BuiltinOperator.SEGMENT_SUM: (Op.SegmentSum, OptionsSerializer("SegmentSumOptions"), TFLITE_NO_INDICES),
860 BuiltinOperator.BATCH_MATMUL: (
861 Op.BatchMatMul,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200862 OptionsSerializer("BatchMatMulOptions", ("adj_x", "adj_y", "asymmetric_quantize_inputs")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200863 TFLITE_NO_INDICES,
864 ),
865 BuiltinOperator.CUMSUM: (
866 Op.Cumsum,
867 OptionsSerializer("CumsumOptions", ("exclusive", "reverse")),
868 TFLITE_NO_INDICES,
869 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200870 BuiltinOperator.CALL_ONCE: (
871 Op.CallOnce,
872 OptionsSerializer("CallOnceOptions", ("init_subgraph_index",)),
873 TFLITE_NO_INDICES,
874 ),
875 BuiltinOperator.BROADCAST_TO: (Op.BroadcastTo, OptionsSerializer("BroadcastToOptions"), TFLITE_NO_INDICES),
876 BuiltinOperator.RFFT2D: (Op.Rfft2D, OptionsSerializer("Rfft2dOptions"), TFLITE_NO_INDICES),
877 BuiltinOperator.CONV_3D: (
878 Op.Conv3D,
879 OptionsSerializer(
880 "Conv3DOptions",
881 (
882 "dilation_d_factor",
883 "dilation_h_factor",
884 "dilation_w_factor",
885 fused_act,
886 padding,
887 "stride_d",
888 "stride_h",
889 "stride_w",
890 ),
891 ),
892 TFLITE_NO_INDICES,
893 ),
894 BuiltinOperator.IMAG: (Op.Imag, None, TFLITE_NO_INDICES),
895 BuiltinOperator.REAL: (Op.Real, None, TFLITE_NO_INDICES),
896 BuiltinOperator.COMPLEX_ABS: (Op.ComplexAbs, None, TFLITE_NO_INDICES),
897 BuiltinOperator.HASHTABLE: (
898 Op.Hashtable,
899 OptionsSerializer("HashtableOptions", ("key_dtype", "table_id", "value_dtype")),
900 TFLITE_NO_INDICES,
901 ),
902 BuiltinOperator.HASHTABLE_FIND: (Op.HashtableFind, OptionsSerializer("HashtableFindOptions"), TFLITE_NO_INDICES),
903 BuiltinOperator.HASHTABLE_IMPORT: (
904 Op.HashtableImport,
905 OptionsSerializer("HashtableImportOptions"),
906 TFLITE_NO_INDICES,
907 ),
908 BuiltinOperator.HASHTABLE_SIZE: (Op.HashtableSize, OptionsSerializer("HashtableSizeOptions"), TFLITE_NO_INDICES),
909 BuiltinOperator.REDUCE_ALL: (Op.ReduceAll, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
910 BuiltinOperator.CONV_3D_TRANSPOSE: (
911 Op.Conv3DTranspose,
912 OptionsSerializer(
913 "Conv3DOptions",
914 (
915 "dilation_d_factor",
916 "dilation_h_factor",
917 "dilation_w_factor",
918 fused_act,
919 padding,
920 "stride_d",
921 "stride_h",
922 "stride_w",
923 ),
924 ),
925 TFLITE_NO_INDICES,
926 ),
Rickard Bolin2de898a2021-12-20 08:35:23 +0000927 BuiltinOperator.VAR_HANDLE: (
928 Op.VarHandle,
Jonas Ohlssond8575072022-03-30 10:30:25 +0200929 OptionsSerializer(
930 "VarHandleOptions",
931 (
932 "container",
933 "shared_name",
934 ),
935 ),
Rickard Bolin2de898a2021-12-20 08:35:23 +0000936 TFLITE_NO_INDICES,
937 ),
938 BuiltinOperator.READ_VARIABLE: (Op.ReadVariable, OptionsSerializer("ReadVariableOptions"), TFLITE_NO_INDICES),
939 BuiltinOperator.ASSIGN_VARIABLE: (Op.AssignVariable, OptionsSerializer("AssignVariableOptions"), TFLITE_NO_INDICES),
940 BuiltinOperator.BROADCAST_ARGS: (Op.BroadcastArgs, None, TFLITE_NO_INDICES),
941 BuiltinOperator.RANDOM_STANDARD_NORMAL: (
942 Op.RandomStandardNormal,
Jonas Ohlssond8575072022-03-30 10:30:25 +0200943 OptionsSerializer(
944 "RandomOptions",
945 (
946 "seed",
947 "seed2",
948 ),
949 ),
Rickard Bolin2de898a2021-12-20 08:35:23 +0000950 TFLITE_NO_INDICES,
951 ),
Rickard Bolind66f8012022-04-21 07:36:55 +0000952 BuiltinOperator.BUCKETIZE: (
953 Op.Bucketize,
954 OptionsSerializer(
955 "BucketizeOptions",
956 ("boundaries", "boundaries_as_numpy", "boundaries_length", "boundaries_is_none"),
957 ),
958 TFLITE_NO_INDICES,
959 ),
960 BuiltinOperator.RANDOM_UNIFORM: (Op.RandomUniform, None, TFLITE_NO_INDICES),
961 BuiltinOperator.MULTINOMIAL: (Op.Multinomial, None, TFLITE_NO_INDICES),
962 BuiltinOperator.GELU: (Op.Gelu, OptionsSerializer("GeluOptions", ("approximate",)), TFLITE_NO_INDICES),
963 BuiltinOperator.DYNAMIC_UPDATE_SLICE: (
964 Op.DynamicUpdateSlice,
965 OptionsSerializer("DynamicUpdateSliceOptions"),
966 TFLITE_NO_INDICES,
967 ),
Tim Hallb94bcd42021-09-07 14:24:51 +0100968 BuiltinOperator.CUSTOM: (Op.Custom, CustomOptionsSerializer(), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100969}
970
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200971builtin_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 +0100972
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200973builtin_operator_inv_map[Op.CustomNpuOp] = (BuiltinOperator.CUSTOM, CustomOptionsSerializer(), TFLITE_NO_INDICES)
Michael McGeagh219ec072020-11-09 11:11:26 +0000974
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000975BUILTIN_OPERATOR_UNKNOWN = "UNKNOWN"
976
Tim Halla3fe6652022-03-03 17:43:16 +0000977builtin_operator_name_map = {v: k for k, v in vars(BuiltinOperator).items()}
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000978
Michael McGeagh219ec072020-11-09 11:11:26 +0000979
Tim Halla3fe6652022-03-03 17:43:16 +0000980def optype_to_builtintype(op_type: Op):
Michael McGeagh219ec072020-11-09 11:11:26 +0000981 if op_type in builtin_operator_inv_map:
Tim Halla3fe6652022-03-03 17:43:16 +0000982 return builtin_operator_name_map[builtin_operator_inv_map[op_type][0]]
Michael McGeagh219ec072020-11-09 11:11:26 +0000983 else:
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000984 return BUILTIN_OPERATOR_UNKNOWN