blob: 9c62a93e3b85538567f23d0a211ef35d27866d2a [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "Serializer.hpp"
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00007
Matthew Benthamff130e22020-01-17 11:47:42 +00008#include <armnn/Descriptors.hpp>
9#include <armnn/LstmParams.hpp>
10#include <armnn/QuantizedLstmParams.hpp>
Jan Eilers8eb25602020-03-09 12:13:48 +000011#include <armnn/utility/IgnoreUnused.hpp>
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
Aron Virginas-Tard4f0fea2019-04-09 14:08:06 +010015#include <boost/numeric/conversion/cast.hpp>
Mike Kelly8c1701a2019-02-11 17:01:27 +000016#include <flatbuffers/util.h>
17
Matthew Benthamff130e22020-01-17 11:47:42 +000018#include "SerializerUtils.hpp"
19
Mike Kelly8c1701a2019-02-11 17:01:27 +000020using namespace armnn;
21namespace fb = flatbuffers;
Derek Lamberti0028d1b2019-02-20 13:57:42 +000022namespace serializer = armnnSerializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000023
24namespace armnnSerializer
25{
26
Mike Kellyaf484012019-02-20 16:53:11 +000027serializer::ActivationFunction GetFlatBufferActivationFunction(armnn::ActivationFunction function)
28{
29 switch (function)
30 {
31 case armnn::ActivationFunction::Sigmoid:
32 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
33 case armnn::ActivationFunction::TanH:
34 return serializer::ActivationFunction::ActivationFunction_TanH;
35 case armnn::ActivationFunction::Linear:
36 return serializer::ActivationFunction::ActivationFunction_Linear;
37 case armnn::ActivationFunction::ReLu:
38 return serializer::ActivationFunction::ActivationFunction_ReLu;
39 case armnn::ActivationFunction::BoundedReLu:
40 return serializer::ActivationFunction::ActivationFunction_BoundedReLu;
41 case armnn::ActivationFunction::LeakyReLu:
42 return serializer::ActivationFunction::ActivationFunction_LeakyReLu;
43 case armnn::ActivationFunction::Abs:
44 return serializer::ActivationFunction::ActivationFunction_Abs;
45 case armnn::ActivationFunction::Sqrt:
46 return serializer::ActivationFunction::ActivationFunction_Sqrt;
47 case armnn::ActivationFunction::Square:
48 return serializer::ActivationFunction::ActivationFunction_Square;
David Monahan3b3c3812020-02-25 09:03:29 +000049 case armnn::ActivationFunction::Elu:
50 return serializer::ActivationFunction::ActivationFunction_Elu;
Colm Donelan03fbeaf2020-02-26 15:39:23 +000051 case armnn::ActivationFunction::HardSwish:
52 return serializer::ActivationFunction::ActivationFunction_HardSwish;
Mike Kellyaf484012019-02-20 16:53:11 +000053 default:
54 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
55 }
56}
57
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010058serializer::ArgMinMaxFunction GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)
59{
60 switch (function)
61 {
62 case armnn::ArgMinMaxFunction::Max:
63 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
64 case armnn::ArgMinMaxFunction::Min:
65 default:
66 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
67 }
68}
69
janeil013fec1ea2019-11-07 09:47:20 +000070uint32_t SerializerVisitor::GetSerializedId(armnn::LayerGuid guid)
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000071{
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000072 if (m_guidMap.empty())
73 {
janeil013fec1ea2019-11-07 09:47:20 +000074 m_guidMap.insert(std::make_pair(guid, m_layerId));
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000075 }
76 else if (m_guidMap.find(guid) == m_guidMap.end())
77 {
janeil013fec1ea2019-11-07 09:47:20 +000078 ++m_layerId;
79 m_guidMap.insert(std::make_pair(guid, m_layerId));
80
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000081 return m_layerId;
82 }
Saoirse Stewart30211042019-02-18 17:19:16 +000083 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000084}
85
Mike Kelly8c1701a2019-02-11 17:01:27 +000086// Build FlatBuffer for Input Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +000087void SerializerVisitor::VisitInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +000088{
Jan Eilers8eb25602020-03-09 12:13:48 +000089 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +000090
Mike Kelly8c1701a2019-02-11 17:01:27 +000091 // Create FlatBuffer BaseLayer
92 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
93
94 // Create FlatBuffer BindableBaseLayer
95 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
96 flatBufferInputBaseLayer,
97 id);
Tee Jungaa920c52019-11-05 10:48:25 +000098 // Push layer binding id to outputIds.
99 m_inputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000100
101 // Create the FlatBuffer InputLayer
102 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
103
104 // Add the AnyLayer to the FlatBufferLayers
105 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
106}
107
108// Build FlatBuffer for Output Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000109void SerializerVisitor::VisitOutputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000110{
Jan Eilers8eb25602020-03-09 12:13:48 +0000111 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000112
Mike Kelly8c1701a2019-02-11 17:01:27 +0000113 // Create FlatBuffer BaseLayer
114 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
115
116 // Create FlatBuffer BindableBaseLayer
117 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
118 flatBufferOutputBaseLayer,
119 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000120 // Push layer binding id to outputIds.
121 m_outputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000122
123 // Create the FlatBuffer OutputLayer
124 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
125 // Add the AnyLayer to the FlatBufferLayers
126 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
127}
128
Kevin May868eb142019-09-04 17:29:31 +0100129void SerializerVisitor::VisitAbsLayer(const armnn::IConnectableLayer* layer, const char* name)
130{
Jan Eilers8eb25602020-03-09 12:13:48 +0000131 IgnoreUnused(name);
FinnWilliamsArm4ffcc8f2019-09-05 14:34:20 +0100132 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Abs);
133 auto flatBufferAbsLayer = serializer::CreateAbsLayer(m_flatBufferBuilder, flatBufferBaseLayer);
134
135 CreateAnyLayer(flatBufferAbsLayer.o, serializer::Layer::Layer_AbsLayer);
Kevin May868eb142019-09-04 17:29:31 +0100136}
137
Mike Kellyaf484012019-02-20 16:53:11 +0000138// Build FlatBuffer for Activation Layer
139void SerializerVisitor::VisitActivationLayer(const armnn::IConnectableLayer* layer,
140 const armnn::ActivationDescriptor& descriptor,
141 const char* name)
142{
Jan Eilers8eb25602020-03-09 12:13:48 +0000143 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000144
Mike Kellyaf484012019-02-20 16:53:11 +0000145 // Create FlatBuffer BaseLayer
146 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
147
148 // Create the FlatBuffer ActivationDescriptor
149 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
150 GetFlatBufferActivationFunction(descriptor.m_Function),
151 descriptor.m_A,
152 descriptor.m_B);
153
154 // Create the FlatBuffer ActivationLayer
155 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
156 flatBufferBaseLayer,
157 flatBufferDescriptor);
158
159 // Add the AnyLayer to the FlatBufferLayers
160 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
161}
162
Mike Kelly8c1701a2019-02-11 17:01:27 +0000163// Build FlatBuffer for Addition Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000164void SerializerVisitor::VisitAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000165{
Jan Eilers8eb25602020-03-09 12:13:48 +0000166 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000167
Mike Kelly8c1701a2019-02-11 17:01:27 +0000168 // Create FlatBuffer BaseLayer
169 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
170
171 // Create the FlatBuffer AdditionLayer
172 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
173
174 // Add the AnyLayer to the FlatBufferLayers
175 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
176}
177
Nikhil Rajee391d52019-09-05 17:50:44 +0100178// Build FlatBuffer for ArgMinMax Layer
179void SerializerVisitor::VisitArgMinMaxLayer(const armnn::IConnectableLayer *layer,
180 const armnn::ArgMinMaxDescriptor& descriptor,
181 const char *name)
182{
Jan Eilers8eb25602020-03-09 12:13:48 +0000183 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000184
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100185 // Create FlatBuffer BaseLayer
186 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
187
188 // Create FlatBuffer Descriptor
189 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
190 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
191 descriptor.m_Axis);
192
193 // Create FlatBuffer ArgMinMaxLayer
194 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
195 flatBufferBaseLayer,
196 flatBufferDescriptor);
197
198 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100199}
200
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000201// Build FlatBuffer for BatchToSpaceNd Layer
202void SerializerVisitor::VisitBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
203 const armnn::BatchToSpaceNdDescriptor& descriptor,
204 const char* name)
205{
Jan Eilers8eb25602020-03-09 12:13:48 +0000206 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000207
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000208 // Create FlatBuffer BaseLayer
209 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
210
211 std::vector<unsigned int> crops;
212 crops.reserve(descriptor.m_Crops.size() * 2);
213 for (auto& crop : descriptor.m_Crops)
214 {
215 crops.push_back(crop.first);
216 crops.push_back(crop.second);
217 }
218
219 auto flatBufferDescriptor =
220 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
221 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
222 m_flatBufferBuilder.CreateVector(crops),
223 GetFlatBufferDataLayout(descriptor.m_DataLayout));
224
225 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
226 flatBufferBaseLayer,
227 flatBufferDescriptor);
228
229 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
230}
231
ruoyan018e7fa232019-02-28 15:09:07 +0000232void SerializerVisitor::VisitBatchNormalizationLayer(const armnn::IConnectableLayer* layer,
233 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
234 const armnn::ConstTensor& mean,
235 const armnn::ConstTensor& variance,
236 const armnn::ConstTensor& beta,
237 const armnn::ConstTensor& gamma,
238 const char* name)
239{
Jan Eilers8eb25602020-03-09 12:13:48 +0000240 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000241
ruoyan018e7fa232019-02-28 15:09:07 +0000242 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
243 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
244 m_flatBufferBuilder,
245 batchNormDescriptor.m_Eps,
246 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
247
248 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
249 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
250 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
251 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
252 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
253 fbBatchNormalizationBaseLayer,
254 fbBatchNormalizationDescriptor,
255 fbMeanConstTensorInfo,
256 fbVarianceConstTensorInfo,
257 fbBetaConstTensorInfo,
258 fbGammaConstTensorInfo);
259
260 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
261}
262
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100263void SerializerVisitor::VisitComparisonLayer(const armnn::IConnectableLayer* layer,
264 const armnn::ComparisonDescriptor& descriptor,
265 const char* name)
266{
Jan Eilers8eb25602020-03-09 12:13:48 +0000267 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000268
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100269 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
270 auto fbDescriptor = serializer::CreateComparisonDescriptor(
271 m_flatBufferBuilder,
272 GetFlatBufferComparisonOperation(descriptor.m_Operation));
273
274 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
275 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100276}
277
Conor Kennedy76277882019-02-26 08:29:54 +0000278// Build FlatBuffer for Constant Layer
279void SerializerVisitor::VisitConstantLayer(const armnn::IConnectableLayer* layer,
280 const armnn::ConstTensor& input,
281 const char* name)
282{
Jan Eilers8eb25602020-03-09 12:13:48 +0000283 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000284
Conor Kennedy76277882019-02-26 08:29:54 +0000285 // Create FlatBuffer BaseLayer
286 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
287
288 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
289
290 // Create the FlatBuffer ConstantLayer
291 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
292 flatBufferConstantBaseLayer,
293 flatBufferConstTensorInfo);
294
295 // Add the AnyLayer to the FlatBufferLayers
296 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
297}
298
Mike Kellya0766c32019-02-19 17:22:07 +0000299// Build FlatBuffer for Convolution2dLayer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000300void SerializerVisitor::VisitConvolution2dLayer(const armnn::IConnectableLayer* layer,
301 const armnn::Convolution2dDescriptor& descriptor,
302 const armnn::ConstTensor& weights,
303 const armnn::Optional<armnn::ConstTensor>& biases,
Mike Kellya0766c32019-02-19 17:22:07 +0000304 const char* name)
305{
Jan Eilers8eb25602020-03-09 12:13:48 +0000306 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000307
Mike Kellya0766c32019-02-19 17:22:07 +0000308 // Create FlatBuffer BaseLayer
309 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
310
311 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
312 descriptor.m_PadLeft,
313 descriptor.m_PadRight,
314 descriptor.m_PadTop,
315 descriptor.m_PadBottom,
316 descriptor.m_StrideX,
317 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100318 descriptor.m_DilationX,
319 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000320 descriptor.m_BiasEnabled,
321 GetFlatBufferDataLayout(descriptor.m_DataLayout));
322 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
323 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
324
325 if (biases.has_value())
326 {
327 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
328 }
329
330 // Create the FlatBuffer Convolution2dLayer
331 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
332 flatBufferBaseLayer,
333 flatBufferDescriptor,
334 flatBufferWeightsConstTensorInfo,
335 flatBufferBiasesConstTensorInfo);
336
337 // Add the AnyLayer to the FlatBufferLayers
338 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
339}
340
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100341void SerializerVisitor::VisitDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
342 const armnn::DepthToSpaceDescriptor& descriptor,
343 const char* name)
344{
Jan Eilers8eb25602020-03-09 12:13:48 +0000345 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000346
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100347 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
348 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
349 descriptor.m_BlockSize,
350 GetFlatBufferDataLayout(descriptor.m_DataLayout));
351
352 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
353
354 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100355}
356
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000357void SerializerVisitor::VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
358 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
359 const armnn::ConstTensor& weights,
360 const armnn::Optional<armnn::ConstTensor>& biases,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000361 const char* name)
362{
Jan Eilers8eb25602020-03-09 12:13:48 +0000363 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000364
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000365 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
366 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
367 descriptor.m_PadLeft,
368 descriptor.m_PadRight,
369 descriptor.m_PadTop,
370 descriptor.m_PadBottom,
371 descriptor.m_StrideX,
372 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100373 descriptor.m_DilationX,
374 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000375 descriptor.m_BiasEnabled,
376 GetFlatBufferDataLayout(descriptor.m_DataLayout));
377
378 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
379 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
380 if (biases.has_value())
381 {
382 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
383 }
384
385 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
386 fbBaseLayer,
387 fbDescriptor,
388 fbWeightsConstTensorInfo,
389 fbBiasesConstTensorInfo);
390
391 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
392}
393
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000394void SerializerVisitor::VisitDequantizeLayer(const armnn::IConnectableLayer* layer,
395 const char* name)
396{
Jan Eilers8eb25602020-03-09 12:13:48 +0000397 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000398
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000399 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
400 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
401
402 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
403}
404
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000405void SerializerVisitor::VisitDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
406 const armnn::DetectionPostProcessDescriptor& descriptor,
407 const armnn::ConstTensor& anchors,
408 const char* name)
409{
Jan Eilers8eb25602020-03-09 12:13:48 +0000410 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000411
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000412 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
413 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
414 descriptor.m_MaxDetections,
415 descriptor.m_MaxClassesPerDetection,
416 descriptor.m_DetectionsPerClass,
417 descriptor.m_NmsScoreThreshold,
418 descriptor.m_NmsIouThreshold,
419 descriptor.m_NumClasses,
420 descriptor.m_UseRegularNms,
421 descriptor.m_ScaleX,
422 descriptor.m_ScaleY,
423 descriptor.m_ScaleW,
424 descriptor.m_ScaleH);
425
426 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
427
428 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
429 fbBaseLayer,
430 fbDescriptor,
431 fbAnchorsConstTensorInfo);
432
433 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
434}
435
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000436void SerializerVisitor::VisitDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
437{
Jan Eilers8eb25602020-03-09 12:13:48 +0000438 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000439
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000440 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
441 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000442
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000443 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
444}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000445
josh minor4a3c6102020-01-06 16:40:46 -0600446void SerializerVisitor::VisitElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
447 const armnn::ElementwiseUnaryDescriptor& descriptor,
448 const char* name)
449{
Jan Eilers8eb25602020-03-09 12:13:48 +0000450 IgnoreUnused(name);
josh minor4a3c6102020-01-06 16:40:46 -0600451
452 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
453 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
454 m_flatBufferBuilder,
455 GetFlatBufferUnaryOperation(descriptor.m_Operation));
456
457 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
458 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
459}
460
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000461void SerializerVisitor::VisitEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
462{
Jan Eilers8eb25602020-03-09 12:13:48 +0000463 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000464
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000465 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
466 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
467
468 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
469}
470
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000471void SerializerVisitor::VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
472{
Jan Eilers8eb25602020-03-09 12:13:48 +0000473 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000474
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000475 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
476 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
477
478 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
479}
480
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000481void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer, const char* name)
482{
Jan Eilers8eb25602020-03-09 12:13:48 +0000483 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000484
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000485 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
486 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000487
488 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
489}
490
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000491void SerializerVisitor::VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
492{
Jan Eilers8eb25602020-03-09 12:13:48 +0000493 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000494
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000495 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000496 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000497
498 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
499}
500
Kevin Mayce5045a2019-10-02 14:07:47 +0100501void SerializerVisitor::VisitInstanceNormalizationLayer(
502 const armnn::IConnectableLayer* layer,
503 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
504 const char* name)
505{
Jan Eilers8eb25602020-03-09 12:13:48 +0000506 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000507
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100508 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
509 m_flatBufferBuilder,
510 instanceNormalizationDescriptor.m_Gamma,
511 instanceNormalizationDescriptor.m_Beta,
512 instanceNormalizationDescriptor.m_Eps,
513 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
514
515 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
516 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
517
518 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100519}
520
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000521void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
522 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
523 const char* name)
524{
Jan Eilers8eb25602020-03-09 12:13:48 +0000525 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000526
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000527 // Create FlatBuffer BaseLayer
528 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
529
530 // Create the FlatBuffer L2Normalization Descriptor
531 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100532 m_flatBufferBuilder,
533 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
534 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000535
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100536 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000537 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
538
539 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
540}
541
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100542void SerializerVisitor::VisitLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
543 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
544 const char* name)
545{
Jan Eilers8eb25602020-03-09 12:13:48 +0000546 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000547
Sadik Armagan26257852019-10-14 13:00:47 +0100548 // Create FlatBuffer BaseLayer
549 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
550
551 // Create the FlatBuffer LogSoftmaxDescriptor
552 auto flatBufferLogSoftmaxDesc =
553 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
554 logSoftmaxDescriptor.m_Beta,
555 logSoftmaxDescriptor.m_Axis);
556
557 // Create the FlatBuffer LogSoftmaxLayer
558 auto flatBufferLogSoftmaxLayer =
559 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
560 flatBufferLogSoftmaxBaseLayer,
561 flatBufferLogSoftmaxDesc);
562
563 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100564}
565
566void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer,
567 const armnn::LstmDescriptor& descriptor,
568 const armnn::LstmInputParams& params,
569 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000570{
Jan Eilers8eb25602020-03-09 12:13:48 +0000571 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000572
Jim Flynn11af3752019-03-19 17:22:29 +0000573 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
574
575 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
576 m_flatBufferBuilder,
577 descriptor.m_ActivationFunc,
578 descriptor.m_ClippingThresCell,
579 descriptor.m_ClippingThresProj,
580 descriptor.m_CifgEnabled,
581 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100582 descriptor.m_ProjectionEnabled,
583 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000584
585 // Get mandatory input parameters
586 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
587 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
588 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
589 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
590 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
591 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
592 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
593 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
594 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
595
596 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
597 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
598 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
599 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
600 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
601 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
602 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
603 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
604 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100605 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
606 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
607 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
608 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000609
610 if (!descriptor.m_CifgEnabled)
611 {
612 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
613 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
614 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
615 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
616 }
617
618 if (descriptor.m_ProjectionEnabled)
619 {
620 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
621 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
622 }
623
624 if (descriptor.m_PeepholeEnabled)
625 {
626 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
627 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
628 }
629
Jan Eilersf8c62972019-07-17 11:07:49 +0100630 if (descriptor.m_LayerNormEnabled)
631 {
632 if (!descriptor.m_CifgEnabled)
633 {
634 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
635 }
636 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
637 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
638 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
639 }
640
Jim Flynn11af3752019-03-19 17:22:29 +0000641 auto fbLstmParams = serializer::CreateLstmInputParams(
642 m_flatBufferBuilder,
643 inputToForgetWeights,
644 inputToCellWeights,
645 inputToOutputWeights,
646 recurrentToForgetWeights,
647 recurrentToCellWeights,
648 recurrentToOutputWeights,
649 forgetGateBias,
650 cellBias,
651 outputGateBias,
652 inputToInputWeights,
653 recurrentToInputWeights,
654 cellToInputWeights,
655 inputGateBias,
656 projectionWeights,
657 projectionBias,
658 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100659 cellToOutputWeights,
660 inputLayerNormWeights,
661 forgetLayerNormWeights,
662 cellLayerNormWeights,
663 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000664
665 auto fbLstmLayer = serializer::CreateLstmLayer(
666 m_flatBufferBuilder,
667 fbLstmBaseLayer,
668 fbLstmDescriptor,
669 fbLstmParams);
670
671 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
672}
673
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000674void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
675{
Jan Eilers8eb25602020-03-09 12:13:48 +0000676 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000677
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000678 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
679 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
680
681 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
682}
683
684void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
685 const armnn::MeanDescriptor& descriptor,
686 const char* name)
687{
Jan Eilers8eb25602020-03-09 12:13:48 +0000688 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000689
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000690 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
691 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
692 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
693 descriptor.m_KeepDims);
694
695 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
696 fbMeanBaseLayer,
697 fbMeanDescriptor);
698
699 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
700}
701
702void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
703{
Jan Eilers8eb25602020-03-09 12:13:48 +0000704 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000705
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000706 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
707 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
708
709 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
710}
711
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100712void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
713{
Jan Eilers8eb25602020-03-09 12:13:48 +0000714 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000715
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100716 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
717 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
718
719 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
720}
721
Jim Flynnac25a1b2019-02-28 10:40:49 +0000722void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100723 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000724 const char* name)
725{
Jim Flynne242f2d2019-05-22 14:24:13 +0100726 VisitConcatLayer(layer, mergerDescriptor, name);
727}
728
729void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
730 const armnn::ConcatDescriptor& concatDescriptor,
731 const char* name)
732{
Jan Eilers8eb25602020-03-09 12:13:48 +0000733 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000734
Jim Flynne242f2d2019-05-22 14:24:13 +0100735 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000736
737 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100738 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000739 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100740 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000741 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100742 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000743 {
744 origins.push_back(origin[d]);
745 }
746 auto view = m_flatBufferBuilder.CreateVector(origins);
747 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
748 views.push_back(uintVector);
749 }
750
Jim Flynne242f2d2019-05-22 14:24:13 +0100751 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
752 concatDescriptor.GetConcatAxis(),
753 concatDescriptor.GetNumViews(),
754 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000755 m_flatBufferBuilder.CreateVector(views));
756
Jim Flynne242f2d2019-05-22 14:24:13 +0100757 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
758 flatBufferConcatBaseLayer,
759 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000760
Jim Flynne242f2d2019-05-22 14:24:13 +0100761 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000762}
763
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000764void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000765{
Jan Eilers8eb25602020-03-09 12:13:48 +0000766 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000767
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000768 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
769 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
770 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000771
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000772 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000773}
774
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000775void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
776 const armnn::PadDescriptor& padDescriptor,
777 const char* name)
778{
Jan Eilers8eb25602020-03-09 12:13:48 +0000779 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000780
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000781 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
782
783 std::vector<unsigned int> padList;
784 for (auto& p: padDescriptor.m_PadList)
785 {
786 padList.push_back(p.first);
787 padList.push_back(p.second);
788 }
789
790 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100791 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100792 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000793
794 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
795 flatBufferBaseLayer,
796 flatBufferPadDesc);
797
798 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
799}
800
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000801void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
802 const armnn::PermuteDescriptor& permuteDescriptor,
803 const char* name)
804{
Jan Eilers8eb25602020-03-09 12:13:48 +0000805 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000806
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000807 // Create FlatBuffer BaseLayer
808 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
809
810 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100811 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000812 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100813 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000814 }
815
816 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
817 m_flatBufferBuilder.CreateVector(dimMappings));
818
819 // Create the FlatBuffer PermuteLayer
820 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
821 flatBufferPermuteBaseLayer,
822 flatBufferPermuteDesc);
823
824 // Add the AnyLayer to the FlatBufferLayers
825 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
826}
827
Saoirse Stewart263829c2019-02-19 15:54:14 +0000828// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000829void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000830 const armnn::ReshapeDescriptor& reshapeDescriptor,
831 const char* name)
832{
Jan Eilers8eb25602020-03-09 12:13:48 +0000833 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000834
Saoirse Stewart263829c2019-02-19 15:54:14 +0000835 // Create FlatBuffer BaseLayer
836 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
837
838 std::vector<unsigned int> targetShape;
839 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
840 {
841 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
842 }
843
844 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
845 m_flatBufferBuilder.CreateVector(targetShape));
846
847 // Create the FlatBuffer ReshapeLayer
848 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
849 flatBufferReshapeDesc);
850
851 // Add the AnyLayer to the FlatBufferLayers
852 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
853}
854
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000855void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
856 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
857 const char* name)
858{
Jan Eilers8eb25602020-03-09 12:13:48 +0000859 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000860
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000861 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
862
863 auto flatBufferDescriptor =
864 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
865 resizeDescriptor.m_TargetWidth,
866 resizeDescriptor.m_TargetHeight,
David Monahan4a0c9b92020-05-30 09:48:39 +0100867 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
868 resizeDescriptor.m_AlignCorners,
869 resizeDescriptor.m_HalfPixelCenters);
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000870
871 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
872 flatBufferBaseLayer,
873 flatBufferDescriptor);
874
875 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
876}
877
Teresa Charlina9075df2019-06-27 15:41:57 +0100878void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
879 const armnn::ResizeDescriptor& resizeDescriptor,
880 const char* name)
881{
Jan Eilers8eb25602020-03-09 12:13:48 +0000882 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000883
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100884 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
885
886 auto flatBufferDescriptor =
887 CreateResizeDescriptor(m_flatBufferBuilder,
888 resizeDescriptor.m_TargetHeight,
889 resizeDescriptor.m_TargetWidth,
890 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +0100891 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
892 resizeDescriptor.m_AlignCorners,
893 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100894
895 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
896 flatBufferBaseLayer,
897 flatBufferDescriptor);
898
899 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100900}
901
Sadik Armagan8b42a382019-03-01 14:24:49 +0000902void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
903{
Jan Eilers8eb25602020-03-09 12:13:48 +0000904 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000905
Sadik Armagan8b42a382019-03-01 14:24:49 +0000906 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
907 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
908
909 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
910}
911
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100912void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
913 const armnn::SliceDescriptor& sliceDescriptor,
914 const char* name)
915{
Jan Eilers8eb25602020-03-09 12:13:48 +0000916 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000917
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100918 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
919 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
920 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
921 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
922
923 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
924
925 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100926}
927
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000928// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000929void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
930 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000931 const char* name)
932{
Jan Eilers8eb25602020-03-09 12:13:48 +0000933 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000934
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000935 // Create FlatBuffer BaseLayer
936 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
937
938 // Create the FlatBuffer SoftmaxDescriptor
939 auto flatBufferSoftmaxDesc =
940 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
941
942 // Create the FlatBuffer SoftmaxLayer
943 auto flatBufferSoftmaxLayer =
944 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
945 flatBufferSoftmaxBaseLayer,
946 flatBufferSoftmaxDesc);
947
948 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
949}
950
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000951void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
952 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000953 const char* name)
954{
Jan Eilers8eb25602020-03-09 12:13:48 +0000955 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000956
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000957 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
958 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
959 m_flatBufferBuilder,
960 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
961 pooling2dDescriptor.m_PadLeft,
962 pooling2dDescriptor.m_PadRight,
963 pooling2dDescriptor.m_PadTop,
964 pooling2dDescriptor.m_PadBottom,
965 pooling2dDescriptor.m_PoolWidth,
966 pooling2dDescriptor.m_PoolHeight,
967 pooling2dDescriptor.m_StrideX,
968 pooling2dDescriptor.m_StrideY,
969 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
970 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
971 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
972
973 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
974 fbPooling2dBaseLayer,
975 fbPooling2dDescriptor);
976
977 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
978}
979
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100980void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
981 const char* name)
982{
Jan Eilers8eb25602020-03-09 12:13:48 +0000983 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000984
Ellen Norris-Thompson51982472019-06-19 11:46:21 +0100985 // Create FlatBuffer BaseLayer
986 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
987
988 // Create the FlatBuffer AdditionLayer
989 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
990
991 // Add the AnyLayer to the FlatBufferLayers
992 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100993}
994
Derek Lamberti87acb272019-03-27 16:51:31 +0000995void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
996{
Jan Eilers8eb25602020-03-09 12:13:48 +0000997 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000998
Derek Lamberti87acb272019-03-27 16:51:31 +0000999 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1000 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1001 fbQuantizeBaseLayer);
1002 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1003}
1004
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001005// Build FlatBuffer for FullyConnected Layer
1006void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1007 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
1008 const armnn::ConstTensor& weights,
1009 const armnn::Optional<armnn::ConstTensor>& biases,
1010 const char* name)
1011{
Jan Eilers8eb25602020-03-09 12:13:48 +00001012 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001013
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001014 // Create FlatBuffer BaseLayer
1015 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1016
1017 // Create FlatBuffer FullyConnectedDescriptor
1018 auto flatBufferDescriptor =
1019 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1020 fullyConnectedDescriptor.m_BiasEnabled,
1021 fullyConnectedDescriptor.m_TransposeWeightMatrix);
1022
1023 // Create FlatBuffer weights data
1024 auto flatBufferWeights = CreateConstTensorInfo(weights);
1025
1026 // Create FlatBuffer bias data
1027 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
1028 if (fullyConnectedDescriptor.m_BiasEnabled)
1029 {
1030 flatBufferBiases = CreateConstTensorInfo(biases.value());
1031 }
1032
1033 // Create FlatBuffer FullyConnectedLayer
1034 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1035 flatBufferBaseLayer,
1036 flatBufferDescriptor,
1037 flatBufferWeights,
1038 flatBufferBiases);
1039
1040 // Add created FullyConnectedLayer to the FlatBufferLayers
1041 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1042}
1043
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001044// Build FlatBuffer for SpaceToBatchNd Layer
1045void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
1046 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1047 const char* name)
1048{
Jan Eilers8eb25602020-03-09 12:13:48 +00001049 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001050
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001051 // Create FlatBuffer BaseLayer
1052 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1053
1054 std::vector<unsigned int> padList;
1055 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1056 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1057 {
1058 padList.push_back(pad.first);
1059 padList.push_back(pad.second);
1060 }
1061
1062 auto flatBufferDescriptor =
1063 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1064 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1065 m_flatBufferBuilder.CreateVector(padList),
1066 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1067
1068 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1069 flatBufferBaseLayer,
1070 flatBufferDescriptor);
1071
1072 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1073}
1074
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001075// Build FlatBuffer for SpaceToDepthLayer
1076void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
1077 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1078 const char* name)
1079{
Jan Eilers8eb25602020-03-09 12:13:48 +00001080 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001081
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001082 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1083 auto flatBufferDescriptor =
1084 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1085 spaceToDepthDescriptor.m_BlockSize,
1086 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1087
1088 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1089 flatBufferBaseLayer,
1090 flatBufferDescriptor);
1091
1092 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001093}
1094
Jim Flynn18ce3382019-03-08 11:08:30 +00001095// Build FlatBuffer for Splitter Layer
1096void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
1097 const armnn::ViewsDescriptor& viewsDescriptor,
1098 const char* name)
1099{
Jan Eilers8eb25602020-03-09 12:13:48 +00001100 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001101
Jim Flynn18ce3382019-03-08 11:08:30 +00001102 // Create FlatBuffer ViewOrigins
1103 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1104 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1105
1106 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1107 {
1108 std::vector<uint32_t> viewOrigin;
1109 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1110
1111 // Copy vector
1112 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1113 {
1114 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1115 }
1116
1117 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1118 m_flatBufferBuilder.CreateVector(viewOrigin)));
1119 }
1120
1121 // Create FlatBuffer OriginsDescriptor
1122 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1123 viewsDescriptor.GetOrigins().GetConcatAxis(),
1124 viewsDescriptor.GetOrigins().GetNumViews(),
1125 viewsDescriptor.GetOrigins().GetNumDimensions(),
1126 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1127
1128 // Create FlatBuffer ViewOrigins
1129 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1130 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1131
1132 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1133 {
1134 std::vector<uint32_t> viewSize;
1135 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1136
1137 // Copy vector
1138 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1139 {
1140 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1141 }
1142
1143 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1144 m_flatBufferBuilder.CreateVector(viewSize)));
1145 }
1146
1147 // Create FlatBuffer ViewsDescriptor
1148 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1149 flatBufferOriginDescriptor,
1150 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1151
1152 // Create FlatBuffer BaseLayer
1153 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1154
1155 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1156 flatBufferBaseLayer,
1157 flatBufferViewsDescriptor);
1158
1159 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1160}
1161
Nina Drozd57728782019-02-27 10:53:27 +00001162void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
1163 const armnn::NormalizationDescriptor& descriptor,
1164 const char* name)
1165{
Jan Eilers8eb25602020-03-09 12:13:48 +00001166 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001167
Nina Drozd57728782019-02-27 10:53:27 +00001168 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1169
1170 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1171 m_flatBufferBuilder,
1172 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1173 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1174 descriptor.m_NormSize,
1175 descriptor.m_Alpha,
1176 descriptor.m_Beta,
1177 descriptor.m_K,
1178 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1179
1180 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1181 fbNormalizationBaseLayer,
1182 fbNormalizationDescriptor);
1183
1184 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1185}
1186
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001187void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1188 const armnn::StackDescriptor& stackDescriptor,
1189 const char* name)
1190{
Jan Eilers8eb25602020-03-09 12:13:48 +00001191 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001192
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001193 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1194
1195 std::vector<unsigned int> inputShape;
1196 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1197 {
1198 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1199 }
1200
1201 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1202 stackDescriptor.m_Axis,
1203 stackDescriptor.m_NumInputs,
1204 m_flatBufferBuilder.CreateVector(inputShape));
1205
1206 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1207 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001208}
1209
Derek Lamberti013c3902019-10-21 10:46:16 +01001210void SerializerVisitor::VisitStandInLayer(const armnn::IConnectableLayer *layer,
1211 const armnn::StandInDescriptor& standInDescriptor,
1212 const char *name)
1213{
Jan Eilers8eb25602020-03-09 12:13:48 +00001214 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001215
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001216 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1217 standInDescriptor.m_NumInputs,
1218 standInDescriptor.m_NumOutputs);
1219
1220 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1221 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1222
1223 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001224}
1225
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001226void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1227 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1228 const char* name)
1229{
Jan Eilers8eb25602020-03-09 12:13:48 +00001230 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001231
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001232 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1233
1234 auto flatBufferDescriptor =
1235 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1236 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1237 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1238 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1239 stridedSliceDescriptor.m_BeginMask,
1240 stridedSliceDescriptor.m_EndMask,
1241 stridedSliceDescriptor.m_ShrinkAxisMask,
1242 stridedSliceDescriptor.m_EllipsisMask,
1243 stridedSliceDescriptor.m_NewAxisMask,
1244 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1245
1246 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1247 flatBufferBaseLayer,
1248 flatBufferDescriptor);
1249
1250 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1251}
1252
Conor Kennedyda1f9752019-03-01 14:37:12 +00001253void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1254{
Jan Eilers8eb25602020-03-09 12:13:48 +00001255 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001256
Conor Kennedyda1f9752019-03-01 14:37:12 +00001257 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1258 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1259
1260 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1261}
1262
Sadik Armaganeff363d2019-04-05 15:25:46 +01001263void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1264{
Jan Eilers8eb25602020-03-09 12:13:48 +00001265 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001266
Sadik Armaganeff363d2019-04-05 15:25:46 +01001267 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1268 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1269
1270 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1271}
1272
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001273void SerializerVisitor::VisitTransposeConvolution2dLayer(
1274 const armnn::IConnectableLayer* layer,
1275 const armnn::TransposeConvolution2dDescriptor& descriptor,
1276 const armnn::ConstTensor& weights,
1277 const armnn::Optional<armnn::ConstTensor>& biases,
1278 const char* name)
1279{
Jan Eilers8eb25602020-03-09 12:13:48 +00001280 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001281
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001282 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1283 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1284 descriptor.m_PadLeft,
1285 descriptor.m_PadRight,
1286 descriptor.m_PadTop,
1287 descriptor.m_PadBottom,
1288 descriptor.m_StrideX,
1289 descriptor.m_StrideY,
1290 descriptor.m_BiasEnabled,
1291 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1292
1293 // weights & biases
1294 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1295 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1296 if (biases.has_value())
1297 {
1298 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1299 }
1300
1301 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1302 fbBaseLayer,
1303 fbDescriptor,
1304 fbWeightsConstTensorInfo,
1305 fbBiasesConstTensorInfo);
1306
1307 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001308}
1309
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001310void SerializerVisitor::VisitTransposeLayer(const armnn::IConnectableLayer* layer,
1311 const armnn::TransposeDescriptor& descriptor,
1312 const char* name)
1313{
Jan Eilers8eb25602020-03-09 12:13:48 +00001314 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001315
1316 // Create FlatBuffer BaseLayer
1317 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1318
1319 std::vector<unsigned int> dimMappings;
1320 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1321 {
1322 dimMappings.push_back(descriptor.m_DimMappings[i]);
1323 }
1324
1325 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1326 m_flatBufferBuilder.CreateVector(dimMappings));
1327
1328 // Create the FlatBuffer TransposeLayer
1329 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1330 flatBufferBaseLayer,
1331 flatBufferDesc);
1332
1333 // Add the AnyLayer to the FlatBufferLayers
1334 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1335}
1336
James Conroy586a9aa2020-03-20 08:49:33 +00001337void SerializerVisitor::VisitQLstmLayer(const armnn::IConnectableLayer* layer,
1338 const armnn::QLstmDescriptor& descriptor,
1339 const armnn::LstmInputParams& params,
1340 const char* name)
1341{
James Conroy8d333182020-05-13 10:27:58 +01001342 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001343
James Conroy8d333182020-05-13 10:27:58 +01001344 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1345
1346 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1347 m_flatBufferBuilder,
1348 descriptor.m_CifgEnabled,
1349 descriptor.m_PeepholeEnabled,
1350 descriptor.m_ProjectionEnabled,
1351 descriptor.m_LayerNormEnabled,
1352 descriptor.m_CellClip,
1353 descriptor.m_ProjectionClip,
1354 descriptor.m_InputIntermediateScale,
1355 descriptor.m_ForgetIntermediateScale,
1356 descriptor.m_CellIntermediateScale,
1357 descriptor.m_OutputIntermediateScale,
1358 descriptor.m_HiddenStateZeroPoint,
1359 descriptor.m_HiddenStateScale
1360 );
1361
1362 // Mandatory params
1363 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
1364 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
1365 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
1366 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
1367 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
1368 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
1369 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
1370 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
1371 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
1372
1373 // CIFG
1374 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1375 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1376 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1377
1378 if (!descriptor.m_CifgEnabled)
1379 {
1380 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
1381 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
1382 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
1383 }
1384
1385 // Projectiom
1386 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1387 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1388
1389 if (descriptor.m_ProjectionEnabled)
1390 {
1391 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
1392 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
1393 }
1394
1395 // Peephole
1396 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1397 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1398 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1399
1400 if (descriptor.m_PeepholeEnabled)
1401 {
1402 if (!descriptor.m_CifgEnabled)
1403 {
1404 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
1405 }
1406
1407 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
1408 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
1409 }
1410
1411 // Layer norm
1412 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1413 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1414 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1415 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1416
1417 if (descriptor.m_LayerNormEnabled)
1418 {
1419 if (!descriptor.m_CifgEnabled)
1420 {
1421 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
1422 }
1423
1424 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
1425 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
1426 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
1427 }
1428
1429 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1430 m_flatBufferBuilder,
1431 inputToForgetWeights,
1432 inputToCellWeights,
1433 inputToOutputWeights,
1434 recurrentToForgetWeights,
1435 recurrentToCellWeights,
1436 recurrentToOutputWeights,
1437 forgetGateBias,
1438 cellBias,
1439 outputGateBias,
1440 inputToInputWeights,
1441 recurrentToInputWeights,
1442 inputGateBias,
1443 projectionWeights,
1444 projectionBias,
1445 cellToInputWeights,
1446 cellToForgetWeights,
1447 cellToOutputWeights,
1448 inputLayerNormWeights,
1449 forgetLayerNormWeights,
1450 cellLayerNormWeights,
1451 outputLayerNormWeights);
1452
1453 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1454 m_flatBufferBuilder,
1455 fbQLstmBaseLayer,
1456 fbQLstmDescriptor,
1457 fbQLstmParams);
1458
1459 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001460}
1461
James Conroyee18dc82019-07-17 11:27:46 +01001462void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1463 const armnn::QuantizedLstmInputParams& params,
1464 const char* name)
1465{
Jan Eilers8eb25602020-03-09 12:13:48 +00001466 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001467
Jan Eilers5b01a892019-07-23 09:47:43 +01001468 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1469
1470 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001471 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1472 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1473 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1474 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001475
Francis Murtaghbb590b42019-08-14 09:51:36 +01001476 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1477 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1478 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1479 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001480
Francis Murtaghbb590b42019-08-14 09:51:36 +01001481 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1482 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1483 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1484 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001485
1486 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1487 m_flatBufferBuilder,
1488 inputToInputWeights,
1489 inputToForgetWeights,
1490 inputToCellWeights,
1491 inputToOutputWeights,
1492 recurrentToInputWeights,
1493 recurrentToForgetWeights,
1494 recurrentToCellWeights,
1495 recurrentToOutputWeights,
1496 inputGateBias,
1497 forgetGateBias,
1498 cellBias,
1499 outputGateBias);
1500
1501 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1502 m_flatBufferBuilder,
1503 fbQuantizedLstmBaseLayer,
1504 fbQuantizedLstmParams);
1505
1506 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001507}
1508
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001509fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001510 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001511{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001512
Sadik Armagandb059fd2019-03-20 12:28:32 +00001513 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1514
Mike Kelly8c1701a2019-02-11 17:01:27 +00001515 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1516 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1517
1518 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001519 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001520 m_flatBufferBuilder.CreateString(layer->GetName()),
1521 layerType,
1522 m_flatBufferBuilder.CreateVector(inputSlots),
1523 m_flatBufferBuilder.CreateVector(outputSlots));
1524}
1525
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001526void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001527{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001528
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001529 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001530 m_serializedLayers.push_back(anyLayer);
1531}
1532
Mike Kellya0766c32019-02-19 17:22:07 +00001533template <typename T>
1534flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1535{
1536 const T* buffer = reinterpret_cast<const T*>(memory);
1537 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1538 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1539 return fbVector;
1540}
1541
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001542flatbuffers::Offset<TensorInfo> SerializerVisitor::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001543{
Mike Kellya0766c32019-02-19 17:22:07 +00001544 // Get the dimensions
1545 std::vector<unsigned int> shape;
Mike Kellya0766c32019-02-19 17:22:07 +00001546 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1547 {
1548 shape.push_back(tensorInfo.GetShape()[dim]);
1549 }
1550
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001551 if (tensorInfo.HasPerAxisQuantization())
1552 {
1553 // Create FlatBuffer TensorInfo
1554 auto flatBufferTensorInfo =
1555 serializer::CreateTensorInfo(m_flatBufferBuilder,
1556 m_flatBufferBuilder.CreateVector(shape),
1557 GetFlatBufferDataType(tensorInfo.GetDataType()),
1558 tensorInfo.GetQuantizationScales()[0],
1559 tensorInfo.GetQuantizationOffset(),
1560 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
1561 tensorInfo.GetQuantizationDim().value());
1562 return flatBufferTensorInfo;
1563 }
1564
Mike Kellya0766c32019-02-19 17:22:07 +00001565 // Create FlatBuffer TensorInfo
1566 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1567 m_flatBufferBuilder.CreateVector(shape),
1568 GetFlatBufferDataType(tensorInfo.GetDataType()),
1569 tensorInfo.GetQuantizationScale(),
1570 tensorInfo.GetQuantizationOffset());
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001571 return flatBufferTensorInfo;
1572}
1573
1574flatbuffers::Offset<serializer::ConstTensor>
1575 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
1576{
1577 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1578
Mike Kellya0766c32019-02-19 17:22:07 +00001579 flatbuffers::Offset<void> fbPayload;
1580
1581 switch (tensorInfo.GetDataType())
1582 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001583 case armnn::DataType::Float32:
1584 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001585 {
1586 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1587 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1588 m_flatBufferBuilder,
1589 fbVector);
1590 fbPayload = flatBuffersData.o;
1591 break;
1592 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001593 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001594 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001595 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001596 {
1597 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1598 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1599 m_flatBufferBuilder,
1600 fbVector);
1601 fbPayload = flatBuffersData.o;
1602 break;
1603 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001604 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001605 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001606 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001607 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001608 default:
1609 {
1610 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1611 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1612 m_flatBufferBuilder,
1613 fbVector);
1614 fbPayload = flatBuffersData.o;
1615 }
1616 }
1617 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1618 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001619 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001620 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1621 fbPayload);
1622 return flatBufferConstTensor;
1623}
1624
Tee Jungaa920c52019-11-05 10:48:25 +00001625flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerVisitor::GetVersionTable()
1626{
1627 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1628 serializer::CreateFeatureCompatibilityVersions(
1629 m_flatBufferBuilder,
1630 1 // Binding ids scheme version
1631 );
1632 return versionsTable;
1633}
1634
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001635std::vector<fb::Offset<serializer::InputSlot>>
1636 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001637{
Mike Kellya0766c32019-02-19 17:22:07 +00001638 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001639
1640 // Get the InputSlots
1641 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1642 {
1643 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1644
1645 // Get the Connection for the InputSlot
1646 const IOutputSlot* connection = inputSlot.GetConnection();
1647
1648 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001649 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1650 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001651 // Create FlatBuffer InputSlot
1652 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1653 }
1654 return inputSlots;
1655}
1656
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001657std::vector<fb::Offset<serializer::OutputSlot>>
1658 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001659{
1660 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1661
1662 // Get the OutputSlots
1663 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1664 {
1665 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001666 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001667
Mike Kelly8c1701a2019-02-11 17:01:27 +00001668 // Create FlatBuffer Outputslot
1669 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1670 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001671 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001672 }
1673 return outputSlots;
1674}
1675
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001676
1677ISerializer* ISerializer::CreateRaw()
1678{
1679 return new Serializer();
1680}
1681
1682ISerializerPtr ISerializer::Create()
1683{
1684 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1685}
1686
1687void ISerializer::Destroy(ISerializer* serializer)
1688{
1689 delete serializer;
1690}
1691
1692void Serializer::Serialize(const INetwork& inNetwork)
1693{
1694 // Iterate through to network
1695 inNetwork.Accept(m_SerializerVisitor);
1696 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1697
1698 // Create FlatBuffer SerializedGraph
1699 auto serializedGraph = serializer::CreateSerializedGraph(
1700 fbBuilder,
1701 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1702 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
Tee Jungaa920c52019-11-05 10:48:25 +00001703 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()),
1704 m_SerializerVisitor.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001705
1706 // Serialize the graph
1707 fbBuilder.Finish(serializedGraph);
1708}
1709
1710bool Serializer::SaveSerializedToStream(std::ostream& stream)
1711{
1712 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1713
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001714 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1715 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001716 return !stream.bad();
1717}
1718
Matteo Martincighec333912019-02-13 15:12:39 +00001719} // namespace armnnSerializer