blob: ddd38e18ef92791775e26396c41c83a81583bf0b [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
Ryan OSheaec6c6802020-06-05 17:17:06 +0100471void SerializerVisitor::VisitFillLayer(const armnn::IConnectableLayer* layer,
472 const armnn::FillDescriptor& fillDescriptor,
473 const char* name)
474{
475 throw UnimplementedException("SerializerVisitor::VisitFillLayer is not implemented");
476 IgnoreUnused(name);
477 IgnoreUnused(layer);
478 IgnoreUnused(fillDescriptor);
479}
480
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000481void SerializerVisitor::VisitFloorLayer(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
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000485 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
486 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
487
488 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
489}
490
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000491void SerializerVisitor::VisitGatherLayer(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
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000495 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
496 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000497
498 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
499}
500
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000501void SerializerVisitor::VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
502{
Jan Eilers8eb25602020-03-09 12:13:48 +0000503 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000504
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000505 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000506 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000507
508 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
509}
510
Kevin Mayce5045a2019-10-02 14:07:47 +0100511void SerializerVisitor::VisitInstanceNormalizationLayer(
512 const armnn::IConnectableLayer* layer,
513 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
514 const char* name)
515{
Jan Eilers8eb25602020-03-09 12:13:48 +0000516 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000517
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100518 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
519 m_flatBufferBuilder,
520 instanceNormalizationDescriptor.m_Gamma,
521 instanceNormalizationDescriptor.m_Beta,
522 instanceNormalizationDescriptor.m_Eps,
523 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
524
525 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
526 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
527
528 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100529}
530
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000531void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
532 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
533 const char* name)
534{
Jan Eilers8eb25602020-03-09 12:13:48 +0000535 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000536
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000537 // Create FlatBuffer BaseLayer
538 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
539
540 // Create the FlatBuffer L2Normalization Descriptor
541 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100542 m_flatBufferBuilder,
543 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
544 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000545
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100546 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000547 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
548
549 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
550}
551
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100552void SerializerVisitor::VisitLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
553 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
554 const char* name)
555{
Jan Eilers8eb25602020-03-09 12:13:48 +0000556 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000557
Sadik Armagan26257852019-10-14 13:00:47 +0100558 // Create FlatBuffer BaseLayer
559 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
560
561 // Create the FlatBuffer LogSoftmaxDescriptor
562 auto flatBufferLogSoftmaxDesc =
563 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
564 logSoftmaxDescriptor.m_Beta,
565 logSoftmaxDescriptor.m_Axis);
566
567 // Create the FlatBuffer LogSoftmaxLayer
568 auto flatBufferLogSoftmaxLayer =
569 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
570 flatBufferLogSoftmaxBaseLayer,
571 flatBufferLogSoftmaxDesc);
572
573 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100574}
575
576void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer,
577 const armnn::LstmDescriptor& descriptor,
578 const armnn::LstmInputParams& params,
579 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000580{
Jan Eilers8eb25602020-03-09 12:13:48 +0000581 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000582
Jim Flynn11af3752019-03-19 17:22:29 +0000583 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
584
585 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
586 m_flatBufferBuilder,
587 descriptor.m_ActivationFunc,
588 descriptor.m_ClippingThresCell,
589 descriptor.m_ClippingThresProj,
590 descriptor.m_CifgEnabled,
591 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100592 descriptor.m_ProjectionEnabled,
593 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000594
595 // Get mandatory input parameters
596 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
597 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
598 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
599 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
600 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
601 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
602 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
603 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
604 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
605
606 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
607 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
608 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
609 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
610 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
611 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
612 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
613 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
614 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100615 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
616 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
617 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
618 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000619
620 if (!descriptor.m_CifgEnabled)
621 {
622 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
623 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
624 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
625 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
626 }
627
628 if (descriptor.m_ProjectionEnabled)
629 {
630 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
631 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
632 }
633
634 if (descriptor.m_PeepholeEnabled)
635 {
636 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
637 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
638 }
639
Jan Eilersf8c62972019-07-17 11:07:49 +0100640 if (descriptor.m_LayerNormEnabled)
641 {
642 if (!descriptor.m_CifgEnabled)
643 {
644 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
645 }
646 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
647 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
648 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
649 }
650
Jim Flynn11af3752019-03-19 17:22:29 +0000651 auto fbLstmParams = serializer::CreateLstmInputParams(
652 m_flatBufferBuilder,
653 inputToForgetWeights,
654 inputToCellWeights,
655 inputToOutputWeights,
656 recurrentToForgetWeights,
657 recurrentToCellWeights,
658 recurrentToOutputWeights,
659 forgetGateBias,
660 cellBias,
661 outputGateBias,
662 inputToInputWeights,
663 recurrentToInputWeights,
664 cellToInputWeights,
665 inputGateBias,
666 projectionWeights,
667 projectionBias,
668 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100669 cellToOutputWeights,
670 inputLayerNormWeights,
671 forgetLayerNormWeights,
672 cellLayerNormWeights,
673 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000674
675 auto fbLstmLayer = serializer::CreateLstmLayer(
676 m_flatBufferBuilder,
677 fbLstmBaseLayer,
678 fbLstmDescriptor,
679 fbLstmParams);
680
681 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
682}
683
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000684void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
685{
Jan Eilers8eb25602020-03-09 12:13:48 +0000686 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000687
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000688 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
689 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
690
691 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
692}
693
694void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
695 const armnn::MeanDescriptor& descriptor,
696 const char* name)
697{
Jan Eilers8eb25602020-03-09 12:13:48 +0000698 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000699
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000700 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
701 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
702 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
703 descriptor.m_KeepDims);
704
705 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
706 fbMeanBaseLayer,
707 fbMeanDescriptor);
708
709 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
710}
711
712void SerializerVisitor::VisitMinimumLayer(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
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000716 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
717 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
718
719 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
720}
721
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100722void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
723{
Jan Eilers8eb25602020-03-09 12:13:48 +0000724 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000725
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100726 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
727 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
728
729 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
730}
731
Jim Flynnac25a1b2019-02-28 10:40:49 +0000732void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100733 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000734 const char* name)
735{
Jim Flynne242f2d2019-05-22 14:24:13 +0100736 VisitConcatLayer(layer, mergerDescriptor, name);
737}
738
739void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
740 const armnn::ConcatDescriptor& concatDescriptor,
741 const char* name)
742{
Jan Eilers8eb25602020-03-09 12:13:48 +0000743 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000744
Jim Flynne242f2d2019-05-22 14:24:13 +0100745 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000746
747 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100748 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000749 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100750 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000751 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100752 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000753 {
754 origins.push_back(origin[d]);
755 }
756 auto view = m_flatBufferBuilder.CreateVector(origins);
757 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
758 views.push_back(uintVector);
759 }
760
Jim Flynne242f2d2019-05-22 14:24:13 +0100761 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
762 concatDescriptor.GetConcatAxis(),
763 concatDescriptor.GetNumViews(),
764 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000765 m_flatBufferBuilder.CreateVector(views));
766
Jim Flynne242f2d2019-05-22 14:24:13 +0100767 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
768 flatBufferConcatBaseLayer,
769 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000770
Jim Flynne242f2d2019-05-22 14:24:13 +0100771 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000772}
773
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000774void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000775{
Jan Eilers8eb25602020-03-09 12:13:48 +0000776 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000777
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000778 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
779 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
780 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000781
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000782 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000783}
784
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000785void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
786 const armnn::PadDescriptor& padDescriptor,
787 const char* name)
788{
Jan Eilers8eb25602020-03-09 12:13:48 +0000789 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000790
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000791 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
792
793 std::vector<unsigned int> padList;
794 for (auto& p: padDescriptor.m_PadList)
795 {
796 padList.push_back(p.first);
797 padList.push_back(p.second);
798 }
799
800 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100801 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100802 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000803
804 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
805 flatBufferBaseLayer,
806 flatBufferPadDesc);
807
808 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
809}
810
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000811void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
812 const armnn::PermuteDescriptor& permuteDescriptor,
813 const char* name)
814{
Jan Eilers8eb25602020-03-09 12:13:48 +0000815 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000816
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000817 // Create FlatBuffer BaseLayer
818 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
819
820 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100821 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000822 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100823 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000824 }
825
826 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
827 m_flatBufferBuilder.CreateVector(dimMappings));
828
829 // Create the FlatBuffer PermuteLayer
830 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
831 flatBufferPermuteBaseLayer,
832 flatBufferPermuteDesc);
833
834 // Add the AnyLayer to the FlatBufferLayers
835 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
836}
837
Saoirse Stewart263829c2019-02-19 15:54:14 +0000838// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000839void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000840 const armnn::ReshapeDescriptor& reshapeDescriptor,
841 const char* name)
842{
Jan Eilers8eb25602020-03-09 12:13:48 +0000843 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000844
Saoirse Stewart263829c2019-02-19 15:54:14 +0000845 // Create FlatBuffer BaseLayer
846 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
847
848 std::vector<unsigned int> targetShape;
849 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
850 {
851 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
852 }
853
854 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
855 m_flatBufferBuilder.CreateVector(targetShape));
856
857 // Create the FlatBuffer ReshapeLayer
858 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
859 flatBufferReshapeDesc);
860
861 // Add the AnyLayer to the FlatBufferLayers
862 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
863}
864
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000865void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
866 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
867 const char* name)
868{
Jan Eilers8eb25602020-03-09 12:13:48 +0000869 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000870
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000871 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
872
873 auto flatBufferDescriptor =
874 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
875 resizeDescriptor.m_TargetWidth,
876 resizeDescriptor.m_TargetHeight,
David Monahan4a0c9b92020-05-30 09:48:39 +0100877 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
878 resizeDescriptor.m_AlignCorners,
879 resizeDescriptor.m_HalfPixelCenters);
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000880
881 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
882 flatBufferBaseLayer,
883 flatBufferDescriptor);
884
885 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
886}
887
Teresa Charlina9075df2019-06-27 15:41:57 +0100888void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
889 const armnn::ResizeDescriptor& resizeDescriptor,
890 const char* name)
891{
Jan Eilers8eb25602020-03-09 12:13:48 +0000892 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000893
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100894 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
895
896 auto flatBufferDescriptor =
897 CreateResizeDescriptor(m_flatBufferBuilder,
898 resizeDescriptor.m_TargetHeight,
899 resizeDescriptor.m_TargetWidth,
900 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +0100901 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
902 resizeDescriptor.m_AlignCorners,
903 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100904
905 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
906 flatBufferBaseLayer,
907 flatBufferDescriptor);
908
909 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100910}
911
Sadik Armagan8b42a382019-03-01 14:24:49 +0000912void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
913{
Jan Eilers8eb25602020-03-09 12:13:48 +0000914 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000915
Sadik Armagan8b42a382019-03-01 14:24:49 +0000916 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
917 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
918
919 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
920}
921
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100922void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
923 const armnn::SliceDescriptor& sliceDescriptor,
924 const char* name)
925{
Jan Eilers8eb25602020-03-09 12:13:48 +0000926 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000927
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100928 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
929 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
930 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
931 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
932
933 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
934
935 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100936}
937
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000938// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000939void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
940 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000941 const char* name)
942{
Jan Eilers8eb25602020-03-09 12:13:48 +0000943 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000944
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000945 // Create FlatBuffer BaseLayer
946 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
947
948 // Create the FlatBuffer SoftmaxDescriptor
949 auto flatBufferSoftmaxDesc =
950 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
951
952 // Create the FlatBuffer SoftmaxLayer
953 auto flatBufferSoftmaxLayer =
954 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
955 flatBufferSoftmaxBaseLayer,
956 flatBufferSoftmaxDesc);
957
958 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
959}
960
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000961void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
962 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000963 const char* name)
964{
Jan Eilers8eb25602020-03-09 12:13:48 +0000965 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000966
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000967 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
968 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
969 m_flatBufferBuilder,
970 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
971 pooling2dDescriptor.m_PadLeft,
972 pooling2dDescriptor.m_PadRight,
973 pooling2dDescriptor.m_PadTop,
974 pooling2dDescriptor.m_PadBottom,
975 pooling2dDescriptor.m_PoolWidth,
976 pooling2dDescriptor.m_PoolHeight,
977 pooling2dDescriptor.m_StrideX,
978 pooling2dDescriptor.m_StrideY,
979 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
980 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
981 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
982
983 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
984 fbPooling2dBaseLayer,
985 fbPooling2dDescriptor);
986
987 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
988}
989
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100990void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
991 const char* name)
992{
Jan Eilers8eb25602020-03-09 12:13:48 +0000993 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000994
Ellen Norris-Thompson51982472019-06-19 11:46:21 +0100995 // Create FlatBuffer BaseLayer
996 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
997
998 // Create the FlatBuffer AdditionLayer
999 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1000
1001 // Add the AnyLayer to the FlatBufferLayers
1002 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001003}
1004
Derek Lamberti87acb272019-03-27 16:51:31 +00001005void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
1006{
Jan Eilers8eb25602020-03-09 12:13:48 +00001007 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001008
Derek Lamberti87acb272019-03-27 16:51:31 +00001009 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1010 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1011 fbQuantizeBaseLayer);
1012 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1013}
1014
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001015// Build FlatBuffer for FullyConnected Layer
1016void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1017 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
1018 const armnn::ConstTensor& weights,
1019 const armnn::Optional<armnn::ConstTensor>& biases,
1020 const char* name)
1021{
Jan Eilers8eb25602020-03-09 12:13:48 +00001022 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001023
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001024 // Create FlatBuffer BaseLayer
1025 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1026
1027 // Create FlatBuffer FullyConnectedDescriptor
1028 auto flatBufferDescriptor =
1029 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1030 fullyConnectedDescriptor.m_BiasEnabled,
1031 fullyConnectedDescriptor.m_TransposeWeightMatrix);
1032
1033 // Create FlatBuffer weights data
1034 auto flatBufferWeights = CreateConstTensorInfo(weights);
1035
1036 // Create FlatBuffer bias data
1037 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
1038 if (fullyConnectedDescriptor.m_BiasEnabled)
1039 {
1040 flatBufferBiases = CreateConstTensorInfo(biases.value());
1041 }
1042
1043 // Create FlatBuffer FullyConnectedLayer
1044 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1045 flatBufferBaseLayer,
1046 flatBufferDescriptor,
1047 flatBufferWeights,
1048 flatBufferBiases);
1049
1050 // Add created FullyConnectedLayer to the FlatBufferLayers
1051 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1052}
1053
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001054// Build FlatBuffer for SpaceToBatchNd Layer
1055void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
1056 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1057 const char* name)
1058{
Jan Eilers8eb25602020-03-09 12:13:48 +00001059 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001060
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001061 // Create FlatBuffer BaseLayer
1062 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1063
1064 std::vector<unsigned int> padList;
1065 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1066 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1067 {
1068 padList.push_back(pad.first);
1069 padList.push_back(pad.second);
1070 }
1071
1072 auto flatBufferDescriptor =
1073 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1074 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1075 m_flatBufferBuilder.CreateVector(padList),
1076 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1077
1078 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1079 flatBufferBaseLayer,
1080 flatBufferDescriptor);
1081
1082 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1083}
1084
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001085// Build FlatBuffer for SpaceToDepthLayer
1086void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
1087 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1088 const char* name)
1089{
Jan Eilers8eb25602020-03-09 12:13:48 +00001090 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001091
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001092 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1093 auto flatBufferDescriptor =
1094 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1095 spaceToDepthDescriptor.m_BlockSize,
1096 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1097
1098 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1099 flatBufferBaseLayer,
1100 flatBufferDescriptor);
1101
1102 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001103}
1104
Jim Flynn18ce3382019-03-08 11:08:30 +00001105// Build FlatBuffer for Splitter Layer
1106void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
1107 const armnn::ViewsDescriptor& viewsDescriptor,
1108 const char* name)
1109{
Jan Eilers8eb25602020-03-09 12:13:48 +00001110 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001111
Jim Flynn18ce3382019-03-08 11:08:30 +00001112 // Create FlatBuffer ViewOrigins
1113 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1114 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1115
1116 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1117 {
1118 std::vector<uint32_t> viewOrigin;
1119 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1120
1121 // Copy vector
1122 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1123 {
1124 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1125 }
1126
1127 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1128 m_flatBufferBuilder.CreateVector(viewOrigin)));
1129 }
1130
1131 // Create FlatBuffer OriginsDescriptor
1132 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1133 viewsDescriptor.GetOrigins().GetConcatAxis(),
1134 viewsDescriptor.GetOrigins().GetNumViews(),
1135 viewsDescriptor.GetOrigins().GetNumDimensions(),
1136 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1137
1138 // Create FlatBuffer ViewOrigins
1139 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1140 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1141
1142 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1143 {
1144 std::vector<uint32_t> viewSize;
1145 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1146
1147 // Copy vector
1148 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1149 {
1150 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1151 }
1152
1153 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1154 m_flatBufferBuilder.CreateVector(viewSize)));
1155 }
1156
1157 // Create FlatBuffer ViewsDescriptor
1158 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1159 flatBufferOriginDescriptor,
1160 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1161
1162 // Create FlatBuffer BaseLayer
1163 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1164
1165 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1166 flatBufferBaseLayer,
1167 flatBufferViewsDescriptor);
1168
1169 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1170}
1171
Nina Drozd57728782019-02-27 10:53:27 +00001172void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
1173 const armnn::NormalizationDescriptor& descriptor,
1174 const char* name)
1175{
Jan Eilers8eb25602020-03-09 12:13:48 +00001176 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001177
Nina Drozd57728782019-02-27 10:53:27 +00001178 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1179
1180 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1181 m_flatBufferBuilder,
1182 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1183 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1184 descriptor.m_NormSize,
1185 descriptor.m_Alpha,
1186 descriptor.m_Beta,
1187 descriptor.m_K,
1188 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1189
1190 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1191 fbNormalizationBaseLayer,
1192 fbNormalizationDescriptor);
1193
1194 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1195}
1196
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001197void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1198 const armnn::StackDescriptor& stackDescriptor,
1199 const char* name)
1200{
Jan Eilers8eb25602020-03-09 12:13:48 +00001201 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001202
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001203 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1204
1205 std::vector<unsigned int> inputShape;
1206 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1207 {
1208 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1209 }
1210
1211 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1212 stackDescriptor.m_Axis,
1213 stackDescriptor.m_NumInputs,
1214 m_flatBufferBuilder.CreateVector(inputShape));
1215
1216 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1217 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001218}
1219
Derek Lamberti013c3902019-10-21 10:46:16 +01001220void SerializerVisitor::VisitStandInLayer(const armnn::IConnectableLayer *layer,
1221 const armnn::StandInDescriptor& standInDescriptor,
1222 const char *name)
1223{
Jan Eilers8eb25602020-03-09 12:13:48 +00001224 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001225
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001226 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1227 standInDescriptor.m_NumInputs,
1228 standInDescriptor.m_NumOutputs);
1229
1230 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1231 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1232
1233 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001234}
1235
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001236void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1237 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1238 const char* name)
1239{
Jan Eilers8eb25602020-03-09 12:13:48 +00001240 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001241
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001242 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1243
1244 auto flatBufferDescriptor =
1245 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1246 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1247 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1248 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1249 stridedSliceDescriptor.m_BeginMask,
1250 stridedSliceDescriptor.m_EndMask,
1251 stridedSliceDescriptor.m_ShrinkAxisMask,
1252 stridedSliceDescriptor.m_EllipsisMask,
1253 stridedSliceDescriptor.m_NewAxisMask,
1254 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1255
1256 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1257 flatBufferBaseLayer,
1258 flatBufferDescriptor);
1259
1260 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1261}
1262
Conor Kennedyda1f9752019-03-01 14:37:12 +00001263void SerializerVisitor::VisitSubtractionLayer(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
Conor Kennedyda1f9752019-03-01 14:37:12 +00001267 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1268 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1269
1270 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1271}
1272
Sadik Armaganeff363d2019-04-05 15:25:46 +01001273void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1274{
Jan Eilers8eb25602020-03-09 12:13:48 +00001275 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001276
Sadik Armaganeff363d2019-04-05 15:25:46 +01001277 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1278 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1279
1280 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1281}
1282
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001283void SerializerVisitor::VisitTransposeConvolution2dLayer(
1284 const armnn::IConnectableLayer* layer,
1285 const armnn::TransposeConvolution2dDescriptor& descriptor,
1286 const armnn::ConstTensor& weights,
1287 const armnn::Optional<armnn::ConstTensor>& biases,
1288 const char* name)
1289{
Jan Eilers8eb25602020-03-09 12:13:48 +00001290 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001291
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001292 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1293 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1294 descriptor.m_PadLeft,
1295 descriptor.m_PadRight,
1296 descriptor.m_PadTop,
1297 descriptor.m_PadBottom,
1298 descriptor.m_StrideX,
1299 descriptor.m_StrideY,
1300 descriptor.m_BiasEnabled,
1301 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1302
1303 // weights & biases
1304 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1305 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1306 if (biases.has_value())
1307 {
1308 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1309 }
1310
1311 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1312 fbBaseLayer,
1313 fbDescriptor,
1314 fbWeightsConstTensorInfo,
1315 fbBiasesConstTensorInfo);
1316
1317 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001318}
1319
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001320void SerializerVisitor::VisitTransposeLayer(const armnn::IConnectableLayer* layer,
1321 const armnn::TransposeDescriptor& descriptor,
1322 const char* name)
1323{
Jan Eilers8eb25602020-03-09 12:13:48 +00001324 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001325
1326 // Create FlatBuffer BaseLayer
1327 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1328
1329 std::vector<unsigned int> dimMappings;
1330 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1331 {
1332 dimMappings.push_back(descriptor.m_DimMappings[i]);
1333 }
1334
1335 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1336 m_flatBufferBuilder.CreateVector(dimMappings));
1337
1338 // Create the FlatBuffer TransposeLayer
1339 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1340 flatBufferBaseLayer,
1341 flatBufferDesc);
1342
1343 // Add the AnyLayer to the FlatBufferLayers
1344 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1345}
1346
James Conroy586a9aa2020-03-20 08:49:33 +00001347void SerializerVisitor::VisitQLstmLayer(const armnn::IConnectableLayer* layer,
1348 const armnn::QLstmDescriptor& descriptor,
1349 const armnn::LstmInputParams& params,
1350 const char* name)
1351{
James Conroy8d333182020-05-13 10:27:58 +01001352 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001353
James Conroy8d333182020-05-13 10:27:58 +01001354 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1355
1356 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1357 m_flatBufferBuilder,
1358 descriptor.m_CifgEnabled,
1359 descriptor.m_PeepholeEnabled,
1360 descriptor.m_ProjectionEnabled,
1361 descriptor.m_LayerNormEnabled,
1362 descriptor.m_CellClip,
1363 descriptor.m_ProjectionClip,
1364 descriptor.m_InputIntermediateScale,
1365 descriptor.m_ForgetIntermediateScale,
1366 descriptor.m_CellIntermediateScale,
1367 descriptor.m_OutputIntermediateScale,
1368 descriptor.m_HiddenStateZeroPoint,
1369 descriptor.m_HiddenStateScale
1370 );
1371
1372 // Mandatory params
1373 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
1374 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
1375 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
1376 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
1377 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
1378 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
1379 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
1380 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
1381 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
1382
1383 // CIFG
1384 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1385 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1386 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1387
1388 if (!descriptor.m_CifgEnabled)
1389 {
1390 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
1391 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
1392 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
1393 }
1394
1395 // Projectiom
1396 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1397 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1398
1399 if (descriptor.m_ProjectionEnabled)
1400 {
1401 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
1402 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
1403 }
1404
1405 // Peephole
1406 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1407 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1408 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1409
1410 if (descriptor.m_PeepholeEnabled)
1411 {
1412 if (!descriptor.m_CifgEnabled)
1413 {
1414 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
1415 }
1416
1417 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
1418 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
1419 }
1420
1421 // Layer norm
1422 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1423 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1424 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1425 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1426
1427 if (descriptor.m_LayerNormEnabled)
1428 {
1429 if (!descriptor.m_CifgEnabled)
1430 {
1431 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
1432 }
1433
1434 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
1435 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
1436 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
1437 }
1438
1439 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1440 m_flatBufferBuilder,
1441 inputToForgetWeights,
1442 inputToCellWeights,
1443 inputToOutputWeights,
1444 recurrentToForgetWeights,
1445 recurrentToCellWeights,
1446 recurrentToOutputWeights,
1447 forgetGateBias,
1448 cellBias,
1449 outputGateBias,
1450 inputToInputWeights,
1451 recurrentToInputWeights,
1452 inputGateBias,
1453 projectionWeights,
1454 projectionBias,
1455 cellToInputWeights,
1456 cellToForgetWeights,
1457 cellToOutputWeights,
1458 inputLayerNormWeights,
1459 forgetLayerNormWeights,
1460 cellLayerNormWeights,
1461 outputLayerNormWeights);
1462
1463 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1464 m_flatBufferBuilder,
1465 fbQLstmBaseLayer,
1466 fbQLstmDescriptor,
1467 fbQLstmParams);
1468
1469 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001470}
1471
James Conroyee18dc82019-07-17 11:27:46 +01001472void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1473 const armnn::QuantizedLstmInputParams& params,
1474 const char* name)
1475{
Jan Eilers8eb25602020-03-09 12:13:48 +00001476 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001477
Jan Eilers5b01a892019-07-23 09:47:43 +01001478 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1479
1480 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001481 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1482 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1483 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1484 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001485
Francis Murtaghbb590b42019-08-14 09:51:36 +01001486 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1487 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1488 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1489 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001490
Francis Murtaghbb590b42019-08-14 09:51:36 +01001491 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1492 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1493 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1494 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001495
1496 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1497 m_flatBufferBuilder,
1498 inputToInputWeights,
1499 inputToForgetWeights,
1500 inputToCellWeights,
1501 inputToOutputWeights,
1502 recurrentToInputWeights,
1503 recurrentToForgetWeights,
1504 recurrentToCellWeights,
1505 recurrentToOutputWeights,
1506 inputGateBias,
1507 forgetGateBias,
1508 cellBias,
1509 outputGateBias);
1510
1511 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1512 m_flatBufferBuilder,
1513 fbQuantizedLstmBaseLayer,
1514 fbQuantizedLstmParams);
1515
1516 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001517}
1518
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001519fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001520 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001521{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001522
Sadik Armagandb059fd2019-03-20 12:28:32 +00001523 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1524
Mike Kelly8c1701a2019-02-11 17:01:27 +00001525 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1526 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1527
1528 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001529 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001530 m_flatBufferBuilder.CreateString(layer->GetName()),
1531 layerType,
1532 m_flatBufferBuilder.CreateVector(inputSlots),
1533 m_flatBufferBuilder.CreateVector(outputSlots));
1534}
1535
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001536void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001537{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001538
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001539 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001540 m_serializedLayers.push_back(anyLayer);
1541}
1542
Mike Kellya0766c32019-02-19 17:22:07 +00001543template <typename T>
1544flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1545{
1546 const T* buffer = reinterpret_cast<const T*>(memory);
1547 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1548 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1549 return fbVector;
1550}
1551
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001552flatbuffers::Offset<TensorInfo> SerializerVisitor::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001553{
Mike Kellya0766c32019-02-19 17:22:07 +00001554 // Get the dimensions
1555 std::vector<unsigned int> shape;
Mike Kellya0766c32019-02-19 17:22:07 +00001556 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1557 {
1558 shape.push_back(tensorInfo.GetShape()[dim]);
1559 }
1560
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001561 if (tensorInfo.HasPerAxisQuantization())
1562 {
1563 // Create FlatBuffer TensorInfo
1564 auto flatBufferTensorInfo =
1565 serializer::CreateTensorInfo(m_flatBufferBuilder,
1566 m_flatBufferBuilder.CreateVector(shape),
1567 GetFlatBufferDataType(tensorInfo.GetDataType()),
1568 tensorInfo.GetQuantizationScales()[0],
1569 tensorInfo.GetQuantizationOffset(),
1570 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
1571 tensorInfo.GetQuantizationDim().value());
1572 return flatBufferTensorInfo;
1573 }
1574
Mike Kellya0766c32019-02-19 17:22:07 +00001575 // Create FlatBuffer TensorInfo
1576 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1577 m_flatBufferBuilder.CreateVector(shape),
1578 GetFlatBufferDataType(tensorInfo.GetDataType()),
1579 tensorInfo.GetQuantizationScale(),
1580 tensorInfo.GetQuantizationOffset());
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001581 return flatBufferTensorInfo;
1582}
1583
1584flatbuffers::Offset<serializer::ConstTensor>
1585 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
1586{
1587 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1588
Mike Kellya0766c32019-02-19 17:22:07 +00001589 flatbuffers::Offset<void> fbPayload;
1590
1591 switch (tensorInfo.GetDataType())
1592 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001593 case armnn::DataType::Float32:
1594 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001595 {
1596 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1597 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1598 m_flatBufferBuilder,
1599 fbVector);
1600 fbPayload = flatBuffersData.o;
1601 break;
1602 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001603 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001604 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001605 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001606 {
1607 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1608 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1609 m_flatBufferBuilder,
1610 fbVector);
1611 fbPayload = flatBuffersData.o;
1612 break;
1613 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001614 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001615 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001616 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001617 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001618 default:
1619 {
1620 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1621 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1622 m_flatBufferBuilder,
1623 fbVector);
1624 fbPayload = flatBuffersData.o;
1625 }
1626 }
1627 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1628 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001629 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001630 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1631 fbPayload);
1632 return flatBufferConstTensor;
1633}
1634
Tee Jungaa920c52019-11-05 10:48:25 +00001635flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerVisitor::GetVersionTable()
1636{
1637 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1638 serializer::CreateFeatureCompatibilityVersions(
1639 m_flatBufferBuilder,
1640 1 // Binding ids scheme version
1641 );
1642 return versionsTable;
1643}
1644
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001645std::vector<fb::Offset<serializer::InputSlot>>
1646 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001647{
Mike Kellya0766c32019-02-19 17:22:07 +00001648 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001649
1650 // Get the InputSlots
1651 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1652 {
1653 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1654
1655 // Get the Connection for the InputSlot
1656 const IOutputSlot* connection = inputSlot.GetConnection();
1657
1658 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001659 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1660 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001661 // Create FlatBuffer InputSlot
1662 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1663 }
1664 return inputSlots;
1665}
1666
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001667std::vector<fb::Offset<serializer::OutputSlot>>
1668 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001669{
1670 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1671
1672 // Get the OutputSlots
1673 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1674 {
1675 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001676 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001677
Mike Kelly8c1701a2019-02-11 17:01:27 +00001678 // Create FlatBuffer Outputslot
1679 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1680 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001681 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001682 }
1683 return outputSlots;
1684}
1685
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001686
1687ISerializer* ISerializer::CreateRaw()
1688{
1689 return new Serializer();
1690}
1691
1692ISerializerPtr ISerializer::Create()
1693{
1694 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1695}
1696
1697void ISerializer::Destroy(ISerializer* serializer)
1698{
1699 delete serializer;
1700}
1701
1702void Serializer::Serialize(const INetwork& inNetwork)
1703{
1704 // Iterate through to network
1705 inNetwork.Accept(m_SerializerVisitor);
1706 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1707
1708 // Create FlatBuffer SerializedGraph
1709 auto serializedGraph = serializer::CreateSerializedGraph(
1710 fbBuilder,
1711 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1712 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
Tee Jungaa920c52019-11-05 10:48:25 +00001713 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()),
1714 m_SerializerVisitor.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001715
1716 // Serialize the graph
1717 fbBuilder.Finish(serializedGraph);
1718}
1719
1720bool Serializer::SaveSerializedToStream(std::ostream& stream)
1721{
1722 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1723
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001724 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1725 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001726 return !stream.bad();
1727}
1728
Matteo Martincighec333912019-02-13 15:12:39 +00001729} // namespace armnnSerializer