blob: 8a1f7716a17793d03982f9833f3b57a27cc9a13c [file] [log] [blame]
Mike Kelly8c1701a2019-02-11 17:01:27 +00001//
Teresa Charlin52664732020-06-29 16:27:03 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Mike Kelly8c1701a2019-02-11 17:01:27 +00003// SPDX-License-Identifier: MIT
4//
Mike Kelly8c1701a2019-02-11 17:01:27 +00005#include "Serializer.hpp"
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00006
Matthew Benthamff130e22020-01-17 11:47:42 +00007#include <armnn/Descriptors.hpp>
8#include <armnn/LstmParams.hpp>
9#include <armnn/QuantizedLstmParams.hpp>
Jan Eilers8eb25602020-03-09 12:13:48 +000010#include <armnn/utility/IgnoreUnused.hpp>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000011
Mike Kelly8c1701a2019-02-11 17:01:27 +000012#include <iostream>
Saoirse Stewart3166c3e2019-02-18 15:24:53 +000013
Aron Virginas-Tard4f0fea2019-04-09 14:08:06 +010014#include <boost/numeric/conversion/cast.hpp>
Mike Kelly8c1701a2019-02-11 17:01:27 +000015#include <flatbuffers/util.h>
16
Matthew Benthamff130e22020-01-17 11:47:42 +000017#include "SerializerUtils.hpp"
18
Mike Kelly8c1701a2019-02-11 17:01:27 +000019using namespace armnn;
20namespace fb = flatbuffers;
Derek Lamberti0028d1b2019-02-20 13:57:42 +000021namespace serializer = armnnSerializer;
Mike Kelly8c1701a2019-02-11 17:01:27 +000022
23namespace armnnSerializer
24{
25
Mike Kellyaf484012019-02-20 16:53:11 +000026serializer::ActivationFunction GetFlatBufferActivationFunction(armnn::ActivationFunction function)
27{
28 switch (function)
29 {
30 case armnn::ActivationFunction::Sigmoid:
31 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
32 case armnn::ActivationFunction::TanH:
33 return serializer::ActivationFunction::ActivationFunction_TanH;
34 case armnn::ActivationFunction::Linear:
35 return serializer::ActivationFunction::ActivationFunction_Linear;
36 case armnn::ActivationFunction::ReLu:
37 return serializer::ActivationFunction::ActivationFunction_ReLu;
38 case armnn::ActivationFunction::BoundedReLu:
39 return serializer::ActivationFunction::ActivationFunction_BoundedReLu;
40 case armnn::ActivationFunction::LeakyReLu:
41 return serializer::ActivationFunction::ActivationFunction_LeakyReLu;
42 case armnn::ActivationFunction::Abs:
43 return serializer::ActivationFunction::ActivationFunction_Abs;
44 case armnn::ActivationFunction::Sqrt:
45 return serializer::ActivationFunction::ActivationFunction_Sqrt;
46 case armnn::ActivationFunction::Square:
47 return serializer::ActivationFunction::ActivationFunction_Square;
David Monahan3b3c3812020-02-25 09:03:29 +000048 case armnn::ActivationFunction::Elu:
49 return serializer::ActivationFunction::ActivationFunction_Elu;
Colm Donelan03fbeaf2020-02-26 15:39:23 +000050 case armnn::ActivationFunction::HardSwish:
51 return serializer::ActivationFunction::ActivationFunction_HardSwish;
Mike Kellyaf484012019-02-20 16:53:11 +000052 default:
53 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
54 }
55}
56
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +010057serializer::ArgMinMaxFunction GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)
58{
59 switch (function)
60 {
61 case armnn::ArgMinMaxFunction::Max:
62 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
63 case armnn::ArgMinMaxFunction::Min:
64 default:
65 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
66 }
67}
68
janeil013fec1ea2019-11-07 09:47:20 +000069uint32_t SerializerVisitor::GetSerializedId(armnn::LayerGuid guid)
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000070{
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000071 if (m_guidMap.empty())
72 {
janeil013fec1ea2019-11-07 09:47:20 +000073 m_guidMap.insert(std::make_pair(guid, m_layerId));
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000074 }
75 else if (m_guidMap.find(guid) == m_guidMap.end())
76 {
janeil013fec1ea2019-11-07 09:47:20 +000077 ++m_layerId;
78 m_guidMap.insert(std::make_pair(guid, m_layerId));
79
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000080 return m_layerId;
81 }
Saoirse Stewart30211042019-02-18 17:19:16 +000082 return m_guidMap[guid];
Saoirse Stewartcb8a3212019-02-14 15:46:10 +000083}
84
Mike Kelly8c1701a2019-02-11 17:01:27 +000085// Build FlatBuffer for Input Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +000086void SerializerVisitor::VisitInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +000087{
Jan Eilers8eb25602020-03-09 12:13:48 +000088 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +000089
Mike Kelly8c1701a2019-02-11 17:01:27 +000090 // Create FlatBuffer BaseLayer
91 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
92
93 // Create FlatBuffer BindableBaseLayer
94 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
95 flatBufferInputBaseLayer,
96 id);
Tee Jungaa920c52019-11-05 10:48:25 +000097 // Push layer binding id to outputIds.
98 m_inputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +000099
100 // Create the FlatBuffer InputLayer
101 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
102
103 // Add the AnyLayer to the FlatBufferLayers
104 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
105}
106
107// Build FlatBuffer for Output Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000108void SerializerVisitor::VisitOutputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000109{
Jan Eilers8eb25602020-03-09 12:13:48 +0000110 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000111
Mike Kelly8c1701a2019-02-11 17:01:27 +0000112 // Create FlatBuffer BaseLayer
113 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
114
115 // Create FlatBuffer BindableBaseLayer
116 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
117 flatBufferOutputBaseLayer,
118 id);
Tee Jungaa920c52019-11-05 10:48:25 +0000119 // Push layer binding id to outputIds.
120 m_outputIds.push_back(id);
Mike Kelly8c1701a2019-02-11 17:01:27 +0000121
122 // Create the FlatBuffer OutputLayer
123 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
124 // Add the AnyLayer to the FlatBufferLayers
125 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
126}
127
Kevin May868eb142019-09-04 17:29:31 +0100128void SerializerVisitor::VisitAbsLayer(const armnn::IConnectableLayer* layer, const char* name)
129{
Jan Eilers8eb25602020-03-09 12:13:48 +0000130 IgnoreUnused(name);
FinnWilliamsArm4ffcc8f2019-09-05 14:34:20 +0100131 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Abs);
132 auto flatBufferAbsLayer = serializer::CreateAbsLayer(m_flatBufferBuilder, flatBufferBaseLayer);
133
134 CreateAnyLayer(flatBufferAbsLayer.o, serializer::Layer::Layer_AbsLayer);
Kevin May868eb142019-09-04 17:29:31 +0100135}
136
Mike Kellyaf484012019-02-20 16:53:11 +0000137// Build FlatBuffer for Activation Layer
138void SerializerVisitor::VisitActivationLayer(const armnn::IConnectableLayer* layer,
139 const armnn::ActivationDescriptor& descriptor,
140 const char* name)
141{
Jan Eilers8eb25602020-03-09 12:13:48 +0000142 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000143
Mike Kellyaf484012019-02-20 16:53:11 +0000144 // Create FlatBuffer BaseLayer
145 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
146
147 // Create the FlatBuffer ActivationDescriptor
148 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
149 GetFlatBufferActivationFunction(descriptor.m_Function),
150 descriptor.m_A,
151 descriptor.m_B);
152
153 // Create the FlatBuffer ActivationLayer
154 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
155 flatBufferBaseLayer,
156 flatBufferDescriptor);
157
158 // Add the AnyLayer to the FlatBufferLayers
159 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
160}
161
Mike Kelly8c1701a2019-02-11 17:01:27 +0000162// Build FlatBuffer for Addition Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000163void SerializerVisitor::VisitAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
Mike Kelly8c1701a2019-02-11 17:01:27 +0000164{
Jan Eilers8eb25602020-03-09 12:13:48 +0000165 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000166
Mike Kelly8c1701a2019-02-11 17:01:27 +0000167 // Create FlatBuffer BaseLayer
168 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
169
170 // Create the FlatBuffer AdditionLayer
171 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
172
173 // Add the AnyLayer to the FlatBufferLayers
174 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
175}
176
Nikhil Rajee391d52019-09-05 17:50:44 +0100177// Build FlatBuffer for ArgMinMax Layer
178void SerializerVisitor::VisitArgMinMaxLayer(const armnn::IConnectableLayer *layer,
179 const armnn::ArgMinMaxDescriptor& descriptor,
180 const char *name)
181{
Jan Eilers8eb25602020-03-09 12:13:48 +0000182 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000183
Narumol Prangnawarat0cfcf232019-09-09 17:16:24 +0100184 // Create FlatBuffer BaseLayer
185 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
186
187 // Create FlatBuffer Descriptor
188 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
189 GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
190 descriptor.m_Axis);
191
192 // Create FlatBuffer ArgMinMaxLayer
193 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
194 flatBufferBaseLayer,
195 flatBufferDescriptor);
196
197 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
Nikhil Rajee391d52019-09-05 17:50:44 +0100198}
199
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000200// Build FlatBuffer for BatchToSpaceNd Layer
201void SerializerVisitor::VisitBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
202 const armnn::BatchToSpaceNdDescriptor& descriptor,
203 const char* name)
204{
Jan Eilers8eb25602020-03-09 12:13:48 +0000205 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000206
Nattapat Chaimanowong6b4ed982019-02-26 17:24:13 +0000207 // Create FlatBuffer BaseLayer
208 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
209
210 std::vector<unsigned int> crops;
211 crops.reserve(descriptor.m_Crops.size() * 2);
212 for (auto& crop : descriptor.m_Crops)
213 {
214 crops.push_back(crop.first);
215 crops.push_back(crop.second);
216 }
217
218 auto flatBufferDescriptor =
219 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
220 m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
221 m_flatBufferBuilder.CreateVector(crops),
222 GetFlatBufferDataLayout(descriptor.m_DataLayout));
223
224 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
225 flatBufferBaseLayer,
226 flatBufferDescriptor);
227
228 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
229}
230
ruoyan018e7fa232019-02-28 15:09:07 +0000231void SerializerVisitor::VisitBatchNormalizationLayer(const armnn::IConnectableLayer* layer,
232 const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
233 const armnn::ConstTensor& mean,
234 const armnn::ConstTensor& variance,
235 const armnn::ConstTensor& beta,
236 const armnn::ConstTensor& gamma,
237 const char* name)
238{
Jan Eilers8eb25602020-03-09 12:13:48 +0000239 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000240
ruoyan018e7fa232019-02-28 15:09:07 +0000241 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
242 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
243 m_flatBufferBuilder,
244 batchNormDescriptor.m_Eps,
245 GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
246
247 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
248 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
249 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
250 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
251 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
252 fbBatchNormalizationBaseLayer,
253 fbBatchNormalizationDescriptor,
254 fbMeanConstTensorInfo,
255 fbVarianceConstTensorInfo,
256 fbBetaConstTensorInfo,
257 fbGammaConstTensorInfo);
258
259 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
260}
261
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100262void SerializerVisitor::VisitComparisonLayer(const armnn::IConnectableLayer* layer,
263 const armnn::ComparisonDescriptor& descriptor,
264 const char* name)
265{
Jan Eilers8eb25602020-03-09 12:13:48 +0000266 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000267
Aron Virginas-Tare80ebd12019-10-17 16:11:54 +0100268 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
269 auto fbDescriptor = serializer::CreateComparisonDescriptor(
270 m_flatBufferBuilder,
271 GetFlatBufferComparisonOperation(descriptor.m_Operation));
272
273 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
274 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100275}
276
Conor Kennedy76277882019-02-26 08:29:54 +0000277// Build FlatBuffer for Constant Layer
278void SerializerVisitor::VisitConstantLayer(const armnn::IConnectableLayer* layer,
279 const armnn::ConstTensor& input,
280 const char* name)
281{
Jan Eilers8eb25602020-03-09 12:13:48 +0000282 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000283
Conor Kennedy76277882019-02-26 08:29:54 +0000284 // Create FlatBuffer BaseLayer
285 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
286
287 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
288
289 // Create the FlatBuffer ConstantLayer
290 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
291 flatBufferConstantBaseLayer,
292 flatBufferConstTensorInfo);
293
294 // Add the AnyLayer to the FlatBufferLayers
295 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
296}
297
Mike Kellya0766c32019-02-19 17:22:07 +0000298// Build FlatBuffer for Convolution2dLayer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000299void SerializerVisitor::VisitConvolution2dLayer(const armnn::IConnectableLayer* layer,
300 const armnn::Convolution2dDescriptor& descriptor,
301 const armnn::ConstTensor& weights,
302 const armnn::Optional<armnn::ConstTensor>& biases,
Mike Kellya0766c32019-02-19 17:22:07 +0000303 const char* name)
304{
Jan Eilers8eb25602020-03-09 12:13:48 +0000305 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000306
Mike Kellya0766c32019-02-19 17:22:07 +0000307 // Create FlatBuffer BaseLayer
308 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
309
310 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
311 descriptor.m_PadLeft,
312 descriptor.m_PadRight,
313 descriptor.m_PadTop,
314 descriptor.m_PadBottom,
315 descriptor.m_StrideX,
316 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100317 descriptor.m_DilationX,
318 descriptor.m_DilationY,
Mike Kellya0766c32019-02-19 17:22:07 +0000319 descriptor.m_BiasEnabled,
320 GetFlatBufferDataLayout(descriptor.m_DataLayout));
321 auto flatBufferWeightsConstTensorInfo = CreateConstTensorInfo(weights);
322 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiasesConstTensorInfo;
323
324 if (biases.has_value())
325 {
326 flatBufferBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
327 }
328
329 // Create the FlatBuffer Convolution2dLayer
330 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
331 flatBufferBaseLayer,
332 flatBufferDescriptor,
333 flatBufferWeightsConstTensorInfo,
334 flatBufferBiasesConstTensorInfo);
335
336 // Add the AnyLayer to the FlatBufferLayers
337 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
338}
339
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100340void SerializerVisitor::VisitDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
341 const armnn::DepthToSpaceDescriptor& descriptor,
342 const char* name)
343{
Jan Eilers8eb25602020-03-09 12:13:48 +0000344 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000345
Aron Virginas-Tarda9d2d32019-09-20 10:42:02 +0100346 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
347 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
348 descriptor.m_BlockSize,
349 GetFlatBufferDataLayout(descriptor.m_DataLayout));
350
351 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
352
353 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
Aron Virginas-Tardd6247f2019-09-19 14:31:17 +0100354}
355
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000356void SerializerVisitor::VisitDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
357 const armnn::DepthwiseConvolution2dDescriptor& descriptor,
358 const armnn::ConstTensor& weights,
359 const armnn::Optional<armnn::ConstTensor>& biases,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000360 const char* name)
361{
Jan Eilers8eb25602020-03-09 12:13:48 +0000362 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000363
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000364 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
365 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
366 descriptor.m_PadLeft,
367 descriptor.m_PadRight,
368 descriptor.m_PadTop,
369 descriptor.m_PadBottom,
370 descriptor.m_StrideX,
371 descriptor.m_StrideY,
Matthew Benthamacad04e2019-05-13 10:02:45 +0100372 descriptor.m_DilationX,
373 descriptor.m_DilationY,
Aron Virginas-Tarc04125f2019-02-19 16:31:08 +0000374 descriptor.m_BiasEnabled,
375 GetFlatBufferDataLayout(descriptor.m_DataLayout));
376
377 flatbuffers::Offset<serializer::ConstTensor> fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
378 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
379 if (biases.has_value())
380 {
381 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
382 }
383
384 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
385 fbBaseLayer,
386 fbDescriptor,
387 fbWeightsConstTensorInfo,
388 fbBiasesConstTensorInfo);
389
390 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
391}
392
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000393void SerializerVisitor::VisitDequantizeLayer(const armnn::IConnectableLayer* layer,
394 const char* name)
395{
Jan Eilers8eb25602020-03-09 12:13:48 +0000396 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000397
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000398 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
399 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
400
401 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
402}
403
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000404void SerializerVisitor::VisitDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
405 const armnn::DetectionPostProcessDescriptor& descriptor,
406 const armnn::ConstTensor& anchors,
407 const char* name)
408{
Jan Eilers8eb25602020-03-09 12:13:48 +0000409 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000410
Nattapat Chaimanowong3e14a9d2019-03-18 12:37:06 +0000411 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
412 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
413 descriptor.m_MaxDetections,
414 descriptor.m_MaxClassesPerDetection,
415 descriptor.m_DetectionsPerClass,
416 descriptor.m_NmsScoreThreshold,
417 descriptor.m_NmsIouThreshold,
418 descriptor.m_NumClasses,
419 descriptor.m_UseRegularNms,
420 descriptor.m_ScaleX,
421 descriptor.m_ScaleY,
422 descriptor.m_ScaleW,
423 descriptor.m_ScaleH);
424
425 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
426
427 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
428 fbBaseLayer,
429 fbDescriptor,
430 fbAnchorsConstTensorInfo);
431
432 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
433}
434
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000435void SerializerVisitor::VisitDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
436{
Jan Eilers8eb25602020-03-09 12:13:48 +0000437 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000438
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000439 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
440 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000441
Aron Virginas-Tar0fe32452019-02-28 13:12:47 +0000442 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
443}
Éanna Ó Catháin58885892019-02-27 16:16:39 +0000444
josh minor4a3c6102020-01-06 16:40:46 -0600445void SerializerVisitor::VisitElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
446 const armnn::ElementwiseUnaryDescriptor& descriptor,
447 const char* name)
448{
Jan Eilers8eb25602020-03-09 12:13:48 +0000449 IgnoreUnused(name);
josh minor4a3c6102020-01-06 16:40:46 -0600450
451 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
452 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
453 m_flatBufferBuilder,
454 GetFlatBufferUnaryOperation(descriptor.m_Operation));
455
456 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
457 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
458}
459
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000460void SerializerVisitor::VisitEqualLayer(const armnn::IConnectableLayer* layer, const char* name)
461{
Jan Eilers8eb25602020-03-09 12:13:48 +0000462 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000463
Aron Virginas-Tar377351e2019-02-27 14:42:31 +0000464 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Equal);
465 auto fbEqualLayer = serializer::CreateEqualLayer(m_flatBufferBuilder, fbBaseLayer);
466
467 CreateAnyLayer(fbEqualLayer.o, serializer::Layer::Layer_EqualLayer);
468}
469
Ryan OSheaec6c6802020-06-05 17:17:06 +0100470void SerializerVisitor::VisitFillLayer(const armnn::IConnectableLayer* layer,
471 const armnn::FillDescriptor& fillDescriptor,
472 const char* name)
473{
Ryan OSheaec6c6802020-06-05 17:17:06 +0100474 IgnoreUnused(name);
Keith Davis300ad562020-06-04 16:34:23 +0100475
476 auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill);
477
478 auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.m_Value);
479
480 auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor);
481
482 CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer);
Ryan OSheaec6c6802020-06-05 17:17:06 +0100483}
484
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000485void SerializerVisitor::VisitFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
486{
Jan Eilers8eb25602020-03-09 12:13:48 +0000487 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000488
Finn Williamsdd2ba7e2019-03-01 11:51:52 +0000489 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
490 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
491
492 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
493}
494
Teresa Charlin52664732020-06-29 16:27:03 +0100495void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer,
496 const char* name)
497{
498 armnn::GatherDescriptor gatherDescriptor{};
499 VisitGatherLayer(layer, gatherDescriptor, name);
500}
501
502void SerializerVisitor::VisitGatherLayer(const armnn::IConnectableLayer* layer,
503 const armnn::GatherDescriptor& gatherDescriptor,
504 const char* name)
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000505{
Jan Eilers8eb25602020-03-09 12:13:48 +0000506 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000507
Teresa Charlin52664732020-06-29 16:27:03 +0100508 auto fbGatherDescriptor = CreateGatherDescriptor(m_flatBufferBuilder,
509 gatherDescriptor.m_Axis);
Matteo Martincighf81edaa2019-03-04 14:34:30 +0000510 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
Teresa Charlin52664732020-06-29 16:27:03 +0100511 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer, fbGatherDescriptor);
Saoirse Stewarta1ed73a2019-03-04 13:40:12 +0000512
513 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
514}
515
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000516void SerializerVisitor::VisitGreaterLayer(const armnn::IConnectableLayer* layer, const char* name)
517{
Jan Eilers8eb25602020-03-09 12:13:48 +0000518 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000519
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000520 auto fbGreaterBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Greater);
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000521 auto fbGreaterLayer = serializer::CreateGreaterLayer(m_flatBufferBuilder, fbGreaterBaseLayer);
Conor Kennedy79ffdf52019-03-01 14:24:54 +0000522
523 CreateAnyLayer(fbGreaterLayer.o, serializer::Layer::Layer_GreaterLayer);
524}
525
Kevin Mayce5045a2019-10-02 14:07:47 +0100526void SerializerVisitor::VisitInstanceNormalizationLayer(
527 const armnn::IConnectableLayer* layer,
528 const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
529 const char* name)
530{
Jan Eilers8eb25602020-03-09 12:13:48 +0000531 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000532
Aron Virginas-Tar781ced92019-10-03 11:15:39 +0100533 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
534 m_flatBufferBuilder,
535 instanceNormalizationDescriptor.m_Gamma,
536 instanceNormalizationDescriptor.m_Beta,
537 instanceNormalizationDescriptor.m_Eps,
538 GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
539
540 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
541 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
542
543 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
Kevin Mayce5045a2019-10-02 14:07:47 +0100544}
545
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000546void SerializerVisitor::VisitL2NormalizationLayer(const armnn::IConnectableLayer* layer,
547 const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
548 const char* name)
549{
Jan Eilers8eb25602020-03-09 12:13:48 +0000550 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000551
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000552 // Create FlatBuffer BaseLayer
553 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
554
555 // Create the FlatBuffer L2Normalization Descriptor
556 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100557 m_flatBufferBuilder,
558 GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
559 l2NormalizationDescriptor.m_Eps);
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000560
Ferran Balaguer0dcffec2019-06-18 16:25:06 +0100561 // Create FlatBuffer layer
Narumol Prangnawarat495701f2019-03-07 17:31:34 +0000562 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
563
564 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
565}
566
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100567void SerializerVisitor::VisitLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
568 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
569 const char* name)
570{
Jan Eilers8eb25602020-03-09 12:13:48 +0000571 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000572
Sadik Armagan26257852019-10-14 13:00:47 +0100573 // Create FlatBuffer BaseLayer
574 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
575
576 // Create the FlatBuffer LogSoftmaxDescriptor
577 auto flatBufferLogSoftmaxDesc =
578 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
579 logSoftmaxDescriptor.m_Beta,
580 logSoftmaxDescriptor.m_Axis);
581
582 // Create the FlatBuffer LogSoftmaxLayer
583 auto flatBufferLogSoftmaxLayer =
584 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
585 flatBufferLogSoftmaxBaseLayer,
586 flatBufferLogSoftmaxDesc);
587
588 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100589}
590
591void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer,
592 const armnn::LstmDescriptor& descriptor,
593 const armnn::LstmInputParams& params,
594 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000595{
Jan Eilers8eb25602020-03-09 12:13:48 +0000596 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000597
Jim Flynn11af3752019-03-19 17:22:29 +0000598 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
599
600 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
601 m_flatBufferBuilder,
602 descriptor.m_ActivationFunc,
603 descriptor.m_ClippingThresCell,
604 descriptor.m_ClippingThresProj,
605 descriptor.m_CifgEnabled,
606 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100607 descriptor.m_ProjectionEnabled,
608 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000609
610 // Get mandatory input parameters
611 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
612 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
613 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
614 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
615 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
616 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
617 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
618 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
619 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
620
621 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
622 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
623 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
624 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
625 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
626 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
627 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
628 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
629 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100630 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
631 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
632 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
633 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000634
635 if (!descriptor.m_CifgEnabled)
636 {
637 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
638 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
639 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
640 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
641 }
642
643 if (descriptor.m_ProjectionEnabled)
644 {
645 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
646 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
647 }
648
649 if (descriptor.m_PeepholeEnabled)
650 {
651 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
652 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
653 }
654
Jan Eilersf8c62972019-07-17 11:07:49 +0100655 if (descriptor.m_LayerNormEnabled)
656 {
657 if (!descriptor.m_CifgEnabled)
658 {
659 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
660 }
661 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
662 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
663 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
664 }
665
Jim Flynn11af3752019-03-19 17:22:29 +0000666 auto fbLstmParams = serializer::CreateLstmInputParams(
667 m_flatBufferBuilder,
668 inputToForgetWeights,
669 inputToCellWeights,
670 inputToOutputWeights,
671 recurrentToForgetWeights,
672 recurrentToCellWeights,
673 recurrentToOutputWeights,
674 forgetGateBias,
675 cellBias,
676 outputGateBias,
677 inputToInputWeights,
678 recurrentToInputWeights,
679 cellToInputWeights,
680 inputGateBias,
681 projectionWeights,
682 projectionBias,
683 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100684 cellToOutputWeights,
685 inputLayerNormWeights,
686 forgetLayerNormWeights,
687 cellLayerNormWeights,
688 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000689
690 auto fbLstmLayer = serializer::CreateLstmLayer(
691 m_flatBufferBuilder,
692 fbLstmBaseLayer,
693 fbLstmDescriptor,
694 fbLstmParams);
695
696 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
697}
698
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000699void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
700{
Jan Eilers8eb25602020-03-09 12:13:48 +0000701 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000702
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000703 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
704 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
705
706 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
707}
708
709void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
710 const armnn::MeanDescriptor& descriptor,
711 const char* name)
712{
Jan Eilers8eb25602020-03-09 12:13:48 +0000713 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000714
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000715 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
716 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
717 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
718 descriptor.m_KeepDims);
719
720 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
721 fbMeanBaseLayer,
722 fbMeanDescriptor);
723
724 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
725}
726
727void SerializerVisitor::VisitMinimumLayer(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
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000731 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
732 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
733
734 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
735}
736
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100737void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
738{
Jan Eilers8eb25602020-03-09 12:13:48 +0000739 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000740
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100741 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
742 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
743
744 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
745}
746
Jim Flynnac25a1b2019-02-28 10:40:49 +0000747void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100748 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000749 const char* name)
750{
Jim Flynne242f2d2019-05-22 14:24:13 +0100751 VisitConcatLayer(layer, mergerDescriptor, name);
752}
753
754void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
755 const armnn::ConcatDescriptor& concatDescriptor,
756 const char* name)
757{
Jan Eilers8eb25602020-03-09 12:13:48 +0000758 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000759
Jim Flynne242f2d2019-05-22 14:24:13 +0100760 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000761
762 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100763 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000764 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100765 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000766 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100767 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000768 {
769 origins.push_back(origin[d]);
770 }
771 auto view = m_flatBufferBuilder.CreateVector(origins);
772 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
773 views.push_back(uintVector);
774 }
775
Jim Flynne242f2d2019-05-22 14:24:13 +0100776 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
777 concatDescriptor.GetConcatAxis(),
778 concatDescriptor.GetNumViews(),
779 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000780 m_flatBufferBuilder.CreateVector(views));
781
Jim Flynne242f2d2019-05-22 14:24:13 +0100782 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
783 flatBufferConcatBaseLayer,
784 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000785
Jim Flynne242f2d2019-05-22 14:24:13 +0100786 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000787}
788
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000789void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000790{
Jan Eilers8eb25602020-03-09 12:13:48 +0000791 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000792
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000793 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
794 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
795 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000796
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000797 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000798}
799
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000800void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
801 const armnn::PadDescriptor& padDescriptor,
802 const char* name)
803{
Jan Eilers8eb25602020-03-09 12:13:48 +0000804 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000805
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000806 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
807
808 std::vector<unsigned int> padList;
809 for (auto& p: padDescriptor.m_PadList)
810 {
811 padList.push_back(p.first);
812 padList.push_back(p.second);
813 }
814
815 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100816 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100817 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000818
819 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
820 flatBufferBaseLayer,
821 flatBufferPadDesc);
822
823 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
824}
825
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000826void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
827 const armnn::PermuteDescriptor& permuteDescriptor,
828 const char* name)
829{
Jan Eilers8eb25602020-03-09 12:13:48 +0000830 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000831
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000832 // Create FlatBuffer BaseLayer
833 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
834
835 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100836 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000837 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100838 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000839 }
840
841 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
842 m_flatBufferBuilder.CreateVector(dimMappings));
843
844 // Create the FlatBuffer PermuteLayer
845 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
846 flatBufferPermuteBaseLayer,
847 flatBufferPermuteDesc);
848
849 // Add the AnyLayer to the FlatBufferLayers
850 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
851}
852
Finn Williams2605b232020-06-10 15:53:46 +0100853// Build FlatBuffer for Rank Layer
854void SerializerVisitor::VisitRankLayer(const armnn::IConnectableLayer* layer,
855 const char* name)
856{
857 IgnoreUnused(name);
858 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rank);
859 auto flatBufferRankLayer = serializer::CreateRankLayer(m_flatBufferBuilder, flatBufferBaseLayer);
860
861 CreateAnyLayer(flatBufferRankLayer.o, serializer::Layer::Layer_RankLayer);
862}
Saoirse Stewart263829c2019-02-19 15:54:14 +0000863// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000864void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000865 const armnn::ReshapeDescriptor& reshapeDescriptor,
866 const char* name)
867{
Jan Eilers8eb25602020-03-09 12:13:48 +0000868 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000869
Saoirse Stewart263829c2019-02-19 15:54:14 +0000870 // Create FlatBuffer BaseLayer
871 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
872
873 std::vector<unsigned int> targetShape;
874 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
875 {
876 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
877 }
878
879 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
880 m_flatBufferBuilder.CreateVector(targetShape));
881
882 // Create the FlatBuffer ReshapeLayer
883 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
884 flatBufferReshapeDesc);
885
886 // Add the AnyLayer to the FlatBufferLayers
887 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
888}
889
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000890void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
891 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
892 const char* name)
893{
Jan Eilers8eb25602020-03-09 12:13:48 +0000894 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000895
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000896 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
897
898 auto flatBufferDescriptor =
899 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
900 resizeDescriptor.m_TargetWidth,
901 resizeDescriptor.m_TargetHeight,
David Monahan4a0c9b92020-05-30 09:48:39 +0100902 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
903 resizeDescriptor.m_AlignCorners,
904 resizeDescriptor.m_HalfPixelCenters);
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000905
906 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
907 flatBufferBaseLayer,
908 flatBufferDescriptor);
909
910 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
911}
912
Teresa Charlina9075df2019-06-27 15:41:57 +0100913void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
914 const armnn::ResizeDescriptor& resizeDescriptor,
915 const char* name)
916{
Jan Eilers8eb25602020-03-09 12:13:48 +0000917 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000918
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100919 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
920
921 auto flatBufferDescriptor =
922 CreateResizeDescriptor(m_flatBufferBuilder,
923 resizeDescriptor.m_TargetHeight,
924 resizeDescriptor.m_TargetWidth,
925 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +0100926 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
927 resizeDescriptor.m_AlignCorners,
928 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100929
930 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
931 flatBufferBaseLayer,
932 flatBufferDescriptor);
933
934 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100935}
936
Sadik Armagan8b42a382019-03-01 14:24:49 +0000937void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
938{
Jan Eilers8eb25602020-03-09 12:13:48 +0000939 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000940
Sadik Armagan8b42a382019-03-01 14:24:49 +0000941 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
942 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
943
944 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
945}
946
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100947void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
948 const armnn::SliceDescriptor& sliceDescriptor,
949 const char* name)
950{
Jan Eilers8eb25602020-03-09 12:13:48 +0000951 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000952
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100953 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
954 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
955 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
956 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
957
958 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
959
960 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100961}
962
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000963// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000964void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
965 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000966 const char* name)
967{
Jan Eilers8eb25602020-03-09 12:13:48 +0000968 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000969
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000970 // Create FlatBuffer BaseLayer
971 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
972
973 // Create the FlatBuffer SoftmaxDescriptor
974 auto flatBufferSoftmaxDesc =
975 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
976
977 // Create the FlatBuffer SoftmaxLayer
978 auto flatBufferSoftmaxLayer =
979 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
980 flatBufferSoftmaxBaseLayer,
981 flatBufferSoftmaxDesc);
982
983 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
984}
985
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000986void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
987 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000988 const char* name)
989{
Jan Eilers8eb25602020-03-09 12:13:48 +0000990 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000991
Saoirse Stewart3166c3e2019-02-18 15:24:53 +0000992 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
993 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
994 m_flatBufferBuilder,
995 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
996 pooling2dDescriptor.m_PadLeft,
997 pooling2dDescriptor.m_PadRight,
998 pooling2dDescriptor.m_PadTop,
999 pooling2dDescriptor.m_PadBottom,
1000 pooling2dDescriptor.m_PoolWidth,
1001 pooling2dDescriptor.m_PoolHeight,
1002 pooling2dDescriptor.m_StrideX,
1003 pooling2dDescriptor.m_StrideY,
1004 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
1005 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
1006 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
1007
1008 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1009 fbPooling2dBaseLayer,
1010 fbPooling2dDescriptor);
1011
1012 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1013}
1014
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001015void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
1016 const char* name)
1017{
Jan Eilers8eb25602020-03-09 12:13:48 +00001018 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001019
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001020 // Create FlatBuffer BaseLayer
1021 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1022
1023 // Create the FlatBuffer AdditionLayer
1024 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1025
1026 // Add the AnyLayer to the FlatBufferLayers
1027 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001028}
1029
Derek Lamberti87acb272019-03-27 16:51:31 +00001030void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
1031{
Jan Eilers8eb25602020-03-09 12:13:48 +00001032 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001033
Derek Lamberti87acb272019-03-27 16:51:31 +00001034 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1035 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1036 fbQuantizeBaseLayer);
1037 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1038}
1039
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001040// Build FlatBuffer for FullyConnected Layer
1041void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1042 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
1043 const armnn::ConstTensor& weights,
1044 const armnn::Optional<armnn::ConstTensor>& biases,
1045 const char* name)
1046{
Jan Eilers8eb25602020-03-09 12:13:48 +00001047 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001048
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001049 // Create FlatBuffer BaseLayer
1050 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1051
1052 // Create FlatBuffer FullyConnectedDescriptor
1053 auto flatBufferDescriptor =
1054 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1055 fullyConnectedDescriptor.m_BiasEnabled,
1056 fullyConnectedDescriptor.m_TransposeWeightMatrix);
1057
1058 // Create FlatBuffer weights data
1059 auto flatBufferWeights = CreateConstTensorInfo(weights);
1060
1061 // Create FlatBuffer bias data
1062 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
1063 if (fullyConnectedDescriptor.m_BiasEnabled)
1064 {
1065 flatBufferBiases = CreateConstTensorInfo(biases.value());
1066 }
1067
1068 // Create FlatBuffer FullyConnectedLayer
1069 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1070 flatBufferBaseLayer,
1071 flatBufferDescriptor,
1072 flatBufferWeights,
1073 flatBufferBiases);
1074
1075 // Add created FullyConnectedLayer to the FlatBufferLayers
1076 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1077}
1078
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001079// Build FlatBuffer for SpaceToBatchNd Layer
1080void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
1081 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1082 const char* name)
1083{
Jan Eilers8eb25602020-03-09 12:13:48 +00001084 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001085
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001086 // Create FlatBuffer BaseLayer
1087 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1088
1089 std::vector<unsigned int> padList;
1090 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1091 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1092 {
1093 padList.push_back(pad.first);
1094 padList.push_back(pad.second);
1095 }
1096
1097 auto flatBufferDescriptor =
1098 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1099 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1100 m_flatBufferBuilder.CreateVector(padList),
1101 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1102
1103 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1104 flatBufferBaseLayer,
1105 flatBufferDescriptor);
1106
1107 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1108}
1109
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001110// Build FlatBuffer for SpaceToDepthLayer
1111void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
1112 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1113 const char* name)
1114{
Jan Eilers8eb25602020-03-09 12:13:48 +00001115 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001116
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001117 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1118 auto flatBufferDescriptor =
1119 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1120 spaceToDepthDescriptor.m_BlockSize,
1121 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1122
1123 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1124 flatBufferBaseLayer,
1125 flatBufferDescriptor);
1126
1127 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001128}
1129
Jim Flynn18ce3382019-03-08 11:08:30 +00001130// Build FlatBuffer for Splitter Layer
1131void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
1132 const armnn::ViewsDescriptor& viewsDescriptor,
1133 const char* name)
1134{
Jan Eilers8eb25602020-03-09 12:13:48 +00001135 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001136
Jim Flynn18ce3382019-03-08 11:08:30 +00001137 // Create FlatBuffer ViewOrigins
1138 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1139 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1140
1141 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1142 {
1143 std::vector<uint32_t> viewOrigin;
1144 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1145
1146 // Copy vector
1147 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1148 {
1149 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1150 }
1151
1152 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1153 m_flatBufferBuilder.CreateVector(viewOrigin)));
1154 }
1155
1156 // Create FlatBuffer OriginsDescriptor
1157 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1158 viewsDescriptor.GetOrigins().GetConcatAxis(),
1159 viewsDescriptor.GetOrigins().GetNumViews(),
1160 viewsDescriptor.GetOrigins().GetNumDimensions(),
1161 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1162
1163 // Create FlatBuffer ViewOrigins
1164 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1165 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1166
1167 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1168 {
1169 std::vector<uint32_t> viewSize;
1170 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1171
1172 // Copy vector
1173 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1174 {
1175 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1176 }
1177
1178 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1179 m_flatBufferBuilder.CreateVector(viewSize)));
1180 }
1181
1182 // Create FlatBuffer ViewsDescriptor
1183 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1184 flatBufferOriginDescriptor,
1185 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1186
1187 // Create FlatBuffer BaseLayer
1188 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1189
1190 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1191 flatBufferBaseLayer,
1192 flatBufferViewsDescriptor);
1193
1194 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1195}
1196
Nina Drozd57728782019-02-27 10:53:27 +00001197void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
1198 const armnn::NormalizationDescriptor& descriptor,
1199 const char* name)
1200{
Jan Eilers8eb25602020-03-09 12:13:48 +00001201 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001202
Nina Drozd57728782019-02-27 10:53:27 +00001203 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1204
1205 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1206 m_flatBufferBuilder,
1207 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1208 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1209 descriptor.m_NormSize,
1210 descriptor.m_Alpha,
1211 descriptor.m_Beta,
1212 descriptor.m_K,
1213 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1214
1215 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1216 fbNormalizationBaseLayer,
1217 fbNormalizationDescriptor);
1218
1219 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1220}
1221
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001222void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1223 const armnn::StackDescriptor& stackDescriptor,
1224 const char* name)
1225{
Jan Eilers8eb25602020-03-09 12:13:48 +00001226 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001227
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001228 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1229
1230 std::vector<unsigned int> inputShape;
1231 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1232 {
1233 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1234 }
1235
1236 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1237 stackDescriptor.m_Axis,
1238 stackDescriptor.m_NumInputs,
1239 m_flatBufferBuilder.CreateVector(inputShape));
1240
1241 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1242 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001243}
1244
Derek Lamberti013c3902019-10-21 10:46:16 +01001245void SerializerVisitor::VisitStandInLayer(const armnn::IConnectableLayer *layer,
1246 const armnn::StandInDescriptor& standInDescriptor,
1247 const char *name)
1248{
Jan Eilers8eb25602020-03-09 12:13:48 +00001249 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001250
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001251 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1252 standInDescriptor.m_NumInputs,
1253 standInDescriptor.m_NumOutputs);
1254
1255 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1256 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1257
1258 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001259}
1260
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001261void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1262 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1263 const char* name)
1264{
Jan Eilers8eb25602020-03-09 12:13:48 +00001265 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001266
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001267 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1268
1269 auto flatBufferDescriptor =
1270 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1271 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1272 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1273 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1274 stridedSliceDescriptor.m_BeginMask,
1275 stridedSliceDescriptor.m_EndMask,
1276 stridedSliceDescriptor.m_ShrinkAxisMask,
1277 stridedSliceDescriptor.m_EllipsisMask,
1278 stridedSliceDescriptor.m_NewAxisMask,
1279 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1280
1281 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1282 flatBufferBaseLayer,
1283 flatBufferDescriptor);
1284
1285 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1286}
1287
Conor Kennedyda1f9752019-03-01 14:37:12 +00001288void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1289{
Jan Eilers8eb25602020-03-09 12:13:48 +00001290 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001291
Conor Kennedyda1f9752019-03-01 14:37:12 +00001292 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1293 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1294
1295 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1296}
1297
Sadik Armaganeff363d2019-04-05 15:25:46 +01001298void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1299{
Jan Eilers8eb25602020-03-09 12:13:48 +00001300 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001301
Sadik Armaganeff363d2019-04-05 15:25:46 +01001302 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1303 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1304
1305 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1306}
1307
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001308void SerializerVisitor::VisitTransposeConvolution2dLayer(
1309 const armnn::IConnectableLayer* layer,
1310 const armnn::TransposeConvolution2dDescriptor& descriptor,
1311 const armnn::ConstTensor& weights,
1312 const armnn::Optional<armnn::ConstTensor>& biases,
1313 const char* name)
1314{
Jan Eilers8eb25602020-03-09 12:13:48 +00001315 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001316
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001317 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1318 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1319 descriptor.m_PadLeft,
1320 descriptor.m_PadRight,
1321 descriptor.m_PadTop,
1322 descriptor.m_PadBottom,
1323 descriptor.m_StrideX,
1324 descriptor.m_StrideY,
1325 descriptor.m_BiasEnabled,
1326 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1327
1328 // weights & biases
1329 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1330 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1331 if (biases.has_value())
1332 {
1333 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1334 }
1335
1336 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1337 fbBaseLayer,
1338 fbDescriptor,
1339 fbWeightsConstTensorInfo,
1340 fbBiasesConstTensorInfo);
1341
1342 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001343}
1344
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001345void SerializerVisitor::VisitTransposeLayer(const armnn::IConnectableLayer* layer,
1346 const armnn::TransposeDescriptor& descriptor,
1347 const char* name)
1348{
Jan Eilers8eb25602020-03-09 12:13:48 +00001349 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001350
1351 // Create FlatBuffer BaseLayer
1352 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1353
1354 std::vector<unsigned int> dimMappings;
1355 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1356 {
1357 dimMappings.push_back(descriptor.m_DimMappings[i]);
1358 }
1359
1360 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1361 m_flatBufferBuilder.CreateVector(dimMappings));
1362
1363 // Create the FlatBuffer TransposeLayer
1364 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1365 flatBufferBaseLayer,
1366 flatBufferDesc);
1367
1368 // Add the AnyLayer to the FlatBufferLayers
1369 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1370}
1371
James Conroy586a9aa2020-03-20 08:49:33 +00001372void SerializerVisitor::VisitQLstmLayer(const armnn::IConnectableLayer* layer,
1373 const armnn::QLstmDescriptor& descriptor,
1374 const armnn::LstmInputParams& params,
1375 const char* name)
1376{
James Conroy8d333182020-05-13 10:27:58 +01001377 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001378
James Conroy8d333182020-05-13 10:27:58 +01001379 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1380
1381 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1382 m_flatBufferBuilder,
1383 descriptor.m_CifgEnabled,
1384 descriptor.m_PeepholeEnabled,
1385 descriptor.m_ProjectionEnabled,
1386 descriptor.m_LayerNormEnabled,
1387 descriptor.m_CellClip,
1388 descriptor.m_ProjectionClip,
1389 descriptor.m_InputIntermediateScale,
1390 descriptor.m_ForgetIntermediateScale,
1391 descriptor.m_CellIntermediateScale,
1392 descriptor.m_OutputIntermediateScale,
1393 descriptor.m_HiddenStateZeroPoint,
1394 descriptor.m_HiddenStateScale
1395 );
1396
1397 // Mandatory params
1398 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
1399 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
1400 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
1401 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
1402 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
1403 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
1404 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
1405 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
1406 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
1407
1408 // CIFG
1409 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1410 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1411 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1412
1413 if (!descriptor.m_CifgEnabled)
1414 {
1415 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
1416 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
1417 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
1418 }
1419
1420 // Projectiom
1421 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1422 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1423
1424 if (descriptor.m_ProjectionEnabled)
1425 {
1426 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
1427 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
1428 }
1429
1430 // Peephole
1431 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1432 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1433 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1434
1435 if (descriptor.m_PeepholeEnabled)
1436 {
1437 if (!descriptor.m_CifgEnabled)
1438 {
1439 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
1440 }
1441
1442 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
1443 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
1444 }
1445
1446 // Layer norm
1447 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1448 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1449 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1450 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1451
1452 if (descriptor.m_LayerNormEnabled)
1453 {
1454 if (!descriptor.m_CifgEnabled)
1455 {
1456 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
1457 }
1458
1459 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
1460 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
1461 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
1462 }
1463
1464 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1465 m_flatBufferBuilder,
1466 inputToForgetWeights,
1467 inputToCellWeights,
1468 inputToOutputWeights,
1469 recurrentToForgetWeights,
1470 recurrentToCellWeights,
1471 recurrentToOutputWeights,
1472 forgetGateBias,
1473 cellBias,
1474 outputGateBias,
1475 inputToInputWeights,
1476 recurrentToInputWeights,
1477 inputGateBias,
1478 projectionWeights,
1479 projectionBias,
1480 cellToInputWeights,
1481 cellToForgetWeights,
1482 cellToOutputWeights,
1483 inputLayerNormWeights,
1484 forgetLayerNormWeights,
1485 cellLayerNormWeights,
1486 outputLayerNormWeights);
1487
1488 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1489 m_flatBufferBuilder,
1490 fbQLstmBaseLayer,
1491 fbQLstmDescriptor,
1492 fbQLstmParams);
1493
1494 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001495}
1496
James Conroyee18dc82019-07-17 11:27:46 +01001497void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1498 const armnn::QuantizedLstmInputParams& params,
1499 const char* name)
1500{
Jan Eilers8eb25602020-03-09 12:13:48 +00001501 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001502
Jan Eilers5b01a892019-07-23 09:47:43 +01001503 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1504
1505 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001506 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1507 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1508 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1509 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001510
Francis Murtaghbb590b42019-08-14 09:51:36 +01001511 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1512 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1513 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1514 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001515
Francis Murtaghbb590b42019-08-14 09:51:36 +01001516 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1517 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1518 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1519 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001520
1521 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1522 m_flatBufferBuilder,
1523 inputToInputWeights,
1524 inputToForgetWeights,
1525 inputToCellWeights,
1526 inputToOutputWeights,
1527 recurrentToInputWeights,
1528 recurrentToForgetWeights,
1529 recurrentToCellWeights,
1530 recurrentToOutputWeights,
1531 inputGateBias,
1532 forgetGateBias,
1533 cellBias,
1534 outputGateBias);
1535
1536 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1537 m_flatBufferBuilder,
1538 fbQuantizedLstmBaseLayer,
1539 fbQuantizedLstmParams);
1540
1541 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001542}
1543
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001544fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001545 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001546{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001547
Sadik Armagandb059fd2019-03-20 12:28:32 +00001548 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1549
Mike Kelly8c1701a2019-02-11 17:01:27 +00001550 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1551 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1552
1553 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001554 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001555 m_flatBufferBuilder.CreateString(layer->GetName()),
1556 layerType,
1557 m_flatBufferBuilder.CreateVector(inputSlots),
1558 m_flatBufferBuilder.CreateVector(outputSlots));
1559}
1560
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001561void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001562{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001563
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001564 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001565 m_serializedLayers.push_back(anyLayer);
1566}
1567
Mike Kellya0766c32019-02-19 17:22:07 +00001568template <typename T>
1569flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1570{
1571 const T* buffer = reinterpret_cast<const T*>(memory);
1572 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1573 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1574 return fbVector;
1575}
1576
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001577flatbuffers::Offset<TensorInfo> SerializerVisitor::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001578{
Mike Kellya0766c32019-02-19 17:22:07 +00001579 // Get the dimensions
1580 std::vector<unsigned int> shape;
Mike Kellya0766c32019-02-19 17:22:07 +00001581 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1582 {
1583 shape.push_back(tensorInfo.GetShape()[dim]);
1584 }
1585
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001586 if (tensorInfo.HasPerAxisQuantization())
1587 {
1588 // Create FlatBuffer TensorInfo
1589 auto flatBufferTensorInfo =
1590 serializer::CreateTensorInfo(m_flatBufferBuilder,
1591 m_flatBufferBuilder.CreateVector(shape),
1592 GetFlatBufferDataType(tensorInfo.GetDataType()),
1593 tensorInfo.GetQuantizationScales()[0],
1594 tensorInfo.GetQuantizationOffset(),
1595 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001596 tensorInfo.GetQuantizationDim().value(),
1597 static_cast<unsigned int>
1598 (tensorInfo.GetShape().GetDimensionality()));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001599 return flatBufferTensorInfo;
1600 }
1601
Mike Kellya0766c32019-02-19 17:22:07 +00001602 // Create FlatBuffer TensorInfo
1603 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1604 m_flatBufferBuilder.CreateVector(shape),
1605 GetFlatBufferDataType(tensorInfo.GetDataType()),
1606 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001607 tensorInfo.GetQuantizationOffset(),
1608 0,
1609 0,
1610 static_cast<unsigned int>
1611 (tensorInfo.GetShape().GetDimensionality()));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001612 return flatBufferTensorInfo;
1613}
1614
1615flatbuffers::Offset<serializer::ConstTensor>
1616 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
1617{
1618 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1619
Mike Kellya0766c32019-02-19 17:22:07 +00001620 flatbuffers::Offset<void> fbPayload;
1621
1622 switch (tensorInfo.GetDataType())
1623 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001624 case armnn::DataType::Float32:
1625 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001626 {
1627 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1628 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1629 m_flatBufferBuilder,
1630 fbVector);
1631 fbPayload = flatBuffersData.o;
1632 break;
1633 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001634 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001635 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001636 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001637 {
1638 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1639 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1640 m_flatBufferBuilder,
1641 fbVector);
1642 fbPayload = flatBuffersData.o;
1643 break;
1644 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001645 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001646 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001647 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001648 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001649 default:
1650 {
1651 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1652 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1653 m_flatBufferBuilder,
1654 fbVector);
1655 fbPayload = flatBuffersData.o;
1656 }
1657 }
1658 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1659 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001660 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001661 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1662 fbPayload);
1663 return flatBufferConstTensor;
1664}
1665
Tee Jungaa920c52019-11-05 10:48:25 +00001666flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerVisitor::GetVersionTable()
1667{
1668 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1669 serializer::CreateFeatureCompatibilityVersions(
1670 m_flatBufferBuilder,
1671 1 // Binding ids scheme version
1672 );
1673 return versionsTable;
1674}
1675
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001676std::vector<fb::Offset<serializer::InputSlot>>
1677 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001678{
Mike Kellya0766c32019-02-19 17:22:07 +00001679 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001680
1681 // Get the InputSlots
1682 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1683 {
1684 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1685
1686 // Get the Connection for the InputSlot
1687 const IOutputSlot* connection = inputSlot.GetConnection();
1688
1689 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001690 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1691 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001692 // Create FlatBuffer InputSlot
1693 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1694 }
1695 return inputSlots;
1696}
1697
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001698std::vector<fb::Offset<serializer::OutputSlot>>
1699 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001700{
1701 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1702
1703 // Get the OutputSlots
1704 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1705 {
1706 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001707 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001708
Mike Kelly8c1701a2019-02-11 17:01:27 +00001709 // Create FlatBuffer Outputslot
1710 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1711 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001712 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001713 }
1714 return outputSlots;
1715}
1716
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001717
1718ISerializer* ISerializer::CreateRaw()
1719{
1720 return new Serializer();
1721}
1722
1723ISerializerPtr ISerializer::Create()
1724{
1725 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1726}
1727
1728void ISerializer::Destroy(ISerializer* serializer)
1729{
1730 delete serializer;
1731}
1732
1733void Serializer::Serialize(const INetwork& inNetwork)
1734{
1735 // Iterate through to network
1736 inNetwork.Accept(m_SerializerVisitor);
1737 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1738
1739 // Create FlatBuffer SerializedGraph
1740 auto serializedGraph = serializer::CreateSerializedGraph(
1741 fbBuilder,
1742 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1743 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
Tee Jungaa920c52019-11-05 10:48:25 +00001744 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()),
1745 m_SerializerVisitor.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001746
1747 // Serialize the graph
1748 fbBuilder.Finish(serializedGraph);
1749}
1750
1751bool Serializer::SaveSerializedToStream(std::ostream& stream)
1752{
1753 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1754
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001755 auto bytesToWrite = boost::numeric_cast<std::streamsize>(fbBuilder.GetSize());
1756 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001757 return !stream.bad();
1758}
1759
Finn Williams2605b232020-06-10 15:53:46 +01001760} // namespace armnnSerializer