blob: 28afac7b62065b1714ce257769ba7cc5d77f913d [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
Teresa Charlin52664732020-06-29 16:27:03 +01002// Copyright © 2017 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"
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00006
Matthew Benthamff130e22020-01-17 11:47:42 +00007#include <armnn/Descriptors.hpp>
8#include <armnn/LstmParams.hpp>
9#include <armnn/QuantizedLstmParams.hpp>
Jan Eilers8eb25602020-03-09 12:13:48 +000010#include <armnn/utility/IgnoreUnused.hpp>
Matthew Sloyan0663d662020-09-14 11:47:26 +010011#include <armnn/utility/NumericCast.hpp>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000012
Mike Kelly8c1701a2019-02-11 17:01:27 +000013#include <iostream>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000014
Matthew Benthamff130e22020-01-17 11:47:42 +000015#include "SerializerUtils.hpp"
16
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
janeil013fec1ea2019-11-07 09:47:20 +000098uint32_t SerializerVisitor::GetSerializedId(armnn::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
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000115void SerializerVisitor::VisitInputLayer(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
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000137void SerializerVisitor::VisitOutputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000138{
Jan Eilers8eb25602020-03-09 12:13:48 +0000139 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000140
Mike Kelly8c1701a2019-02-11 17:01:27 +0000141 // Create FlatBuffer BaseLayer
142 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
143
144 // Create FlatBuffer BindableBaseLayer
145 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
146 flatBufferOutputBaseLayer,
147 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000148 // Push layer binding id to outputIds.
149 m_outputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000150
151 // Create the FlatBuffer OutputLayer
152 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
153 // Add the AnyLayer to the FlatBufferLayers
154 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
155}
156
Kevin May868eb142019-09-04 17:29:31 +0100157void SerializerVisitor::VisitAbsLayer(const armnn::IConnectableLayer* layer, const char* name)
158{
Jan Eilers8eb25602020-03-09 12:13:48 +0000159 IgnoreUnused(name);
FinnWilliamsArm4ffcc8f2019-09-05 14:34:20 +0100160 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Abs);
161 auto flatBufferAbsLayer = serializer::CreateAbsLayer(m_flatBufferBuilder, flatBufferBaseLayer);
162
163 CreateAnyLayer(flatBufferAbsLayer.o, serializer::Layer::Layer_AbsLayer);
Kevin May868eb142019-09-04 17:29:31 +0100164}
165
Mike Kellyaf484012019-02-20 16:53:11 +0000166// Build FlatBuffer for Activation Layer
167void SerializerVisitor::VisitActivationLayer(const armnn::IConnectableLayer* layer,
168 const armnn::ActivationDescriptor& descriptor,
169 const char* name)
170{
Jan Eilers8eb25602020-03-09 12:13:48 +0000171 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000172
Mike Kellyaf484012019-02-20 16:53:11 +0000173 // Create FlatBuffer BaseLayer
174 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
175
176 // Create the FlatBuffer ActivationDescriptor
177 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
178 GetFlatBufferActivationFunction(descriptor.m_Function),
179 descriptor.m_A,
180 descriptor.m_B);
181
182 // Create the FlatBuffer ActivationLayer
183 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
184 flatBufferBaseLayer,
185 flatBufferDescriptor);
186
187 // Add the AnyLayer to the FlatBufferLayers
188 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
189}
190
Mike Kelly8c1701a2019-02-11 17:01:27 +0000191// Build FlatBuffer for Addition Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000192void SerializerVisitor::VisitAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000193{
Jan Eilers8eb25602020-03-09 12:13:48 +0000194 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000195
Mike Kelly8c1701a2019-02-11 17:01:27 +0000196 // Create FlatBuffer BaseLayer
197 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
198
199 // Create the FlatBuffer AdditionLayer
200 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
201
202 // Add the AnyLayer to the FlatBufferLayers
203 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
204}
205
Nikhil Rajee391d52019-09-05 17:50:44 +0100206// Build FlatBuffer for ArgMinMax Layer
207void SerializerVisitor::VisitArgMinMaxLayer(const armnn::IConnectableLayer *layer,
208 const armnn::ArgMinMaxDescriptor& descriptor,
209 const char *name)
210{
Jan Eilers8eb25602020-03-09 12:13:48 +0000211 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000212
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100213 // Create FlatBuffer BaseLayer
214 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
215
216 // Create FlatBuffer Descriptor
217 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
218 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
219 descriptor.m_Axis);
220
221 // Create FlatBuffer ArgMinMaxLayer
222 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
223 flatBufferBaseLayer,
224 flatBufferDescriptor);
225
226 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100227}
228
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000229// Build FlatBuffer for BatchToSpaceNd Layer
230void SerializerVisitor::VisitBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
231 const armnn::BatchToSpaceNdDescriptor& descriptor,
232 const char* name)
233{
Jan Eilers8eb25602020-03-09 12:13:48 +0000234 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000235
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000236 // Create FlatBuffer BaseLayer
237 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
238
239 std::vector<unsigned int> crops;
240 crops.reserve(descriptor.m_Crops.size() * 2);
241 for (auto& crop : descriptor.m_Crops)
242 {
243 crops.push_back(crop.first);
244 crops.push_back(crop.second);
245 }
246
247 auto flatBufferDescriptor =
248 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
249 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
250 m_flatBufferBuilder.CreateVector(crops),
251 GetFlatBufferDataLayout(descriptor.m_DataLayout));
252
253 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
254 flatBufferBaseLayer,
255 flatBufferDescriptor);
256
257 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
258}
259
ruoyan018e7fa232019-02-28 15:09:07 +0000260void SerializerVisitor::VisitBatchNormalizationLayer(const armnn::IConnectableLayer* layer,
261 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
262 const armnn::ConstTensor& mean,
263 const armnn::ConstTensor& variance,
264 const armnn::ConstTensor& beta,
265 const armnn::ConstTensor& gamma,
266 const char* name)
267{
Jan Eilers8eb25602020-03-09 12:13:48 +0000268 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000269
ruoyan018e7fa232019-02-28 15:09:07 +0000270 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
271 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
272 m_flatBufferBuilder,
273 batchNormDescriptor.m_Eps,
274 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
275
276 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
277 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
278 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
279 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
280 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
281 fbBatchNormalizationBaseLayer,
282 fbBatchNormalizationDescriptor,
283 fbMeanConstTensorInfo,
284 fbVarianceConstTensorInfo,
285 fbBetaConstTensorInfo,
286 fbGammaConstTensorInfo);
287
288 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
289}
290
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100291void SerializerVisitor::VisitComparisonLayer(const armnn::IConnectableLayer* layer,
292 const armnn::ComparisonDescriptor& descriptor,
293 const char* name)
294{
Jan Eilers8eb25602020-03-09 12:13:48 +0000295 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000296
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100297 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
298 auto fbDescriptor = serializer::CreateComparisonDescriptor(
299 m_flatBufferBuilder,
300 GetFlatBufferComparisonOperation(descriptor.m_Operation));
301
302 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
303 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100304}
305
Conor Kennedy76277882019-02-26 08:29:54 +0000306// Build FlatBuffer for Constant Layer
307void SerializerVisitor::VisitConstantLayer(const armnn::IConnectableLayer* layer,
308 const armnn::ConstTensor& input,
309 const char* name)
310{
Jan Eilers8eb25602020-03-09 12:13:48 +0000311 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000312
Conor Kennedy76277882019-02-26 08:29:54 +0000313 // Create FlatBuffer BaseLayer
314 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
315
316 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
317
318 // Create the FlatBuffer ConstantLayer
319 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
320 flatBufferConstantBaseLayer,
321 flatBufferConstTensorInfo);
322
323 // Add the AnyLayer to the FlatBufferLayers
324 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
325}
326
Mike Kellya0766c32019-02-19 17:22:07 +0000327// Build FlatBuffer for Convolution2dLayer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000328void SerializerVisitor::VisitConvolution2dLayer(const armnn::IConnectableLayer* layer,
329 const armnn::Convolution2dDescriptor& descriptor,
330 const armnn::ConstTensor& weights,
331 const armnn::Optional<armnn::ConstTensor>& biases,
Mike Kellya0766c32019-02-19 17:22:07 +0000332 const char* name)
333{
Jan Eilers8eb25602020-03-09 12:13:48 +0000334 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000335
Mike Kellya0766c32019-02-19 17:22:07 +0000336 // Create FlatBuffer BaseLayer
337 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
338
339 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
340 descriptor.m_PadLeft,
341 descriptor.m_PadRight,
342 descriptor.m_PadTop,
343 descriptor.m_PadBottom,
344 descriptor.m_StrideX,
345 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100346 descriptor.m_DilationX,
347 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000348 descriptor.m_BiasEnabled,
349 GetFlatBufferDataLayout(descriptor.m_DataLayout));
350 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
351 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
352
353 if (biases.has_value())
354 {
355 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
356 }
357
358 // Create the FlatBuffer Convolution2dLayer
359 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
360 flatBufferBaseLayer,
361 flatBufferDescriptor,
362 flatBufferWeightsConstTensorInfo,
363 flatBufferBiasesConstTensorInfo);
364
365 // Add the AnyLayer to the FlatBufferLayers
366 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
367}
368
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100369void SerializerVisitor::VisitDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
370 const armnn::DepthToSpaceDescriptor& descriptor,
371 const char* name)
372{
Jan Eilers8eb25602020-03-09 12:13:48 +0000373 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000374
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100375 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
376 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
377 descriptor.m_BlockSize,
378 GetFlatBufferDataLayout(descriptor.m_DataLayout));
379
380 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
381
382 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100383}
384
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000385void SerializerVisitor::VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
386 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
387 const armnn::ConstTensor& weights,
388 const armnn::Optional<armnn::ConstTensor>& biases,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000389 const char* name)
390{
Jan Eilers8eb25602020-03-09 12:13:48 +0000391 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000392
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000393 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
394 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
395 descriptor.m_PadLeft,
396 descriptor.m_PadRight,
397 descriptor.m_PadTop,
398 descriptor.m_PadBottom,
399 descriptor.m_StrideX,
400 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100401 descriptor.m_DilationX,
402 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000403 descriptor.m_BiasEnabled,
404 GetFlatBufferDataLayout(descriptor.m_DataLayout));
405
406 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
407 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
408 if (biases.has_value())
409 {
410 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
411 }
412
413 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
414 fbBaseLayer,
415 fbDescriptor,
416 fbWeightsConstTensorInfo,
417 fbBiasesConstTensorInfo);
418
419 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
420}
421
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000422void SerializerVisitor::VisitDequantizeLayer(const armnn::IConnectableLayer* layer,
423 const char* name)
424{
Jan Eilers8eb25602020-03-09 12:13:48 +0000425 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000426
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000427 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
428 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
429
430 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
431}
432
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000433void SerializerVisitor::VisitDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
434 const armnn::DetectionPostProcessDescriptor& descriptor,
435 const armnn::ConstTensor& anchors,
436 const char* name)
437{
Jan Eilers8eb25602020-03-09 12:13:48 +0000438 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000439
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000440 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
441 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
442 descriptor.m_MaxDetections,
443 descriptor.m_MaxClassesPerDetection,
444 descriptor.m_DetectionsPerClass,
445 descriptor.m_NmsScoreThreshold,
446 descriptor.m_NmsIouThreshold,
447 descriptor.m_NumClasses,
448 descriptor.m_UseRegularNms,
449 descriptor.m_ScaleX,
450 descriptor.m_ScaleY,
451 descriptor.m_ScaleW,
452 descriptor.m_ScaleH);
453
454 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
455
456 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
457 fbBaseLayer,
458 fbDescriptor,
459 fbAnchorsConstTensorInfo);
460
461 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
462}
463
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000464void SerializerVisitor::VisitDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
465{
Jan Eilers8eb25602020-03-09 12:13:48 +0000466 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000467
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000468 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
469 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000470
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000471 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
472}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000473
josh minor4a3c6102020-01-06 16:40:46 -0600474void SerializerVisitor::VisitElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
475 const armnn::ElementwiseUnaryDescriptor& descriptor,
476 const char* name)
477{
Jan Eilers8eb25602020-03-09 12:13:48 +0000478 IgnoreUnused(name);
josh minor4a3c6102020-01-06 16:40:46 -0600479
480 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
481 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
482 m_flatBufferBuilder,
483 GetFlatBufferUnaryOperation(descriptor.m_Operation));
484
485 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
486 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
487}
488
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000489void SerializerVisitor::VisitEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
490{
Jan Eilers8eb25602020-03-09 12:13:48 +0000491 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000492
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000493 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
494 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
495
496 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
497}
498
Ryan OSheaec6c6802020-06-05 17:17:06 +0100499void SerializerVisitor::VisitFillLayer(const armnn::IConnectableLayer* layer,
500 const armnn::FillDescriptor& fillDescriptor,
501 const char* name)
502{
Ryan OSheaec6c6802020-06-05 17:17:06 +0100503 IgnoreUnused(name);
Keith Davis300ad562020-06-04 16:34:23 +0100504
505 auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill);
506
507 auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.m_Value);
508
509 auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor);
510
511 CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer);
Ryan OSheaec6c6802020-06-05 17:17:06 +0100512}
513
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000514void SerializerVisitor::VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
515{
Jan Eilers8eb25602020-03-09 12:13:48 +0000516 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000517
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000518 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
519 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
520
521 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
522}
523
Teresa Charlin52664732020-06-29 16:27:03 +0100524void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer,
525 const char* name)
526{
527 armnn::GatherDescriptor gatherDescriptor{};
528 VisitGatherLayer(layer, gatherDescriptor, name);
529}
530
531void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer,
532 const armnn::GatherDescriptor& gatherDescriptor,
533 const char* name)
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000534{
Jan Eilers8eb25602020-03-09 12:13:48 +0000535 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000536
Teresa Charlin52664732020-06-29 16:27:03 +0100537 auto fbGatherDescriptor = CreateGatherDescriptor(m_flatBufferBuilder,
538 gatherDescriptor.m_Axis);
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000539 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
Teresa Charlin52664732020-06-29 16:27:03 +0100540 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer, fbGatherDescriptor);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000541
542 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
543}
544
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000545void SerializerVisitor::VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
546{
Jan Eilers8eb25602020-03-09 12:13:48 +0000547 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000548
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000549 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000550 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000551
552 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
553}
554
Kevin Mayce5045a2019-10-02 14:07:47 +0100555void SerializerVisitor::VisitInstanceNormalizationLayer(
556 const armnn::IConnectableLayer* layer,
557 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
558 const char* name)
559{
Jan Eilers8eb25602020-03-09 12:13:48 +0000560 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000561
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100562 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
563 m_flatBufferBuilder,
564 instanceNormalizationDescriptor.m_Gamma,
565 instanceNormalizationDescriptor.m_Beta,
566 instanceNormalizationDescriptor.m_Eps,
567 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
568
569 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
570 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
571
572 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100573}
574
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000575void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
576 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
577 const char* name)
578{
Jan Eilers8eb25602020-03-09 12:13:48 +0000579 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000580
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000581 // Create FlatBuffer BaseLayer
582 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
583
584 // Create the FlatBuffer L2Normalization Descriptor
585 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100586 m_flatBufferBuilder,
587 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
588 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000589
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100590 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000591 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
592
593 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
594}
595
James Conroyaba90cd2020-11-06 16:28:18 +0000596void SerializerVisitor::VisitLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
597 const armnn::LogicalBinaryDescriptor& descriptor,
598 const char* name)
599{
600 IgnoreUnused(name);
601
602 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogicalBinary);
603 auto fbDescriptor = serializer::CreateLogicalBinaryDescriptor(
604 m_flatBufferBuilder,
605 GetFlatBufferLogicalBinaryOperation(descriptor.m_Operation));
606
607 auto fbLayer = serializer::CreateLogicalBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
608 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_LogicalBinaryLayer);
609}
610
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100611void SerializerVisitor::VisitLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
612 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
613 const char* name)
614{
Jan Eilers8eb25602020-03-09 12:13:48 +0000615 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000616
Sadik Armagan26257852019-10-14 13:00:47 +0100617 // Create FlatBuffer BaseLayer
618 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
619
620 // Create the FlatBuffer LogSoftmaxDescriptor
621 auto flatBufferLogSoftmaxDesc =
622 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
623 logSoftmaxDescriptor.m_Beta,
624 logSoftmaxDescriptor.m_Axis);
625
626 // Create the FlatBuffer LogSoftmaxLayer
627 auto flatBufferLogSoftmaxLayer =
628 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
629 flatBufferLogSoftmaxBaseLayer,
630 flatBufferLogSoftmaxDesc);
631
632 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100633}
634
635void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer,
636 const armnn::LstmDescriptor& descriptor,
637 const armnn::LstmInputParams& params,
638 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000639{
Jan Eilers8eb25602020-03-09 12:13:48 +0000640 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000641
Jim Flynn11af3752019-03-19 17:22:29 +0000642 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
643
644 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
645 m_flatBufferBuilder,
646 descriptor.m_ActivationFunc,
647 descriptor.m_ClippingThresCell,
648 descriptor.m_ClippingThresProj,
649 descriptor.m_CifgEnabled,
650 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100651 descriptor.m_ProjectionEnabled,
652 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000653
654 // Get mandatory input parameters
655 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
656 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
657 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
658 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
659 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
660 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
661 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
662 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
663 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
664
665 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
666 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
667 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
668 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
669 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
670 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
671 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
672 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
673 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100674 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
675 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
676 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
677 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000678
679 if (!descriptor.m_CifgEnabled)
680 {
681 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
682 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
683 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
684 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
685 }
686
687 if (descriptor.m_ProjectionEnabled)
688 {
689 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
690 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
691 }
692
693 if (descriptor.m_PeepholeEnabled)
694 {
695 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
696 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
697 }
698
Jan Eilersf8c62972019-07-17 11:07:49 +0100699 if (descriptor.m_LayerNormEnabled)
700 {
701 if (!descriptor.m_CifgEnabled)
702 {
703 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
704 }
705 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
706 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
707 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
708 }
709
Jim Flynn11af3752019-03-19 17:22:29 +0000710 auto fbLstmParams = serializer::CreateLstmInputParams(
711 m_flatBufferBuilder,
712 inputToForgetWeights,
713 inputToCellWeights,
714 inputToOutputWeights,
715 recurrentToForgetWeights,
716 recurrentToCellWeights,
717 recurrentToOutputWeights,
718 forgetGateBias,
719 cellBias,
720 outputGateBias,
721 inputToInputWeights,
722 recurrentToInputWeights,
723 cellToInputWeights,
724 inputGateBias,
725 projectionWeights,
726 projectionBias,
727 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100728 cellToOutputWeights,
729 inputLayerNormWeights,
730 forgetLayerNormWeights,
731 cellLayerNormWeights,
732 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000733
734 auto fbLstmLayer = serializer::CreateLstmLayer(
735 m_flatBufferBuilder,
736 fbLstmBaseLayer,
737 fbLstmDescriptor,
738 fbLstmParams);
739
740 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
741}
742
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000743void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
744{
Jan Eilers8eb25602020-03-09 12:13:48 +0000745 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000746
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000747 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
748 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
749
750 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
751}
752
753void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
754 const armnn::MeanDescriptor& descriptor,
755 const char* name)
756{
Jan Eilers8eb25602020-03-09 12:13:48 +0000757 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000758
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000759 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
760 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
761 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
762 descriptor.m_KeepDims);
763
764 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
765 fbMeanBaseLayer,
766 fbMeanDescriptor);
767
768 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
769}
770
771void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
772{
Jan Eilers8eb25602020-03-09 12:13:48 +0000773 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000774
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000775 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
776 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
777
778 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
779}
780
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100781void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
782{
Jan Eilers8eb25602020-03-09 12:13:48 +0000783 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000784
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100785 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
786 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
787
788 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
789}
790
Jim Flynnac25a1b2019-02-28 10:40:49 +0000791void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100792 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000793 const char* name)
794{
Jim Flynne242f2d2019-05-22 14:24:13 +0100795 VisitConcatLayer(layer, mergerDescriptor, name);
796}
797
798void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
799 const armnn::ConcatDescriptor& concatDescriptor,
800 const char* name)
801{
Jan Eilers8eb25602020-03-09 12:13:48 +0000802 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000803
Jim Flynne242f2d2019-05-22 14:24:13 +0100804 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000805
806 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100807 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000808 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100809 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000810 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100811 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000812 {
813 origins.push_back(origin[d]);
814 }
815 auto view = m_flatBufferBuilder.CreateVector(origins);
816 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
817 views.push_back(uintVector);
818 }
819
Jim Flynne242f2d2019-05-22 14:24:13 +0100820 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
821 concatDescriptor.GetConcatAxis(),
822 concatDescriptor.GetNumViews(),
823 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000824 m_flatBufferBuilder.CreateVector(views));
825
Jim Flynne242f2d2019-05-22 14:24:13 +0100826 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
827 flatBufferConcatBaseLayer,
828 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000829
Jim Flynne242f2d2019-05-22 14:24:13 +0100830 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000831}
832
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000833void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000834{
Jan Eilers8eb25602020-03-09 12:13:48 +0000835 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000836
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000837 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
838 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
839 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000840
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000841 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000842}
843
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000844void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
845 const armnn::PadDescriptor& padDescriptor,
846 const char* name)
847{
Jan Eilers8eb25602020-03-09 12:13:48 +0000848 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000849
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000850 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
851
852 std::vector<unsigned int> padList;
853 for (auto& p: padDescriptor.m_PadList)
854 {
855 padList.push_back(p.first);
856 padList.push_back(p.second);
857 }
858
859 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100860 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100861 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000862
863 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
864 flatBufferBaseLayer,
865 flatBufferPadDesc);
866
867 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
868}
869
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000870void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
871 const armnn::PermuteDescriptor& permuteDescriptor,
872 const char* name)
873{
Jan Eilers8eb25602020-03-09 12:13:48 +0000874 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000875
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000876 // Create FlatBuffer BaseLayer
877 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
878
879 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100880 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000881 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100882 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000883 }
884
885 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
886 m_flatBufferBuilder.CreateVector(dimMappings));
887
888 // Create the FlatBuffer PermuteLayer
889 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
890 flatBufferPermuteBaseLayer,
891 flatBufferPermuteDesc);
892
893 // Add the AnyLayer to the FlatBufferLayers
894 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
895}
896
Finn Williams2605b232020-06-10 15:53:46 +0100897// Build FlatBuffer for Rank Layer
898void SerializerVisitor::VisitRankLayer(const armnn::IConnectableLayer* layer,
899 const char* name)
900{
901 IgnoreUnused(name);
902 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rank);
903 auto flatBufferRankLayer = serializer::CreateRankLayer(m_flatBufferBuilder, flatBufferBaseLayer);
904
905 CreateAnyLayer(flatBufferRankLayer.o, serializer::Layer::Layer_RankLayer);
906}
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000907
908void SerializerVisitor::VisitReduceLayer(const armnn::IConnectableLayer* layer,
909 const armnn::ReduceDescriptor& reduceDescriptor,
910 const char*)
911{
912 auto fbReduceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reduce);
913 auto fbDescriptor = CreateReduceDescriptor(m_flatBufferBuilder,
Sadik Armagan0c3ea5b2021-02-03 09:29:30 +0000914 reduceDescriptor.m_KeepDims,
915 m_flatBufferBuilder.CreateVector(reduceDescriptor.m_vAxis),
916 GetFlatBufferReduceOperation(reduceDescriptor.m_ReduceOperation));
917 auto fbReduceLayer = serializer::CreateReduceLayer(m_flatBufferBuilder,
918 fbReduceBaseLayer,
919 fbDescriptor);
920
921 CreateAnyLayer(fbReduceLayer.o, serializer::Layer::Layer_ReduceLayer);
922}
923
Saoirse Stewart263829c2019-02-19 15:54:14 +0000924// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000925void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000926 const armnn::ReshapeDescriptor& reshapeDescriptor,
927 const char* name)
928{
Jan Eilers8eb25602020-03-09 12:13:48 +0000929 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000930
Saoirse Stewart263829c2019-02-19 15:54:14 +0000931 // Create FlatBuffer BaseLayer
932 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
933
934 std::vector<unsigned int> targetShape;
935 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
936 {
937 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
938 }
939
940 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
941 m_flatBufferBuilder.CreateVector(targetShape));
942
943 // Create the FlatBuffer ReshapeLayer
944 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
945 flatBufferReshapeDesc);
946
947 // Add the AnyLayer to the FlatBufferLayers
948 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
949}
950
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000951void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
952 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
953 const char* name)
954{
Jan Eilers8eb25602020-03-09 12:13:48 +0000955 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000956
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000957 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
958
959 auto flatBufferDescriptor =
960 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
961 resizeDescriptor.m_TargetWidth,
962 resizeDescriptor.m_TargetHeight,
David Monahan4a0c9b92020-05-30 09:48:39 +0100963 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
964 resizeDescriptor.m_AlignCorners,
965 resizeDescriptor.m_HalfPixelCenters);
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000966
967 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
968 flatBufferBaseLayer,
969 flatBufferDescriptor);
970
971 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
972}
973
Teresa Charlina9075df2019-06-27 15:41:57 +0100974void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
975 const armnn::ResizeDescriptor& resizeDescriptor,
976 const char* name)
977{
Jan Eilers8eb25602020-03-09 12:13:48 +0000978 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000979
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100980 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
981
982 auto flatBufferDescriptor =
983 CreateResizeDescriptor(m_flatBufferBuilder,
984 resizeDescriptor.m_TargetHeight,
985 resizeDescriptor.m_TargetWidth,
986 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +0100987 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
988 resizeDescriptor.m_AlignCorners,
989 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100990
991 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
992 flatBufferBaseLayer,
993 flatBufferDescriptor);
994
995 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100996}
997
Sadik Armagan8b42a382019-03-01 14:24:49 +0000998void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
999{
Jan Eilers8eb25602020-03-09 12:13:48 +00001000 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001001
Sadik Armagan8b42a382019-03-01 14:24:49 +00001002 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
1003 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
1004
1005 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
1006}
1007
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001008void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
1009 const armnn::SliceDescriptor& sliceDescriptor,
1010 const char* name)
1011{
Jan Eilers8eb25602020-03-09 12:13:48 +00001012 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001013
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01001014 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
1015 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
1016 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
1017 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
1018
1019 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
1020
1021 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001022}
1023
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001024// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001025void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
1026 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001027 const char* name)
1028{
Jan Eilers8eb25602020-03-09 12:13:48 +00001029 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001030
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001031 // Create FlatBuffer BaseLayer
1032 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
1033
1034 // Create the FlatBuffer SoftmaxDescriptor
1035 auto flatBufferSoftmaxDesc =
1036 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
1037
1038 // Create the FlatBuffer SoftmaxLayer
1039 auto flatBufferSoftmaxLayer =
1040 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
1041 flatBufferSoftmaxBaseLayer,
1042 flatBufferSoftmaxDesc);
1043
1044 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
1045}
1046
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001047void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
1048 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001049 const char* name)
1050{
Jan Eilers8eb25602020-03-09 12:13:48 +00001051 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001052
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001053 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
1054 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
1055 m_flatBufferBuilder,
1056 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
1057 pooling2dDescriptor.m_PadLeft,
1058 pooling2dDescriptor.m_PadRight,
1059 pooling2dDescriptor.m_PadTop,
1060 pooling2dDescriptor.m_PadBottom,
1061 pooling2dDescriptor.m_PoolWidth,
1062 pooling2dDescriptor.m_PoolHeight,
1063 pooling2dDescriptor.m_StrideX,
1064 pooling2dDescriptor.m_StrideY,
1065 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
1066 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
1067 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
1068
1069 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1070 fbPooling2dBaseLayer,
1071 fbPooling2dDescriptor);
1072
1073 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1074}
1075
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001076void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
1077 const char* name)
1078{
Jan Eilers8eb25602020-03-09 12:13:48 +00001079 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001080
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001081 // Create FlatBuffer BaseLayer
1082 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1083
1084 // Create the FlatBuffer AdditionLayer
1085 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1086
1087 // Add the AnyLayer to the FlatBufferLayers
1088 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001089}
1090
Derek Lamberti87acb272019-03-27 16:51:31 +00001091void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
1092{
Jan Eilers8eb25602020-03-09 12:13:48 +00001093 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001094
Derek Lamberti87acb272019-03-27 16:51:31 +00001095 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1096 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1097 fbQuantizeBaseLayer);
1098 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1099}
1100
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001101// Build FlatBuffer for FullyConnected Layer
1102void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1103 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
1104 const armnn::ConstTensor& weights,
1105 const armnn::Optional<armnn::ConstTensor>& biases,
1106 const char* name)
1107{
Jan Eilers8eb25602020-03-09 12:13:48 +00001108 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001109
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001110 // Create FlatBuffer BaseLayer
1111 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1112
1113 // Create FlatBuffer FullyConnectedDescriptor
1114 auto flatBufferDescriptor =
1115 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1116 fullyConnectedDescriptor.m_BiasEnabled,
1117 fullyConnectedDescriptor.m_TransposeWeightMatrix);
1118
1119 // Create FlatBuffer weights data
1120 auto flatBufferWeights = CreateConstTensorInfo(weights);
1121
1122 // Create FlatBuffer bias data
1123 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
1124 if (fullyConnectedDescriptor.m_BiasEnabled)
1125 {
1126 flatBufferBiases = CreateConstTensorInfo(biases.value());
1127 }
1128
1129 // Create FlatBuffer FullyConnectedLayer
1130 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1131 flatBufferBaseLayer,
1132 flatBufferDescriptor,
1133 flatBufferWeights,
1134 flatBufferBiases);
1135
1136 // Add created FullyConnectedLayer to the FlatBufferLayers
1137 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1138}
1139
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001140// Build FlatBuffer for SpaceToBatchNd Layer
1141void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
1142 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1143 const char* name)
1144{
Jan Eilers8eb25602020-03-09 12:13:48 +00001145 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001146
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001147 // Create FlatBuffer BaseLayer
1148 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1149
1150 std::vector<unsigned int> padList;
1151 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1152 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1153 {
1154 padList.push_back(pad.first);
1155 padList.push_back(pad.second);
1156 }
1157
1158 auto flatBufferDescriptor =
1159 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1160 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1161 m_flatBufferBuilder.CreateVector(padList),
1162 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1163
1164 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1165 flatBufferBaseLayer,
1166 flatBufferDescriptor);
1167
1168 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1169}
1170
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001171// Build FlatBuffer for SpaceToDepthLayer
1172void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
1173 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1174 const char* name)
1175{
Jan Eilers8eb25602020-03-09 12:13:48 +00001176 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001177
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001178 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1179 auto flatBufferDescriptor =
1180 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1181 spaceToDepthDescriptor.m_BlockSize,
1182 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1183
1184 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1185 flatBufferBaseLayer,
1186 flatBufferDescriptor);
1187
1188 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001189}
1190
Jim Flynn18ce3382019-03-08 11:08:30 +00001191// Build FlatBuffer for Splitter Layer
1192void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
1193 const armnn::ViewsDescriptor& viewsDescriptor,
1194 const char* name)
1195{
Jan Eilers8eb25602020-03-09 12:13:48 +00001196 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001197
Jim Flynn18ce3382019-03-08 11:08:30 +00001198 // Create FlatBuffer ViewOrigins
1199 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1200 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1201
1202 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1203 {
1204 std::vector<uint32_t> viewOrigin;
1205 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1206
1207 // Copy vector
1208 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1209 {
1210 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1211 }
1212
1213 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1214 m_flatBufferBuilder.CreateVector(viewOrigin)));
1215 }
1216
1217 // Create FlatBuffer OriginsDescriptor
1218 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1219 viewsDescriptor.GetOrigins().GetConcatAxis(),
1220 viewsDescriptor.GetOrigins().GetNumViews(),
1221 viewsDescriptor.GetOrigins().GetNumDimensions(),
1222 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1223
1224 // Create FlatBuffer ViewOrigins
1225 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1226 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1227
1228 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1229 {
1230 std::vector<uint32_t> viewSize;
1231 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1232
1233 // Copy vector
1234 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1235 {
1236 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1237 }
1238
1239 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1240 m_flatBufferBuilder.CreateVector(viewSize)));
1241 }
1242
1243 // Create FlatBuffer ViewsDescriptor
1244 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1245 flatBufferOriginDescriptor,
1246 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1247
1248 // Create FlatBuffer BaseLayer
1249 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1250
1251 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1252 flatBufferBaseLayer,
1253 flatBufferViewsDescriptor);
1254
1255 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1256}
1257
Nina Drozd57728782019-02-27 10:53:27 +00001258void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
1259 const armnn::NormalizationDescriptor& descriptor,
1260 const char* name)
1261{
Jan Eilers8eb25602020-03-09 12:13:48 +00001262 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001263
Nina Drozd57728782019-02-27 10:53:27 +00001264 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1265
1266 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1267 m_flatBufferBuilder,
1268 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1269 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1270 descriptor.m_NormSize,
1271 descriptor.m_Alpha,
1272 descriptor.m_Beta,
1273 descriptor.m_K,
1274 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1275
1276 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1277 fbNormalizationBaseLayer,
1278 fbNormalizationDescriptor);
1279
1280 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1281}
1282
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001283void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1284 const armnn::StackDescriptor& stackDescriptor,
1285 const char* name)
1286{
Jan Eilers8eb25602020-03-09 12:13:48 +00001287 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001288
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001289 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1290
1291 std::vector<unsigned int> inputShape;
1292 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1293 {
1294 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1295 }
1296
1297 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1298 stackDescriptor.m_Axis,
1299 stackDescriptor.m_NumInputs,
1300 m_flatBufferBuilder.CreateVector(inputShape));
1301
1302 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1303 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001304}
1305
Derek Lamberti013c3902019-10-21 10:46:16 +01001306void SerializerVisitor::VisitStandInLayer(const armnn::IConnectableLayer *layer,
1307 const armnn::StandInDescriptor& standInDescriptor,
1308 const char *name)
1309{
Jan Eilers8eb25602020-03-09 12:13:48 +00001310 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001311
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001312 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1313 standInDescriptor.m_NumInputs,
1314 standInDescriptor.m_NumOutputs);
1315
1316 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1317 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1318
1319 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001320}
1321
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001322void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1323 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1324 const char* name)
1325{
Jan Eilers8eb25602020-03-09 12:13:48 +00001326 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001327
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001328 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1329
1330 auto flatBufferDescriptor =
1331 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1332 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1333 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1334 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1335 stridedSliceDescriptor.m_BeginMask,
1336 stridedSliceDescriptor.m_EndMask,
1337 stridedSliceDescriptor.m_ShrinkAxisMask,
1338 stridedSliceDescriptor.m_EllipsisMask,
1339 stridedSliceDescriptor.m_NewAxisMask,
1340 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1341
1342 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1343 flatBufferBaseLayer,
1344 flatBufferDescriptor);
1345
1346 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1347}
1348
Conor Kennedyda1f9752019-03-01 14:37:12 +00001349void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1350{
Jan Eilers8eb25602020-03-09 12:13:48 +00001351 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001352
Conor Kennedyda1f9752019-03-01 14:37:12 +00001353 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1354 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1355
1356 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1357}
1358
Sadik Armaganeff363d2019-04-05 15:25:46 +01001359void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1360{
Jan Eilers8eb25602020-03-09 12:13:48 +00001361 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001362
Sadik Armaganeff363d2019-04-05 15:25:46 +01001363 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1364 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1365
1366 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1367}
1368
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001369void SerializerVisitor::VisitTransposeConvolution2dLayer(
1370 const armnn::IConnectableLayer* layer,
1371 const armnn::TransposeConvolution2dDescriptor& descriptor,
1372 const armnn::ConstTensor& weights,
1373 const armnn::Optional<armnn::ConstTensor>& biases,
1374 const char* name)
1375{
Jan Eilers8eb25602020-03-09 12:13:48 +00001376 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001377
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001378 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1379 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1380 descriptor.m_PadLeft,
1381 descriptor.m_PadRight,
1382 descriptor.m_PadTop,
1383 descriptor.m_PadBottom,
1384 descriptor.m_StrideX,
1385 descriptor.m_StrideY,
1386 descriptor.m_BiasEnabled,
1387 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1388
1389 // weights & biases
1390 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1391 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1392 if (biases.has_value())
1393 {
1394 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1395 }
1396
1397 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1398 fbBaseLayer,
1399 fbDescriptor,
1400 fbWeightsConstTensorInfo,
1401 fbBiasesConstTensorInfo);
1402
1403 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001404}
1405
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001406void SerializerVisitor::VisitTransposeLayer(const armnn::IConnectableLayer* layer,
1407 const armnn::TransposeDescriptor& descriptor,
1408 const char* name)
1409{
Jan Eilers8eb25602020-03-09 12:13:48 +00001410 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001411
1412 // Create FlatBuffer BaseLayer
1413 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1414
1415 std::vector<unsigned int> dimMappings;
1416 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1417 {
1418 dimMappings.push_back(descriptor.m_DimMappings[i]);
1419 }
1420
1421 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1422 m_flatBufferBuilder.CreateVector(dimMappings));
1423
1424 // Create the FlatBuffer TransposeLayer
1425 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1426 flatBufferBaseLayer,
1427 flatBufferDesc);
1428
1429 // Add the AnyLayer to the FlatBufferLayers
1430 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1431}
1432
James Conroy586a9aa2020-03-20 08:49:33 +00001433void SerializerVisitor::VisitQLstmLayer(const armnn::IConnectableLayer* layer,
1434 const armnn::QLstmDescriptor& descriptor,
1435 const armnn::LstmInputParams& params,
1436 const char* name)
1437{
James Conroy8d333182020-05-13 10:27:58 +01001438 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001439
James Conroy8d333182020-05-13 10:27:58 +01001440 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1441
1442 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1443 m_flatBufferBuilder,
1444 descriptor.m_CifgEnabled,
1445 descriptor.m_PeepholeEnabled,
1446 descriptor.m_ProjectionEnabled,
1447 descriptor.m_LayerNormEnabled,
1448 descriptor.m_CellClip,
1449 descriptor.m_ProjectionClip,
1450 descriptor.m_InputIntermediateScale,
1451 descriptor.m_ForgetIntermediateScale,
1452 descriptor.m_CellIntermediateScale,
1453 descriptor.m_OutputIntermediateScale,
1454 descriptor.m_HiddenStateZeroPoint,
1455 descriptor.m_HiddenStateScale
1456 );
1457
1458 // Mandatory params
1459 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
1460 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
1461 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
1462 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
1463 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
1464 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
1465 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
1466 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
1467 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
1468
1469 // CIFG
1470 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1471 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1472 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1473
1474 if (!descriptor.m_CifgEnabled)
1475 {
1476 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
1477 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
1478 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
1479 }
1480
1481 // Projectiom
1482 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1483 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1484
1485 if (descriptor.m_ProjectionEnabled)
1486 {
1487 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
1488 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
1489 }
1490
1491 // Peephole
1492 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1493 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1494 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1495
1496 if (descriptor.m_PeepholeEnabled)
1497 {
1498 if (!descriptor.m_CifgEnabled)
1499 {
1500 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
1501 }
1502
1503 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
1504 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
1505 }
1506
1507 // Layer norm
1508 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1509 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1510 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1511 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1512
1513 if (descriptor.m_LayerNormEnabled)
1514 {
1515 if (!descriptor.m_CifgEnabled)
1516 {
1517 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
1518 }
1519
1520 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
1521 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
1522 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
1523 }
1524
1525 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1526 m_flatBufferBuilder,
1527 inputToForgetWeights,
1528 inputToCellWeights,
1529 inputToOutputWeights,
1530 recurrentToForgetWeights,
1531 recurrentToCellWeights,
1532 recurrentToOutputWeights,
1533 forgetGateBias,
1534 cellBias,
1535 outputGateBias,
1536 inputToInputWeights,
1537 recurrentToInputWeights,
1538 inputGateBias,
1539 projectionWeights,
1540 projectionBias,
1541 cellToInputWeights,
1542 cellToForgetWeights,
1543 cellToOutputWeights,
1544 inputLayerNormWeights,
1545 forgetLayerNormWeights,
1546 cellLayerNormWeights,
1547 outputLayerNormWeights);
1548
1549 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1550 m_flatBufferBuilder,
1551 fbQLstmBaseLayer,
1552 fbQLstmDescriptor,
1553 fbQLstmParams);
1554
1555 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001556}
1557
James Conroyee18dc82019-07-17 11:27:46 +01001558void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1559 const armnn::QuantizedLstmInputParams& params,
1560 const char* name)
1561{
Jan Eilers8eb25602020-03-09 12:13:48 +00001562 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001563
Jan Eilers5b01a892019-07-23 09:47:43 +01001564 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1565
1566 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001567 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1568 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1569 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1570 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001571
Francis Murtaghbb590b42019-08-14 09:51:36 +01001572 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1573 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1574 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1575 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001576
Francis Murtaghbb590b42019-08-14 09:51:36 +01001577 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1578 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1579 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1580 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001581
1582 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1583 m_flatBufferBuilder,
1584 inputToInputWeights,
1585 inputToForgetWeights,
1586 inputToCellWeights,
1587 inputToOutputWeights,
1588 recurrentToInputWeights,
1589 recurrentToForgetWeights,
1590 recurrentToCellWeights,
1591 recurrentToOutputWeights,
1592 inputGateBias,
1593 forgetGateBias,
1594 cellBias,
1595 outputGateBias);
1596
1597 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1598 m_flatBufferBuilder,
1599 fbQuantizedLstmBaseLayer,
1600 fbQuantizedLstmParams);
1601
1602 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001603}
1604
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001605fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001606 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001607{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001608
Sadik Armagandb059fd2019-03-20 12:28:32 +00001609 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1610
Mike Kelly8c1701a2019-02-11 17:01:27 +00001611 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1612 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1613
1614 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001615 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001616 m_flatBufferBuilder.CreateString(layer->GetName()),
1617 layerType,
1618 m_flatBufferBuilder.CreateVector(inputSlots),
1619 m_flatBufferBuilder.CreateVector(outputSlots));
1620}
1621
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001622void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001623{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001624
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001625 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001626 m_serializedLayers.push_back(anyLayer);
1627}
1628
Mike Kellya0766c32019-02-19 17:22:07 +00001629template <typename T>
1630flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1631{
1632 const T* buffer = reinterpret_cast<const T*>(memory);
1633 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1634 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1635 return fbVector;
1636}
1637
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001638flatbuffers::Offset<TensorInfo> SerializerVisitor::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001639{
Mike Kellya0766c32019-02-19 17:22:07 +00001640 // Get the dimensions
1641 std::vector<unsigned int> shape;
Mike Kellya0766c32019-02-19 17:22:07 +00001642 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1643 {
1644 shape.push_back(tensorInfo.GetShape()[dim]);
1645 }
1646
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001647 if (tensorInfo.HasPerAxisQuantization())
1648 {
1649 // Create FlatBuffer TensorInfo
1650 auto flatBufferTensorInfo =
1651 serializer::CreateTensorInfo(m_flatBufferBuilder,
1652 m_flatBufferBuilder.CreateVector(shape),
1653 GetFlatBufferDataType(tensorInfo.GetDataType()),
1654 tensorInfo.GetQuantizationScales()[0],
1655 tensorInfo.GetQuantizationOffset(),
1656 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001657 tensorInfo.GetQuantizationDim().value(),
1658 static_cast<unsigned int>
1659 (tensorInfo.GetShape().GetDimensionality()));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001660 return flatBufferTensorInfo;
1661 }
1662
Mike Kellya0766c32019-02-19 17:22:07 +00001663 // Create FlatBuffer TensorInfo
1664 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1665 m_flatBufferBuilder.CreateVector(shape),
1666 GetFlatBufferDataType(tensorInfo.GetDataType()),
1667 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001668 tensorInfo.GetQuantizationOffset(),
1669 0,
1670 0,
1671 static_cast<unsigned int>
1672 (tensorInfo.GetShape().GetDimensionality()));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001673 return flatBufferTensorInfo;
1674}
1675
1676flatbuffers::Offset<serializer::ConstTensor>
1677 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
1678{
1679 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1680
Mike Kellya0766c32019-02-19 17:22:07 +00001681 flatbuffers::Offset<void> fbPayload;
1682
1683 switch (tensorInfo.GetDataType())
1684 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001685 case armnn::DataType::Float32:
1686 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001687 {
1688 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1689 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1690 m_flatBufferBuilder,
1691 fbVector);
1692 fbPayload = flatBuffersData.o;
1693 break;
1694 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001695 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001696 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001697 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001698 {
1699 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1700 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1701 m_flatBufferBuilder,
1702 fbVector);
1703 fbPayload = flatBuffersData.o;
1704 break;
1705 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001706 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001707 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001708 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001709 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001710 default:
1711 {
1712 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1713 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1714 m_flatBufferBuilder,
1715 fbVector);
1716 fbPayload = flatBuffersData.o;
1717 }
1718 }
1719 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1720 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001721 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001722 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1723 fbPayload);
1724 return flatBufferConstTensor;
1725}
1726
Tee Jungaa920c52019-11-05 10:48:25 +00001727flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerVisitor::GetVersionTable()
1728{
1729 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1730 serializer::CreateFeatureCompatibilityVersions(
1731 m_flatBufferBuilder,
1732 1 // Binding ids scheme version
1733 );
1734 return versionsTable;
1735}
1736
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001737std::vector<fb::Offset<serializer::InputSlot>>
1738 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001739{
Mike Kellya0766c32019-02-19 17:22:07 +00001740 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001741
1742 // Get the InputSlots
1743 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1744 {
1745 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1746
1747 // Get the Connection for the InputSlot
1748 const IOutputSlot* connection = inputSlot.GetConnection();
1749
1750 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001751 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1752 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001753 // Create FlatBuffer InputSlot
1754 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1755 }
1756 return inputSlots;
1757}
1758
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001759std::vector<fb::Offset<serializer::OutputSlot>>
1760 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001761{
1762 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1763
1764 // Get the OutputSlots
1765 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1766 {
1767 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001768 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001769
Mike Kelly8c1701a2019-02-11 17:01:27 +00001770 // Create FlatBuffer Outputslot
1771 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1772 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001773 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001774 }
1775 return outputSlots;
1776}
1777
Finn Williams85d36712021-01-26 22:30:06 +00001778void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001779{
1780 // Iterate through to network
1781 inNetwork.Accept(m_SerializerVisitor);
1782 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1783
1784 // Create FlatBuffer SerializedGraph
1785 auto serializedGraph = serializer::CreateSerializedGraph(
1786 fbBuilder,
1787 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1788 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
Tee Jungaa920c52019-11-05 10:48:25 +00001789 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()),
1790 m_SerializerVisitor.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001791
1792 // Serialize the graph
1793 fbBuilder.Finish(serializedGraph);
1794}
1795
Finn Williams85d36712021-01-26 22:30:06 +00001796bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001797{
1798 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1799
Matthew Sloyan0663d662020-09-14 11:47:26 +01001800 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001801 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001802 return !stream.bad();
1803}
1804
Finn Williams85d36712021-01-26 22:30:06 +00001805
Finn Williams2605b232020-06-10 15:53:46 +01001806} // namespace armnnSerializer