blob: 98fe287d47b3d8ed46291b930894e506ab1f48c2 [file] [log] [blame]
Rickard Bolin6986a072022-12-19 12:33:40 +00001# SPDX-FileCopyrightText: Copyright 2020-2023 Arm Limited and/or its affiliates <open-source-office@arm.com>
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.
Rickard Bolinbc6ee582022-11-04 08:24:29 +000016#
Tim Hall79d07d22020-04-27 18:20:16 +010017# Description:
18# TensorFlow Lite mapping functions used by both reader and writer.
19# Contains a mapping from the various TensorFlow Lite enums and options structs, generated by the FlatBuffer code
20# generator, to Vela's internal format.
Tim Hall79d07d22020-04-27 18:20:16 +010021import struct
22
Diego Russoea6111a2020-04-14 18:41:58 +010023import numpy as np
24
Tim Hall79d07d22020-04-27 18:20:16 +010025from .data_type import DataType
Louis Verhaardaee5d752020-09-30 09:01:52 +020026from .operation import CustomType
27from .operation import Op
Michael McGeagh16895482020-12-14 15:51:20 +000028from .operation import Padding as opPad
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +020029from .operation import TensorIndices
Diego Russoe8a10452020-04-21 17:39:10 +010030from .tflite import AbsOptions
31from .tflite import AddNOptions
Tim Hall79d07d22020-04-27 18:20:16 +010032from .tflite import AddOptions
Tim Hall79d07d22020-04-27 18:20:16 +010033from .tflite import ArgMaxOptions
Tim Hall79d07d22020-04-27 18:20:16 +010034from .tflite import ArgMinOptions
Rickard Bolin2de898a2021-12-20 08:35:23 +000035from .tflite import AssignVariableOptions
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +020036from .tflite import ATan2Options
Jacob Bohlin8daf6b72020-09-15 16:28:35 +020037from .tflite import BatchMatMulOptions
Diego Russoe8a10452020-04-21 17:39:10 +010038from .tflite import BatchToSpaceNDOptions
Tim Hall79d07d22020-04-27 18:20:16 +010039from .tflite import BidirectionalSequenceLSTMOptions
40from .tflite import BidirectionalSequenceRNNOptions
Dwight Lidman8a12da12021-07-19 13:43:05 +020041from .tflite import BroadcastToOptions
Rickard Bolind66f8012022-04-21 07:36:55 +000042from .tflite import BucketizeOptions
Dwight Lidman8a12da12021-07-19 13:43:05 +020043from .tflite import CallOnceOptions
Diego Russoe8a10452020-04-21 17:39:10 +010044from .tflite import CallOptions
45from .tflite import CastOptions
46from .tflite import ConcatEmbeddingsOptions
47from .tflite import ConcatenationOptions
48from .tflite import Conv2DOptions
Dwight Lidman8a12da12021-07-19 13:43:05 +020049from .tflite import Conv3DOptions
Tim Hall79d07d22020-04-27 18:20:16 +010050from .tflite import CosOptions
Tim Hall42abec12021-02-04 21:31:57 +000051from .tflite import CumsumOptions
Tim Hall79d07d22020-04-27 18:20:16 +010052from .tflite import DensifyOptions
53from .tflite import DepthToSpaceOptions
Diego Russoe8a10452020-04-21 17:39:10 +010054from .tflite import DepthwiseConv2DOptions
55from .tflite import DequantizeOptions
56from .tflite import DivOptions
Rickard Bolind66f8012022-04-21 07:36:55 +000057from .tflite import DynamicUpdateSliceOptions
Diego Russoe8a10452020-04-21 17:39:10 +010058from .tflite import EmbeddingLookupSparseOptions
59from .tflite import EqualOptions
60from .tflite import ExpandDimsOptions
61from .tflite import ExpOptions
62from .tflite import FakeQuantOptions
63from .tflite import FillOptions
64from .tflite import FloorDivOptions
65from .tflite import FloorModOptions
66from .tflite import FullyConnectedOptions
67from .tflite import GatherNdOptions
68from .tflite import GatherOptions
Rickard Bolind66f8012022-04-21 07:36:55 +000069from .tflite import GeluOptions
Diego Russoe8a10452020-04-21 17:39:10 +010070from .tflite import GreaterEqualOptions
71from .tflite import GreaterOptions
Louis Verhaard678645b2020-06-15 15:22:47 +020072from .tflite import HardSwishOptions
Dwight Lidman8a12da12021-07-19 13:43:05 +020073from .tflite import HashtableFindOptions
74from .tflite import HashtableImportOptions
75from .tflite import HashtableOptions
76from .tflite import HashtableSizeOptions
Tim Hall79d07d22020-04-27 18:20:16 +010077from .tflite import IfOptions
Diego Russoe8a10452020-04-21 17:39:10 +010078from .tflite import L2NormOptions
79from .tflite import LeakyReluOptions
80from .tflite import LessEqualOptions
81from .tflite import LessOptions
82from .tflite import LocalResponseNormalizationOptions
83from .tflite import LogicalAndOptions
84from .tflite import LogicalNotOptions
85from .tflite import LogicalOrOptions
86from .tflite import LogSoftmaxOptions
87from .tflite import LSHProjectionOptions
88from .tflite import LSTMOptions
89from .tflite import MatrixDiagOptions
90from .tflite import MatrixSetDiagOptions
91from .tflite import MaximumMinimumOptions
92from .tflite import MirrorPadOptions
93from .tflite import MulOptions
94from .tflite import NegOptions
Tim Hall79d07d22020-04-27 18:20:16 +010095from .tflite import NonMaxSuppressionV4Options
96from .tflite import NonMaxSuppressionV5Options
Diego Russoe8a10452020-04-21 17:39:10 +010097from .tflite import NotEqualOptions
98from .tflite import OneHotOptions
99from .tflite import PackOptions
100from .tflite import PadOptions
101from .tflite import PadV2Options
102from .tflite import Pool2DOptions
103from .tflite import PowOptions
104from .tflite import QuantizeOptions
Rickard Bolin2de898a2021-12-20 08:35:23 +0000105from .tflite import RandomOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100106from .tflite import RangeOptions
107from .tflite import RankOptions
Rickard Bolin2de898a2021-12-20 08:35:23 +0000108from .tflite import ReadVariableOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100109from .tflite import ReducerOptions
110from .tflite import ReshapeOptions
111from .tflite import ResizeBilinearOptions
112from .tflite import ResizeNearestNeighborOptions
113from .tflite import ReverseSequenceOptions
114from .tflite import ReverseV2Options
Dwight Lidman8a12da12021-07-19 13:43:05 +0200115from .tflite import Rfft2dOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100116from .tflite import RNNOptions
Tim Hall79d07d22020-04-27 18:20:16 +0100117from .tflite import ScatterNdOptions
118from .tflite import SegmentSumOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100119from .tflite import SelectOptions
Tim Hall79d07d22020-04-27 18:20:16 +0100120from .tflite import SelectV2Options
Diego Russoe8a10452020-04-21 17:39:10 +0100121from .tflite import SequenceRNNOptions
122from .tflite import ShapeOptions
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200123from .tflite import SignOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100124from .tflite import SkipGramOptions
125from .tflite import SliceOptions
126from .tflite import SoftmaxOptions
127from .tflite import SpaceToBatchNDOptions
128from .tflite import SpaceToDepthOptions
129from .tflite import SparseToDenseOptions
130from .tflite import SplitOptions
131from .tflite import SplitVOptions
132from .tflite import SquaredDifferenceOptions
133from .tflite import SquareOptions
134from .tflite import SqueezeOptions
135from .tflite import StridedSliceOptions
136from .tflite import SubOptions
137from .tflite import SVDFOptions
138from .tflite import TileOptions
139from .tflite import TopKV2Options
140from .tflite import TransposeConvOptions
141from .tflite import TransposeOptions
142from .tflite import UnidirectionalSequenceLSTMOptions
143from .tflite import UniqueOptions
144from .tflite import UnpackOptions
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200145from .tflite import UnsortedSegmentMaxOptions
146from .tflite import UnsortedSegmentMinOptions
erik.andersson@arm.comdd49a722022-08-10 15:26:48 +0200147from .tflite import UnsortedSegmentProdOptions
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200148from .tflite import UnsortedSegmentSumOptions
Rickard Bolin2de898a2021-12-20 08:35:23 +0000149from .tflite import VarHandleOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100150from .tflite import WhereOptions
Tim Hall79d07d22020-04-27 18:20:16 +0100151from .tflite import WhileOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100152from .tflite import ZerosLikeOptions
153from .tflite.ActivationFunctionType import ActivationFunctionType
Diego Russoea6111a2020-04-14 18:41:58 +0100154from .tflite.BuiltinOperator import BuiltinOperator
155from .tflite.BuiltinOptions import BuiltinOptions
156from .tflite.Padding import Padding
Diego Russoe8a10452020-04-21 17:39:10 +0100157from .tflite.TensorType import TensorType
Tim Hall79d07d22020-04-27 18:20:16 +0100158
159
160def inverse_map(map):
161 return {v: k for k, v in map.items()}
162
163
164datatype_map = {
165 TensorType.UINT8: DataType.uint8,
166 TensorType.INT8: DataType.int8,
167 TensorType.INT16: DataType.int16,
168 TensorType.INT32: DataType.int32,
169 TensorType.INT64: DataType.int64,
170 TensorType.FLOAT16: DataType.float16,
171 TensorType.FLOAT32: DataType.float32,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200172 TensorType.FLOAT64: DataType.float64,
Tim Hall79d07d22020-04-27 18:20:16 +0100173 TensorType.STRING: DataType.string,
174 TensorType.BOOL: DataType.bool,
Jacob Bohlinf767b932020-08-13 15:32:45 +0200175 TensorType.COMPLEX64: DataType.complex64,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200176 TensorType.COMPLEX128: DataType.complex128,
Dwight Lidmanf53b3322021-10-08 11:58:08 +0200177 TensorType.UINT64: DataType.uint64,
178 TensorType.RESOURCE: DataType.resource,
179 TensorType.VARIANT: DataType.variant,
180 TensorType.UINT32: DataType.uint32,
Rickard Bolind66f8012022-04-21 07:36:55 +0000181 TensorType.UINT16: DataType.uint16,
Tim Hall79d07d22020-04-27 18:20:16 +0100182}
183
184datatype_inv_map = inverse_map(datatype_map)
185datatype_inv_map[DataType.quint8] = TensorType.UINT8
186
187datatype_inv_map[DataType.qint8] = TensorType.INT8
188datatype_inv_map[DataType.qint16] = TensorType.INT16
189datatype_inv_map[DataType.qint32] = TensorType.INT32
190
191
192datatype_map_numpy = {
193 TensorType.UINT8: np.uint8,
Rickard Bolind66f8012022-04-21 07:36:55 +0000194 TensorType.UINT16: np.uint16,
Dwight Lidmanf53b3322021-10-08 11:58:08 +0200195 TensorType.UINT32: np.uint32,
196 TensorType.UINT64: np.uint64,
Tim Hall79d07d22020-04-27 18:20:16 +0100197 TensorType.INT8: np.int8,
198 TensorType.INT16: np.int16,
199 TensorType.INT32: np.int32,
200 TensorType.INT64: np.int64,
201 TensorType.FLOAT16: np.float16,
202 TensorType.FLOAT32: np.float32,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200203 TensorType.FLOAT64: np.float64,
Rickard Bolin5fdcf172022-12-19 12:56:17 +0000204 TensorType.BOOL: bool,
Jacob Bohlinf767b932020-08-13 15:32:45 +0200205 TensorType.COMPLEX64: np.complex64,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200206 TensorType.COMPLEX128: np.complex128,
Louis Verhaardf4e12be2020-12-18 14:23:06 +0100207 TensorType.STRING: np.uint8,
Dwight Lidmanf53b3322021-10-08 11:58:08 +0200208 TensorType.RESOURCE: None, # experimental type
209 TensorType.VARIANT: None, # experimental type
Tim Hall79d07d22020-04-27 18:20:16 +0100210}
211
212
213builtin_options_map = {
214 BuiltinOptions.Conv2DOptions: Conv2DOptions.Conv2DOptions,
215 BuiltinOptions.DepthwiseConv2DOptions: DepthwiseConv2DOptions.DepthwiseConv2DOptions,
216 BuiltinOptions.ConcatEmbeddingsOptions: ConcatEmbeddingsOptions.ConcatEmbeddingsOptions,
217 BuiltinOptions.LSHProjectionOptions: LSHProjectionOptions.LSHProjectionOptions,
218 BuiltinOptions.Pool2DOptions: Pool2DOptions.Pool2DOptions,
219 BuiltinOptions.SVDFOptions: SVDFOptions.SVDFOptions,
220 BuiltinOptions.RNNOptions: RNNOptions.RNNOptions,
221 BuiltinOptions.FullyConnectedOptions: FullyConnectedOptions.FullyConnectedOptions,
222 BuiltinOptions.SoftmaxOptions: SoftmaxOptions.SoftmaxOptions,
223 BuiltinOptions.ConcatenationOptions: ConcatenationOptions.ConcatenationOptions,
224 BuiltinOptions.AddOptions: AddOptions.AddOptions,
225 BuiltinOptions.L2NormOptions: L2NormOptions.L2NormOptions,
226 BuiltinOptions.LocalResponseNormalizationOptions: LocalResponseNormalizationOptions.LocalResponseNormalizationOptions, # noqa: E501
227 BuiltinOptions.LSTMOptions: LSTMOptions.LSTMOptions,
228 BuiltinOptions.ResizeBilinearOptions: ResizeBilinearOptions.ResizeBilinearOptions,
229 BuiltinOptions.CallOptions: CallOptions.CallOptions,
230 BuiltinOptions.ReshapeOptions: ReshapeOptions.ReshapeOptions,
231 BuiltinOptions.SkipGramOptions: SkipGramOptions.SkipGramOptions,
232 BuiltinOptions.SpaceToDepthOptions: SpaceToDepthOptions.SpaceToDepthOptions,
233 BuiltinOptions.EmbeddingLookupSparseOptions: EmbeddingLookupSparseOptions.EmbeddingLookupSparseOptions,
234 BuiltinOptions.MulOptions: MulOptions.MulOptions,
235 BuiltinOptions.PadOptions: PadOptions.PadOptions,
236 BuiltinOptions.GatherOptions: GatherOptions.GatherOptions,
237 BuiltinOptions.BatchToSpaceNDOptions: BatchToSpaceNDOptions.BatchToSpaceNDOptions,
238 BuiltinOptions.SpaceToBatchNDOptions: SpaceToBatchNDOptions.SpaceToBatchNDOptions,
239 BuiltinOptions.TransposeOptions: TransposeOptions.TransposeOptions,
240 BuiltinOptions.ReducerOptions: ReducerOptions.ReducerOptions,
241 BuiltinOptions.SubOptions: SubOptions.SubOptions,
242 BuiltinOptions.DivOptions: DivOptions.DivOptions,
243 BuiltinOptions.SqueezeOptions: SqueezeOptions.SqueezeOptions,
244 BuiltinOptions.SequenceRNNOptions: SequenceRNNOptions.SequenceRNNOptions,
245 BuiltinOptions.StridedSliceOptions: StridedSliceOptions.StridedSliceOptions,
246 BuiltinOptions.ExpOptions: ExpOptions.ExpOptions,
247 BuiltinOptions.TopKV2Options: TopKV2Options.TopKV2Options,
248 BuiltinOptions.SplitOptions: SplitOptions.SplitOptions,
249 BuiltinOptions.LogSoftmaxOptions: LogSoftmaxOptions.LogSoftmaxOptions,
250 BuiltinOptions.CastOptions: CastOptions.CastOptions,
251 BuiltinOptions.DequantizeOptions: DequantizeOptions.DequantizeOptions,
252 BuiltinOptions.MaximumMinimumOptions: MaximumMinimumOptions.MaximumMinimumOptions,
253 BuiltinOptions.ArgMaxOptions: ArgMaxOptions.ArgMaxOptions,
254 BuiltinOptions.LessOptions: LessOptions.LessOptions,
255 BuiltinOptions.NegOptions: NegOptions.NegOptions,
256 BuiltinOptions.PadV2Options: PadV2Options.PadV2Options,
257 BuiltinOptions.GreaterOptions: GreaterOptions.GreaterOptions,
258 BuiltinOptions.GreaterEqualOptions: GreaterEqualOptions.GreaterEqualOptions,
259 BuiltinOptions.LessEqualOptions: LessEqualOptions.LessEqualOptions,
260 BuiltinOptions.SelectOptions: SelectOptions.SelectOptions,
261 BuiltinOptions.SliceOptions: SliceOptions.SliceOptions,
262 BuiltinOptions.TransposeConvOptions: TransposeConvOptions.TransposeConvOptions,
263 BuiltinOptions.SparseToDenseOptions: SparseToDenseOptions.SparseToDenseOptions,
264 BuiltinOptions.TileOptions: TileOptions.TileOptions,
265 BuiltinOptions.ExpandDimsOptions: ExpandDimsOptions.ExpandDimsOptions,
266 BuiltinOptions.EqualOptions: EqualOptions.EqualOptions,
267 BuiltinOptions.NotEqualOptions: NotEqualOptions.NotEqualOptions,
268 BuiltinOptions.ShapeOptions: ShapeOptions.ShapeOptions,
269 BuiltinOptions.PowOptions: PowOptions.PowOptions,
270 BuiltinOptions.ArgMinOptions: ArgMinOptions.ArgMinOptions,
271 BuiltinOptions.FakeQuantOptions: FakeQuantOptions.FakeQuantOptions,
272 BuiltinOptions.PackOptions: PackOptions.PackOptions,
273 BuiltinOptions.LogicalOrOptions: LogicalOrOptions.LogicalOrOptions,
274 BuiltinOptions.OneHotOptions: OneHotOptions.OneHotOptions,
275 BuiltinOptions.LogicalAndOptions: LogicalAndOptions.LogicalAndOptions,
276 BuiltinOptions.LogicalNotOptions: LogicalNotOptions.LogicalNotOptions,
277 BuiltinOptions.UnpackOptions: UnpackOptions.UnpackOptions,
278 BuiltinOptions.FloorDivOptions: FloorDivOptions.FloorDivOptions,
279 BuiltinOptions.SquareOptions: SquareOptions.SquareOptions,
280 BuiltinOptions.ZerosLikeOptions: ZerosLikeOptions.ZerosLikeOptions,
281 BuiltinOptions.FillOptions: FillOptions.FillOptions,
282 BuiltinOptions.BidirectionalSequenceLSTMOptions: BidirectionalSequenceLSTMOptions.BidirectionalSequenceLSTMOptions,
283 BuiltinOptions.BidirectionalSequenceRNNOptions: BidirectionalSequenceRNNOptions.BidirectionalSequenceRNNOptions,
284 BuiltinOptions.UnidirectionalSequenceLSTMOptions: UnidirectionalSequenceLSTMOptions.UnidirectionalSequenceLSTMOptions, # noqa: E501
285 BuiltinOptions.FloorModOptions: FloorModOptions.FloorModOptions,
286 BuiltinOptions.RangeOptions: RangeOptions.RangeOptions,
287 BuiltinOptions.ResizeNearestNeighborOptions: ResizeNearestNeighborOptions.ResizeNearestNeighborOptions,
288 BuiltinOptions.LeakyReluOptions: LeakyReluOptions.LeakyReluOptions,
289 BuiltinOptions.SquaredDifferenceOptions: SquaredDifferenceOptions.SquaredDifferenceOptions,
290 BuiltinOptions.MirrorPadOptions: MirrorPadOptions.MirrorPadOptions,
291 BuiltinOptions.AbsOptions: AbsOptions.AbsOptions,
292 BuiltinOptions.SplitVOptions: SplitVOptions.SplitVOptions,
293 BuiltinOptions.UniqueOptions: UniqueOptions.UniqueOptions,
294 BuiltinOptions.ReverseV2Options: ReverseV2Options.ReverseV2Options,
295 BuiltinOptions.AddNOptions: AddNOptions.AddNOptions,
296 BuiltinOptions.GatherNdOptions: GatherNdOptions.GatherNdOptions,
297 BuiltinOptions.CosOptions: CosOptions.CosOptions,
298 BuiltinOptions.WhereOptions: WhereOptions.WhereOptions,
299 BuiltinOptions.RankOptions: RankOptions.RankOptions,
300 BuiltinOptions.ReverseSequenceOptions: ReverseSequenceOptions.ReverseSequenceOptions,
301 BuiltinOptions.MatrixDiagOptions: MatrixDiagOptions.MatrixDiagOptions,
302 BuiltinOptions.QuantizeOptions: QuantizeOptions.QuantizeOptions,
303 BuiltinOptions.MatrixSetDiagOptions: MatrixSetDiagOptions.MatrixSetDiagOptions,
304 BuiltinOptions.DensifyOptions: DensifyOptions.DensifyOptions,
305 BuiltinOptions.DepthToSpaceOptions: DepthToSpaceOptions.DepthToSpaceOptions,
Louis Verhaard678645b2020-06-15 15:22:47 +0200306 BuiltinOptions.HardSwishOptions: HardSwishOptions.HardSwishOptions,
Tim Hall79d07d22020-04-27 18:20:16 +0100307 BuiltinOptions.IfOptions: IfOptions.IfOptions,
308 BuiltinOptions.NonMaxSuppressionV4Options: NonMaxSuppressionV4Options.NonMaxSuppressionV4Options,
309 BuiltinOptions.NonMaxSuppressionV5Options: NonMaxSuppressionV5Options.NonMaxSuppressionV5Options,
310 BuiltinOptions.ScatterNdOptions: ScatterNdOptions.ScatterNdOptions,
311 BuiltinOptions.SegmentSumOptions: SegmentSumOptions.SegmentSumOptions,
312 BuiltinOptions.SelectV2Options: SelectV2Options.SelectV2Options,
313 BuiltinOptions.WhileOptions: WhileOptions.WhileOptions,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200314 BuiltinOptions.BatchMatMulOptions: BatchMatMulOptions.BatchMatMulOptions,
Tim Hall42abec12021-02-04 21:31:57 +0000315 BuiltinOptions.CumsumOptions: CumsumOptions.CumsumOptions,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200316 BuiltinOptions.CallOnceOptions: CallOnceOptions.CallOnceOptions,
317 BuiltinOptions.BroadcastToOptions: BroadcastToOptions.BroadcastToOptions,
318 BuiltinOptions.Rfft2dOptions: Rfft2dOptions.Rfft2dOptions,
319 BuiltinOptions.Conv3DOptions: Conv3DOptions.Conv3DOptions,
320 BuiltinOptions.HashtableOptions: HashtableOptions.HashtableOptions,
321 BuiltinOptions.HashtableFindOptions: HashtableFindOptions.HashtableFindOptions,
322 BuiltinOptions.HashtableImportOptions: HashtableImportOptions.HashtableImportOptions,
323 BuiltinOptions.HashtableSizeOptions: HashtableSizeOptions.HashtableSizeOptions,
Rickard Bolin2de898a2021-12-20 08:35:23 +0000324 BuiltinOptions.VarHandleOptions: VarHandleOptions.VarHandleOptions,
325 BuiltinOptions.ReadVariableOptions: ReadVariableOptions.ReadVariableOptions,
326 BuiltinOptions.AssignVariableOptions: AssignVariableOptions.AssignVariableOptions,
327 BuiltinOptions.RandomOptions: RandomOptions.RandomOptions,
Rickard Bolind66f8012022-04-21 07:36:55 +0000328 BuiltinOptions.BucketizeOptions: BucketizeOptions.BucketizeOptions,
329 BuiltinOptions.DynamicUpdateSliceOptions: DynamicUpdateSliceOptions.DynamicUpdateSliceOptions,
330 BuiltinOptions.GeluOptions: GeluOptions.GeluOptions,
erik.andersson@arm.comdd49a722022-08-10 15:26:48 +0200331 BuiltinOptions.UnsortedSegmentProdOptions: UnsortedSegmentProdOptions.UnsortedSegmentProdOptions,
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200332 BuiltinOptions.UnsortedSegmentMaxOptions: UnsortedSegmentMaxOptions.UnsortedSegmentMaxOptions,
333 BuiltinOptions.UnsortedSegmentMinOptions: UnsortedSegmentMinOptions.UnsortedSegmentMinOptions,
334 BuiltinOptions.UnsortedSegmentSumOptions: UnsortedSegmentSumOptions.UnsortedSegmentSumOptions,
335 BuiltinOptions.ATan2Options: ATan2Options.ATan2Options,
336 BuiltinOptions.SignOptions: SignOptions.SignOptions,
Tim Hall79d07d22020-04-27 18:20:16 +0100337}
338
Rickard Bolin2de898a2021-12-20 08:35:23 +0000339
Tim Hall79d07d22020-04-27 18:20:16 +0100340builtin_options_inv_map = inverse_map(builtin_options_map)
341
342
343def underscore_to_camel_case(s):
344 return "".join(x.title() for x in s.split("_"))
345
346
347def padding_deserialize(x):
348 return padding_map[x]
349
350
351def padding_serialize(builder, x):
352 return padding_inv_map[x]
353
354
355def activation_deserialize(x):
356 return activation_function_map[x]
357
358
359def activation_serialize(builder, x):
360 return activation_function_inv_map[x]
361
362
363def datatype_deserialize(x):
364 return datatype_map[x]
365
366
367def datatype_serialize(builder, x):
368 return datatype_inv_map[x]
369
370
371def identity(x):
372 return x
373
374
375def identity_serialize(builder, x):
376 return x
377
378
379def write_byte_vector(builder, v):
380 builder.StartVector(1, len(v), 1)
381 for e in v[::-1]:
382 builder.PrependByte(e)
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200383 return builder.EndVector()
Tim Hall79d07d22020-04-27 18:20:16 +0100384
385
386def write_int_vector(builder, v):
387 builder.StartVector(4, len(v), 4)
388 for e in v[::-1]:
389 builder.PrependInt32(e)
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200390 return builder.EndVector()
Tim Hall79d07d22020-04-27 18:20:16 +0100391
392
393class OptionsSerializer:
Michael McGeagh6f725262020-12-03 15:21:36 +0000394 def __init__(self, name, members=None):
Tim Hall79d07d22020-04-27 18:20:16 +0100395 self.name = name
396 self.module = globals()[self.name]
397 self.cls = getattr(self.module, self.name)
398 self.builtin_opt_type = builtin_options_inv_map[self.cls]
Tim Hall79d07d22020-04-27 18:20:16 +0100399 self.members = []
Michael McGeagh6f725262020-12-03 15:21:36 +0000400 if members is not None:
401 for mem in members:
402 deserialize = identity
403 serialize = identity_serialize
404 is_vector = False
405 if isinstance(mem, tuple):
406 if len(mem) == 3:
407 mem, deserialize, serialize = mem
408 elif len(mem) == 2:
409 mem, is_vector = mem
410 deserialize = tuple
411 serialize = write_int_vector
412 else:
413 assert 0
414 underscore_mem = mem
415 camelcase_mem = underscore_to_camel_case(mem)
416 self.members.append((underscore_mem, camelcase_mem, deserialize, serialize, is_vector))
Tim Hall79d07d22020-04-27 18:20:16 +0100417
Tim Hallc8310b12020-06-17 14:53:11 +0100418 def deserialize(self, op_data):
419 builtin_options = op_data.BuiltinOptions()
Tim Hall79d07d22020-04-27 18:20:16 +0100420 attrs = {}
Tim Hallc8310b12020-06-17 14:53:11 +0100421 if builtin_options:
Tim Hall79d07d22020-04-27 18:20:16 +0100422 tfattrs = self.cls()
Tim Hallc8310b12020-06-17 14:53:11 +0100423 tfattrs.Init(builtin_options.Bytes, builtin_options.Pos)
Tim Hall79d07d22020-04-27 18:20:16 +0100424 for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members:
425 fun = camelcase_mem
426 if is_vector:
427 fun += "AsNumpy"
428
Fredrik Svedberg4bb989b2020-11-16 15:32:25 +0100429 attr = getattr(tfattrs, fun)()
430 try:
431 attrs[underscore_mem] = deserialize(attr)
432 except TypeError:
433 print("Warning: {0} could not read attribute '{1}'.".format(self.name, underscore_mem))
434
Tim Hall79d07d22020-04-27 18:20:16 +0100435 return attrs
436
437 def serialize(self, builder, attrs):
438 ser_attrs = []
439 for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members:
440 a = serialize(builder, attrs[underscore_mem])
441 ser_attrs.append((camelcase_mem, a))
442
443 getattr(self.module, self.name + "Start")(builder)
444
445 for camelcase_mem, a in ser_attrs:
446 getattr(self.module, self.name + "Add" + camelcase_mem)(builder, a)
447
448 return getattr(self.module, self.name + "End")(builder), None
449
450
451class CustomOptionsSerializer:
Tim Hallc8310b12020-06-17 14:53:11 +0100452 CUSTOM_OPTIONS_NPU_OP = [0x01, 0x04, 0x01] # NpuOp=1, FlexbufferFormat.UINT8=4, byte length=1
453 CUSTOM_OPTIONS_FORMAT_DEFAULT = 0
454
Tim Hall79d07d22020-04-27 18:20:16 +0100455 def __init__(self):
Tim Hall79d07d22020-04-27 18:20:16 +0100456 self.custom_opt_format = 0
457
Tim Hallc8310b12020-06-17 14:53:11 +0100458 def deserialize(self, op_data):
Tim Hall79d07d22020-04-27 18:20:16 +0100459 attrs = {}
Tim Hallc8310b12020-06-17 14:53:11 +0100460 custom_options = op_data.CustomOptionsAsNumpy()
461 attrs["custom_options"] = custom_options
462 attrs["custom_options_format"] = op_data.CustomOptionsFormat()
463
464 if np.array_equal(custom_options, self.CUSTOM_OPTIONS_NPU_OP):
Louis Verhaardaee5d752020-09-30 09:01:52 +0200465 attrs["custom_type"] = CustomType.ExistingNpuOp
Tim Hallc8310b12020-06-17 14:53:11 +0100466
Tim Hall79d07d22020-04-27 18:20:16 +0100467 return attrs
468
469 def serialize(self, builder, attrs):
Louis Verhaardaee5d752020-09-30 09:01:52 +0200470 custom_type = attrs.get("custom_type", CustomType.ThirdPartyOp)
Tim Hallc8310b12020-06-17 14:53:11 +0100471 self.custom_opt_format = attrs.get("custom_options_format", self.CUSTOM_OPTIONS_FORMAT_DEFAULT)
Tim Hall79d07d22020-04-27 18:20:16 +0100472
473 # Set NPU op custom options for the TensorFlow Lite custom operator
Louis Verhaardaee5d752020-09-30 09:01:52 +0200474 if custom_type == CustomType.NpuOp:
Tim Hallc8310b12020-06-17 14:53:11 +0100475 custom_options = self.CUSTOM_OPTIONS_NPU_OP
476 else:
477 custom_options = attrs.get("custom_options", [])
Tim Hall79d07d22020-04-27 18:20:16 +0100478
Tim Hallc8310b12020-06-17 14:53:11 +0100479 custom_options_bytes = struct.pack("<{0}B".format(len(custom_options)), *custom_options)
480 custom_offset = write_byte_vector(builder, custom_options_bytes)
Tim Hall79d07d22020-04-27 18:20:16 +0100481
482 return None, custom_offset
483
484
485padding_map = {
Michael McGeagh16895482020-12-14 15:51:20 +0000486 Padding.SAME: opPad.SAME,
487 Padding.VALID: opPad.VALID,
Tim Hall79d07d22020-04-27 18:20:16 +0100488}
489
490padding_inv_map = inverse_map(padding_map)
491
492
493activation_function_map = {
494 ActivationFunctionType.NONE: None,
Louis Verhaardaee5d752020-09-30 09:01:52 +0200495 ActivationFunctionType.RELU: Op.Relu,
496 ActivationFunctionType.RELU_N1_TO_1: Op.ReluN1To1,
497 ActivationFunctionType.RELU6: Op.Relu6,
498 ActivationFunctionType.TANH: Op.Tanh,
499 ActivationFunctionType.SIGN_BIT: Op.SignBit,
Tim Hall79d07d22020-04-27 18:20:16 +0100500}
501
502activation_function_inv_map = inverse_map(activation_function_map)
503
504fused_act = ("fused_activation_function", activation_deserialize, activation_serialize)
505padding = ("padding", padding_deserialize, padding_serialize)
506
Tim Hall79d07d22020-04-27 18:20:16 +0100507is_int_vec = True
508
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200509TFLITE_NO_INDICES = TensorIndices([], [], [])
510TFLITE_IFM_INDICES = TensorIndices([0], [], [])
511TFLITE_IFM_WEIGHTS_INDICES = TensorIndices([0], [1], [])
512TFLITE_IFM_WEIGHTS_BIAS_INDICES = TensorIndices([0], [1], [2])
513TFLITE_IFM_IFM2_INDICES = TensorIndices([0, 1], [], [])
514TFLITE_CONV2D_BACKPROP_INDICES = TensorIndices([2], [1], [3])
515TFLITE_TRANSPOSE_CONV_INDICES = TensorIndices([0], [1], [3])
516TFLITE_CONCAT_INDICES = TensorIndices([1, 2], [], [])
517TFLITE_SPLIT_IFM_INDICES = TensorIndices([1], [], [])
518TFLITE_BLOCK_LSTM_INDICES = TensorIndices([3], [4], [])
519
Tim Hall79d07d22020-04-27 18:20:16 +0100520builtin_operator_map = {
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200521 BuiltinOperator.ADD: (
522 Op.Add,
523 OptionsSerializer("AddOptions", (fused_act, "pot_scale_int16")),
524 TFLITE_IFM_IFM2_INDICES,
525 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200526 BuiltinOperator.AVERAGE_POOL_2D: (
527 Op.AvgPool,
528 OptionsSerializer(
529 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
530 ),
531 TFLITE_IFM_INDICES,
532 ),
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200533 BuiltinOperator.ATAN2: (Op.Atan2, OptionsSerializer("ATan2Options", ()), TFLITE_IFM_IFM2_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200534 BuiltinOperator.CONCATENATION: (
535 Op.ConcatTFLite,
536 OptionsSerializer("ConcatenationOptions", ("axis", fused_act)),
537 TFLITE_CONCAT_INDICES,
538 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200539 BuiltinOperator.CONV_2D: (
540 Op.Conv2DBias,
541 OptionsSerializer(
542 "Conv2DOptions", ("dilation_h_factor", "dilation_w_factor", fused_act, padding, "stride_h", "stride_w")
543 ),
544 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
545 ),
546 BuiltinOperator.DEPTHWISE_CONV_2D: (
547 Op.DepthwiseConv2DBias,
548 OptionsSerializer(
549 "DepthwiseConv2DOptions",
550 ("depth_multiplier", "dilation_h_factor", "dilation_w_factor", fused_act, padding, "stride_h", "stride_w"),
551 ),
552 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
553 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200554 BuiltinOperator.DEPTH_TO_SPACE: (
555 Op.DepthToSpace,
556 OptionsSerializer("DepthToSpaceOptions", ("block_size",)),
557 TFLITE_NO_INDICES,
558 ),
559 BuiltinOperator.DEQUANTIZE: (Op.Dequantize, OptionsSerializer("DequantizeOptions"), TFLITE_IFM_INDICES),
560 BuiltinOperator.EMBEDDING_LOOKUP: (Op.EmbeddingLookup, None, TFLITE_NO_INDICES),
561 BuiltinOperator.FLOOR: (Op.Floor, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100562 BuiltinOperator.FULLY_CONNECTED: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200563 Op.FullyConnected,
erik.andersson@arm.com0cbb1662021-02-22 15:47:07 +0100564 OptionsSerializer(
Dwight Lidman8a12da12021-07-19 13:43:05 +0200565 "FullyConnectedOptions", ("asymmetric_quantize_inputs", fused_act, "keep_num_dims", "weights_format")
erik.andersson@arm.com0cbb1662021-02-22 15:47:07 +0100566 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200567 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100568 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200569 BuiltinOperator.HASHTABLE_LOOKUP: (Op.HashtableLookup, None, TFLITE_NO_INDICES),
570 BuiltinOperator.L2_NORMALIZATION: (Op.L2Norm, OptionsSerializer("L2NormOptions", (fused_act,)), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200571 BuiltinOperator.L2_POOL_2D: (
572 Op.L2Pool2D,
573 OptionsSerializer(
574 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
575 ),
576 TFLITE_NO_INDICES,
577 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100578 BuiltinOperator.LOCAL_RESPONSE_NORMALIZATION: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200579 Op.LRN,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200580 OptionsSerializer("LocalResponseNormalizationOptions", ("alpha", "beta", "bias", "radius")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200581 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100582 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200583 BuiltinOperator.LOGISTIC: (Op.Sigmoid, None, TFLITE_IFM_INDICES),
584 BuiltinOperator.LSH_PROJECTION: (
585 Op.LSHProjection,
586 OptionsSerializer("LSHProjectionOptions", ("type",)),
587 TFLITE_NO_INDICES,
588 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200589 BuiltinOperator.LSTM: (
590 Op.Lstm,
591 OptionsSerializer(
592 "LSTMOptions", ("asymmetric_quantize_inputs", "cell_clip", fused_act, "kernel_type", "proj_clip")
593 ),
594 TFLITE_IFM_WEIGHTS_INDICES,
595 ),
596 BuiltinOperator.MAX_POOL_2D: (
597 Op.MaxPool,
598 OptionsSerializer(
599 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
600 ),
601 TFLITE_IFM_INDICES,
602 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200603 BuiltinOperator.MUL: (Op.Mul, OptionsSerializer("MulOptions", (fused_act,)), TFLITE_IFM_IFM2_INDICES),
604 BuiltinOperator.RELU: (Op.Relu, None, TFLITE_IFM_INDICES),
erik.andersson@arm.comdd49a722022-08-10 15:26:48 +0200605 BuiltinOperator.RELU_0_TO_1: (Op.Relu0To1, None, TFLITE_IFM_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200606 BuiltinOperator.RELU_N1_TO_1: (Op.ReluN1To1, None, TFLITE_IFM_INDICES),
607 BuiltinOperator.RELU6: (Op.Relu6, None, TFLITE_IFM_INDICES),
608 BuiltinOperator.RESHAPE: (
609 Op.Reshape,
Dwight Lidmancfb42622021-08-11 12:28:51 +0200610 OptionsSerializer("ReshapeOptions", (("new_shape", is_int_vec),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200611 TFLITE_IFM_INDICES,
612 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100613 BuiltinOperator.RESIZE_BILINEAR: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200614 Op.ResizeBilinear,
Tim Hall79d07d22020-04-27 18:20:16 +0100615 OptionsSerializer("ResizeBilinearOptions", ("align_corners", "half_pixel_centers")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200616 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100617 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200618 BuiltinOperator.RNN: (
619 Op.Rnn,
620 OptionsSerializer("RNNOptions", ("asymmetric_quantize_inputs", fused_act)),
621 TFLITE_IFM_WEIGHTS_INDICES,
622 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200623 BuiltinOperator.SOFTMAX: (Op.Softmax, OptionsSerializer("SoftmaxOptions", ("beta",)), TFLITE_IFM_INDICES),
624 BuiltinOperator.SPACE_TO_DEPTH: (
625 Op.SpaceToDepth,
626 OptionsSerializer("SpaceToDepthOptions", ("block_size",)),
627 TFLITE_NO_INDICES,
628 ),
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200629 BuiltinOperator.SVDF: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200630 Op.Svdf,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200631 OptionsSerializer("SVDFOptions", ("asymmetric_quantize_inputs", fused_act, "rank")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200632 TFLITE_NO_INDICES,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200633 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200634 BuiltinOperator.TANH: (Op.Tanh, None, TFLITE_IFM_INDICES),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200635 BuiltinOperator.CONCAT_EMBEDDINGS: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200636 Op.ConcatEmbeddings,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200637 OptionsSerializer(
638 "ConcatEmbeddingsOptions",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200639 (
Dwight Lidman8a12da12021-07-19 13:43:05 +0200640 "embedding_dim_per_channel",
641 "embedding_dim_per_channel_as_numpy",
642 "embedding_dim_per_channel_is_none",
643 "embedding_dim_per_channel_length",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200644 "num_channels",
645 "num_columns_per_channel",
646 "num_columns_per_channel_as_numpy",
Dwight Lidman8a12da12021-07-19 13:43:05 +0200647 "num_columns_per_channel_is_none",
648 "num_columns_per_channel_length",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200649 ),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200650 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200651 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200652 ),
653 BuiltinOperator.SKIP_GRAM: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200654 Op.SkipGram,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200655 OptionsSerializer("SkipGramOptions", ("include_all_ngrams", "max_skip_size", "ngram_size")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200656 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200657 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200658 BuiltinOperator.CALL: (Op.Call, OptionsSerializer("CallOptions", ("subgraph",)), TFLITE_NO_INDICES),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200659 BuiltinOperator.EMBEDDING_LOOKUP_SPARSE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200660 Op.EmbeddingLookupSparse,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200661 OptionsSerializer("EmbeddingLookupSparseOptions", ("combiner",)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200662 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200663 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200664 BuiltinOperator.PAD: (Op.Pad, OptionsSerializer("PadOptions"), TFLITE_IFM_INDICES),
665 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_RNN: (
666 Op.UnidirectionalSequenceRnn,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200667 OptionsSerializer("SequenceRNNOptions", ("asymmetric_quantize_inputs", fused_act, "time_major")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200668 TFLITE_IFM_WEIGHTS_INDICES,
669 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200670 BuiltinOperator.GATHER: (
671 Op.GatherV2,
672 OptionsSerializer("GatherOptions", ("axis", "batch_dims")),
673 TFLITE_NO_INDICES,
674 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200675 BuiltinOperator.BATCH_TO_SPACE_ND: (
676 Op.BatchToSpaceND,
677 OptionsSerializer("BatchToSpaceNDOptions"),
678 TFLITE_NO_INDICES,
679 ),
680 BuiltinOperator.SPACE_TO_BATCH_ND: (
681 Op.SpaceToBatchND,
682 OptionsSerializer("SpaceToBatchNDOptions"),
683 TFLITE_NO_INDICES,
684 ),
James Ward6bf16132021-09-08 11:14:20 +0100685 BuiltinOperator.TRANSPOSE: (Op.Transpose, OptionsSerializer("TransposeOptions"), TFLITE_IFM_IFM2_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200686 BuiltinOperator.MEAN: (Op.Mean, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_IFM_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200687 BuiltinOperator.SUB: (
688 Op.Sub,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200689 OptionsSerializer("SubOptions", (fused_act, "pot_scale_int16")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200690 TFLITE_IFM_IFM2_INDICES,
691 ),
692 BuiltinOperator.DIV: (Op.Div, OptionsSerializer("DivOptions", (fused_act,)), TFLITE_NO_INDICES),
693 BuiltinOperator.SQUEEZE: (
694 Op.Squeeze,
Jonas Ohlssond8575072022-03-30 10:30:25 +0200695 OptionsSerializer(
696 "SqueezeOptions",
697 (("squeeze_dims", is_int_vec),),
698 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200699 TFLITE_IFM_INDICES,
700 ),
701 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_LSTM: (
702 Op.UnidirectionalSequenceLstm,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200703 OptionsSerializer(
704 "UnidirectionalSequenceLSTMOptions",
705 ("asymmetric_quantize_inputs", "cell_clip", fused_act, "proj_clip", "time_major"),
706 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200707 TFLITE_IFM_WEIGHTS_INDICES,
708 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100709 BuiltinOperator.STRIDED_SLICE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200710 Op.StridedSlice,
Tim Hall79d07d22020-04-27 18:20:16 +0100711 OptionsSerializer(
Dwight Lidman8a12da12021-07-19 13:43:05 +0200712 "StridedSliceOptions", ("begin_mask", "ellipsis_mask", "end_mask", "new_axis_mask", "shrink_axis_mask")
Tim Hall79d07d22020-04-27 18:20:16 +0100713 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200714 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100715 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200716 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_RNN: (
717 Op.BidirectionalSequenceRnn,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200718 OptionsSerializer(
719 "BidirectionalSequenceRNNOptions", ("asymmetric_quantize_inputs", fused_act, "merge_outputs", "time_major")
720 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200721 TFLITE_IFM_WEIGHTS_INDICES,
722 ),
James Ward6bf16132021-09-08 11:14:20 +0100723 BuiltinOperator.EXP: (Op.Exp, OptionsSerializer("ExpOptions"), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200724 BuiltinOperator.TOPK_V2: (Op.TopKV2, OptionsSerializer("TopKV2Options"), TFLITE_NO_INDICES),
725 BuiltinOperator.SPLIT: (Op.Split, OptionsSerializer("SplitOptions", ("num_splits",)), TFLITE_SPLIT_IFM_INDICES),
726 BuiltinOperator.LOG_SOFTMAX: (Op.LogSoftmax, OptionsSerializer("LogSoftmaxOptions"), TFLITE_NO_INDICES),
727 BuiltinOperator.DELEGATE: (Op.Delegate, None, TFLITE_NO_INDICES),
728 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_LSTM: (
729 Op.BidirectionalSequenceLstm,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200730 OptionsSerializer(
731 "BidirectionalSequenceLSTMOptions",
732 ("asymmetric_quantize_inputs", "cell_clip", fused_act, "merge_outputs", "proj_clip", "time_major"),
733 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200734 TFLITE_IFM_WEIGHTS_INDICES,
735 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100736 BuiltinOperator.CAST: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200737 Op.Cast,
Tim Hall79d07d22020-04-27 18:20:16 +0100738 OptionsSerializer(
739 "CastOptions",
740 (
741 ("in_data_type", datatype_deserialize, datatype_serialize),
742 ("out_data_type", datatype_deserialize, datatype_serialize),
743 ),
744 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200745 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100746 ),
Fredrik Svedberg8ddd4892022-08-19 16:06:04 +0200747 BuiltinOperator.PRELU: (Op.Prelu, None, TFLITE_IFM_IFM2_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200748 BuiltinOperator.MAXIMUM: (Op.Maximum, OptionsSerializer("MaximumMinimumOptions"), TFLITE_IFM_IFM2_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100749 BuiltinOperator.ARG_MAX: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200750 Op.ArgMax,
Tim Hall79d07d22020-04-27 18:20:16 +0100751 OptionsSerializer("ArgMaxOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
Rickard Bolin6986a072022-12-19 12:33:40 +0000752 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100753 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200754 BuiltinOperator.MINIMUM: (Op.Minimum, OptionsSerializer("MaximumMinimumOptions"), TFLITE_IFM_IFM2_INDICES),
755 BuiltinOperator.LESS: (Op.Less, OptionsSerializer("LessOptions"), TFLITE_NO_INDICES),
756 BuiltinOperator.NEG: (Op.Neg, OptionsSerializer("NegOptions"), TFLITE_NO_INDICES),
757 BuiltinOperator.PADV2: (Op.PadV2, OptionsSerializer("PadV2Options"), TFLITE_NO_INDICES),
758 BuiltinOperator.GREATER: (Op.Greater, OptionsSerializer("GreaterOptions"), TFLITE_NO_INDICES),
759 BuiltinOperator.GREATER_EQUAL: (Op.GreaterEqual, OptionsSerializer("GreaterEqualOptions"), TFLITE_NO_INDICES),
760 BuiltinOperator.LESS_EQUAL: (Op.LessEqual, OptionsSerializer("LessEqualOptions"), TFLITE_NO_INDICES),
761 BuiltinOperator.SELECT: (Op.Select, OptionsSerializer("SelectOptions"), TFLITE_NO_INDICES),
762 BuiltinOperator.SLICE: (Op.Slice, OptionsSerializer("SliceOptions"), TFLITE_IFM_INDICES),
763 BuiltinOperator.SIN: (Op.Sin, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100764 BuiltinOperator.TRANSPOSE_CONV: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200765 Op.Conv2DBackpropInput,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200766 OptionsSerializer("TransposeConvOptions", (padding, "stride_h", "stride_w")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200767 TFLITE_CONV2D_BACKPROP_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100768 ),
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200769 BuiltinOperator.SIGN: (Op.Sign, OptionsSerializer("SignOptions"), TFLITE_IFM_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100770 BuiltinOperator.SPARSE_TO_DENSE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200771 Op.SparseToDense,
Tim Hall79d07d22020-04-27 18:20:16 +0100772 OptionsSerializer("SparseToDenseOptions", ("validate_indices",)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200773 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100774 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200775 BuiltinOperator.TILE: (Op.Tile, OptionsSerializer("TileOptions"), TFLITE_NO_INDICES),
776 BuiltinOperator.EXPAND_DIMS: (Op.ExpandDims, OptionsSerializer("ExpandDimsOptions"), TFLITE_IFM_INDICES),
777 BuiltinOperator.EQUAL: (Op.Equal, OptionsSerializer("EqualOptions"), TFLITE_NO_INDICES),
778 BuiltinOperator.NOT_EQUAL: (Op.NotEqual, OptionsSerializer("NotEqualOptions"), TFLITE_NO_INDICES),
779 BuiltinOperator.LOG: (Op.Log, None, TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200780 BuiltinOperator.SUM: (Op.Sum, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200781 BuiltinOperator.SQRT: (Op.Sqrt, None, TFLITE_NO_INDICES),
782 BuiltinOperator.RSQRT: (Op.Rsqrt, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100783 BuiltinOperator.SHAPE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200784 Op.Shape,
Tim Hall79d07d22020-04-27 18:20:16 +0100785 OptionsSerializer("ShapeOptions", (("out_type", datatype_deserialize, datatype_serialize),)),
Ayaan Masood4965fae2022-06-29 11:30:57 +0100786 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100787 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200788 BuiltinOperator.POW: (Op.Pow, OptionsSerializer("PowOptions"), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100789 BuiltinOperator.ARG_MIN: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200790 Op.ArgMin,
Tim Hall79d07d22020-04-27 18:20:16 +0100791 OptionsSerializer("ArgMinOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200792 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100793 ),
794 BuiltinOperator.FAKE_QUANT: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200795 Op.FakeQuantWithMinMaxArgs,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200796 OptionsSerializer("FakeQuantOptions", ("max", "min", "narrow_range", "num_bits")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200797 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100798 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200799 BuiltinOperator.REDUCE_PROD: (Op.Prod, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
800 BuiltinOperator.REDUCE_MAX: (Op.Max, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
801 BuiltinOperator.PACK: (Op.Pack, OptionsSerializer("PackOptions", ("axis", "values_count")), TFLITE_IFM_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200802 BuiltinOperator.LOGICAL_OR: (Op.LogicalOr, OptionsSerializer("LogicalOrOptions"), TFLITE_NO_INDICES),
803 BuiltinOperator.ONE_HOT: (Op.OneHot, OptionsSerializer("OneHotOptions", ("axis",)), TFLITE_NO_INDICES),
804 BuiltinOperator.LOGICAL_AND: (Op.LogicalAnd, OptionsSerializer("LogicalAndOptions"), TFLITE_NO_INDICES),
805 BuiltinOperator.LOGICAL_NOT: (Op.LogicalNot, OptionsSerializer("LogicalNotOptions"), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200806 BuiltinOperator.UNPACK: (Op.Unpack, OptionsSerializer("UnpackOptions", ("axis", "num")), TFLITE_IFM_INDICES),
807 BuiltinOperator.REDUCE_MIN: (Op.Min, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200808 BuiltinOperator.FLOOR_DIV: (Op.FloorDiv, OptionsSerializer("FloorDivOptions"), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200809 BuiltinOperator.REDUCE_ANY: (Op.Any, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200810 BuiltinOperator.SQUARE: (Op.Square, OptionsSerializer("SquareOptions"), TFLITE_NO_INDICES),
811 BuiltinOperator.ZEROS_LIKE: (Op.ZerosLike, OptionsSerializer("ZerosLikeOptions"), TFLITE_NO_INDICES),
812 BuiltinOperator.FILL: (Op.Fill, OptionsSerializer("FillOptions"), TFLITE_NO_INDICES),
813 BuiltinOperator.FLOOR_MOD: (Op.FloorMod, OptionsSerializer("FloorModOptions"), TFLITE_NO_INDICES),
814 BuiltinOperator.RANGE: (Op.Range, OptionsSerializer("RangeOptions"), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100815 BuiltinOperator.RESIZE_NEAREST_NEIGHBOR: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200816 Op.ResizeNearestNeighbor,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200817 OptionsSerializer("ResizeNearestNeighborOptions", ("align_corners", "half_pixel_centers")),
Tim Hall885033b2022-07-21 11:46:03 +0100818 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100819 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200820 BuiltinOperator.LEAKY_RELU: (Op.LeakyRelu, OptionsSerializer("LeakyReluOptions", ("alpha",)), TFLITE_IFM_INDICES),
821 BuiltinOperator.SQUARED_DIFFERENCE: (
822 Op.SquaredDifference,
823 OptionsSerializer("SquaredDifferenceOptions"),
824 TFLITE_NO_INDICES,
825 ),
826 BuiltinOperator.MIRROR_PAD: (Op.MirrorPad, OptionsSerializer("MirrorPadOptions", ("mode",)), TFLITE_NO_INDICES),
827 BuiltinOperator.ABS: (Op.Abs, OptionsSerializer("AbsOptions"), TFLITE_IFM_INDICES),
828 BuiltinOperator.SPLIT_V: (Op.SplitV, OptionsSerializer("SplitVOptions", ("num_splits",)), TFLITE_IFM_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100829 BuiltinOperator.UNIQUE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200830 Op.Unique,
Tim Hall79d07d22020-04-27 18:20:16 +0100831 OptionsSerializer("UniqueOptions", (("idx_out_type", datatype_deserialize, datatype_serialize),)),
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.CEIL: (Op.Ceil, None, TFLITE_NO_INDICES),
835 BuiltinOperator.REVERSE_V2: (Op.ReverseV2, OptionsSerializer("ReverseV2Options"), TFLITE_NO_INDICES),
836 BuiltinOperator.ADD_N: (Op.AddN, OptionsSerializer("AddNOptions"), TFLITE_NO_INDICES),
837 BuiltinOperator.GATHER_ND: (Op.GatherNd, OptionsSerializer("GatherNdOptions"), TFLITE_NO_INDICES),
838 BuiltinOperator.COS: (Op.Cos, OptionsSerializer("CosOptions"), TFLITE_NO_INDICES),
839 BuiltinOperator.WHERE: (Op.Where, OptionsSerializer("WhereOptions"), TFLITE_NO_INDICES),
840 BuiltinOperator.RANK: (Op.Rank, OptionsSerializer("RankOptions"), TFLITE_NO_INDICES),
841 BuiltinOperator.ELU: (Op.Elu, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100842 BuiltinOperator.REVERSE_SEQUENCE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200843 Op.ReverseSequence,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200844 OptionsSerializer("ReverseSequenceOptions", ("batch_dim", "seq_dim")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200845 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100846 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200847 BuiltinOperator.MATRIX_DIAG: (Op.MatrixDiag, OptionsSerializer("MatrixDiagOptions"), TFLITE_NO_INDICES),
848 BuiltinOperator.QUANTIZE: (Op.Quantize, OptionsSerializer("QuantizeOptions"), TFLITE_IFM_INDICES),
849 BuiltinOperator.MATRIX_SET_DIAG: (Op.MatrixSetDiag, OptionsSerializer("MatrixSetDiagOptions"), TFLITE_NO_INDICES),
850 BuiltinOperator.ROUND: (Op.Round, None, TFLITE_NO_INDICES),
851 BuiltinOperator.HARD_SWISH: (Op.HardSwish, OptionsSerializer("HardSwishOptions"), TFLITE_IFM_INDICES),
852 BuiltinOperator.IF: (
853 Op.If,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200854 OptionsSerializer("IfOptions", ("else_subgraph_index", "then_subgraph_index")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200855 TFLITE_NO_INDICES,
856 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200857 BuiltinOperator.WHILE: (
858 Op.While,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200859 OptionsSerializer("WhileOptions", ("body_subgraph_index", "cond_subgraph_index")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200860 TFLITE_NO_INDICES,
Louis Verhaardaee5d752020-09-30 09:01:52 +0200861 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200862 BuiltinOperator.NON_MAX_SUPPRESSION_V4: (
863 Op.NonMaxSuppressionV4,
864 OptionsSerializer("NonMaxSuppressionV4Options"),
865 TFLITE_NO_INDICES,
866 ),
867 BuiltinOperator.NON_MAX_SUPPRESSION_V5: (
868 Op.NonMaxSuppressionV5,
869 OptionsSerializer("NonMaxSuppressionV5Options"),
870 TFLITE_NO_INDICES,
871 ),
872 BuiltinOperator.SCATTER_ND: (Op.ScatterNd, OptionsSerializer("ScatterNdOptions"), TFLITE_NO_INDICES),
873 BuiltinOperator.SELECT_V2: (Op.SelectV2, OptionsSerializer("SelectV2Options"), TFLITE_NO_INDICES),
874 BuiltinOperator.DENSIFY: (Op.Densify, OptionsSerializer("DensifyOptions"), TFLITE_NO_INDICES),
875 BuiltinOperator.SEGMENT_SUM: (Op.SegmentSum, OptionsSerializer("SegmentSumOptions"), TFLITE_NO_INDICES),
876 BuiltinOperator.BATCH_MATMUL: (
877 Op.BatchMatMul,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200878 OptionsSerializer("BatchMatMulOptions", ("adj_x", "adj_y", "asymmetric_quantize_inputs")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200879 TFLITE_NO_INDICES,
880 ),
881 BuiltinOperator.CUMSUM: (
882 Op.Cumsum,
883 OptionsSerializer("CumsumOptions", ("exclusive", "reverse")),
884 TFLITE_NO_INDICES,
885 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200886 BuiltinOperator.CALL_ONCE: (
887 Op.CallOnce,
888 OptionsSerializer("CallOnceOptions", ("init_subgraph_index",)),
889 TFLITE_NO_INDICES,
890 ),
891 BuiltinOperator.BROADCAST_TO: (Op.BroadcastTo, OptionsSerializer("BroadcastToOptions"), TFLITE_NO_INDICES),
892 BuiltinOperator.RFFT2D: (Op.Rfft2D, OptionsSerializer("Rfft2dOptions"), TFLITE_NO_INDICES),
893 BuiltinOperator.CONV_3D: (
894 Op.Conv3D,
895 OptionsSerializer(
896 "Conv3DOptions",
897 (
898 "dilation_d_factor",
899 "dilation_h_factor",
900 "dilation_w_factor",
901 fused_act,
902 padding,
903 "stride_d",
904 "stride_h",
905 "stride_w",
906 ),
907 ),
908 TFLITE_NO_INDICES,
909 ),
910 BuiltinOperator.IMAG: (Op.Imag, None, TFLITE_NO_INDICES),
911 BuiltinOperator.REAL: (Op.Real, None, TFLITE_NO_INDICES),
912 BuiltinOperator.COMPLEX_ABS: (Op.ComplexAbs, None, TFLITE_NO_INDICES),
913 BuiltinOperator.HASHTABLE: (
914 Op.Hashtable,
915 OptionsSerializer("HashtableOptions", ("key_dtype", "table_id", "value_dtype")),
916 TFLITE_NO_INDICES,
917 ),
918 BuiltinOperator.HASHTABLE_FIND: (Op.HashtableFind, OptionsSerializer("HashtableFindOptions"), TFLITE_NO_INDICES),
919 BuiltinOperator.HASHTABLE_IMPORT: (
920 Op.HashtableImport,
921 OptionsSerializer("HashtableImportOptions"),
922 TFLITE_NO_INDICES,
923 ),
924 BuiltinOperator.HASHTABLE_SIZE: (Op.HashtableSize, OptionsSerializer("HashtableSizeOptions"), TFLITE_NO_INDICES),
925 BuiltinOperator.REDUCE_ALL: (Op.ReduceAll, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
926 BuiltinOperator.CONV_3D_TRANSPOSE: (
927 Op.Conv3DTranspose,
928 OptionsSerializer(
929 "Conv3DOptions",
930 (
931 "dilation_d_factor",
932 "dilation_h_factor",
933 "dilation_w_factor",
934 fused_act,
935 padding,
936 "stride_d",
937 "stride_h",
938 "stride_w",
939 ),
940 ),
941 TFLITE_NO_INDICES,
942 ),
Rickard Bolin2de898a2021-12-20 08:35:23 +0000943 BuiltinOperator.VAR_HANDLE: (
944 Op.VarHandle,
Jonas Ohlssond8575072022-03-30 10:30:25 +0200945 OptionsSerializer(
946 "VarHandleOptions",
947 (
948 "container",
949 "shared_name",
950 ),
951 ),
Rickard Bolin2de898a2021-12-20 08:35:23 +0000952 TFLITE_NO_INDICES,
953 ),
954 BuiltinOperator.READ_VARIABLE: (Op.ReadVariable, OptionsSerializer("ReadVariableOptions"), TFLITE_NO_INDICES),
955 BuiltinOperator.ASSIGN_VARIABLE: (Op.AssignVariable, OptionsSerializer("AssignVariableOptions"), TFLITE_NO_INDICES),
956 BuiltinOperator.BROADCAST_ARGS: (Op.BroadcastArgs, None, TFLITE_NO_INDICES),
957 BuiltinOperator.RANDOM_STANDARD_NORMAL: (
958 Op.RandomStandardNormal,
Jonas Ohlssond8575072022-03-30 10:30:25 +0200959 OptionsSerializer(
960 "RandomOptions",
961 (
962 "seed",
963 "seed2",
964 ),
965 ),
Rickard Bolin2de898a2021-12-20 08:35:23 +0000966 TFLITE_NO_INDICES,
967 ),
Rickard Bolind66f8012022-04-21 07:36:55 +0000968 BuiltinOperator.BUCKETIZE: (
969 Op.Bucketize,
970 OptionsSerializer(
971 "BucketizeOptions",
972 ("boundaries", "boundaries_as_numpy", "boundaries_length", "boundaries_is_none"),
973 ),
974 TFLITE_NO_INDICES,
975 ),
976 BuiltinOperator.RANDOM_UNIFORM: (Op.RandomUniform, None, TFLITE_NO_INDICES),
977 BuiltinOperator.MULTINOMIAL: (Op.Multinomial, None, TFLITE_NO_INDICES),
978 BuiltinOperator.GELU: (Op.Gelu, OptionsSerializer("GeluOptions", ("approximate",)), TFLITE_NO_INDICES),
979 BuiltinOperator.DYNAMIC_UPDATE_SLICE: (
980 Op.DynamicUpdateSlice,
981 OptionsSerializer("DynamicUpdateSliceOptions"),
982 TFLITE_NO_INDICES,
983 ),
erik.andersson@arm.comdd49a722022-08-10 15:26:48 +0200984 BuiltinOperator.UNSORTED_SEGMENT_PROD: (
985 Op.UnsortedSegmentProd,
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200986 OptionsSerializer("UnsortedSegmentProdOptions"),
987 TFLITE_NO_INDICES,
988 ),
989 BuiltinOperator.UNSORTED_SEGMENT_MAX: (
990 Op.UnsortedSegmentMax,
991 OptionsSerializer("UnsortedSegmentMaxOptions"),
992 TFLITE_NO_INDICES,
993 ),
994 BuiltinOperator.UNSORTED_SEGMENT_MIN: (
995 Op.UnsortedSegmentMin,
996 OptionsSerializer("UnsortedSegmentMinOptions"),
997 TFLITE_NO_INDICES,
998 ),
999 BuiltinOperator.UNSORTED_SEGMENT_SUM: (
1000 Op.UnsortedSegmentSum,
1001 OptionsSerializer("UnsortedSegmentSumOptions"),
erik.andersson@arm.comdd49a722022-08-10 15:26:48 +02001002 TFLITE_NO_INDICES,
1003 ),
Tim Hallb94bcd42021-09-07 14:24:51 +01001004 BuiltinOperator.CUSTOM: (Op.Custom, CustomOptionsSerializer(), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +01001005}
1006
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +02001007builtin_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 +01001008
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +02001009builtin_operator_inv_map[Op.CustomNpuOp] = (BuiltinOperator.CUSTOM, CustomOptionsSerializer(), TFLITE_NO_INDICES)
Michael McGeagh219ec072020-11-09 11:11:26 +00001010
Michael McGeagh837dc1b2020-11-10 12:38:25 +00001011BUILTIN_OPERATOR_UNKNOWN = "UNKNOWN"
1012
Tim Halla3fe6652022-03-03 17:43:16 +00001013builtin_operator_name_map = {v: k for k, v in vars(BuiltinOperator).items()}
Michael McGeagh837dc1b2020-11-10 12:38:25 +00001014
Michael McGeagh219ec072020-11-09 11:11:26 +00001015
Tim Halla3fe6652022-03-03 17:43:16 +00001016def optype_to_builtintype(op_type: Op):
Michael McGeagh219ec072020-11-09 11:11:26 +00001017 if op_type in builtin_operator_inv_map:
Tim Halla3fe6652022-03-03 17:43:16 +00001018 return builtin_operator_name_map[builtin_operator_inv_map[op_type][0]]
Michael McGeagh219ec072020-11-09 11:11:26 +00001019 else:
Michael McGeagh837dc1b2020-11-10 12:38:25 +00001020 return BUILTIN_OPERATOR_UNKNOWN