blob: 6cadb598a2403271094c5d6f27749143024ed711 [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
Mike Kelly3ec30772023-03-08 13:47:17 +00002// Copyright © 2017,2019-2023 Arm Ltd and Contributors. All rights reserved.
Mike Kelly8c1701a2019-02-11 17:01:27 +00003// SPDX-License-Identifier: MIT
4//
Mike Kelly8c1701a2019-02-11 17:01:27 +00005#include "Serializer.hpp"
Finn Williamsb454c5c2021-02-09 15:56:23 +00006#include "SerializerUtils.hpp"
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00007
Matthew Benthamff130e22020-01-17 11:47:42 +00008#include <armnn/Descriptors.hpp>
9#include <armnn/LstmParams.hpp>
10#include <armnn/QuantizedLstmParams.hpp>
Jan Eilers8eb25602020-03-09 12:13:48 +000011#include <armnn/utility/IgnoreUnused.hpp>
Matthew Sloyan0663d662020-09-14 11:47:26 +010012#include <armnn/utility/NumericCast.hpp>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000013
Finn Williamsb454c5c2021-02-09 15:56:23 +000014#include <fmt/format.h>
Mike Kelly8c1701a2019-02-11 17:01:27 +000015#include <iostream>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000016
Mike Kelly8c1701a2019-02-11 17:01:27 +000017using namespace armnn;
18namespace fb = flatbuffers;
Derek Lamberti0028d1b2019-02-20 13:57:42 +000019namespace serializer = armnnSerializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000020
21namespace armnnSerializer
22{
23
Finn Williams85d36712021-01-26 22:30:06 +000024ISerializer::ISerializer() : pSerializerImpl(new SerializerImpl())
25{
26}
27
28ISerializer::~ISerializer() = default;
29
30ISerializer* ISerializer::CreateRaw()
31{
32 return new ISerializer();
33}
34
35ISerializerPtr ISerializer::Create()
36{
37 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
38}
39
40void ISerializer::Destroy(ISerializer* serializer)
41{
42 delete serializer;
43}
44
45void ISerializer::Serialize(const armnn::INetwork& inNetwork)
46{
47 pSerializerImpl->Serialize(inNetwork);
48}
49
50bool ISerializer::SaveSerializedToStream(std::ostream& stream)
51{
52 return pSerializerImpl->SaveSerializedToStream(stream);
53}
54
Mike Kellyaf484012019-02-20 16:53:11 +000055serializer::ActivationFunction GetFlatBufferActivationFunction(armnn::ActivationFunction function)
56{
57 switch (function)
58 {
59 case armnn::ActivationFunction::Sigmoid:
60 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
61 case armnn::ActivationFunction::TanH:
62 return serializer::ActivationFunction::ActivationFunction_TanH;
63 case armnn::ActivationFunction::Linear:
64 return serializer::ActivationFunction::ActivationFunction_Linear;
65 case armnn::ActivationFunction::ReLu:
66 return serializer::ActivationFunction::ActivationFunction_ReLu;
67 case armnn::ActivationFunction::BoundedReLu:
68 return serializer::ActivationFunction::ActivationFunction_BoundedReLu;
69 case armnn::ActivationFunction::LeakyReLu:
70 return serializer::ActivationFunction::ActivationFunction_LeakyReLu;
71 case armnn::ActivationFunction::Abs:
72 return serializer::ActivationFunction::ActivationFunction_Abs;
73 case armnn::ActivationFunction::Sqrt:
74 return serializer::ActivationFunction::ActivationFunction_Sqrt;
75 case armnn::ActivationFunction::Square:
76 return serializer::ActivationFunction::ActivationFunction_Square;
David Monahan3b3c3812020-02-25 09:03:29 +000077 case armnn::ActivationFunction::Elu:
78 return serializer::ActivationFunction::ActivationFunction_Elu;
Colm Donelan03fbeaf2020-02-26 15:39:23 +000079 case armnn::ActivationFunction::HardSwish:
80 return serializer::ActivationFunction::ActivationFunction_HardSwish;
Mike Kellyaf484012019-02-20 16:53:11 +000081 default:
82 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
83 }
84}
85
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010086serializer::ArgMinMaxFunction GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)
87{
88 switch (function)
89 {
90 case armnn::ArgMinMaxFunction::Max:
91 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
92 case armnn::ArgMinMaxFunction::Min:
93 default:
94 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
95 }
96}
97
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000098uint32_t SerializerStrategy::GetSerializedId(LayerGuid guid)
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000099{
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000100 if (m_guidMap.empty())
101 {
janeil013fec1ea2019-11-07 09:47:20 +0000102 m_guidMap.insert(std::make_pair(guid, m_layerId));
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000103 }
104 else if (m_guidMap.find(guid) == m_guidMap.end())
105 {
janeil013fec1ea2019-11-07 09:47:20 +0000106 ++m_layerId;
107 m_guidMap.insert(std::make_pair(guid, m_layerId));
108
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000109 return m_layerId;
110 }
Saoirse Stewart30211042019-02-18 17:19:16 +0000111 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +0000112}
113
Mike Kelly8c1701a2019-02-11 17:01:27 +0000114// Build FlatBuffer for Input Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000115void SerializerStrategy::SerializeInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000116{
Jan Eilers8eb25602020-03-09 12:13:48 +0000117 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000118
Mike Kelly8c1701a2019-02-11 17:01:27 +0000119 // Create FlatBuffer BaseLayer
120 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
121
122 // Create FlatBuffer BindableBaseLayer
123 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
124 flatBufferInputBaseLayer,
125 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000126 // Push layer binding id to outputIds.
127 m_inputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000128
129 // Create the FlatBuffer InputLayer
130 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
131
132 // Add the AnyLayer to the FlatBufferLayers
133 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
134}
135
136// Build FlatBuffer for Output Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000137void SerializerStrategy::SerializeOutputLayer(const armnn::IConnectableLayer* layer,
138 LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000139{
Jan Eilers8eb25602020-03-09 12:13:48 +0000140 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000141
Mike Kelly8c1701a2019-02-11 17:01:27 +0000142 // Create FlatBuffer BaseLayer
143 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
144
145 // Create FlatBuffer BindableBaseLayer
146 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
147 flatBufferOutputBaseLayer,
148 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000149 // Push layer binding id to outputIds.
150 m_outputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000151
152 // Create the FlatBuffer OutputLayer
153 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
154 // Add the AnyLayer to the FlatBufferLayers
155 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
156}
157
Mike Kellyaf484012019-02-20 16:53:11 +0000158// Build FlatBuffer for Activation Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000159void SerializerStrategy::SerializeActivationLayer(const armnn::IConnectableLayer* layer,
160 const armnn::ActivationDescriptor& descriptor,
161 const char* name)
Mike Kellyaf484012019-02-20 16:53:11 +0000162{
Jan Eilers8eb25602020-03-09 12:13:48 +0000163 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000164
Mike Kellyaf484012019-02-20 16:53:11 +0000165 // Create FlatBuffer BaseLayer
166 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
167
168 // Create the FlatBuffer ActivationDescriptor
169 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
170 GetFlatBufferActivationFunction(descriptor.m_Function),
171 descriptor.m_A,
172 descriptor.m_B);
173
174 // Create the FlatBuffer ActivationLayer
175 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
176 flatBufferBaseLayer,
177 flatBufferDescriptor);
178
179 // Add the AnyLayer to the FlatBufferLayers
180 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
181}
182
Mike Kelly8c1701a2019-02-11 17:01:27 +0000183// Build FlatBuffer for Addition Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000184void SerializerStrategy::SerializeAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000185{
Jan Eilers8eb25602020-03-09 12:13:48 +0000186 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000187
Mike Kelly8c1701a2019-02-11 17:01:27 +0000188 // Create FlatBuffer BaseLayer
189 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
190
191 // Create the FlatBuffer AdditionLayer
192 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
193
194 // Add the AnyLayer to the FlatBufferLayers
195 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
196}
197
Nikhil Rajee391d52019-09-05 17:50:44 +0100198// Build FlatBuffer for ArgMinMax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000199void SerializerStrategy::SerializeArgMinMaxLayer(const armnn::IConnectableLayer *layer,
200 const armnn::ArgMinMaxDescriptor& descriptor,
201 const char *name)
Nikhil Rajee391d52019-09-05 17:50:44 +0100202{
Jan Eilers8eb25602020-03-09 12:13:48 +0000203 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000204
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100205 // Create FlatBuffer BaseLayer
206 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
207
208 // Create FlatBuffer Descriptor
209 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
210 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
211 descriptor.m_Axis);
212
213 // Create FlatBuffer ArgMinMaxLayer
214 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
215 flatBufferBaseLayer,
216 flatBufferDescriptor);
217
218 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100219}
220
Samuel Yapa04f4a12022-08-19 11:14:38 +0100221void SerializerStrategy::SerializeBatchMatMulLayer(const armnn::IConnectableLayer* layer,
222 const armnn::BatchMatMulDescriptor& descriptor,
223 const char* name)
224{
225 IgnoreUnused(name);
226
227 // Create FlatBuffer BaseLayer
228 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchMatMul);
229
230 // Create the FlatBuffer BatchMatMulDescriptor
231 auto flatBufferDescriptor = CreateBatchMatMulDescriptor(m_flatBufferBuilder,
232 descriptor.m_TransposeX,
233 descriptor.m_TransposeY,
234 descriptor.m_AdjointX,
235 descriptor.m_AdjointY,
236 GetFlatBufferDataLayout(descriptor.m_DataLayoutX),
237 GetFlatBufferDataLayout(descriptor.m_DataLayoutY));
238
239 // Create the FlatBuffer BatchMatMulLayer
240 auto flatBufferBatchMatMulLayer = CreateBatchMatMulLayer(m_flatBufferBuilder,
241 flatBufferBaseLayer,
242 flatBufferDescriptor);
243
244 // Add the AnyLayer to the FlatBufferLayers
245 CreateAnyLayer(flatBufferBatchMatMulLayer.o, serializer::Layer::Layer_BatchMatMulLayer);
246}
247
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000248// Build FlatBuffer for BatchToSpaceNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000249void SerializerStrategy::SerializeBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
250 const armnn::BatchToSpaceNdDescriptor& descriptor,
251 const char* name)
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000252{
Jan Eilers8eb25602020-03-09 12:13:48 +0000253 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000254
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000255 // Create FlatBuffer BaseLayer
256 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
257
258 std::vector<unsigned int> crops;
259 crops.reserve(descriptor.m_Crops.size() * 2);
260 for (auto& crop : descriptor.m_Crops)
261 {
262 crops.push_back(crop.first);
263 crops.push_back(crop.second);
264 }
265
266 auto flatBufferDescriptor =
267 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
268 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
269 m_flatBufferBuilder.CreateVector(crops),
270 GetFlatBufferDataLayout(descriptor.m_DataLayout));
271
272 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
273 flatBufferBaseLayer,
274 flatBufferDescriptor);
275
276 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
277}
278
Finn Williamsb454c5c2021-02-09 15:56:23 +0000279void SerializerStrategy::SerializeBatchNormalizationLayer(
280 const armnn::IConnectableLayer* layer,
281 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
282 const std::vector<armnn::ConstTensor>& constants,
283 const char* name)
ruoyan018e7fa232019-02-28 15:09:07 +0000284{
Jan Eilers8eb25602020-03-09 12:13:48 +0000285 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000286
Finn Williamsb454c5c2021-02-09 15:56:23 +0000287 const armnn::ConstTensor& mean = constants[0];
288 const armnn::ConstTensor& variance = constants[1];
289 const armnn::ConstTensor& beta = constants[2];
290 const armnn::ConstTensor& gamma = constants[3];
291
ruoyan018e7fa232019-02-28 15:09:07 +0000292 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
293 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
294 m_flatBufferBuilder,
295 batchNormDescriptor.m_Eps,
296 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
297
298 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
299 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
300 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
301 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
302 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
303 fbBatchNormalizationBaseLayer,
304 fbBatchNormalizationDescriptor,
305 fbMeanConstTensorInfo,
306 fbVarianceConstTensorInfo,
307 fbBetaConstTensorInfo,
308 fbGammaConstTensorInfo);
309
310 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
311}
312
mathad01b392e982021-04-07 12:07:30 +0100313void SerializerStrategy::SerializeCastLayer(const armnn::IConnectableLayer* layer,
314 const char* name)
315{
316 IgnoreUnused(name);
317
318 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Cast);
319 auto fbCastLayer = serializer::CreateCastLayer(m_flatBufferBuilder, fbBaseLayer);
320 CreateAnyLayer(fbCastLayer.o, serializer::Layer::Layer_CastLayer);
321}
322
Simon Obute51f67772021-09-03 15:50:13 +0100323void SerializerStrategy::SerializeChannelShuffleLayer(const armnn::IConnectableLayer* layer,
324 const armnn::ChannelShuffleDescriptor& descriptor,
325 const char* name)
326{
327 IgnoreUnused(name);
328 auto fbDescriptor = CreateChannelShuffleDescriptor(m_flatBufferBuilder,
329 descriptor.m_Axis,
330 descriptor.m_NumGroups);
331 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ChannelShuffle);
332 auto fbChannelShuffleLayer = serializer::CreateChannelShuffleLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
333 CreateAnyLayer(fbChannelShuffleLayer.o, serializer::Layer::Layer_ChannelShuffleLayer);
334}
335
Finn Williamsb454c5c2021-02-09 15:56:23 +0000336void SerializerStrategy::SerializeComparisonLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100337 const armnn::ComparisonDescriptor& descriptor,
338 const char* name)
339{
Jan Eilers8eb25602020-03-09 12:13:48 +0000340 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000341
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100342 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
343 auto fbDescriptor = serializer::CreateComparisonDescriptor(
344 m_flatBufferBuilder,
345 GetFlatBufferComparisonOperation(descriptor.m_Operation));
346
347 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
348 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100349}
350
Conor Kennedy76277882019-02-26 08:29:54 +0000351// Build FlatBuffer for Constant Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000352void SerializerStrategy::SerializeConstantLayer(const armnn::IConnectableLayer* layer,
353 const std::vector<armnn::ConstTensor>& constants,
354 const char* name)
Conor Kennedy76277882019-02-26 08:29:54 +0000355{
Jan Eilers8eb25602020-03-09 12:13:48 +0000356 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000357
Finn Williamsb454c5c2021-02-09 15:56:23 +0000358 armnn::ConstTensor input = constants[0];
359
Conor Kennedy76277882019-02-26 08:29:54 +0000360 // Create FlatBuffer BaseLayer
361 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
362
363 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
364
365 // Create the FlatBuffer ConstantLayer
366 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
367 flatBufferConstantBaseLayer,
368 flatBufferConstTensorInfo);
369
370 // Add the AnyLayer to the FlatBufferLayers
371 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
372}
373
Mike Kellya0766c32019-02-19 17:22:07 +0000374// Build FlatBuffer for Convolution2dLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000375void SerializerStrategy::SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer,
376 const armnn::Convolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000377 const char* name)
Mike Kellya0766c32019-02-19 17:22:07 +0000378{
Jan Eilers8eb25602020-03-09 12:13:48 +0000379 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000380
Mike Kellya0766c32019-02-19 17:22:07 +0000381 // Create FlatBuffer BaseLayer
382 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
383
384 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
385 descriptor.m_PadLeft,
386 descriptor.m_PadRight,
387 descriptor.m_PadTop,
388 descriptor.m_PadBottom,
389 descriptor.m_StrideX,
390 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100391 descriptor.m_DilationX,
392 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000393 descriptor.m_BiasEnabled,
394 GetFlatBufferDataLayout(descriptor.m_DataLayout));
Mike Kellya0766c32019-02-19 17:22:07 +0000395
396 // Create the FlatBuffer Convolution2dLayer
397 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
398 flatBufferBaseLayer,
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100399 flatBufferDescriptor);
Mike Kellya0766c32019-02-19 17:22:07 +0000400
401 // Add the AnyLayer to the FlatBufferLayers
402 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
403}
404
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100405// Build FlatBuffer for Convolution3dLayer
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100406void SerializerStrategy::SerializeConvolution3dLayer(const armnn::IConnectableLayer* layer,
407 const armnn::Convolution3dDescriptor& descriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100408 const char* name)
409{
410 IgnoreUnused(name);
411
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100412 // Create FlatBuffer BaseLayer
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100413 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution3d);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100414
415 auto flatBufferDescriptor = CreateConvolution3dDescriptor(m_flatBufferBuilder,
416 descriptor.m_PadLeft,
417 descriptor.m_PadRight,
418 descriptor.m_PadTop,
419 descriptor.m_PadBottom,
420 descriptor.m_PadFront,
421 descriptor.m_PadBack,
422 descriptor.m_StrideX,
423 descriptor.m_StrideY,
424 descriptor.m_StrideZ,
425 descriptor.m_DilationX,
426 descriptor.m_DilationY,
427 descriptor.m_DilationZ,
428 descriptor.m_BiasEnabled,
429 GetFlatBufferDataLayout(descriptor.m_DataLayout));
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100430
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100431 // Create the FlatBuffer Convolution3dLayer
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100432 auto flatBufferLayer = CreateConvolution3dLayer(m_flatBufferBuilder,
433 flatBufferBaseLayer,
Matthew Sloyan5d7b0a32021-10-18 13:07:49 +0100434 flatBufferDescriptor);
Matthew Sloyanb63a3112021-09-08 13:05:51 +0100435
436 // Add the AnyLayer to the FlatBufferLayers
437 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution3dLayer);
438}
439
Finn Williamsb454c5c2021-02-09 15:56:23 +0000440void SerializerStrategy::SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100441 const armnn::DepthToSpaceDescriptor& descriptor,
442 const char* name)
443{
Jan Eilers8eb25602020-03-09 12:13:48 +0000444 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000445
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100446 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
447 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
448 descriptor.m_BlockSize,
449 GetFlatBufferDataLayout(descriptor.m_DataLayout));
450
451 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
452
453 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100454}
455
Finn Williamsb454c5c2021-02-09 15:56:23 +0000456void SerializerStrategy::SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
457 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +0000458 const char* name)
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000459{
Jan Eilers8eb25602020-03-09 12:13:48 +0000460 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000461
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000462 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
463 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
464 descriptor.m_PadLeft,
465 descriptor.m_PadRight,
466 descriptor.m_PadTop,
467 descriptor.m_PadBottom,
468 descriptor.m_StrideX,
469 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100470 descriptor.m_DilationX,
471 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000472 descriptor.m_BiasEnabled,
473 GetFlatBufferDataLayout(descriptor.m_DataLayout));
474
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000475 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
476 fbBaseLayer,
Cathal Corbett06902652022-04-14 17:55:11 +0100477 fbDescriptor);
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000478
479 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
480}
481
Finn Williamsb454c5c2021-02-09 15:56:23 +0000482void SerializerStrategy::SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000483 const char* name)
484{
Jan Eilers8eb25602020-03-09 12:13:48 +0000485 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000486
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000487 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
488 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
489
490 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
491}
492
Finn Williamsb454c5c2021-02-09 15:56:23 +0000493void SerializerStrategy::SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
494 const armnn::DetectionPostProcessDescriptor& descriptor,
495 const std::vector<armnn::ConstTensor>& constants,
496 const char* name)
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000497{
Jan Eilers8eb25602020-03-09 12:13:48 +0000498 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000499
Finn Williamsb454c5c2021-02-09 15:56:23 +0000500 const armnn::ConstTensor& anchors = constants[0];
501
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000502 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
503 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
504 descriptor.m_MaxDetections,
505 descriptor.m_MaxClassesPerDetection,
506 descriptor.m_DetectionsPerClass,
507 descriptor.m_NmsScoreThreshold,
508 descriptor.m_NmsIouThreshold,
509 descriptor.m_NumClasses,
510 descriptor.m_UseRegularNms,
511 descriptor.m_ScaleX,
512 descriptor.m_ScaleY,
513 descriptor.m_ScaleW,
514 descriptor.m_ScaleH);
515
516 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
517
518 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
519 fbBaseLayer,
520 fbDescriptor,
521 fbAnchorsConstTensorInfo);
522
523 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
524}
525
Finn Williamsb454c5c2021-02-09 15:56:23 +0000526void SerializerStrategy::SerializeDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000527{
Jan Eilers8eb25602020-03-09 12:13:48 +0000528 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000529
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000530 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
531 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000532
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000533 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
534}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000535
Mike Kelly3ec30772023-03-08 13:47:17 +0000536void SerializerStrategy::SerializeElementwiseBinaryLayer(const armnn::IConnectableLayer* layer,
537 const armnn::ElementwiseBinaryDescriptor& descriptor,
538 const char* name)
539{
540 IgnoreUnused(name);
541
542 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseBinary);
543 auto fbDescriptor = serializer::CreateElementwiseBinaryDescriptor(
544 m_flatBufferBuilder,
545 GetFlatBufferBinaryOperation(descriptor.m_Operation));
546
547 auto fbLayer = serializer::CreateElementwiseBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
548 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseBinaryLayer);
549}
550
Finn Williamsb454c5c2021-02-09 15:56:23 +0000551void SerializerStrategy::SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
josh minor4a3c6102020-01-06 16:40:46 -0600552 const armnn::ElementwiseUnaryDescriptor& descriptor,
553 const char* name)
554{
Jan Eilers8eb25602020-03-09 12:13:48 +0000555 IgnoreUnused(name);
josh minor4a3c6102020-01-06 16:40:46 -0600556
557 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
558 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
559 m_flatBufferBuilder,
560 GetFlatBufferUnaryOperation(descriptor.m_Operation));
561
562 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
563 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
564}
565
Finn Williamsb454c5c2021-02-09 15:56:23 +0000566void SerializerStrategy::SerializeFillLayer(const armnn::IConnectableLayer* layer,
Ryan OSheaec6c6802020-06-05 17:17:06 +0100567 const armnn::FillDescriptor& fillDescriptor,
568 const char* name)
569{
Ryan OSheaec6c6802020-06-05 17:17:06 +0100570 IgnoreUnused(name);
Keith Davis300ad562020-06-04 16:34:23 +0100571
572 auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill);
573
574 auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.m_Value);
575
576 auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor);
577
578 CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer);
Ryan OSheaec6c6802020-06-05 17:17:06 +0100579}
580
Finn Williamsb454c5c2021-02-09 15:56:23 +0000581void SerializerStrategy::SerializeFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000582{
Jan Eilers8eb25602020-03-09 12:13:48 +0000583 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000584
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000585 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
586 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
587
588 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
589}
590
Finn Williamsb454c5c2021-02-09 15:56:23 +0000591void SerializerStrategy::SerializeGatherLayer(const armnn::IConnectableLayer* layer,
Teresa Charlin52664732020-06-29 16:27:03 +0100592 const armnn::GatherDescriptor& gatherDescriptor,
593 const char* name)
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000594{
Jan Eilers8eb25602020-03-09 12:13:48 +0000595 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000596
Teresa Charlin52664732020-06-29 16:27:03 +0100597 auto fbGatherDescriptor = CreateGatherDescriptor(m_flatBufferBuilder,
598 gatherDescriptor.m_Axis);
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000599 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
Teresa Charlin52664732020-06-29 16:27:03 +0100600 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer, fbGatherDescriptor);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000601
602 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
603}
604
Teresa Charlin6966bfa2022-04-25 17:14:50 +0100605void SerializerStrategy::SerializeGatherNdLayer(const armnn::IConnectableLayer* layer,
606 const char* name)
607{
608 IgnoreUnused(name);
609
610 auto fbGatherNdBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_GatherNd);
611 auto flatBufferLayer = serializer::CreateGatherNdLayer(m_flatBufferBuilder, fbGatherNdBaseLayer);
612
613 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherNdLayer);
614}
615
Finn Williamsb454c5c2021-02-09 15:56:23 +0000616void SerializerStrategy::SerializeInstanceNormalizationLayer(
Kevin Mayce5045a2019-10-02 14:07:47 +0100617 const armnn::IConnectableLayer* layer,
618 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
619 const char* name)
620{
Jan Eilers8eb25602020-03-09 12:13:48 +0000621 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000622
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100623 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
624 m_flatBufferBuilder,
625 instanceNormalizationDescriptor.m_Gamma,
626 instanceNormalizationDescriptor.m_Beta,
627 instanceNormalizationDescriptor.m_Eps,
628 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
629
630 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
631 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
632
633 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100634}
635
Finn Williamsb454c5c2021-02-09 15:56:23 +0000636void SerializerStrategy::SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000637 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
638 const char* name)
639{
Jan Eilers8eb25602020-03-09 12:13:48 +0000640 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000641
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000642 // Create FlatBuffer BaseLayer
643 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
644
645 // Create the FlatBuffer L2Normalization Descriptor
646 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100647 m_flatBufferBuilder,
648 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
649 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000650
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100651 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000652 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
653
654 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
655}
656
Finn Williamsb454c5c2021-02-09 15:56:23 +0000657void SerializerStrategy::SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
James Conroyaba90cd2020-11-06 16:28:18 +0000658 const armnn::LogicalBinaryDescriptor& descriptor,
659 const char* name)
660{
661 IgnoreUnused(name);
662
663 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogicalBinary);
664 auto fbDescriptor = serializer::CreateLogicalBinaryDescriptor(
665 m_flatBufferBuilder,
666 GetFlatBufferLogicalBinaryOperation(descriptor.m_Operation));
667
668 auto fbLayer = serializer::CreateLogicalBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
669 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_LogicalBinaryLayer);
670}
671
Finn Williamsb454c5c2021-02-09 15:56:23 +0000672void SerializerStrategy::SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100673 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
674 const char* name)
675{
Jan Eilers8eb25602020-03-09 12:13:48 +0000676 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000677
Sadik Armagan26257852019-10-14 13:00:47 +0100678 // Create FlatBuffer BaseLayer
679 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
680
681 // Create the FlatBuffer LogSoftmaxDescriptor
682 auto flatBufferLogSoftmaxDesc =
683 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
684 logSoftmaxDescriptor.m_Beta,
685 logSoftmaxDescriptor.m_Axis);
686
687 // Create the FlatBuffer LogSoftmaxLayer
688 auto flatBufferLogSoftmaxLayer =
689 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
690 flatBufferLogSoftmaxBaseLayer,
691 flatBufferLogSoftmaxDesc);
692
693 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100694}
695
Finn Williamsb454c5c2021-02-09 15:56:23 +0000696void SerializerStrategy::SerializeLstmLayer(const armnn::IConnectableLayer* layer,
697 const armnn::LstmDescriptor& descriptor,
698 const std::vector<armnn::ConstTensor>& constants,
699 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000700{
Jan Eilers8eb25602020-03-09 12:13:48 +0000701 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000702
Jim Flynn11af3752019-03-19 17:22:29 +0000703 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
704
705 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
706 m_flatBufferBuilder,
707 descriptor.m_ActivationFunc,
708 descriptor.m_ClippingThresCell,
709 descriptor.m_ClippingThresProj,
710 descriptor.m_CifgEnabled,
711 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100712 descriptor.m_ProjectionEnabled,
713 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000714
Finn Williamsb454c5c2021-02-09 15:56:23 +0000715 // Index for constants vector
716 std::size_t i = 0;
717
718 // Get mandatory/basic input parameters
719 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
720 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
721 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
722 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
723 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
724 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
725 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
726 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
727 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
728
729
Jim Flynn11af3752019-03-19 17:22:29 +0000730
731 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
732 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
733 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
734 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
735 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
736 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
737 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
738 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
739 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100740 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
741 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
742 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
743 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000744
745 if (!descriptor.m_CifgEnabled)
746 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000747 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
748 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
749 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
Jim Flynn11af3752019-03-19 17:22:29 +0000750 }
751
752 if (descriptor.m_PeepholeEnabled)
753 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000754 if (!descriptor.m_CifgEnabled)
755 {
756 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
757 }
758 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
759 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
760 }
761
762 if (descriptor.m_ProjectionEnabled)
763 {
764 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
765 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
Jim Flynn11af3752019-03-19 17:22:29 +0000766 }
767
Jan Eilersf8c62972019-07-17 11:07:49 +0100768 if (descriptor.m_LayerNormEnabled)
769 {
770 if (!descriptor.m_CifgEnabled)
771 {
Finn Williamsb454c5c2021-02-09 15:56:23 +0000772 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100773 }
Finn Williamsb454c5c2021-02-09 15:56:23 +0000774 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
775 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
776 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
Jan Eilersf8c62972019-07-17 11:07:49 +0100777 }
778
Jim Flynn11af3752019-03-19 17:22:29 +0000779 auto fbLstmParams = serializer::CreateLstmInputParams(
780 m_flatBufferBuilder,
781 inputToForgetWeights,
782 inputToCellWeights,
783 inputToOutputWeights,
784 recurrentToForgetWeights,
785 recurrentToCellWeights,
786 recurrentToOutputWeights,
787 forgetGateBias,
788 cellBias,
789 outputGateBias,
790 inputToInputWeights,
791 recurrentToInputWeights,
792 cellToInputWeights,
793 inputGateBias,
794 projectionWeights,
795 projectionBias,
796 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100797 cellToOutputWeights,
798 inputLayerNormWeights,
799 forgetLayerNormWeights,
800 cellLayerNormWeights,
801 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000802
803 auto fbLstmLayer = serializer::CreateLstmLayer(
804 m_flatBufferBuilder,
805 fbLstmBaseLayer,
806 fbLstmDescriptor,
807 fbLstmParams);
808
809 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
810}
811
Finn Williamsb454c5c2021-02-09 15:56:23 +0000812void SerializerStrategy::SerializeMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000813{
Jan Eilers8eb25602020-03-09 12:13:48 +0000814 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000815
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000816 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
817 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
818
819 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
820}
821
Finn Williamsb454c5c2021-02-09 15:56:23 +0000822void SerializerStrategy::SerializeMeanLayer(const armnn::IConnectableLayer* layer,
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000823 const armnn::MeanDescriptor& descriptor,
824 const char* name)
825{
Jan Eilers8eb25602020-03-09 12:13:48 +0000826 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000827
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000828 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
829 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
830 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
831 descriptor.m_KeepDims);
832
833 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
834 fbMeanBaseLayer,
835 fbMeanDescriptor);
836
837 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
838}
839
Finn Williamsb454c5c2021-02-09 15:56:23 +0000840void SerializerStrategy::SerializeMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000841{
Jan Eilers8eb25602020-03-09 12:13:48 +0000842 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000843
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000844 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
845 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
846
847 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
848}
849
Finn Williamsb454c5c2021-02-09 15:56:23 +0000850void SerializerStrategy::SerializeMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100851{
Jan Eilers8eb25602020-03-09 12:13:48 +0000852 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000853
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100854 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
855 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
856
857 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
858}
859
Finn Williamsb454c5c2021-02-09 15:56:23 +0000860void SerializerStrategy::SerializeConcatLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100861 const armnn::ConcatDescriptor& concatDescriptor,
862 const char* name)
863{
Jan Eilers8eb25602020-03-09 12:13:48 +0000864 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000865
Jim Flynne242f2d2019-05-22 14:24:13 +0100866 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000867
868 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100869 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000870 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100871 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000872 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100873 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000874 {
875 origins.push_back(origin[d]);
876 }
877 auto view = m_flatBufferBuilder.CreateVector(origins);
878 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
879 views.push_back(uintVector);
880 }
881
Jim Flynne242f2d2019-05-22 14:24:13 +0100882 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
883 concatDescriptor.GetConcatAxis(),
884 concatDescriptor.GetNumViews(),
885 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000886 m_flatBufferBuilder.CreateVector(views));
887
Jim Flynne242f2d2019-05-22 14:24:13 +0100888 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
889 flatBufferConcatBaseLayer,
890 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000891
Jim Flynne242f2d2019-05-22 14:24:13 +0100892 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000893}
894
Finn Williamsb454c5c2021-02-09 15:56:23 +0000895void SerializerStrategy::SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000896{
Jan Eilers8eb25602020-03-09 12:13:48 +0000897 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000898
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000899 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
900 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
901 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000902
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000903 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000904}
905
Finn Williamsb454c5c2021-02-09 15:56:23 +0000906void SerializerStrategy::SerializePadLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000907 const armnn::PadDescriptor& padDescriptor,
908 const char* name)
909{
Jan Eilers8eb25602020-03-09 12:13:48 +0000910 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000911
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000912 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
913
914 std::vector<unsigned int> padList;
915 for (auto& p: padDescriptor.m_PadList)
916 {
917 padList.push_back(p.first);
918 padList.push_back(p.second);
919 }
920
921 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100922 m_flatBufferBuilder.CreateVector(padList),
Matthew Sloyan2e5d0b22021-10-21 14:05:31 +0100923 padDescriptor.m_PadValue,
924 GetFlatBufferPaddingMode(padDescriptor.m_PaddingMode));
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000925
926 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
927 flatBufferBaseLayer,
928 flatBufferPadDesc);
929
930 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
931}
932
Finn Williamsb454c5c2021-02-09 15:56:23 +0000933void SerializerStrategy::SerializePermuteLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000934 const armnn::PermuteDescriptor& permuteDescriptor,
935 const char* name)
936{
Jan Eilers8eb25602020-03-09 12:13:48 +0000937 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000938
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000939 // Create FlatBuffer BaseLayer
940 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
941
942 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100943 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000944 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100945 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000946 }
947
948 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
949 m_flatBufferBuilder.CreateVector(dimMappings));
950
951 // Create the FlatBuffer PermuteLayer
952 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
953 flatBufferPermuteBaseLayer,
954 flatBufferPermuteDesc);
955
956 // Add the AnyLayer to the FlatBufferLayers
957 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
958}
959
Finn Williams2605b232020-06-10 15:53:46 +0100960// Build FlatBuffer for Rank Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000961void SerializerStrategy::SerializeRankLayer(const armnn::IConnectableLayer* layer,
Finn Williams2605b232020-06-10 15:53:46 +0100962 const char* name)
963{
964 IgnoreUnused(name);
965 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rank);
966 auto flatBufferRankLayer = serializer::CreateRankLayer(m_flatBufferBuilder, flatBufferBaseLayer);
967
968 CreateAnyLayer(flatBufferRankLayer.o, serializer::Layer::Layer_RankLayer);
969}
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000970
Finn Williamsb454c5c2021-02-09 15:56:23 +0000971void SerializerStrategy::SerializeReduceLayer(const armnn::IConnectableLayer* layer,
972 const armnn::ReduceDescriptor& reduceDescriptor,
973 const char*)
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000974{
975 auto fbReduceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reduce);
976 auto fbDescriptor = CreateReduceDescriptor(m_flatBufferBuilder,
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000977 reduceDescriptor.m_KeepDims,
978 m_flatBufferBuilder.CreateVector(reduceDescriptor.m_vAxis),
979 GetFlatBufferReduceOperation(reduceDescriptor.m_ReduceOperation));
980 auto fbReduceLayer = serializer::CreateReduceLayer(m_flatBufferBuilder,
981 fbReduceBaseLayer,
982 fbDescriptor);
983
984 CreateAnyLayer(fbReduceLayer.o, serializer::Layer::Layer_ReduceLayer);
985}
986
Saoirse Stewart263829c2019-02-19 15:54:14 +0000987// Build FlatBuffer for Reshape Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +0000988void SerializerStrategy::SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000989 const armnn::ReshapeDescriptor& reshapeDescriptor,
990 const char* name)
991{
Jan Eilers8eb25602020-03-09 12:13:48 +0000992 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000993
Saoirse Stewart263829c2019-02-19 15:54:14 +0000994 // Create FlatBuffer BaseLayer
995 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
996
997 std::vector<unsigned int> targetShape;
998 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
999 {
1000 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
1001 }
1002
1003 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
1004 m_flatBufferBuilder.CreateVector(targetShape));
1005
1006 // Create the FlatBuffer ReshapeLayer
1007 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
1008 flatBufferReshapeDesc);
1009
1010 // Add the AnyLayer to the FlatBufferLayers
1011 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
1012}
1013
Finn Williamsb454c5c2021-02-09 15:56:23 +00001014void SerializerStrategy::SerializeResizeLayer(const armnn::IConnectableLayer* layer,
Teresa Charlina9075df2019-06-27 15:41:57 +01001015 const armnn::ResizeDescriptor& resizeDescriptor,
1016 const char* name)
1017{
Jan Eilers8eb25602020-03-09 12:13:48 +00001018 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001019
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001020 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
1021
1022 auto flatBufferDescriptor =
1023 CreateResizeDescriptor(m_flatBufferBuilder,
1024 resizeDescriptor.m_TargetHeight,
1025 resizeDescriptor.m_TargetWidth,
1026 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +01001027 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
1028 resizeDescriptor.m_AlignCorners,
1029 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +01001030
1031 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
1032 flatBufferBaseLayer,
1033 flatBufferDescriptor);
1034
1035 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +01001036}
1037
Tracy Narine944fb502023-07-04 15:08:57 +01001038void SerializerStrategy::SerializeReverseV2Layer(const armnn::IConnectableLayer* layer,
Tracy Narinebb8d7592023-07-13 16:50:54 +01001039 const char* name)
Tracy Narine944fb502023-07-04 15:08:57 +01001040{
1041 IgnoreUnused(name);
1042
1043 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ReverseV2);
1044
Tracy Narine944fb502023-07-04 15:08:57 +01001045 auto flatBufferLayer = serializer::CreateReverseV2Layer(m_flatBufferBuilder,
Tracy Narinebb8d7592023-07-13 16:50:54 +01001046 flatBufferBaseLayer);
Tracy Narine944fb502023-07-04 15:08:57 +01001047
1048 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ReverseV2Layer);
1049}
1050
Finn Williamsb454c5c2021-02-09 15:56:23 +00001051void SerializerStrategy::SerializeSliceLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001052 const armnn::SliceDescriptor& sliceDescriptor,
1053 const char* name)
1054{
Jan Eilers8eb25602020-03-09 12:13:48 +00001055 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001056
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01001057 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
1058 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
1059 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
1060 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
1061
1062 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
1063
1064 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001065}
1066
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001067// Build FlatBuffer for Softmax Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001068void SerializerStrategy::SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001069 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001070 const char* name)
1071{
Jan Eilers8eb25602020-03-09 12:13:48 +00001072 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001073
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001074 // Create FlatBuffer BaseLayer
1075 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
1076
1077 // Create the FlatBuffer SoftmaxDescriptor
1078 auto flatBufferSoftmaxDesc =
Sadik Armaganfd0cae32021-11-08 17:18:31 +00001079 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder,
1080 softmaxDescriptor.m_Beta,
1081 softmaxDescriptor.m_Axis);
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001082
1083 // Create the FlatBuffer SoftmaxLayer
1084 auto flatBufferSoftmaxLayer =
1085 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
1086 flatBufferSoftmaxBaseLayer,
1087 flatBufferSoftmaxDesc);
1088
1089 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
1090}
1091
Finn Williamsb454c5c2021-02-09 15:56:23 +00001092void SerializerStrategy::SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001093 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001094 const char* name)
1095{
Jan Eilers8eb25602020-03-09 12:13:48 +00001096 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001097
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001098 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
1099 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
1100 m_flatBufferBuilder,
1101 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
1102 pooling2dDescriptor.m_PadLeft,
1103 pooling2dDescriptor.m_PadRight,
1104 pooling2dDescriptor.m_PadTop,
1105 pooling2dDescriptor.m_PadBottom,
1106 pooling2dDescriptor.m_PoolWidth,
1107 pooling2dDescriptor.m_PoolHeight,
1108 pooling2dDescriptor.m_StrideX,
1109 pooling2dDescriptor.m_StrideY,
1110 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
1111 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
1112 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
1113
1114 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1115 fbPooling2dBaseLayer,
1116 fbPooling2dDescriptor);
1117
1118 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1119}
1120
Tamas Nyirid998a1c2021-11-05 14:55:33 +00001121void SerializerStrategy::SerializePooling3dLayer(const armnn::IConnectableLayer* layer,
1122 const armnn::Pooling3dDescriptor& pooling3dDescriptor,
1123 const char* name)
1124{
1125 IgnoreUnused(name);
1126
1127 auto fbPooling3dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling3d);
1128 auto fbPooling3dDescriptor = serializer::CreatePooling3dDescriptor(
1129 m_flatBufferBuilder,
1130 GetFlatBufferPoolingAlgorithm(pooling3dDescriptor.m_PoolType),
1131 pooling3dDescriptor.m_PadLeft,
1132 pooling3dDescriptor.m_PadRight,
1133 pooling3dDescriptor.m_PadTop,
1134 pooling3dDescriptor.m_PadBottom,
1135 pooling3dDescriptor.m_PadFront,
1136 pooling3dDescriptor.m_PadBack,
1137 pooling3dDescriptor.m_PoolWidth,
1138 pooling3dDescriptor.m_PoolHeight,
1139 pooling3dDescriptor.m_PoolDepth,
1140 pooling3dDescriptor.m_StrideX,
1141 pooling3dDescriptor.m_StrideY,
1142 pooling3dDescriptor.m_StrideZ,
1143 GetFlatBufferOutputShapeRounding(pooling3dDescriptor.m_OutputShapeRounding),
1144 GetFlatBufferPaddingMethod(pooling3dDescriptor.m_PaddingMethod),
1145 GetFlatBufferDataLayout(pooling3dDescriptor.m_DataLayout));
1146
1147 auto fbPooling3dLayer = serializer::CreatePooling3dLayer(m_flatBufferBuilder,
1148 fbPooling3dBaseLayer,
1149 fbPooling3dDescriptor);
1150
1151 CreateAnyLayer(fbPooling3dLayer.o, serializer::Layer::Layer_Pooling3dLayer);
1152}
1153
Finn Williamsb454c5c2021-02-09 15:56:23 +00001154void SerializerStrategy::SerializePreluLayer(const armnn::IConnectableLayer* layer,
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001155 const char* name)
1156{
Jan Eilers8eb25602020-03-09 12:13:48 +00001157 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001158
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001159 // Create FlatBuffer BaseLayer
1160 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1161
1162 // Create the FlatBuffer AdditionLayer
1163 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1164
1165 // Add the AnyLayer to the FlatBufferLayers
1166 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001167}
1168
Finn Williamsb454c5c2021-02-09 15:56:23 +00001169void SerializerStrategy::SerializeQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
Derek Lamberti87acb272019-03-27 16:51:31 +00001170{
Jan Eilers8eb25602020-03-09 12:13:48 +00001171 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001172
Derek Lamberti87acb272019-03-27 16:51:31 +00001173 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1174 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1175 fbQuantizeBaseLayer);
1176 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1177}
1178
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001179// Build FlatBuffer for FullyConnected Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001180void SerializerStrategy::SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1181 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001182 const char*)
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001183{
1184 // Create FlatBuffer BaseLayer
1185 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1186
1187 // Create FlatBuffer FullyConnectedDescriptor
1188 auto flatBufferDescriptor =
1189 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1190 fullyConnectedDescriptor.m_BiasEnabled,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00001191 fullyConnectedDescriptor.m_TransposeWeightMatrix,
1192 fullyConnectedDescriptor.m_ConstantWeights);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001193
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001194 // Create FlatBuffer FullyConnectedLayer
1195 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1196 flatBufferBaseLayer,
Matthew Sloyan81beae32021-07-13 19:46:11 +01001197 flatBufferDescriptor);
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001198
1199 // Add created FullyConnectedLayer to the FlatBufferLayers
1200 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1201}
1202
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001203// Build FlatBuffer for SpaceToBatchNd Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001204void SerializerStrategy::SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001205 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1206 const char* name)
1207{
Jan Eilers8eb25602020-03-09 12:13:48 +00001208 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001209
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001210 // Create FlatBuffer BaseLayer
1211 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1212
1213 std::vector<unsigned int> padList;
1214 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1215 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1216 {
1217 padList.push_back(pad.first);
1218 padList.push_back(pad.second);
1219 }
1220
1221 auto flatBufferDescriptor =
1222 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1223 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1224 m_flatBufferBuilder.CreateVector(padList),
1225 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1226
1227 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1228 flatBufferBaseLayer,
1229 flatBufferDescriptor);
1230
1231 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1232}
1233
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001234// Build FlatBuffer for SpaceToDepthLayer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001235void SerializerStrategy::SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001236 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1237 const char* name)
1238{
Jan Eilers8eb25602020-03-09 12:13:48 +00001239 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001240
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001241 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1242 auto flatBufferDescriptor =
1243 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1244 spaceToDepthDescriptor.m_BlockSize,
1245 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1246
1247 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1248 flatBufferBaseLayer,
1249 flatBufferDescriptor);
1250
1251 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001252}
1253
Jim Flynn18ce3382019-03-08 11:08:30 +00001254// Build FlatBuffer for Splitter Layer
Finn Williamsb454c5c2021-02-09 15:56:23 +00001255void SerializerStrategy::SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
Jim Flynn18ce3382019-03-08 11:08:30 +00001256 const armnn::ViewsDescriptor& viewsDescriptor,
1257 const char* name)
1258{
Jan Eilers8eb25602020-03-09 12:13:48 +00001259 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001260
Jim Flynn18ce3382019-03-08 11:08:30 +00001261 // Create FlatBuffer ViewOrigins
1262 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1263 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1264
1265 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1266 {
1267 std::vector<uint32_t> viewOrigin;
1268 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1269
1270 // Copy vector
1271 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1272 {
1273 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1274 }
1275
1276 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1277 m_flatBufferBuilder.CreateVector(viewOrigin)));
1278 }
1279
1280 // Create FlatBuffer OriginsDescriptor
1281 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1282 viewsDescriptor.GetOrigins().GetConcatAxis(),
1283 viewsDescriptor.GetOrigins().GetNumViews(),
1284 viewsDescriptor.GetOrigins().GetNumDimensions(),
1285 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1286
1287 // Create FlatBuffer ViewOrigins
1288 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1289 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1290
1291 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1292 {
1293 std::vector<uint32_t> viewSize;
1294 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1295
1296 // Copy vector
1297 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1298 {
1299 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1300 }
1301
1302 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1303 m_flatBufferBuilder.CreateVector(viewSize)));
1304 }
1305
1306 // Create FlatBuffer ViewsDescriptor
1307 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1308 flatBufferOriginDescriptor,
1309 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1310
1311 // Create FlatBuffer BaseLayer
1312 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1313
1314 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1315 flatBufferBaseLayer,
1316 flatBufferViewsDescriptor);
1317
1318 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1319}
1320
Finn Williamsb454c5c2021-02-09 15:56:23 +00001321void SerializerStrategy::SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
Nina Drozd57728782019-02-27 10:53:27 +00001322 const armnn::NormalizationDescriptor& descriptor,
1323 const char* name)
1324{
Jan Eilers8eb25602020-03-09 12:13:48 +00001325 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001326
Nina Drozd57728782019-02-27 10:53:27 +00001327 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1328
1329 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1330 m_flatBufferBuilder,
1331 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1332 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1333 descriptor.m_NormSize,
1334 descriptor.m_Alpha,
1335 descriptor.m_Beta,
1336 descriptor.m_K,
1337 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1338
1339 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1340 fbNormalizationBaseLayer,
1341 fbNormalizationDescriptor);
1342
1343 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1344}
1345
Keith Davis3ae3f972021-05-21 16:33:48 +01001346void SerializerStrategy::SerializeShapeLayer(const armnn::IConnectableLayer* layer,
1347 const char* name)
1348{
1349 IgnoreUnused(name);
1350
1351 auto shapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Shape);
1352 auto shapeLayer = serializer::CreateShapeLayer(m_flatBufferBuilder, shapeBaseLayer);
1353
1354 CreateAnyLayer(shapeLayer.o, serializer::Layer::Layer_ShapeLayer);
1355}
1356
Finn Williamsb454c5c2021-02-09 15:56:23 +00001357void SerializerStrategy::SerializeStackLayer(const armnn::IConnectableLayer* layer,
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001358 const armnn::StackDescriptor& stackDescriptor,
1359 const char* name)
1360{
Jan Eilers8eb25602020-03-09 12:13:48 +00001361 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001362
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001363 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1364
1365 std::vector<unsigned int> inputShape;
1366 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1367 {
1368 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1369 }
1370
1371 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1372 stackDescriptor.m_Axis,
1373 stackDescriptor.m_NumInputs,
1374 m_flatBufferBuilder.CreateVector(inputShape));
1375
1376 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1377 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001378}
1379
Finn Williamsb454c5c2021-02-09 15:56:23 +00001380void SerializerStrategy::SerializeStandInLayer(const armnn::IConnectableLayer *layer,
Derek Lamberti013c3902019-10-21 10:46:16 +01001381 const armnn::StandInDescriptor& standInDescriptor,
1382 const char *name)
1383{
Jan Eilers8eb25602020-03-09 12:13:48 +00001384 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001385
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001386 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1387 standInDescriptor.m_NumInputs,
1388 standInDescriptor.m_NumOutputs);
1389
1390 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1391 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1392
1393 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001394}
1395
Finn Williamsb454c5c2021-02-09 15:56:23 +00001396void SerializerStrategy::SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001397 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1398 const char* name)
1399{
Jan Eilers8eb25602020-03-09 12:13:48 +00001400 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001401
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001402 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1403
1404 auto flatBufferDescriptor =
1405 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1406 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1407 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1408 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1409 stridedSliceDescriptor.m_BeginMask,
1410 stridedSliceDescriptor.m_EndMask,
1411 stridedSliceDescriptor.m_ShrinkAxisMask,
1412 stridedSliceDescriptor.m_EllipsisMask,
1413 stridedSliceDescriptor.m_NewAxisMask,
1414 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1415
1416 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1417 flatBufferBaseLayer,
1418 flatBufferDescriptor);
1419
1420 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1421}
1422
Finn Williamsb454c5c2021-02-09 15:56:23 +00001423void SerializerStrategy::SerializeSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
Conor Kennedyda1f9752019-03-01 14:37:12 +00001424{
Jan Eilers8eb25602020-03-09 12:13:48 +00001425 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001426
Conor Kennedyda1f9752019-03-01 14:37:12 +00001427 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1428 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1429
1430 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1431}
1432
Finn Williamsb454c5c2021-02-09 15:56:23 +00001433void SerializerStrategy::SerializeSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armaganeff363d2019-04-05 15:25:46 +01001434{
Jan Eilers8eb25602020-03-09 12:13:48 +00001435 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001436
Sadik Armaganeff363d2019-04-05 15:25:46 +01001437 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1438 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1439
1440 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1441}
1442
David Monahan616b22f2023-07-25 12:08:10 +01001443void SerializerStrategy::SerializeTileLayer(const armnn::IConnectableLayer* layer,
1444 const armnn::TileDescriptor& descriptor,
1445 const char* name)
1446{
1447 IgnoreUnused(name);
1448
1449 // Create FlatBuffer BaseLayer
1450 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Tile);
1451
1452 auto flatBufferDesc = serializer::CreateTileDescriptor(m_flatBufferBuilder,
1453 m_flatBufferBuilder.CreateVector(descriptor.m_Multiples));
1454
1455 // Create the FlatBuffer TileLayer
1456 auto flatBufferLayer = serializer::CreateTileLayer(m_flatBufferBuilder,
1457 flatBufferBaseLayer,
1458 flatBufferDesc);
1459
1460 // Add the AnyLayer to the FlatBufferLayers
1461 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TileLayer);
1462}
1463
Finn Williamsb454c5c2021-02-09 15:56:23 +00001464void SerializerStrategy::SerializeTransposeConvolution2dLayer(
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001465 const armnn::IConnectableLayer* layer,
1466 const armnn::TransposeConvolution2dDescriptor& descriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00001467 const std::vector<armnn::ConstTensor>& constants,
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001468 const char* name)
1469{
Jan Eilers8eb25602020-03-09 12:13:48 +00001470 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001471
Finn Williamsb454c5c2021-02-09 15:56:23 +00001472 const armnn::ConstTensor& weights = constants.at(0);
1473
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001474 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1475 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1476 descriptor.m_PadLeft,
1477 descriptor.m_PadRight,
1478 descriptor.m_PadTop,
1479 descriptor.m_PadBottom,
1480 descriptor.m_StrideX,
1481 descriptor.m_StrideY,
1482 descriptor.m_BiasEnabled,
1483 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1484
1485 // weights & biases
1486 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1487 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
Finn Williamsb454c5c2021-02-09 15:56:23 +00001488 if (constants.size() > 1)
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001489 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001490 const armnn::ConstTensor& biases = constants.at(1);
1491 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001492 }
1493
1494 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1495 fbBaseLayer,
1496 fbDescriptor,
1497 fbWeightsConstTensorInfo,
1498 fbBiasesConstTensorInfo);
1499
1500 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001501}
1502
Finn Williamsb454c5c2021-02-09 15:56:23 +00001503void SerializerStrategy::SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001504 const armnn::TransposeDescriptor& descriptor,
1505 const char* name)
1506{
Jan Eilers8eb25602020-03-09 12:13:48 +00001507 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001508
1509 // Create FlatBuffer BaseLayer
1510 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1511
1512 std::vector<unsigned int> dimMappings;
1513 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1514 {
1515 dimMappings.push_back(descriptor.m_DimMappings[i]);
1516 }
1517
1518 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1519 m_flatBufferBuilder.CreateVector(dimMappings));
1520
1521 // Create the FlatBuffer TransposeLayer
1522 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1523 flatBufferBaseLayer,
1524 flatBufferDesc);
1525
1526 // Add the AnyLayer to the FlatBufferLayers
1527 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1528}
1529
Finn Williamsb454c5c2021-02-09 15:56:23 +00001530void SerializerStrategy::SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
1531 const armnn::QLstmDescriptor& descriptor,
1532 const std::vector<armnn::ConstTensor>& constants,
1533 const char* name)
James Conroy586a9aa2020-03-20 08:49:33 +00001534{
James Conroy8d333182020-05-13 10:27:58 +01001535 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001536
James Conroy8d333182020-05-13 10:27:58 +01001537 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1538
1539 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1540 m_flatBufferBuilder,
1541 descriptor.m_CifgEnabled,
1542 descriptor.m_PeepholeEnabled,
1543 descriptor.m_ProjectionEnabled,
1544 descriptor.m_LayerNormEnabled,
1545 descriptor.m_CellClip,
1546 descriptor.m_ProjectionClip,
1547 descriptor.m_InputIntermediateScale,
1548 descriptor.m_ForgetIntermediateScale,
1549 descriptor.m_CellIntermediateScale,
1550 descriptor.m_OutputIntermediateScale,
1551 descriptor.m_HiddenStateZeroPoint,
1552 descriptor.m_HiddenStateScale
1553 );
1554
Finn Williamsb454c5c2021-02-09 15:56:23 +00001555 // Index for constants vector
1556 std::size_t i = 0;
1557
James Conroy8d333182020-05-13 10:27:58 +01001558 // Mandatory params
Finn Williamsb454c5c2021-02-09 15:56:23 +00001559 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1560 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1561 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1562 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1563 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1564 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1565 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1566 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1567 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001568
1569 // CIFG
1570 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1571 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1572 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1573
1574 if (!descriptor.m_CifgEnabled)
1575 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001576 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1577 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1578 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
James Conroy8d333182020-05-13 10:27:58 +01001579 }
1580
1581 // Peephole
1582 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1583 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1584 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1585
1586 if (descriptor.m_PeepholeEnabled)
1587 {
1588 if (!descriptor.m_CifgEnabled)
1589 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001590 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
James Conroy8d333182020-05-13 10:27:58 +01001591 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001592 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1593 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1594 }
James Conroy8d333182020-05-13 10:27:58 +01001595
Finn Williamsb454c5c2021-02-09 15:56:23 +00001596 // Projection
1597 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1598 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1599
1600 if (descriptor.m_ProjectionEnabled)
1601 {
1602 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1603 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
James Conroy8d333182020-05-13 10:27:58 +01001604 }
1605
1606 // Layer norm
1607 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1608 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1609 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1610 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1611
1612 if (descriptor.m_LayerNormEnabled)
1613 {
1614 if (!descriptor.m_CifgEnabled)
1615 {
Finn Williamsb454c5c2021-02-09 15:56:23 +00001616 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001617 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00001618 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1619 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1620 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
James Conroy8d333182020-05-13 10:27:58 +01001621 }
1622
1623 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1624 m_flatBufferBuilder,
1625 inputToForgetWeights,
1626 inputToCellWeights,
1627 inputToOutputWeights,
1628 recurrentToForgetWeights,
1629 recurrentToCellWeights,
1630 recurrentToOutputWeights,
1631 forgetGateBias,
1632 cellBias,
1633 outputGateBias,
1634 inputToInputWeights,
1635 recurrentToInputWeights,
1636 inputGateBias,
1637 projectionWeights,
1638 projectionBias,
1639 cellToInputWeights,
1640 cellToForgetWeights,
1641 cellToOutputWeights,
1642 inputLayerNormWeights,
1643 forgetLayerNormWeights,
1644 cellLayerNormWeights,
1645 outputLayerNormWeights);
1646
1647 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1648 m_flatBufferBuilder,
1649 fbQLstmBaseLayer,
1650 fbQLstmDescriptor,
1651 fbQLstmParams);
1652
1653 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001654}
1655
Finn Williamsb454c5c2021-02-09 15:56:23 +00001656void SerializerStrategy::SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1657 const std::vector<armnn::ConstTensor>& constants,
1658 const char* name)
James Conroyee18dc82019-07-17 11:27:46 +01001659{
Jan Eilers8eb25602020-03-09 12:13:48 +00001660 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001661
Jan Eilers5b01a892019-07-23 09:47:43 +01001662 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1663
Finn Williamsb454c5c2021-02-09 15:56:23 +00001664 // index for constants vector
1665 size_t i = 0;
1666
Jan Eilers5b01a892019-07-23 09:47:43 +01001667 // Get input parameters
Finn Williamsb454c5c2021-02-09 15:56:23 +00001668 auto inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1669 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1670 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1671 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001672
Finn Williamsb454c5c2021-02-09 15:56:23 +00001673 auto recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1674 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1675 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1676 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001677
Finn Williamsb454c5c2021-02-09 15:56:23 +00001678 auto inputGateBias = CreateConstTensorInfo(constants[i++]);
1679 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1680 auto cellBias = CreateConstTensorInfo(constants[i++]);
1681 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
Jan Eilers5b01a892019-07-23 09:47:43 +01001682
1683 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1684 m_flatBufferBuilder,
1685 inputToInputWeights,
1686 inputToForgetWeights,
1687 inputToCellWeights,
1688 inputToOutputWeights,
1689 recurrentToInputWeights,
1690 recurrentToForgetWeights,
1691 recurrentToCellWeights,
1692 recurrentToOutputWeights,
1693 inputGateBias,
1694 forgetGateBias,
1695 cellBias,
1696 outputGateBias);
1697
1698 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1699 m_flatBufferBuilder,
1700 fbQuantizedLstmBaseLayer,
1701 fbQuantizedLstmParams);
1702
1703 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001704}
1705
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01001706void SerializerStrategy::SerializeUnidirectionalSequenceLstmLayer(
1707 const armnn::IConnectableLayer* layer,
1708 const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
1709 const std::vector<armnn::ConstTensor>& constants,
1710 const char* name)
1711{
1712 IgnoreUnused(name);
1713
1714 auto fbUnidirectionalSequenceLstmBaseLayer =
1715 CreateLayerBase(layer, serializer::LayerType::LayerType_UnidirectionalSequenceLstm);
1716
1717 auto fbUnidirectionalSequenceLstmDescriptor = serializer::CreateUnidirectionalSequenceLstmDescriptor(
1718 m_flatBufferBuilder,
1719 descriptor.m_ActivationFunc,
1720 descriptor.m_ClippingThresCell,
1721 descriptor.m_ClippingThresProj,
1722 descriptor.m_CifgEnabled,
1723 descriptor.m_PeepholeEnabled,
1724 descriptor.m_ProjectionEnabled,
1725 descriptor.m_LayerNormEnabled,
1726 descriptor.m_TimeMajor);
1727
1728 // Index for constants vector
1729 std::size_t i = 0;
1730
1731 // Get mandatory/basic input parameters
1732 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1733 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1734 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1735 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1736 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1737 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1738 auto forgetGateBias = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1739 auto cellBias = CreateConstTensorInfo(constants[i++]); //CellBias
1740 auto outputGateBias = CreateConstTensorInfo(constants[i++]); //OutputGateBias
1741
1742 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
1743 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1744 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1745 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1746 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1747 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1748 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1749 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1750 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1751 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1752 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1753 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1754 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1755
1756 if (!descriptor.m_CifgEnabled)
1757 {
1758 inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1759 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1760 inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
1761 }
1762
1763 if (descriptor.m_PeepholeEnabled)
1764 {
1765 if (!descriptor.m_CifgEnabled)
1766 {
1767 cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
1768 }
1769 cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1770 cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1771 }
1772
1773 if (descriptor.m_ProjectionEnabled)
1774 {
1775 projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1776 projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
1777 }
1778
1779 if (descriptor.m_LayerNormEnabled)
1780 {
1781 if (!descriptor.m_CifgEnabled)
1782 {
1783 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
1784 }
1785 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1786 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1787 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
1788 }
1789
1790 auto fbUnidirectionalSequenceLstmParams = serializer::CreateLstmInputParams(
1791 m_flatBufferBuilder,
1792 inputToForgetWeights,
1793 inputToCellWeights,
1794 inputToOutputWeights,
1795 recurrentToForgetWeights,
1796 recurrentToCellWeights,
1797 recurrentToOutputWeights,
1798 forgetGateBias,
1799 cellBias,
1800 outputGateBias,
1801 inputToInputWeights,
1802 recurrentToInputWeights,
1803 cellToInputWeights,
1804 inputGateBias,
1805 projectionWeights,
1806 projectionBias,
1807 cellToForgetWeights,
1808 cellToOutputWeights,
1809 inputLayerNormWeights,
1810 forgetLayerNormWeights,
1811 cellLayerNormWeights,
1812 outputLayerNormWeights);
1813
1814 auto fbUnidirectionalSequenceLstmLayer = serializer::CreateUnidirectionalSequenceLstmLayer(
1815 m_flatBufferBuilder,
1816 fbUnidirectionalSequenceLstmBaseLayer,
1817 fbUnidirectionalSequenceLstmDescriptor,
1818 fbUnidirectionalSequenceLstmParams);
1819
1820 CreateAnyLayer(fbUnidirectionalSequenceLstmLayer.o, serializer::Layer::Layer_UnidirectionalSequenceLstmLayer);
1821}
1822
Finn Williamsb454c5c2021-02-09 15:56:23 +00001823fb::Offset<serializer::LayerBase> SerializerStrategy::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001824 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001825{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001826
Sadik Armagandb059fd2019-03-20 12:28:32 +00001827 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1828
Mike Kelly8c1701a2019-02-11 17:01:27 +00001829 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1830 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1831
1832 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001833 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001834 m_flatBufferBuilder.CreateString(layer->GetName()),
1835 layerType,
1836 m_flatBufferBuilder.CreateVector(inputSlots),
1837 m_flatBufferBuilder.CreateVector(outputSlots));
1838}
1839
Finn Williamsb454c5c2021-02-09 15:56:23 +00001840void SerializerStrategy::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001841{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001842
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001843 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001844 m_serializedLayers.push_back(anyLayer);
1845}
1846
Mike Kellya0766c32019-02-19 17:22:07 +00001847template <typename T>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001848flatbuffers::Offset<flatbuffers::Vector<T>> SerializerStrategy::CreateDataVector(const void* memory, unsigned int size)
Mike Kellya0766c32019-02-19 17:22:07 +00001849{
1850 const T* buffer = reinterpret_cast<const T*>(memory);
1851 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1852 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1853 return fbVector;
1854}
1855
Finn Williamsb454c5c2021-02-09 15:56:23 +00001856flatbuffers::Offset<TensorInfo> SerializerStrategy::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001857{
Mike Kellya0766c32019-02-19 17:22:07 +00001858 // Get the dimensions
1859 std::vector<unsigned int> shape;
Colm Donelan800b2812021-02-12 12:43:35 +00001860 std::vector<bool> specificity;
1861 // This assumes that the TensorShape constructors have ensured that the size of m_DimensionsSpecificity
1862 // matches the size of dimensions.
1863 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1864 {
1865 specificity.push_back(tensorInfo.GetShape().GetDimensionSpecificity(dim));
Mike Kellydf258592021-04-26 23:53:31 +01001866
1867 if (tensorInfo.GetShape().GetDimensionSpecificity(dim))
1868 {
1869 shape.push_back(tensorInfo.GetShape()[dim]);
1870 }
1871 else
1872 {
1873 shape.push_back(0);
1874 }
Colm Donelan800b2812021-02-12 12:43:35 +00001875 }
1876
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001877 if (tensorInfo.HasPerAxisQuantization())
1878 {
1879 // Create FlatBuffer TensorInfo
1880 auto flatBufferTensorInfo =
1881 serializer::CreateTensorInfo(m_flatBufferBuilder,
1882 m_flatBufferBuilder.CreateVector(shape),
1883 GetFlatBufferDataType(tensorInfo.GetDataType()),
1884 tensorInfo.GetQuantizationScales()[0],
1885 tensorInfo.GetQuantizationOffset(),
1886 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001887 tensorInfo.GetQuantizationDim().value(),
1888 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001889 (tensorInfo.GetShape().GetDimensionality()),
1890 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001891 return flatBufferTensorInfo;
1892 }
1893
Mike Kellya0766c32019-02-19 17:22:07 +00001894 // Create FlatBuffer TensorInfo
1895 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1896 m_flatBufferBuilder.CreateVector(shape),
1897 GetFlatBufferDataType(tensorInfo.GetDataType()),
1898 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001899 tensorInfo.GetQuantizationOffset(),
1900 0,
1901 0,
1902 static_cast<unsigned int>
Colm Donelan800b2812021-02-12 12:43:35 +00001903 (tensorInfo.GetShape().GetDimensionality()),
1904 m_flatBufferBuilder.CreateVector(specificity));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001905 return flatBufferTensorInfo;
1906}
1907
1908flatbuffers::Offset<serializer::ConstTensor>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001909 SerializerStrategy::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001910{
1911 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1912
Mike Kellya0766c32019-02-19 17:22:07 +00001913 flatbuffers::Offset<void> fbPayload;
1914
1915 switch (tensorInfo.GetDataType())
1916 {
Mike Kelly1f140f72021-04-06 12:25:55 +01001917 case armnn::DataType::Signed64:
1918 {
1919 auto fbVector = CreateDataVector<int64_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1920 flatbuffers::Offset<serializer::LongData> flatBuffersData = serializer::CreateLongData(
1921 m_flatBufferBuilder,
1922 fbVector);
1923 fbPayload = flatBuffersData.o;
1924 break;
1925 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001926 case armnn::DataType::Float32:
1927 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001928 {
1929 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1930 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1931 m_flatBufferBuilder,
1932 fbVector);
1933 fbPayload = flatBuffersData.o;
1934 break;
1935 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001936 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001937 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001938 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001939 {
1940 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1941 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1942 m_flatBufferBuilder,
1943 fbVector);
1944 fbPayload = flatBuffersData.o;
1945 break;
1946 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001947 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001948 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001949 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001950 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001951 default:
1952 {
1953 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1954 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1955 m_flatBufferBuilder,
1956 fbVector);
1957 fbPayload = flatBuffersData.o;
1958 }
1959 }
1960 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1961 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001962 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001963 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1964 fbPayload);
1965 return flatBufferConstTensor;
1966}
1967
Finn Williamsb454c5c2021-02-09 15:56:23 +00001968flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
Tee Jungaa920c52019-11-05 10:48:25 +00001969{
1970 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1971 serializer::CreateFeatureCompatibilityVersions(
1972 m_flatBufferBuilder,
Jan Eilers53ef7952021-06-02 12:01:25 +01001973 1, // Binding ids scheme version
Matthew Sloyan81beae32021-07-13 19:46:11 +01001974 1, // Weights layout scheme version
1975 1 // Constant tensors as inputs version
Tee Jungaa920c52019-11-05 10:48:25 +00001976 );
1977 return versionsTable;
1978}
1979
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001980std::vector<fb::Offset<serializer::InputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00001981 SerializerStrategy::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001982{
Mike Kellya0766c32019-02-19 17:22:07 +00001983 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001984
1985 // Get the InputSlots
1986 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1987 {
1988 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1989
1990 // Get the Connection for the InputSlot
1991 const IOutputSlot* connection = inputSlot.GetConnection();
Mike Kelly4cc341c2023-07-07 15:43:06 +01001992 bool isOverridden = inputSlot.IsTensorInfoOverridden();
1993
1994 flatbuffers::Offset<TensorInfo> overriddenTensorInfo = CreateTensorInfo(inputSlot.GetTensorInfo());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001995
1996 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001997 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1998 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001999 // Create FlatBuffer InputSlot
Mike Kelly4cc341c2023-07-07 15:43:06 +01002000 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn, isOverridden,
2001 overriddenTensorInfo));
Mike Kelly8c1701a2019-02-11 17:01:27 +00002002 }
2003 return inputSlots;
2004}
2005
Derek Lamberti0028d1b2019-02-20 13:57:42 +00002006std::vector<fb::Offset<serializer::OutputSlot>>
Finn Williamsb454c5c2021-02-09 15:56:23 +00002007 SerializerStrategy::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00002008{
2009 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
2010
2011 // Get the OutputSlots
2012 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
2013 {
2014 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00002015 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00002016
Mike Kelly8c1701a2019-02-11 17:01:27 +00002017 // Create FlatBuffer Outputslot
2018 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
2019 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00002020 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00002021 }
2022 return outputSlots;
2023}
2024
Finn Williamsb454c5c2021-02-09 15:56:23 +00002025void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
2026 const BaseDescriptor& descriptor,
2027 const std::vector<armnn::ConstTensor>& constants,
2028 const char* name,
2029 const armnn::LayerBindingId id)
2030{
2031 IgnoreUnused(constants);
2032
2033 switch (layer->GetType())
2034 {
2035 case armnn::LayerType::Activation :
2036 {
2037 const armnn::ActivationDescriptor& layerDescriptor =
2038 static_cast<const armnn::ActivationDescriptor&>(descriptor);
2039 SerializeActivationLayer(layer, layerDescriptor, name);
2040 break;
2041 }
2042 case armnn::LayerType::Addition :
2043 {
2044 SerializeAdditionLayer(layer, name);
2045 break;
2046 }
2047 case armnn::LayerType::ArgMinMax :
2048 {
2049 const armnn::ArgMinMaxDescriptor& layerDescriptor =
2050 static_cast<const armnn::ArgMinMaxDescriptor&>(descriptor);
2051 SerializeArgMinMaxLayer(layer, layerDescriptor, name);
2052 break;
2053 }
Samuel Yapa04f4a12022-08-19 11:14:38 +01002054 case armnn::LayerType::BatchMatMul:
2055 {
2056 const armnn::BatchMatMulDescriptor& layerDescriptor =
2057 static_cast<const armnn::BatchMatMulDescriptor&>(descriptor);
2058 SerializeBatchMatMulLayer(layer,
2059 layerDescriptor,
2060 name);
2061 break;
2062 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002063 case armnn::LayerType::BatchNormalization :
2064 {
2065 const armnn::BatchNormalizationDescriptor& layerDescriptor =
2066 static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor);
2067 SerializeBatchNormalizationLayer(layer,
2068 layerDescriptor,
2069 constants,
2070 name);
2071 break;
2072 }
2073 case armnn::LayerType::BatchToSpaceNd :
2074 {
2075 const armnn::BatchToSpaceNdDescriptor& layerDescriptor =
2076 static_cast<const armnn::BatchToSpaceNdDescriptor&>(descriptor);
2077 SerializeBatchToSpaceNdLayer(layer,
2078 layerDescriptor,
2079 name);
2080 break;
2081 }
mathad01b392e982021-04-07 12:07:30 +01002082 case armnn::LayerType::Cast :
2083 {
2084 SerializeCastLayer(layer, name);
2085 break;
2086 }
Simon Obute51f67772021-09-03 15:50:13 +01002087 case armnn::LayerType::ChannelShuffle :
2088 {
2089 const armnn::ChannelShuffleDescriptor& layerDescriptor =
2090 static_cast<const armnn::ChannelShuffleDescriptor&>(descriptor);
2091 SerializeChannelShuffleLayer(layer,
2092 layerDescriptor,
2093 name);
2094 break;
2095 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002096 case armnn::LayerType::Comparison :
2097 {
2098 const armnn::ComparisonDescriptor& layerDescriptor =
2099 static_cast<const armnn::ComparisonDescriptor&>(descriptor);
2100 SerializeComparisonLayer(layer,
2101 layerDescriptor,
2102 name);
2103 break;
2104 }
2105 case armnn::LayerType::Concat :
2106 {
2107 const armnn::ConcatDescriptor& layerDescriptor =
2108 static_cast<const armnn::ConcatDescriptor&>(descriptor);
2109 SerializeConcatLayer(layer,
2110 layerDescriptor,
2111 name);
2112 break;
2113 }
2114 case armnn::LayerType::Constant :
2115 {
2116 SerializeConstantLayer(layer,
2117 constants,
2118 name);
2119 break;
2120 }
2121 case armnn::LayerType::Convolution2d :
2122 {
2123 const armnn::Convolution2dDescriptor& layerDescriptor =
2124 static_cast<const armnn::Convolution2dDescriptor&>(descriptor);
2125 SerializeConvolution2dLayer(layer,
2126 layerDescriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00002127 name);
2128 break;
2129 }
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002130 case armnn::LayerType::Convolution3d :
2131 {
2132 const armnn::Convolution3dDescriptor& layerDescriptor =
2133 static_cast<const armnn::Convolution3dDescriptor&>(descriptor);
2134 SerializeConvolution3dLayer(layer,
2135 layerDescriptor,
Matthew Sloyanb63a3112021-09-08 13:05:51 +01002136 name);
2137 break;
2138 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002139 case armnn::LayerType::DepthToSpace :
2140 {
2141 const armnn::DepthToSpaceDescriptor& layerDescriptor =
2142 static_cast<const armnn::DepthToSpaceDescriptor&>(descriptor);
2143 SerializeDepthToSpaceLayer(layer,
2144 layerDescriptor,
2145 name);
2146 break;
2147 }
2148 case armnn::LayerType::DepthwiseConvolution2d :
2149 {
2150 const armnn::DepthwiseConvolution2dDescriptor& layerDescriptor =
2151 static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor);
2152 SerializeDepthwiseConvolution2dLayer(layer,
2153 layerDescriptor,
Finn Williamsb454c5c2021-02-09 15:56:23 +00002154 name);
2155 break;
2156 }
2157 case armnn::LayerType::Dequantize :
2158 {
2159 SerializeDequantizeLayer(layer,
2160 name);
2161 break;
2162 }
2163 case armnn::LayerType::DetectionPostProcess :
2164 {
2165 const armnn::DetectionPostProcessDescriptor& layerDescriptor =
2166 static_cast<const armnn::DetectionPostProcessDescriptor&>(descriptor);
2167 SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
2168 break;
2169 }
2170 case armnn::LayerType::Division :
2171 {
2172 SerializeDivisionLayer(layer, name);
2173 break;
2174 }
Mike Kelly3ec30772023-03-08 13:47:17 +00002175 case armnn::LayerType::ElementwiseBinary :
2176 {
2177 const armnn::ElementwiseBinaryDescriptor& layerDescriptor =
2178 static_cast<const armnn::ElementwiseBinaryDescriptor&>(descriptor);
2179 SerializeElementwiseBinaryLayer(layer, layerDescriptor, name);
2180 break;
2181 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002182 case armnn::LayerType::ElementwiseUnary :
2183 {
2184 const armnn::ElementwiseUnaryDescriptor& layerDescriptor =
2185 static_cast<const armnn::ElementwiseUnaryDescriptor&>(descriptor);
2186 SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
2187 break;
2188 }
2189 case armnn::LayerType::Fill :
2190 {
2191 const armnn::FillDescriptor& layerDescriptor =
2192 static_cast<const armnn::FillDescriptor&>(descriptor);
2193 SerializeFillLayer(layer, layerDescriptor, name);
2194 break;
2195 }
2196 case armnn::LayerType::Floor :
2197 {
2198 SerializeFloorLayer(layer, name);
2199 break;
2200 }
2201 case armnn::LayerType::FullyConnected :
2202 {
2203 const armnn::FullyConnectedDescriptor& layerDescriptor =
2204 static_cast<const armnn::FullyConnectedDescriptor&>(descriptor);
Matthew Sloyan81beae32021-07-13 19:46:11 +01002205 SerializeFullyConnectedLayer(layer, layerDescriptor, name);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002206 break;
2207 }
2208 case armnn::LayerType::Gather :
2209 {
2210 const armnn::GatherDescriptor& layerDescriptor =
2211 static_cast<const armnn::GatherDescriptor&>(descriptor);
2212 SerializeGatherLayer(layer, layerDescriptor, name);
2213 break;
2214 }
Teresa Charlin6966bfa2022-04-25 17:14:50 +01002215 case armnn::LayerType::GatherNd :
2216 {
2217 SerializeGatherNdLayer(layer, name);
2218 break;
2219 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002220 case armnn::LayerType::Input:
2221 {
2222 SerializeInputLayer(layer, id, name);
2223 break;
2224 }
2225 case armnn::LayerType::InstanceNormalization :
2226 {
2227 const armnn::InstanceNormalizationDescriptor& layerDescriptor =
2228 static_cast<const armnn::InstanceNormalizationDescriptor&>(descriptor);
2229 SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
2230 break;
2231 }
2232 case armnn::LayerType::L2Normalization :
2233 {
2234 const armnn::L2NormalizationDescriptor& layerDescriptor =
2235 static_cast<const armnn::L2NormalizationDescriptor&>(descriptor);
2236 SerializeL2NormalizationLayer(layer, layerDescriptor, name);
2237 break;
2238 }
2239 case armnn::LayerType::LogicalBinary :
2240 {
2241 const armnn::LogicalBinaryDescriptor& layerDescriptor =
2242 static_cast<const armnn::LogicalBinaryDescriptor&>(descriptor);
2243 SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
2244 break;
2245 }
2246 case armnn::LayerType::LogSoftmax :
2247 {
2248 const armnn::LogSoftmaxDescriptor& layerDescriptor =
2249 static_cast<const armnn::LogSoftmaxDescriptor&>(descriptor);
2250 SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
2251 break;
2252 }
2253 case armnn::LayerType::Lstm :
2254 {
2255 const armnn::LstmDescriptor& layerDescriptor =
2256 static_cast<const armnn::LstmDescriptor&>(descriptor);
2257 SerializeLstmLayer(layer, layerDescriptor, constants, name);
2258 break;
2259 }
2260 case armnn::LayerType::QLstm :
2261 {
2262 const armnn::QLstmDescriptor& layerDescriptor =
2263 static_cast<const armnn::QLstmDescriptor&>(descriptor);
2264 SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2265 break;
2266 }
2267 case armnn::LayerType::Maximum :
2268 {
2269 SerializeMaximumLayer(layer, name);
2270 break;
2271 }
2272 case armnn::LayerType::Mean :
2273 {
2274 const armnn::MeanDescriptor& layerDescriptor =
2275 static_cast<const armnn::MeanDescriptor&>(descriptor);
2276 SerializeMeanLayer(layer, layerDescriptor, name);
2277 break;
2278 }
2279 case armnn::LayerType::Merge :
2280 {
2281 SerializeMergeLayer(layer, name);
2282 break;
2283 }
2284 case armnn::LayerType::Minimum :
2285 {
2286 SerializeMinimumLayer(layer, name);
2287 break;
2288 }
2289 case armnn::LayerType::Multiplication :
2290 {
2291 SerializeMultiplicationLayer(layer, name);
2292 break;
2293 }
2294 case armnn::LayerType::Normalization :
2295 {
2296 const armnn::NormalizationDescriptor& layerDescriptor =
2297 static_cast<const armnn::NormalizationDescriptor&>(descriptor);
2298 SerializeNormalizationLayer(layer, layerDescriptor, name);
2299 break;
2300 }
2301 case armnn::LayerType::Output:
2302 {
2303 SerializeOutputLayer(layer, id, name);
2304 break;
2305 }
2306 case armnn::LayerType::Pad :
2307 {
2308 const armnn::PadDescriptor& layerDescriptor =
2309 static_cast<const armnn::PadDescriptor&>(descriptor);
2310 SerializePadLayer(layer, layerDescriptor, name);
2311 break;
2312 }
2313 case armnn::LayerType::Permute :
2314 {
2315 const armnn::PermuteDescriptor& layerDescriptor =
2316 static_cast<const armnn::PermuteDescriptor&>(descriptor);
2317 SerializePermuteLayer(layer, layerDescriptor, name);
2318 break;
2319 }
2320 case armnn::LayerType::Pooling2d :
2321 {
2322 const armnn::Pooling2dDescriptor& layerDescriptor =
2323 static_cast<const armnn::Pooling2dDescriptor&>(descriptor);
2324 SerializePooling2dLayer(layer, layerDescriptor, name);
2325 break;
2326 }
Tamas Nyirid998a1c2021-11-05 14:55:33 +00002327 case armnn::LayerType::Pooling3d :
2328 {
2329 const armnn::Pooling3dDescriptor& layerDescriptor =
2330 static_cast<const armnn::Pooling3dDescriptor&>(descriptor);
2331 SerializePooling3dLayer(layer, layerDescriptor, name);
2332 break;
2333 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002334 case armnn::LayerType::Prelu :
2335 {
2336 SerializePreluLayer(layer, name);
2337 break;
2338 }
2339 case armnn::LayerType::Quantize :
2340 {
2341 SerializeQuantizeLayer(layer, name);
2342 break;
2343 }
2344 case armnn::LayerType::QuantizedLstm:
2345 SerializeQuantizedLstmLayer(layer, constants, name);
2346 break;
2347 case armnn::LayerType::Reshape:
2348 {
2349 const armnn::ReshapeDescriptor &layerDescriptor =
2350 static_cast<const armnn::ReshapeDescriptor &>(descriptor);
2351 SerializeReshapeLayer(layer, layerDescriptor, name);
2352 break;
2353 }
2354 case armnn::LayerType::Rank:
2355 {
2356 SerializeRankLayer(layer, name);
2357 break;
2358 }
2359 case armnn::LayerType::Reduce:
2360 {
2361 const armnn::ReduceDescriptor& layerDescriptor =
2362 static_cast<const armnn::ReduceDescriptor&>(descriptor);
2363 SerializeReduceLayer(layer, layerDescriptor, name);
2364 break;
2365 }
2366 case armnn::LayerType::Resize:
2367 {
2368 const armnn::ResizeDescriptor& layerDescriptor =
2369 static_cast<const armnn::ResizeDescriptor&>(descriptor);
2370 SerializeResizeLayer(layer, layerDescriptor, name);
2371 break;
2372 }
Tracy Narine944fb502023-07-04 15:08:57 +01002373 case armnn::LayerType::ReverseV2:
2374 {
Tracy Narinebb8d7592023-07-13 16:50:54 +01002375 SerializeReverseV2Layer(layer, name);
Tracy Narine944fb502023-07-04 15:08:57 +01002376 break;
2377 }
Keith Davis3ae3f972021-05-21 16:33:48 +01002378 case armnn::LayerType::Shape:
2379 {
2380 SerializeShapeLayer(layer, name);
2381 break;
2382 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002383 case armnn::LayerType::Slice:
2384 {
2385 const armnn::SliceDescriptor& layerDescriptor =
2386 static_cast<const armnn::SliceDescriptor&>(descriptor);
2387 SerializeSliceLayer(layer, layerDescriptor, name);
2388 break;
2389 }
2390 case armnn::LayerType::Softmax:
2391 {
2392 const armnn::SoftmaxDescriptor& layerDescriptor =
2393 static_cast<const armnn::SoftmaxDescriptor&>(descriptor);
2394 SerializeSoftmaxLayer(layer, layerDescriptor, name);
2395 break;
2396 }
2397 case armnn::LayerType::SpaceToBatchNd:
2398 {
2399 const armnn::SpaceToBatchNdDescriptor& layerDescriptor =
2400 static_cast<const armnn::SpaceToBatchNdDescriptor&>(descriptor);
2401 SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2402 break;
2403 }
2404 case armnn::LayerType::SpaceToDepth:
2405 {
2406 const armnn::SpaceToDepthDescriptor& layerDescriptor =
2407 static_cast<const armnn::SpaceToDepthDescriptor&>(descriptor);
2408 SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2409 break;
2410 }
2411 case armnn::LayerType::Splitter:
2412 {
2413 const armnn::SplitterDescriptor& layerDescriptor =
2414 static_cast<const armnn::SplitterDescriptor&>(descriptor);
2415 SerializeSplitterLayer(layer, layerDescriptor, name);
2416 break;
2417 }
2418 case armnn::LayerType::Stack:
2419 {
2420 const armnn::StackDescriptor& layerDescriptor =
2421 static_cast<const armnn::StackDescriptor&>(descriptor);
2422 SerializeStackLayer(layer, layerDescriptor, name);
2423 break;
2424 }
2425 case armnn::LayerType::StandIn:
2426 {
2427 const armnn::StandInDescriptor& layerDescriptor =
2428 static_cast<const armnn::StandInDescriptor&>(descriptor);
2429 SerializeStandInLayer(layer, layerDescriptor, name);
2430 break;
2431 }
2432 case armnn::LayerType::StridedSlice:
2433 {
2434 const armnn::StridedSliceDescriptor& layerDescriptor =
2435 static_cast<const armnn::StridedSliceDescriptor&>(descriptor);
2436 SerializeStridedSliceLayer(layer, layerDescriptor, name);
2437 break;
2438 }
2439 case armnn::LayerType::Subtraction:
2440 {
2441 SerializeSubtractionLayer(layer, name);
2442 break;
2443 }
2444 case armnn::LayerType::Switch:
2445 {
2446 SerializeSwitchLayer(layer, name);
2447 break;
2448 }
David Monahan616b22f2023-07-25 12:08:10 +01002449 case armnn::LayerType::Tile:
2450 {
2451 const armnn::TileDescriptor& layerDescriptor =
2452 static_cast<const armnn::TileDescriptor&>(descriptor);
2453 SerializeTileLayer(layer, layerDescriptor, name);
2454 break;
2455 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002456 case armnn::LayerType::Transpose:
2457 {
2458 const armnn::TransposeDescriptor& layerDescriptor =
2459 static_cast<const armnn::TransposeDescriptor&>(descriptor);
2460 SerializeTransposeLayer(layer, layerDescriptor, name);
2461 break;
2462 }
2463 case armnn::LayerType::TransposeConvolution2d:
2464 {
2465 const armnn::TransposeConvolution2dDescriptor& layerDescriptor =
2466 static_cast<const armnn::TransposeConvolution2dDescriptor&>(descriptor);
2467 SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2468 break;
2469 }
Narumol Prangnawarata0162e12021-07-23 14:47:49 +01002470 case armnn::LayerType::UnidirectionalSequenceLstm :
2471 {
2472 const armnn::UnidirectionalSequenceLstmDescriptor& layerDescriptor =
2473 static_cast<const armnn::UnidirectionalSequenceLstmDescriptor&>(descriptor);
2474 SerializeUnidirectionalSequenceLstmLayer(layer, layerDescriptor, constants, name);
2475 break;
2476 }
Finn Williamsb454c5c2021-02-09 15:56:23 +00002477 default:
2478 {
2479 throw InvalidArgumentException(
2480 fmt::format("A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2481 layer->GetName(),
2482 id));
2483 }
2484 }
2485}
2486
Finn Williams85d36712021-01-26 22:30:06 +00002487void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002488{
2489 // Iterate through to network
Finn Williamsb454c5c2021-02-09 15:56:23 +00002490 inNetwork.ExecuteStrategy(m_SerializerStrategy);
2491 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002492
2493 // Create FlatBuffer SerializedGraph
2494 auto serializedGraph = serializer::CreateSerializedGraph(
Finn Williamsb454c5c2021-02-09 15:56:23 +00002495 fbBuilder,
2496 fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2497 fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2498 fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2499 m_SerializerStrategy.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002500
2501 // Serialize the graph
2502 fbBuilder.Finish(serializedGraph);
2503}
2504
Finn Williamsb454c5c2021-02-09 15:56:23 +00002505
Finn Williams85d36712021-01-26 22:30:06 +00002506bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002507{
Finn Williamsb454c5c2021-02-09 15:56:23 +00002508 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002509
Matthew Sloyan0663d662020-09-14 11:47:26 +01002510 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00002511 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00002512 return !stream.bad();
2513}
2514
Finn Williams2605b232020-06-10 15:53:46 +01002515} // namespace armnnSerializer