blob: a2217a3dc4391d2c796139518a08fb81e081c091 [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,
914 reduceDescriptor.m_TargetHeight,
915 reduceDescriptor.m_TargetWidth,
916 reduceDescriptor.m_KeepDims,
917 m_flatBufferBuilder.CreateVector(reduceDescriptor.m_vAxis),
918 GetFlatBufferReduceOperation(reduceDescriptor.m_ReduceOperation));
919 auto fbReduceLayer = serializer::CreateReduceLayer(m_flatBufferBuilder,
920 fbReduceBaseLayer,
921 fbDescriptor);
922
923 CreateAnyLayer(fbReduceLayer.o, serializer::Layer::Layer_ReduceLayer);
924}
925
Saoirse Stewart263829c2019-02-19 15:54:14 +0000926// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000927void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000928 const armnn::ReshapeDescriptor& reshapeDescriptor,
929 const char* name)
930{
Jan Eilers8eb25602020-03-09 12:13:48 +0000931 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000932
Saoirse Stewart263829c2019-02-19 15:54:14 +0000933 // Create FlatBuffer BaseLayer
934 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
935
936 std::vector<unsigned int> targetShape;
937 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
938 {
939 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
940 }
941
942 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
943 m_flatBufferBuilder.CreateVector(targetShape));
944
945 // Create the FlatBuffer ReshapeLayer
946 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
947 flatBufferReshapeDesc);
948
949 // Add the AnyLayer to the FlatBufferLayers
950 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
951}
952
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000953void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
954 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
955 const char* name)
956{
Jan Eilers8eb25602020-03-09 12:13:48 +0000957 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000958
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000959 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
960
961 auto flatBufferDescriptor =
962 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
963 resizeDescriptor.m_TargetWidth,
964 resizeDescriptor.m_TargetHeight,
David Monahan4a0c9b92020-05-30 09:48:39 +0100965 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
966 resizeDescriptor.m_AlignCorners,
967 resizeDescriptor.m_HalfPixelCenters);
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000968
969 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
970 flatBufferBaseLayer,
971 flatBufferDescriptor);
972
973 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
974}
975
Teresa Charlina9075df2019-06-27 15:41:57 +0100976void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
977 const armnn::ResizeDescriptor& resizeDescriptor,
978 const char* name)
979{
Jan Eilers8eb25602020-03-09 12:13:48 +0000980 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000981
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100982 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
983
984 auto flatBufferDescriptor =
985 CreateResizeDescriptor(m_flatBufferBuilder,
986 resizeDescriptor.m_TargetHeight,
987 resizeDescriptor.m_TargetWidth,
988 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +0100989 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
990 resizeDescriptor.m_AlignCorners,
991 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100992
993 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
994 flatBufferBaseLayer,
995 flatBufferDescriptor);
996
997 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100998}
999
Sadik Armagan8b42a382019-03-01 14:24:49 +00001000void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
1001{
Jan Eilers8eb25602020-03-09 12:13:48 +00001002 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001003
Sadik Armagan8b42a382019-03-01 14:24:49 +00001004 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
1005 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
1006
1007 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
1008}
1009
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001010void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
1011 const armnn::SliceDescriptor& sliceDescriptor,
1012 const char* name)
1013{
Jan Eilers8eb25602020-03-09 12:13:48 +00001014 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001015
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +01001016 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
1017 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
1018 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
1019 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
1020
1021 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
1022
1023 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +01001024}
1025
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001026// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001027void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
1028 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001029 const char* name)
1030{
Jan Eilers8eb25602020-03-09 12:13:48 +00001031 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001032
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +00001033 // Create FlatBuffer BaseLayer
1034 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
1035
1036 // Create the FlatBuffer SoftmaxDescriptor
1037 auto flatBufferSoftmaxDesc =
1038 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
1039
1040 // Create the FlatBuffer SoftmaxLayer
1041 auto flatBufferSoftmaxLayer =
1042 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
1043 flatBufferSoftmaxBaseLayer,
1044 flatBufferSoftmaxDesc);
1045
1046 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
1047}
1048
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001049void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
1050 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001051 const char* name)
1052{
Jan Eilers8eb25602020-03-09 12:13:48 +00001053 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001054
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001055 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
1056 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
1057 m_flatBufferBuilder,
1058 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
1059 pooling2dDescriptor.m_PadLeft,
1060 pooling2dDescriptor.m_PadRight,
1061 pooling2dDescriptor.m_PadTop,
1062 pooling2dDescriptor.m_PadBottom,
1063 pooling2dDescriptor.m_PoolWidth,
1064 pooling2dDescriptor.m_PoolHeight,
1065 pooling2dDescriptor.m_StrideX,
1066 pooling2dDescriptor.m_StrideY,
1067 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
1068 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
1069 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
1070
1071 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1072 fbPooling2dBaseLayer,
1073 fbPooling2dDescriptor);
1074
1075 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1076}
1077
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001078void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
1079 const char* name)
1080{
Jan Eilers8eb25602020-03-09 12:13:48 +00001081 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001082
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001083 // Create FlatBuffer BaseLayer
1084 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1085
1086 // Create the FlatBuffer AdditionLayer
1087 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1088
1089 // Add the AnyLayer to the FlatBufferLayers
1090 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001091}
1092
Derek Lamberti87acb272019-03-27 16:51:31 +00001093void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
1094{
Jan Eilers8eb25602020-03-09 12:13:48 +00001095 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001096
Derek Lamberti87acb272019-03-27 16:51:31 +00001097 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1098 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1099 fbQuantizeBaseLayer);
1100 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1101}
1102
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001103// Build FlatBuffer for FullyConnected Layer
1104void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1105 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
1106 const armnn::ConstTensor& weights,
1107 const armnn::Optional<armnn::ConstTensor>& biases,
1108 const char* name)
1109{
Jan Eilers8eb25602020-03-09 12:13:48 +00001110 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001111
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001112 // Create FlatBuffer BaseLayer
1113 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1114
1115 // Create FlatBuffer FullyConnectedDescriptor
1116 auto flatBufferDescriptor =
1117 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1118 fullyConnectedDescriptor.m_BiasEnabled,
1119 fullyConnectedDescriptor.m_TransposeWeightMatrix);
1120
1121 // Create FlatBuffer weights data
1122 auto flatBufferWeights = CreateConstTensorInfo(weights);
1123
1124 // Create FlatBuffer bias data
1125 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
1126 if (fullyConnectedDescriptor.m_BiasEnabled)
1127 {
1128 flatBufferBiases = CreateConstTensorInfo(biases.value());
1129 }
1130
1131 // Create FlatBuffer FullyConnectedLayer
1132 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1133 flatBufferBaseLayer,
1134 flatBufferDescriptor,
1135 flatBufferWeights,
1136 flatBufferBiases);
1137
1138 // Add created FullyConnectedLayer to the FlatBufferLayers
1139 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1140}
1141
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001142// Build FlatBuffer for SpaceToBatchNd Layer
1143void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
1144 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1145 const char* name)
1146{
Jan Eilers8eb25602020-03-09 12:13:48 +00001147 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001148
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001149 // Create FlatBuffer BaseLayer
1150 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1151
1152 std::vector<unsigned int> padList;
1153 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1154 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1155 {
1156 padList.push_back(pad.first);
1157 padList.push_back(pad.second);
1158 }
1159
1160 auto flatBufferDescriptor =
1161 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1162 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1163 m_flatBufferBuilder.CreateVector(padList),
1164 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1165
1166 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1167 flatBufferBaseLayer,
1168 flatBufferDescriptor);
1169
1170 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1171}
1172
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001173// Build FlatBuffer for SpaceToDepthLayer
1174void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
1175 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1176 const char* name)
1177{
Jan Eilers8eb25602020-03-09 12:13:48 +00001178 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001179
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001180 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1181 auto flatBufferDescriptor =
1182 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1183 spaceToDepthDescriptor.m_BlockSize,
1184 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1185
1186 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1187 flatBufferBaseLayer,
1188 flatBufferDescriptor);
1189
1190 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001191}
1192
Jim Flynn18ce3382019-03-08 11:08:30 +00001193// Build FlatBuffer for Splitter Layer
1194void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
1195 const armnn::ViewsDescriptor& viewsDescriptor,
1196 const char* name)
1197{
Jan Eilers8eb25602020-03-09 12:13:48 +00001198 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001199
Jim Flynn18ce3382019-03-08 11:08:30 +00001200 // Create FlatBuffer ViewOrigins
1201 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1202 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1203
1204 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1205 {
1206 std::vector<uint32_t> viewOrigin;
1207 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1208
1209 // Copy vector
1210 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1211 {
1212 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1213 }
1214
1215 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1216 m_flatBufferBuilder.CreateVector(viewOrigin)));
1217 }
1218
1219 // Create FlatBuffer OriginsDescriptor
1220 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1221 viewsDescriptor.GetOrigins().GetConcatAxis(),
1222 viewsDescriptor.GetOrigins().GetNumViews(),
1223 viewsDescriptor.GetOrigins().GetNumDimensions(),
1224 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1225
1226 // Create FlatBuffer ViewOrigins
1227 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1228 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1229
1230 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1231 {
1232 std::vector<uint32_t> viewSize;
1233 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1234
1235 // Copy vector
1236 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1237 {
1238 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1239 }
1240
1241 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1242 m_flatBufferBuilder.CreateVector(viewSize)));
1243 }
1244
1245 // Create FlatBuffer ViewsDescriptor
1246 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1247 flatBufferOriginDescriptor,
1248 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1249
1250 // Create FlatBuffer BaseLayer
1251 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1252
1253 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1254 flatBufferBaseLayer,
1255 flatBufferViewsDescriptor);
1256
1257 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1258}
1259
Nina Drozd57728782019-02-27 10:53:27 +00001260void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
1261 const armnn::NormalizationDescriptor& descriptor,
1262 const char* name)
1263{
Jan Eilers8eb25602020-03-09 12:13:48 +00001264 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001265
Nina Drozd57728782019-02-27 10:53:27 +00001266 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1267
1268 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1269 m_flatBufferBuilder,
1270 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1271 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1272 descriptor.m_NormSize,
1273 descriptor.m_Alpha,
1274 descriptor.m_Beta,
1275 descriptor.m_K,
1276 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1277
1278 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1279 fbNormalizationBaseLayer,
1280 fbNormalizationDescriptor);
1281
1282 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1283}
1284
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001285void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1286 const armnn::StackDescriptor& stackDescriptor,
1287 const char* name)
1288{
Jan Eilers8eb25602020-03-09 12:13:48 +00001289 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001290
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001291 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1292
1293 std::vector<unsigned int> inputShape;
1294 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1295 {
1296 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1297 }
1298
1299 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1300 stackDescriptor.m_Axis,
1301 stackDescriptor.m_NumInputs,
1302 m_flatBufferBuilder.CreateVector(inputShape));
1303
1304 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1305 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001306}
1307
Derek Lamberti013c3902019-10-21 10:46:16 +01001308void SerializerVisitor::VisitStandInLayer(const armnn::IConnectableLayer *layer,
1309 const armnn::StandInDescriptor& standInDescriptor,
1310 const char *name)
1311{
Jan Eilers8eb25602020-03-09 12:13:48 +00001312 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001313
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001314 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1315 standInDescriptor.m_NumInputs,
1316 standInDescriptor.m_NumOutputs);
1317
1318 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1319 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1320
1321 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001322}
1323
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001324void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1325 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1326 const char* name)
1327{
Jan Eilers8eb25602020-03-09 12:13:48 +00001328 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001329
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001330 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1331
1332 auto flatBufferDescriptor =
1333 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1334 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1335 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1336 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1337 stridedSliceDescriptor.m_BeginMask,
1338 stridedSliceDescriptor.m_EndMask,
1339 stridedSliceDescriptor.m_ShrinkAxisMask,
1340 stridedSliceDescriptor.m_EllipsisMask,
1341 stridedSliceDescriptor.m_NewAxisMask,
1342 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1343
1344 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1345 flatBufferBaseLayer,
1346 flatBufferDescriptor);
1347
1348 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1349}
1350
Conor Kennedyda1f9752019-03-01 14:37:12 +00001351void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1352{
Jan Eilers8eb25602020-03-09 12:13:48 +00001353 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001354
Conor Kennedyda1f9752019-03-01 14:37:12 +00001355 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1356 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1357
1358 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1359}
1360
Sadik Armaganeff363d2019-04-05 15:25:46 +01001361void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1362{
Jan Eilers8eb25602020-03-09 12:13:48 +00001363 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001364
Sadik Armaganeff363d2019-04-05 15:25:46 +01001365 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1366 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1367
1368 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1369}
1370
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001371void SerializerVisitor::VisitTransposeConvolution2dLayer(
1372 const armnn::IConnectableLayer* layer,
1373 const armnn::TransposeConvolution2dDescriptor& descriptor,
1374 const armnn::ConstTensor& weights,
1375 const armnn::Optional<armnn::ConstTensor>& biases,
1376 const char* name)
1377{
Jan Eilers8eb25602020-03-09 12:13:48 +00001378 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001379
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001380 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1381 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1382 descriptor.m_PadLeft,
1383 descriptor.m_PadRight,
1384 descriptor.m_PadTop,
1385 descriptor.m_PadBottom,
1386 descriptor.m_StrideX,
1387 descriptor.m_StrideY,
1388 descriptor.m_BiasEnabled,
1389 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1390
1391 // weights & biases
1392 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1393 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1394 if (biases.has_value())
1395 {
1396 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1397 }
1398
1399 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1400 fbBaseLayer,
1401 fbDescriptor,
1402 fbWeightsConstTensorInfo,
1403 fbBiasesConstTensorInfo);
1404
1405 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001406}
1407
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001408void SerializerVisitor::VisitTransposeLayer(const armnn::IConnectableLayer* layer,
1409 const armnn::TransposeDescriptor& descriptor,
1410 const char* name)
1411{
Jan Eilers8eb25602020-03-09 12:13:48 +00001412 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001413
1414 // Create FlatBuffer BaseLayer
1415 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1416
1417 std::vector<unsigned int> dimMappings;
1418 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1419 {
1420 dimMappings.push_back(descriptor.m_DimMappings[i]);
1421 }
1422
1423 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1424 m_flatBufferBuilder.CreateVector(dimMappings));
1425
1426 // Create the FlatBuffer TransposeLayer
1427 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1428 flatBufferBaseLayer,
1429 flatBufferDesc);
1430
1431 // Add the AnyLayer to the FlatBufferLayers
1432 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1433}
1434
James Conroy586a9aa2020-03-20 08:49:33 +00001435void SerializerVisitor::VisitQLstmLayer(const armnn::IConnectableLayer* layer,
1436 const armnn::QLstmDescriptor& descriptor,
1437 const armnn::LstmInputParams& params,
1438 const char* name)
1439{
James Conroy8d333182020-05-13 10:27:58 +01001440 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001441
James Conroy8d333182020-05-13 10:27:58 +01001442 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1443
1444 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1445 m_flatBufferBuilder,
1446 descriptor.m_CifgEnabled,
1447 descriptor.m_PeepholeEnabled,
1448 descriptor.m_ProjectionEnabled,
1449 descriptor.m_LayerNormEnabled,
1450 descriptor.m_CellClip,
1451 descriptor.m_ProjectionClip,
1452 descriptor.m_InputIntermediateScale,
1453 descriptor.m_ForgetIntermediateScale,
1454 descriptor.m_CellIntermediateScale,
1455 descriptor.m_OutputIntermediateScale,
1456 descriptor.m_HiddenStateZeroPoint,
1457 descriptor.m_HiddenStateScale
1458 );
1459
1460 // Mandatory params
1461 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
1462 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
1463 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
1464 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
1465 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
1466 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
1467 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
1468 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
1469 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
1470
1471 // CIFG
1472 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1473 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1474 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1475
1476 if (!descriptor.m_CifgEnabled)
1477 {
1478 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
1479 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
1480 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
1481 }
1482
1483 // Projectiom
1484 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1485 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1486
1487 if (descriptor.m_ProjectionEnabled)
1488 {
1489 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
1490 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
1491 }
1492
1493 // Peephole
1494 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1495 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1496 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1497
1498 if (descriptor.m_PeepholeEnabled)
1499 {
1500 if (!descriptor.m_CifgEnabled)
1501 {
1502 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
1503 }
1504
1505 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
1506 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
1507 }
1508
1509 // Layer norm
1510 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1511 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1512 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1513 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1514
1515 if (descriptor.m_LayerNormEnabled)
1516 {
1517 if (!descriptor.m_CifgEnabled)
1518 {
1519 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
1520 }
1521
1522 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
1523 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
1524 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
1525 }
1526
1527 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1528 m_flatBufferBuilder,
1529 inputToForgetWeights,
1530 inputToCellWeights,
1531 inputToOutputWeights,
1532 recurrentToForgetWeights,
1533 recurrentToCellWeights,
1534 recurrentToOutputWeights,
1535 forgetGateBias,
1536 cellBias,
1537 outputGateBias,
1538 inputToInputWeights,
1539 recurrentToInputWeights,
1540 inputGateBias,
1541 projectionWeights,
1542 projectionBias,
1543 cellToInputWeights,
1544 cellToForgetWeights,
1545 cellToOutputWeights,
1546 inputLayerNormWeights,
1547 forgetLayerNormWeights,
1548 cellLayerNormWeights,
1549 outputLayerNormWeights);
1550
1551 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1552 m_flatBufferBuilder,
1553 fbQLstmBaseLayer,
1554 fbQLstmDescriptor,
1555 fbQLstmParams);
1556
1557 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001558}
1559
James Conroyee18dc82019-07-17 11:27:46 +01001560void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1561 const armnn::QuantizedLstmInputParams& params,
1562 const char* name)
1563{
Jan Eilers8eb25602020-03-09 12:13:48 +00001564 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001565
Jan Eilers5b01a892019-07-23 09:47:43 +01001566 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1567
1568 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001569 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1570 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1571 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1572 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001573
Francis Murtaghbb590b42019-08-14 09:51:36 +01001574 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1575 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1576 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1577 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001578
Francis Murtaghbb590b42019-08-14 09:51:36 +01001579 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1580 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1581 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1582 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001583
1584 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1585 m_flatBufferBuilder,
1586 inputToInputWeights,
1587 inputToForgetWeights,
1588 inputToCellWeights,
1589 inputToOutputWeights,
1590 recurrentToInputWeights,
1591 recurrentToForgetWeights,
1592 recurrentToCellWeights,
1593 recurrentToOutputWeights,
1594 inputGateBias,
1595 forgetGateBias,
1596 cellBias,
1597 outputGateBias);
1598
1599 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1600 m_flatBufferBuilder,
1601 fbQuantizedLstmBaseLayer,
1602 fbQuantizedLstmParams);
1603
1604 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001605}
1606
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001607fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001608 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001609{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001610
Sadik Armagandb059fd2019-03-20 12:28:32 +00001611 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1612
Mike Kelly8c1701a2019-02-11 17:01:27 +00001613 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1614 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1615
1616 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001617 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001618 m_flatBufferBuilder.CreateString(layer->GetName()),
1619 layerType,
1620 m_flatBufferBuilder.CreateVector(inputSlots),
1621 m_flatBufferBuilder.CreateVector(outputSlots));
1622}
1623
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001624void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001625{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001626
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001627 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001628 m_serializedLayers.push_back(anyLayer);
1629}
1630
Mike Kellya0766c32019-02-19 17:22:07 +00001631template <typename T>
1632flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1633{
1634 const T* buffer = reinterpret_cast<const T*>(memory);
1635 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1636 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1637 return fbVector;
1638}
1639
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001640flatbuffers::Offset<TensorInfo> SerializerVisitor::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001641{
Mike Kellya0766c32019-02-19 17:22:07 +00001642 // Get the dimensions
1643 std::vector<unsigned int> shape;
Mike Kellya0766c32019-02-19 17:22:07 +00001644 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1645 {
1646 shape.push_back(tensorInfo.GetShape()[dim]);
1647 }
1648
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001649 if (tensorInfo.HasPerAxisQuantization())
1650 {
1651 // Create FlatBuffer TensorInfo
1652 auto flatBufferTensorInfo =
1653 serializer::CreateTensorInfo(m_flatBufferBuilder,
1654 m_flatBufferBuilder.CreateVector(shape),
1655 GetFlatBufferDataType(tensorInfo.GetDataType()),
1656 tensorInfo.GetQuantizationScales()[0],
1657 tensorInfo.GetQuantizationOffset(),
1658 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001659 tensorInfo.GetQuantizationDim().value(),
1660 static_cast<unsigned int>
1661 (tensorInfo.GetShape().GetDimensionality()));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001662 return flatBufferTensorInfo;
1663 }
1664
Mike Kellya0766c32019-02-19 17:22:07 +00001665 // Create FlatBuffer TensorInfo
1666 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1667 m_flatBufferBuilder.CreateVector(shape),
1668 GetFlatBufferDataType(tensorInfo.GetDataType()),
1669 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001670 tensorInfo.GetQuantizationOffset(),
1671 0,
1672 0,
1673 static_cast<unsigned int>
1674 (tensorInfo.GetShape().GetDimensionality()));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001675 return flatBufferTensorInfo;
1676}
1677
1678flatbuffers::Offset<serializer::ConstTensor>
1679 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
1680{
1681 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1682
Mike Kellya0766c32019-02-19 17:22:07 +00001683 flatbuffers::Offset<void> fbPayload;
1684
1685 switch (tensorInfo.GetDataType())
1686 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001687 case armnn::DataType::Float32:
1688 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001689 {
1690 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1691 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1692 m_flatBufferBuilder,
1693 fbVector);
1694 fbPayload = flatBuffersData.o;
1695 break;
1696 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001697 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001698 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001699 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001700 {
1701 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1702 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1703 m_flatBufferBuilder,
1704 fbVector);
1705 fbPayload = flatBuffersData.o;
1706 break;
1707 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001708 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001709 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001710 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001711 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001712 default:
1713 {
1714 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1715 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1716 m_flatBufferBuilder,
1717 fbVector);
1718 fbPayload = flatBuffersData.o;
1719 }
1720 }
1721 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1722 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001723 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001724 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1725 fbPayload);
1726 return flatBufferConstTensor;
1727}
1728
Tee Jungaa920c52019-11-05 10:48:25 +00001729flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerVisitor::GetVersionTable()
1730{
1731 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1732 serializer::CreateFeatureCompatibilityVersions(
1733 m_flatBufferBuilder,
1734 1 // Binding ids scheme version
1735 );
1736 return versionsTable;
1737}
1738
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001739std::vector<fb::Offset<serializer::InputSlot>>
1740 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001741{
Mike Kellya0766c32019-02-19 17:22:07 +00001742 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001743
1744 // Get the InputSlots
1745 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1746 {
1747 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1748
1749 // Get the Connection for the InputSlot
1750 const IOutputSlot* connection = inputSlot.GetConnection();
1751
1752 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001753 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1754 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001755 // Create FlatBuffer InputSlot
1756 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1757 }
1758 return inputSlots;
1759}
1760
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001761std::vector<fb::Offset<serializer::OutputSlot>>
1762 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001763{
1764 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1765
1766 // Get the OutputSlots
1767 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1768 {
1769 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001770 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001771
Mike Kelly8c1701a2019-02-11 17:01:27 +00001772 // Create FlatBuffer Outputslot
1773 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1774 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001775 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001776 }
1777 return outputSlots;
1778}
1779
Finn Williams85d36712021-01-26 22:30:06 +00001780void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001781{
1782 // Iterate through to network
1783 inNetwork.Accept(m_SerializerVisitor);
1784 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1785
1786 // Create FlatBuffer SerializedGraph
1787 auto serializedGraph = serializer::CreateSerializedGraph(
1788 fbBuilder,
1789 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1790 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
Tee Jungaa920c52019-11-05 10:48:25 +00001791 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()),
1792 m_SerializerVisitor.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001793
1794 // Serialize the graph
1795 fbBuilder.Finish(serializedGraph);
1796}
1797
Finn Williams85d36712021-01-26 22:30:06 +00001798bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001799{
1800 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1801
Matthew Sloyan0663d662020-09-14 11:47:26 +01001802 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001803 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001804 return !stream.bad();
1805}
1806
Finn Williams85d36712021-01-26 22:30:06 +00001807
Finn Williams2605b232020-06-10 15:53:46 +01001808} // namespace armnnSerializer