blob: c515d23ae491f355c562d87c803895f5001896d8 [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
erik.andersson@arm.comdd49a722022-08-10 15:26:48 +0200142from .tflite import UnsortedSegmentProdOptions
Rickard Bolin2de898a2021-12-20 08:35:23 +0000143from .tflite import VarHandleOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100144from .tflite import WhereOptions
Tim Hall79d07d22020-04-27 18:20:16 +0100145from .tflite import WhileOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100146from .tflite import ZerosLikeOptions
147from .tflite.ActivationFunctionType import ActivationFunctionType
Diego Russoea6111a2020-04-14 18:41:58 +0100148from .tflite.BuiltinOperator import BuiltinOperator
149from .tflite.BuiltinOptions import BuiltinOptions
150from .tflite.Padding import Padding
Diego Russoe8a10452020-04-21 17:39:10 +0100151from .tflite.TensorType import TensorType
Tim Hall79d07d22020-04-27 18:20:16 +0100152
153
154def inverse_map(map):
155 return {v: k for k, v in map.items()}
156
157
158datatype_map = {
159 TensorType.UINT8: DataType.uint8,
160 TensorType.INT8: DataType.int8,
161 TensorType.INT16: DataType.int16,
162 TensorType.INT32: DataType.int32,
163 TensorType.INT64: DataType.int64,
164 TensorType.FLOAT16: DataType.float16,
165 TensorType.FLOAT32: DataType.float32,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200166 TensorType.FLOAT64: DataType.float64,
Tim Hall79d07d22020-04-27 18:20:16 +0100167 TensorType.STRING: DataType.string,
168 TensorType.BOOL: DataType.bool,
Jacob Bohlinf767b932020-08-13 15:32:45 +0200169 TensorType.COMPLEX64: DataType.complex64,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200170 TensorType.COMPLEX128: DataType.complex128,
Dwight Lidmanf53b3322021-10-08 11:58:08 +0200171 TensorType.UINT64: DataType.uint64,
172 TensorType.RESOURCE: DataType.resource,
173 TensorType.VARIANT: DataType.variant,
174 TensorType.UINT32: DataType.uint32,
Rickard Bolind66f8012022-04-21 07:36:55 +0000175 TensorType.UINT16: DataType.uint16,
Tim Hall79d07d22020-04-27 18:20:16 +0100176}
177
178datatype_inv_map = inverse_map(datatype_map)
179datatype_inv_map[DataType.quint8] = TensorType.UINT8
180
181datatype_inv_map[DataType.qint8] = TensorType.INT8
182datatype_inv_map[DataType.qint16] = TensorType.INT16
183datatype_inv_map[DataType.qint32] = TensorType.INT32
184
185
186datatype_map_numpy = {
187 TensorType.UINT8: np.uint8,
Rickard Bolind66f8012022-04-21 07:36:55 +0000188 TensorType.UINT16: np.uint16,
Dwight Lidmanf53b3322021-10-08 11:58:08 +0200189 TensorType.UINT32: np.uint32,
190 TensorType.UINT64: np.uint64,
Tim Hall79d07d22020-04-27 18:20:16 +0100191 TensorType.INT8: np.int8,
192 TensorType.INT16: np.int16,
193 TensorType.INT32: np.int32,
194 TensorType.INT64: np.int64,
195 TensorType.FLOAT16: np.float16,
196 TensorType.FLOAT32: np.float32,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200197 TensorType.FLOAT64: np.float64,
Tim Hall79d07d22020-04-27 18:20:16 +0100198 TensorType.BOOL: np.bool,
Jacob Bohlinf767b932020-08-13 15:32:45 +0200199 TensorType.COMPLEX64: np.complex64,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200200 TensorType.COMPLEX128: np.complex128,
Louis Verhaardf4e12be2020-12-18 14:23:06 +0100201 TensorType.STRING: np.uint8,
Dwight Lidmanf53b3322021-10-08 11:58:08 +0200202 TensorType.RESOURCE: None, # experimental type
203 TensorType.VARIANT: None, # experimental type
Tim Hall79d07d22020-04-27 18:20:16 +0100204}
205
206
207builtin_options_map = {
208 BuiltinOptions.Conv2DOptions: Conv2DOptions.Conv2DOptions,
209 BuiltinOptions.DepthwiseConv2DOptions: DepthwiseConv2DOptions.DepthwiseConv2DOptions,
210 BuiltinOptions.ConcatEmbeddingsOptions: ConcatEmbeddingsOptions.ConcatEmbeddingsOptions,
211 BuiltinOptions.LSHProjectionOptions: LSHProjectionOptions.LSHProjectionOptions,
212 BuiltinOptions.Pool2DOptions: Pool2DOptions.Pool2DOptions,
213 BuiltinOptions.SVDFOptions: SVDFOptions.SVDFOptions,
214 BuiltinOptions.RNNOptions: RNNOptions.RNNOptions,
215 BuiltinOptions.FullyConnectedOptions: FullyConnectedOptions.FullyConnectedOptions,
216 BuiltinOptions.SoftmaxOptions: SoftmaxOptions.SoftmaxOptions,
217 BuiltinOptions.ConcatenationOptions: ConcatenationOptions.ConcatenationOptions,
218 BuiltinOptions.AddOptions: AddOptions.AddOptions,
219 BuiltinOptions.L2NormOptions: L2NormOptions.L2NormOptions,
220 BuiltinOptions.LocalResponseNormalizationOptions: LocalResponseNormalizationOptions.LocalResponseNormalizationOptions, # noqa: E501
221 BuiltinOptions.LSTMOptions: LSTMOptions.LSTMOptions,
222 BuiltinOptions.ResizeBilinearOptions: ResizeBilinearOptions.ResizeBilinearOptions,
223 BuiltinOptions.CallOptions: CallOptions.CallOptions,
224 BuiltinOptions.ReshapeOptions: ReshapeOptions.ReshapeOptions,
225 BuiltinOptions.SkipGramOptions: SkipGramOptions.SkipGramOptions,
226 BuiltinOptions.SpaceToDepthOptions: SpaceToDepthOptions.SpaceToDepthOptions,
227 BuiltinOptions.EmbeddingLookupSparseOptions: EmbeddingLookupSparseOptions.EmbeddingLookupSparseOptions,
228 BuiltinOptions.MulOptions: MulOptions.MulOptions,
229 BuiltinOptions.PadOptions: PadOptions.PadOptions,
230 BuiltinOptions.GatherOptions: GatherOptions.GatherOptions,
231 BuiltinOptions.BatchToSpaceNDOptions: BatchToSpaceNDOptions.BatchToSpaceNDOptions,
232 BuiltinOptions.SpaceToBatchNDOptions: SpaceToBatchNDOptions.SpaceToBatchNDOptions,
233 BuiltinOptions.TransposeOptions: TransposeOptions.TransposeOptions,
234 BuiltinOptions.ReducerOptions: ReducerOptions.ReducerOptions,
235 BuiltinOptions.SubOptions: SubOptions.SubOptions,
236 BuiltinOptions.DivOptions: DivOptions.DivOptions,
237 BuiltinOptions.SqueezeOptions: SqueezeOptions.SqueezeOptions,
238 BuiltinOptions.SequenceRNNOptions: SequenceRNNOptions.SequenceRNNOptions,
239 BuiltinOptions.StridedSliceOptions: StridedSliceOptions.StridedSliceOptions,
240 BuiltinOptions.ExpOptions: ExpOptions.ExpOptions,
241 BuiltinOptions.TopKV2Options: TopKV2Options.TopKV2Options,
242 BuiltinOptions.SplitOptions: SplitOptions.SplitOptions,
243 BuiltinOptions.LogSoftmaxOptions: LogSoftmaxOptions.LogSoftmaxOptions,
244 BuiltinOptions.CastOptions: CastOptions.CastOptions,
245 BuiltinOptions.DequantizeOptions: DequantizeOptions.DequantizeOptions,
246 BuiltinOptions.MaximumMinimumOptions: MaximumMinimumOptions.MaximumMinimumOptions,
247 BuiltinOptions.ArgMaxOptions: ArgMaxOptions.ArgMaxOptions,
248 BuiltinOptions.LessOptions: LessOptions.LessOptions,
249 BuiltinOptions.NegOptions: NegOptions.NegOptions,
250 BuiltinOptions.PadV2Options: PadV2Options.PadV2Options,
251 BuiltinOptions.GreaterOptions: GreaterOptions.GreaterOptions,
252 BuiltinOptions.GreaterEqualOptions: GreaterEqualOptions.GreaterEqualOptions,
253 BuiltinOptions.LessEqualOptions: LessEqualOptions.LessEqualOptions,
254 BuiltinOptions.SelectOptions: SelectOptions.SelectOptions,
255 BuiltinOptions.SliceOptions: SliceOptions.SliceOptions,
256 BuiltinOptions.TransposeConvOptions: TransposeConvOptions.TransposeConvOptions,
257 BuiltinOptions.SparseToDenseOptions: SparseToDenseOptions.SparseToDenseOptions,
258 BuiltinOptions.TileOptions: TileOptions.TileOptions,
259 BuiltinOptions.ExpandDimsOptions: ExpandDimsOptions.ExpandDimsOptions,
260 BuiltinOptions.EqualOptions: EqualOptions.EqualOptions,
261 BuiltinOptions.NotEqualOptions: NotEqualOptions.NotEqualOptions,
262 BuiltinOptions.ShapeOptions: ShapeOptions.ShapeOptions,
263 BuiltinOptions.PowOptions: PowOptions.PowOptions,
264 BuiltinOptions.ArgMinOptions: ArgMinOptions.ArgMinOptions,
265 BuiltinOptions.FakeQuantOptions: FakeQuantOptions.FakeQuantOptions,
266 BuiltinOptions.PackOptions: PackOptions.PackOptions,
267 BuiltinOptions.LogicalOrOptions: LogicalOrOptions.LogicalOrOptions,
268 BuiltinOptions.OneHotOptions: OneHotOptions.OneHotOptions,
269 BuiltinOptions.LogicalAndOptions: LogicalAndOptions.LogicalAndOptions,
270 BuiltinOptions.LogicalNotOptions: LogicalNotOptions.LogicalNotOptions,
271 BuiltinOptions.UnpackOptions: UnpackOptions.UnpackOptions,
272 BuiltinOptions.FloorDivOptions: FloorDivOptions.FloorDivOptions,
273 BuiltinOptions.SquareOptions: SquareOptions.SquareOptions,
274 BuiltinOptions.ZerosLikeOptions: ZerosLikeOptions.ZerosLikeOptions,
275 BuiltinOptions.FillOptions: FillOptions.FillOptions,
276 BuiltinOptions.BidirectionalSequenceLSTMOptions: BidirectionalSequenceLSTMOptions.BidirectionalSequenceLSTMOptions,
277 BuiltinOptions.BidirectionalSequenceRNNOptions: BidirectionalSequenceRNNOptions.BidirectionalSequenceRNNOptions,
278 BuiltinOptions.UnidirectionalSequenceLSTMOptions: UnidirectionalSequenceLSTMOptions.UnidirectionalSequenceLSTMOptions, # noqa: E501
279 BuiltinOptions.FloorModOptions: FloorModOptions.FloorModOptions,
280 BuiltinOptions.RangeOptions: RangeOptions.RangeOptions,
281 BuiltinOptions.ResizeNearestNeighborOptions: ResizeNearestNeighborOptions.ResizeNearestNeighborOptions,
282 BuiltinOptions.LeakyReluOptions: LeakyReluOptions.LeakyReluOptions,
283 BuiltinOptions.SquaredDifferenceOptions: SquaredDifferenceOptions.SquaredDifferenceOptions,
284 BuiltinOptions.MirrorPadOptions: MirrorPadOptions.MirrorPadOptions,
285 BuiltinOptions.AbsOptions: AbsOptions.AbsOptions,
286 BuiltinOptions.SplitVOptions: SplitVOptions.SplitVOptions,
287 BuiltinOptions.UniqueOptions: UniqueOptions.UniqueOptions,
288 BuiltinOptions.ReverseV2Options: ReverseV2Options.ReverseV2Options,
289 BuiltinOptions.AddNOptions: AddNOptions.AddNOptions,
290 BuiltinOptions.GatherNdOptions: GatherNdOptions.GatherNdOptions,
291 BuiltinOptions.CosOptions: CosOptions.CosOptions,
292 BuiltinOptions.WhereOptions: WhereOptions.WhereOptions,
293 BuiltinOptions.RankOptions: RankOptions.RankOptions,
294 BuiltinOptions.ReverseSequenceOptions: ReverseSequenceOptions.ReverseSequenceOptions,
295 BuiltinOptions.MatrixDiagOptions: MatrixDiagOptions.MatrixDiagOptions,
296 BuiltinOptions.QuantizeOptions: QuantizeOptions.QuantizeOptions,
297 BuiltinOptions.MatrixSetDiagOptions: MatrixSetDiagOptions.MatrixSetDiagOptions,
298 BuiltinOptions.DensifyOptions: DensifyOptions.DensifyOptions,
299 BuiltinOptions.DepthToSpaceOptions: DepthToSpaceOptions.DepthToSpaceOptions,
Louis Verhaard678645b2020-06-15 15:22:47 +0200300 BuiltinOptions.HardSwishOptions: HardSwishOptions.HardSwishOptions,
Tim Hall79d07d22020-04-27 18:20:16 +0100301 BuiltinOptions.IfOptions: IfOptions.IfOptions,
302 BuiltinOptions.NonMaxSuppressionV4Options: NonMaxSuppressionV4Options.NonMaxSuppressionV4Options,
303 BuiltinOptions.NonMaxSuppressionV5Options: NonMaxSuppressionV5Options.NonMaxSuppressionV5Options,
304 BuiltinOptions.ScatterNdOptions: ScatterNdOptions.ScatterNdOptions,
305 BuiltinOptions.SegmentSumOptions: SegmentSumOptions.SegmentSumOptions,
306 BuiltinOptions.SelectV2Options: SelectV2Options.SelectV2Options,
307 BuiltinOptions.WhileOptions: WhileOptions.WhileOptions,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200308 BuiltinOptions.BatchMatMulOptions: BatchMatMulOptions.BatchMatMulOptions,
Tim Hall42abec12021-02-04 21:31:57 +0000309 BuiltinOptions.CumsumOptions: CumsumOptions.CumsumOptions,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200310 BuiltinOptions.CallOnceOptions: CallOnceOptions.CallOnceOptions,
311 BuiltinOptions.BroadcastToOptions: BroadcastToOptions.BroadcastToOptions,
312 BuiltinOptions.Rfft2dOptions: Rfft2dOptions.Rfft2dOptions,
313 BuiltinOptions.Conv3DOptions: Conv3DOptions.Conv3DOptions,
314 BuiltinOptions.HashtableOptions: HashtableOptions.HashtableOptions,
315 BuiltinOptions.HashtableFindOptions: HashtableFindOptions.HashtableFindOptions,
316 BuiltinOptions.HashtableImportOptions: HashtableImportOptions.HashtableImportOptions,
317 BuiltinOptions.HashtableSizeOptions: HashtableSizeOptions.HashtableSizeOptions,
Rickard Bolin2de898a2021-12-20 08:35:23 +0000318 BuiltinOptions.VarHandleOptions: VarHandleOptions.VarHandleOptions,
319 BuiltinOptions.ReadVariableOptions: ReadVariableOptions.ReadVariableOptions,
320 BuiltinOptions.AssignVariableOptions: AssignVariableOptions.AssignVariableOptions,
321 BuiltinOptions.RandomOptions: RandomOptions.RandomOptions,
Rickard Bolind66f8012022-04-21 07:36:55 +0000322 BuiltinOptions.BucketizeOptions: BucketizeOptions.BucketizeOptions,
323 BuiltinOptions.DynamicUpdateSliceOptions: DynamicUpdateSliceOptions.DynamicUpdateSliceOptions,
324 BuiltinOptions.GeluOptions: GeluOptions.GeluOptions,
erik.andersson@arm.comdd49a722022-08-10 15:26:48 +0200325 BuiltinOptions.UnsortedSegmentProdOptions: UnsortedSegmentProdOptions.UnsortedSegmentProdOptions,
Tim Hall79d07d22020-04-27 18:20:16 +0100326}
327
Rickard Bolin2de898a2021-12-20 08:35:23 +0000328
Tim Hall79d07d22020-04-27 18:20:16 +0100329builtin_options_inv_map = inverse_map(builtin_options_map)
330
331
332def underscore_to_camel_case(s):
333 return "".join(x.title() for x in s.split("_"))
334
335
336def padding_deserialize(x):
337 return padding_map[x]
338
339
340def padding_serialize(builder, x):
341 return padding_inv_map[x]
342
343
344def activation_deserialize(x):
345 return activation_function_map[x]
346
347
348def activation_serialize(builder, x):
349 return activation_function_inv_map[x]
350
351
352def datatype_deserialize(x):
353 return datatype_map[x]
354
355
356def datatype_serialize(builder, x):
357 return datatype_inv_map[x]
358
359
360def identity(x):
361 return x
362
363
364def identity_serialize(builder, x):
365 return x
366
367
368def write_byte_vector(builder, v):
369 builder.StartVector(1, len(v), 1)
370 for e in v[::-1]:
371 builder.PrependByte(e)
372 return builder.EndVector(len(v))
373
374
375def write_int_vector(builder, v):
376 builder.StartVector(4, len(v), 4)
377 for e in v[::-1]:
378 builder.PrependInt32(e)
379 return builder.EndVector(len(v))
380
381
382class OptionsSerializer:
Michael McGeagh6f725262020-12-03 15:21:36 +0000383 def __init__(self, name, members=None):
Tim Hall79d07d22020-04-27 18:20:16 +0100384 self.name = name
385 self.module = globals()[self.name]
386 self.cls = getattr(self.module, self.name)
387 self.builtin_opt_type = builtin_options_inv_map[self.cls]
Tim Hall79d07d22020-04-27 18:20:16 +0100388 self.members = []
Michael McGeagh6f725262020-12-03 15:21:36 +0000389 if members is not None:
390 for mem in members:
391 deserialize = identity
392 serialize = identity_serialize
393 is_vector = False
394 if isinstance(mem, tuple):
395 if len(mem) == 3:
396 mem, deserialize, serialize = mem
397 elif len(mem) == 2:
398 mem, is_vector = mem
399 deserialize = tuple
400 serialize = write_int_vector
401 else:
402 assert 0
403 underscore_mem = mem
404 camelcase_mem = underscore_to_camel_case(mem)
405 self.members.append((underscore_mem, camelcase_mem, deserialize, serialize, is_vector))
Tim Hall79d07d22020-04-27 18:20:16 +0100406
Tim Hallc8310b12020-06-17 14:53:11 +0100407 def deserialize(self, op_data):
408 builtin_options = op_data.BuiltinOptions()
Tim Hall79d07d22020-04-27 18:20:16 +0100409 attrs = {}
Tim Hallc8310b12020-06-17 14:53:11 +0100410 if builtin_options:
Tim Hall79d07d22020-04-27 18:20:16 +0100411 tfattrs = self.cls()
Tim Hallc8310b12020-06-17 14:53:11 +0100412 tfattrs.Init(builtin_options.Bytes, builtin_options.Pos)
Tim Hall79d07d22020-04-27 18:20:16 +0100413 for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members:
414 fun = camelcase_mem
415 if is_vector:
416 fun += "AsNumpy"
417
Fredrik Svedberg4bb989b2020-11-16 15:32:25 +0100418 attr = getattr(tfattrs, fun)()
419 try:
420 attrs[underscore_mem] = deserialize(attr)
421 except TypeError:
422 print("Warning: {0} could not read attribute '{1}'.".format(self.name, underscore_mem))
423
Tim Hall79d07d22020-04-27 18:20:16 +0100424 return attrs
425
426 def serialize(self, builder, attrs):
427 ser_attrs = []
428 for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members:
429 a = serialize(builder, attrs[underscore_mem])
430 ser_attrs.append((camelcase_mem, a))
431
432 getattr(self.module, self.name + "Start")(builder)
433
434 for camelcase_mem, a in ser_attrs:
435 getattr(self.module, self.name + "Add" + camelcase_mem)(builder, a)
436
437 return getattr(self.module, self.name + "End")(builder), None
438
439
440class CustomOptionsSerializer:
Tim Hallc8310b12020-06-17 14:53:11 +0100441 CUSTOM_OPTIONS_NPU_OP = [0x01, 0x04, 0x01] # NpuOp=1, FlexbufferFormat.UINT8=4, byte length=1
442 CUSTOM_OPTIONS_FORMAT_DEFAULT = 0
443
Tim Hall79d07d22020-04-27 18:20:16 +0100444 def __init__(self):
Tim Hall79d07d22020-04-27 18:20:16 +0100445 self.custom_opt_format = 0
446
Tim Hallc8310b12020-06-17 14:53:11 +0100447 def deserialize(self, op_data):
Tim Hall79d07d22020-04-27 18:20:16 +0100448 attrs = {}
Tim Hallc8310b12020-06-17 14:53:11 +0100449 custom_options = op_data.CustomOptionsAsNumpy()
450 attrs["custom_options"] = custom_options
451 attrs["custom_options_format"] = op_data.CustomOptionsFormat()
452
453 if np.array_equal(custom_options, self.CUSTOM_OPTIONS_NPU_OP):
Louis Verhaardaee5d752020-09-30 09:01:52 +0200454 attrs["custom_type"] = CustomType.ExistingNpuOp
Tim Hallc8310b12020-06-17 14:53:11 +0100455
Tim Hall79d07d22020-04-27 18:20:16 +0100456 return attrs
457
458 def serialize(self, builder, attrs):
Louis Verhaardaee5d752020-09-30 09:01:52 +0200459 custom_type = attrs.get("custom_type", CustomType.ThirdPartyOp)
Tim Hallc8310b12020-06-17 14:53:11 +0100460 self.custom_opt_format = attrs.get("custom_options_format", self.CUSTOM_OPTIONS_FORMAT_DEFAULT)
Tim Hall79d07d22020-04-27 18:20:16 +0100461
462 # Set NPU op custom options for the TensorFlow Lite custom operator
Louis Verhaardaee5d752020-09-30 09:01:52 +0200463 if custom_type == CustomType.NpuOp:
Tim Hallc8310b12020-06-17 14:53:11 +0100464 custom_options = self.CUSTOM_OPTIONS_NPU_OP
465 else:
466 custom_options = attrs.get("custom_options", [])
Tim Hall79d07d22020-04-27 18:20:16 +0100467
Tim Hallc8310b12020-06-17 14:53:11 +0100468 custom_options_bytes = struct.pack("<{0}B".format(len(custom_options)), *custom_options)
469 custom_offset = write_byte_vector(builder, custom_options_bytes)
Tim Hall79d07d22020-04-27 18:20:16 +0100470
471 return None, custom_offset
472
473
474padding_map = {
Michael McGeagh16895482020-12-14 15:51:20 +0000475 Padding.SAME: opPad.SAME,
476 Padding.VALID: opPad.VALID,
Tim Hall79d07d22020-04-27 18:20:16 +0100477}
478
479padding_inv_map = inverse_map(padding_map)
480
481
482activation_function_map = {
483 ActivationFunctionType.NONE: None,
Louis Verhaardaee5d752020-09-30 09:01:52 +0200484 ActivationFunctionType.RELU: Op.Relu,
485 ActivationFunctionType.RELU_N1_TO_1: Op.ReluN1To1,
486 ActivationFunctionType.RELU6: Op.Relu6,
487 ActivationFunctionType.TANH: Op.Tanh,
488 ActivationFunctionType.SIGN_BIT: Op.SignBit,
Tim Hall79d07d22020-04-27 18:20:16 +0100489}
490
491activation_function_inv_map = inverse_map(activation_function_map)
492
493fused_act = ("fused_activation_function", activation_deserialize, activation_serialize)
494padding = ("padding", padding_deserialize, padding_serialize)
495
Tim Hall79d07d22020-04-27 18:20:16 +0100496is_int_vec = True
497
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200498TFLITE_NO_INDICES = TensorIndices([], [], [])
499TFLITE_IFM_INDICES = TensorIndices([0], [], [])
500TFLITE_IFM_WEIGHTS_INDICES = TensorIndices([0], [1], [])
501TFLITE_IFM_WEIGHTS_BIAS_INDICES = TensorIndices([0], [1], [2])
502TFLITE_IFM_IFM2_INDICES = TensorIndices([0, 1], [], [])
503TFLITE_CONV2D_BACKPROP_INDICES = TensorIndices([2], [1], [3])
504TFLITE_TRANSPOSE_CONV_INDICES = TensorIndices([0], [1], [3])
505TFLITE_CONCAT_INDICES = TensorIndices([1, 2], [], [])
506TFLITE_SPLIT_IFM_INDICES = TensorIndices([1], [], [])
507TFLITE_BLOCK_LSTM_INDICES = TensorIndices([3], [4], [])
508
Tim Hall79d07d22020-04-27 18:20:16 +0100509builtin_operator_map = {
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200510 BuiltinOperator.ADD: (
511 Op.Add,
512 OptionsSerializer("AddOptions", (fused_act, "pot_scale_int16")),
513 TFLITE_IFM_IFM2_INDICES,
514 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200515 BuiltinOperator.AVERAGE_POOL_2D: (
516 Op.AvgPool,
517 OptionsSerializer(
518 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
519 ),
520 TFLITE_IFM_INDICES,
521 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200522 BuiltinOperator.CONCATENATION: (
523 Op.ConcatTFLite,
524 OptionsSerializer("ConcatenationOptions", ("axis", fused_act)),
525 TFLITE_CONCAT_INDICES,
526 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200527 BuiltinOperator.CONV_2D: (
528 Op.Conv2DBias,
529 OptionsSerializer(
530 "Conv2DOptions", ("dilation_h_factor", "dilation_w_factor", fused_act, padding, "stride_h", "stride_w")
531 ),
532 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
533 ),
534 BuiltinOperator.DEPTHWISE_CONV_2D: (
535 Op.DepthwiseConv2DBias,
536 OptionsSerializer(
537 "DepthwiseConv2DOptions",
538 ("depth_multiplier", "dilation_h_factor", "dilation_w_factor", fused_act, padding, "stride_h", "stride_w"),
539 ),
540 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
541 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200542 BuiltinOperator.DEPTH_TO_SPACE: (
543 Op.DepthToSpace,
544 OptionsSerializer("DepthToSpaceOptions", ("block_size",)),
545 TFLITE_NO_INDICES,
546 ),
547 BuiltinOperator.DEQUANTIZE: (Op.Dequantize, OptionsSerializer("DequantizeOptions"), TFLITE_IFM_INDICES),
548 BuiltinOperator.EMBEDDING_LOOKUP: (Op.EmbeddingLookup, None, TFLITE_NO_INDICES),
549 BuiltinOperator.FLOOR: (Op.Floor, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100550 BuiltinOperator.FULLY_CONNECTED: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200551 Op.FullyConnected,
erik.andersson@arm.com0cbb1662021-02-22 15:47:07 +0100552 OptionsSerializer(
Dwight Lidman8a12da12021-07-19 13:43:05 +0200553 "FullyConnectedOptions", ("asymmetric_quantize_inputs", fused_act, "keep_num_dims", "weights_format")
erik.andersson@arm.com0cbb1662021-02-22 15:47:07 +0100554 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200555 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100556 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200557 BuiltinOperator.HASHTABLE_LOOKUP: (Op.HashtableLookup, None, TFLITE_NO_INDICES),
558 BuiltinOperator.L2_NORMALIZATION: (Op.L2Norm, OptionsSerializer("L2NormOptions", (fused_act,)), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200559 BuiltinOperator.L2_POOL_2D: (
560 Op.L2Pool2D,
561 OptionsSerializer(
562 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
563 ),
564 TFLITE_NO_INDICES,
565 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100566 BuiltinOperator.LOCAL_RESPONSE_NORMALIZATION: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200567 Op.LRN,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200568 OptionsSerializer("LocalResponseNormalizationOptions", ("alpha", "beta", "bias", "radius")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200569 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100570 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200571 BuiltinOperator.LOGISTIC: (Op.Sigmoid, None, TFLITE_IFM_INDICES),
572 BuiltinOperator.LSH_PROJECTION: (
573 Op.LSHProjection,
574 OptionsSerializer("LSHProjectionOptions", ("type",)),
575 TFLITE_NO_INDICES,
576 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200577 BuiltinOperator.LSTM: (
578 Op.Lstm,
579 OptionsSerializer(
580 "LSTMOptions", ("asymmetric_quantize_inputs", "cell_clip", fused_act, "kernel_type", "proj_clip")
581 ),
582 TFLITE_IFM_WEIGHTS_INDICES,
583 ),
584 BuiltinOperator.MAX_POOL_2D: (
585 Op.MaxPool,
586 OptionsSerializer(
587 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
588 ),
589 TFLITE_IFM_INDICES,
590 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200591 BuiltinOperator.MUL: (Op.Mul, OptionsSerializer("MulOptions", (fused_act,)), TFLITE_IFM_IFM2_INDICES),
592 BuiltinOperator.RELU: (Op.Relu, None, TFLITE_IFM_INDICES),
erik.andersson@arm.comdd49a722022-08-10 15:26:48 +0200593 BuiltinOperator.RELU_0_TO_1: (Op.Relu0To1, None, TFLITE_IFM_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200594 BuiltinOperator.RELU_N1_TO_1: (Op.ReluN1To1, None, TFLITE_IFM_INDICES),
595 BuiltinOperator.RELU6: (Op.Relu6, None, TFLITE_IFM_INDICES),
596 BuiltinOperator.RESHAPE: (
597 Op.Reshape,
Dwight Lidmancfb42622021-08-11 12:28:51 +0200598 OptionsSerializer("ReshapeOptions", (("new_shape", is_int_vec),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200599 TFLITE_IFM_INDICES,
600 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100601 BuiltinOperator.RESIZE_BILINEAR: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200602 Op.ResizeBilinear,
Tim Hall79d07d22020-04-27 18:20:16 +0100603 OptionsSerializer("ResizeBilinearOptions", ("align_corners", "half_pixel_centers")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200604 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100605 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200606 BuiltinOperator.RNN: (
607 Op.Rnn,
608 OptionsSerializer("RNNOptions", ("asymmetric_quantize_inputs", fused_act)),
609 TFLITE_IFM_WEIGHTS_INDICES,
610 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200611 BuiltinOperator.SOFTMAX: (Op.Softmax, OptionsSerializer("SoftmaxOptions", ("beta",)), TFLITE_IFM_INDICES),
612 BuiltinOperator.SPACE_TO_DEPTH: (
613 Op.SpaceToDepth,
614 OptionsSerializer("SpaceToDepthOptions", ("block_size",)),
615 TFLITE_NO_INDICES,
616 ),
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200617 BuiltinOperator.SVDF: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200618 Op.Svdf,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200619 OptionsSerializer("SVDFOptions", ("asymmetric_quantize_inputs", fused_act, "rank")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200620 TFLITE_NO_INDICES,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200621 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200622 BuiltinOperator.TANH: (Op.Tanh, None, TFLITE_IFM_INDICES),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200623 BuiltinOperator.CONCAT_EMBEDDINGS: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200624 Op.ConcatEmbeddings,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200625 OptionsSerializer(
626 "ConcatEmbeddingsOptions",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200627 (
Dwight Lidman8a12da12021-07-19 13:43:05 +0200628 "embedding_dim_per_channel",
629 "embedding_dim_per_channel_as_numpy",
630 "embedding_dim_per_channel_is_none",
631 "embedding_dim_per_channel_length",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200632 "num_channels",
633 "num_columns_per_channel",
634 "num_columns_per_channel_as_numpy",
Dwight Lidman8a12da12021-07-19 13:43:05 +0200635 "num_columns_per_channel_is_none",
636 "num_columns_per_channel_length",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200637 ),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200638 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200639 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200640 ),
641 BuiltinOperator.SKIP_GRAM: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200642 Op.SkipGram,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200643 OptionsSerializer("SkipGramOptions", ("include_all_ngrams", "max_skip_size", "ngram_size")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200644 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200645 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200646 BuiltinOperator.CALL: (Op.Call, OptionsSerializer("CallOptions", ("subgraph",)), TFLITE_NO_INDICES),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200647 BuiltinOperator.EMBEDDING_LOOKUP_SPARSE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200648 Op.EmbeddingLookupSparse,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200649 OptionsSerializer("EmbeddingLookupSparseOptions", ("combiner",)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200650 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200651 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200652 BuiltinOperator.PAD: (Op.Pad, OptionsSerializer("PadOptions"), TFLITE_IFM_INDICES),
653 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_RNN: (
654 Op.UnidirectionalSequenceRnn,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200655 OptionsSerializer("SequenceRNNOptions", ("asymmetric_quantize_inputs", fused_act, "time_major")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200656 TFLITE_IFM_WEIGHTS_INDICES,
657 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200658 BuiltinOperator.GATHER: (
659 Op.GatherV2,
660 OptionsSerializer("GatherOptions", ("axis", "batch_dims")),
661 TFLITE_NO_INDICES,
662 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200663 BuiltinOperator.BATCH_TO_SPACE_ND: (
664 Op.BatchToSpaceND,
665 OptionsSerializer("BatchToSpaceNDOptions"),
666 TFLITE_NO_INDICES,
667 ),
668 BuiltinOperator.SPACE_TO_BATCH_ND: (
669 Op.SpaceToBatchND,
670 OptionsSerializer("SpaceToBatchNDOptions"),
671 TFLITE_NO_INDICES,
672 ),
James Ward6bf16132021-09-08 11:14:20 +0100673 BuiltinOperator.TRANSPOSE: (Op.Transpose, OptionsSerializer("TransposeOptions"), TFLITE_IFM_IFM2_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200674 BuiltinOperator.MEAN: (Op.Mean, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_IFM_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200675 BuiltinOperator.SUB: (
676 Op.Sub,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200677 OptionsSerializer("SubOptions", (fused_act, "pot_scale_int16")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200678 TFLITE_IFM_IFM2_INDICES,
679 ),
680 BuiltinOperator.DIV: (Op.Div, OptionsSerializer("DivOptions", (fused_act,)), TFLITE_NO_INDICES),
681 BuiltinOperator.SQUEEZE: (
682 Op.Squeeze,
Jonas Ohlssond8575072022-03-30 10:30:25 +0200683 OptionsSerializer(
684 "SqueezeOptions",
685 (("squeeze_dims", is_int_vec),),
686 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200687 TFLITE_IFM_INDICES,
688 ),
689 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_LSTM: (
690 Op.UnidirectionalSequenceLstm,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200691 OptionsSerializer(
692 "UnidirectionalSequenceLSTMOptions",
693 ("asymmetric_quantize_inputs", "cell_clip", fused_act, "proj_clip", "time_major"),
694 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200695 TFLITE_IFM_WEIGHTS_INDICES,
696 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100697 BuiltinOperator.STRIDED_SLICE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200698 Op.StridedSlice,
Tim Hall79d07d22020-04-27 18:20:16 +0100699 OptionsSerializer(
Dwight Lidman8a12da12021-07-19 13:43:05 +0200700 "StridedSliceOptions", ("begin_mask", "ellipsis_mask", "end_mask", "new_axis_mask", "shrink_axis_mask")
Tim Hall79d07d22020-04-27 18:20:16 +0100701 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200702 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100703 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200704 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_RNN: (
705 Op.BidirectionalSequenceRnn,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200706 OptionsSerializer(
707 "BidirectionalSequenceRNNOptions", ("asymmetric_quantize_inputs", fused_act, "merge_outputs", "time_major")
708 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200709 TFLITE_IFM_WEIGHTS_INDICES,
710 ),
James Ward6bf16132021-09-08 11:14:20 +0100711 BuiltinOperator.EXP: (Op.Exp, OptionsSerializer("ExpOptions"), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200712 BuiltinOperator.TOPK_V2: (Op.TopKV2, OptionsSerializer("TopKV2Options"), TFLITE_NO_INDICES),
713 BuiltinOperator.SPLIT: (Op.Split, OptionsSerializer("SplitOptions", ("num_splits",)), TFLITE_SPLIT_IFM_INDICES),
714 BuiltinOperator.LOG_SOFTMAX: (Op.LogSoftmax, OptionsSerializer("LogSoftmaxOptions"), TFLITE_NO_INDICES),
715 BuiltinOperator.DELEGATE: (Op.Delegate, None, TFLITE_NO_INDICES),
716 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_LSTM: (
717 Op.BidirectionalSequenceLstm,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200718 OptionsSerializer(
719 "BidirectionalSequenceLSTMOptions",
720 ("asymmetric_quantize_inputs", "cell_clip", fused_act, "merge_outputs", "proj_clip", "time_major"),
721 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200722 TFLITE_IFM_WEIGHTS_INDICES,
723 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100724 BuiltinOperator.CAST: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200725 Op.Cast,
Tim Hall79d07d22020-04-27 18:20:16 +0100726 OptionsSerializer(
727 "CastOptions",
728 (
729 ("in_data_type", datatype_deserialize, datatype_serialize),
730 ("out_data_type", datatype_deserialize, datatype_serialize),
731 ),
732 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200733 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100734 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200735 BuiltinOperator.PRELU: (Op.Prelu, None, TFLITE_NO_INDICES),
736 BuiltinOperator.MAXIMUM: (Op.Maximum, OptionsSerializer("MaximumMinimumOptions"), TFLITE_IFM_IFM2_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100737 BuiltinOperator.ARG_MAX: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200738 Op.ArgMax,
Tim Hall79d07d22020-04-27 18:20:16 +0100739 OptionsSerializer("ArgMaxOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200740 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100741 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200742 BuiltinOperator.MINIMUM: (Op.Minimum, OptionsSerializer("MaximumMinimumOptions"), TFLITE_IFM_IFM2_INDICES),
743 BuiltinOperator.LESS: (Op.Less, OptionsSerializer("LessOptions"), TFLITE_NO_INDICES),
744 BuiltinOperator.NEG: (Op.Neg, OptionsSerializer("NegOptions"), TFLITE_NO_INDICES),
745 BuiltinOperator.PADV2: (Op.PadV2, OptionsSerializer("PadV2Options"), TFLITE_NO_INDICES),
746 BuiltinOperator.GREATER: (Op.Greater, OptionsSerializer("GreaterOptions"), TFLITE_NO_INDICES),
747 BuiltinOperator.GREATER_EQUAL: (Op.GreaterEqual, OptionsSerializer("GreaterEqualOptions"), TFLITE_NO_INDICES),
748 BuiltinOperator.LESS_EQUAL: (Op.LessEqual, OptionsSerializer("LessEqualOptions"), TFLITE_NO_INDICES),
749 BuiltinOperator.SELECT: (Op.Select, OptionsSerializer("SelectOptions"), TFLITE_NO_INDICES),
750 BuiltinOperator.SLICE: (Op.Slice, OptionsSerializer("SliceOptions"), TFLITE_IFM_INDICES),
751 BuiltinOperator.SIN: (Op.Sin, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100752 BuiltinOperator.TRANSPOSE_CONV: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200753 Op.Conv2DBackpropInput,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200754 OptionsSerializer("TransposeConvOptions", (padding, "stride_h", "stride_w")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200755 TFLITE_CONV2D_BACKPROP_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100756 ),
757 BuiltinOperator.SPARSE_TO_DENSE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200758 Op.SparseToDense,
Tim Hall79d07d22020-04-27 18:20:16 +0100759 OptionsSerializer("SparseToDenseOptions", ("validate_indices",)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200760 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100761 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200762 BuiltinOperator.TILE: (Op.Tile, OptionsSerializer("TileOptions"), TFLITE_NO_INDICES),
763 BuiltinOperator.EXPAND_DIMS: (Op.ExpandDims, OptionsSerializer("ExpandDimsOptions"), TFLITE_IFM_INDICES),
764 BuiltinOperator.EQUAL: (Op.Equal, OptionsSerializer("EqualOptions"), TFLITE_NO_INDICES),
765 BuiltinOperator.NOT_EQUAL: (Op.NotEqual, OptionsSerializer("NotEqualOptions"), TFLITE_NO_INDICES),
766 BuiltinOperator.LOG: (Op.Log, None, TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200767 BuiltinOperator.SUM: (Op.Sum, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200768 BuiltinOperator.SQRT: (Op.Sqrt, None, TFLITE_NO_INDICES),
769 BuiltinOperator.RSQRT: (Op.Rsqrt, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100770 BuiltinOperator.SHAPE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200771 Op.Shape,
Tim Hall79d07d22020-04-27 18:20:16 +0100772 OptionsSerializer("ShapeOptions", (("out_type", datatype_deserialize, datatype_serialize),)),
Ayaan Masood4965fae2022-06-29 11:30:57 +0100773 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100774 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200775 BuiltinOperator.POW: (Op.Pow, OptionsSerializer("PowOptions"), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100776 BuiltinOperator.ARG_MIN: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200777 Op.ArgMin,
Tim Hall79d07d22020-04-27 18:20:16 +0100778 OptionsSerializer("ArgMinOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200779 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100780 ),
781 BuiltinOperator.FAKE_QUANT: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200782 Op.FakeQuantWithMinMaxArgs,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200783 OptionsSerializer("FakeQuantOptions", ("max", "min", "narrow_range", "num_bits")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200784 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100785 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200786 BuiltinOperator.REDUCE_PROD: (Op.Prod, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
787 BuiltinOperator.REDUCE_MAX: (Op.Max, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
788 BuiltinOperator.PACK: (Op.Pack, OptionsSerializer("PackOptions", ("axis", "values_count")), TFLITE_IFM_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200789 BuiltinOperator.LOGICAL_OR: (Op.LogicalOr, OptionsSerializer("LogicalOrOptions"), TFLITE_NO_INDICES),
790 BuiltinOperator.ONE_HOT: (Op.OneHot, OptionsSerializer("OneHotOptions", ("axis",)), TFLITE_NO_INDICES),
791 BuiltinOperator.LOGICAL_AND: (Op.LogicalAnd, OptionsSerializer("LogicalAndOptions"), TFLITE_NO_INDICES),
792 BuiltinOperator.LOGICAL_NOT: (Op.LogicalNot, OptionsSerializer("LogicalNotOptions"), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200793 BuiltinOperator.UNPACK: (Op.Unpack, OptionsSerializer("UnpackOptions", ("axis", "num")), TFLITE_IFM_INDICES),
794 BuiltinOperator.REDUCE_MIN: (Op.Min, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200795 BuiltinOperator.FLOOR_DIV: (Op.FloorDiv, OptionsSerializer("FloorDivOptions"), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200796 BuiltinOperator.REDUCE_ANY: (Op.Any, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200797 BuiltinOperator.SQUARE: (Op.Square, OptionsSerializer("SquareOptions"), TFLITE_NO_INDICES),
798 BuiltinOperator.ZEROS_LIKE: (Op.ZerosLike, OptionsSerializer("ZerosLikeOptions"), TFLITE_NO_INDICES),
799 BuiltinOperator.FILL: (Op.Fill, OptionsSerializer("FillOptions"), TFLITE_NO_INDICES),
800 BuiltinOperator.FLOOR_MOD: (Op.FloorMod, OptionsSerializer("FloorModOptions"), TFLITE_NO_INDICES),
801 BuiltinOperator.RANGE: (Op.Range, OptionsSerializer("RangeOptions"), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100802 BuiltinOperator.RESIZE_NEAREST_NEIGHBOR: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200803 Op.ResizeNearestNeighbor,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200804 OptionsSerializer("ResizeNearestNeighborOptions", ("align_corners", "half_pixel_centers")),
Tim Hall885033b2022-07-21 11:46:03 +0100805 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100806 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200807 BuiltinOperator.LEAKY_RELU: (Op.LeakyRelu, OptionsSerializer("LeakyReluOptions", ("alpha",)), TFLITE_IFM_INDICES),
808 BuiltinOperator.SQUARED_DIFFERENCE: (
809 Op.SquaredDifference,
810 OptionsSerializer("SquaredDifferenceOptions"),
811 TFLITE_NO_INDICES,
812 ),
813 BuiltinOperator.MIRROR_PAD: (Op.MirrorPad, OptionsSerializer("MirrorPadOptions", ("mode",)), TFLITE_NO_INDICES),
814 BuiltinOperator.ABS: (Op.Abs, OptionsSerializer("AbsOptions"), TFLITE_IFM_INDICES),
815 BuiltinOperator.SPLIT_V: (Op.SplitV, OptionsSerializer("SplitVOptions", ("num_splits",)), TFLITE_IFM_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100816 BuiltinOperator.UNIQUE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200817 Op.Unique,
Tim Hall79d07d22020-04-27 18:20:16 +0100818 OptionsSerializer("UniqueOptions", (("idx_out_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200819 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100820 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200821 BuiltinOperator.CEIL: (Op.Ceil, None, TFLITE_NO_INDICES),
822 BuiltinOperator.REVERSE_V2: (Op.ReverseV2, OptionsSerializer("ReverseV2Options"), TFLITE_NO_INDICES),
823 BuiltinOperator.ADD_N: (Op.AddN, OptionsSerializer("AddNOptions"), TFLITE_NO_INDICES),
824 BuiltinOperator.GATHER_ND: (Op.GatherNd, OptionsSerializer("GatherNdOptions"), TFLITE_NO_INDICES),
825 BuiltinOperator.COS: (Op.Cos, OptionsSerializer("CosOptions"), TFLITE_NO_INDICES),
826 BuiltinOperator.WHERE: (Op.Where, OptionsSerializer("WhereOptions"), TFLITE_NO_INDICES),
827 BuiltinOperator.RANK: (Op.Rank, OptionsSerializer("RankOptions"), TFLITE_NO_INDICES),
828 BuiltinOperator.ELU: (Op.Elu, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100829 BuiltinOperator.REVERSE_SEQUENCE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200830 Op.ReverseSequence,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200831 OptionsSerializer("ReverseSequenceOptions", ("batch_dim", "seq_dim")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200832 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100833 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200834 BuiltinOperator.MATRIX_DIAG: (Op.MatrixDiag, OptionsSerializer("MatrixDiagOptions"), TFLITE_NO_INDICES),
835 BuiltinOperator.QUANTIZE: (Op.Quantize, OptionsSerializer("QuantizeOptions"), TFLITE_IFM_INDICES),
836 BuiltinOperator.MATRIX_SET_DIAG: (Op.MatrixSetDiag, OptionsSerializer("MatrixSetDiagOptions"), TFLITE_NO_INDICES),
837 BuiltinOperator.ROUND: (Op.Round, None, TFLITE_NO_INDICES),
838 BuiltinOperator.HARD_SWISH: (Op.HardSwish, OptionsSerializer("HardSwishOptions"), TFLITE_IFM_INDICES),
839 BuiltinOperator.IF: (
840 Op.If,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200841 OptionsSerializer("IfOptions", ("else_subgraph_index", "then_subgraph_index")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200842 TFLITE_NO_INDICES,
843 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200844 BuiltinOperator.WHILE: (
845 Op.While,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200846 OptionsSerializer("WhileOptions", ("body_subgraph_index", "cond_subgraph_index")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200847 TFLITE_NO_INDICES,
Louis Verhaardaee5d752020-09-30 09:01:52 +0200848 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200849 BuiltinOperator.NON_MAX_SUPPRESSION_V4: (
850 Op.NonMaxSuppressionV4,
851 OptionsSerializer("NonMaxSuppressionV4Options"),
852 TFLITE_NO_INDICES,
853 ),
854 BuiltinOperator.NON_MAX_SUPPRESSION_V5: (
855 Op.NonMaxSuppressionV5,
856 OptionsSerializer("NonMaxSuppressionV5Options"),
857 TFLITE_NO_INDICES,
858 ),
859 BuiltinOperator.SCATTER_ND: (Op.ScatterNd, OptionsSerializer("ScatterNdOptions"), TFLITE_NO_INDICES),
860 BuiltinOperator.SELECT_V2: (Op.SelectV2, OptionsSerializer("SelectV2Options"), TFLITE_NO_INDICES),
861 BuiltinOperator.DENSIFY: (Op.Densify, OptionsSerializer("DensifyOptions"), TFLITE_NO_INDICES),
862 BuiltinOperator.SEGMENT_SUM: (Op.SegmentSum, OptionsSerializer("SegmentSumOptions"), TFLITE_NO_INDICES),
863 BuiltinOperator.BATCH_MATMUL: (
864 Op.BatchMatMul,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200865 OptionsSerializer("BatchMatMulOptions", ("adj_x", "adj_y", "asymmetric_quantize_inputs")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200866 TFLITE_NO_INDICES,
867 ),
868 BuiltinOperator.CUMSUM: (
869 Op.Cumsum,
870 OptionsSerializer("CumsumOptions", ("exclusive", "reverse")),
871 TFLITE_NO_INDICES,
872 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200873 BuiltinOperator.CALL_ONCE: (
874 Op.CallOnce,
875 OptionsSerializer("CallOnceOptions", ("init_subgraph_index",)),
876 TFLITE_NO_INDICES,
877 ),
878 BuiltinOperator.BROADCAST_TO: (Op.BroadcastTo, OptionsSerializer("BroadcastToOptions"), TFLITE_NO_INDICES),
879 BuiltinOperator.RFFT2D: (Op.Rfft2D, OptionsSerializer("Rfft2dOptions"), TFLITE_NO_INDICES),
880 BuiltinOperator.CONV_3D: (
881 Op.Conv3D,
882 OptionsSerializer(
883 "Conv3DOptions",
884 (
885 "dilation_d_factor",
886 "dilation_h_factor",
887 "dilation_w_factor",
888 fused_act,
889 padding,
890 "stride_d",
891 "stride_h",
892 "stride_w",
893 ),
894 ),
895 TFLITE_NO_INDICES,
896 ),
897 BuiltinOperator.IMAG: (Op.Imag, None, TFLITE_NO_INDICES),
898 BuiltinOperator.REAL: (Op.Real, None, TFLITE_NO_INDICES),
899 BuiltinOperator.COMPLEX_ABS: (Op.ComplexAbs, None, TFLITE_NO_INDICES),
900 BuiltinOperator.HASHTABLE: (
901 Op.Hashtable,
902 OptionsSerializer("HashtableOptions", ("key_dtype", "table_id", "value_dtype")),
903 TFLITE_NO_INDICES,
904 ),
905 BuiltinOperator.HASHTABLE_FIND: (Op.HashtableFind, OptionsSerializer("HashtableFindOptions"), TFLITE_NO_INDICES),
906 BuiltinOperator.HASHTABLE_IMPORT: (
907 Op.HashtableImport,
908 OptionsSerializer("HashtableImportOptions"),
909 TFLITE_NO_INDICES,
910 ),
911 BuiltinOperator.HASHTABLE_SIZE: (Op.HashtableSize, OptionsSerializer("HashtableSizeOptions"), TFLITE_NO_INDICES),
912 BuiltinOperator.REDUCE_ALL: (Op.ReduceAll, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
913 BuiltinOperator.CONV_3D_TRANSPOSE: (
914 Op.Conv3DTranspose,
915 OptionsSerializer(
916 "Conv3DOptions",
917 (
918 "dilation_d_factor",
919 "dilation_h_factor",
920 "dilation_w_factor",
921 fused_act,
922 padding,
923 "stride_d",
924 "stride_h",
925 "stride_w",
926 ),
927 ),
928 TFLITE_NO_INDICES,
929 ),
Rickard Bolin2de898a2021-12-20 08:35:23 +0000930 BuiltinOperator.VAR_HANDLE: (
931 Op.VarHandle,
Jonas Ohlssond8575072022-03-30 10:30:25 +0200932 OptionsSerializer(
933 "VarHandleOptions",
934 (
935 "container",
936 "shared_name",
937 ),
938 ),
Rickard Bolin2de898a2021-12-20 08:35:23 +0000939 TFLITE_NO_INDICES,
940 ),
941 BuiltinOperator.READ_VARIABLE: (Op.ReadVariable, OptionsSerializer("ReadVariableOptions"), TFLITE_NO_INDICES),
942 BuiltinOperator.ASSIGN_VARIABLE: (Op.AssignVariable, OptionsSerializer("AssignVariableOptions"), TFLITE_NO_INDICES),
943 BuiltinOperator.BROADCAST_ARGS: (Op.BroadcastArgs, None, TFLITE_NO_INDICES),
944 BuiltinOperator.RANDOM_STANDARD_NORMAL: (
945 Op.RandomStandardNormal,
Jonas Ohlssond8575072022-03-30 10:30:25 +0200946 OptionsSerializer(
947 "RandomOptions",
948 (
949 "seed",
950 "seed2",
951 ),
952 ),
Rickard Bolin2de898a2021-12-20 08:35:23 +0000953 TFLITE_NO_INDICES,
954 ),
Rickard Bolind66f8012022-04-21 07:36:55 +0000955 BuiltinOperator.BUCKETIZE: (
956 Op.Bucketize,
957 OptionsSerializer(
958 "BucketizeOptions",
959 ("boundaries", "boundaries_as_numpy", "boundaries_length", "boundaries_is_none"),
960 ),
961 TFLITE_NO_INDICES,
962 ),
963 BuiltinOperator.RANDOM_UNIFORM: (Op.RandomUniform, None, TFLITE_NO_INDICES),
964 BuiltinOperator.MULTINOMIAL: (Op.Multinomial, None, TFLITE_NO_INDICES),
965 BuiltinOperator.GELU: (Op.Gelu, OptionsSerializer("GeluOptions", ("approximate",)), TFLITE_NO_INDICES),
966 BuiltinOperator.DYNAMIC_UPDATE_SLICE: (
967 Op.DynamicUpdateSlice,
968 OptionsSerializer("DynamicUpdateSliceOptions"),
969 TFLITE_NO_INDICES,
970 ),
erik.andersson@arm.comdd49a722022-08-10 15:26:48 +0200971 BuiltinOperator.UNSORTED_SEGMENT_PROD: (
972 Op.UnsortedSegmentProd,
973 OptionsSerializer("UnsortedSegmentProdOptions", ("numsegments",)),
974 TFLITE_NO_INDICES,
975 ),
Tim Hallb94bcd42021-09-07 14:24:51 +0100976 BuiltinOperator.CUSTOM: (Op.Custom, CustomOptionsSerializer(), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100977}
978
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200979builtin_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 +0100980
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200981builtin_operator_inv_map[Op.CustomNpuOp] = (BuiltinOperator.CUSTOM, CustomOptionsSerializer(), TFLITE_NO_INDICES)
Michael McGeagh219ec072020-11-09 11:11:26 +0000982
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000983BUILTIN_OPERATOR_UNKNOWN = "UNKNOWN"
984
Tim Halla3fe6652022-03-03 17:43:16 +0000985builtin_operator_name_map = {v: k for k, v in vars(BuiltinOperator).items()}
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000986
Michael McGeagh219ec072020-11-09 11:11:26 +0000987
Tim Halla3fe6652022-03-03 17:43:16 +0000988def optype_to_builtintype(op_type: Op):
Michael McGeagh219ec072020-11-09 11:11:26 +0000989 if op_type in builtin_operator_inv_map:
Tim Halla3fe6652022-03-03 17:43:16 +0000990 return builtin_operator_name_map[builtin_operator_inv_map[op_type][0]]
Michael McGeagh219ec072020-11-09 11:11:26 +0000991 else:
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000992 return BUILTIN_OPERATOR_UNKNOWN