blob: 4e8507d0873948b1eeec3b8cd48b5a8ca913785d [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
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +020035from .tflite import ATan2Options
Jacob Bohlin8daf6b72020-09-15 16:28:35 +020036from .tflite import BatchMatMulOptions
Diego Russoe8a10452020-04-21 17:39:10 +010037from .tflite import BatchToSpaceNDOptions
Tim Hall79d07d22020-04-27 18:20:16 +010038from .tflite import BidirectionalSequenceLSTMOptions
39from .tflite import BidirectionalSequenceRNNOptions
Dwight Lidman8a12da12021-07-19 13:43:05 +020040from .tflite import BroadcastToOptions
Rickard Bolind66f8012022-04-21 07:36:55 +000041from .tflite import BucketizeOptions
Dwight Lidman8a12da12021-07-19 13:43:05 +020042from .tflite import CallOnceOptions
Diego Russoe8a10452020-04-21 17:39:10 +010043from .tflite import CallOptions
44from .tflite import CastOptions
45from .tflite import ConcatEmbeddingsOptions
46from .tflite import ConcatenationOptions
47from .tflite import Conv2DOptions
Dwight Lidman8a12da12021-07-19 13:43:05 +020048from .tflite import Conv3DOptions
Tim Hall79d07d22020-04-27 18:20:16 +010049from .tflite import CosOptions
Tim Hall42abec12021-02-04 21:31:57 +000050from .tflite import CumsumOptions
Tim Hall79d07d22020-04-27 18:20:16 +010051from .tflite import DensifyOptions
52from .tflite import DepthToSpaceOptions
Diego Russoe8a10452020-04-21 17:39:10 +010053from .tflite import DepthwiseConv2DOptions
54from .tflite import DequantizeOptions
55from .tflite import DivOptions
Rickard Bolind66f8012022-04-21 07:36:55 +000056from .tflite import DynamicUpdateSliceOptions
Diego Russoe8a10452020-04-21 17:39:10 +010057from .tflite import EmbeddingLookupSparseOptions
58from .tflite import EqualOptions
59from .tflite import ExpandDimsOptions
60from .tflite import ExpOptions
61from .tflite import FakeQuantOptions
62from .tflite import FillOptions
63from .tflite import FloorDivOptions
64from .tflite import FloorModOptions
65from .tflite import FullyConnectedOptions
66from .tflite import GatherNdOptions
67from .tflite import GatherOptions
Rickard Bolind66f8012022-04-21 07:36:55 +000068from .tflite import GeluOptions
Diego Russoe8a10452020-04-21 17:39:10 +010069from .tflite import GreaterEqualOptions
70from .tflite import GreaterOptions
Louis Verhaard678645b2020-06-15 15:22:47 +020071from .tflite import HardSwishOptions
Dwight Lidman8a12da12021-07-19 13:43:05 +020072from .tflite import HashtableFindOptions
73from .tflite import HashtableImportOptions
74from .tflite import HashtableOptions
75from .tflite import HashtableSizeOptions
Tim Hall79d07d22020-04-27 18:20:16 +010076from .tflite import IfOptions
Diego Russoe8a10452020-04-21 17:39:10 +010077from .tflite import L2NormOptions
78from .tflite import LeakyReluOptions
79from .tflite import LessEqualOptions
80from .tflite import LessOptions
81from .tflite import LocalResponseNormalizationOptions
82from .tflite import LogicalAndOptions
83from .tflite import LogicalNotOptions
84from .tflite import LogicalOrOptions
85from .tflite import LogSoftmaxOptions
86from .tflite import LSHProjectionOptions
87from .tflite import LSTMOptions
88from .tflite import MatrixDiagOptions
89from .tflite import MatrixSetDiagOptions
90from .tflite import MaximumMinimumOptions
91from .tflite import MirrorPadOptions
92from .tflite import MulOptions
93from .tflite import NegOptions
Tim Hall79d07d22020-04-27 18:20:16 +010094from .tflite import NonMaxSuppressionV4Options
95from .tflite import NonMaxSuppressionV5Options
Diego Russoe8a10452020-04-21 17:39:10 +010096from .tflite import NotEqualOptions
97from .tflite import OneHotOptions
98from .tflite import PackOptions
99from .tflite import PadOptions
100from .tflite import PadV2Options
101from .tflite import Pool2DOptions
102from .tflite import PowOptions
103from .tflite import QuantizeOptions
Rickard Bolin2de898a2021-12-20 08:35:23 +0000104from .tflite import RandomOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100105from .tflite import RangeOptions
106from .tflite import RankOptions
Rickard Bolin2de898a2021-12-20 08:35:23 +0000107from .tflite import ReadVariableOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100108from .tflite import ReducerOptions
109from .tflite import ReshapeOptions
110from .tflite import ResizeBilinearOptions
111from .tflite import ResizeNearestNeighborOptions
112from .tflite import ReverseSequenceOptions
113from .tflite import ReverseV2Options
Dwight Lidman8a12da12021-07-19 13:43:05 +0200114from .tflite import Rfft2dOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100115from .tflite import RNNOptions
Tim Hall79d07d22020-04-27 18:20:16 +0100116from .tflite import ScatterNdOptions
117from .tflite import SegmentSumOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100118from .tflite import SelectOptions
Tim Hall79d07d22020-04-27 18:20:16 +0100119from .tflite import SelectV2Options
Diego Russoe8a10452020-04-21 17:39:10 +0100120from .tflite import SequenceRNNOptions
121from .tflite import ShapeOptions
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200122from .tflite import SignOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100123from .tflite import SkipGramOptions
124from .tflite import SliceOptions
125from .tflite import SoftmaxOptions
126from .tflite import SpaceToBatchNDOptions
127from .tflite import SpaceToDepthOptions
128from .tflite import SparseToDenseOptions
129from .tflite import SplitOptions
130from .tflite import SplitVOptions
131from .tflite import SquaredDifferenceOptions
132from .tflite import SquareOptions
133from .tflite import SqueezeOptions
134from .tflite import StridedSliceOptions
135from .tflite import SubOptions
136from .tflite import SVDFOptions
137from .tflite import TileOptions
138from .tflite import TopKV2Options
139from .tflite import TransposeConvOptions
140from .tflite import TransposeOptions
141from .tflite import UnidirectionalSequenceLSTMOptions
142from .tflite import UniqueOptions
143from .tflite import UnpackOptions
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200144from .tflite import UnsortedSegmentMaxOptions
145from .tflite import UnsortedSegmentMinOptions
erik.andersson@arm.comdd49a722022-08-10 15:26:48 +0200146from .tflite import UnsortedSegmentProdOptions
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200147from .tflite import UnsortedSegmentSumOptions
Rickard Bolin2de898a2021-12-20 08:35:23 +0000148from .tflite import VarHandleOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100149from .tflite import WhereOptions
Tim Hall79d07d22020-04-27 18:20:16 +0100150from .tflite import WhileOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100151from .tflite import ZerosLikeOptions
152from .tflite.ActivationFunctionType import ActivationFunctionType
Diego Russoea6111a2020-04-14 18:41:58 +0100153from .tflite.BuiltinOperator import BuiltinOperator
154from .tflite.BuiltinOptions import BuiltinOptions
155from .tflite.Padding import Padding
Diego Russoe8a10452020-04-21 17:39:10 +0100156from .tflite.TensorType import TensorType
Tim Hall79d07d22020-04-27 18:20:16 +0100157
158
159def inverse_map(map):
160 return {v: k for k, v in map.items()}
161
162
163datatype_map = {
164 TensorType.UINT8: DataType.uint8,
165 TensorType.INT8: DataType.int8,
166 TensorType.INT16: DataType.int16,
167 TensorType.INT32: DataType.int32,
168 TensorType.INT64: DataType.int64,
169 TensorType.FLOAT16: DataType.float16,
170 TensorType.FLOAT32: DataType.float32,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200171 TensorType.FLOAT64: DataType.float64,
Tim Hall79d07d22020-04-27 18:20:16 +0100172 TensorType.STRING: DataType.string,
173 TensorType.BOOL: DataType.bool,
Jacob Bohlinf767b932020-08-13 15:32:45 +0200174 TensorType.COMPLEX64: DataType.complex64,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200175 TensorType.COMPLEX128: DataType.complex128,
Dwight Lidmanf53b3322021-10-08 11:58:08 +0200176 TensorType.UINT64: DataType.uint64,
177 TensorType.RESOURCE: DataType.resource,
178 TensorType.VARIANT: DataType.variant,
179 TensorType.UINT32: DataType.uint32,
Rickard Bolind66f8012022-04-21 07:36:55 +0000180 TensorType.UINT16: DataType.uint16,
Tim Hall79d07d22020-04-27 18:20:16 +0100181}
182
183datatype_inv_map = inverse_map(datatype_map)
184datatype_inv_map[DataType.quint8] = TensorType.UINT8
185
186datatype_inv_map[DataType.qint8] = TensorType.INT8
187datatype_inv_map[DataType.qint16] = TensorType.INT16
188datatype_inv_map[DataType.qint32] = TensorType.INT32
189
190
191datatype_map_numpy = {
192 TensorType.UINT8: np.uint8,
Rickard Bolind66f8012022-04-21 07:36:55 +0000193 TensorType.UINT16: np.uint16,
Dwight Lidmanf53b3322021-10-08 11:58:08 +0200194 TensorType.UINT32: np.uint32,
195 TensorType.UINT64: np.uint64,
Tim Hall79d07d22020-04-27 18:20:16 +0100196 TensorType.INT8: np.int8,
197 TensorType.INT16: np.int16,
198 TensorType.INT32: np.int32,
199 TensorType.INT64: np.int64,
200 TensorType.FLOAT16: np.float16,
201 TensorType.FLOAT32: np.float32,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200202 TensorType.FLOAT64: np.float64,
Tim Hall79d07d22020-04-27 18:20:16 +0100203 TensorType.BOOL: np.bool,
Jacob Bohlinf767b932020-08-13 15:32:45 +0200204 TensorType.COMPLEX64: np.complex64,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200205 TensorType.COMPLEX128: np.complex128,
Louis Verhaardf4e12be2020-12-18 14:23:06 +0100206 TensorType.STRING: np.uint8,
Dwight Lidmanf53b3322021-10-08 11:58:08 +0200207 TensorType.RESOURCE: None, # experimental type
208 TensorType.VARIANT: None, # experimental type
Tim Hall79d07d22020-04-27 18:20:16 +0100209}
210
211
212builtin_options_map = {
213 BuiltinOptions.Conv2DOptions: Conv2DOptions.Conv2DOptions,
214 BuiltinOptions.DepthwiseConv2DOptions: DepthwiseConv2DOptions.DepthwiseConv2DOptions,
215 BuiltinOptions.ConcatEmbeddingsOptions: ConcatEmbeddingsOptions.ConcatEmbeddingsOptions,
216 BuiltinOptions.LSHProjectionOptions: LSHProjectionOptions.LSHProjectionOptions,
217 BuiltinOptions.Pool2DOptions: Pool2DOptions.Pool2DOptions,
218 BuiltinOptions.SVDFOptions: SVDFOptions.SVDFOptions,
219 BuiltinOptions.RNNOptions: RNNOptions.RNNOptions,
220 BuiltinOptions.FullyConnectedOptions: FullyConnectedOptions.FullyConnectedOptions,
221 BuiltinOptions.SoftmaxOptions: SoftmaxOptions.SoftmaxOptions,
222 BuiltinOptions.ConcatenationOptions: ConcatenationOptions.ConcatenationOptions,
223 BuiltinOptions.AddOptions: AddOptions.AddOptions,
224 BuiltinOptions.L2NormOptions: L2NormOptions.L2NormOptions,
225 BuiltinOptions.LocalResponseNormalizationOptions: LocalResponseNormalizationOptions.LocalResponseNormalizationOptions, # noqa: E501
226 BuiltinOptions.LSTMOptions: LSTMOptions.LSTMOptions,
227 BuiltinOptions.ResizeBilinearOptions: ResizeBilinearOptions.ResizeBilinearOptions,
228 BuiltinOptions.CallOptions: CallOptions.CallOptions,
229 BuiltinOptions.ReshapeOptions: ReshapeOptions.ReshapeOptions,
230 BuiltinOptions.SkipGramOptions: SkipGramOptions.SkipGramOptions,
231 BuiltinOptions.SpaceToDepthOptions: SpaceToDepthOptions.SpaceToDepthOptions,
232 BuiltinOptions.EmbeddingLookupSparseOptions: EmbeddingLookupSparseOptions.EmbeddingLookupSparseOptions,
233 BuiltinOptions.MulOptions: MulOptions.MulOptions,
234 BuiltinOptions.PadOptions: PadOptions.PadOptions,
235 BuiltinOptions.GatherOptions: GatherOptions.GatherOptions,
236 BuiltinOptions.BatchToSpaceNDOptions: BatchToSpaceNDOptions.BatchToSpaceNDOptions,
237 BuiltinOptions.SpaceToBatchNDOptions: SpaceToBatchNDOptions.SpaceToBatchNDOptions,
238 BuiltinOptions.TransposeOptions: TransposeOptions.TransposeOptions,
239 BuiltinOptions.ReducerOptions: ReducerOptions.ReducerOptions,
240 BuiltinOptions.SubOptions: SubOptions.SubOptions,
241 BuiltinOptions.DivOptions: DivOptions.DivOptions,
242 BuiltinOptions.SqueezeOptions: SqueezeOptions.SqueezeOptions,
243 BuiltinOptions.SequenceRNNOptions: SequenceRNNOptions.SequenceRNNOptions,
244 BuiltinOptions.StridedSliceOptions: StridedSliceOptions.StridedSliceOptions,
245 BuiltinOptions.ExpOptions: ExpOptions.ExpOptions,
246 BuiltinOptions.TopKV2Options: TopKV2Options.TopKV2Options,
247 BuiltinOptions.SplitOptions: SplitOptions.SplitOptions,
248 BuiltinOptions.LogSoftmaxOptions: LogSoftmaxOptions.LogSoftmaxOptions,
249 BuiltinOptions.CastOptions: CastOptions.CastOptions,
250 BuiltinOptions.DequantizeOptions: DequantizeOptions.DequantizeOptions,
251 BuiltinOptions.MaximumMinimumOptions: MaximumMinimumOptions.MaximumMinimumOptions,
252 BuiltinOptions.ArgMaxOptions: ArgMaxOptions.ArgMaxOptions,
253 BuiltinOptions.LessOptions: LessOptions.LessOptions,
254 BuiltinOptions.NegOptions: NegOptions.NegOptions,
255 BuiltinOptions.PadV2Options: PadV2Options.PadV2Options,
256 BuiltinOptions.GreaterOptions: GreaterOptions.GreaterOptions,
257 BuiltinOptions.GreaterEqualOptions: GreaterEqualOptions.GreaterEqualOptions,
258 BuiltinOptions.LessEqualOptions: LessEqualOptions.LessEqualOptions,
259 BuiltinOptions.SelectOptions: SelectOptions.SelectOptions,
260 BuiltinOptions.SliceOptions: SliceOptions.SliceOptions,
261 BuiltinOptions.TransposeConvOptions: TransposeConvOptions.TransposeConvOptions,
262 BuiltinOptions.SparseToDenseOptions: SparseToDenseOptions.SparseToDenseOptions,
263 BuiltinOptions.TileOptions: TileOptions.TileOptions,
264 BuiltinOptions.ExpandDimsOptions: ExpandDimsOptions.ExpandDimsOptions,
265 BuiltinOptions.EqualOptions: EqualOptions.EqualOptions,
266 BuiltinOptions.NotEqualOptions: NotEqualOptions.NotEqualOptions,
267 BuiltinOptions.ShapeOptions: ShapeOptions.ShapeOptions,
268 BuiltinOptions.PowOptions: PowOptions.PowOptions,
269 BuiltinOptions.ArgMinOptions: ArgMinOptions.ArgMinOptions,
270 BuiltinOptions.FakeQuantOptions: FakeQuantOptions.FakeQuantOptions,
271 BuiltinOptions.PackOptions: PackOptions.PackOptions,
272 BuiltinOptions.LogicalOrOptions: LogicalOrOptions.LogicalOrOptions,
273 BuiltinOptions.OneHotOptions: OneHotOptions.OneHotOptions,
274 BuiltinOptions.LogicalAndOptions: LogicalAndOptions.LogicalAndOptions,
275 BuiltinOptions.LogicalNotOptions: LogicalNotOptions.LogicalNotOptions,
276 BuiltinOptions.UnpackOptions: UnpackOptions.UnpackOptions,
277 BuiltinOptions.FloorDivOptions: FloorDivOptions.FloorDivOptions,
278 BuiltinOptions.SquareOptions: SquareOptions.SquareOptions,
279 BuiltinOptions.ZerosLikeOptions: ZerosLikeOptions.ZerosLikeOptions,
280 BuiltinOptions.FillOptions: FillOptions.FillOptions,
281 BuiltinOptions.BidirectionalSequenceLSTMOptions: BidirectionalSequenceLSTMOptions.BidirectionalSequenceLSTMOptions,
282 BuiltinOptions.BidirectionalSequenceRNNOptions: BidirectionalSequenceRNNOptions.BidirectionalSequenceRNNOptions,
283 BuiltinOptions.UnidirectionalSequenceLSTMOptions: UnidirectionalSequenceLSTMOptions.UnidirectionalSequenceLSTMOptions, # noqa: E501
284 BuiltinOptions.FloorModOptions: FloorModOptions.FloorModOptions,
285 BuiltinOptions.RangeOptions: RangeOptions.RangeOptions,
286 BuiltinOptions.ResizeNearestNeighborOptions: ResizeNearestNeighborOptions.ResizeNearestNeighborOptions,
287 BuiltinOptions.LeakyReluOptions: LeakyReluOptions.LeakyReluOptions,
288 BuiltinOptions.SquaredDifferenceOptions: SquaredDifferenceOptions.SquaredDifferenceOptions,
289 BuiltinOptions.MirrorPadOptions: MirrorPadOptions.MirrorPadOptions,
290 BuiltinOptions.AbsOptions: AbsOptions.AbsOptions,
291 BuiltinOptions.SplitVOptions: SplitVOptions.SplitVOptions,
292 BuiltinOptions.UniqueOptions: UniqueOptions.UniqueOptions,
293 BuiltinOptions.ReverseV2Options: ReverseV2Options.ReverseV2Options,
294 BuiltinOptions.AddNOptions: AddNOptions.AddNOptions,
295 BuiltinOptions.GatherNdOptions: GatherNdOptions.GatherNdOptions,
296 BuiltinOptions.CosOptions: CosOptions.CosOptions,
297 BuiltinOptions.WhereOptions: WhereOptions.WhereOptions,
298 BuiltinOptions.RankOptions: RankOptions.RankOptions,
299 BuiltinOptions.ReverseSequenceOptions: ReverseSequenceOptions.ReverseSequenceOptions,
300 BuiltinOptions.MatrixDiagOptions: MatrixDiagOptions.MatrixDiagOptions,
301 BuiltinOptions.QuantizeOptions: QuantizeOptions.QuantizeOptions,
302 BuiltinOptions.MatrixSetDiagOptions: MatrixSetDiagOptions.MatrixSetDiagOptions,
303 BuiltinOptions.DensifyOptions: DensifyOptions.DensifyOptions,
304 BuiltinOptions.DepthToSpaceOptions: DepthToSpaceOptions.DepthToSpaceOptions,
Louis Verhaard678645b2020-06-15 15:22:47 +0200305 BuiltinOptions.HardSwishOptions: HardSwishOptions.HardSwishOptions,
Tim Hall79d07d22020-04-27 18:20:16 +0100306 BuiltinOptions.IfOptions: IfOptions.IfOptions,
307 BuiltinOptions.NonMaxSuppressionV4Options: NonMaxSuppressionV4Options.NonMaxSuppressionV4Options,
308 BuiltinOptions.NonMaxSuppressionV5Options: NonMaxSuppressionV5Options.NonMaxSuppressionV5Options,
309 BuiltinOptions.ScatterNdOptions: ScatterNdOptions.ScatterNdOptions,
310 BuiltinOptions.SegmentSumOptions: SegmentSumOptions.SegmentSumOptions,
311 BuiltinOptions.SelectV2Options: SelectV2Options.SelectV2Options,
312 BuiltinOptions.WhileOptions: WhileOptions.WhileOptions,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200313 BuiltinOptions.BatchMatMulOptions: BatchMatMulOptions.BatchMatMulOptions,
Tim Hall42abec12021-02-04 21:31:57 +0000314 BuiltinOptions.CumsumOptions: CumsumOptions.CumsumOptions,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200315 BuiltinOptions.CallOnceOptions: CallOnceOptions.CallOnceOptions,
316 BuiltinOptions.BroadcastToOptions: BroadcastToOptions.BroadcastToOptions,
317 BuiltinOptions.Rfft2dOptions: Rfft2dOptions.Rfft2dOptions,
318 BuiltinOptions.Conv3DOptions: Conv3DOptions.Conv3DOptions,
319 BuiltinOptions.HashtableOptions: HashtableOptions.HashtableOptions,
320 BuiltinOptions.HashtableFindOptions: HashtableFindOptions.HashtableFindOptions,
321 BuiltinOptions.HashtableImportOptions: HashtableImportOptions.HashtableImportOptions,
322 BuiltinOptions.HashtableSizeOptions: HashtableSizeOptions.HashtableSizeOptions,
Rickard Bolin2de898a2021-12-20 08:35:23 +0000323 BuiltinOptions.VarHandleOptions: VarHandleOptions.VarHandleOptions,
324 BuiltinOptions.ReadVariableOptions: ReadVariableOptions.ReadVariableOptions,
325 BuiltinOptions.AssignVariableOptions: AssignVariableOptions.AssignVariableOptions,
326 BuiltinOptions.RandomOptions: RandomOptions.RandomOptions,
Rickard Bolind66f8012022-04-21 07:36:55 +0000327 BuiltinOptions.BucketizeOptions: BucketizeOptions.BucketizeOptions,
328 BuiltinOptions.DynamicUpdateSliceOptions: DynamicUpdateSliceOptions.DynamicUpdateSliceOptions,
329 BuiltinOptions.GeluOptions: GeluOptions.GeluOptions,
erik.andersson@arm.comdd49a722022-08-10 15:26:48 +0200330 BuiltinOptions.UnsortedSegmentProdOptions: UnsortedSegmentProdOptions.UnsortedSegmentProdOptions,
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200331 BuiltinOptions.UnsortedSegmentMaxOptions: UnsortedSegmentMaxOptions.UnsortedSegmentMaxOptions,
332 BuiltinOptions.UnsortedSegmentMinOptions: UnsortedSegmentMinOptions.UnsortedSegmentMinOptions,
333 BuiltinOptions.UnsortedSegmentSumOptions: UnsortedSegmentSumOptions.UnsortedSegmentSumOptions,
334 BuiltinOptions.ATan2Options: ATan2Options.ATan2Options,
335 BuiltinOptions.SignOptions: SignOptions.SignOptions,
Tim Hall79d07d22020-04-27 18:20:16 +0100336}
337
Rickard Bolin2de898a2021-12-20 08:35:23 +0000338
Tim Hall79d07d22020-04-27 18:20:16 +0100339builtin_options_inv_map = inverse_map(builtin_options_map)
340
341
342def underscore_to_camel_case(s):
343 return "".join(x.title() for x in s.split("_"))
344
345
346def padding_deserialize(x):
347 return padding_map[x]
348
349
350def padding_serialize(builder, x):
351 return padding_inv_map[x]
352
353
354def activation_deserialize(x):
355 return activation_function_map[x]
356
357
358def activation_serialize(builder, x):
359 return activation_function_inv_map[x]
360
361
362def datatype_deserialize(x):
363 return datatype_map[x]
364
365
366def datatype_serialize(builder, x):
367 return datatype_inv_map[x]
368
369
370def identity(x):
371 return x
372
373
374def identity_serialize(builder, x):
375 return x
376
377
378def write_byte_vector(builder, v):
379 builder.StartVector(1, len(v), 1)
380 for e in v[::-1]:
381 builder.PrependByte(e)
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200382 return builder.EndVector()
Tim Hall79d07d22020-04-27 18:20:16 +0100383
384
385def write_int_vector(builder, v):
386 builder.StartVector(4, len(v), 4)
387 for e in v[::-1]:
388 builder.PrependInt32(e)
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200389 return builder.EndVector()
Tim Hall79d07d22020-04-27 18:20:16 +0100390
391
392class OptionsSerializer:
Michael McGeagh6f725262020-12-03 15:21:36 +0000393 def __init__(self, name, members=None):
Tim Hall79d07d22020-04-27 18:20:16 +0100394 self.name = name
395 self.module = globals()[self.name]
396 self.cls = getattr(self.module, self.name)
397 self.builtin_opt_type = builtin_options_inv_map[self.cls]
Tim Hall79d07d22020-04-27 18:20:16 +0100398 self.members = []
Michael McGeagh6f725262020-12-03 15:21:36 +0000399 if members is not None:
400 for mem in members:
401 deserialize = identity
402 serialize = identity_serialize
403 is_vector = False
404 if isinstance(mem, tuple):
405 if len(mem) == 3:
406 mem, deserialize, serialize = mem
407 elif len(mem) == 2:
408 mem, is_vector = mem
409 deserialize = tuple
410 serialize = write_int_vector
411 else:
412 assert 0
413 underscore_mem = mem
414 camelcase_mem = underscore_to_camel_case(mem)
415 self.members.append((underscore_mem, camelcase_mem, deserialize, serialize, is_vector))
Tim Hall79d07d22020-04-27 18:20:16 +0100416
Tim Hallc8310b12020-06-17 14:53:11 +0100417 def deserialize(self, op_data):
418 builtin_options = op_data.BuiltinOptions()
Tim Hall79d07d22020-04-27 18:20:16 +0100419 attrs = {}
Tim Hallc8310b12020-06-17 14:53:11 +0100420 if builtin_options:
Tim Hall79d07d22020-04-27 18:20:16 +0100421 tfattrs = self.cls()
Tim Hallc8310b12020-06-17 14:53:11 +0100422 tfattrs.Init(builtin_options.Bytes, builtin_options.Pos)
Tim Hall79d07d22020-04-27 18:20:16 +0100423 for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members:
424 fun = camelcase_mem
425 if is_vector:
426 fun += "AsNumpy"
427
Fredrik Svedberg4bb989b2020-11-16 15:32:25 +0100428 attr = getattr(tfattrs, fun)()
429 try:
430 attrs[underscore_mem] = deserialize(attr)
431 except TypeError:
432 print("Warning: {0} could not read attribute '{1}'.".format(self.name, underscore_mem))
433
Tim Hall79d07d22020-04-27 18:20:16 +0100434 return attrs
435
436 def serialize(self, builder, attrs):
437 ser_attrs = []
438 for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members:
439 a = serialize(builder, attrs[underscore_mem])
440 ser_attrs.append((camelcase_mem, a))
441
442 getattr(self.module, self.name + "Start")(builder)
443
444 for camelcase_mem, a in ser_attrs:
445 getattr(self.module, self.name + "Add" + camelcase_mem)(builder, a)
446
447 return getattr(self.module, self.name + "End")(builder), None
448
449
450class CustomOptionsSerializer:
Tim Hallc8310b12020-06-17 14:53:11 +0100451 CUSTOM_OPTIONS_NPU_OP = [0x01, 0x04, 0x01] # NpuOp=1, FlexbufferFormat.UINT8=4, byte length=1
452 CUSTOM_OPTIONS_FORMAT_DEFAULT = 0
453
Tim Hall79d07d22020-04-27 18:20:16 +0100454 def __init__(self):
Tim Hall79d07d22020-04-27 18:20:16 +0100455 self.custom_opt_format = 0
456
Tim Hallc8310b12020-06-17 14:53:11 +0100457 def deserialize(self, op_data):
Tim Hall79d07d22020-04-27 18:20:16 +0100458 attrs = {}
Tim Hallc8310b12020-06-17 14:53:11 +0100459 custom_options = op_data.CustomOptionsAsNumpy()
460 attrs["custom_options"] = custom_options
461 attrs["custom_options_format"] = op_data.CustomOptionsFormat()
462
463 if np.array_equal(custom_options, self.CUSTOM_OPTIONS_NPU_OP):
Louis Verhaardaee5d752020-09-30 09:01:52 +0200464 attrs["custom_type"] = CustomType.ExistingNpuOp
Tim Hallc8310b12020-06-17 14:53:11 +0100465
Tim Hall79d07d22020-04-27 18:20:16 +0100466 return attrs
467
468 def serialize(self, builder, attrs):
Louis Verhaardaee5d752020-09-30 09:01:52 +0200469 custom_type = attrs.get("custom_type", CustomType.ThirdPartyOp)
Tim Hallc8310b12020-06-17 14:53:11 +0100470 self.custom_opt_format = attrs.get("custom_options_format", self.CUSTOM_OPTIONS_FORMAT_DEFAULT)
Tim Hall79d07d22020-04-27 18:20:16 +0100471
472 # Set NPU op custom options for the TensorFlow Lite custom operator
Louis Verhaardaee5d752020-09-30 09:01:52 +0200473 if custom_type == CustomType.NpuOp:
Tim Hallc8310b12020-06-17 14:53:11 +0100474 custom_options = self.CUSTOM_OPTIONS_NPU_OP
475 else:
476 custom_options = attrs.get("custom_options", [])
Tim Hall79d07d22020-04-27 18:20:16 +0100477
Tim Hallc8310b12020-06-17 14:53:11 +0100478 custom_options_bytes = struct.pack("<{0}B".format(len(custom_options)), *custom_options)
479 custom_offset = write_byte_vector(builder, custom_options_bytes)
Tim Hall79d07d22020-04-27 18:20:16 +0100480
481 return None, custom_offset
482
483
484padding_map = {
Michael McGeagh16895482020-12-14 15:51:20 +0000485 Padding.SAME: opPad.SAME,
486 Padding.VALID: opPad.VALID,
Tim Hall79d07d22020-04-27 18:20:16 +0100487}
488
489padding_inv_map = inverse_map(padding_map)
490
491
492activation_function_map = {
493 ActivationFunctionType.NONE: None,
Louis Verhaardaee5d752020-09-30 09:01:52 +0200494 ActivationFunctionType.RELU: Op.Relu,
495 ActivationFunctionType.RELU_N1_TO_1: Op.ReluN1To1,
496 ActivationFunctionType.RELU6: Op.Relu6,
497 ActivationFunctionType.TANH: Op.Tanh,
498 ActivationFunctionType.SIGN_BIT: Op.SignBit,
Tim Hall79d07d22020-04-27 18:20:16 +0100499}
500
501activation_function_inv_map = inverse_map(activation_function_map)
502
503fused_act = ("fused_activation_function", activation_deserialize, activation_serialize)
504padding = ("padding", padding_deserialize, padding_serialize)
505
Tim Hall79d07d22020-04-27 18:20:16 +0100506is_int_vec = True
507
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200508TFLITE_NO_INDICES = TensorIndices([], [], [])
509TFLITE_IFM_INDICES = TensorIndices([0], [], [])
510TFLITE_IFM_WEIGHTS_INDICES = TensorIndices([0], [1], [])
511TFLITE_IFM_WEIGHTS_BIAS_INDICES = TensorIndices([0], [1], [2])
512TFLITE_IFM_IFM2_INDICES = TensorIndices([0, 1], [], [])
513TFLITE_CONV2D_BACKPROP_INDICES = TensorIndices([2], [1], [3])
514TFLITE_TRANSPOSE_CONV_INDICES = TensorIndices([0], [1], [3])
515TFLITE_CONCAT_INDICES = TensorIndices([1, 2], [], [])
516TFLITE_SPLIT_IFM_INDICES = TensorIndices([1], [], [])
517TFLITE_BLOCK_LSTM_INDICES = TensorIndices([3], [4], [])
518
Tim Hall79d07d22020-04-27 18:20:16 +0100519builtin_operator_map = {
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200520 BuiltinOperator.ADD: (
521 Op.Add,
522 OptionsSerializer("AddOptions", (fused_act, "pot_scale_int16")),
523 TFLITE_IFM_IFM2_INDICES,
524 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200525 BuiltinOperator.AVERAGE_POOL_2D: (
526 Op.AvgPool,
527 OptionsSerializer(
528 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
529 ),
530 TFLITE_IFM_INDICES,
531 ),
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200532 BuiltinOperator.ATAN2: (Op.Atan2, OptionsSerializer("ATan2Options", ()), TFLITE_IFM_IFM2_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200533 BuiltinOperator.CONCATENATION: (
534 Op.ConcatTFLite,
535 OptionsSerializer("ConcatenationOptions", ("axis", fused_act)),
536 TFLITE_CONCAT_INDICES,
537 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200538 BuiltinOperator.CONV_2D: (
539 Op.Conv2DBias,
540 OptionsSerializer(
541 "Conv2DOptions", ("dilation_h_factor", "dilation_w_factor", fused_act, padding, "stride_h", "stride_w")
542 ),
543 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
544 ),
545 BuiltinOperator.DEPTHWISE_CONV_2D: (
546 Op.DepthwiseConv2DBias,
547 OptionsSerializer(
548 "DepthwiseConv2DOptions",
549 ("depth_multiplier", "dilation_h_factor", "dilation_w_factor", fused_act, padding, "stride_h", "stride_w"),
550 ),
551 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
552 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200553 BuiltinOperator.DEPTH_TO_SPACE: (
554 Op.DepthToSpace,
555 OptionsSerializer("DepthToSpaceOptions", ("block_size",)),
556 TFLITE_NO_INDICES,
557 ),
558 BuiltinOperator.DEQUANTIZE: (Op.Dequantize, OptionsSerializer("DequantizeOptions"), TFLITE_IFM_INDICES),
559 BuiltinOperator.EMBEDDING_LOOKUP: (Op.EmbeddingLookup, None, TFLITE_NO_INDICES),
560 BuiltinOperator.FLOOR: (Op.Floor, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100561 BuiltinOperator.FULLY_CONNECTED: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200562 Op.FullyConnected,
erik.andersson@arm.com0cbb1662021-02-22 15:47:07 +0100563 OptionsSerializer(
Dwight Lidman8a12da12021-07-19 13:43:05 +0200564 "FullyConnectedOptions", ("asymmetric_quantize_inputs", fused_act, "keep_num_dims", "weights_format")
erik.andersson@arm.com0cbb1662021-02-22 15:47:07 +0100565 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200566 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100567 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200568 BuiltinOperator.HASHTABLE_LOOKUP: (Op.HashtableLookup, None, TFLITE_NO_INDICES),
569 BuiltinOperator.L2_NORMALIZATION: (Op.L2Norm, OptionsSerializer("L2NormOptions", (fused_act,)), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200570 BuiltinOperator.L2_POOL_2D: (
571 Op.L2Pool2D,
572 OptionsSerializer(
573 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
574 ),
575 TFLITE_NO_INDICES,
576 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100577 BuiltinOperator.LOCAL_RESPONSE_NORMALIZATION: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200578 Op.LRN,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200579 OptionsSerializer("LocalResponseNormalizationOptions", ("alpha", "beta", "bias", "radius")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200580 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100581 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200582 BuiltinOperator.LOGISTIC: (Op.Sigmoid, None, TFLITE_IFM_INDICES),
583 BuiltinOperator.LSH_PROJECTION: (
584 Op.LSHProjection,
585 OptionsSerializer("LSHProjectionOptions", ("type",)),
586 TFLITE_NO_INDICES,
587 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200588 BuiltinOperator.LSTM: (
589 Op.Lstm,
590 OptionsSerializer(
591 "LSTMOptions", ("asymmetric_quantize_inputs", "cell_clip", fused_act, "kernel_type", "proj_clip")
592 ),
593 TFLITE_IFM_WEIGHTS_INDICES,
594 ),
595 BuiltinOperator.MAX_POOL_2D: (
596 Op.MaxPool,
597 OptionsSerializer(
598 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
599 ),
600 TFLITE_IFM_INDICES,
601 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200602 BuiltinOperator.MUL: (Op.Mul, OptionsSerializer("MulOptions", (fused_act,)), TFLITE_IFM_IFM2_INDICES),
603 BuiltinOperator.RELU: (Op.Relu, None, TFLITE_IFM_INDICES),
erik.andersson@arm.comdd49a722022-08-10 15:26:48 +0200604 BuiltinOperator.RELU_0_TO_1: (Op.Relu0To1, None, TFLITE_IFM_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200605 BuiltinOperator.RELU_N1_TO_1: (Op.ReluN1To1, None, TFLITE_IFM_INDICES),
606 BuiltinOperator.RELU6: (Op.Relu6, None, TFLITE_IFM_INDICES),
607 BuiltinOperator.RESHAPE: (
608 Op.Reshape,
Dwight Lidmancfb42622021-08-11 12:28:51 +0200609 OptionsSerializer("ReshapeOptions", (("new_shape", is_int_vec),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200610 TFLITE_IFM_INDICES,
611 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100612 BuiltinOperator.RESIZE_BILINEAR: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200613 Op.ResizeBilinear,
Tim Hall79d07d22020-04-27 18:20:16 +0100614 OptionsSerializer("ResizeBilinearOptions", ("align_corners", "half_pixel_centers")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200615 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100616 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200617 BuiltinOperator.RNN: (
618 Op.Rnn,
619 OptionsSerializer("RNNOptions", ("asymmetric_quantize_inputs", fused_act)),
620 TFLITE_IFM_WEIGHTS_INDICES,
621 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200622 BuiltinOperator.SOFTMAX: (Op.Softmax, OptionsSerializer("SoftmaxOptions", ("beta",)), TFLITE_IFM_INDICES),
623 BuiltinOperator.SPACE_TO_DEPTH: (
624 Op.SpaceToDepth,
625 OptionsSerializer("SpaceToDepthOptions", ("block_size",)),
626 TFLITE_NO_INDICES,
627 ),
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200628 BuiltinOperator.SVDF: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200629 Op.Svdf,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200630 OptionsSerializer("SVDFOptions", ("asymmetric_quantize_inputs", fused_act, "rank")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200631 TFLITE_NO_INDICES,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200632 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200633 BuiltinOperator.TANH: (Op.Tanh, None, TFLITE_IFM_INDICES),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200634 BuiltinOperator.CONCAT_EMBEDDINGS: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200635 Op.ConcatEmbeddings,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200636 OptionsSerializer(
637 "ConcatEmbeddingsOptions",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200638 (
Dwight Lidman8a12da12021-07-19 13:43:05 +0200639 "embedding_dim_per_channel",
640 "embedding_dim_per_channel_as_numpy",
641 "embedding_dim_per_channel_is_none",
642 "embedding_dim_per_channel_length",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200643 "num_channels",
644 "num_columns_per_channel",
645 "num_columns_per_channel_as_numpy",
Dwight Lidman8a12da12021-07-19 13:43:05 +0200646 "num_columns_per_channel_is_none",
647 "num_columns_per_channel_length",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200648 ),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200649 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200650 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200651 ),
652 BuiltinOperator.SKIP_GRAM: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200653 Op.SkipGram,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200654 OptionsSerializer("SkipGramOptions", ("include_all_ngrams", "max_skip_size", "ngram_size")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200655 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200656 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200657 BuiltinOperator.CALL: (Op.Call, OptionsSerializer("CallOptions", ("subgraph",)), TFLITE_NO_INDICES),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200658 BuiltinOperator.EMBEDDING_LOOKUP_SPARSE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200659 Op.EmbeddingLookupSparse,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200660 OptionsSerializer("EmbeddingLookupSparseOptions", ("combiner",)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200661 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200662 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200663 BuiltinOperator.PAD: (Op.Pad, OptionsSerializer("PadOptions"), TFLITE_IFM_INDICES),
664 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_RNN: (
665 Op.UnidirectionalSequenceRnn,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200666 OptionsSerializer("SequenceRNNOptions", ("asymmetric_quantize_inputs", fused_act, "time_major")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200667 TFLITE_IFM_WEIGHTS_INDICES,
668 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200669 BuiltinOperator.GATHER: (
670 Op.GatherV2,
671 OptionsSerializer("GatherOptions", ("axis", "batch_dims")),
672 TFLITE_NO_INDICES,
673 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200674 BuiltinOperator.BATCH_TO_SPACE_ND: (
675 Op.BatchToSpaceND,
676 OptionsSerializer("BatchToSpaceNDOptions"),
677 TFLITE_NO_INDICES,
678 ),
679 BuiltinOperator.SPACE_TO_BATCH_ND: (
680 Op.SpaceToBatchND,
681 OptionsSerializer("SpaceToBatchNDOptions"),
682 TFLITE_NO_INDICES,
683 ),
James Ward6bf16132021-09-08 11:14:20 +0100684 BuiltinOperator.TRANSPOSE: (Op.Transpose, OptionsSerializer("TransposeOptions"), TFLITE_IFM_IFM2_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200685 BuiltinOperator.MEAN: (Op.Mean, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_IFM_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200686 BuiltinOperator.SUB: (
687 Op.Sub,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200688 OptionsSerializer("SubOptions", (fused_act, "pot_scale_int16")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200689 TFLITE_IFM_IFM2_INDICES,
690 ),
691 BuiltinOperator.DIV: (Op.Div, OptionsSerializer("DivOptions", (fused_act,)), TFLITE_NO_INDICES),
692 BuiltinOperator.SQUEEZE: (
693 Op.Squeeze,
Jonas Ohlssond8575072022-03-30 10:30:25 +0200694 OptionsSerializer(
695 "SqueezeOptions",
696 (("squeeze_dims", is_int_vec),),
697 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200698 TFLITE_IFM_INDICES,
699 ),
700 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_LSTM: (
701 Op.UnidirectionalSequenceLstm,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200702 OptionsSerializer(
703 "UnidirectionalSequenceLSTMOptions",
704 ("asymmetric_quantize_inputs", "cell_clip", fused_act, "proj_clip", "time_major"),
705 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200706 TFLITE_IFM_WEIGHTS_INDICES,
707 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100708 BuiltinOperator.STRIDED_SLICE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200709 Op.StridedSlice,
Tim Hall79d07d22020-04-27 18:20:16 +0100710 OptionsSerializer(
Dwight Lidman8a12da12021-07-19 13:43:05 +0200711 "StridedSliceOptions", ("begin_mask", "ellipsis_mask", "end_mask", "new_axis_mask", "shrink_axis_mask")
Tim Hall79d07d22020-04-27 18:20:16 +0100712 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200713 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100714 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200715 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_RNN: (
716 Op.BidirectionalSequenceRnn,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200717 OptionsSerializer(
718 "BidirectionalSequenceRNNOptions", ("asymmetric_quantize_inputs", fused_act, "merge_outputs", "time_major")
719 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200720 TFLITE_IFM_WEIGHTS_INDICES,
721 ),
James Ward6bf16132021-09-08 11:14:20 +0100722 BuiltinOperator.EXP: (Op.Exp, OptionsSerializer("ExpOptions"), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200723 BuiltinOperator.TOPK_V2: (Op.TopKV2, OptionsSerializer("TopKV2Options"), TFLITE_NO_INDICES),
724 BuiltinOperator.SPLIT: (Op.Split, OptionsSerializer("SplitOptions", ("num_splits",)), TFLITE_SPLIT_IFM_INDICES),
725 BuiltinOperator.LOG_SOFTMAX: (Op.LogSoftmax, OptionsSerializer("LogSoftmaxOptions"), TFLITE_NO_INDICES),
726 BuiltinOperator.DELEGATE: (Op.Delegate, None, TFLITE_NO_INDICES),
727 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_LSTM: (
728 Op.BidirectionalSequenceLstm,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200729 OptionsSerializer(
730 "BidirectionalSequenceLSTMOptions",
731 ("asymmetric_quantize_inputs", "cell_clip", fused_act, "merge_outputs", "proj_clip", "time_major"),
732 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200733 TFLITE_IFM_WEIGHTS_INDICES,
734 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100735 BuiltinOperator.CAST: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200736 Op.Cast,
Tim Hall79d07d22020-04-27 18:20:16 +0100737 OptionsSerializer(
738 "CastOptions",
739 (
740 ("in_data_type", datatype_deserialize, datatype_serialize),
741 ("out_data_type", datatype_deserialize, datatype_serialize),
742 ),
743 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200744 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100745 ),
Fredrik Svedberg8ddd4892022-08-19 16:06:04 +0200746 BuiltinOperator.PRELU: (Op.Prelu, None, TFLITE_IFM_IFM2_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200747 BuiltinOperator.MAXIMUM: (Op.Maximum, OptionsSerializer("MaximumMinimumOptions"), TFLITE_IFM_IFM2_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100748 BuiltinOperator.ARG_MAX: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200749 Op.ArgMax,
Tim Hall79d07d22020-04-27 18:20:16 +0100750 OptionsSerializer("ArgMaxOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200751 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100752 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200753 BuiltinOperator.MINIMUM: (Op.Minimum, OptionsSerializer("MaximumMinimumOptions"), TFLITE_IFM_IFM2_INDICES),
754 BuiltinOperator.LESS: (Op.Less, OptionsSerializer("LessOptions"), TFLITE_NO_INDICES),
755 BuiltinOperator.NEG: (Op.Neg, OptionsSerializer("NegOptions"), TFLITE_NO_INDICES),
756 BuiltinOperator.PADV2: (Op.PadV2, OptionsSerializer("PadV2Options"), TFLITE_NO_INDICES),
757 BuiltinOperator.GREATER: (Op.Greater, OptionsSerializer("GreaterOptions"), TFLITE_NO_INDICES),
758 BuiltinOperator.GREATER_EQUAL: (Op.GreaterEqual, OptionsSerializer("GreaterEqualOptions"), TFLITE_NO_INDICES),
759 BuiltinOperator.LESS_EQUAL: (Op.LessEqual, OptionsSerializer("LessEqualOptions"), TFLITE_NO_INDICES),
760 BuiltinOperator.SELECT: (Op.Select, OptionsSerializer("SelectOptions"), TFLITE_NO_INDICES),
761 BuiltinOperator.SLICE: (Op.Slice, OptionsSerializer("SliceOptions"), TFLITE_IFM_INDICES),
762 BuiltinOperator.SIN: (Op.Sin, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100763 BuiltinOperator.TRANSPOSE_CONV: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200764 Op.Conv2DBackpropInput,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200765 OptionsSerializer("TransposeConvOptions", (padding, "stride_h", "stride_w")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200766 TFLITE_CONV2D_BACKPROP_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100767 ),
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200768 BuiltinOperator.SIGN: (Op.Sign, OptionsSerializer("SignOptions"), TFLITE_IFM_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100769 BuiltinOperator.SPARSE_TO_DENSE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200770 Op.SparseToDense,
Tim Hall79d07d22020-04-27 18:20:16 +0100771 OptionsSerializer("SparseToDenseOptions", ("validate_indices",)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200772 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100773 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200774 BuiltinOperator.TILE: (Op.Tile, OptionsSerializer("TileOptions"), TFLITE_NO_INDICES),
775 BuiltinOperator.EXPAND_DIMS: (Op.ExpandDims, OptionsSerializer("ExpandDimsOptions"), TFLITE_IFM_INDICES),
776 BuiltinOperator.EQUAL: (Op.Equal, OptionsSerializer("EqualOptions"), TFLITE_NO_INDICES),
777 BuiltinOperator.NOT_EQUAL: (Op.NotEqual, OptionsSerializer("NotEqualOptions"), TFLITE_NO_INDICES),
778 BuiltinOperator.LOG: (Op.Log, None, TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200779 BuiltinOperator.SUM: (Op.Sum, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200780 BuiltinOperator.SQRT: (Op.Sqrt, None, TFLITE_NO_INDICES),
781 BuiltinOperator.RSQRT: (Op.Rsqrt, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100782 BuiltinOperator.SHAPE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200783 Op.Shape,
Tim Hall79d07d22020-04-27 18:20:16 +0100784 OptionsSerializer("ShapeOptions", (("out_type", datatype_deserialize, datatype_serialize),)),
Ayaan Masood4965fae2022-06-29 11:30:57 +0100785 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100786 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200787 BuiltinOperator.POW: (Op.Pow, OptionsSerializer("PowOptions"), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100788 BuiltinOperator.ARG_MIN: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200789 Op.ArgMin,
Tim Hall79d07d22020-04-27 18:20:16 +0100790 OptionsSerializer("ArgMinOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200791 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100792 ),
793 BuiltinOperator.FAKE_QUANT: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200794 Op.FakeQuantWithMinMaxArgs,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200795 OptionsSerializer("FakeQuantOptions", ("max", "min", "narrow_range", "num_bits")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200796 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100797 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200798 BuiltinOperator.REDUCE_PROD: (Op.Prod, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
799 BuiltinOperator.REDUCE_MAX: (Op.Max, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
800 BuiltinOperator.PACK: (Op.Pack, OptionsSerializer("PackOptions", ("axis", "values_count")), TFLITE_IFM_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200801 BuiltinOperator.LOGICAL_OR: (Op.LogicalOr, OptionsSerializer("LogicalOrOptions"), TFLITE_NO_INDICES),
802 BuiltinOperator.ONE_HOT: (Op.OneHot, OptionsSerializer("OneHotOptions", ("axis",)), TFLITE_NO_INDICES),
803 BuiltinOperator.LOGICAL_AND: (Op.LogicalAnd, OptionsSerializer("LogicalAndOptions"), TFLITE_NO_INDICES),
804 BuiltinOperator.LOGICAL_NOT: (Op.LogicalNot, OptionsSerializer("LogicalNotOptions"), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200805 BuiltinOperator.UNPACK: (Op.Unpack, OptionsSerializer("UnpackOptions", ("axis", "num")), TFLITE_IFM_INDICES),
806 BuiltinOperator.REDUCE_MIN: (Op.Min, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200807 BuiltinOperator.FLOOR_DIV: (Op.FloorDiv, OptionsSerializer("FloorDivOptions"), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200808 BuiltinOperator.REDUCE_ANY: (Op.Any, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200809 BuiltinOperator.SQUARE: (Op.Square, OptionsSerializer("SquareOptions"), TFLITE_NO_INDICES),
810 BuiltinOperator.ZEROS_LIKE: (Op.ZerosLike, OptionsSerializer("ZerosLikeOptions"), TFLITE_NO_INDICES),
811 BuiltinOperator.FILL: (Op.Fill, OptionsSerializer("FillOptions"), TFLITE_NO_INDICES),
812 BuiltinOperator.FLOOR_MOD: (Op.FloorMod, OptionsSerializer("FloorModOptions"), TFLITE_NO_INDICES),
813 BuiltinOperator.RANGE: (Op.Range, OptionsSerializer("RangeOptions"), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100814 BuiltinOperator.RESIZE_NEAREST_NEIGHBOR: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200815 Op.ResizeNearestNeighbor,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200816 OptionsSerializer("ResizeNearestNeighborOptions", ("align_corners", "half_pixel_centers")),
Tim Hall885033b2022-07-21 11:46:03 +0100817 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100818 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200819 BuiltinOperator.LEAKY_RELU: (Op.LeakyRelu, OptionsSerializer("LeakyReluOptions", ("alpha",)), TFLITE_IFM_INDICES),
820 BuiltinOperator.SQUARED_DIFFERENCE: (
821 Op.SquaredDifference,
822 OptionsSerializer("SquaredDifferenceOptions"),
823 TFLITE_NO_INDICES,
824 ),
825 BuiltinOperator.MIRROR_PAD: (Op.MirrorPad, OptionsSerializer("MirrorPadOptions", ("mode",)), TFLITE_NO_INDICES),
826 BuiltinOperator.ABS: (Op.Abs, OptionsSerializer("AbsOptions"), TFLITE_IFM_INDICES),
827 BuiltinOperator.SPLIT_V: (Op.SplitV, OptionsSerializer("SplitVOptions", ("num_splits",)), TFLITE_IFM_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100828 BuiltinOperator.UNIQUE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200829 Op.Unique,
Tim Hall79d07d22020-04-27 18:20:16 +0100830 OptionsSerializer("UniqueOptions", (("idx_out_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200831 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100832 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200833 BuiltinOperator.CEIL: (Op.Ceil, None, TFLITE_NO_INDICES),
834 BuiltinOperator.REVERSE_V2: (Op.ReverseV2, OptionsSerializer("ReverseV2Options"), TFLITE_NO_INDICES),
835 BuiltinOperator.ADD_N: (Op.AddN, OptionsSerializer("AddNOptions"), TFLITE_NO_INDICES),
836 BuiltinOperator.GATHER_ND: (Op.GatherNd, OptionsSerializer("GatherNdOptions"), TFLITE_NO_INDICES),
837 BuiltinOperator.COS: (Op.Cos, OptionsSerializer("CosOptions"), TFLITE_NO_INDICES),
838 BuiltinOperator.WHERE: (Op.Where, OptionsSerializer("WhereOptions"), TFLITE_NO_INDICES),
839 BuiltinOperator.RANK: (Op.Rank, OptionsSerializer("RankOptions"), TFLITE_NO_INDICES),
840 BuiltinOperator.ELU: (Op.Elu, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100841 BuiltinOperator.REVERSE_SEQUENCE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200842 Op.ReverseSequence,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200843 OptionsSerializer("ReverseSequenceOptions", ("batch_dim", "seq_dim")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200844 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100845 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200846 BuiltinOperator.MATRIX_DIAG: (Op.MatrixDiag, OptionsSerializer("MatrixDiagOptions"), TFLITE_NO_INDICES),
847 BuiltinOperator.QUANTIZE: (Op.Quantize, OptionsSerializer("QuantizeOptions"), TFLITE_IFM_INDICES),
848 BuiltinOperator.MATRIX_SET_DIAG: (Op.MatrixSetDiag, OptionsSerializer("MatrixSetDiagOptions"), TFLITE_NO_INDICES),
849 BuiltinOperator.ROUND: (Op.Round, None, TFLITE_NO_INDICES),
850 BuiltinOperator.HARD_SWISH: (Op.HardSwish, OptionsSerializer("HardSwishOptions"), TFLITE_IFM_INDICES),
851 BuiltinOperator.IF: (
852 Op.If,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200853 OptionsSerializer("IfOptions", ("else_subgraph_index", "then_subgraph_index")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200854 TFLITE_NO_INDICES,
855 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200856 BuiltinOperator.WHILE: (
857 Op.While,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200858 OptionsSerializer("WhileOptions", ("body_subgraph_index", "cond_subgraph_index")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200859 TFLITE_NO_INDICES,
Louis Verhaardaee5d752020-09-30 09:01:52 +0200860 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200861 BuiltinOperator.NON_MAX_SUPPRESSION_V4: (
862 Op.NonMaxSuppressionV4,
863 OptionsSerializer("NonMaxSuppressionV4Options"),
864 TFLITE_NO_INDICES,
865 ),
866 BuiltinOperator.NON_MAX_SUPPRESSION_V5: (
867 Op.NonMaxSuppressionV5,
868 OptionsSerializer("NonMaxSuppressionV5Options"),
869 TFLITE_NO_INDICES,
870 ),
871 BuiltinOperator.SCATTER_ND: (Op.ScatterNd, OptionsSerializer("ScatterNdOptions"), TFLITE_NO_INDICES),
872 BuiltinOperator.SELECT_V2: (Op.SelectV2, OptionsSerializer("SelectV2Options"), TFLITE_NO_INDICES),
873 BuiltinOperator.DENSIFY: (Op.Densify, OptionsSerializer("DensifyOptions"), TFLITE_NO_INDICES),
874 BuiltinOperator.SEGMENT_SUM: (Op.SegmentSum, OptionsSerializer("SegmentSumOptions"), TFLITE_NO_INDICES),
875 BuiltinOperator.BATCH_MATMUL: (
876 Op.BatchMatMul,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200877 OptionsSerializer("BatchMatMulOptions", ("adj_x", "adj_y", "asymmetric_quantize_inputs")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200878 TFLITE_NO_INDICES,
879 ),
880 BuiltinOperator.CUMSUM: (
881 Op.Cumsum,
882 OptionsSerializer("CumsumOptions", ("exclusive", "reverse")),
883 TFLITE_NO_INDICES,
884 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200885 BuiltinOperator.CALL_ONCE: (
886 Op.CallOnce,
887 OptionsSerializer("CallOnceOptions", ("init_subgraph_index",)),
888 TFLITE_NO_INDICES,
889 ),
890 BuiltinOperator.BROADCAST_TO: (Op.BroadcastTo, OptionsSerializer("BroadcastToOptions"), TFLITE_NO_INDICES),
891 BuiltinOperator.RFFT2D: (Op.Rfft2D, OptionsSerializer("Rfft2dOptions"), TFLITE_NO_INDICES),
892 BuiltinOperator.CONV_3D: (
893 Op.Conv3D,
894 OptionsSerializer(
895 "Conv3DOptions",
896 (
897 "dilation_d_factor",
898 "dilation_h_factor",
899 "dilation_w_factor",
900 fused_act,
901 padding,
902 "stride_d",
903 "stride_h",
904 "stride_w",
905 ),
906 ),
907 TFLITE_NO_INDICES,
908 ),
909 BuiltinOperator.IMAG: (Op.Imag, None, TFLITE_NO_INDICES),
910 BuiltinOperator.REAL: (Op.Real, None, TFLITE_NO_INDICES),
911 BuiltinOperator.COMPLEX_ABS: (Op.ComplexAbs, None, TFLITE_NO_INDICES),
912 BuiltinOperator.HASHTABLE: (
913 Op.Hashtable,
914 OptionsSerializer("HashtableOptions", ("key_dtype", "table_id", "value_dtype")),
915 TFLITE_NO_INDICES,
916 ),
917 BuiltinOperator.HASHTABLE_FIND: (Op.HashtableFind, OptionsSerializer("HashtableFindOptions"), TFLITE_NO_INDICES),
918 BuiltinOperator.HASHTABLE_IMPORT: (
919 Op.HashtableImport,
920 OptionsSerializer("HashtableImportOptions"),
921 TFLITE_NO_INDICES,
922 ),
923 BuiltinOperator.HASHTABLE_SIZE: (Op.HashtableSize, OptionsSerializer("HashtableSizeOptions"), TFLITE_NO_INDICES),
924 BuiltinOperator.REDUCE_ALL: (Op.ReduceAll, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
925 BuiltinOperator.CONV_3D_TRANSPOSE: (
926 Op.Conv3DTranspose,
927 OptionsSerializer(
928 "Conv3DOptions",
929 (
930 "dilation_d_factor",
931 "dilation_h_factor",
932 "dilation_w_factor",
933 fused_act,
934 padding,
935 "stride_d",
936 "stride_h",
937 "stride_w",
938 ),
939 ),
940 TFLITE_NO_INDICES,
941 ),
Rickard Bolin2de898a2021-12-20 08:35:23 +0000942 BuiltinOperator.VAR_HANDLE: (
943 Op.VarHandle,
Jonas Ohlssond8575072022-03-30 10:30:25 +0200944 OptionsSerializer(
945 "VarHandleOptions",
946 (
947 "container",
948 "shared_name",
949 ),
950 ),
Rickard Bolin2de898a2021-12-20 08:35:23 +0000951 TFLITE_NO_INDICES,
952 ),
953 BuiltinOperator.READ_VARIABLE: (Op.ReadVariable, OptionsSerializer("ReadVariableOptions"), TFLITE_NO_INDICES),
954 BuiltinOperator.ASSIGN_VARIABLE: (Op.AssignVariable, OptionsSerializer("AssignVariableOptions"), TFLITE_NO_INDICES),
955 BuiltinOperator.BROADCAST_ARGS: (Op.BroadcastArgs, None, TFLITE_NO_INDICES),
956 BuiltinOperator.RANDOM_STANDARD_NORMAL: (
957 Op.RandomStandardNormal,
Jonas Ohlssond8575072022-03-30 10:30:25 +0200958 OptionsSerializer(
959 "RandomOptions",
960 (
961 "seed",
962 "seed2",
963 ),
964 ),
Rickard Bolin2de898a2021-12-20 08:35:23 +0000965 TFLITE_NO_INDICES,
966 ),
Rickard Bolind66f8012022-04-21 07:36:55 +0000967 BuiltinOperator.BUCKETIZE: (
968 Op.Bucketize,
969 OptionsSerializer(
970 "BucketizeOptions",
971 ("boundaries", "boundaries_as_numpy", "boundaries_length", "boundaries_is_none"),
972 ),
973 TFLITE_NO_INDICES,
974 ),
975 BuiltinOperator.RANDOM_UNIFORM: (Op.RandomUniform, None, TFLITE_NO_INDICES),
976 BuiltinOperator.MULTINOMIAL: (Op.Multinomial, None, TFLITE_NO_INDICES),
977 BuiltinOperator.GELU: (Op.Gelu, OptionsSerializer("GeluOptions", ("approximate",)), TFLITE_NO_INDICES),
978 BuiltinOperator.DYNAMIC_UPDATE_SLICE: (
979 Op.DynamicUpdateSlice,
980 OptionsSerializer("DynamicUpdateSliceOptions"),
981 TFLITE_NO_INDICES,
982 ),
erik.andersson@arm.comdd49a722022-08-10 15:26:48 +0200983 BuiltinOperator.UNSORTED_SEGMENT_PROD: (
984 Op.UnsortedSegmentProd,
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200985 OptionsSerializer("UnsortedSegmentProdOptions"),
986 TFLITE_NO_INDICES,
987 ),
988 BuiltinOperator.UNSORTED_SEGMENT_MAX: (
989 Op.UnsortedSegmentMax,
990 OptionsSerializer("UnsortedSegmentMaxOptions"),
991 TFLITE_NO_INDICES,
992 ),
993 BuiltinOperator.UNSORTED_SEGMENT_MIN: (
994 Op.UnsortedSegmentMin,
995 OptionsSerializer("UnsortedSegmentMinOptions"),
996 TFLITE_NO_INDICES,
997 ),
998 BuiltinOperator.UNSORTED_SEGMENT_SUM: (
999 Op.UnsortedSegmentSum,
1000 OptionsSerializer("UnsortedSegmentSumOptions"),
erik.andersson@arm.comdd49a722022-08-10 15:26:48 +02001001 TFLITE_NO_INDICES,
1002 ),
Tim Hallb94bcd42021-09-07 14:24:51 +01001003 BuiltinOperator.CUSTOM: (Op.Custom, CustomOptionsSerializer(), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +01001004}
1005
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +02001006builtin_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 +01001007
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +02001008builtin_operator_inv_map[Op.CustomNpuOp] = (BuiltinOperator.CUSTOM, CustomOptionsSerializer(), TFLITE_NO_INDICES)
Michael McGeagh219ec072020-11-09 11:11:26 +00001009
Michael McGeagh837dc1b2020-11-10 12:38:25 +00001010BUILTIN_OPERATOR_UNKNOWN = "UNKNOWN"
1011
Tim Halla3fe6652022-03-03 17:43:16 +00001012builtin_operator_name_map = {v: k for k, v in vars(BuiltinOperator).items()}
Michael McGeagh837dc1b2020-11-10 12:38:25 +00001013
Michael McGeagh219ec072020-11-09 11:11:26 +00001014
Tim Halla3fe6652022-03-03 17:43:16 +00001015def optype_to_builtintype(op_type: Op):
Michael McGeagh219ec072020-11-09 11:11:26 +00001016 if op_type in builtin_operator_inv_map:
Tim Halla3fe6652022-03-03 17:43:16 +00001017 return builtin_operator_name_map[builtin_operator_inv_map[op_type][0]]
Michael McGeagh219ec072020-11-09 11:11:26 +00001018 else:
Michael McGeagh837dc1b2020-11-10 12:38:25 +00001019 return BUILTIN_OPERATOR_UNKNOWN