blob: 6555a34be7b2a929d208648d5c93d43132f75a76 [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
Teresa Charlin52664732020-06-29 16:27:03 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Mike Kelly8c1701a2019-02-11 17:01:27 +00003// SPDX-License-Identifier: MIT
4//
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
Teresa Charlin52664732020-06-29 16:27:03 +0100496void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer,
497 const char* name)
498{
499 armnn::GatherDescriptor gatherDescriptor{};
500 VisitGatherLayer(layer, gatherDescriptor, name);
501}
502
503void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer,
504 const armnn::GatherDescriptor& gatherDescriptor,
505 const char* name)
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000506{
Jan Eilers8eb25602020-03-09 12:13:48 +0000507 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000508
Teresa Charlin52664732020-06-29 16:27:03 +0100509 auto fbGatherDescriptor = CreateGatherDescriptor(m_flatBufferBuilder,
510 gatherDescriptor.m_Axis);
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000511 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
Teresa Charlin52664732020-06-29 16:27:03 +0100512 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer, fbGatherDescriptor);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000513
514 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
515}
516
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000517void SerializerVisitor::VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
518{
Jan Eilers8eb25602020-03-09 12:13:48 +0000519 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000520
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000521 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000522 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000523
524 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
525}
526
Kevin Mayce5045a2019-10-02 14:07:47 +0100527void SerializerVisitor::VisitInstanceNormalizationLayer(
528 const armnn::IConnectableLayer* layer,
529 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
530 const char* name)
531{
Jan Eilers8eb25602020-03-09 12:13:48 +0000532 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000533
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100534 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
535 m_flatBufferBuilder,
536 instanceNormalizationDescriptor.m_Gamma,
537 instanceNormalizationDescriptor.m_Beta,
538 instanceNormalizationDescriptor.m_Eps,
539 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
540
541 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
542 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
543
544 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100545}
546
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000547void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
548 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
549 const char* name)
550{
Jan Eilers8eb25602020-03-09 12:13:48 +0000551 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000552
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000553 // Create FlatBuffer BaseLayer
554 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
555
556 // Create the FlatBuffer L2Normalization Descriptor
557 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100558 m_flatBufferBuilder,
559 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
560 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000561
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100562 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000563 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
564
565 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
566}
567
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100568void SerializerVisitor::VisitLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
569 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
570 const char* name)
571{
Jan Eilers8eb25602020-03-09 12:13:48 +0000572 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000573
Sadik Armagan26257852019-10-14 13:00:47 +0100574 // Create FlatBuffer BaseLayer
575 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
576
577 // Create the FlatBuffer LogSoftmaxDescriptor
578 auto flatBufferLogSoftmaxDesc =
579 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
580 logSoftmaxDescriptor.m_Beta,
581 logSoftmaxDescriptor.m_Axis);
582
583 // Create the FlatBuffer LogSoftmaxLayer
584 auto flatBufferLogSoftmaxLayer =
585 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
586 flatBufferLogSoftmaxBaseLayer,
587 flatBufferLogSoftmaxDesc);
588
589 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100590}
591
592void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer,
593 const armnn::LstmDescriptor& descriptor,
594 const armnn::LstmInputParams& params,
595 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000596{
Jan Eilers8eb25602020-03-09 12:13:48 +0000597 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000598
Jim Flynn11af3752019-03-19 17:22:29 +0000599 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
600
601 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
602 m_flatBufferBuilder,
603 descriptor.m_ActivationFunc,
604 descriptor.m_ClippingThresCell,
605 descriptor.m_ClippingThresProj,
606 descriptor.m_CifgEnabled,
607 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100608 descriptor.m_ProjectionEnabled,
609 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000610
611 // Get mandatory input parameters
612 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
613 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
614 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
615 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
616 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
617 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
618 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
619 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
620 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
621
622 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
623 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
624 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
625 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
626 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
627 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
628 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
629 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
630 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100631 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
632 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
633 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
634 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000635
636 if (!descriptor.m_CifgEnabled)
637 {
638 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
639 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
640 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
641 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
642 }
643
644 if (descriptor.m_ProjectionEnabled)
645 {
646 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
647 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
648 }
649
650 if (descriptor.m_PeepholeEnabled)
651 {
652 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
653 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
654 }
655
Jan Eilersf8c62972019-07-17 11:07:49 +0100656 if (descriptor.m_LayerNormEnabled)
657 {
658 if (!descriptor.m_CifgEnabled)
659 {
660 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
661 }
662 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
663 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
664 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
665 }
666
Jim Flynn11af3752019-03-19 17:22:29 +0000667 auto fbLstmParams = serializer::CreateLstmInputParams(
668 m_flatBufferBuilder,
669 inputToForgetWeights,
670 inputToCellWeights,
671 inputToOutputWeights,
672 recurrentToForgetWeights,
673 recurrentToCellWeights,
674 recurrentToOutputWeights,
675 forgetGateBias,
676 cellBias,
677 outputGateBias,
678 inputToInputWeights,
679 recurrentToInputWeights,
680 cellToInputWeights,
681 inputGateBias,
682 projectionWeights,
683 projectionBias,
684 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100685 cellToOutputWeights,
686 inputLayerNormWeights,
687 forgetLayerNormWeights,
688 cellLayerNormWeights,
689 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000690
691 auto fbLstmLayer = serializer::CreateLstmLayer(
692 m_flatBufferBuilder,
693 fbLstmBaseLayer,
694 fbLstmDescriptor,
695 fbLstmParams);
696
697 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
698}
699
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000700void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
701{
Jan Eilers8eb25602020-03-09 12:13:48 +0000702 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000703
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000704 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
705 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
706
707 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
708}
709
710void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
711 const armnn::MeanDescriptor& descriptor,
712 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 fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
717 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
718 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
719 descriptor.m_KeepDims);
720
721 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
722 fbMeanBaseLayer,
723 fbMeanDescriptor);
724
725 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
726}
727
728void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
729{
Jan Eilers8eb25602020-03-09 12:13:48 +0000730 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000731
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000732 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
733 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
734
735 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
736}
737
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100738void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
739{
Jan Eilers8eb25602020-03-09 12:13:48 +0000740 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000741
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100742 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
743 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
744
745 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
746}
747
Jim Flynnac25a1b2019-02-28 10:40:49 +0000748void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100749 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000750 const char* name)
751{
Jim Flynne242f2d2019-05-22 14:24:13 +0100752 VisitConcatLayer(layer, mergerDescriptor, name);
753}
754
755void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
756 const armnn::ConcatDescriptor& concatDescriptor,
757 const char* name)
758{
Jan Eilers8eb25602020-03-09 12:13:48 +0000759 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000760
Jim Flynne242f2d2019-05-22 14:24:13 +0100761 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000762
763 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100764 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000765 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100766 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000767 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100768 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000769 {
770 origins.push_back(origin[d]);
771 }
772 auto view = m_flatBufferBuilder.CreateVector(origins);
773 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
774 views.push_back(uintVector);
775 }
776
Jim Flynne242f2d2019-05-22 14:24:13 +0100777 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
778 concatDescriptor.GetConcatAxis(),
779 concatDescriptor.GetNumViews(),
780 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000781 m_flatBufferBuilder.CreateVector(views));
782
Jim Flynne242f2d2019-05-22 14:24:13 +0100783 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
784 flatBufferConcatBaseLayer,
785 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000786
Jim Flynne242f2d2019-05-22 14:24:13 +0100787 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000788}
789
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000790void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000791{
Jan Eilers8eb25602020-03-09 12:13:48 +0000792 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000793
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000794 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
795 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
796 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000797
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000798 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000799}
800
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000801void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
802 const armnn::PadDescriptor& padDescriptor,
803 const char* name)
804{
Jan Eilers8eb25602020-03-09 12:13:48 +0000805 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000806
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000807 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
808
809 std::vector<unsigned int> padList;
810 for (auto& p: padDescriptor.m_PadList)
811 {
812 padList.push_back(p.first);
813 padList.push_back(p.second);
814 }
815
816 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100817 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100818 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000819
820 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
821 flatBufferBaseLayer,
822 flatBufferPadDesc);
823
824 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
825}
826
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000827void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
828 const armnn::PermuteDescriptor& permuteDescriptor,
829 const char* name)
830{
Jan Eilers8eb25602020-03-09 12:13:48 +0000831 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000832
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000833 // Create FlatBuffer BaseLayer
834 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
835
836 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100837 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000838 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100839 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000840 }
841
842 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
843 m_flatBufferBuilder.CreateVector(dimMappings));
844
845 // Create the FlatBuffer PermuteLayer
846 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
847 flatBufferPermuteBaseLayer,
848 flatBufferPermuteDesc);
849
850 // Add the AnyLayer to the FlatBufferLayers
851 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
852}
853
Saoirse Stewart263829c2019-02-19 15:54:14 +0000854// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000855void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000856 const armnn::ReshapeDescriptor& reshapeDescriptor,
857 const char* name)
858{
Jan Eilers8eb25602020-03-09 12:13:48 +0000859 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000860
Saoirse Stewart263829c2019-02-19 15:54:14 +0000861 // Create FlatBuffer BaseLayer
862 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
863
864 std::vector<unsigned int> targetShape;
865 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
866 {
867 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
868 }
869
870 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
871 m_flatBufferBuilder.CreateVector(targetShape));
872
873 // Create the FlatBuffer ReshapeLayer
874 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
875 flatBufferReshapeDesc);
876
877 // Add the AnyLayer to the FlatBufferLayers
878 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
879}
880
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000881void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
882 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
883 const char* name)
884{
Jan Eilers8eb25602020-03-09 12:13:48 +0000885 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000886
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000887 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
888
889 auto flatBufferDescriptor =
890 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
891 resizeDescriptor.m_TargetWidth,
892 resizeDescriptor.m_TargetHeight,
David Monahan4a0c9b92020-05-30 09:48:39 +0100893 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
894 resizeDescriptor.m_AlignCorners,
895 resizeDescriptor.m_HalfPixelCenters);
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000896
897 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
898 flatBufferBaseLayer,
899 flatBufferDescriptor);
900
901 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
902}
903
Teresa Charlina9075df2019-06-27 15:41:57 +0100904void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
905 const armnn::ResizeDescriptor& resizeDescriptor,
906 const char* name)
907{
Jan Eilers8eb25602020-03-09 12:13:48 +0000908 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000909
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100910 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
911
912 auto flatBufferDescriptor =
913 CreateResizeDescriptor(m_flatBufferBuilder,
914 resizeDescriptor.m_TargetHeight,
915 resizeDescriptor.m_TargetWidth,
916 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +0100917 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
918 resizeDescriptor.m_AlignCorners,
919 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100920
921 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
922 flatBufferBaseLayer,
923 flatBufferDescriptor);
924
925 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100926}
927
Sadik Armagan8b42a382019-03-01 14:24:49 +0000928void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
929{
Jan Eilers8eb25602020-03-09 12:13:48 +0000930 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000931
Sadik Armagan8b42a382019-03-01 14:24:49 +0000932 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
933 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
934
935 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
936}
937
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100938void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
939 const armnn::SliceDescriptor& sliceDescriptor,
940 const char* name)
941{
Jan Eilers8eb25602020-03-09 12:13:48 +0000942 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000943
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100944 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
945 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
946 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
947 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
948
949 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
950
951 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100952}
953
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000954// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000955void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
956 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000957 const char* name)
958{
Jan Eilers8eb25602020-03-09 12:13:48 +0000959 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000960
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000961 // Create FlatBuffer BaseLayer
962 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
963
964 // Create the FlatBuffer SoftmaxDescriptor
965 auto flatBufferSoftmaxDesc =
966 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
967
968 // Create the FlatBuffer SoftmaxLayer
969 auto flatBufferSoftmaxLayer =
970 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
971 flatBufferSoftmaxBaseLayer,
972 flatBufferSoftmaxDesc);
973
974 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
975}
976
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000977void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
978 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000979 const char* name)
980{
Jan Eilers8eb25602020-03-09 12:13:48 +0000981 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000982
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000983 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
984 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
985 m_flatBufferBuilder,
986 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
987 pooling2dDescriptor.m_PadLeft,
988 pooling2dDescriptor.m_PadRight,
989 pooling2dDescriptor.m_PadTop,
990 pooling2dDescriptor.m_PadBottom,
991 pooling2dDescriptor.m_PoolWidth,
992 pooling2dDescriptor.m_PoolHeight,
993 pooling2dDescriptor.m_StrideX,
994 pooling2dDescriptor.m_StrideY,
995 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
996 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
997 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
998
999 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1000 fbPooling2dBaseLayer,
1001 fbPooling2dDescriptor);
1002
1003 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1004}
1005
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001006void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
1007 const char* name)
1008{
Jan Eilers8eb25602020-03-09 12:13:48 +00001009 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001010
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001011 // Create FlatBuffer BaseLayer
1012 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1013
1014 // Create the FlatBuffer AdditionLayer
1015 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1016
1017 // Add the AnyLayer to the FlatBufferLayers
1018 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001019}
1020
Derek Lamberti87acb272019-03-27 16:51:31 +00001021void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
1022{
Jan Eilers8eb25602020-03-09 12:13:48 +00001023 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001024
Derek Lamberti87acb272019-03-27 16:51:31 +00001025 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1026 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1027 fbQuantizeBaseLayer);
1028 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1029}
1030
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001031// Build FlatBuffer for FullyConnected Layer
1032void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1033 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
1034 const armnn::ConstTensor& weights,
1035 const armnn::Optional<armnn::ConstTensor>& biases,
1036 const char* name)
1037{
Jan Eilers8eb25602020-03-09 12:13:48 +00001038 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001039
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001040 // Create FlatBuffer BaseLayer
1041 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1042
1043 // Create FlatBuffer FullyConnectedDescriptor
1044 auto flatBufferDescriptor =
1045 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1046 fullyConnectedDescriptor.m_BiasEnabled,
1047 fullyConnectedDescriptor.m_TransposeWeightMatrix);
1048
1049 // Create FlatBuffer weights data
1050 auto flatBufferWeights = CreateConstTensorInfo(weights);
1051
1052 // Create FlatBuffer bias data
1053 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
1054 if (fullyConnectedDescriptor.m_BiasEnabled)
1055 {
1056 flatBufferBiases = CreateConstTensorInfo(biases.value());
1057 }
1058
1059 // Create FlatBuffer FullyConnectedLayer
1060 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1061 flatBufferBaseLayer,
1062 flatBufferDescriptor,
1063 flatBufferWeights,
1064 flatBufferBiases);
1065
1066 // Add created FullyConnectedLayer to the FlatBufferLayers
1067 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1068}
1069
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001070// Build FlatBuffer for SpaceToBatchNd Layer
1071void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
1072 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1073 const char* name)
1074{
Jan Eilers8eb25602020-03-09 12:13:48 +00001075 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001076
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001077 // Create FlatBuffer BaseLayer
1078 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1079
1080 std::vector<unsigned int> padList;
1081 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1082 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1083 {
1084 padList.push_back(pad.first);
1085 padList.push_back(pad.second);
1086 }
1087
1088 auto flatBufferDescriptor =
1089 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1090 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1091 m_flatBufferBuilder.CreateVector(padList),
1092 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1093
1094 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1095 flatBufferBaseLayer,
1096 flatBufferDescriptor);
1097
1098 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1099}
1100
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001101// Build FlatBuffer for SpaceToDepthLayer
1102void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
1103 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1104 const char* name)
1105{
Jan Eilers8eb25602020-03-09 12:13:48 +00001106 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001107
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001108 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1109 auto flatBufferDescriptor =
1110 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1111 spaceToDepthDescriptor.m_BlockSize,
1112 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1113
1114 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1115 flatBufferBaseLayer,
1116 flatBufferDescriptor);
1117
1118 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001119}
1120
Jim Flynn18ce3382019-03-08 11:08:30 +00001121// Build FlatBuffer for Splitter Layer
1122void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
1123 const armnn::ViewsDescriptor& viewsDescriptor,
1124 const char* name)
1125{
Jan Eilers8eb25602020-03-09 12:13:48 +00001126 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001127
Jim Flynn18ce3382019-03-08 11:08:30 +00001128 // Create FlatBuffer ViewOrigins
1129 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1130 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1131
1132 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1133 {
1134 std::vector<uint32_t> viewOrigin;
1135 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1136
1137 // Copy vector
1138 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1139 {
1140 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1141 }
1142
1143 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1144 m_flatBufferBuilder.CreateVector(viewOrigin)));
1145 }
1146
1147 // Create FlatBuffer OriginsDescriptor
1148 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1149 viewsDescriptor.GetOrigins().GetConcatAxis(),
1150 viewsDescriptor.GetOrigins().GetNumViews(),
1151 viewsDescriptor.GetOrigins().GetNumDimensions(),
1152 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1153
1154 // Create FlatBuffer ViewOrigins
1155 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1156 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1157
1158 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1159 {
1160 std::vector<uint32_t> viewSize;
1161 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1162
1163 // Copy vector
1164 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1165 {
1166 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1167 }
1168
1169 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1170 m_flatBufferBuilder.CreateVector(viewSize)));
1171 }
1172
1173 // Create FlatBuffer ViewsDescriptor
1174 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1175 flatBufferOriginDescriptor,
1176 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1177
1178 // Create FlatBuffer BaseLayer
1179 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1180
1181 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1182 flatBufferBaseLayer,
1183 flatBufferViewsDescriptor);
1184
1185 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1186}
1187
Nina Drozd57728782019-02-27 10:53:27 +00001188void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
1189 const armnn::NormalizationDescriptor& descriptor,
1190 const char* name)
1191{
Jan Eilers8eb25602020-03-09 12:13:48 +00001192 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001193
Nina Drozd57728782019-02-27 10:53:27 +00001194 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1195
1196 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1197 m_flatBufferBuilder,
1198 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1199 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1200 descriptor.m_NormSize,
1201 descriptor.m_Alpha,
1202 descriptor.m_Beta,
1203 descriptor.m_K,
1204 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1205
1206 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1207 fbNormalizationBaseLayer,
1208 fbNormalizationDescriptor);
1209
1210 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1211}
1212
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001213void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1214 const armnn::StackDescriptor& stackDescriptor,
1215 const char* name)
1216{
Jan Eilers8eb25602020-03-09 12:13:48 +00001217 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001218
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001219 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1220
1221 std::vector<unsigned int> inputShape;
1222 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1223 {
1224 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1225 }
1226
1227 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1228 stackDescriptor.m_Axis,
1229 stackDescriptor.m_NumInputs,
1230 m_flatBufferBuilder.CreateVector(inputShape));
1231
1232 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1233 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001234}
1235
Derek Lamberti013c3902019-10-21 10:46:16 +01001236void SerializerVisitor::VisitStandInLayer(const armnn::IConnectableLayer *layer,
1237 const armnn::StandInDescriptor& standInDescriptor,
1238 const char *name)
1239{
Jan Eilers8eb25602020-03-09 12:13:48 +00001240 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001241
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001242 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1243 standInDescriptor.m_NumInputs,
1244 standInDescriptor.m_NumOutputs);
1245
1246 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1247 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1248
1249 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001250}
1251
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001252void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1253 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1254 const char* name)
1255{
Jan Eilers8eb25602020-03-09 12:13:48 +00001256 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001257
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001258 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1259
1260 auto flatBufferDescriptor =
1261 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1262 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1263 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1264 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1265 stridedSliceDescriptor.m_BeginMask,
1266 stridedSliceDescriptor.m_EndMask,
1267 stridedSliceDescriptor.m_ShrinkAxisMask,
1268 stridedSliceDescriptor.m_EllipsisMask,
1269 stridedSliceDescriptor.m_NewAxisMask,
1270 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1271
1272 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1273 flatBufferBaseLayer,
1274 flatBufferDescriptor);
1275
1276 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1277}
1278
Conor Kennedyda1f9752019-03-01 14:37:12 +00001279void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1280{
Jan Eilers8eb25602020-03-09 12:13:48 +00001281 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001282
Conor Kennedyda1f9752019-03-01 14:37:12 +00001283 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1284 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1285
1286 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1287}
1288
Sadik Armaganeff363d2019-04-05 15:25:46 +01001289void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1290{
Jan Eilers8eb25602020-03-09 12:13:48 +00001291 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001292
Sadik Armaganeff363d2019-04-05 15:25:46 +01001293 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1294 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1295
1296 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1297}
1298
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001299void SerializerVisitor::VisitTransposeConvolution2dLayer(
1300 const armnn::IConnectableLayer* layer,
1301 const armnn::TransposeConvolution2dDescriptor& descriptor,
1302 const armnn::ConstTensor& weights,
1303 const armnn::Optional<armnn::ConstTensor>& biases,
1304 const char* name)
1305{
Jan Eilers8eb25602020-03-09 12:13:48 +00001306 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001307
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001308 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1309 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1310 descriptor.m_PadLeft,
1311 descriptor.m_PadRight,
1312 descriptor.m_PadTop,
1313 descriptor.m_PadBottom,
1314 descriptor.m_StrideX,
1315 descriptor.m_StrideY,
1316 descriptor.m_BiasEnabled,
1317 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1318
1319 // weights & biases
1320 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1321 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1322 if (biases.has_value())
1323 {
1324 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1325 }
1326
1327 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1328 fbBaseLayer,
1329 fbDescriptor,
1330 fbWeightsConstTensorInfo,
1331 fbBiasesConstTensorInfo);
1332
1333 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001334}
1335
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001336void SerializerVisitor::VisitTransposeLayer(const armnn::IConnectableLayer* layer,
1337 const armnn::TransposeDescriptor& descriptor,
1338 const char* name)
1339{
Jan Eilers8eb25602020-03-09 12:13:48 +00001340 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001341
1342 // Create FlatBuffer BaseLayer
1343 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1344
1345 std::vector<unsigned int> dimMappings;
1346 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1347 {
1348 dimMappings.push_back(descriptor.m_DimMappings[i]);
1349 }
1350
1351 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1352 m_flatBufferBuilder.CreateVector(dimMappings));
1353
1354 // Create the FlatBuffer TransposeLayer
1355 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1356 flatBufferBaseLayer,
1357 flatBufferDesc);
1358
1359 // Add the AnyLayer to the FlatBufferLayers
1360 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1361}
1362
James Conroy586a9aa2020-03-20 08:49:33 +00001363void SerializerVisitor::VisitQLstmLayer(const armnn::IConnectableLayer* layer,
1364 const armnn::QLstmDescriptor& descriptor,
1365 const armnn::LstmInputParams& params,
1366 const char* name)
1367{
James Conroy8d333182020-05-13 10:27:58 +01001368 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001369
James Conroy8d333182020-05-13 10:27:58 +01001370 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1371
1372 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1373 m_flatBufferBuilder,
1374 descriptor.m_CifgEnabled,
1375 descriptor.m_PeepholeEnabled,
1376 descriptor.m_ProjectionEnabled,
1377 descriptor.m_LayerNormEnabled,
1378 descriptor.m_CellClip,
1379 descriptor.m_ProjectionClip,
1380 descriptor.m_InputIntermediateScale,
1381 descriptor.m_ForgetIntermediateScale,
1382 descriptor.m_CellIntermediateScale,
1383 descriptor.m_OutputIntermediateScale,
1384 descriptor.m_HiddenStateZeroPoint,
1385 descriptor.m_HiddenStateScale
1386 );
1387
1388 // Mandatory params
1389 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
1390 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
1391 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
1392 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
1393 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
1394 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
1395 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
1396 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
1397 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
1398
1399 // CIFG
1400 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1401 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1402 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1403
1404 if (!descriptor.m_CifgEnabled)
1405 {
1406 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
1407 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
1408 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
1409 }
1410
1411 // Projectiom
1412 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1413 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1414
1415 if (descriptor.m_ProjectionEnabled)
1416 {
1417 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
1418 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
1419 }
1420
1421 // Peephole
1422 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1423 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1424 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1425
1426 if (descriptor.m_PeepholeEnabled)
1427 {
1428 if (!descriptor.m_CifgEnabled)
1429 {
1430 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
1431 }
1432
1433 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
1434 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
1435 }
1436
1437 // Layer norm
1438 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1439 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1440 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1441 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1442
1443 if (descriptor.m_LayerNormEnabled)
1444 {
1445 if (!descriptor.m_CifgEnabled)
1446 {
1447 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
1448 }
1449
1450 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
1451 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
1452 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
1453 }
1454
1455 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1456 m_flatBufferBuilder,
1457 inputToForgetWeights,
1458 inputToCellWeights,
1459 inputToOutputWeights,
1460 recurrentToForgetWeights,
1461 recurrentToCellWeights,
1462 recurrentToOutputWeights,
1463 forgetGateBias,
1464 cellBias,
1465 outputGateBias,
1466 inputToInputWeights,
1467 recurrentToInputWeights,
1468 inputGateBias,
1469 projectionWeights,
1470 projectionBias,
1471 cellToInputWeights,
1472 cellToForgetWeights,
1473 cellToOutputWeights,
1474 inputLayerNormWeights,
1475 forgetLayerNormWeights,
1476 cellLayerNormWeights,
1477 outputLayerNormWeights);
1478
1479 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1480 m_flatBufferBuilder,
1481 fbQLstmBaseLayer,
1482 fbQLstmDescriptor,
1483 fbQLstmParams);
1484
1485 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001486}
1487
James Conroyee18dc82019-07-17 11:27:46 +01001488void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1489 const armnn::QuantizedLstmInputParams& params,
1490 const char* name)
1491{
Jan Eilers8eb25602020-03-09 12:13:48 +00001492 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001493
Jan Eilers5b01a892019-07-23 09:47:43 +01001494 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1495
1496 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001497 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1498 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1499 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1500 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001501
Francis Murtaghbb590b42019-08-14 09:51:36 +01001502 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1503 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1504 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1505 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001506
Francis Murtaghbb590b42019-08-14 09:51:36 +01001507 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1508 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1509 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1510 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001511
1512 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1513 m_flatBufferBuilder,
1514 inputToInputWeights,
1515 inputToForgetWeights,
1516 inputToCellWeights,
1517 inputToOutputWeights,
1518 recurrentToInputWeights,
1519 recurrentToForgetWeights,
1520 recurrentToCellWeights,
1521 recurrentToOutputWeights,
1522 inputGateBias,
1523 forgetGateBias,
1524 cellBias,
1525 outputGateBias);
1526
1527 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1528 m_flatBufferBuilder,
1529 fbQuantizedLstmBaseLayer,
1530 fbQuantizedLstmParams);
1531
1532 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001533}
1534
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001535fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001536 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001537{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001538
Sadik Armagandb059fd2019-03-20 12:28:32 +00001539 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1540
Mike Kelly8c1701a2019-02-11 17:01:27 +00001541 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1542 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1543
1544 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001545 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001546 m_flatBufferBuilder.CreateString(layer->GetName()),
1547 layerType,
1548 m_flatBufferBuilder.CreateVector(inputSlots),
1549 m_flatBufferBuilder.CreateVector(outputSlots));
1550}
1551
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001552void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001553{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001554
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001555 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001556 m_serializedLayers.push_back(anyLayer);
1557}
1558
Mike Kellya0766c32019-02-19 17:22:07 +00001559template <typename T>
1560flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1561{
1562 const T* buffer = reinterpret_cast<const T*>(memory);
1563 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1564 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1565 return fbVector;
1566}
1567
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001568flatbuffers::Offset<TensorInfo> SerializerVisitor::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001569{
Mike Kellya0766c32019-02-19 17:22:07 +00001570 // Get the dimensions
1571 std::vector<unsigned int> shape;
Mike Kellya0766c32019-02-19 17:22:07 +00001572 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1573 {
1574 shape.push_back(tensorInfo.GetShape()[dim]);
1575 }
1576
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001577 if (tensorInfo.HasPerAxisQuantization())
1578 {
1579 // Create FlatBuffer TensorInfo
1580 auto flatBufferTensorInfo =
1581 serializer::CreateTensorInfo(m_flatBufferBuilder,
1582 m_flatBufferBuilder.CreateVector(shape),
1583 GetFlatBufferDataType(tensorInfo.GetDataType()),
1584 tensorInfo.GetQuantizationScales()[0],
1585 tensorInfo.GetQuantizationOffset(),
1586 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
1587 tensorInfo.GetQuantizationDim().value());
1588 return flatBufferTensorInfo;
1589 }
1590
Mike Kellya0766c32019-02-19 17:22:07 +00001591 // Create FlatBuffer TensorInfo
1592 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1593 m_flatBufferBuilder.CreateVector(shape),
1594 GetFlatBufferDataType(tensorInfo.GetDataType()),
1595 tensorInfo.GetQuantizationScale(),
1596 tensorInfo.GetQuantizationOffset());
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001597 return flatBufferTensorInfo;
1598}
1599
1600flatbuffers::Offset<serializer::ConstTensor>
1601 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
1602{
1603 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1604
Mike Kellya0766c32019-02-19 17:22:07 +00001605 flatbuffers::Offset<void> fbPayload;
1606
1607 switch (tensorInfo.GetDataType())
1608 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001609 case armnn::DataType::Float32:
1610 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001611 {
1612 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1613 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1614 m_flatBufferBuilder,
1615 fbVector);
1616 fbPayload = flatBuffersData.o;
1617 break;
1618 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001619 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001620 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001621 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001622 {
1623 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1624 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1625 m_flatBufferBuilder,
1626 fbVector);
1627 fbPayload = flatBuffersData.o;
1628 break;
1629 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001630 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001631 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001632 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001633 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001634 default:
1635 {
1636 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1637 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1638 m_flatBufferBuilder,
1639 fbVector);
1640 fbPayload = flatBuffersData.o;
1641 }
1642 }
1643 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1644 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001645 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001646 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1647 fbPayload);
1648 return flatBufferConstTensor;
1649}
1650
Tee Jungaa920c52019-11-05 10:48:25 +00001651flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerVisitor::GetVersionTable()
1652{
1653 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1654 serializer::CreateFeatureCompatibilityVersions(
1655 m_flatBufferBuilder,
1656 1 // Binding ids scheme version
1657 );
1658 return versionsTable;
1659}
1660
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001661std::vector<fb::Offset<serializer::InputSlot>>
1662 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001663{
Mike Kellya0766c32019-02-19 17:22:07 +00001664 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001665
1666 // Get the InputSlots
1667 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1668 {
1669 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1670
1671 // Get the Connection for the InputSlot
1672 const IOutputSlot* connection = inputSlot.GetConnection();
1673
1674 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001675 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1676 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001677 // Create FlatBuffer InputSlot
1678 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1679 }
1680 return inputSlots;
1681}
1682
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001683std::vector<fb::Offset<serializer::OutputSlot>>
1684 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001685{
1686 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1687
1688 // Get the OutputSlots
1689 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1690 {
1691 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001692 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001693
Mike Kelly8c1701a2019-02-11 17:01:27 +00001694 // Create FlatBuffer Outputslot
1695 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1696 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001697 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001698 }
1699 return outputSlots;
1700}
1701
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001702
1703ISerializer* ISerializer::CreateRaw()
1704{
1705 return new Serializer();
1706}
1707
1708ISerializerPtr ISerializer::Create()
1709{
1710 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1711}
1712
1713void ISerializer::Destroy(ISerializer* serializer)
1714{
1715 delete serializer;
1716}
1717
1718void Serializer::Serialize(const INetwork& inNetwork)
1719{
1720 // Iterate through to network
1721 inNetwork.Accept(m_SerializerVisitor);
1722 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1723
1724 // Create FlatBuffer SerializedGraph
1725 auto serializedGraph = serializer::CreateSerializedGraph(
1726 fbBuilder,
1727 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1728 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
Tee Jungaa920c52019-11-05 10:48:25 +00001729 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()),
1730 m_SerializerVisitor.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001731
1732 // Serialize the graph
1733 fbBuilder.Finish(serializedGraph);
1734}
1735
1736bool Serializer::SaveSerializedToStream(std::ostream& stream)
1737{
1738 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1739
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001740 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1741 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001742 return !stream.bad();
1743}
1744
Keith Davis300ad562020-06-04 16:34:23 +01001745} // namespace armnnSerializer