blob: 11f74ba92b54020dcf46130a07ff5f7b4d3ebef2 [file] [log] [blame]
wilisa0182593de2022-12-22 08:00:08 +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 = {
wilisa0182593de2022-12-22 08:00:08 +0000165 TensorType.INT4: DataType.int4,
Tim Hall79d07d22020-04-27 18:20:16 +0100166 TensorType.UINT8: DataType.uint8,
167 TensorType.INT8: DataType.int8,
168 TensorType.INT16: DataType.int16,
169 TensorType.INT32: DataType.int32,
170 TensorType.INT64: DataType.int64,
171 TensorType.FLOAT16: DataType.float16,
172 TensorType.FLOAT32: DataType.float32,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200173 TensorType.FLOAT64: DataType.float64,
Tim Hall79d07d22020-04-27 18:20:16 +0100174 TensorType.STRING: DataType.string,
175 TensorType.BOOL: DataType.bool,
Jacob Bohlinf767b932020-08-13 15:32:45 +0200176 TensorType.COMPLEX64: DataType.complex64,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200177 TensorType.COMPLEX128: DataType.complex128,
Dwight Lidmanf53b3322021-10-08 11:58:08 +0200178 TensorType.UINT64: DataType.uint64,
179 TensorType.RESOURCE: DataType.resource,
180 TensorType.VARIANT: DataType.variant,
181 TensorType.UINT32: DataType.uint32,
Rickard Bolind66f8012022-04-21 07:36:55 +0000182 TensorType.UINT16: DataType.uint16,
Tim Hall79d07d22020-04-27 18:20:16 +0100183}
184
185datatype_inv_map = inverse_map(datatype_map)
186datatype_inv_map[DataType.quint8] = TensorType.UINT8
187
wilisa0182593de2022-12-22 08:00:08 +0000188datatype_inv_map[DataType.qint4] = TensorType.INT4
Tim Hall79d07d22020-04-27 18:20:16 +0100189datatype_inv_map[DataType.qint8] = TensorType.INT8
190datatype_inv_map[DataType.qint16] = TensorType.INT16
191datatype_inv_map[DataType.qint32] = TensorType.INT32
192
193
194datatype_map_numpy = {
195 TensorType.UINT8: np.uint8,
Rickard Bolind66f8012022-04-21 07:36:55 +0000196 TensorType.UINT16: np.uint16,
Dwight Lidmanf53b3322021-10-08 11:58:08 +0200197 TensorType.UINT32: np.uint32,
198 TensorType.UINT64: np.uint64,
Tim Hall79d07d22020-04-27 18:20:16 +0100199 TensorType.INT8: np.int8,
200 TensorType.INT16: np.int16,
201 TensorType.INT32: np.int32,
202 TensorType.INT64: np.int64,
203 TensorType.FLOAT16: np.float16,
204 TensorType.FLOAT32: np.float32,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200205 TensorType.FLOAT64: np.float64,
Rickard Bolin5fdcf172022-12-19 12:56:17 +0000206 TensorType.BOOL: bool,
Jacob Bohlinf767b932020-08-13 15:32:45 +0200207 TensorType.COMPLEX64: np.complex64,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200208 TensorType.COMPLEX128: np.complex128,
Louis Verhaardf4e12be2020-12-18 14:23:06 +0100209 TensorType.STRING: np.uint8,
Dwight Lidmanf53b3322021-10-08 11:58:08 +0200210 TensorType.RESOURCE: None, # experimental type
211 TensorType.VARIANT: None, # experimental type
Tim Hall79d07d22020-04-27 18:20:16 +0100212}
213
214
215builtin_options_map = {
216 BuiltinOptions.Conv2DOptions: Conv2DOptions.Conv2DOptions,
217 BuiltinOptions.DepthwiseConv2DOptions: DepthwiseConv2DOptions.DepthwiseConv2DOptions,
218 BuiltinOptions.ConcatEmbeddingsOptions: ConcatEmbeddingsOptions.ConcatEmbeddingsOptions,
219 BuiltinOptions.LSHProjectionOptions: LSHProjectionOptions.LSHProjectionOptions,
220 BuiltinOptions.Pool2DOptions: Pool2DOptions.Pool2DOptions,
221 BuiltinOptions.SVDFOptions: SVDFOptions.SVDFOptions,
222 BuiltinOptions.RNNOptions: RNNOptions.RNNOptions,
223 BuiltinOptions.FullyConnectedOptions: FullyConnectedOptions.FullyConnectedOptions,
224 BuiltinOptions.SoftmaxOptions: SoftmaxOptions.SoftmaxOptions,
225 BuiltinOptions.ConcatenationOptions: ConcatenationOptions.ConcatenationOptions,
226 BuiltinOptions.AddOptions: AddOptions.AddOptions,
227 BuiltinOptions.L2NormOptions: L2NormOptions.L2NormOptions,
228 BuiltinOptions.LocalResponseNormalizationOptions: LocalResponseNormalizationOptions.LocalResponseNormalizationOptions, # noqa: E501
229 BuiltinOptions.LSTMOptions: LSTMOptions.LSTMOptions,
230 BuiltinOptions.ResizeBilinearOptions: ResizeBilinearOptions.ResizeBilinearOptions,
231 BuiltinOptions.CallOptions: CallOptions.CallOptions,
232 BuiltinOptions.ReshapeOptions: ReshapeOptions.ReshapeOptions,
233 BuiltinOptions.SkipGramOptions: SkipGramOptions.SkipGramOptions,
234 BuiltinOptions.SpaceToDepthOptions: SpaceToDepthOptions.SpaceToDepthOptions,
235 BuiltinOptions.EmbeddingLookupSparseOptions: EmbeddingLookupSparseOptions.EmbeddingLookupSparseOptions,
236 BuiltinOptions.MulOptions: MulOptions.MulOptions,
237 BuiltinOptions.PadOptions: PadOptions.PadOptions,
238 BuiltinOptions.GatherOptions: GatherOptions.GatherOptions,
239 BuiltinOptions.BatchToSpaceNDOptions: BatchToSpaceNDOptions.BatchToSpaceNDOptions,
240 BuiltinOptions.SpaceToBatchNDOptions: SpaceToBatchNDOptions.SpaceToBatchNDOptions,
241 BuiltinOptions.TransposeOptions: TransposeOptions.TransposeOptions,
242 BuiltinOptions.ReducerOptions: ReducerOptions.ReducerOptions,
243 BuiltinOptions.SubOptions: SubOptions.SubOptions,
244 BuiltinOptions.DivOptions: DivOptions.DivOptions,
245 BuiltinOptions.SqueezeOptions: SqueezeOptions.SqueezeOptions,
246 BuiltinOptions.SequenceRNNOptions: SequenceRNNOptions.SequenceRNNOptions,
247 BuiltinOptions.StridedSliceOptions: StridedSliceOptions.StridedSliceOptions,
248 BuiltinOptions.ExpOptions: ExpOptions.ExpOptions,
249 BuiltinOptions.TopKV2Options: TopKV2Options.TopKV2Options,
250 BuiltinOptions.SplitOptions: SplitOptions.SplitOptions,
251 BuiltinOptions.LogSoftmaxOptions: LogSoftmaxOptions.LogSoftmaxOptions,
252 BuiltinOptions.CastOptions: CastOptions.CastOptions,
253 BuiltinOptions.DequantizeOptions: DequantizeOptions.DequantizeOptions,
254 BuiltinOptions.MaximumMinimumOptions: MaximumMinimumOptions.MaximumMinimumOptions,
255 BuiltinOptions.ArgMaxOptions: ArgMaxOptions.ArgMaxOptions,
256 BuiltinOptions.LessOptions: LessOptions.LessOptions,
257 BuiltinOptions.NegOptions: NegOptions.NegOptions,
258 BuiltinOptions.PadV2Options: PadV2Options.PadV2Options,
259 BuiltinOptions.GreaterOptions: GreaterOptions.GreaterOptions,
260 BuiltinOptions.GreaterEqualOptions: GreaterEqualOptions.GreaterEqualOptions,
261 BuiltinOptions.LessEqualOptions: LessEqualOptions.LessEqualOptions,
262 BuiltinOptions.SelectOptions: SelectOptions.SelectOptions,
263 BuiltinOptions.SliceOptions: SliceOptions.SliceOptions,
264 BuiltinOptions.TransposeConvOptions: TransposeConvOptions.TransposeConvOptions,
265 BuiltinOptions.SparseToDenseOptions: SparseToDenseOptions.SparseToDenseOptions,
266 BuiltinOptions.TileOptions: TileOptions.TileOptions,
267 BuiltinOptions.ExpandDimsOptions: ExpandDimsOptions.ExpandDimsOptions,
268 BuiltinOptions.EqualOptions: EqualOptions.EqualOptions,
269 BuiltinOptions.NotEqualOptions: NotEqualOptions.NotEqualOptions,
270 BuiltinOptions.ShapeOptions: ShapeOptions.ShapeOptions,
271 BuiltinOptions.PowOptions: PowOptions.PowOptions,
272 BuiltinOptions.ArgMinOptions: ArgMinOptions.ArgMinOptions,
273 BuiltinOptions.FakeQuantOptions: FakeQuantOptions.FakeQuantOptions,
274 BuiltinOptions.PackOptions: PackOptions.PackOptions,
275 BuiltinOptions.LogicalOrOptions: LogicalOrOptions.LogicalOrOptions,
276 BuiltinOptions.OneHotOptions: OneHotOptions.OneHotOptions,
277 BuiltinOptions.LogicalAndOptions: LogicalAndOptions.LogicalAndOptions,
278 BuiltinOptions.LogicalNotOptions: LogicalNotOptions.LogicalNotOptions,
279 BuiltinOptions.UnpackOptions: UnpackOptions.UnpackOptions,
280 BuiltinOptions.FloorDivOptions: FloorDivOptions.FloorDivOptions,
281 BuiltinOptions.SquareOptions: SquareOptions.SquareOptions,
282 BuiltinOptions.ZerosLikeOptions: ZerosLikeOptions.ZerosLikeOptions,
283 BuiltinOptions.FillOptions: FillOptions.FillOptions,
284 BuiltinOptions.BidirectionalSequenceLSTMOptions: BidirectionalSequenceLSTMOptions.BidirectionalSequenceLSTMOptions,
285 BuiltinOptions.BidirectionalSequenceRNNOptions: BidirectionalSequenceRNNOptions.BidirectionalSequenceRNNOptions,
286 BuiltinOptions.UnidirectionalSequenceLSTMOptions: UnidirectionalSequenceLSTMOptions.UnidirectionalSequenceLSTMOptions, # noqa: E501
287 BuiltinOptions.FloorModOptions: FloorModOptions.FloorModOptions,
288 BuiltinOptions.RangeOptions: RangeOptions.RangeOptions,
289 BuiltinOptions.ResizeNearestNeighborOptions: ResizeNearestNeighborOptions.ResizeNearestNeighborOptions,
290 BuiltinOptions.LeakyReluOptions: LeakyReluOptions.LeakyReluOptions,
291 BuiltinOptions.SquaredDifferenceOptions: SquaredDifferenceOptions.SquaredDifferenceOptions,
292 BuiltinOptions.MirrorPadOptions: MirrorPadOptions.MirrorPadOptions,
293 BuiltinOptions.AbsOptions: AbsOptions.AbsOptions,
294 BuiltinOptions.SplitVOptions: SplitVOptions.SplitVOptions,
295 BuiltinOptions.UniqueOptions: UniqueOptions.UniqueOptions,
296 BuiltinOptions.ReverseV2Options: ReverseV2Options.ReverseV2Options,
297 BuiltinOptions.AddNOptions: AddNOptions.AddNOptions,
298 BuiltinOptions.GatherNdOptions: GatherNdOptions.GatherNdOptions,
299 BuiltinOptions.CosOptions: CosOptions.CosOptions,
300 BuiltinOptions.WhereOptions: WhereOptions.WhereOptions,
301 BuiltinOptions.RankOptions: RankOptions.RankOptions,
302 BuiltinOptions.ReverseSequenceOptions: ReverseSequenceOptions.ReverseSequenceOptions,
303 BuiltinOptions.MatrixDiagOptions: MatrixDiagOptions.MatrixDiagOptions,
304 BuiltinOptions.QuantizeOptions: QuantizeOptions.QuantizeOptions,
305 BuiltinOptions.MatrixSetDiagOptions: MatrixSetDiagOptions.MatrixSetDiagOptions,
306 BuiltinOptions.DensifyOptions: DensifyOptions.DensifyOptions,
307 BuiltinOptions.DepthToSpaceOptions: DepthToSpaceOptions.DepthToSpaceOptions,
Louis Verhaard678645b2020-06-15 15:22:47 +0200308 BuiltinOptions.HardSwishOptions: HardSwishOptions.HardSwishOptions,
Tim Hall79d07d22020-04-27 18:20:16 +0100309 BuiltinOptions.IfOptions: IfOptions.IfOptions,
310 BuiltinOptions.NonMaxSuppressionV4Options: NonMaxSuppressionV4Options.NonMaxSuppressionV4Options,
311 BuiltinOptions.NonMaxSuppressionV5Options: NonMaxSuppressionV5Options.NonMaxSuppressionV5Options,
312 BuiltinOptions.ScatterNdOptions: ScatterNdOptions.ScatterNdOptions,
313 BuiltinOptions.SegmentSumOptions: SegmentSumOptions.SegmentSumOptions,
314 BuiltinOptions.SelectV2Options: SelectV2Options.SelectV2Options,
315 BuiltinOptions.WhileOptions: WhileOptions.WhileOptions,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200316 BuiltinOptions.BatchMatMulOptions: BatchMatMulOptions.BatchMatMulOptions,
Tim Hall42abec12021-02-04 21:31:57 +0000317 BuiltinOptions.CumsumOptions: CumsumOptions.CumsumOptions,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200318 BuiltinOptions.CallOnceOptions: CallOnceOptions.CallOnceOptions,
319 BuiltinOptions.BroadcastToOptions: BroadcastToOptions.BroadcastToOptions,
320 BuiltinOptions.Rfft2dOptions: Rfft2dOptions.Rfft2dOptions,
321 BuiltinOptions.Conv3DOptions: Conv3DOptions.Conv3DOptions,
322 BuiltinOptions.HashtableOptions: HashtableOptions.HashtableOptions,
323 BuiltinOptions.HashtableFindOptions: HashtableFindOptions.HashtableFindOptions,
324 BuiltinOptions.HashtableImportOptions: HashtableImportOptions.HashtableImportOptions,
325 BuiltinOptions.HashtableSizeOptions: HashtableSizeOptions.HashtableSizeOptions,
Rickard Bolin2de898a2021-12-20 08:35:23 +0000326 BuiltinOptions.VarHandleOptions: VarHandleOptions.VarHandleOptions,
327 BuiltinOptions.ReadVariableOptions: ReadVariableOptions.ReadVariableOptions,
328 BuiltinOptions.AssignVariableOptions: AssignVariableOptions.AssignVariableOptions,
329 BuiltinOptions.RandomOptions: RandomOptions.RandomOptions,
Rickard Bolind66f8012022-04-21 07:36:55 +0000330 BuiltinOptions.BucketizeOptions: BucketizeOptions.BucketizeOptions,
331 BuiltinOptions.DynamicUpdateSliceOptions: DynamicUpdateSliceOptions.DynamicUpdateSliceOptions,
332 BuiltinOptions.GeluOptions: GeluOptions.GeluOptions,
erik.andersson@arm.comdd49a722022-08-10 15:26:48 +0200333 BuiltinOptions.UnsortedSegmentProdOptions: UnsortedSegmentProdOptions.UnsortedSegmentProdOptions,
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200334 BuiltinOptions.UnsortedSegmentMaxOptions: UnsortedSegmentMaxOptions.UnsortedSegmentMaxOptions,
335 BuiltinOptions.UnsortedSegmentMinOptions: UnsortedSegmentMinOptions.UnsortedSegmentMinOptions,
336 BuiltinOptions.UnsortedSegmentSumOptions: UnsortedSegmentSumOptions.UnsortedSegmentSumOptions,
337 BuiltinOptions.ATan2Options: ATan2Options.ATan2Options,
338 BuiltinOptions.SignOptions: SignOptions.SignOptions,
Tim Hall79d07d22020-04-27 18:20:16 +0100339}
340
Rickard Bolin2de898a2021-12-20 08:35:23 +0000341
Tim Hall79d07d22020-04-27 18:20:16 +0100342builtin_options_inv_map = inverse_map(builtin_options_map)
343
344
345def underscore_to_camel_case(s):
346 return "".join(x.title() for x in s.split("_"))
347
348
349def padding_deserialize(x):
350 return padding_map[x]
351
352
353def padding_serialize(builder, x):
354 return padding_inv_map[x]
355
356
357def activation_deserialize(x):
358 return activation_function_map[x]
359
360
361def activation_serialize(builder, x):
362 return activation_function_inv_map[x]
363
364
365def datatype_deserialize(x):
366 return datatype_map[x]
367
368
369def datatype_serialize(builder, x):
370 return datatype_inv_map[x]
371
372
373def identity(x):
374 return x
375
376
377def identity_serialize(builder, x):
378 return x
379
380
381def write_byte_vector(builder, v):
382 builder.StartVector(1, len(v), 1)
383 for e in v[::-1]:
384 builder.PrependByte(e)
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200385 return builder.EndVector()
Tim Hall79d07d22020-04-27 18:20:16 +0100386
387
388def write_int_vector(builder, v):
389 builder.StartVector(4, len(v), 4)
390 for e in v[::-1]:
391 builder.PrependInt32(e)
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200392 return builder.EndVector()
Tim Hall79d07d22020-04-27 18:20:16 +0100393
394
395class OptionsSerializer:
Michael McGeagh6f725262020-12-03 15:21:36 +0000396 def __init__(self, name, members=None):
Tim Hall79d07d22020-04-27 18:20:16 +0100397 self.name = name
398 self.module = globals()[self.name]
399 self.cls = getattr(self.module, self.name)
400 self.builtin_opt_type = builtin_options_inv_map[self.cls]
Tim Hall79d07d22020-04-27 18:20:16 +0100401 self.members = []
Michael McGeagh6f725262020-12-03 15:21:36 +0000402 if members is not None:
403 for mem in members:
404 deserialize = identity
405 serialize = identity_serialize
406 is_vector = False
407 if isinstance(mem, tuple):
408 if len(mem) == 3:
409 mem, deserialize, serialize = mem
410 elif len(mem) == 2:
411 mem, is_vector = mem
412 deserialize = tuple
413 serialize = write_int_vector
414 else:
415 assert 0
416 underscore_mem = mem
417 camelcase_mem = underscore_to_camel_case(mem)
418 self.members.append((underscore_mem, camelcase_mem, deserialize, serialize, is_vector))
Tim Hall79d07d22020-04-27 18:20:16 +0100419
Tim Hallc8310b12020-06-17 14:53:11 +0100420 def deserialize(self, op_data):
421 builtin_options = op_data.BuiltinOptions()
Tim Hall79d07d22020-04-27 18:20:16 +0100422 attrs = {}
Tim Hallc8310b12020-06-17 14:53:11 +0100423 if builtin_options:
Tim Hall79d07d22020-04-27 18:20:16 +0100424 tfattrs = self.cls()
Tim Hallc8310b12020-06-17 14:53:11 +0100425 tfattrs.Init(builtin_options.Bytes, builtin_options.Pos)
Tim Hall79d07d22020-04-27 18:20:16 +0100426 for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members:
427 fun = camelcase_mem
428 if is_vector:
429 fun += "AsNumpy"
430
Fredrik Svedberg4bb989b2020-11-16 15:32:25 +0100431 attr = getattr(tfattrs, fun)()
432 try:
433 attrs[underscore_mem] = deserialize(attr)
434 except TypeError:
435 print("Warning: {0} could not read attribute '{1}'.".format(self.name, underscore_mem))
436
Tim Hall79d07d22020-04-27 18:20:16 +0100437 return attrs
438
439 def serialize(self, builder, attrs):
440 ser_attrs = []
441 for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members:
442 a = serialize(builder, attrs[underscore_mem])
443 ser_attrs.append((camelcase_mem, a))
444
445 getattr(self.module, self.name + "Start")(builder)
446
447 for camelcase_mem, a in ser_attrs:
448 getattr(self.module, self.name + "Add" + camelcase_mem)(builder, a)
449
450 return getattr(self.module, self.name + "End")(builder), None
451
452
453class CustomOptionsSerializer:
Tim Hallc8310b12020-06-17 14:53:11 +0100454 CUSTOM_OPTIONS_NPU_OP = [0x01, 0x04, 0x01] # NpuOp=1, FlexbufferFormat.UINT8=4, byte length=1
455 CUSTOM_OPTIONS_FORMAT_DEFAULT = 0
456
Tim Hall79d07d22020-04-27 18:20:16 +0100457 def __init__(self):
Tim Hall79d07d22020-04-27 18:20:16 +0100458 self.custom_opt_format = 0
459
Tim Hallc8310b12020-06-17 14:53:11 +0100460 def deserialize(self, op_data):
Tim Hall79d07d22020-04-27 18:20:16 +0100461 attrs = {}
Tim Hallc8310b12020-06-17 14:53:11 +0100462 custom_options = op_data.CustomOptionsAsNumpy()
463 attrs["custom_options"] = custom_options
464 attrs["custom_options_format"] = op_data.CustomOptionsFormat()
465
466 if np.array_equal(custom_options, self.CUSTOM_OPTIONS_NPU_OP):
Louis Verhaardaee5d752020-09-30 09:01:52 +0200467 attrs["custom_type"] = CustomType.ExistingNpuOp
Tim Hallc8310b12020-06-17 14:53:11 +0100468
Tim Hall79d07d22020-04-27 18:20:16 +0100469 return attrs
470
471 def serialize(self, builder, attrs):
Louis Verhaardaee5d752020-09-30 09:01:52 +0200472 custom_type = attrs.get("custom_type", CustomType.ThirdPartyOp)
Tim Hallc8310b12020-06-17 14:53:11 +0100473 self.custom_opt_format = attrs.get("custom_options_format", self.CUSTOM_OPTIONS_FORMAT_DEFAULT)
Tim Hall79d07d22020-04-27 18:20:16 +0100474
475 # Set NPU op custom options for the TensorFlow Lite custom operator
Louis Verhaardaee5d752020-09-30 09:01:52 +0200476 if custom_type == CustomType.NpuOp:
Tim Hallc8310b12020-06-17 14:53:11 +0100477 custom_options = self.CUSTOM_OPTIONS_NPU_OP
478 else:
479 custom_options = attrs.get("custom_options", [])
Tim Hall79d07d22020-04-27 18:20:16 +0100480
Tim Hallc8310b12020-06-17 14:53:11 +0100481 custom_options_bytes = struct.pack("<{0}B".format(len(custom_options)), *custom_options)
482 custom_offset = write_byte_vector(builder, custom_options_bytes)
Tim Hall79d07d22020-04-27 18:20:16 +0100483
484 return None, custom_offset
485
486
487padding_map = {
Michael McGeagh16895482020-12-14 15:51:20 +0000488 Padding.SAME: opPad.SAME,
489 Padding.VALID: opPad.VALID,
Tim Hall79d07d22020-04-27 18:20:16 +0100490}
491
492padding_inv_map = inverse_map(padding_map)
493
494
495activation_function_map = {
496 ActivationFunctionType.NONE: None,
Louis Verhaardaee5d752020-09-30 09:01:52 +0200497 ActivationFunctionType.RELU: Op.Relu,
498 ActivationFunctionType.RELU_N1_TO_1: Op.ReluN1To1,
499 ActivationFunctionType.RELU6: Op.Relu6,
500 ActivationFunctionType.TANH: Op.Tanh,
501 ActivationFunctionType.SIGN_BIT: Op.SignBit,
Tim Hall79d07d22020-04-27 18:20:16 +0100502}
503
504activation_function_inv_map = inverse_map(activation_function_map)
505
506fused_act = ("fused_activation_function", activation_deserialize, activation_serialize)
507padding = ("padding", padding_deserialize, padding_serialize)
508
Tim Hall79d07d22020-04-27 18:20:16 +0100509is_int_vec = True
510
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200511TFLITE_NO_INDICES = TensorIndices([], [], [])
512TFLITE_IFM_INDICES = TensorIndices([0], [], [])
513TFLITE_IFM_WEIGHTS_INDICES = TensorIndices([0], [1], [])
514TFLITE_IFM_WEIGHTS_BIAS_INDICES = TensorIndices([0], [1], [2])
515TFLITE_IFM_IFM2_INDICES = TensorIndices([0, 1], [], [])
516TFLITE_CONV2D_BACKPROP_INDICES = TensorIndices([2], [1], [3])
517TFLITE_TRANSPOSE_CONV_INDICES = TensorIndices([0], [1], [3])
518TFLITE_CONCAT_INDICES = TensorIndices([1, 2], [], [])
519TFLITE_SPLIT_IFM_INDICES = TensorIndices([1], [], [])
520TFLITE_BLOCK_LSTM_INDICES = TensorIndices([3], [4], [])
521
Tim Hall79d07d22020-04-27 18:20:16 +0100522builtin_operator_map = {
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200523 BuiltinOperator.ADD: (
524 Op.Add,
525 OptionsSerializer("AddOptions", (fused_act, "pot_scale_int16")),
526 TFLITE_IFM_IFM2_INDICES,
527 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200528 BuiltinOperator.AVERAGE_POOL_2D: (
529 Op.AvgPool,
530 OptionsSerializer(
531 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
532 ),
533 TFLITE_IFM_INDICES,
534 ),
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200535 BuiltinOperator.ATAN2: (Op.Atan2, OptionsSerializer("ATan2Options", ()), TFLITE_IFM_IFM2_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200536 BuiltinOperator.CONCATENATION: (
537 Op.ConcatTFLite,
538 OptionsSerializer("ConcatenationOptions", ("axis", fused_act)),
539 TFLITE_CONCAT_INDICES,
540 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200541 BuiltinOperator.CONV_2D: (
542 Op.Conv2DBias,
543 OptionsSerializer(
544 "Conv2DOptions", ("dilation_h_factor", "dilation_w_factor", fused_act, padding, "stride_h", "stride_w")
545 ),
546 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
547 ),
548 BuiltinOperator.DEPTHWISE_CONV_2D: (
549 Op.DepthwiseConv2DBias,
550 OptionsSerializer(
551 "DepthwiseConv2DOptions",
552 ("depth_multiplier", "dilation_h_factor", "dilation_w_factor", fused_act, padding, "stride_h", "stride_w"),
553 ),
554 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
555 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200556 BuiltinOperator.DEPTH_TO_SPACE: (
557 Op.DepthToSpace,
558 OptionsSerializer("DepthToSpaceOptions", ("block_size",)),
559 TFLITE_NO_INDICES,
560 ),
561 BuiltinOperator.DEQUANTIZE: (Op.Dequantize, OptionsSerializer("DequantizeOptions"), TFLITE_IFM_INDICES),
562 BuiltinOperator.EMBEDDING_LOOKUP: (Op.EmbeddingLookup, None, TFLITE_NO_INDICES),
563 BuiltinOperator.FLOOR: (Op.Floor, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100564 BuiltinOperator.FULLY_CONNECTED: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200565 Op.FullyConnected,
erik.andersson@arm.com0cbb1662021-02-22 15:47:07 +0100566 OptionsSerializer(
Dwight Lidman8a12da12021-07-19 13:43:05 +0200567 "FullyConnectedOptions", ("asymmetric_quantize_inputs", fused_act, "keep_num_dims", "weights_format")
erik.andersson@arm.com0cbb1662021-02-22 15:47:07 +0100568 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200569 TFLITE_IFM_WEIGHTS_BIAS_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100570 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200571 BuiltinOperator.HASHTABLE_LOOKUP: (Op.HashtableLookup, None, TFLITE_NO_INDICES),
572 BuiltinOperator.L2_NORMALIZATION: (Op.L2Norm, OptionsSerializer("L2NormOptions", (fused_act,)), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200573 BuiltinOperator.L2_POOL_2D: (
574 Op.L2Pool2D,
575 OptionsSerializer(
576 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
577 ),
578 TFLITE_NO_INDICES,
579 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100580 BuiltinOperator.LOCAL_RESPONSE_NORMALIZATION: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200581 Op.LRN,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200582 OptionsSerializer("LocalResponseNormalizationOptions", ("alpha", "beta", "bias", "radius")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200583 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100584 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200585 BuiltinOperator.LOGISTIC: (Op.Sigmoid, None, TFLITE_IFM_INDICES),
586 BuiltinOperator.LSH_PROJECTION: (
587 Op.LSHProjection,
588 OptionsSerializer("LSHProjectionOptions", ("type",)),
589 TFLITE_NO_INDICES,
590 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200591 BuiltinOperator.LSTM: (
592 Op.Lstm,
593 OptionsSerializer(
594 "LSTMOptions", ("asymmetric_quantize_inputs", "cell_clip", fused_act, "kernel_type", "proj_clip")
595 ),
596 TFLITE_IFM_WEIGHTS_INDICES,
597 ),
598 BuiltinOperator.MAX_POOL_2D: (
599 Op.MaxPool,
600 OptionsSerializer(
601 "Pool2DOptions", ("filter_height", "filter_width", fused_act, padding, "stride_h", "stride_w")
602 ),
603 TFLITE_IFM_INDICES,
604 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200605 BuiltinOperator.MUL: (Op.Mul, OptionsSerializer("MulOptions", (fused_act,)), TFLITE_IFM_IFM2_INDICES),
606 BuiltinOperator.RELU: (Op.Relu, None, TFLITE_IFM_INDICES),
erik.andersson@arm.comdd49a722022-08-10 15:26:48 +0200607 BuiltinOperator.RELU_0_TO_1: (Op.Relu0To1, None, TFLITE_IFM_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200608 BuiltinOperator.RELU_N1_TO_1: (Op.ReluN1To1, None, TFLITE_IFM_INDICES),
609 BuiltinOperator.RELU6: (Op.Relu6, None, TFLITE_IFM_INDICES),
610 BuiltinOperator.RESHAPE: (
611 Op.Reshape,
Dwight Lidmancfb42622021-08-11 12:28:51 +0200612 OptionsSerializer("ReshapeOptions", (("new_shape", is_int_vec),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200613 TFLITE_IFM_INDICES,
614 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100615 BuiltinOperator.RESIZE_BILINEAR: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200616 Op.ResizeBilinear,
Tim Hall79d07d22020-04-27 18:20:16 +0100617 OptionsSerializer("ResizeBilinearOptions", ("align_corners", "half_pixel_centers")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200618 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100619 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200620 BuiltinOperator.RNN: (
621 Op.Rnn,
622 OptionsSerializer("RNNOptions", ("asymmetric_quantize_inputs", fused_act)),
623 TFLITE_IFM_WEIGHTS_INDICES,
624 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200625 BuiltinOperator.SOFTMAX: (Op.Softmax, OptionsSerializer("SoftmaxOptions", ("beta",)), TFLITE_IFM_INDICES),
626 BuiltinOperator.SPACE_TO_DEPTH: (
627 Op.SpaceToDepth,
628 OptionsSerializer("SpaceToDepthOptions", ("block_size",)),
629 TFLITE_NO_INDICES,
630 ),
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200631 BuiltinOperator.SVDF: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200632 Op.Svdf,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200633 OptionsSerializer("SVDFOptions", ("asymmetric_quantize_inputs", fused_act, "rank")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200634 TFLITE_NO_INDICES,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200635 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200636 BuiltinOperator.TANH: (Op.Tanh, None, TFLITE_IFM_INDICES),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200637 BuiltinOperator.CONCAT_EMBEDDINGS: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200638 Op.ConcatEmbeddings,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200639 OptionsSerializer(
640 "ConcatEmbeddingsOptions",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200641 (
Dwight Lidman8a12da12021-07-19 13:43:05 +0200642 "embedding_dim_per_channel",
643 "embedding_dim_per_channel_as_numpy",
644 "embedding_dim_per_channel_is_none",
645 "embedding_dim_per_channel_length",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200646 "num_channels",
647 "num_columns_per_channel",
648 "num_columns_per_channel_as_numpy",
Dwight Lidman8a12da12021-07-19 13:43:05 +0200649 "num_columns_per_channel_is_none",
650 "num_columns_per_channel_length",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200651 ),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200652 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200653 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200654 ),
655 BuiltinOperator.SKIP_GRAM: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200656 Op.SkipGram,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200657 OptionsSerializer("SkipGramOptions", ("include_all_ngrams", "max_skip_size", "ngram_size")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200658 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200659 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200660 BuiltinOperator.CALL: (Op.Call, OptionsSerializer("CallOptions", ("subgraph",)), TFLITE_NO_INDICES),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200661 BuiltinOperator.EMBEDDING_LOOKUP_SPARSE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200662 Op.EmbeddingLookupSparse,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200663 OptionsSerializer("EmbeddingLookupSparseOptions", ("combiner",)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200664 TFLITE_NO_INDICES,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200665 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200666 BuiltinOperator.PAD: (Op.Pad, OptionsSerializer("PadOptions"), TFLITE_IFM_INDICES),
667 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_RNN: (
668 Op.UnidirectionalSequenceRnn,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200669 OptionsSerializer("SequenceRNNOptions", ("asymmetric_quantize_inputs", fused_act, "time_major")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200670 TFLITE_IFM_WEIGHTS_INDICES,
671 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200672 BuiltinOperator.GATHER: (
673 Op.GatherV2,
674 OptionsSerializer("GatherOptions", ("axis", "batch_dims")),
675 TFLITE_NO_INDICES,
676 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200677 BuiltinOperator.BATCH_TO_SPACE_ND: (
678 Op.BatchToSpaceND,
679 OptionsSerializer("BatchToSpaceNDOptions"),
680 TFLITE_NO_INDICES,
681 ),
682 BuiltinOperator.SPACE_TO_BATCH_ND: (
683 Op.SpaceToBatchND,
684 OptionsSerializer("SpaceToBatchNDOptions"),
685 TFLITE_NO_INDICES,
686 ),
James Ward6bf16132021-09-08 11:14:20 +0100687 BuiltinOperator.TRANSPOSE: (Op.Transpose, OptionsSerializer("TransposeOptions"), TFLITE_IFM_IFM2_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200688 BuiltinOperator.MEAN: (Op.Mean, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_IFM_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200689 BuiltinOperator.SUB: (
690 Op.Sub,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200691 OptionsSerializer("SubOptions", (fused_act, "pot_scale_int16")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200692 TFLITE_IFM_IFM2_INDICES,
693 ),
694 BuiltinOperator.DIV: (Op.Div, OptionsSerializer("DivOptions", (fused_act,)), TFLITE_NO_INDICES),
695 BuiltinOperator.SQUEEZE: (
696 Op.Squeeze,
Jonas Ohlssond8575072022-03-30 10:30:25 +0200697 OptionsSerializer(
698 "SqueezeOptions",
699 (("squeeze_dims", is_int_vec),),
700 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200701 TFLITE_IFM_INDICES,
702 ),
703 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_LSTM: (
704 Op.UnidirectionalSequenceLstm,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200705 OptionsSerializer(
706 "UnidirectionalSequenceLSTMOptions",
707 ("asymmetric_quantize_inputs", "cell_clip", fused_act, "proj_clip", "time_major"),
708 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200709 TFLITE_IFM_WEIGHTS_INDICES,
710 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100711 BuiltinOperator.STRIDED_SLICE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200712 Op.StridedSlice,
Tim Hall79d07d22020-04-27 18:20:16 +0100713 OptionsSerializer(
Dwight Lidman8a12da12021-07-19 13:43:05 +0200714 "StridedSliceOptions", ("begin_mask", "ellipsis_mask", "end_mask", "new_axis_mask", "shrink_axis_mask")
Tim Hall79d07d22020-04-27 18:20:16 +0100715 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200716 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100717 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200718 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_RNN: (
719 Op.BidirectionalSequenceRnn,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200720 OptionsSerializer(
721 "BidirectionalSequenceRNNOptions", ("asymmetric_quantize_inputs", fused_act, "merge_outputs", "time_major")
722 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200723 TFLITE_IFM_WEIGHTS_INDICES,
724 ),
James Ward6bf16132021-09-08 11:14:20 +0100725 BuiltinOperator.EXP: (Op.Exp, OptionsSerializer("ExpOptions"), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200726 BuiltinOperator.TOPK_V2: (Op.TopKV2, OptionsSerializer("TopKV2Options"), TFLITE_NO_INDICES),
727 BuiltinOperator.SPLIT: (Op.Split, OptionsSerializer("SplitOptions", ("num_splits",)), TFLITE_SPLIT_IFM_INDICES),
728 BuiltinOperator.LOG_SOFTMAX: (Op.LogSoftmax, OptionsSerializer("LogSoftmaxOptions"), TFLITE_NO_INDICES),
729 BuiltinOperator.DELEGATE: (Op.Delegate, None, TFLITE_NO_INDICES),
730 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_LSTM: (
731 Op.BidirectionalSequenceLstm,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200732 OptionsSerializer(
733 "BidirectionalSequenceLSTMOptions",
734 ("asymmetric_quantize_inputs", "cell_clip", fused_act, "merge_outputs", "proj_clip", "time_major"),
735 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200736 TFLITE_IFM_WEIGHTS_INDICES,
737 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100738 BuiltinOperator.CAST: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200739 Op.Cast,
Tim Hall79d07d22020-04-27 18:20:16 +0100740 OptionsSerializer(
741 "CastOptions",
742 (
743 ("in_data_type", datatype_deserialize, datatype_serialize),
744 ("out_data_type", datatype_deserialize, datatype_serialize),
745 ),
746 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200747 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100748 ),
Fredrik Svedberg8ddd4892022-08-19 16:06:04 +0200749 BuiltinOperator.PRELU: (Op.Prelu, None, TFLITE_IFM_IFM2_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200750 BuiltinOperator.MAXIMUM: (Op.Maximum, OptionsSerializer("MaximumMinimumOptions"), TFLITE_IFM_IFM2_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100751 BuiltinOperator.ARG_MAX: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200752 Op.ArgMax,
Tim Hall79d07d22020-04-27 18:20:16 +0100753 OptionsSerializer("ArgMaxOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200754 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100755 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200756 BuiltinOperator.MINIMUM: (Op.Minimum, OptionsSerializer("MaximumMinimumOptions"), TFLITE_IFM_IFM2_INDICES),
757 BuiltinOperator.LESS: (Op.Less, OptionsSerializer("LessOptions"), TFLITE_NO_INDICES),
758 BuiltinOperator.NEG: (Op.Neg, OptionsSerializer("NegOptions"), TFLITE_NO_INDICES),
759 BuiltinOperator.PADV2: (Op.PadV2, OptionsSerializer("PadV2Options"), TFLITE_NO_INDICES),
760 BuiltinOperator.GREATER: (Op.Greater, OptionsSerializer("GreaterOptions"), TFLITE_NO_INDICES),
761 BuiltinOperator.GREATER_EQUAL: (Op.GreaterEqual, OptionsSerializer("GreaterEqualOptions"), TFLITE_NO_INDICES),
762 BuiltinOperator.LESS_EQUAL: (Op.LessEqual, OptionsSerializer("LessEqualOptions"), TFLITE_NO_INDICES),
763 BuiltinOperator.SELECT: (Op.Select, OptionsSerializer("SelectOptions"), TFLITE_NO_INDICES),
764 BuiltinOperator.SLICE: (Op.Slice, OptionsSerializer("SliceOptions"), TFLITE_IFM_INDICES),
765 BuiltinOperator.SIN: (Op.Sin, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100766 BuiltinOperator.TRANSPOSE_CONV: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200767 Op.Conv2DBackpropInput,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200768 OptionsSerializer("TransposeConvOptions", (padding, "stride_h", "stride_w")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200769 TFLITE_CONV2D_BACKPROP_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100770 ),
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200771 BuiltinOperator.SIGN: (Op.Sign, OptionsSerializer("SignOptions"), TFLITE_IFM_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100772 BuiltinOperator.SPARSE_TO_DENSE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200773 Op.SparseToDense,
Tim Hall79d07d22020-04-27 18:20:16 +0100774 OptionsSerializer("SparseToDenseOptions", ("validate_indices",)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200775 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100776 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200777 BuiltinOperator.TILE: (Op.Tile, OptionsSerializer("TileOptions"), TFLITE_NO_INDICES),
778 BuiltinOperator.EXPAND_DIMS: (Op.ExpandDims, OptionsSerializer("ExpandDimsOptions"), TFLITE_IFM_INDICES),
779 BuiltinOperator.EQUAL: (Op.Equal, OptionsSerializer("EqualOptions"), TFLITE_NO_INDICES),
780 BuiltinOperator.NOT_EQUAL: (Op.NotEqual, OptionsSerializer("NotEqualOptions"), TFLITE_NO_INDICES),
781 BuiltinOperator.LOG: (Op.Log, None, TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200782 BuiltinOperator.SUM: (Op.Sum, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200783 BuiltinOperator.SQRT: (Op.Sqrt, None, TFLITE_NO_INDICES),
784 BuiltinOperator.RSQRT: (Op.Rsqrt, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100785 BuiltinOperator.SHAPE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200786 Op.Shape,
Tim Hall79d07d22020-04-27 18:20:16 +0100787 OptionsSerializer("ShapeOptions", (("out_type", datatype_deserialize, datatype_serialize),)),
Ayaan Masood4965fae2022-06-29 11:30:57 +0100788 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100789 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200790 BuiltinOperator.POW: (Op.Pow, OptionsSerializer("PowOptions"), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100791 BuiltinOperator.ARG_MIN: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200792 Op.ArgMin,
Tim Hall79d07d22020-04-27 18:20:16 +0100793 OptionsSerializer("ArgMinOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200794 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100795 ),
796 BuiltinOperator.FAKE_QUANT: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200797 Op.FakeQuantWithMinMaxArgs,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200798 OptionsSerializer("FakeQuantOptions", ("max", "min", "narrow_range", "num_bits")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200799 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100800 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200801 BuiltinOperator.REDUCE_PROD: (Op.Prod, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
802 BuiltinOperator.REDUCE_MAX: (Op.Max, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
803 BuiltinOperator.PACK: (Op.Pack, OptionsSerializer("PackOptions", ("axis", "values_count")), TFLITE_IFM_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200804 BuiltinOperator.LOGICAL_OR: (Op.LogicalOr, OptionsSerializer("LogicalOrOptions"), TFLITE_NO_INDICES),
805 BuiltinOperator.ONE_HOT: (Op.OneHot, OptionsSerializer("OneHotOptions", ("axis",)), TFLITE_NO_INDICES),
806 BuiltinOperator.LOGICAL_AND: (Op.LogicalAnd, OptionsSerializer("LogicalAndOptions"), TFLITE_NO_INDICES),
807 BuiltinOperator.LOGICAL_NOT: (Op.LogicalNot, OptionsSerializer("LogicalNotOptions"), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200808 BuiltinOperator.UNPACK: (Op.Unpack, OptionsSerializer("UnpackOptions", ("axis", "num")), TFLITE_IFM_INDICES),
809 BuiltinOperator.REDUCE_MIN: (Op.Min, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200810 BuiltinOperator.FLOOR_DIV: (Op.FloorDiv, OptionsSerializer("FloorDivOptions"), TFLITE_NO_INDICES),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200811 BuiltinOperator.REDUCE_ANY: (Op.Any, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200812 BuiltinOperator.SQUARE: (Op.Square, OptionsSerializer("SquareOptions"), TFLITE_NO_INDICES),
813 BuiltinOperator.ZEROS_LIKE: (Op.ZerosLike, OptionsSerializer("ZerosLikeOptions"), TFLITE_NO_INDICES),
814 BuiltinOperator.FILL: (Op.Fill, OptionsSerializer("FillOptions"), TFLITE_NO_INDICES),
815 BuiltinOperator.FLOOR_MOD: (Op.FloorMod, OptionsSerializer("FloorModOptions"), TFLITE_NO_INDICES),
816 BuiltinOperator.RANGE: (Op.Range, OptionsSerializer("RangeOptions"), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100817 BuiltinOperator.RESIZE_NEAREST_NEIGHBOR: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200818 Op.ResizeNearestNeighbor,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200819 OptionsSerializer("ResizeNearestNeighborOptions", ("align_corners", "half_pixel_centers")),
Tim Hall885033b2022-07-21 11:46:03 +0100820 TFLITE_IFM_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100821 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200822 BuiltinOperator.LEAKY_RELU: (Op.LeakyRelu, OptionsSerializer("LeakyReluOptions", ("alpha",)), TFLITE_IFM_INDICES),
823 BuiltinOperator.SQUARED_DIFFERENCE: (
824 Op.SquaredDifference,
825 OptionsSerializer("SquaredDifferenceOptions"),
826 TFLITE_NO_INDICES,
827 ),
828 BuiltinOperator.MIRROR_PAD: (Op.MirrorPad, OptionsSerializer("MirrorPadOptions", ("mode",)), TFLITE_NO_INDICES),
829 BuiltinOperator.ABS: (Op.Abs, OptionsSerializer("AbsOptions"), TFLITE_IFM_INDICES),
830 BuiltinOperator.SPLIT_V: (Op.SplitV, OptionsSerializer("SplitVOptions", ("num_splits",)), TFLITE_IFM_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100831 BuiltinOperator.UNIQUE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200832 Op.Unique,
Tim Hall79d07d22020-04-27 18:20:16 +0100833 OptionsSerializer("UniqueOptions", (("idx_out_type", datatype_deserialize, datatype_serialize),)),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200834 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100835 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200836 BuiltinOperator.CEIL: (Op.Ceil, None, TFLITE_NO_INDICES),
837 BuiltinOperator.REVERSE_V2: (Op.ReverseV2, OptionsSerializer("ReverseV2Options"), TFLITE_NO_INDICES),
838 BuiltinOperator.ADD_N: (Op.AddN, OptionsSerializer("AddNOptions"), TFLITE_NO_INDICES),
839 BuiltinOperator.GATHER_ND: (Op.GatherNd, OptionsSerializer("GatherNdOptions"), TFLITE_NO_INDICES),
840 BuiltinOperator.COS: (Op.Cos, OptionsSerializer("CosOptions"), TFLITE_NO_INDICES),
841 BuiltinOperator.WHERE: (Op.Where, OptionsSerializer("WhereOptions"), TFLITE_NO_INDICES),
842 BuiltinOperator.RANK: (Op.Rank, OptionsSerializer("RankOptions"), TFLITE_NO_INDICES),
843 BuiltinOperator.ELU: (Op.Elu, None, TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +0100844 BuiltinOperator.REVERSE_SEQUENCE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200845 Op.ReverseSequence,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200846 OptionsSerializer("ReverseSequenceOptions", ("batch_dim", "seq_dim")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200847 TFLITE_NO_INDICES,
Tim Hall79d07d22020-04-27 18:20:16 +0100848 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200849 BuiltinOperator.MATRIX_DIAG: (Op.MatrixDiag, OptionsSerializer("MatrixDiagOptions"), TFLITE_NO_INDICES),
850 BuiltinOperator.QUANTIZE: (Op.Quantize, OptionsSerializer("QuantizeOptions"), TFLITE_IFM_INDICES),
851 BuiltinOperator.MATRIX_SET_DIAG: (Op.MatrixSetDiag, OptionsSerializer("MatrixSetDiagOptions"), TFLITE_NO_INDICES),
852 BuiltinOperator.ROUND: (Op.Round, None, TFLITE_NO_INDICES),
853 BuiltinOperator.HARD_SWISH: (Op.HardSwish, OptionsSerializer("HardSwishOptions"), TFLITE_IFM_INDICES),
854 BuiltinOperator.IF: (
855 Op.If,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200856 OptionsSerializer("IfOptions", ("else_subgraph_index", "then_subgraph_index")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200857 TFLITE_NO_INDICES,
858 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200859 BuiltinOperator.WHILE: (
860 Op.While,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200861 OptionsSerializer("WhileOptions", ("body_subgraph_index", "cond_subgraph_index")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200862 TFLITE_NO_INDICES,
Louis Verhaardaee5d752020-09-30 09:01:52 +0200863 ),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200864 BuiltinOperator.NON_MAX_SUPPRESSION_V4: (
865 Op.NonMaxSuppressionV4,
866 OptionsSerializer("NonMaxSuppressionV4Options"),
867 TFLITE_NO_INDICES,
868 ),
869 BuiltinOperator.NON_MAX_SUPPRESSION_V5: (
870 Op.NonMaxSuppressionV5,
871 OptionsSerializer("NonMaxSuppressionV5Options"),
872 TFLITE_NO_INDICES,
873 ),
874 BuiltinOperator.SCATTER_ND: (Op.ScatterNd, OptionsSerializer("ScatterNdOptions"), TFLITE_NO_INDICES),
875 BuiltinOperator.SELECT_V2: (Op.SelectV2, OptionsSerializer("SelectV2Options"), TFLITE_NO_INDICES),
876 BuiltinOperator.DENSIFY: (Op.Densify, OptionsSerializer("DensifyOptions"), TFLITE_NO_INDICES),
877 BuiltinOperator.SEGMENT_SUM: (Op.SegmentSum, OptionsSerializer("SegmentSumOptions"), TFLITE_NO_INDICES),
878 BuiltinOperator.BATCH_MATMUL: (
879 Op.BatchMatMul,
Dwight Lidman8a12da12021-07-19 13:43:05 +0200880 OptionsSerializer("BatchMatMulOptions", ("adj_x", "adj_y", "asymmetric_quantize_inputs")),
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +0200881 TFLITE_NO_INDICES,
882 ),
883 BuiltinOperator.CUMSUM: (
884 Op.Cumsum,
885 OptionsSerializer("CumsumOptions", ("exclusive", "reverse")),
886 TFLITE_NO_INDICES,
887 ),
Dwight Lidman8a12da12021-07-19 13:43:05 +0200888 BuiltinOperator.CALL_ONCE: (
889 Op.CallOnce,
890 OptionsSerializer("CallOnceOptions", ("init_subgraph_index",)),
891 TFLITE_NO_INDICES,
892 ),
893 BuiltinOperator.BROADCAST_TO: (Op.BroadcastTo, OptionsSerializer("BroadcastToOptions"), TFLITE_NO_INDICES),
894 BuiltinOperator.RFFT2D: (Op.Rfft2D, OptionsSerializer("Rfft2dOptions"), TFLITE_NO_INDICES),
895 BuiltinOperator.CONV_3D: (
896 Op.Conv3D,
897 OptionsSerializer(
898 "Conv3DOptions",
899 (
900 "dilation_d_factor",
901 "dilation_h_factor",
902 "dilation_w_factor",
903 fused_act,
904 padding,
905 "stride_d",
906 "stride_h",
907 "stride_w",
908 ),
909 ),
910 TFLITE_NO_INDICES,
911 ),
912 BuiltinOperator.IMAG: (Op.Imag, None, TFLITE_NO_INDICES),
913 BuiltinOperator.REAL: (Op.Real, None, TFLITE_NO_INDICES),
914 BuiltinOperator.COMPLEX_ABS: (Op.ComplexAbs, None, TFLITE_NO_INDICES),
915 BuiltinOperator.HASHTABLE: (
916 Op.Hashtable,
917 OptionsSerializer("HashtableOptions", ("key_dtype", "table_id", "value_dtype")),
918 TFLITE_NO_INDICES,
919 ),
920 BuiltinOperator.HASHTABLE_FIND: (Op.HashtableFind, OptionsSerializer("HashtableFindOptions"), TFLITE_NO_INDICES),
921 BuiltinOperator.HASHTABLE_IMPORT: (
922 Op.HashtableImport,
923 OptionsSerializer("HashtableImportOptions"),
924 TFLITE_NO_INDICES,
925 ),
926 BuiltinOperator.HASHTABLE_SIZE: (Op.HashtableSize, OptionsSerializer("HashtableSizeOptions"), TFLITE_NO_INDICES),
927 BuiltinOperator.REDUCE_ALL: (Op.ReduceAll, OptionsSerializer("ReducerOptions", ("keep_dims",)), TFLITE_NO_INDICES),
928 BuiltinOperator.CONV_3D_TRANSPOSE: (
929 Op.Conv3DTranspose,
930 OptionsSerializer(
931 "Conv3DOptions",
932 (
933 "dilation_d_factor",
934 "dilation_h_factor",
935 "dilation_w_factor",
936 fused_act,
937 padding,
938 "stride_d",
939 "stride_h",
940 "stride_w",
941 ),
942 ),
943 TFLITE_NO_INDICES,
944 ),
Rickard Bolin2de898a2021-12-20 08:35:23 +0000945 BuiltinOperator.VAR_HANDLE: (
946 Op.VarHandle,
Jonas Ohlssond8575072022-03-30 10:30:25 +0200947 OptionsSerializer(
948 "VarHandleOptions",
949 (
950 "container",
951 "shared_name",
952 ),
953 ),
Rickard Bolin2de898a2021-12-20 08:35:23 +0000954 TFLITE_NO_INDICES,
955 ),
956 BuiltinOperator.READ_VARIABLE: (Op.ReadVariable, OptionsSerializer("ReadVariableOptions"), TFLITE_NO_INDICES),
957 BuiltinOperator.ASSIGN_VARIABLE: (Op.AssignVariable, OptionsSerializer("AssignVariableOptions"), TFLITE_NO_INDICES),
958 BuiltinOperator.BROADCAST_ARGS: (Op.BroadcastArgs, None, TFLITE_NO_INDICES),
959 BuiltinOperator.RANDOM_STANDARD_NORMAL: (
960 Op.RandomStandardNormal,
Jonas Ohlssond8575072022-03-30 10:30:25 +0200961 OptionsSerializer(
962 "RandomOptions",
963 (
964 "seed",
965 "seed2",
966 ),
967 ),
Rickard Bolin2de898a2021-12-20 08:35:23 +0000968 TFLITE_NO_INDICES,
969 ),
Rickard Bolind66f8012022-04-21 07:36:55 +0000970 BuiltinOperator.BUCKETIZE: (
971 Op.Bucketize,
972 OptionsSerializer(
973 "BucketizeOptions",
974 ("boundaries", "boundaries_as_numpy", "boundaries_length", "boundaries_is_none"),
975 ),
976 TFLITE_NO_INDICES,
977 ),
978 BuiltinOperator.RANDOM_UNIFORM: (Op.RandomUniform, None, TFLITE_NO_INDICES),
979 BuiltinOperator.MULTINOMIAL: (Op.Multinomial, None, TFLITE_NO_INDICES),
980 BuiltinOperator.GELU: (Op.Gelu, OptionsSerializer("GeluOptions", ("approximate",)), TFLITE_NO_INDICES),
981 BuiltinOperator.DYNAMIC_UPDATE_SLICE: (
982 Op.DynamicUpdateSlice,
983 OptionsSerializer("DynamicUpdateSliceOptions"),
984 TFLITE_NO_INDICES,
985 ),
erik.andersson@arm.comdd49a722022-08-10 15:26:48 +0200986 BuiltinOperator.UNSORTED_SEGMENT_PROD: (
987 Op.UnsortedSegmentProd,
erik.andersson@arm.com61f05d92022-09-27 12:06:32 +0200988 OptionsSerializer("UnsortedSegmentProdOptions"),
989 TFLITE_NO_INDICES,
990 ),
991 BuiltinOperator.UNSORTED_SEGMENT_MAX: (
992 Op.UnsortedSegmentMax,
993 OptionsSerializer("UnsortedSegmentMaxOptions"),
994 TFLITE_NO_INDICES,
995 ),
996 BuiltinOperator.UNSORTED_SEGMENT_MIN: (
997 Op.UnsortedSegmentMin,
998 OptionsSerializer("UnsortedSegmentMinOptions"),
999 TFLITE_NO_INDICES,
1000 ),
1001 BuiltinOperator.UNSORTED_SEGMENT_SUM: (
1002 Op.UnsortedSegmentSum,
1003 OptionsSerializer("UnsortedSegmentSumOptions"),
erik.andersson@arm.comdd49a722022-08-10 15:26:48 +02001004 TFLITE_NO_INDICES,
1005 ),
Tim Hallb94bcd42021-09-07 14:24:51 +01001006 BuiltinOperator.CUSTOM: (Op.Custom, CustomOptionsSerializer(), TFLITE_NO_INDICES),
Tim Hall79d07d22020-04-27 18:20:16 +01001007}
1008
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +02001009builtin_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 +01001010
Patrik Gustavsson5e26eda2021-06-30 09:07:16 +02001011builtin_operator_inv_map[Op.CustomNpuOp] = (BuiltinOperator.CUSTOM, CustomOptionsSerializer(), TFLITE_NO_INDICES)
Michael McGeagh219ec072020-11-09 11:11:26 +00001012
Michael McGeagh837dc1b2020-11-10 12:38:25 +00001013BUILTIN_OPERATOR_UNKNOWN = "UNKNOWN"
1014
Tim Halla3fe6652022-03-03 17:43:16 +00001015builtin_operator_name_map = {v: k for k, v in vars(BuiltinOperator).items()}
Michael McGeagh837dc1b2020-11-10 12:38:25 +00001016
Michael McGeagh219ec072020-11-09 11:11:26 +00001017
Tim Halla3fe6652022-03-03 17:43:16 +00001018def optype_to_builtintype(op_type: Op):
Michael McGeagh219ec072020-11-09 11:11:26 +00001019 if op_type in builtin_operator_inv_map:
Tim Halla3fe6652022-03-03 17:43:16 +00001020 return builtin_operator_name_map[builtin_operator_inv_map[op_type][0]]
Michael McGeagh219ec072020-11-09 11:11:26 +00001021 else:
Michael McGeagh837dc1b2020-11-10 12:38:25 +00001022 return BUILTIN_OPERATOR_UNKNOWN