blob: 17076c62abb2411577f2e2a7181ff7c9ddf2a2b2 [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{
Ryan OSheaec6c6802020-06-05 17:17:06 +0100475 IgnoreUnused(name);
Keith Davis300ad562020-06-04 16:34:23 +0100476
477 auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill);
478
479 auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.m_Value);
480
481 auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor);
482
483 CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer);
Ryan OSheaec6c6802020-06-05 17:17:06 +0100484}
485
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000486void SerializerVisitor::VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
487{
Jan Eilers8eb25602020-03-09 12:13:48 +0000488 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000489
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000490 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
491 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
492
493 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
494}
495
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000496void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer, const char* name)
497{
Jan Eilers8eb25602020-03-09 12:13:48 +0000498 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000499
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000500 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
501 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000502
503 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
504}
505
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000506void SerializerVisitor::VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
507{
Jan Eilers8eb25602020-03-09 12:13:48 +0000508 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000509
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000510 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000511 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000512
513 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
514}
515
Kevin Mayce5045a2019-10-02 14:07:47 +0100516void SerializerVisitor::VisitInstanceNormalizationLayer(
517 const armnn::IConnectableLayer* layer,
518 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
519 const char* name)
520{
Jan Eilers8eb25602020-03-09 12:13:48 +0000521 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000522
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100523 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
524 m_flatBufferBuilder,
525 instanceNormalizationDescriptor.m_Gamma,
526 instanceNormalizationDescriptor.m_Beta,
527 instanceNormalizationDescriptor.m_Eps,
528 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
529
530 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
531 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
532
533 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100534}
535
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000536void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
537 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
538 const char* name)
539{
Jan Eilers8eb25602020-03-09 12:13:48 +0000540 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000541
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000542 // Create FlatBuffer BaseLayer
543 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
544
545 // Create the FlatBuffer L2Normalization Descriptor
546 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100547 m_flatBufferBuilder,
548 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
549 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000550
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100551 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000552 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
553
554 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
555}
556
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100557void SerializerVisitor::VisitLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
558 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
559 const char* name)
560{
Jan Eilers8eb25602020-03-09 12:13:48 +0000561 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000562
Sadik Armagan26257852019-10-14 13:00:47 +0100563 // Create FlatBuffer BaseLayer
564 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
565
566 // Create the FlatBuffer LogSoftmaxDescriptor
567 auto flatBufferLogSoftmaxDesc =
568 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
569 logSoftmaxDescriptor.m_Beta,
570 logSoftmaxDescriptor.m_Axis);
571
572 // Create the FlatBuffer LogSoftmaxLayer
573 auto flatBufferLogSoftmaxLayer =
574 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
575 flatBufferLogSoftmaxBaseLayer,
576 flatBufferLogSoftmaxDesc);
577
578 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100579}
580
581void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer,
582 const armnn::LstmDescriptor& descriptor,
583 const armnn::LstmInputParams& params,
584 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000585{
Jan Eilers8eb25602020-03-09 12:13:48 +0000586 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000587
Jim Flynn11af3752019-03-19 17:22:29 +0000588 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
589
590 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
591 m_flatBufferBuilder,
592 descriptor.m_ActivationFunc,
593 descriptor.m_ClippingThresCell,
594 descriptor.m_ClippingThresProj,
595 descriptor.m_CifgEnabled,
596 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100597 descriptor.m_ProjectionEnabled,
598 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000599
600 // Get mandatory input parameters
601 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
602 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
603 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
604 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
605 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
606 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
607 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
608 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
609 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
610
611 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
612 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
613 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
614 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
615 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
616 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
617 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
618 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
619 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100620 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
621 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
622 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
623 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000624
625 if (!descriptor.m_CifgEnabled)
626 {
627 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
628 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
629 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
630 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
631 }
632
633 if (descriptor.m_ProjectionEnabled)
634 {
635 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
636 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
637 }
638
639 if (descriptor.m_PeepholeEnabled)
640 {
641 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
642 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
643 }
644
Jan Eilersf8c62972019-07-17 11:07:49 +0100645 if (descriptor.m_LayerNormEnabled)
646 {
647 if (!descriptor.m_CifgEnabled)
648 {
649 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
650 }
651 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
652 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
653 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
654 }
655
Jim Flynn11af3752019-03-19 17:22:29 +0000656 auto fbLstmParams = serializer::CreateLstmInputParams(
657 m_flatBufferBuilder,
658 inputToForgetWeights,
659 inputToCellWeights,
660 inputToOutputWeights,
661 recurrentToForgetWeights,
662 recurrentToCellWeights,
663 recurrentToOutputWeights,
664 forgetGateBias,
665 cellBias,
666 outputGateBias,
667 inputToInputWeights,
668 recurrentToInputWeights,
669 cellToInputWeights,
670 inputGateBias,
671 projectionWeights,
672 projectionBias,
673 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100674 cellToOutputWeights,
675 inputLayerNormWeights,
676 forgetLayerNormWeights,
677 cellLayerNormWeights,
678 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000679
680 auto fbLstmLayer = serializer::CreateLstmLayer(
681 m_flatBufferBuilder,
682 fbLstmBaseLayer,
683 fbLstmDescriptor,
684 fbLstmParams);
685
686 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
687}
688
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000689void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
690{
Jan Eilers8eb25602020-03-09 12:13:48 +0000691 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000692
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000693 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
694 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
695
696 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
697}
698
699void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
700 const armnn::MeanDescriptor& descriptor,
701 const char* name)
702{
Jan Eilers8eb25602020-03-09 12:13:48 +0000703 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000704
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000705 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
706 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
707 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
708 descriptor.m_KeepDims);
709
710 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
711 fbMeanBaseLayer,
712 fbMeanDescriptor);
713
714 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
715}
716
717void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
718{
Jan Eilers8eb25602020-03-09 12:13:48 +0000719 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000720
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000721 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
722 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
723
724 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
725}
726
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100727void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
728{
Jan Eilers8eb25602020-03-09 12:13:48 +0000729 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000730
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100731 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
732 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
733
734 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
735}
736
Jim Flynnac25a1b2019-02-28 10:40:49 +0000737void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100738 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000739 const char* name)
740{
Jim Flynne242f2d2019-05-22 14:24:13 +0100741 VisitConcatLayer(layer, mergerDescriptor, name);
742}
743
744void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
745 const armnn::ConcatDescriptor& concatDescriptor,
746 const char* name)
747{
Jan Eilers8eb25602020-03-09 12:13:48 +0000748 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000749
Jim Flynne242f2d2019-05-22 14:24:13 +0100750 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000751
752 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100753 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000754 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100755 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000756 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100757 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000758 {
759 origins.push_back(origin[d]);
760 }
761 auto view = m_flatBufferBuilder.CreateVector(origins);
762 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
763 views.push_back(uintVector);
764 }
765
Jim Flynne242f2d2019-05-22 14:24:13 +0100766 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
767 concatDescriptor.GetConcatAxis(),
768 concatDescriptor.GetNumViews(),
769 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000770 m_flatBufferBuilder.CreateVector(views));
771
Jim Flynne242f2d2019-05-22 14:24:13 +0100772 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
773 flatBufferConcatBaseLayer,
774 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000775
Jim Flynne242f2d2019-05-22 14:24:13 +0100776 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000777}
778
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000779void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000780{
Jan Eilers8eb25602020-03-09 12:13:48 +0000781 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000782
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000783 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
784 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
785 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000786
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000787 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000788}
789
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000790void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
791 const armnn::PadDescriptor& padDescriptor,
792 const char* name)
793{
Jan Eilers8eb25602020-03-09 12:13:48 +0000794 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000795
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000796 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
797
798 std::vector<unsigned int> padList;
799 for (auto& p: padDescriptor.m_PadList)
800 {
801 padList.push_back(p.first);
802 padList.push_back(p.second);
803 }
804
805 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100806 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100807 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000808
809 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
810 flatBufferBaseLayer,
811 flatBufferPadDesc);
812
813 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
814}
815
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000816void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
817 const armnn::PermuteDescriptor& permuteDescriptor,
818 const char* name)
819{
Jan Eilers8eb25602020-03-09 12:13:48 +0000820 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000821
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000822 // Create FlatBuffer BaseLayer
823 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
824
825 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100826 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000827 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100828 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000829 }
830
831 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
832 m_flatBufferBuilder.CreateVector(dimMappings));
833
834 // Create the FlatBuffer PermuteLayer
835 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
836 flatBufferPermuteBaseLayer,
837 flatBufferPermuteDesc);
838
839 // Add the AnyLayer to the FlatBufferLayers
840 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
841}
842
Saoirse Stewart263829c2019-02-19 15:54:14 +0000843// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000844void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000845 const armnn::ReshapeDescriptor& reshapeDescriptor,
846 const char* name)
847{
Jan Eilers8eb25602020-03-09 12:13:48 +0000848 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000849
Saoirse Stewart263829c2019-02-19 15:54:14 +0000850 // Create FlatBuffer BaseLayer
851 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
852
853 std::vector<unsigned int> targetShape;
854 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
855 {
856 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
857 }
858
859 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
860 m_flatBufferBuilder.CreateVector(targetShape));
861
862 // Create the FlatBuffer ReshapeLayer
863 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
864 flatBufferReshapeDesc);
865
866 // Add the AnyLayer to the FlatBufferLayers
867 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
868}
869
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000870void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
871 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
872 const char* name)
873{
Jan Eilers8eb25602020-03-09 12:13:48 +0000874 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000875
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000876 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
877
878 auto flatBufferDescriptor =
879 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
880 resizeDescriptor.m_TargetWidth,
881 resizeDescriptor.m_TargetHeight,
David Monahan4a0c9b92020-05-30 09:48:39 +0100882 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
883 resizeDescriptor.m_AlignCorners,
884 resizeDescriptor.m_HalfPixelCenters);
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000885
886 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
887 flatBufferBaseLayer,
888 flatBufferDescriptor);
889
890 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
891}
892
Teresa Charlina9075df2019-06-27 15:41:57 +0100893void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
894 const armnn::ResizeDescriptor& resizeDescriptor,
895 const char* name)
896{
Jan Eilers8eb25602020-03-09 12:13:48 +0000897 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000898
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100899 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
900
901 auto flatBufferDescriptor =
902 CreateResizeDescriptor(m_flatBufferBuilder,
903 resizeDescriptor.m_TargetHeight,
904 resizeDescriptor.m_TargetWidth,
905 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +0100906 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
907 resizeDescriptor.m_AlignCorners,
908 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100909
910 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
911 flatBufferBaseLayer,
912 flatBufferDescriptor);
913
914 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100915}
916
Sadik Armagan8b42a382019-03-01 14:24:49 +0000917void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
918{
Jan Eilers8eb25602020-03-09 12:13:48 +0000919 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000920
Sadik Armagan8b42a382019-03-01 14:24:49 +0000921 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
922 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
923
924 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
925}
926
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100927void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
928 const armnn::SliceDescriptor& sliceDescriptor,
929 const char* name)
930{
Jan Eilers8eb25602020-03-09 12:13:48 +0000931 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000932
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100933 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
934 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
935 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
936 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
937
938 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
939
940 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100941}
942
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000943// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000944void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
945 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000946 const char* name)
947{
Jan Eilers8eb25602020-03-09 12:13:48 +0000948 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000949
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000950 // Create FlatBuffer BaseLayer
951 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
952
953 // Create the FlatBuffer SoftmaxDescriptor
954 auto flatBufferSoftmaxDesc =
955 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
956
957 // Create the FlatBuffer SoftmaxLayer
958 auto flatBufferSoftmaxLayer =
959 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
960 flatBufferSoftmaxBaseLayer,
961 flatBufferSoftmaxDesc);
962
963 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
964}
965
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000966void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
967 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000968 const char* name)
969{
Jan Eilers8eb25602020-03-09 12:13:48 +0000970 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000971
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000972 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
973 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
974 m_flatBufferBuilder,
975 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
976 pooling2dDescriptor.m_PadLeft,
977 pooling2dDescriptor.m_PadRight,
978 pooling2dDescriptor.m_PadTop,
979 pooling2dDescriptor.m_PadBottom,
980 pooling2dDescriptor.m_PoolWidth,
981 pooling2dDescriptor.m_PoolHeight,
982 pooling2dDescriptor.m_StrideX,
983 pooling2dDescriptor.m_StrideY,
984 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
985 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
986 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
987
988 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
989 fbPooling2dBaseLayer,
990 fbPooling2dDescriptor);
991
992 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
993}
994
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100995void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
996 const char* name)
997{
Jan Eilers8eb25602020-03-09 12:13:48 +0000998 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000999
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001000 // Create FlatBuffer BaseLayer
1001 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1002
1003 // Create the FlatBuffer AdditionLayer
1004 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1005
1006 // Add the AnyLayer to the FlatBufferLayers
1007 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001008}
1009
Derek Lamberti87acb272019-03-27 16:51:31 +00001010void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
1011{
Jan Eilers8eb25602020-03-09 12:13:48 +00001012 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001013
Derek Lamberti87acb272019-03-27 16:51:31 +00001014 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1015 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1016 fbQuantizeBaseLayer);
1017 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1018}
1019
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001020// Build FlatBuffer for FullyConnected Layer
1021void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1022 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
1023 const armnn::ConstTensor& weights,
1024 const armnn::Optional<armnn::ConstTensor>& biases,
1025 const char* name)
1026{
Jan Eilers8eb25602020-03-09 12:13:48 +00001027 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001028
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001029 // Create FlatBuffer BaseLayer
1030 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1031
1032 // Create FlatBuffer FullyConnectedDescriptor
1033 auto flatBufferDescriptor =
1034 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1035 fullyConnectedDescriptor.m_BiasEnabled,
1036 fullyConnectedDescriptor.m_TransposeWeightMatrix);
1037
1038 // Create FlatBuffer weights data
1039 auto flatBufferWeights = CreateConstTensorInfo(weights);
1040
1041 // Create FlatBuffer bias data
1042 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
1043 if (fullyConnectedDescriptor.m_BiasEnabled)
1044 {
1045 flatBufferBiases = CreateConstTensorInfo(biases.value());
1046 }
1047
1048 // Create FlatBuffer FullyConnectedLayer
1049 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1050 flatBufferBaseLayer,
1051 flatBufferDescriptor,
1052 flatBufferWeights,
1053 flatBufferBiases);
1054
1055 // Add created FullyConnectedLayer to the FlatBufferLayers
1056 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1057}
1058
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001059// Build FlatBuffer for SpaceToBatchNd Layer
1060void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
1061 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1062 const char* name)
1063{
Jan Eilers8eb25602020-03-09 12:13:48 +00001064 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001065
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001066 // Create FlatBuffer BaseLayer
1067 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1068
1069 std::vector<unsigned int> padList;
1070 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1071 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1072 {
1073 padList.push_back(pad.first);
1074 padList.push_back(pad.second);
1075 }
1076
1077 auto flatBufferDescriptor =
1078 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1079 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1080 m_flatBufferBuilder.CreateVector(padList),
1081 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1082
1083 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1084 flatBufferBaseLayer,
1085 flatBufferDescriptor);
1086
1087 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1088}
1089
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001090// Build FlatBuffer for SpaceToDepthLayer
1091void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
1092 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1093 const char* name)
1094{
Jan Eilers8eb25602020-03-09 12:13:48 +00001095 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001096
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001097 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1098 auto flatBufferDescriptor =
1099 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1100 spaceToDepthDescriptor.m_BlockSize,
1101 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1102
1103 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1104 flatBufferBaseLayer,
1105 flatBufferDescriptor);
1106
1107 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001108}
1109
Jim Flynn18ce3382019-03-08 11:08:30 +00001110// Build FlatBuffer for Splitter Layer
1111void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
1112 const armnn::ViewsDescriptor& viewsDescriptor,
1113 const char* name)
1114{
Jan Eilers8eb25602020-03-09 12:13:48 +00001115 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001116
Jim Flynn18ce3382019-03-08 11:08:30 +00001117 // Create FlatBuffer ViewOrigins
1118 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1119 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1120
1121 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1122 {
1123 std::vector<uint32_t> viewOrigin;
1124 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1125
1126 // Copy vector
1127 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1128 {
1129 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1130 }
1131
1132 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1133 m_flatBufferBuilder.CreateVector(viewOrigin)));
1134 }
1135
1136 // Create FlatBuffer OriginsDescriptor
1137 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1138 viewsDescriptor.GetOrigins().GetConcatAxis(),
1139 viewsDescriptor.GetOrigins().GetNumViews(),
1140 viewsDescriptor.GetOrigins().GetNumDimensions(),
1141 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1142
1143 // Create FlatBuffer ViewOrigins
1144 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1145 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1146
1147 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1148 {
1149 std::vector<uint32_t> viewSize;
1150 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1151
1152 // Copy vector
1153 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1154 {
1155 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1156 }
1157
1158 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1159 m_flatBufferBuilder.CreateVector(viewSize)));
1160 }
1161
1162 // Create FlatBuffer ViewsDescriptor
1163 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1164 flatBufferOriginDescriptor,
1165 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1166
1167 // Create FlatBuffer BaseLayer
1168 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1169
1170 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1171 flatBufferBaseLayer,
1172 flatBufferViewsDescriptor);
1173
1174 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1175}
1176
Nina Drozd57728782019-02-27 10:53:27 +00001177void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
1178 const armnn::NormalizationDescriptor& descriptor,
1179 const char* name)
1180{
Jan Eilers8eb25602020-03-09 12:13:48 +00001181 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001182
Nina Drozd57728782019-02-27 10:53:27 +00001183 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1184
1185 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1186 m_flatBufferBuilder,
1187 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1188 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1189 descriptor.m_NormSize,
1190 descriptor.m_Alpha,
1191 descriptor.m_Beta,
1192 descriptor.m_K,
1193 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1194
1195 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1196 fbNormalizationBaseLayer,
1197 fbNormalizationDescriptor);
1198
1199 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1200}
1201
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001202void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1203 const armnn::StackDescriptor& stackDescriptor,
1204 const char* name)
1205{
Jan Eilers8eb25602020-03-09 12:13:48 +00001206 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001207
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001208 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1209
1210 std::vector<unsigned int> inputShape;
1211 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1212 {
1213 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1214 }
1215
1216 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1217 stackDescriptor.m_Axis,
1218 stackDescriptor.m_NumInputs,
1219 m_flatBufferBuilder.CreateVector(inputShape));
1220
1221 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1222 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001223}
1224
Derek Lamberti013c3902019-10-21 10:46:16 +01001225void SerializerVisitor::VisitStandInLayer(const armnn::IConnectableLayer *layer,
1226 const armnn::StandInDescriptor& standInDescriptor,
1227 const char *name)
1228{
Jan Eilers8eb25602020-03-09 12:13:48 +00001229 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001230
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001231 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1232 standInDescriptor.m_NumInputs,
1233 standInDescriptor.m_NumOutputs);
1234
1235 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1236 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1237
1238 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001239}
1240
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001241void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1242 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1243 const char* name)
1244{
Jan Eilers8eb25602020-03-09 12:13:48 +00001245 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001246
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001247 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1248
1249 auto flatBufferDescriptor =
1250 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1251 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1252 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1253 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1254 stridedSliceDescriptor.m_BeginMask,
1255 stridedSliceDescriptor.m_EndMask,
1256 stridedSliceDescriptor.m_ShrinkAxisMask,
1257 stridedSliceDescriptor.m_EllipsisMask,
1258 stridedSliceDescriptor.m_NewAxisMask,
1259 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1260
1261 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1262 flatBufferBaseLayer,
1263 flatBufferDescriptor);
1264
1265 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1266}
1267
Conor Kennedyda1f9752019-03-01 14:37:12 +00001268void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1269{
Jan Eilers8eb25602020-03-09 12:13:48 +00001270 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001271
Conor Kennedyda1f9752019-03-01 14:37:12 +00001272 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1273 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1274
1275 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1276}
1277
Sadik Armaganeff363d2019-04-05 15:25:46 +01001278void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1279{
Jan Eilers8eb25602020-03-09 12:13:48 +00001280 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001281
Sadik Armaganeff363d2019-04-05 15:25:46 +01001282 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1283 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1284
1285 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1286}
1287
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001288void SerializerVisitor::VisitTransposeConvolution2dLayer(
1289 const armnn::IConnectableLayer* layer,
1290 const armnn::TransposeConvolution2dDescriptor& descriptor,
1291 const armnn::ConstTensor& weights,
1292 const armnn::Optional<armnn::ConstTensor>& biases,
1293 const char* name)
1294{
Jan Eilers8eb25602020-03-09 12:13:48 +00001295 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001296
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001297 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1298 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1299 descriptor.m_PadLeft,
1300 descriptor.m_PadRight,
1301 descriptor.m_PadTop,
1302 descriptor.m_PadBottom,
1303 descriptor.m_StrideX,
1304 descriptor.m_StrideY,
1305 descriptor.m_BiasEnabled,
1306 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1307
1308 // weights & biases
1309 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1310 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1311 if (biases.has_value())
1312 {
1313 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1314 }
1315
1316 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1317 fbBaseLayer,
1318 fbDescriptor,
1319 fbWeightsConstTensorInfo,
1320 fbBiasesConstTensorInfo);
1321
1322 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001323}
1324
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001325void SerializerVisitor::VisitTransposeLayer(const armnn::IConnectableLayer* layer,
1326 const armnn::TransposeDescriptor& descriptor,
1327 const char* name)
1328{
Jan Eilers8eb25602020-03-09 12:13:48 +00001329 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001330
1331 // Create FlatBuffer BaseLayer
1332 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1333
1334 std::vector<unsigned int> dimMappings;
1335 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1336 {
1337 dimMappings.push_back(descriptor.m_DimMappings[i]);
1338 }
1339
1340 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1341 m_flatBufferBuilder.CreateVector(dimMappings));
1342
1343 // Create the FlatBuffer TransposeLayer
1344 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1345 flatBufferBaseLayer,
1346 flatBufferDesc);
1347
1348 // Add the AnyLayer to the FlatBufferLayers
1349 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1350}
1351
James Conroy586a9aa2020-03-20 08:49:33 +00001352void SerializerVisitor::VisitQLstmLayer(const armnn::IConnectableLayer* layer,
1353 const armnn::QLstmDescriptor& descriptor,
1354 const armnn::LstmInputParams& params,
1355 const char* name)
1356{
James Conroy8d333182020-05-13 10:27:58 +01001357 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001358
James Conroy8d333182020-05-13 10:27:58 +01001359 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1360
1361 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1362 m_flatBufferBuilder,
1363 descriptor.m_CifgEnabled,
1364 descriptor.m_PeepholeEnabled,
1365 descriptor.m_ProjectionEnabled,
1366 descriptor.m_LayerNormEnabled,
1367 descriptor.m_CellClip,
1368 descriptor.m_ProjectionClip,
1369 descriptor.m_InputIntermediateScale,
1370 descriptor.m_ForgetIntermediateScale,
1371 descriptor.m_CellIntermediateScale,
1372 descriptor.m_OutputIntermediateScale,
1373 descriptor.m_HiddenStateZeroPoint,
1374 descriptor.m_HiddenStateScale
1375 );
1376
1377 // Mandatory params
1378 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
1379 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
1380 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
1381 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
1382 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
1383 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
1384 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
1385 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
1386 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
1387
1388 // CIFG
1389 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1390 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1391 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1392
1393 if (!descriptor.m_CifgEnabled)
1394 {
1395 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
1396 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
1397 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
1398 }
1399
1400 // Projectiom
1401 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1402 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1403
1404 if (descriptor.m_ProjectionEnabled)
1405 {
1406 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
1407 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
1408 }
1409
1410 // Peephole
1411 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1412 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1413 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1414
1415 if (descriptor.m_PeepholeEnabled)
1416 {
1417 if (!descriptor.m_CifgEnabled)
1418 {
1419 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
1420 }
1421
1422 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
1423 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
1424 }
1425
1426 // Layer norm
1427 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1428 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1429 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1430 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1431
1432 if (descriptor.m_LayerNormEnabled)
1433 {
1434 if (!descriptor.m_CifgEnabled)
1435 {
1436 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
1437 }
1438
1439 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
1440 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
1441 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
1442 }
1443
1444 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1445 m_flatBufferBuilder,
1446 inputToForgetWeights,
1447 inputToCellWeights,
1448 inputToOutputWeights,
1449 recurrentToForgetWeights,
1450 recurrentToCellWeights,
1451 recurrentToOutputWeights,
1452 forgetGateBias,
1453 cellBias,
1454 outputGateBias,
1455 inputToInputWeights,
1456 recurrentToInputWeights,
1457 inputGateBias,
1458 projectionWeights,
1459 projectionBias,
1460 cellToInputWeights,
1461 cellToForgetWeights,
1462 cellToOutputWeights,
1463 inputLayerNormWeights,
1464 forgetLayerNormWeights,
1465 cellLayerNormWeights,
1466 outputLayerNormWeights);
1467
1468 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1469 m_flatBufferBuilder,
1470 fbQLstmBaseLayer,
1471 fbQLstmDescriptor,
1472 fbQLstmParams);
1473
1474 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001475}
1476
James Conroyee18dc82019-07-17 11:27:46 +01001477void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1478 const armnn::QuantizedLstmInputParams& params,
1479 const char* name)
1480{
Jan Eilers8eb25602020-03-09 12:13:48 +00001481 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001482
Jan Eilers5b01a892019-07-23 09:47:43 +01001483 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1484
1485 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001486 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1487 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1488 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1489 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001490
Francis Murtaghbb590b42019-08-14 09:51:36 +01001491 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1492 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1493 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1494 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001495
Francis Murtaghbb590b42019-08-14 09:51:36 +01001496 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1497 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1498 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1499 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001500
1501 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1502 m_flatBufferBuilder,
1503 inputToInputWeights,
1504 inputToForgetWeights,
1505 inputToCellWeights,
1506 inputToOutputWeights,
1507 recurrentToInputWeights,
1508 recurrentToForgetWeights,
1509 recurrentToCellWeights,
1510 recurrentToOutputWeights,
1511 inputGateBias,
1512 forgetGateBias,
1513 cellBias,
1514 outputGateBias);
1515
1516 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1517 m_flatBufferBuilder,
1518 fbQuantizedLstmBaseLayer,
1519 fbQuantizedLstmParams);
1520
1521 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001522}
1523
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001524fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001525 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001526{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001527
Sadik Armagandb059fd2019-03-20 12:28:32 +00001528 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1529
Mike Kelly8c1701a2019-02-11 17:01:27 +00001530 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1531 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1532
1533 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001534 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001535 m_flatBufferBuilder.CreateString(layer->GetName()),
1536 layerType,
1537 m_flatBufferBuilder.CreateVector(inputSlots),
1538 m_flatBufferBuilder.CreateVector(outputSlots));
1539}
1540
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001541void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001542{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001543
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001544 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001545 m_serializedLayers.push_back(anyLayer);
1546}
1547
Mike Kellya0766c32019-02-19 17:22:07 +00001548template <typename T>
1549flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1550{
1551 const T* buffer = reinterpret_cast<const T*>(memory);
1552 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1553 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1554 return fbVector;
1555}
1556
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001557flatbuffers::Offset<TensorInfo> SerializerVisitor::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001558{
Mike Kellya0766c32019-02-19 17:22:07 +00001559 // Get the dimensions
1560 std::vector<unsigned int> shape;
Mike Kellya0766c32019-02-19 17:22:07 +00001561 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1562 {
1563 shape.push_back(tensorInfo.GetShape()[dim]);
1564 }
1565
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001566 if (tensorInfo.HasPerAxisQuantization())
1567 {
1568 // Create FlatBuffer TensorInfo
1569 auto flatBufferTensorInfo =
1570 serializer::CreateTensorInfo(m_flatBufferBuilder,
1571 m_flatBufferBuilder.CreateVector(shape),
1572 GetFlatBufferDataType(tensorInfo.GetDataType()),
1573 tensorInfo.GetQuantizationScales()[0],
1574 tensorInfo.GetQuantizationOffset(),
1575 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
1576 tensorInfo.GetQuantizationDim().value());
1577 return flatBufferTensorInfo;
1578 }
1579
Mike Kellya0766c32019-02-19 17:22:07 +00001580 // Create FlatBuffer TensorInfo
1581 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1582 m_flatBufferBuilder.CreateVector(shape),
1583 GetFlatBufferDataType(tensorInfo.GetDataType()),
1584 tensorInfo.GetQuantizationScale(),
1585 tensorInfo.GetQuantizationOffset());
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001586 return flatBufferTensorInfo;
1587}
1588
1589flatbuffers::Offset<serializer::ConstTensor>
1590 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
1591{
1592 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1593
Mike Kellya0766c32019-02-19 17:22:07 +00001594 flatbuffers::Offset<void> fbPayload;
1595
1596 switch (tensorInfo.GetDataType())
1597 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001598 case armnn::DataType::Float32:
1599 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001600 {
1601 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1602 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1603 m_flatBufferBuilder,
1604 fbVector);
1605 fbPayload = flatBuffersData.o;
1606 break;
1607 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001608 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001609 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001610 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001611 {
1612 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1613 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1614 m_flatBufferBuilder,
1615 fbVector);
1616 fbPayload = flatBuffersData.o;
1617 break;
1618 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001619 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001620 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001621 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001622 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001623 default:
1624 {
1625 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1626 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1627 m_flatBufferBuilder,
1628 fbVector);
1629 fbPayload = flatBuffersData.o;
1630 }
1631 }
1632 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1633 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001634 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001635 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1636 fbPayload);
1637 return flatBufferConstTensor;
1638}
1639
Tee Jungaa920c52019-11-05 10:48:25 +00001640flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerVisitor::GetVersionTable()
1641{
1642 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1643 serializer::CreateFeatureCompatibilityVersions(
1644 m_flatBufferBuilder,
1645 1 // Binding ids scheme version
1646 );
1647 return versionsTable;
1648}
1649
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001650std::vector<fb::Offset<serializer::InputSlot>>
1651 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001652{
Mike Kellya0766c32019-02-19 17:22:07 +00001653 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001654
1655 // Get the InputSlots
1656 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1657 {
1658 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1659
1660 // Get the Connection for the InputSlot
1661 const IOutputSlot* connection = inputSlot.GetConnection();
1662
1663 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001664 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1665 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001666 // Create FlatBuffer InputSlot
1667 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1668 }
1669 return inputSlots;
1670}
1671
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001672std::vector<fb::Offset<serializer::OutputSlot>>
1673 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001674{
1675 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1676
1677 // Get the OutputSlots
1678 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1679 {
1680 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001681 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001682
Mike Kelly8c1701a2019-02-11 17:01:27 +00001683 // Create FlatBuffer Outputslot
1684 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1685 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001686 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001687 }
1688 return outputSlots;
1689}
1690
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001691
1692ISerializer* ISerializer::CreateRaw()
1693{
1694 return new Serializer();
1695}
1696
1697ISerializerPtr ISerializer::Create()
1698{
1699 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1700}
1701
1702void ISerializer::Destroy(ISerializer* serializer)
1703{
1704 delete serializer;
1705}
1706
1707void Serializer::Serialize(const INetwork& inNetwork)
1708{
1709 // Iterate through to network
1710 inNetwork.Accept(m_SerializerVisitor);
1711 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1712
1713 // Create FlatBuffer SerializedGraph
1714 auto serializedGraph = serializer::CreateSerializedGraph(
1715 fbBuilder,
1716 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1717 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
Tee Jungaa920c52019-11-05 10:48:25 +00001718 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()),
1719 m_SerializerVisitor.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001720
1721 // Serialize the graph
1722 fbBuilder.Finish(serializedGraph);
1723}
1724
1725bool Serializer::SaveSerializedToStream(std::ostream& stream)
1726{
1727 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1728
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001729 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1730 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001731 return !stream.bad();
1732}
1733
Keith Davis300ad562020-06-04 16:34:23 +01001734} // namespace armnnSerializer