blob: 379cce21091a4b70f3703407e8460aeea66d6764 [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>
Matthew Sloyan0663d662020-09-14 11:47:26 +010011#include <armnn/utility/NumericCast.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
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
James Conroyaba90cd2020-11-06 16:28:18 +0000567void SerializerVisitor::VisitLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
568 const armnn::LogicalBinaryDescriptor& descriptor,
569 const char* name)
570{
571 IgnoreUnused(name);
572
573 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogicalBinary);
574 auto fbDescriptor = serializer::CreateLogicalBinaryDescriptor(
575 m_flatBufferBuilder,
576 GetFlatBufferLogicalBinaryOperation(descriptor.m_Operation));
577
578 auto fbLayer = serializer::CreateLogicalBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
579 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_LogicalBinaryLayer);
580}
581
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100582void SerializerVisitor::VisitLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
583 const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
584 const char* name)
585{
Jan Eilers8eb25602020-03-09 12:13:48 +0000586 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000587
Sadik Armagan26257852019-10-14 13:00:47 +0100588 // Create FlatBuffer BaseLayer
589 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
590
591 // Create the FlatBuffer LogSoftmaxDescriptor
592 auto flatBufferLogSoftmaxDesc =
593 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
594 logSoftmaxDescriptor.m_Beta,
595 logSoftmaxDescriptor.m_Axis);
596
597 // Create the FlatBuffer LogSoftmaxLayer
598 auto flatBufferLogSoftmaxLayer =
599 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
600 flatBufferLogSoftmaxBaseLayer,
601 flatBufferLogSoftmaxDesc);
602
603 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
Aron Virginas-Tarf982dea2019-10-11 14:07:53 +0100604}
605
606void SerializerVisitor::VisitLstmLayer(const armnn::IConnectableLayer* layer,
607 const armnn::LstmDescriptor& descriptor,
608 const armnn::LstmInputParams& params,
609 const char* name)
Jim Flynn11af3752019-03-19 17:22:29 +0000610{
Jan Eilers8eb25602020-03-09 12:13:48 +0000611 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000612
Jim Flynn11af3752019-03-19 17:22:29 +0000613 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
614
615 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
616 m_flatBufferBuilder,
617 descriptor.m_ActivationFunc,
618 descriptor.m_ClippingThresCell,
619 descriptor.m_ClippingThresProj,
620 descriptor.m_CifgEnabled,
621 descriptor.m_PeepholeEnabled,
Jan Eilersf8c62972019-07-17 11:07:49 +0100622 descriptor.m_ProjectionEnabled,
623 descriptor.m_LayerNormEnabled);
Jim Flynn11af3752019-03-19 17:22:29 +0000624
625 // Get mandatory input parameters
626 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
627 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
628 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
629 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
630 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
631 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
632 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
633 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
634 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
635
636 //Define optional parameters, these will be set depending on configuration in Lstm descriptor
637 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
638 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
639 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
640 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
641 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
642 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
643 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
644 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
Jan Eilersf8c62972019-07-17 11:07:49 +0100645 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
646 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
647 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
648 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
Jim Flynn11af3752019-03-19 17:22:29 +0000649
650 if (!descriptor.m_CifgEnabled)
651 {
652 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
653 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
654 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
655 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
656 }
657
658 if (descriptor.m_ProjectionEnabled)
659 {
660 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
661 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
662 }
663
664 if (descriptor.m_PeepholeEnabled)
665 {
666 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
667 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
668 }
669
Jan Eilersf8c62972019-07-17 11:07:49 +0100670 if (descriptor.m_LayerNormEnabled)
671 {
672 if (!descriptor.m_CifgEnabled)
673 {
674 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
675 }
676 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
677 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
678 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
679 }
680
Jim Flynn11af3752019-03-19 17:22:29 +0000681 auto fbLstmParams = serializer::CreateLstmInputParams(
682 m_flatBufferBuilder,
683 inputToForgetWeights,
684 inputToCellWeights,
685 inputToOutputWeights,
686 recurrentToForgetWeights,
687 recurrentToCellWeights,
688 recurrentToOutputWeights,
689 forgetGateBias,
690 cellBias,
691 outputGateBias,
692 inputToInputWeights,
693 recurrentToInputWeights,
694 cellToInputWeights,
695 inputGateBias,
696 projectionWeights,
697 projectionBias,
698 cellToForgetWeights,
Jan Eilersf8c62972019-07-17 11:07:49 +0100699 cellToOutputWeights,
700 inputLayerNormWeights,
701 forgetLayerNormWeights,
702 cellLayerNormWeights,
703 outputLayerNormWeights);
Jim Flynn11af3752019-03-19 17:22:29 +0000704
705 auto fbLstmLayer = serializer::CreateLstmLayer(
706 m_flatBufferBuilder,
707 fbLstmBaseLayer,
708 fbLstmDescriptor,
709 fbLstmParams);
710
711 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
712}
713
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000714void SerializerVisitor::VisitMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
715{
Jan Eilers8eb25602020-03-09 12:13:48 +0000716 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000717
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000718 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
719 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
720
721 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
722}
723
724void SerializerVisitor::VisitMeanLayer(const armnn::IConnectableLayer* layer,
725 const armnn::MeanDescriptor& descriptor,
726 const char* name)
727{
Jan Eilers8eb25602020-03-09 12:13:48 +0000728 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000729
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000730 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
731 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
732 m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
733 descriptor.m_KeepDims);
734
735 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
736 fbMeanBaseLayer,
737 fbMeanDescriptor);
738
739 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
740}
741
742void SerializerVisitor::VisitMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
743{
Jan Eilers8eb25602020-03-09 12:13:48 +0000744 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000745
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000746 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
747 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
748
749 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
750}
751
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100752void SerializerVisitor::VisitMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
753{
Jan Eilers8eb25602020-03-09 12:13:48 +0000754 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000755
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100756 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
757 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
758
759 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
760}
761
Jim Flynnac25a1b2019-02-28 10:40:49 +0000762void SerializerVisitor::VisitMergerLayer(const armnn::IConnectableLayer* layer,
Jim Flynne242f2d2019-05-22 14:24:13 +0100763 const armnn::MergerDescriptor& mergerDescriptor,
Jim Flynnac25a1b2019-02-28 10:40:49 +0000764 const char* name)
765{
Jim Flynne242f2d2019-05-22 14:24:13 +0100766 VisitConcatLayer(layer, mergerDescriptor, name);
767}
768
769void SerializerVisitor::VisitConcatLayer(const armnn::IConnectableLayer* layer,
770 const armnn::ConcatDescriptor& concatDescriptor,
771 const char* name)
772{
Jan Eilers8eb25602020-03-09 12:13:48 +0000773 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000774
Jim Flynne242f2d2019-05-22 14:24:13 +0100775 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000776
777 std::vector<flatbuffers::Offset<UintVector>> views;
Jim Flynne242f2d2019-05-22 14:24:13 +0100778 for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000779 {
Jim Flynne242f2d2019-05-22 14:24:13 +0100780 const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000781 std::vector<uint32_t> origins;
Jim Flynne242f2d2019-05-22 14:24:13 +0100782 for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
Jim Flynnac25a1b2019-02-28 10:40:49 +0000783 {
784 origins.push_back(origin[d]);
785 }
786 auto view = m_flatBufferBuilder.CreateVector(origins);
787 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
788 views.push_back(uintVector);
789 }
790
Jim Flynne242f2d2019-05-22 14:24:13 +0100791 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
792 concatDescriptor.GetConcatAxis(),
793 concatDescriptor.GetNumViews(),
794 concatDescriptor.GetNumDimensions(),
Jim Flynnac25a1b2019-02-28 10:40:49 +0000795 m_flatBufferBuilder.CreateVector(views));
796
Jim Flynne242f2d2019-05-22 14:24:13 +0100797 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
798 flatBufferConcatBaseLayer,
799 flatBufferConcatDescriptor);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000800
Jim Flynne242f2d2019-05-22 14:24:13 +0100801 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
Jim Flynnac25a1b2019-02-28 10:40:49 +0000802}
803
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000804void SerializerVisitor::VisitMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
Sadik Armagan5f450272019-02-12 14:31:45 +0000805{
Jan Eilers8eb25602020-03-09 12:13:48 +0000806 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000807
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000808 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
809 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
810 fbMultiplicationBaseLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000811
Sadik Armaganac97c8c2019-03-04 17:44:21 +0000812 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
Sadik Armagan5f450272019-02-12 14:31:45 +0000813}
814
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000815void SerializerVisitor::VisitPadLayer(const armnn::IConnectableLayer* layer,
816 const armnn::PadDescriptor& padDescriptor,
817 const char* name)
818{
Jan Eilers8eb25602020-03-09 12:13:48 +0000819 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000820
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000821 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
822
823 std::vector<unsigned int> padList;
824 for (auto& p: padDescriptor.m_PadList)
825 {
826 padList.push_back(p.first);
827 padList.push_back(p.second);
828 }
829
830 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
David Monahan34757812019-06-19 11:47:21 +0100831 m_flatBufferBuilder.CreateVector(padList),
Aron Virginas-Tarf3569052019-07-05 16:01:08 +0100832 padDescriptor.m_PadValue);
Nattapat Chaimanowongebb0f9c2019-03-01 12:14:06 +0000833
834 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
835 flatBufferBaseLayer,
836 flatBufferPadDesc);
837
838 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
839}
840
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000841void SerializerVisitor::VisitPermuteLayer(const armnn::IConnectableLayer* layer,
842 const armnn::PermuteDescriptor& permuteDescriptor,
843 const char* name)
844{
Jan Eilers8eb25602020-03-09 12:13:48 +0000845 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000846
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000847 // Create FlatBuffer BaseLayer
848 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
849
850 std::vector<unsigned int> dimMappings;
Matthew Jacksondba634f2019-08-15 15:14:18 +0100851 for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000852 {
Matthew Jacksondba634f2019-08-15 15:14:18 +0100853 dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
Nattapat Chaimanowong30b00202019-02-20 17:31:34 +0000854 }
855
856 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
857 m_flatBufferBuilder.CreateVector(dimMappings));
858
859 // Create the FlatBuffer PermuteLayer
860 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
861 flatBufferPermuteBaseLayer,
862 flatBufferPermuteDesc);
863
864 // Add the AnyLayer to the FlatBufferLayers
865 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
866}
867
Finn Williams2605b232020-06-10 15:53:46 +0100868// Build FlatBuffer for Rank Layer
869void SerializerVisitor::VisitRankLayer(const armnn::IConnectableLayer* layer,
870 const char* name)
871{
872 IgnoreUnused(name);
873 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rank);
874 auto flatBufferRankLayer = serializer::CreateRankLayer(m_flatBufferBuilder, flatBufferBaseLayer);
875
876 CreateAnyLayer(flatBufferRankLayer.o, serializer::Layer::Layer_RankLayer);
877}
Saoirse Stewart263829c2019-02-19 15:54:14 +0000878// Build FlatBuffer for Reshape Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000879void SerializerVisitor::VisitReshapeLayer(const armnn::IConnectableLayer* layer,
Saoirse Stewart263829c2019-02-19 15:54:14 +0000880 const armnn::ReshapeDescriptor& reshapeDescriptor,
881 const char* name)
882{
Jan Eilers8eb25602020-03-09 12:13:48 +0000883 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000884
Saoirse Stewart263829c2019-02-19 15:54:14 +0000885 // Create FlatBuffer BaseLayer
886 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
887
888 std::vector<unsigned int> targetShape;
889 for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
890 {
891 targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
892 }
893
894 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
895 m_flatBufferBuilder.CreateVector(targetShape));
896
897 // Create the FlatBuffer ReshapeLayer
898 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
899 flatBufferReshapeDesc);
900
901 // Add the AnyLayer to the FlatBufferLayers
902 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
903}
904
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000905void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer* layer,
906 const armnn::ResizeBilinearDescriptor& resizeDescriptor,
907 const char* name)
908{
Jan Eilers8eb25602020-03-09 12:13:48 +0000909 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000910
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000911 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ResizeBilinear);
912
913 auto flatBufferDescriptor =
914 CreateResizeBilinearDescriptor(m_flatBufferBuilder,
915 resizeDescriptor.m_TargetWidth,
916 resizeDescriptor.m_TargetHeight,
David Monahan4a0c9b92020-05-30 09:48:39 +0100917 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
918 resizeDescriptor.m_AlignCorners,
919 resizeDescriptor.m_HalfPixelCenters);
Nattapat Chaimanowong6522cdc2019-03-01 16:14:13 +0000920
921 auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
922 flatBufferBaseLayer,
923 flatBufferDescriptor);
924
925 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeBilinearLayer);
926}
927
Teresa Charlina9075df2019-06-27 15:41:57 +0100928void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
929 const armnn::ResizeDescriptor& resizeDescriptor,
930 const char* name)
931{
Jan Eilers8eb25602020-03-09 12:13:48 +0000932 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000933
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100934 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
935
936 auto flatBufferDescriptor =
937 CreateResizeDescriptor(m_flatBufferBuilder,
938 resizeDescriptor.m_TargetHeight,
939 resizeDescriptor.m_TargetWidth,
940 GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
David Monahan4a0c9b92020-05-30 09:48:39 +0100941 GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
942 resizeDescriptor.m_AlignCorners,
943 resizeDescriptor.m_HalfPixelCenters);
FinnWilliamsArm6fb339a2019-06-28 15:07:10 +0100944
945 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
946 flatBufferBaseLayer,
947 flatBufferDescriptor);
948
949 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
Teresa Charlina9075df2019-06-27 15:41:57 +0100950}
951
Sadik Armagan8b42a382019-03-01 14:24:49 +0000952void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
953{
Jan Eilers8eb25602020-03-09 12:13:48 +0000954 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000955
Sadik Armagan8b42a382019-03-01 14:24:49 +0000956 auto fbRsqrtBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rsqrt);
957 auto fbRsqrtLayer = serializer::CreateRsqrtLayer(m_flatBufferBuilder, fbRsqrtBaseLayer);
958
959 CreateAnyLayer(fbRsqrtLayer.o, serializer::Layer::Layer_RsqrtLayer);
960}
961
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100962void SerializerVisitor::VisitSliceLayer(const armnn::IConnectableLayer* layer,
963 const armnn::SliceDescriptor& sliceDescriptor,
964 const char* name)
965{
Jan Eilers8eb25602020-03-09 12:13:48 +0000966 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000967
Aron Virginas-Tar2fda80b2019-09-18 13:36:52 +0100968 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
969 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
970 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
971 m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
972
973 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
974
975 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
Aron Virginas-Tar636ab402019-09-16 14:27:45 +0100976}
977
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000978// Build FlatBuffer for Softmax Layer
Derek Lamberti0028d1b2019-02-20 13:57:42 +0000979void SerializerVisitor::VisitSoftmaxLayer(const armnn::IConnectableLayer* layer,
980 const armnn::SoftmaxDescriptor& softmaxDescriptor,
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000981 const char* name)
982{
Jan Eilers8eb25602020-03-09 12:13:48 +0000983 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +0000984
Aron Virginas-Tarfc413c02019-02-13 15:41:52 +0000985 // Create FlatBuffer BaseLayer
986 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
987
988 // Create the FlatBuffer SoftmaxDescriptor
989 auto flatBufferSoftmaxDesc =
990 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder, softmaxDescriptor.m_Beta);
991
992 // Create the FlatBuffer SoftmaxLayer
993 auto flatBufferSoftmaxLayer =
994 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
995 flatBufferSoftmaxBaseLayer,
996 flatBufferSoftmaxDesc);
997
998 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
999}
1000
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001001void SerializerVisitor::VisitPooling2dLayer(const armnn::IConnectableLayer* layer,
1002 const armnn::Pooling2dDescriptor& pooling2dDescriptor,
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001003 const char* name)
1004{
Jan Eilers8eb25602020-03-09 12:13:48 +00001005 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001006
Saoirse Stewart3166c3e2019-02-18 15:24:53 +00001007 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
1008 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
1009 m_flatBufferBuilder,
1010 GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
1011 pooling2dDescriptor.m_PadLeft,
1012 pooling2dDescriptor.m_PadRight,
1013 pooling2dDescriptor.m_PadTop,
1014 pooling2dDescriptor.m_PadBottom,
1015 pooling2dDescriptor.m_PoolWidth,
1016 pooling2dDescriptor.m_PoolHeight,
1017 pooling2dDescriptor.m_StrideX,
1018 pooling2dDescriptor.m_StrideY,
1019 GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
1020 GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
1021 GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
1022
1023 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1024 fbPooling2dBaseLayer,
1025 fbPooling2dDescriptor);
1026
1027 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1028}
1029
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001030void SerializerVisitor::VisitPreluLayer(const armnn::IConnectableLayer* layer,
1031 const char* name)
1032{
Jan Eilers8eb25602020-03-09 12:13:48 +00001033 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001034
Ellen Norris-Thompson51982472019-06-19 11:46:21 +01001035 // Create FlatBuffer BaseLayer
1036 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1037
1038 // Create the FlatBuffer AdditionLayer
1039 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1040
1041 // Add the AnyLayer to the FlatBufferLayers
1042 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
Matteo Martincigh0e406ee2019-06-12 15:42:18 +01001043}
1044
Derek Lamberti87acb272019-03-27 16:51:31 +00001045void SerializerVisitor::VisitQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
1046{
Jan Eilers8eb25602020-03-09 12:13:48 +00001047 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001048
Derek Lamberti87acb272019-03-27 16:51:31 +00001049 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1050 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1051 fbQuantizeBaseLayer);
1052 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1053}
1054
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001055// Build FlatBuffer for FullyConnected Layer
1056void SerializerVisitor::VisitFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1057 const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
1058 const armnn::ConstTensor& weights,
1059 const armnn::Optional<armnn::ConstTensor>& biases,
1060 const char* name)
1061{
Jan Eilers8eb25602020-03-09 12:13:48 +00001062 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001063
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001064 // Create FlatBuffer BaseLayer
1065 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1066
1067 // Create FlatBuffer FullyConnectedDescriptor
1068 auto flatBufferDescriptor =
1069 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1070 fullyConnectedDescriptor.m_BiasEnabled,
1071 fullyConnectedDescriptor.m_TransposeWeightMatrix);
1072
1073 // Create FlatBuffer weights data
1074 auto flatBufferWeights = CreateConstTensorInfo(weights);
1075
1076 // Create FlatBuffer bias data
1077 flatbuffers::Offset<serializer::ConstTensor> flatBufferBiases;
1078 if (fullyConnectedDescriptor.m_BiasEnabled)
1079 {
1080 flatBufferBiases = CreateConstTensorInfo(biases.value());
1081 }
1082
1083 // Create FlatBuffer FullyConnectedLayer
1084 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1085 flatBufferBaseLayer,
1086 flatBufferDescriptor,
1087 flatBufferWeights,
1088 flatBufferBiases);
1089
1090 // Add created FullyConnectedLayer to the FlatBufferLayers
1091 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1092}
1093
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001094// Build FlatBuffer for SpaceToBatchNd Layer
1095void SerializerVisitor::VisitSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
1096 const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1097 const char* name)
1098{
Jan Eilers8eb25602020-03-09 12:13:48 +00001099 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001100
Nattapat Chaimanowong45286992019-02-26 15:53:02 +00001101 // Create FlatBuffer BaseLayer
1102 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1103
1104 std::vector<unsigned int> padList;
1105 padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1106 for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1107 {
1108 padList.push_back(pad.first);
1109 padList.push_back(pad.second);
1110 }
1111
1112 auto flatBufferDescriptor =
1113 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1114 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1115 m_flatBufferBuilder.CreateVector(padList),
1116 GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1117
1118 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1119 flatBufferBaseLayer,
1120 flatBufferDescriptor);
1121
1122 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1123}
1124
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001125// Build FlatBuffer for SpaceToDepthLayer
1126void SerializerVisitor::VisitSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
1127 const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1128 const char* name)
1129{
Jan Eilers8eb25602020-03-09 12:13:48 +00001130 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001131
Aron Virginas-Taraa067142019-06-11 16:01:44 +01001132 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1133 auto flatBufferDescriptor =
1134 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1135 spaceToDepthDescriptor.m_BlockSize,
1136 GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1137
1138 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1139 flatBufferBaseLayer,
1140 flatBufferDescriptor);
1141
1142 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
Aron Virginas-Tar972af152019-06-11 14:14:03 +01001143}
1144
Jim Flynn18ce3382019-03-08 11:08:30 +00001145// Build FlatBuffer for Splitter Layer
1146void SerializerVisitor::VisitSplitterLayer(const armnn::IConnectableLayer* layer,
1147 const armnn::ViewsDescriptor& viewsDescriptor,
1148 const char* name)
1149{
Jan Eilers8eb25602020-03-09 12:13:48 +00001150 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001151
Jim Flynn18ce3382019-03-08 11:08:30 +00001152 // Create FlatBuffer ViewOrigins
1153 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1154 flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1155
1156 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1157 {
1158 std::vector<uint32_t> viewOrigin;
1159 viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1160
1161 // Copy vector
1162 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1163 {
1164 viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1165 }
1166
1167 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1168 m_flatBufferBuilder.CreateVector(viewOrigin)));
1169 }
1170
1171 // Create FlatBuffer OriginsDescriptor
1172 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1173 viewsDescriptor.GetOrigins().GetConcatAxis(),
1174 viewsDescriptor.GetOrigins().GetNumViews(),
1175 viewsDescriptor.GetOrigins().GetNumDimensions(),
1176 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1177
1178 // Create FlatBuffer ViewOrigins
1179 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1180 flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1181
1182 for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1183 {
1184 std::vector<uint32_t> viewSize;
1185 viewSize.reserve(viewsDescriptor.GetNumDimensions());
1186
1187 // Copy vector
1188 for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1189 {
1190 viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1191 }
1192
1193 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1194 m_flatBufferBuilder.CreateVector(viewSize)));
1195 }
1196
1197 // Create FlatBuffer ViewsDescriptor
1198 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1199 flatBufferOriginDescriptor,
1200 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1201
1202 // Create FlatBuffer BaseLayer
1203 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1204
1205 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1206 flatBufferBaseLayer,
1207 flatBufferViewsDescriptor);
1208
1209 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1210}
1211
Nina Drozd57728782019-02-27 10:53:27 +00001212void SerializerVisitor::VisitNormalizationLayer(const armnn::IConnectableLayer* layer,
1213 const armnn::NormalizationDescriptor& descriptor,
1214 const char* name)
1215{
Jan Eilers8eb25602020-03-09 12:13:48 +00001216 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001217
Nina Drozd57728782019-02-27 10:53:27 +00001218 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1219
1220 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1221 m_flatBufferBuilder,
1222 GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1223 GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1224 descriptor.m_NormSize,
1225 descriptor.m_Alpha,
1226 descriptor.m_Beta,
1227 descriptor.m_K,
1228 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1229
1230 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1231 fbNormalizationBaseLayer,
1232 fbNormalizationDescriptor);
1233
1234 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1235}
1236
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001237void SerializerVisitor::VisitStackLayer(const armnn::IConnectableLayer* layer,
1238 const armnn::StackDescriptor& stackDescriptor,
1239 const char* name)
1240{
Jan Eilers8eb25602020-03-09 12:13:48 +00001241 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001242
Matthew Jacksonb5433ee2019-07-11 15:54:20 +01001243 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1244
1245 std::vector<unsigned int> inputShape;
1246 for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1247 {
1248 inputShape.push_back(stackDescriptor.m_InputShape[i]);
1249 }
1250
1251 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1252 stackDescriptor.m_Axis,
1253 stackDescriptor.m_NumInputs,
1254 m_flatBufferBuilder.CreateVector(inputShape));
1255
1256 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1257 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
Matthew Jackson2b8c1da2019-07-04 14:59:16 +01001258}
1259
Derek Lamberti013c3902019-10-21 10:46:16 +01001260void SerializerVisitor::VisitStandInLayer(const armnn::IConnectableLayer *layer,
1261 const armnn::StandInDescriptor& standInDescriptor,
1262 const char *name)
1263{
Jan Eilers8eb25602020-03-09 12:13:48 +00001264 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001265
Aron Virginas-Tar85121a22019-10-23 10:41:35 +01001266 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1267 standInDescriptor.m_NumInputs,
1268 standInDescriptor.m_NumOutputs);
1269
1270 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1271 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1272
1273 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
Derek Lamberti013c3902019-10-21 10:46:16 +01001274}
1275
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001276void SerializerVisitor::VisitStridedSliceLayer(const armnn::IConnectableLayer* layer,
1277 const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1278 const char* name)
1279{
Jan Eilers8eb25602020-03-09 12:13:48 +00001280 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001281
Nattapat Chaimanowongb3485212019-03-04 12:35:39 +00001282 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1283
1284 auto flatBufferDescriptor =
1285 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1286 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1287 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1288 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1289 stridedSliceDescriptor.m_BeginMask,
1290 stridedSliceDescriptor.m_EndMask,
1291 stridedSliceDescriptor.m_ShrinkAxisMask,
1292 stridedSliceDescriptor.m_EllipsisMask,
1293 stridedSliceDescriptor.m_NewAxisMask,
1294 GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1295
1296 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1297 flatBufferBaseLayer,
1298 flatBufferDescriptor);
1299
1300 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1301}
1302
Conor Kennedyda1f9752019-03-01 14:37:12 +00001303void SerializerVisitor::VisitSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1304{
Jan Eilers8eb25602020-03-09 12:13:48 +00001305 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001306
Conor Kennedyda1f9752019-03-01 14:37:12 +00001307 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1308 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1309
1310 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1311}
1312
Sadik Armaganeff363d2019-04-05 15:25:46 +01001313void SerializerVisitor::VisitSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1314{
Jan Eilers8eb25602020-03-09 12:13:48 +00001315 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001316
Sadik Armaganeff363d2019-04-05 15:25:46 +01001317 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1318 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1319
1320 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1321}
1322
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001323void SerializerVisitor::VisitTransposeConvolution2dLayer(
1324 const armnn::IConnectableLayer* layer,
1325 const armnn::TransposeConvolution2dDescriptor& descriptor,
1326 const armnn::ConstTensor& weights,
1327 const armnn::Optional<armnn::ConstTensor>& biases,
1328 const char* name)
1329{
Jan Eilers8eb25602020-03-09 12:13:48 +00001330 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001331
Aron Virginas-Tarcb549302019-06-21 13:53:38 +01001332 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1333 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1334 descriptor.m_PadLeft,
1335 descriptor.m_PadRight,
1336 descriptor.m_PadTop,
1337 descriptor.m_PadBottom,
1338 descriptor.m_StrideX,
1339 descriptor.m_StrideY,
1340 descriptor.m_BiasEnabled,
1341 GetFlatBufferDataLayout(descriptor.m_DataLayout));
1342
1343 // weights & biases
1344 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1345 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1346 if (biases.has_value())
1347 {
1348 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases.value());
1349 }
1350
1351 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1352 fbBaseLayer,
1353 fbDescriptor,
1354 fbWeightsConstTensorInfo,
1355 fbBiasesConstTensorInfo);
1356
1357 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
Aron Virginas-Tar639fb042019-06-20 14:28:19 +01001358}
1359
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001360void SerializerVisitor::VisitTransposeLayer(const armnn::IConnectableLayer* layer,
1361 const armnn::TransposeDescriptor& descriptor,
1362 const char* name)
1363{
Jan Eilers8eb25602020-03-09 12:13:48 +00001364 IgnoreUnused(name);
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001365
1366 // Create FlatBuffer BaseLayer
1367 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1368
1369 std::vector<unsigned int> dimMappings;
1370 for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1371 {
1372 dimMappings.push_back(descriptor.m_DimMappings[i]);
1373 }
1374
1375 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1376 m_flatBufferBuilder.CreateVector(dimMappings));
1377
1378 // Create the FlatBuffer TransposeLayer
1379 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1380 flatBufferBaseLayer,
1381 flatBufferDesc);
1382
1383 // Add the AnyLayer to the FlatBufferLayers
1384 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1385}
1386
James Conroy586a9aa2020-03-20 08:49:33 +00001387void SerializerVisitor::VisitQLstmLayer(const armnn::IConnectableLayer* layer,
1388 const armnn::QLstmDescriptor& descriptor,
1389 const armnn::LstmInputParams& params,
1390 const char* name)
1391{
James Conroy8d333182020-05-13 10:27:58 +01001392 IgnoreUnused(name);
James Conroy586a9aa2020-03-20 08:49:33 +00001393
James Conroy8d333182020-05-13 10:27:58 +01001394 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1395
1396 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1397 m_flatBufferBuilder,
1398 descriptor.m_CifgEnabled,
1399 descriptor.m_PeepholeEnabled,
1400 descriptor.m_ProjectionEnabled,
1401 descriptor.m_LayerNormEnabled,
1402 descriptor.m_CellClip,
1403 descriptor.m_ProjectionClip,
1404 descriptor.m_InputIntermediateScale,
1405 descriptor.m_ForgetIntermediateScale,
1406 descriptor.m_CellIntermediateScale,
1407 descriptor.m_OutputIntermediateScale,
1408 descriptor.m_HiddenStateZeroPoint,
1409 descriptor.m_HiddenStateScale
1410 );
1411
1412 // Mandatory params
1413 auto inputToForgetWeights = CreateConstTensorInfo(*params.m_InputToForgetWeights);
1414 auto inputToCellWeights = CreateConstTensorInfo(*params.m_InputToCellWeights);
1415 auto inputToOutputWeights = CreateConstTensorInfo(*params.m_InputToOutputWeights);
1416 auto recurrentToForgetWeights = CreateConstTensorInfo(*params.m_RecurrentToForgetWeights);
1417 auto recurrentToCellWeights = CreateConstTensorInfo(*params.m_RecurrentToCellWeights);
1418 auto recurrentToOutputWeights = CreateConstTensorInfo(*params.m_RecurrentToOutputWeights);
1419 auto forgetGateBias = CreateConstTensorInfo(*params.m_ForgetGateBias);
1420 auto cellBias = CreateConstTensorInfo(*params.m_CellBias);
1421 auto outputGateBias = CreateConstTensorInfo(*params.m_OutputGateBias);
1422
1423 // CIFG
1424 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1425 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1426 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1427
1428 if (!descriptor.m_CifgEnabled)
1429 {
1430 inputToInputWeights = CreateConstTensorInfo(*params.m_InputToInputWeights);
1431 recurrentToInputWeights = CreateConstTensorInfo(*params.m_RecurrentToInputWeights);
1432 inputGateBias = CreateConstTensorInfo(*params.m_InputGateBias);
1433 }
1434
1435 // Projectiom
1436 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1437 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1438
1439 if (descriptor.m_ProjectionEnabled)
1440 {
1441 projectionWeights = CreateConstTensorInfo(*params.m_ProjectionWeights);
1442 projectionBias = CreateConstTensorInfo(*params.m_ProjectionBias);
1443 }
1444
1445 // Peephole
1446 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1447 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1448 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1449
1450 if (descriptor.m_PeepholeEnabled)
1451 {
1452 if (!descriptor.m_CifgEnabled)
1453 {
1454 cellToInputWeights = CreateConstTensorInfo(*params.m_CellToInputWeights);
1455 }
1456
1457 cellToForgetWeights = CreateConstTensorInfo(*params.m_CellToForgetWeights);
1458 cellToOutputWeights = CreateConstTensorInfo(*params.m_CellToOutputWeights);
1459 }
1460
1461 // Layer norm
1462 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1463 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1464 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1465 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1466
1467 if (descriptor.m_LayerNormEnabled)
1468 {
1469 if (!descriptor.m_CifgEnabled)
1470 {
1471 inputLayerNormWeights = CreateConstTensorInfo((*params.m_InputLayerNormWeights));
1472 }
1473
1474 forgetLayerNormWeights = CreateConstTensorInfo(*params.m_ForgetLayerNormWeights);
1475 cellLayerNormWeights = CreateConstTensorInfo(*params.m_CellLayerNormWeights);
1476 outputLayerNormWeights = CreateConstTensorInfo(*params.m_OutputLayerNormWeights);
1477 }
1478
1479 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1480 m_flatBufferBuilder,
1481 inputToForgetWeights,
1482 inputToCellWeights,
1483 inputToOutputWeights,
1484 recurrentToForgetWeights,
1485 recurrentToCellWeights,
1486 recurrentToOutputWeights,
1487 forgetGateBias,
1488 cellBias,
1489 outputGateBias,
1490 inputToInputWeights,
1491 recurrentToInputWeights,
1492 inputGateBias,
1493 projectionWeights,
1494 projectionBias,
1495 cellToInputWeights,
1496 cellToForgetWeights,
1497 cellToOutputWeights,
1498 inputLayerNormWeights,
1499 forgetLayerNormWeights,
1500 cellLayerNormWeights,
1501 outputLayerNormWeights);
1502
1503 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1504 m_flatBufferBuilder,
1505 fbQLstmBaseLayer,
1506 fbQLstmDescriptor,
1507 fbQLstmParams);
1508
1509 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
James Conroy586a9aa2020-03-20 08:49:33 +00001510}
1511
James Conroyee18dc82019-07-17 11:27:46 +01001512void SerializerVisitor::VisitQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1513 const armnn::QuantizedLstmInputParams& params,
1514 const char* name)
1515{
Jan Eilers8eb25602020-03-09 12:13:48 +00001516 IgnoreUnused(name);
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001517
Jan Eilers5b01a892019-07-23 09:47:43 +01001518 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1519
1520 // Get input parameters
Francis Murtaghbb590b42019-08-14 09:51:36 +01001521 auto inputToInputWeights = CreateConstTensorInfo(params.GetInputToInputWeights());
1522 auto inputToForgetWeights = CreateConstTensorInfo(params.GetInputToForgetWeights());
1523 auto inputToCellWeights = CreateConstTensorInfo(params.GetInputToCellWeights());
1524 auto inputToOutputWeights = CreateConstTensorInfo(params.GetInputToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001525
Francis Murtaghbb590b42019-08-14 09:51:36 +01001526 auto recurrentToInputWeights = CreateConstTensorInfo(params.GetRecurrentToInputWeights());
1527 auto recurrentToForgetWeights = CreateConstTensorInfo(params.GetRecurrentToForgetWeights());
1528 auto recurrentToCellWeights = CreateConstTensorInfo(params.GetRecurrentToCellWeights());
1529 auto recurrentToOutputWeights = CreateConstTensorInfo(params.GetRecurrentToOutputWeights());
Jan Eilers5b01a892019-07-23 09:47:43 +01001530
Francis Murtaghbb590b42019-08-14 09:51:36 +01001531 auto inputGateBias = CreateConstTensorInfo(params.GetInputGateBias());
1532 auto forgetGateBias = CreateConstTensorInfo(params.GetForgetGateBias());
1533 auto cellBias = CreateConstTensorInfo(params.GetCellBias());
1534 auto outputGateBias = CreateConstTensorInfo(params.GetOutputGateBias());
Jan Eilers5b01a892019-07-23 09:47:43 +01001535
1536 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1537 m_flatBufferBuilder,
1538 inputToInputWeights,
1539 inputToForgetWeights,
1540 inputToCellWeights,
1541 inputToOutputWeights,
1542 recurrentToInputWeights,
1543 recurrentToForgetWeights,
1544 recurrentToCellWeights,
1545 recurrentToOutputWeights,
1546 inputGateBias,
1547 forgetGateBias,
1548 cellBias,
1549 outputGateBias);
1550
1551 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1552 m_flatBufferBuilder,
1553 fbQuantizedLstmBaseLayer,
1554 fbQuantizedLstmParams);
1555
1556 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
James Conroyee18dc82019-07-17 11:27:46 +01001557}
1558
Sadik Armagandbb0c0c2019-02-21 09:01:41 +00001559fb::Offset<serializer::LayerBase> SerializerVisitor::CreateLayerBase(const IConnectableLayer* layer,
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001560 const serializer::LayerType layerType)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001561{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001562
Sadik Armagandb059fd2019-03-20 12:28:32 +00001563 uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1564
Mike Kelly8c1701a2019-02-11 17:01:27 +00001565 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1566 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1567
1568 return serializer::CreateLayerBase(m_flatBufferBuilder,
Sadik Armagandb059fd2019-03-20 12:28:32 +00001569 fbIndex,
Mike Kelly8c1701a2019-02-11 17:01:27 +00001570 m_flatBufferBuilder.CreateString(layer->GetName()),
1571 layerType,
1572 m_flatBufferBuilder.CreateVector(inputSlots),
1573 m_flatBufferBuilder.CreateVector(outputSlots));
1574}
1575
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001576void SerializerVisitor::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001577{
Derek Lamberti859f9ce2019-12-10 22:05:21 +00001578
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001579 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
Mike Kelly8c1701a2019-02-11 17:01:27 +00001580 m_serializedLayers.push_back(anyLayer);
1581}
1582
Mike Kellya0766c32019-02-19 17:22:07 +00001583template <typename T>
1584flatbuffers::Offset<flatbuffers::Vector<T>> SerializerVisitor::CreateDataVector(const void* memory, unsigned int size)
1585{
1586 const T* buffer = reinterpret_cast<const T*>(memory);
1587 std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1588 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1589 return fbVector;
1590}
1591
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001592flatbuffers::Offset<TensorInfo> SerializerVisitor::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
Mike Kellya0766c32019-02-19 17:22:07 +00001593{
Mike Kellya0766c32019-02-19 17:22:07 +00001594 // Get the dimensions
1595 std::vector<unsigned int> shape;
Mike Kellya0766c32019-02-19 17:22:07 +00001596 for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1597 {
1598 shape.push_back(tensorInfo.GetShape()[dim]);
1599 }
1600
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001601 if (tensorInfo.HasPerAxisQuantization())
1602 {
1603 // Create FlatBuffer TensorInfo
1604 auto flatBufferTensorInfo =
1605 serializer::CreateTensorInfo(m_flatBufferBuilder,
1606 m_flatBufferBuilder.CreateVector(shape),
1607 GetFlatBufferDataType(tensorInfo.GetDataType()),
1608 tensorInfo.GetQuantizationScales()[0],
1609 tensorInfo.GetQuantizationOffset(),
1610 m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
Finn Williams2605b232020-06-10 15:53:46 +01001611 tensorInfo.GetQuantizationDim().value(),
1612 static_cast<unsigned int>
1613 (tensorInfo.GetShape().GetDimensionality()));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001614 return flatBufferTensorInfo;
1615 }
1616
Mike Kellya0766c32019-02-19 17:22:07 +00001617 // Create FlatBuffer TensorInfo
1618 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1619 m_flatBufferBuilder.CreateVector(shape),
1620 GetFlatBufferDataType(tensorInfo.GetDataType()),
1621 tensorInfo.GetQuantizationScale(),
Finn Williams2605b232020-06-10 15:53:46 +01001622 tensorInfo.GetQuantizationOffset(),
1623 0,
1624 0,
1625 static_cast<unsigned int>
1626 (tensorInfo.GetShape().GetDimensionality()));
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001627 return flatBufferTensorInfo;
1628}
1629
1630flatbuffers::Offset<serializer::ConstTensor>
1631 SerializerVisitor::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
1632{
1633 armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1634
Mike Kellya0766c32019-02-19 17:22:07 +00001635 flatbuffers::Offset<void> fbPayload;
1636
1637 switch (tensorInfo.GetDataType())
1638 {
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001639 case armnn::DataType::Float32:
1640 case armnn::DataType::Signed32:
Mike Kellya0766c32019-02-19 17:22:07 +00001641 {
1642 auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1643 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1644 m_flatBufferBuilder,
1645 fbVector);
1646 fbPayload = flatBuffersData.o;
1647 break;
1648 }
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001649 case armnn::DataType::Float16:
Mike Kellyae42f012020-04-24 15:44:01 +01001650 case armnn::DataType::BFloat16:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001651 case armnn::DataType::QSymmS16:
Nattapat Chaimanowongcd5ac232019-03-19 12:26:36 +00001652 {
1653 auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1654 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1655 m_flatBufferBuilder,
1656 fbVector);
1657 fbPayload = flatBuffersData.o;
1658 break;
1659 }
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001660 case armnn::DataType::QSymmS8:
Mike Kellyae42f012020-04-24 15:44:01 +01001661 case armnn::DataType::QAsymmS8:
Derek Lambertif90c56d2020-01-10 17:14:08 +00001662 case armnn::DataType::QAsymmU8:
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001663 case armnn::DataType::Boolean:
Mike Kellya0766c32019-02-19 17:22:07 +00001664 default:
1665 {
1666 auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1667 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1668 m_flatBufferBuilder,
1669 fbVector);
1670 fbPayload = flatBuffersData.o;
1671 }
1672 }
1673 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1674 m_flatBufferBuilder,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001675 CreateTensorInfo(tensorInfo),
Mike Kellya0766c32019-02-19 17:22:07 +00001676 GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1677 fbPayload);
1678 return flatBufferConstTensor;
1679}
1680
Tee Jungaa920c52019-11-05 10:48:25 +00001681flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerVisitor::GetVersionTable()
1682{
1683 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1684 serializer::CreateFeatureCompatibilityVersions(
1685 m_flatBufferBuilder,
1686 1 // Binding ids scheme version
1687 );
1688 return versionsTable;
1689}
1690
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001691std::vector<fb::Offset<serializer::InputSlot>>
1692 SerializerVisitor::CreateInputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001693{
Mike Kellya0766c32019-02-19 17:22:07 +00001694 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
Mike Kelly8c1701a2019-02-11 17:01:27 +00001695
1696 // Get the InputSlots
1697 for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1698 {
1699 const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1700
1701 // Get the Connection for the InputSlot
1702 const IOutputSlot* connection = inputSlot.GetConnection();
1703
1704 // Create FlatBuffer Connection
Saoirse Stewartcb8a3212019-02-14 15:46:10 +00001705 serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1706 connection->CalculateIndexOnOwner());
Mike Kelly8c1701a2019-02-11 17:01:27 +00001707 // Create FlatBuffer InputSlot
1708 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1709 }
1710 return inputSlots;
1711}
1712
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001713std::vector<fb::Offset<serializer::OutputSlot>>
1714 SerializerVisitor::CreateOutputSlots(const armnn::IConnectableLayer* layer)
Mike Kelly8c1701a2019-02-11 17:01:27 +00001715{
1716 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1717
1718 // Get the OutputSlots
1719 for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1720 {
1721 const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
Derek Lamberti0028d1b2019-02-20 13:57:42 +00001722 const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
Mike Kelly8c1701a2019-02-11 17:01:27 +00001723
Mike Kelly8c1701a2019-02-11 17:01:27 +00001724 // Create FlatBuffer Outputslot
1725 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1726 slotIndex,
Sadik Armagan1a84fe32020-03-27 15:56:57 +00001727 CreateTensorInfo(tensorInfo)));
Mike Kelly8c1701a2019-02-11 17:01:27 +00001728 }
1729 return outputSlots;
1730}
1731
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001732
1733ISerializer* ISerializer::CreateRaw()
1734{
1735 return new Serializer();
1736}
1737
1738ISerializerPtr ISerializer::Create()
1739{
1740 return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
1741}
1742
1743void ISerializer::Destroy(ISerializer* serializer)
1744{
1745 delete serializer;
1746}
1747
1748void Serializer::Serialize(const INetwork& inNetwork)
1749{
1750 // Iterate through to network
1751 inNetwork.Accept(m_SerializerVisitor);
1752 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1753
1754 // Create FlatBuffer SerializedGraph
1755 auto serializedGraph = serializer::CreateSerializedGraph(
1756 fbBuilder,
1757 fbBuilder.CreateVector(m_SerializerVisitor.GetSerializedLayers()),
1758 fbBuilder.CreateVector(m_SerializerVisitor.GetInputIds()),
Tee Jungaa920c52019-11-05 10:48:25 +00001759 fbBuilder.CreateVector(m_SerializerVisitor.GetOutputIds()),
1760 m_SerializerVisitor.GetVersionTable());
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001761
1762 // Serialize the graph
1763 fbBuilder.Finish(serializedGraph);
1764}
1765
1766bool Serializer::SaveSerializedToStream(std::ostream& stream)
1767{
1768 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerVisitor.GetFlatBufferBuilder();
1769
Matthew Sloyan0663d662020-09-14 11:47:26 +01001770 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
Nattapat Chaimanowong7b53b692019-02-12 14:38:31 +00001771 stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
Nattapat Chaimanowongac9cadc2019-02-13 15:52:41 +00001772 return !stream.bad();
1773}
1774
Finn Williams2605b232020-06-10 15:53:46 +01001775} // namespace armnnSerializer