xref: /aosp_15_r20/external/armnn/src/armnnSerializer/Serializer.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2017,2019-2023 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker #include "Serializer.hpp"
6*89c4ff92SAndroid Build Coastguard Worker #include "SerializerUtils.hpp"
7*89c4ff92SAndroid Build Coastguard Worker 
8*89c4ff92SAndroid Build Coastguard Worker #include <armnn/Descriptors.hpp>
9*89c4ff92SAndroid Build Coastguard Worker #include <armnn/LstmParams.hpp>
10*89c4ff92SAndroid Build Coastguard Worker #include <armnn/QuantizedLstmParams.hpp>
11*89c4ff92SAndroid Build Coastguard Worker #include <armnn/utility/IgnoreUnused.hpp>
12*89c4ff92SAndroid Build Coastguard Worker #include <armnn/utility/NumericCast.hpp>
13*89c4ff92SAndroid Build Coastguard Worker 
14*89c4ff92SAndroid Build Coastguard Worker #include <fmt/format.h>
15*89c4ff92SAndroid Build Coastguard Worker #include <iostream>
16*89c4ff92SAndroid Build Coastguard Worker 
17*89c4ff92SAndroid Build Coastguard Worker using namespace armnn;
18*89c4ff92SAndroid Build Coastguard Worker namespace fb = flatbuffers;
19*89c4ff92SAndroid Build Coastguard Worker namespace serializer = armnnSerializer;
20*89c4ff92SAndroid Build Coastguard Worker 
21*89c4ff92SAndroid Build Coastguard Worker namespace armnnSerializer
22*89c4ff92SAndroid Build Coastguard Worker {
23*89c4ff92SAndroid Build Coastguard Worker 
ISerializer()24*89c4ff92SAndroid Build Coastguard Worker ISerializer::ISerializer() : pSerializerImpl(new SerializerImpl())
25*89c4ff92SAndroid Build Coastguard Worker {
26*89c4ff92SAndroid Build Coastguard Worker }
27*89c4ff92SAndroid Build Coastguard Worker 
28*89c4ff92SAndroid Build Coastguard Worker ISerializer::~ISerializer() = default;
29*89c4ff92SAndroid Build Coastguard Worker 
CreateRaw()30*89c4ff92SAndroid Build Coastguard Worker ISerializer* ISerializer::CreateRaw()
31*89c4ff92SAndroid Build Coastguard Worker {
32*89c4ff92SAndroid Build Coastguard Worker     return new ISerializer();
33*89c4ff92SAndroid Build Coastguard Worker }
34*89c4ff92SAndroid Build Coastguard Worker 
Create()35*89c4ff92SAndroid Build Coastguard Worker ISerializerPtr ISerializer::Create()
36*89c4ff92SAndroid Build Coastguard Worker {
37*89c4ff92SAndroid Build Coastguard Worker     return ISerializerPtr(CreateRaw(), &ISerializer::Destroy);
38*89c4ff92SAndroid Build Coastguard Worker }
39*89c4ff92SAndroid Build Coastguard Worker 
Destroy(ISerializer * serializer)40*89c4ff92SAndroid Build Coastguard Worker void ISerializer::Destroy(ISerializer* serializer)
41*89c4ff92SAndroid Build Coastguard Worker {
42*89c4ff92SAndroid Build Coastguard Worker     delete serializer;
43*89c4ff92SAndroid Build Coastguard Worker }
44*89c4ff92SAndroid Build Coastguard Worker 
Serialize(const armnn::INetwork & inNetwork)45*89c4ff92SAndroid Build Coastguard Worker void ISerializer::Serialize(const armnn::INetwork& inNetwork)
46*89c4ff92SAndroid Build Coastguard Worker {
47*89c4ff92SAndroid Build Coastguard Worker     pSerializerImpl->Serialize(inNetwork);
48*89c4ff92SAndroid Build Coastguard Worker }
49*89c4ff92SAndroid Build Coastguard Worker 
SaveSerializedToStream(std::ostream & stream)50*89c4ff92SAndroid Build Coastguard Worker bool ISerializer::SaveSerializedToStream(std::ostream& stream)
51*89c4ff92SAndroid Build Coastguard Worker {
52*89c4ff92SAndroid Build Coastguard Worker     return pSerializerImpl->SaveSerializedToStream(stream);
53*89c4ff92SAndroid Build Coastguard Worker }
54*89c4ff92SAndroid Build Coastguard Worker 
GetFlatBufferActivationFunction(armnn::ActivationFunction function)55*89c4ff92SAndroid Build Coastguard Worker serializer::ActivationFunction GetFlatBufferActivationFunction(armnn::ActivationFunction function)
56*89c4ff92SAndroid Build Coastguard Worker {
57*89c4ff92SAndroid Build Coastguard Worker     switch (function)
58*89c4ff92SAndroid Build Coastguard Worker     {
59*89c4ff92SAndroid Build Coastguard Worker         case armnn::ActivationFunction::Sigmoid:
60*89c4ff92SAndroid Build Coastguard Worker             return serializer::ActivationFunction::ActivationFunction_Sigmoid;
61*89c4ff92SAndroid Build Coastguard Worker         case armnn::ActivationFunction::TanH:
62*89c4ff92SAndroid Build Coastguard Worker             return serializer::ActivationFunction::ActivationFunction_TanH;
63*89c4ff92SAndroid Build Coastguard Worker         case armnn::ActivationFunction::Linear:
64*89c4ff92SAndroid Build Coastguard Worker             return serializer::ActivationFunction::ActivationFunction_Linear;
65*89c4ff92SAndroid Build Coastguard Worker         case armnn::ActivationFunction::ReLu:
66*89c4ff92SAndroid Build Coastguard Worker             return serializer::ActivationFunction::ActivationFunction_ReLu;
67*89c4ff92SAndroid Build Coastguard Worker         case armnn::ActivationFunction::BoundedReLu:
68*89c4ff92SAndroid Build Coastguard Worker             return serializer::ActivationFunction::ActivationFunction_BoundedReLu;
69*89c4ff92SAndroid Build Coastguard Worker         case armnn::ActivationFunction::LeakyReLu:
70*89c4ff92SAndroid Build Coastguard Worker             return serializer::ActivationFunction::ActivationFunction_LeakyReLu;
71*89c4ff92SAndroid Build Coastguard Worker         case armnn::ActivationFunction::Abs:
72*89c4ff92SAndroid Build Coastguard Worker             return serializer::ActivationFunction::ActivationFunction_Abs;
73*89c4ff92SAndroid Build Coastguard Worker         case armnn::ActivationFunction::Sqrt:
74*89c4ff92SAndroid Build Coastguard Worker             return serializer::ActivationFunction::ActivationFunction_Sqrt;
75*89c4ff92SAndroid Build Coastguard Worker         case armnn::ActivationFunction::Square:
76*89c4ff92SAndroid Build Coastguard Worker             return serializer::ActivationFunction::ActivationFunction_Square;
77*89c4ff92SAndroid Build Coastguard Worker         case armnn::ActivationFunction::Elu:
78*89c4ff92SAndroid Build Coastguard Worker             return serializer::ActivationFunction::ActivationFunction_Elu;
79*89c4ff92SAndroid Build Coastguard Worker         case armnn::ActivationFunction::HardSwish:
80*89c4ff92SAndroid Build Coastguard Worker             return serializer::ActivationFunction::ActivationFunction_HardSwish;
81*89c4ff92SAndroid Build Coastguard Worker         default:
82*89c4ff92SAndroid Build Coastguard Worker             return serializer::ActivationFunction::ActivationFunction_Sigmoid;
83*89c4ff92SAndroid Build Coastguard Worker     }
84*89c4ff92SAndroid Build Coastguard Worker }
85*89c4ff92SAndroid Build Coastguard Worker 
GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)86*89c4ff92SAndroid Build Coastguard Worker serializer::ArgMinMaxFunction GetFlatBufferArgMinMaxFunction(armnn::ArgMinMaxFunction function)
87*89c4ff92SAndroid Build Coastguard Worker {
88*89c4ff92SAndroid Build Coastguard Worker     switch (function)
89*89c4ff92SAndroid Build Coastguard Worker     {
90*89c4ff92SAndroid Build Coastguard Worker         case armnn::ArgMinMaxFunction::Max:
91*89c4ff92SAndroid Build Coastguard Worker             return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
92*89c4ff92SAndroid Build Coastguard Worker         case armnn::ArgMinMaxFunction::Min:
93*89c4ff92SAndroid Build Coastguard Worker         default:
94*89c4ff92SAndroid Build Coastguard Worker             return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
95*89c4ff92SAndroid Build Coastguard Worker     }
96*89c4ff92SAndroid Build Coastguard Worker }
97*89c4ff92SAndroid Build Coastguard Worker 
GetSerializedId(LayerGuid guid)98*89c4ff92SAndroid Build Coastguard Worker uint32_t SerializerStrategy::GetSerializedId(LayerGuid guid)
99*89c4ff92SAndroid Build Coastguard Worker {
100*89c4ff92SAndroid Build Coastguard Worker     if (m_guidMap.empty())
101*89c4ff92SAndroid Build Coastguard Worker     {
102*89c4ff92SAndroid Build Coastguard Worker         m_guidMap.insert(std::make_pair(guid, m_layerId));
103*89c4ff92SAndroid Build Coastguard Worker     }
104*89c4ff92SAndroid Build Coastguard Worker     else if (m_guidMap.find(guid) == m_guidMap.end())
105*89c4ff92SAndroid Build Coastguard Worker     {
106*89c4ff92SAndroid Build Coastguard Worker         ++m_layerId;
107*89c4ff92SAndroid Build Coastguard Worker         m_guidMap.insert(std::make_pair(guid, m_layerId));
108*89c4ff92SAndroid Build Coastguard Worker 
109*89c4ff92SAndroid Build Coastguard Worker         return m_layerId;
110*89c4ff92SAndroid Build Coastguard Worker     }
111*89c4ff92SAndroid Build Coastguard Worker     return m_guidMap[guid];
112*89c4ff92SAndroid Build Coastguard Worker }
113*89c4ff92SAndroid Build Coastguard Worker 
114*89c4ff92SAndroid Build Coastguard Worker // Build FlatBuffer for Input Layer
SerializeInputLayer(const armnn::IConnectableLayer * layer,LayerBindingId id,const char * name)115*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeInputLayer(const armnn::IConnectableLayer* layer, LayerBindingId id, const char* name)
116*89c4ff92SAndroid Build Coastguard Worker {
117*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
118*89c4ff92SAndroid Build Coastguard Worker 
119*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
120*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
121*89c4ff92SAndroid Build Coastguard Worker 
122*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BindableBaseLayer
123*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
124*89c4ff92SAndroid Build Coastguard Worker                                                                                 flatBufferInputBaseLayer,
125*89c4ff92SAndroid Build Coastguard Worker                                                                                 id);
126*89c4ff92SAndroid Build Coastguard Worker     // Push layer binding id to outputIds.
127*89c4ff92SAndroid Build Coastguard Worker     m_inputIds.push_back(id);
128*89c4ff92SAndroid Build Coastguard Worker 
129*89c4ff92SAndroid Build Coastguard Worker     // Create the FlatBuffer InputLayer
130*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
131*89c4ff92SAndroid Build Coastguard Worker 
132*89c4ff92SAndroid Build Coastguard Worker     // Add the AnyLayer to the FlatBufferLayers
133*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
134*89c4ff92SAndroid Build Coastguard Worker }
135*89c4ff92SAndroid Build Coastguard Worker 
136*89c4ff92SAndroid Build Coastguard Worker // Build FlatBuffer for Output Layer
SerializeOutputLayer(const armnn::IConnectableLayer * layer,LayerBindingId id,const char * name)137*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeOutputLayer(const armnn::IConnectableLayer* layer,
138*89c4ff92SAndroid Build Coastguard Worker                                               LayerBindingId id, const char* name)
139*89c4ff92SAndroid Build Coastguard Worker {
140*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
141*89c4ff92SAndroid Build Coastguard Worker 
142*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
143*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
144*89c4ff92SAndroid Build Coastguard Worker 
145*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BindableBaseLayer
146*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
147*89c4ff92SAndroid Build Coastguard Worker                                                                                  flatBufferOutputBaseLayer,
148*89c4ff92SAndroid Build Coastguard Worker                                                                                  id);
149*89c4ff92SAndroid Build Coastguard Worker     // Push layer binding id to outputIds.
150*89c4ff92SAndroid Build Coastguard Worker     m_outputIds.push_back(id);
151*89c4ff92SAndroid Build Coastguard Worker 
152*89c4ff92SAndroid Build Coastguard Worker     // Create the FlatBuffer OutputLayer
153*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
154*89c4ff92SAndroid Build Coastguard Worker     // Add the AnyLayer to the FlatBufferLayers
155*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
156*89c4ff92SAndroid Build Coastguard Worker }
157*89c4ff92SAndroid Build Coastguard Worker 
158*89c4ff92SAndroid Build Coastguard Worker // Build FlatBuffer for Activation Layer
SerializeActivationLayer(const armnn::IConnectableLayer * layer,const armnn::ActivationDescriptor & descriptor,const char * name)159*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeActivationLayer(const armnn::IConnectableLayer* layer,
160*89c4ff92SAndroid Build Coastguard Worker                                                   const armnn::ActivationDescriptor& descriptor,
161*89c4ff92SAndroid Build Coastguard Worker                                                   const char* name)
162*89c4ff92SAndroid Build Coastguard Worker {
163*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
164*89c4ff92SAndroid Build Coastguard Worker 
165*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
166*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
167*89c4ff92SAndroid Build Coastguard Worker 
168*89c4ff92SAndroid Build Coastguard Worker     // Create the FlatBuffer ActivationDescriptor
169*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
170*89c4ff92SAndroid Build Coastguard Worker                                                            GetFlatBufferActivationFunction(descriptor.m_Function),
171*89c4ff92SAndroid Build Coastguard Worker                                                            descriptor.m_A,
172*89c4ff92SAndroid Build Coastguard Worker                                                            descriptor.m_B);
173*89c4ff92SAndroid Build Coastguard Worker 
174*89c4ff92SAndroid Build Coastguard Worker     // Create the FlatBuffer ActivationLayer
175*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
176*89c4ff92SAndroid Build Coastguard Worker                                                          flatBufferBaseLayer,
177*89c4ff92SAndroid Build Coastguard Worker                                                          flatBufferDescriptor);
178*89c4ff92SAndroid Build Coastguard Worker 
179*89c4ff92SAndroid Build Coastguard Worker     // Add the AnyLayer to the FlatBufferLayers
180*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
181*89c4ff92SAndroid Build Coastguard Worker }
182*89c4ff92SAndroid Build Coastguard Worker 
183*89c4ff92SAndroid Build Coastguard Worker // Build FlatBuffer for Addition Layer
SerializeAdditionLayer(const armnn::IConnectableLayer * layer,const char * name)184*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeAdditionLayer(const armnn::IConnectableLayer* layer, const char* name)
185*89c4ff92SAndroid Build Coastguard Worker {
186*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
187*89c4ff92SAndroid Build Coastguard Worker 
188*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
189*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
190*89c4ff92SAndroid Build Coastguard Worker 
191*89c4ff92SAndroid Build Coastguard Worker     // Create the FlatBuffer AdditionLayer
192*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
193*89c4ff92SAndroid Build Coastguard Worker 
194*89c4ff92SAndroid Build Coastguard Worker     // Add the AnyLayer to the FlatBufferLayers
195*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
196*89c4ff92SAndroid Build Coastguard Worker }
197*89c4ff92SAndroid Build Coastguard Worker 
198*89c4ff92SAndroid Build Coastguard Worker // Build FlatBuffer for ArgMinMax Layer
SerializeArgMinMaxLayer(const armnn::IConnectableLayer * layer,const armnn::ArgMinMaxDescriptor & descriptor,const char * name)199*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeArgMinMaxLayer(const armnn::IConnectableLayer *layer,
200*89c4ff92SAndroid Build Coastguard Worker                                                  const armnn::ArgMinMaxDescriptor& descriptor,
201*89c4ff92SAndroid Build Coastguard Worker                                                  const char *name)
202*89c4ff92SAndroid Build Coastguard Worker {
203*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
204*89c4ff92SAndroid Build Coastguard Worker 
205*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
206*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
207*89c4ff92SAndroid Build Coastguard Worker 
208*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer Descriptor
209*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
210*89c4ff92SAndroid Build Coastguard Worker                                                           GetFlatBufferArgMinMaxFunction(descriptor.m_Function),
211*89c4ff92SAndroid Build Coastguard Worker                                                           descriptor.m_Axis);
212*89c4ff92SAndroid Build Coastguard Worker 
213*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer ArgMinMaxLayer
214*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
215*89c4ff92SAndroid Build Coastguard Worker                                                 flatBufferBaseLayer,
216*89c4ff92SAndroid Build Coastguard Worker                                                 flatBufferDescriptor);
217*89c4ff92SAndroid Build Coastguard Worker 
218*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
219*89c4ff92SAndroid Build Coastguard Worker }
220*89c4ff92SAndroid Build Coastguard Worker 
SerializeBatchMatMulLayer(const armnn::IConnectableLayer * layer,const armnn::BatchMatMulDescriptor & descriptor,const char * name)221*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeBatchMatMulLayer(const armnn::IConnectableLayer* layer,
222*89c4ff92SAndroid Build Coastguard Worker                                                    const armnn::BatchMatMulDescriptor& descriptor,
223*89c4ff92SAndroid Build Coastguard Worker                                                    const char* name)
224*89c4ff92SAndroid Build Coastguard Worker {
225*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
226*89c4ff92SAndroid Build Coastguard Worker 
227*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
228*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchMatMul);
229*89c4ff92SAndroid Build Coastguard Worker 
230*89c4ff92SAndroid Build Coastguard Worker     // Create the FlatBuffer BatchMatMulDescriptor
231*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferDescriptor = CreateBatchMatMulDescriptor(m_flatBufferBuilder,
232*89c4ff92SAndroid Build Coastguard Worker                                                             descriptor.m_TransposeX,
233*89c4ff92SAndroid Build Coastguard Worker                                                             descriptor.m_TransposeY,
234*89c4ff92SAndroid Build Coastguard Worker                                                             descriptor.m_AdjointX,
235*89c4ff92SAndroid Build Coastguard Worker                                                             descriptor.m_AdjointY,
236*89c4ff92SAndroid Build Coastguard Worker                                                             GetFlatBufferDataLayout(descriptor.m_DataLayoutX),
237*89c4ff92SAndroid Build Coastguard Worker                                                             GetFlatBufferDataLayout(descriptor.m_DataLayoutY));
238*89c4ff92SAndroid Build Coastguard Worker 
239*89c4ff92SAndroid Build Coastguard Worker     // Create the FlatBuffer BatchMatMulLayer
240*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferBatchMatMulLayer = CreateBatchMatMulLayer(m_flatBufferBuilder,
241*89c4ff92SAndroid Build Coastguard Worker                                                              flatBufferBaseLayer,
242*89c4ff92SAndroid Build Coastguard Worker                                                              flatBufferDescriptor);
243*89c4ff92SAndroid Build Coastguard Worker 
244*89c4ff92SAndroid Build Coastguard Worker     // Add the AnyLayer to the FlatBufferLayers
245*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferBatchMatMulLayer.o, serializer::Layer::Layer_BatchMatMulLayer);
246*89c4ff92SAndroid Build Coastguard Worker }
247*89c4ff92SAndroid Build Coastguard Worker 
248*89c4ff92SAndroid Build Coastguard Worker // Build FlatBuffer for BatchToSpaceNd Layer
SerializeBatchToSpaceNdLayer(const armnn::IConnectableLayer * layer,const armnn::BatchToSpaceNdDescriptor & descriptor,const char * name)249*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeBatchToSpaceNdLayer(const armnn::IConnectableLayer* layer,
250*89c4ff92SAndroid Build Coastguard Worker                                                       const armnn::BatchToSpaceNdDescriptor& descriptor,
251*89c4ff92SAndroid Build Coastguard Worker                                                       const char* name)
252*89c4ff92SAndroid Build Coastguard Worker {
253*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
254*89c4ff92SAndroid Build Coastguard Worker 
255*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
256*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
257*89c4ff92SAndroid Build Coastguard Worker 
258*89c4ff92SAndroid Build Coastguard Worker     std::vector<unsigned int> crops;
259*89c4ff92SAndroid Build Coastguard Worker     crops.reserve(descriptor.m_Crops.size() * 2);
260*89c4ff92SAndroid Build Coastguard Worker     for (auto& crop : descriptor.m_Crops)
261*89c4ff92SAndroid Build Coastguard Worker     {
262*89c4ff92SAndroid Build Coastguard Worker         crops.push_back(crop.first);
263*89c4ff92SAndroid Build Coastguard Worker         crops.push_back(crop.second);
264*89c4ff92SAndroid Build Coastguard Worker     }
265*89c4ff92SAndroid Build Coastguard Worker 
266*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferDescriptor =
267*89c4ff92SAndroid Build Coastguard Worker         CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
268*89c4ff92SAndroid Build Coastguard Worker                                        m_flatBufferBuilder.CreateVector(descriptor.m_BlockShape),
269*89c4ff92SAndroid Build Coastguard Worker                                        m_flatBufferBuilder.CreateVector(crops),
270*89c4ff92SAndroid Build Coastguard Worker                                        GetFlatBufferDataLayout(descriptor.m_DataLayout));
271*89c4ff92SAndroid Build Coastguard Worker 
272*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
273*89c4ff92SAndroid Build Coastguard Worker                                                                  flatBufferBaseLayer,
274*89c4ff92SAndroid Build Coastguard Worker                                                                  flatBufferDescriptor);
275*89c4ff92SAndroid Build Coastguard Worker 
276*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
277*89c4ff92SAndroid Build Coastguard Worker }
278*89c4ff92SAndroid Build Coastguard Worker 
SerializeBatchNormalizationLayer(const armnn::IConnectableLayer * layer,const armnn::BatchNormalizationDescriptor & batchNormDescriptor,const std::vector<armnn::ConstTensor> & constants,const char * name)279*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeBatchNormalizationLayer(
280*89c4ff92SAndroid Build Coastguard Worker         const armnn::IConnectableLayer* layer,
281*89c4ff92SAndroid Build Coastguard Worker         const armnn::BatchNormalizationDescriptor& batchNormDescriptor,
282*89c4ff92SAndroid Build Coastguard Worker         const std::vector<armnn::ConstTensor>& constants,
283*89c4ff92SAndroid Build Coastguard Worker         const char* name)
284*89c4ff92SAndroid Build Coastguard Worker {
285*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
286*89c4ff92SAndroid Build Coastguard Worker 
287*89c4ff92SAndroid Build Coastguard Worker     const armnn::ConstTensor& mean     = constants[0];
288*89c4ff92SAndroid Build Coastguard Worker     const armnn::ConstTensor& variance = constants[1];
289*89c4ff92SAndroid Build Coastguard Worker     const armnn::ConstTensor& beta     = constants[2];
290*89c4ff92SAndroid Build Coastguard Worker     const armnn::ConstTensor& gamma    = constants[3];
291*89c4ff92SAndroid Build Coastguard Worker 
292*89c4ff92SAndroid Build Coastguard Worker     auto fbBatchNormalizationBaseLayer  = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
293*89c4ff92SAndroid Build Coastguard Worker     auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
294*89c4ff92SAndroid Build Coastguard Worker                                                   m_flatBufferBuilder,
295*89c4ff92SAndroid Build Coastguard Worker                                                   batchNormDescriptor.m_Eps,
296*89c4ff92SAndroid Build Coastguard Worker                                                   GetFlatBufferDataLayout(batchNormDescriptor.m_DataLayout));
297*89c4ff92SAndroid Build Coastguard Worker 
298*89c4ff92SAndroid Build Coastguard Worker     auto fbMeanConstTensorInfo     = CreateConstTensorInfo(mean);
299*89c4ff92SAndroid Build Coastguard Worker     auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
300*89c4ff92SAndroid Build Coastguard Worker     auto fbBetaConstTensorInfo     = CreateConstTensorInfo(beta);
301*89c4ff92SAndroid Build Coastguard Worker     auto fbGammaConstTensorInfo    = CreateConstTensorInfo(gamma);
302*89c4ff92SAndroid Build Coastguard Worker     auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
303*89c4ff92SAndroid Build Coastguard Worker                                                                                fbBatchNormalizationBaseLayer,
304*89c4ff92SAndroid Build Coastguard Worker                                                                                fbBatchNormalizationDescriptor,
305*89c4ff92SAndroid Build Coastguard Worker                                                                                fbMeanConstTensorInfo,
306*89c4ff92SAndroid Build Coastguard Worker                                                                                fbVarianceConstTensorInfo,
307*89c4ff92SAndroid Build Coastguard Worker                                                                                fbBetaConstTensorInfo,
308*89c4ff92SAndroid Build Coastguard Worker                                                                                fbGammaConstTensorInfo);
309*89c4ff92SAndroid Build Coastguard Worker 
310*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
311*89c4ff92SAndroid Build Coastguard Worker }
312*89c4ff92SAndroid Build Coastguard Worker 
SerializeCastLayer(const armnn::IConnectableLayer * layer,const char * name)313*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeCastLayer(const armnn::IConnectableLayer* layer,
314*89c4ff92SAndroid Build Coastguard Worker                                             const char* name)
315*89c4ff92SAndroid Build Coastguard Worker {
316*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
317*89c4ff92SAndroid Build Coastguard Worker 
318*89c4ff92SAndroid Build Coastguard Worker     auto fbBaseLayer  = CreateLayerBase(layer, serializer::LayerType::LayerType_Cast);
319*89c4ff92SAndroid Build Coastguard Worker     auto fbCastLayer = serializer::CreateCastLayer(m_flatBufferBuilder, fbBaseLayer);
320*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbCastLayer.o, serializer::Layer::Layer_CastLayer);
321*89c4ff92SAndroid Build Coastguard Worker }
322*89c4ff92SAndroid Build Coastguard Worker 
SerializeChannelShuffleLayer(const armnn::IConnectableLayer * layer,const armnn::ChannelShuffleDescriptor & descriptor,const char * name)323*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeChannelShuffleLayer(const armnn::IConnectableLayer* layer,
324*89c4ff92SAndroid Build Coastguard Worker                                                       const armnn::ChannelShuffleDescriptor& descriptor,
325*89c4ff92SAndroid Build Coastguard Worker                                                       const char* name)
326*89c4ff92SAndroid Build Coastguard Worker {
327*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
328*89c4ff92SAndroid Build Coastguard Worker     auto fbDescriptor = CreateChannelShuffleDescriptor(m_flatBufferBuilder,
329*89c4ff92SAndroid Build Coastguard Worker                                                        descriptor.m_Axis,
330*89c4ff92SAndroid Build Coastguard Worker                                                        descriptor.m_NumGroups);
331*89c4ff92SAndroid Build Coastguard Worker     auto fbBaseLayer  = CreateLayerBase(layer, serializer::LayerType::LayerType_ChannelShuffle);
332*89c4ff92SAndroid Build Coastguard Worker     auto fbChannelShuffleLayer = serializer::CreateChannelShuffleLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
333*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbChannelShuffleLayer.o, serializer::Layer::Layer_ChannelShuffleLayer);
334*89c4ff92SAndroid Build Coastguard Worker }
335*89c4ff92SAndroid Build Coastguard Worker 
SerializeComparisonLayer(const armnn::IConnectableLayer * layer,const armnn::ComparisonDescriptor & descriptor,const char * name)336*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeComparisonLayer(const armnn::IConnectableLayer* layer,
337*89c4ff92SAndroid Build Coastguard Worker                                              const armnn::ComparisonDescriptor& descriptor,
338*89c4ff92SAndroid Build Coastguard Worker                                              const char* name)
339*89c4ff92SAndroid Build Coastguard Worker {
340*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
341*89c4ff92SAndroid Build Coastguard Worker 
342*89c4ff92SAndroid Build Coastguard Worker     auto fbBaseLayer  = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
343*89c4ff92SAndroid Build Coastguard Worker     auto fbDescriptor = serializer::CreateComparisonDescriptor(
344*89c4ff92SAndroid Build Coastguard Worker         m_flatBufferBuilder,
345*89c4ff92SAndroid Build Coastguard Worker         GetFlatBufferComparisonOperation(descriptor.m_Operation));
346*89c4ff92SAndroid Build Coastguard Worker 
347*89c4ff92SAndroid Build Coastguard Worker     auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
348*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
349*89c4ff92SAndroid Build Coastguard Worker }
350*89c4ff92SAndroid Build Coastguard Worker 
351*89c4ff92SAndroid Build Coastguard Worker // Build FlatBuffer for Constant Layer
SerializeConstantLayer(const armnn::IConnectableLayer * layer,const std::vector<armnn::ConstTensor> & constants,const char * name)352*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeConstantLayer(const armnn::IConnectableLayer* layer,
353*89c4ff92SAndroid Build Coastguard Worker                                                 const std::vector<armnn::ConstTensor>& constants,
354*89c4ff92SAndroid Build Coastguard Worker                                                 const char* name)
355*89c4ff92SAndroid Build Coastguard Worker {
356*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
357*89c4ff92SAndroid Build Coastguard Worker 
358*89c4ff92SAndroid Build Coastguard Worker     armnn::ConstTensor input = constants[0];
359*89c4ff92SAndroid Build Coastguard Worker 
360*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
361*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
362*89c4ff92SAndroid Build Coastguard Worker 
363*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
364*89c4ff92SAndroid Build Coastguard Worker 
365*89c4ff92SAndroid Build Coastguard Worker     // Create the FlatBuffer ConstantLayer
366*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
367*89c4ff92SAndroid Build Coastguard Worker                                                flatBufferConstantBaseLayer,
368*89c4ff92SAndroid Build Coastguard Worker                                                flatBufferConstTensorInfo);
369*89c4ff92SAndroid Build Coastguard Worker 
370*89c4ff92SAndroid Build Coastguard Worker     // Add the AnyLayer to the FlatBufferLayers
371*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
372*89c4ff92SAndroid Build Coastguard Worker }
373*89c4ff92SAndroid Build Coastguard Worker 
374*89c4ff92SAndroid Build Coastguard Worker // Build FlatBuffer for Convolution2dLayer
SerializeConvolution2dLayer(const armnn::IConnectableLayer * layer,const armnn::Convolution2dDescriptor & descriptor,const char * name)375*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeConvolution2dLayer(const armnn::IConnectableLayer* layer,
376*89c4ff92SAndroid Build Coastguard Worker                                                      const armnn::Convolution2dDescriptor& descriptor,
377*89c4ff92SAndroid Build Coastguard Worker                                                      const char* name)
378*89c4ff92SAndroid Build Coastguard Worker {
379*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
380*89c4ff92SAndroid Build Coastguard Worker 
381*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
382*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
383*89c4ff92SAndroid Build Coastguard Worker 
384*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
385*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_PadLeft,
386*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_PadRight,
387*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_PadTop,
388*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_PadBottom,
389*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_StrideX,
390*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_StrideY,
391*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_DilationX,
392*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_DilationY,
393*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_BiasEnabled,
394*89c4ff92SAndroid Build Coastguard Worker                                                               GetFlatBufferDataLayout(descriptor.m_DataLayout));
395*89c4ff92SAndroid Build Coastguard Worker 
396*89c4ff92SAndroid Build Coastguard Worker     // Create the FlatBuffer Convolution2dLayer
397*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
398*89c4ff92SAndroid Build Coastguard Worker                                                     flatBufferBaseLayer,
399*89c4ff92SAndroid Build Coastguard Worker                                                     flatBufferDescriptor);
400*89c4ff92SAndroid Build Coastguard Worker 
401*89c4ff92SAndroid Build Coastguard Worker     // Add the AnyLayer to the FlatBufferLayers
402*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
403*89c4ff92SAndroid Build Coastguard Worker }
404*89c4ff92SAndroid Build Coastguard Worker 
405*89c4ff92SAndroid Build Coastguard Worker // Build FlatBuffer for Convolution3dLayer
SerializeConvolution3dLayer(const armnn::IConnectableLayer * layer,const armnn::Convolution3dDescriptor & descriptor,const char * name)406*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeConvolution3dLayer(const armnn::IConnectableLayer* layer,
407*89c4ff92SAndroid Build Coastguard Worker                                                      const armnn::Convolution3dDescriptor& descriptor,
408*89c4ff92SAndroid Build Coastguard Worker                                                      const char* name)
409*89c4ff92SAndroid Build Coastguard Worker {
410*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
411*89c4ff92SAndroid Build Coastguard Worker 
412*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
413*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution3d);
414*89c4ff92SAndroid Build Coastguard Worker 
415*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferDescriptor = CreateConvolution3dDescriptor(m_flatBufferBuilder,
416*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_PadLeft,
417*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_PadRight,
418*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_PadTop,
419*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_PadBottom,
420*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_PadFront,
421*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_PadBack,
422*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_StrideX,
423*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_StrideY,
424*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_StrideZ,
425*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_DilationX,
426*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_DilationY,
427*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_DilationZ,
428*89c4ff92SAndroid Build Coastguard Worker                                                               descriptor.m_BiasEnabled,
429*89c4ff92SAndroid Build Coastguard Worker                                                               GetFlatBufferDataLayout(descriptor.m_DataLayout));
430*89c4ff92SAndroid Build Coastguard Worker 
431*89c4ff92SAndroid Build Coastguard Worker     // Create the FlatBuffer Convolution3dLayer
432*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLayer = CreateConvolution3dLayer(m_flatBufferBuilder,
433*89c4ff92SAndroid Build Coastguard Worker                                                     flatBufferBaseLayer,
434*89c4ff92SAndroid Build Coastguard Worker                                                     flatBufferDescriptor);
435*89c4ff92SAndroid Build Coastguard Worker 
436*89c4ff92SAndroid Build Coastguard Worker     // Add the AnyLayer to the FlatBufferLayers
437*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution3dLayer);
438*89c4ff92SAndroid Build Coastguard Worker }
439*89c4ff92SAndroid Build Coastguard Worker 
SerializeDepthToSpaceLayer(const armnn::IConnectableLayer * layer,const armnn::DepthToSpaceDescriptor & descriptor,const char * name)440*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeDepthToSpaceLayer(const armnn::IConnectableLayer* layer,
441*89c4ff92SAndroid Build Coastguard Worker                                                const armnn::DepthToSpaceDescriptor& descriptor,
442*89c4ff92SAndroid Build Coastguard Worker                                                const char* name)
443*89c4ff92SAndroid Build Coastguard Worker {
444*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
445*89c4ff92SAndroid Build Coastguard Worker 
446*89c4ff92SAndroid Build Coastguard Worker     auto fbBaseLayer  = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
447*89c4ff92SAndroid Build Coastguard Worker     auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
448*89c4ff92SAndroid Build Coastguard Worker                                                      descriptor.m_BlockSize,
449*89c4ff92SAndroid Build Coastguard Worker                                                      GetFlatBufferDataLayout(descriptor.m_DataLayout));
450*89c4ff92SAndroid Build Coastguard Worker 
451*89c4ff92SAndroid Build Coastguard Worker     auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
452*89c4ff92SAndroid Build Coastguard Worker 
453*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
454*89c4ff92SAndroid Build Coastguard Worker }
455*89c4ff92SAndroid Build Coastguard Worker 
SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer * layer,const armnn::DepthwiseConvolution2dDescriptor & descriptor,const char * name)456*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeDepthwiseConvolution2dLayer(const armnn::IConnectableLayer* layer,
457*89c4ff92SAndroid Build Coastguard Worker                                                               const armnn::DepthwiseConvolution2dDescriptor& descriptor,
458*89c4ff92SAndroid Build Coastguard Worker                                                               const char* name)
459*89c4ff92SAndroid Build Coastguard Worker {
460*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
461*89c4ff92SAndroid Build Coastguard Worker 
462*89c4ff92SAndroid Build Coastguard Worker     auto fbBaseLayer  = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
463*89c4ff92SAndroid Build Coastguard Worker     auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
464*89c4ff92SAndroid Build Coastguard Worker                                                                descriptor.m_PadLeft,
465*89c4ff92SAndroid Build Coastguard Worker                                                                descriptor.m_PadRight,
466*89c4ff92SAndroid Build Coastguard Worker                                                                descriptor.m_PadTop,
467*89c4ff92SAndroid Build Coastguard Worker                                                                descriptor.m_PadBottom,
468*89c4ff92SAndroid Build Coastguard Worker                                                                descriptor.m_StrideX,
469*89c4ff92SAndroid Build Coastguard Worker                                                                descriptor.m_StrideY,
470*89c4ff92SAndroid Build Coastguard Worker                                                                descriptor.m_DilationX,
471*89c4ff92SAndroid Build Coastguard Worker                                                                descriptor.m_DilationY,
472*89c4ff92SAndroid Build Coastguard Worker                                                                descriptor.m_BiasEnabled,
473*89c4ff92SAndroid Build Coastguard Worker                                                                GetFlatBufferDataLayout(descriptor.m_DataLayout));
474*89c4ff92SAndroid Build Coastguard Worker 
475*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
476*89c4ff92SAndroid Build Coastguard Worker                                                              fbBaseLayer,
477*89c4ff92SAndroid Build Coastguard Worker                                                              fbDescriptor);
478*89c4ff92SAndroid Build Coastguard Worker 
479*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
480*89c4ff92SAndroid Build Coastguard Worker }
481*89c4ff92SAndroid Build Coastguard Worker 
SerializeDequantizeLayer(const armnn::IConnectableLayer * layer,const char * name)482*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeDequantizeLayer(const armnn::IConnectableLayer* layer,
483*89c4ff92SAndroid Build Coastguard Worker                                              const char* name)
484*89c4ff92SAndroid Build Coastguard Worker {
485*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
486*89c4ff92SAndroid Build Coastguard Worker 
487*89c4ff92SAndroid Build Coastguard Worker     auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
488*89c4ff92SAndroid Build Coastguard Worker     auto fbDequantizeLayer     = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
489*89c4ff92SAndroid Build Coastguard Worker 
490*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
491*89c4ff92SAndroid Build Coastguard Worker }
492*89c4ff92SAndroid Build Coastguard Worker 
SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer * layer,const armnn::DetectionPostProcessDescriptor & descriptor,const std::vector<armnn::ConstTensor> & constants,const char * name)493*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeDetectionPostProcessLayer(const armnn::IConnectableLayer* layer,
494*89c4ff92SAndroid Build Coastguard Worker                                                             const armnn::DetectionPostProcessDescriptor& descriptor,
495*89c4ff92SAndroid Build Coastguard Worker                                                             const std::vector<armnn::ConstTensor>& constants,
496*89c4ff92SAndroid Build Coastguard Worker                                                             const char* name)
497*89c4ff92SAndroid Build Coastguard Worker {
498*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
499*89c4ff92SAndroid Build Coastguard Worker 
500*89c4ff92SAndroid Build Coastguard Worker     const armnn::ConstTensor& anchors = constants[0];
501*89c4ff92SAndroid Build Coastguard Worker 
502*89c4ff92SAndroid Build Coastguard Worker     auto fbBaseLayer  = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
503*89c4ff92SAndroid Build Coastguard Worker     auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
504*89c4ff92SAndroid Build Coastguard Worker                                                              descriptor.m_MaxDetections,
505*89c4ff92SAndroid Build Coastguard Worker                                                              descriptor.m_MaxClassesPerDetection,
506*89c4ff92SAndroid Build Coastguard Worker                                                              descriptor.m_DetectionsPerClass,
507*89c4ff92SAndroid Build Coastguard Worker                                                              descriptor.m_NmsScoreThreshold,
508*89c4ff92SAndroid Build Coastguard Worker                                                              descriptor.m_NmsIouThreshold,
509*89c4ff92SAndroid Build Coastguard Worker                                                              descriptor.m_NumClasses,
510*89c4ff92SAndroid Build Coastguard Worker                                                              descriptor.m_UseRegularNms,
511*89c4ff92SAndroid Build Coastguard Worker                                                              descriptor.m_ScaleX,
512*89c4ff92SAndroid Build Coastguard Worker                                                              descriptor.m_ScaleY,
513*89c4ff92SAndroid Build Coastguard Worker                                                              descriptor.m_ScaleW,
514*89c4ff92SAndroid Build Coastguard Worker                                                              descriptor.m_ScaleH);
515*89c4ff92SAndroid Build Coastguard Worker 
516*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
517*89c4ff92SAndroid Build Coastguard Worker 
518*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
519*89c4ff92SAndroid Build Coastguard Worker                                                            fbBaseLayer,
520*89c4ff92SAndroid Build Coastguard Worker                                                            fbDescriptor,
521*89c4ff92SAndroid Build Coastguard Worker                                                            fbAnchorsConstTensorInfo);
522*89c4ff92SAndroid Build Coastguard Worker 
523*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
524*89c4ff92SAndroid Build Coastguard Worker }
525*89c4ff92SAndroid Build Coastguard Worker 
SerializeDivisionLayer(const armnn::IConnectableLayer * layer,const char * name)526*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeDivisionLayer(const armnn::IConnectableLayer* layer, const char* name)
527*89c4ff92SAndroid Build Coastguard Worker {
528*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
529*89c4ff92SAndroid Build Coastguard Worker 
530*89c4ff92SAndroid Build Coastguard Worker     auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
531*89c4ff92SAndroid Build Coastguard Worker     auto fbDivisionLayer     = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
532*89c4ff92SAndroid Build Coastguard Worker 
533*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
534*89c4ff92SAndroid Build Coastguard Worker }
535*89c4ff92SAndroid Build Coastguard Worker 
SerializeElementwiseBinaryLayer(const armnn::IConnectableLayer * layer,const armnn::ElementwiseBinaryDescriptor & descriptor,const char * name)536*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeElementwiseBinaryLayer(const armnn::IConnectableLayer* layer,
537*89c4ff92SAndroid Build Coastguard Worker                                                          const armnn::ElementwiseBinaryDescriptor& descriptor,
538*89c4ff92SAndroid Build Coastguard Worker                                                          const char* name)
539*89c4ff92SAndroid Build Coastguard Worker {
540*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
541*89c4ff92SAndroid Build Coastguard Worker 
542*89c4ff92SAndroid Build Coastguard Worker     auto fbBaseLayer  = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseBinary);
543*89c4ff92SAndroid Build Coastguard Worker     auto fbDescriptor = serializer::CreateElementwiseBinaryDescriptor(
544*89c4ff92SAndroid Build Coastguard Worker             m_flatBufferBuilder,
545*89c4ff92SAndroid Build Coastguard Worker             GetFlatBufferBinaryOperation(descriptor.m_Operation));
546*89c4ff92SAndroid Build Coastguard Worker 
547*89c4ff92SAndroid Build Coastguard Worker     auto fbLayer = serializer::CreateElementwiseBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
548*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseBinaryLayer);
549*89c4ff92SAndroid Build Coastguard Worker }
550*89c4ff92SAndroid Build Coastguard Worker 
SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer * layer,const armnn::ElementwiseUnaryDescriptor & descriptor,const char * name)551*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeElementwiseUnaryLayer(const armnn::IConnectableLayer* layer,
552*89c4ff92SAndroid Build Coastguard Worker                                                    const armnn::ElementwiseUnaryDescriptor& descriptor,
553*89c4ff92SAndroid Build Coastguard Worker                                                    const char* name)
554*89c4ff92SAndroid Build Coastguard Worker {
555*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
556*89c4ff92SAndroid Build Coastguard Worker 
557*89c4ff92SAndroid Build Coastguard Worker     auto fbBaseLayer  = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
558*89c4ff92SAndroid Build Coastguard Worker     auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
559*89c4ff92SAndroid Build Coastguard Worker         m_flatBufferBuilder,
560*89c4ff92SAndroid Build Coastguard Worker         GetFlatBufferUnaryOperation(descriptor.m_Operation));
561*89c4ff92SAndroid Build Coastguard Worker 
562*89c4ff92SAndroid Build Coastguard Worker     auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
563*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
564*89c4ff92SAndroid Build Coastguard Worker }
565*89c4ff92SAndroid Build Coastguard Worker 
SerializeFillLayer(const armnn::IConnectableLayer * layer,const armnn::FillDescriptor & fillDescriptor,const char * name)566*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeFillLayer(const armnn::IConnectableLayer* layer,
567*89c4ff92SAndroid Build Coastguard Worker                                        const armnn::FillDescriptor& fillDescriptor,
568*89c4ff92SAndroid Build Coastguard Worker                                        const char* name)
569*89c4ff92SAndroid Build Coastguard Worker {
570*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
571*89c4ff92SAndroid Build Coastguard Worker 
572*89c4ff92SAndroid Build Coastguard Worker     auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill);
573*89c4ff92SAndroid Build Coastguard Worker 
574*89c4ff92SAndroid Build Coastguard Worker     auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.m_Value);
575*89c4ff92SAndroid Build Coastguard Worker 
576*89c4ff92SAndroid Build Coastguard Worker     auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor);
577*89c4ff92SAndroid Build Coastguard Worker 
578*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer);
579*89c4ff92SAndroid Build Coastguard Worker }
580*89c4ff92SAndroid Build Coastguard Worker 
SerializeFloorLayer(const armnn::IConnectableLayer * layer,const char * name)581*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeFloorLayer(const armnn::IConnectableLayer *layer, const char *name)
582*89c4ff92SAndroid Build Coastguard Worker {
583*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
584*89c4ff92SAndroid Build Coastguard Worker 
585*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
586*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
587*89c4ff92SAndroid Build Coastguard Worker 
588*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
589*89c4ff92SAndroid Build Coastguard Worker }
590*89c4ff92SAndroid Build Coastguard Worker 
SerializeGatherLayer(const armnn::IConnectableLayer * layer,const armnn::GatherDescriptor & gatherDescriptor,const char * name)591*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeGatherLayer(const armnn::IConnectableLayer* layer,
592*89c4ff92SAndroid Build Coastguard Worker                                          const armnn::GatherDescriptor& gatherDescriptor,
593*89c4ff92SAndroid Build Coastguard Worker                                          const char* name)
594*89c4ff92SAndroid Build Coastguard Worker {
595*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
596*89c4ff92SAndroid Build Coastguard Worker 
597*89c4ff92SAndroid Build Coastguard Worker     auto fbGatherDescriptor = CreateGatherDescriptor(m_flatBufferBuilder,
598*89c4ff92SAndroid Build Coastguard Worker                                                      gatherDescriptor.m_Axis);
599*89c4ff92SAndroid Build Coastguard Worker     auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
600*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLayer   = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer, fbGatherDescriptor);
601*89c4ff92SAndroid Build Coastguard Worker 
602*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
603*89c4ff92SAndroid Build Coastguard Worker }
604*89c4ff92SAndroid Build Coastguard Worker 
SerializeGatherNdLayer(const armnn::IConnectableLayer * layer,const char * name)605*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeGatherNdLayer(const armnn::IConnectableLayer* layer,
606*89c4ff92SAndroid Build Coastguard Worker                                                 const char* name)
607*89c4ff92SAndroid Build Coastguard Worker {
608*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
609*89c4ff92SAndroid Build Coastguard Worker 
610*89c4ff92SAndroid Build Coastguard Worker     auto fbGatherNdBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_GatherNd);
611*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLayer     = serializer::CreateGatherNdLayer(m_flatBufferBuilder, fbGatherNdBaseLayer);
612*89c4ff92SAndroid Build Coastguard Worker 
613*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherNdLayer);
614*89c4ff92SAndroid Build Coastguard Worker }
615*89c4ff92SAndroid Build Coastguard Worker 
SerializeInstanceNormalizationLayer(const armnn::IConnectableLayer * layer,const armnn::InstanceNormalizationDescriptor & instanceNormalizationDescriptor,const char * name)616*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeInstanceNormalizationLayer(
617*89c4ff92SAndroid Build Coastguard Worker     const armnn::IConnectableLayer* layer,
618*89c4ff92SAndroid Build Coastguard Worker     const armnn::InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
619*89c4ff92SAndroid Build Coastguard Worker     const char* name)
620*89c4ff92SAndroid Build Coastguard Worker {
621*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
622*89c4ff92SAndroid Build Coastguard Worker 
623*89c4ff92SAndroid Build Coastguard Worker     auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
624*89c4ff92SAndroid Build Coastguard Worker             m_flatBufferBuilder,
625*89c4ff92SAndroid Build Coastguard Worker             instanceNormalizationDescriptor.m_Gamma,
626*89c4ff92SAndroid Build Coastguard Worker             instanceNormalizationDescriptor.m_Beta,
627*89c4ff92SAndroid Build Coastguard Worker             instanceNormalizationDescriptor.m_Eps,
628*89c4ff92SAndroid Build Coastguard Worker             GetFlatBufferDataLayout(instanceNormalizationDescriptor.m_DataLayout));
629*89c4ff92SAndroid Build Coastguard Worker 
630*89c4ff92SAndroid Build Coastguard Worker     auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
631*89c4ff92SAndroid Build Coastguard Worker     auto fbLayer     = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
632*89c4ff92SAndroid Build Coastguard Worker 
633*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
634*89c4ff92SAndroid Build Coastguard Worker }
635*89c4ff92SAndroid Build Coastguard Worker 
SerializeL2NormalizationLayer(const armnn::IConnectableLayer * layer,const armnn::L2NormalizationDescriptor & l2NormalizationDescriptor,const char * name)636*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeL2NormalizationLayer(const armnn::IConnectableLayer* layer,
637*89c4ff92SAndroid Build Coastguard Worker                                                   const armnn::L2NormalizationDescriptor& l2NormalizationDescriptor,
638*89c4ff92SAndroid Build Coastguard Worker                                                   const char* name)
639*89c4ff92SAndroid Build Coastguard Worker {
640*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
641*89c4ff92SAndroid Build Coastguard Worker 
642*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
643*89c4ff92SAndroid Build Coastguard Worker     auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
644*89c4ff92SAndroid Build Coastguard Worker 
645*89c4ff92SAndroid Build Coastguard Worker     // Create the FlatBuffer L2Normalization Descriptor
646*89c4ff92SAndroid Build Coastguard Worker     auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
647*89c4ff92SAndroid Build Coastguard Worker             m_flatBufferBuilder,
648*89c4ff92SAndroid Build Coastguard Worker             GetFlatBufferDataLayout(l2NormalizationDescriptor.m_DataLayout),
649*89c4ff92SAndroid Build Coastguard Worker             l2NormalizationDescriptor.m_Eps);
650*89c4ff92SAndroid Build Coastguard Worker 
651*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer layer
652*89c4ff92SAndroid Build Coastguard Worker     auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
653*89c4ff92SAndroid Build Coastguard Worker 
654*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
655*89c4ff92SAndroid Build Coastguard Worker }
656*89c4ff92SAndroid Build Coastguard Worker 
SerializeLogicalBinaryLayer(const armnn::IConnectableLayer * layer,const armnn::LogicalBinaryDescriptor & descriptor,const char * name)657*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeLogicalBinaryLayer(const armnn::IConnectableLayer* layer,
658*89c4ff92SAndroid Build Coastguard Worker                                                 const armnn::LogicalBinaryDescriptor& descriptor,
659*89c4ff92SAndroid Build Coastguard Worker                                                 const char* name)
660*89c4ff92SAndroid Build Coastguard Worker {
661*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
662*89c4ff92SAndroid Build Coastguard Worker 
663*89c4ff92SAndroid Build Coastguard Worker     auto fbBaseLayer  = CreateLayerBase(layer, serializer::LayerType::LayerType_LogicalBinary);
664*89c4ff92SAndroid Build Coastguard Worker     auto fbDescriptor = serializer::CreateLogicalBinaryDescriptor(
665*89c4ff92SAndroid Build Coastguard Worker         m_flatBufferBuilder,
666*89c4ff92SAndroid Build Coastguard Worker         GetFlatBufferLogicalBinaryOperation(descriptor.m_Operation));
667*89c4ff92SAndroid Build Coastguard Worker 
668*89c4ff92SAndroid Build Coastguard Worker     auto fbLayer = serializer::CreateLogicalBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
669*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_LogicalBinaryLayer);
670*89c4ff92SAndroid Build Coastguard Worker }
671*89c4ff92SAndroid Build Coastguard Worker 
SerializeLogSoftmaxLayer(const armnn::IConnectableLayer * layer,const armnn::LogSoftmaxDescriptor & logSoftmaxDescriptor,const char * name)672*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeLogSoftmaxLayer(const armnn::IConnectableLayer* layer,
673*89c4ff92SAndroid Build Coastguard Worker                                              const armnn::LogSoftmaxDescriptor& logSoftmaxDescriptor,
674*89c4ff92SAndroid Build Coastguard Worker                                              const char* name)
675*89c4ff92SAndroid Build Coastguard Worker {
676*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
677*89c4ff92SAndroid Build Coastguard Worker 
678*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
679*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
680*89c4ff92SAndroid Build Coastguard Worker 
681*89c4ff92SAndroid Build Coastguard Worker     // Create the FlatBuffer LogSoftmaxDescriptor
682*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLogSoftmaxDesc =
683*89c4ff92SAndroid Build Coastguard Worker         serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
684*89c4ff92SAndroid Build Coastguard Worker                                                logSoftmaxDescriptor.m_Beta,
685*89c4ff92SAndroid Build Coastguard Worker                                                logSoftmaxDescriptor.m_Axis);
686*89c4ff92SAndroid Build Coastguard Worker 
687*89c4ff92SAndroid Build Coastguard Worker     // Create the FlatBuffer LogSoftmaxLayer
688*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLogSoftmaxLayer =
689*89c4ff92SAndroid Build Coastguard Worker         serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
690*89c4ff92SAndroid Build Coastguard Worker                                           flatBufferLogSoftmaxBaseLayer,
691*89c4ff92SAndroid Build Coastguard Worker                                           flatBufferLogSoftmaxDesc);
692*89c4ff92SAndroid Build Coastguard Worker 
693*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
694*89c4ff92SAndroid Build Coastguard Worker }
695*89c4ff92SAndroid Build Coastguard Worker 
SerializeLstmLayer(const armnn::IConnectableLayer * layer,const armnn::LstmDescriptor & descriptor,const std::vector<armnn::ConstTensor> & constants,const char * name)696*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeLstmLayer(const armnn::IConnectableLayer* layer,
697*89c4ff92SAndroid Build Coastguard Worker                                             const armnn::LstmDescriptor& descriptor,
698*89c4ff92SAndroid Build Coastguard Worker                                             const std::vector<armnn::ConstTensor>& constants,
699*89c4ff92SAndroid Build Coastguard Worker                                             const char* name)
700*89c4ff92SAndroid Build Coastguard Worker {
701*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
702*89c4ff92SAndroid Build Coastguard Worker 
703*89c4ff92SAndroid Build Coastguard Worker     auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
704*89c4ff92SAndroid Build Coastguard Worker 
705*89c4ff92SAndroid Build Coastguard Worker     auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
706*89c4ff92SAndroid Build Coastguard Worker         m_flatBufferBuilder,
707*89c4ff92SAndroid Build Coastguard Worker         descriptor.m_ActivationFunc,
708*89c4ff92SAndroid Build Coastguard Worker         descriptor.m_ClippingThresCell,
709*89c4ff92SAndroid Build Coastguard Worker         descriptor.m_ClippingThresProj,
710*89c4ff92SAndroid Build Coastguard Worker         descriptor.m_CifgEnabled,
711*89c4ff92SAndroid Build Coastguard Worker         descriptor.m_PeepholeEnabled,
712*89c4ff92SAndroid Build Coastguard Worker         descriptor.m_ProjectionEnabled,
713*89c4ff92SAndroid Build Coastguard Worker         descriptor.m_LayerNormEnabled);
714*89c4ff92SAndroid Build Coastguard Worker 
715*89c4ff92SAndroid Build Coastguard Worker     // Index for constants vector
716*89c4ff92SAndroid Build Coastguard Worker     std::size_t i = 0;
717*89c4ff92SAndroid Build Coastguard Worker 
718*89c4ff92SAndroid Build Coastguard Worker     // Get mandatory/basic input parameters
719*89c4ff92SAndroid Build Coastguard Worker     auto inputToForgetWeights     = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
720*89c4ff92SAndroid Build Coastguard Worker     auto inputToCellWeights       = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
721*89c4ff92SAndroid Build Coastguard Worker     auto inputToOutputWeights     = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
722*89c4ff92SAndroid Build Coastguard Worker     auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
723*89c4ff92SAndroid Build Coastguard Worker     auto recurrentToCellWeights   = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
724*89c4ff92SAndroid Build Coastguard Worker     auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
725*89c4ff92SAndroid Build Coastguard Worker     auto forgetGateBias           = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
726*89c4ff92SAndroid Build Coastguard Worker     auto cellBias                 = CreateConstTensorInfo(constants[i++]); //CellBias
727*89c4ff92SAndroid Build Coastguard Worker     auto outputGateBias           = CreateConstTensorInfo(constants[i++]); //OutputGateBias
728*89c4ff92SAndroid Build Coastguard Worker 
729*89c4ff92SAndroid Build Coastguard Worker 
730*89c4ff92SAndroid Build Coastguard Worker 
731*89c4ff92SAndroid Build Coastguard Worker     //Define optional parameters, these will be set depending on configuration in Lstm descriptor
732*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
733*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
734*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
735*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
736*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
737*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> projectionBias;
738*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
739*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
740*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
741*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
742*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
743*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
744*89c4ff92SAndroid Build Coastguard Worker 
745*89c4ff92SAndroid Build Coastguard Worker     if (!descriptor.m_CifgEnabled)
746*89c4ff92SAndroid Build Coastguard Worker     {
747*89c4ff92SAndroid Build Coastguard Worker         inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
748*89c4ff92SAndroid Build Coastguard Worker         recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
749*89c4ff92SAndroid Build Coastguard Worker         inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
750*89c4ff92SAndroid Build Coastguard Worker     }
751*89c4ff92SAndroid Build Coastguard Worker 
752*89c4ff92SAndroid Build Coastguard Worker     if (descriptor.m_PeepholeEnabled)
753*89c4ff92SAndroid Build Coastguard Worker     {
754*89c4ff92SAndroid Build Coastguard Worker         if (!descriptor.m_CifgEnabled)
755*89c4ff92SAndroid Build Coastguard Worker         {
756*89c4ff92SAndroid Build Coastguard Worker             cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
757*89c4ff92SAndroid Build Coastguard Worker         }
758*89c4ff92SAndroid Build Coastguard Worker         cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
759*89c4ff92SAndroid Build Coastguard Worker         cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
760*89c4ff92SAndroid Build Coastguard Worker     }
761*89c4ff92SAndroid Build Coastguard Worker 
762*89c4ff92SAndroid Build Coastguard Worker     if (descriptor.m_ProjectionEnabled)
763*89c4ff92SAndroid Build Coastguard Worker     {
764*89c4ff92SAndroid Build Coastguard Worker         projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
765*89c4ff92SAndroid Build Coastguard Worker         projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
766*89c4ff92SAndroid Build Coastguard Worker     }
767*89c4ff92SAndroid Build Coastguard Worker 
768*89c4ff92SAndroid Build Coastguard Worker     if (descriptor.m_LayerNormEnabled)
769*89c4ff92SAndroid Build Coastguard Worker     {
770*89c4ff92SAndroid Build Coastguard Worker         if (!descriptor.m_CifgEnabled)
771*89c4ff92SAndroid Build Coastguard Worker         {
772*89c4ff92SAndroid Build Coastguard Worker             inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
773*89c4ff92SAndroid Build Coastguard Worker         }
774*89c4ff92SAndroid Build Coastguard Worker         forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
775*89c4ff92SAndroid Build Coastguard Worker         cellLayerNormWeights   = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
776*89c4ff92SAndroid Build Coastguard Worker         outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
777*89c4ff92SAndroid Build Coastguard Worker     }
778*89c4ff92SAndroid Build Coastguard Worker 
779*89c4ff92SAndroid Build Coastguard Worker     auto fbLstmParams = serializer::CreateLstmInputParams(
780*89c4ff92SAndroid Build Coastguard Worker         m_flatBufferBuilder,
781*89c4ff92SAndroid Build Coastguard Worker         inputToForgetWeights,
782*89c4ff92SAndroid Build Coastguard Worker         inputToCellWeights,
783*89c4ff92SAndroid Build Coastguard Worker         inputToOutputWeights,
784*89c4ff92SAndroid Build Coastguard Worker         recurrentToForgetWeights,
785*89c4ff92SAndroid Build Coastguard Worker         recurrentToCellWeights,
786*89c4ff92SAndroid Build Coastguard Worker         recurrentToOutputWeights,
787*89c4ff92SAndroid Build Coastguard Worker         forgetGateBias,
788*89c4ff92SAndroid Build Coastguard Worker         cellBias,
789*89c4ff92SAndroid Build Coastguard Worker         outputGateBias,
790*89c4ff92SAndroid Build Coastguard Worker         inputToInputWeights,
791*89c4ff92SAndroid Build Coastguard Worker         recurrentToInputWeights,
792*89c4ff92SAndroid Build Coastguard Worker         cellToInputWeights,
793*89c4ff92SAndroid Build Coastguard Worker         inputGateBias,
794*89c4ff92SAndroid Build Coastguard Worker         projectionWeights,
795*89c4ff92SAndroid Build Coastguard Worker         projectionBias,
796*89c4ff92SAndroid Build Coastguard Worker         cellToForgetWeights,
797*89c4ff92SAndroid Build Coastguard Worker         cellToOutputWeights,
798*89c4ff92SAndroid Build Coastguard Worker         inputLayerNormWeights,
799*89c4ff92SAndroid Build Coastguard Worker         forgetLayerNormWeights,
800*89c4ff92SAndroid Build Coastguard Worker         cellLayerNormWeights,
801*89c4ff92SAndroid Build Coastguard Worker         outputLayerNormWeights);
802*89c4ff92SAndroid Build Coastguard Worker 
803*89c4ff92SAndroid Build Coastguard Worker     auto fbLstmLayer = serializer::CreateLstmLayer(
804*89c4ff92SAndroid Build Coastguard Worker         m_flatBufferBuilder,
805*89c4ff92SAndroid Build Coastguard Worker         fbLstmBaseLayer,
806*89c4ff92SAndroid Build Coastguard Worker         fbLstmDescriptor,
807*89c4ff92SAndroid Build Coastguard Worker         fbLstmParams);
808*89c4ff92SAndroid Build Coastguard Worker 
809*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
810*89c4ff92SAndroid Build Coastguard Worker }
811*89c4ff92SAndroid Build Coastguard Worker 
SerializeMaximumLayer(const armnn::IConnectableLayer * layer,const char * name)812*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeMaximumLayer(const armnn::IConnectableLayer* layer, const char* name)
813*89c4ff92SAndroid Build Coastguard Worker {
814*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
815*89c4ff92SAndroid Build Coastguard Worker 
816*89c4ff92SAndroid Build Coastguard Worker     auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
817*89c4ff92SAndroid Build Coastguard Worker     auto fbMaximumLayer     = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
818*89c4ff92SAndroid Build Coastguard Worker 
819*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
820*89c4ff92SAndroid Build Coastguard Worker }
821*89c4ff92SAndroid Build Coastguard Worker 
SerializeMeanLayer(const armnn::IConnectableLayer * layer,const armnn::MeanDescriptor & descriptor,const char * name)822*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeMeanLayer(const armnn::IConnectableLayer* layer,
823*89c4ff92SAndroid Build Coastguard Worker                                        const armnn::MeanDescriptor& descriptor,
824*89c4ff92SAndroid Build Coastguard Worker                                        const char* name)
825*89c4ff92SAndroid Build Coastguard Worker {
826*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
827*89c4ff92SAndroid Build Coastguard Worker 
828*89c4ff92SAndroid Build Coastguard Worker     auto fbMeanBaseLayer  = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
829*89c4ff92SAndroid Build Coastguard Worker     auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
830*89c4ff92SAndroid Build Coastguard Worker                                                              m_flatBufferBuilder.CreateVector(descriptor.m_Axis),
831*89c4ff92SAndroid Build Coastguard Worker                                                              descriptor.m_KeepDims);
832*89c4ff92SAndroid Build Coastguard Worker 
833*89c4ff92SAndroid Build Coastguard Worker     auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
834*89c4ff92SAndroid Build Coastguard Worker                                                    fbMeanBaseLayer,
835*89c4ff92SAndroid Build Coastguard Worker                                                    fbMeanDescriptor);
836*89c4ff92SAndroid Build Coastguard Worker 
837*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
838*89c4ff92SAndroid Build Coastguard Worker }
839*89c4ff92SAndroid Build Coastguard Worker 
SerializeMinimumLayer(const armnn::IConnectableLayer * layer,const char * name)840*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeMinimumLayer(const armnn::IConnectableLayer* layer, const char* name)
841*89c4ff92SAndroid Build Coastguard Worker {
842*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
843*89c4ff92SAndroid Build Coastguard Worker 
844*89c4ff92SAndroid Build Coastguard Worker     auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
845*89c4ff92SAndroid Build Coastguard Worker     auto fbMinimumLayer     = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
846*89c4ff92SAndroid Build Coastguard Worker 
847*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
848*89c4ff92SAndroid Build Coastguard Worker }
849*89c4ff92SAndroid Build Coastguard Worker 
SerializeMergeLayer(const armnn::IConnectableLayer * layer,const char * name)850*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeMergeLayer(const armnn::IConnectableLayer* layer, const char* name)
851*89c4ff92SAndroid Build Coastguard Worker {
852*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
853*89c4ff92SAndroid Build Coastguard Worker 
854*89c4ff92SAndroid Build Coastguard Worker     auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
855*89c4ff92SAndroid Build Coastguard Worker     auto fbMergeLayer     = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
856*89c4ff92SAndroid Build Coastguard Worker 
857*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
858*89c4ff92SAndroid Build Coastguard Worker }
859*89c4ff92SAndroid Build Coastguard Worker 
SerializeConcatLayer(const armnn::IConnectableLayer * layer,const armnn::ConcatDescriptor & concatDescriptor,const char * name)860*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeConcatLayer(const armnn::IConnectableLayer* layer,
861*89c4ff92SAndroid Build Coastguard Worker                                          const armnn::ConcatDescriptor& concatDescriptor,
862*89c4ff92SAndroid Build Coastguard Worker                                          const char* name)
863*89c4ff92SAndroid Build Coastguard Worker {
864*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
865*89c4ff92SAndroid Build Coastguard Worker 
866*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
867*89c4ff92SAndroid Build Coastguard Worker 
868*89c4ff92SAndroid Build Coastguard Worker     std::vector<flatbuffers::Offset<UintVector>> views;
869*89c4ff92SAndroid Build Coastguard Worker     for (unsigned int v = 0; v < concatDescriptor.GetNumViews(); ++v)
870*89c4ff92SAndroid Build Coastguard Worker     {
871*89c4ff92SAndroid Build Coastguard Worker         const uint32_t* origin = concatDescriptor.GetViewOrigin(v);
872*89c4ff92SAndroid Build Coastguard Worker         std::vector<uint32_t> origins;
873*89c4ff92SAndroid Build Coastguard Worker         for (unsigned int d = 0; d < concatDescriptor.GetNumDimensions(); ++d)
874*89c4ff92SAndroid Build Coastguard Worker         {
875*89c4ff92SAndroid Build Coastguard Worker             origins.push_back(origin[d]);
876*89c4ff92SAndroid Build Coastguard Worker         }
877*89c4ff92SAndroid Build Coastguard Worker         auto view = m_flatBufferBuilder.CreateVector(origins);
878*89c4ff92SAndroid Build Coastguard Worker         auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
879*89c4ff92SAndroid Build Coastguard Worker         views.push_back(uintVector);
880*89c4ff92SAndroid Build Coastguard Worker     }
881*89c4ff92SAndroid Build Coastguard Worker 
882*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
883*89c4ff92SAndroid Build Coastguard Worker                                                               concatDescriptor.GetConcatAxis(),
884*89c4ff92SAndroid Build Coastguard Worker                                                               concatDescriptor.GetNumViews(),
885*89c4ff92SAndroid Build Coastguard Worker                                                               concatDescriptor.GetNumDimensions(),
886*89c4ff92SAndroid Build Coastguard Worker                                                               m_flatBufferBuilder.CreateVector(views));
887*89c4ff92SAndroid Build Coastguard Worker 
888*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
889*89c4ff92SAndroid Build Coastguard Worker                                              flatBufferConcatBaseLayer,
890*89c4ff92SAndroid Build Coastguard Worker                                              flatBufferConcatDescriptor);
891*89c4ff92SAndroid Build Coastguard Worker 
892*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
893*89c4ff92SAndroid Build Coastguard Worker }
894*89c4ff92SAndroid Build Coastguard Worker 
SerializeMultiplicationLayer(const armnn::IConnectableLayer * layer,const char * name)895*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeMultiplicationLayer(const armnn::IConnectableLayer* layer, const char* name)
896*89c4ff92SAndroid Build Coastguard Worker {
897*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
898*89c4ff92SAndroid Build Coastguard Worker 
899*89c4ff92SAndroid Build Coastguard Worker     auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
900*89c4ff92SAndroid Build Coastguard Worker     auto fbMultiplicationLayer     = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
901*89c4ff92SAndroid Build Coastguard Worker                                                                            fbMultiplicationBaseLayer);
902*89c4ff92SAndroid Build Coastguard Worker 
903*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
904*89c4ff92SAndroid Build Coastguard Worker }
905*89c4ff92SAndroid Build Coastguard Worker 
SerializePadLayer(const armnn::IConnectableLayer * layer,const armnn::PadDescriptor & padDescriptor,const char * name)906*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializePadLayer(const armnn::IConnectableLayer* layer,
907*89c4ff92SAndroid Build Coastguard Worker                                       const armnn::PadDescriptor& padDescriptor,
908*89c4ff92SAndroid Build Coastguard Worker                                       const char* name)
909*89c4ff92SAndroid Build Coastguard Worker {
910*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
911*89c4ff92SAndroid Build Coastguard Worker 
912*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
913*89c4ff92SAndroid Build Coastguard Worker 
914*89c4ff92SAndroid Build Coastguard Worker     std::vector<unsigned int> padList;
915*89c4ff92SAndroid Build Coastguard Worker     for (auto& p: padDescriptor.m_PadList)
916*89c4ff92SAndroid Build Coastguard Worker     {
917*89c4ff92SAndroid Build Coastguard Worker         padList.push_back(p.first);
918*89c4ff92SAndroid Build Coastguard Worker         padList.push_back(p.second);
919*89c4ff92SAndroid Build Coastguard Worker     }
920*89c4ff92SAndroid Build Coastguard Worker 
921*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
922*89c4ff92SAndroid Build Coastguard Worker                                                              m_flatBufferBuilder.CreateVector(padList),
923*89c4ff92SAndroid Build Coastguard Worker                                                              padDescriptor.m_PadValue,
924*89c4ff92SAndroid Build Coastguard Worker                                                              GetFlatBufferPaddingMode(padDescriptor.m_PaddingMode));
925*89c4ff92SAndroid Build Coastguard Worker 
926*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
927*89c4ff92SAndroid Build Coastguard Worker                                                          flatBufferBaseLayer,
928*89c4ff92SAndroid Build Coastguard Worker                                                          flatBufferPadDesc);
929*89c4ff92SAndroid Build Coastguard Worker 
930*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
931*89c4ff92SAndroid Build Coastguard Worker }
932*89c4ff92SAndroid Build Coastguard Worker 
SerializePermuteLayer(const armnn::IConnectableLayer * layer,const armnn::PermuteDescriptor & permuteDescriptor,const char * name)933*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializePermuteLayer(const armnn::IConnectableLayer* layer,
934*89c4ff92SAndroid Build Coastguard Worker                                           const armnn::PermuteDescriptor& permuteDescriptor,
935*89c4ff92SAndroid Build Coastguard Worker                                           const char* name)
936*89c4ff92SAndroid Build Coastguard Worker {
937*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
938*89c4ff92SAndroid Build Coastguard Worker 
939*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
940*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
941*89c4ff92SAndroid Build Coastguard Worker 
942*89c4ff92SAndroid Build Coastguard Worker     std::vector<unsigned int> dimMappings;
943*89c4ff92SAndroid Build Coastguard Worker     for (unsigned int i=0; i<permuteDescriptor.m_DimMappings.GetSize(); ++i)
944*89c4ff92SAndroid Build Coastguard Worker     {
945*89c4ff92SAndroid Build Coastguard Worker         dimMappings.push_back(permuteDescriptor.m_DimMappings[i]);
946*89c4ff92SAndroid Build Coastguard Worker     }
947*89c4ff92SAndroid Build Coastguard Worker 
948*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
949*89c4ff92SAndroid Build Coastguard Worker                                                                      m_flatBufferBuilder.CreateVector(dimMappings));
950*89c4ff92SAndroid Build Coastguard Worker 
951*89c4ff92SAndroid Build Coastguard Worker     // Create the FlatBuffer PermuteLayer
952*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
953*89c4ff92SAndroid Build Coastguard Worker                                                                  flatBufferPermuteBaseLayer,
954*89c4ff92SAndroid Build Coastguard Worker                                                                  flatBufferPermuteDesc);
955*89c4ff92SAndroid Build Coastguard Worker 
956*89c4ff92SAndroid Build Coastguard Worker     // Add the AnyLayer to the FlatBufferLayers
957*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
958*89c4ff92SAndroid Build Coastguard Worker }
959*89c4ff92SAndroid Build Coastguard Worker 
960*89c4ff92SAndroid Build Coastguard Worker // Build FlatBuffer for Rank Layer
SerializeRankLayer(const armnn::IConnectableLayer * layer,const char * name)961*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeRankLayer(const armnn::IConnectableLayer* layer,
962*89c4ff92SAndroid Build Coastguard Worker                                        const char* name)
963*89c4ff92SAndroid Build Coastguard Worker {
964*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
965*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rank);
966*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferRankLayer = serializer::CreateRankLayer(m_flatBufferBuilder, flatBufferBaseLayer);
967*89c4ff92SAndroid Build Coastguard Worker 
968*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferRankLayer.o, serializer::Layer::Layer_RankLayer);
969*89c4ff92SAndroid Build Coastguard Worker }
970*89c4ff92SAndroid Build Coastguard Worker 
SerializeReduceLayer(const armnn::IConnectableLayer * layer,const armnn::ReduceDescriptor & reduceDescriptor,const char *)971*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeReduceLayer(const armnn::IConnectableLayer* layer,
972*89c4ff92SAndroid Build Coastguard Worker                                              const armnn::ReduceDescriptor& reduceDescriptor,
973*89c4ff92SAndroid Build Coastguard Worker                                              const char*)
974*89c4ff92SAndroid Build Coastguard Worker {
975*89c4ff92SAndroid Build Coastguard Worker     auto fbReduceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reduce);
976*89c4ff92SAndroid Build Coastguard Worker     auto fbDescriptor = CreateReduceDescriptor(m_flatBufferBuilder,
977*89c4ff92SAndroid Build Coastguard Worker                                                reduceDescriptor.m_KeepDims,
978*89c4ff92SAndroid Build Coastguard Worker                                                m_flatBufferBuilder.CreateVector(reduceDescriptor.m_vAxis),
979*89c4ff92SAndroid Build Coastguard Worker                                                GetFlatBufferReduceOperation(reduceDescriptor.m_ReduceOperation));
980*89c4ff92SAndroid Build Coastguard Worker     auto fbReduceLayer = serializer::CreateReduceLayer(m_flatBufferBuilder,
981*89c4ff92SAndroid Build Coastguard Worker                                                        fbReduceBaseLayer,
982*89c4ff92SAndroid Build Coastguard Worker                                                        fbDescriptor);
983*89c4ff92SAndroid Build Coastguard Worker 
984*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbReduceLayer.o, serializer::Layer::Layer_ReduceLayer);
985*89c4ff92SAndroid Build Coastguard Worker }
986*89c4ff92SAndroid Build Coastguard Worker 
987*89c4ff92SAndroid Build Coastguard Worker // Build FlatBuffer for Reshape Layer
SerializeReshapeLayer(const armnn::IConnectableLayer * layer,const armnn::ReshapeDescriptor & reshapeDescriptor,const char * name)988*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeReshapeLayer(const armnn::IConnectableLayer* layer,
989*89c4ff92SAndroid Build Coastguard Worker                                           const armnn::ReshapeDescriptor& reshapeDescriptor,
990*89c4ff92SAndroid Build Coastguard Worker                                           const char* name)
991*89c4ff92SAndroid Build Coastguard Worker {
992*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
993*89c4ff92SAndroid Build Coastguard Worker 
994*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
995*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
996*89c4ff92SAndroid Build Coastguard Worker 
997*89c4ff92SAndroid Build Coastguard Worker     std::vector<unsigned int> targetShape;
998*89c4ff92SAndroid Build Coastguard Worker     for (unsigned int i =0; i < reshapeDescriptor.m_TargetShape.GetNumDimensions(); i++)
999*89c4ff92SAndroid Build Coastguard Worker     {
1000*89c4ff92SAndroid Build Coastguard Worker         targetShape.push_back(reshapeDescriptor.m_TargetShape[i]);
1001*89c4ff92SAndroid Build Coastguard Worker     }
1002*89c4ff92SAndroid Build Coastguard Worker 
1003*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
1004*89c4ff92SAndroid Build Coastguard Worker                                                                      m_flatBufferBuilder.CreateVector(targetShape));
1005*89c4ff92SAndroid Build Coastguard Worker 
1006*89c4ff92SAndroid Build Coastguard Worker     // Create the FlatBuffer ReshapeLayer
1007*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
1008*89c4ff92SAndroid Build Coastguard Worker                                                                  flatBufferReshapeDesc);
1009*89c4ff92SAndroid Build Coastguard Worker 
1010*89c4ff92SAndroid Build Coastguard Worker     // Add the AnyLayer to the FlatBufferLayers
1011*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
1012*89c4ff92SAndroid Build Coastguard Worker }
1013*89c4ff92SAndroid Build Coastguard Worker 
SerializeResizeLayer(const armnn::IConnectableLayer * layer,const armnn::ResizeDescriptor & resizeDescriptor,const char * name)1014*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeResizeLayer(const armnn::IConnectableLayer* layer,
1015*89c4ff92SAndroid Build Coastguard Worker                                          const armnn::ResizeDescriptor& resizeDescriptor,
1016*89c4ff92SAndroid Build Coastguard Worker                                          const char* name)
1017*89c4ff92SAndroid Build Coastguard Worker {
1018*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1019*89c4ff92SAndroid Build Coastguard Worker 
1020*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
1021*89c4ff92SAndroid Build Coastguard Worker 
1022*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferDescriptor =
1023*89c4ff92SAndroid Build Coastguard Worker             CreateResizeDescriptor(m_flatBufferBuilder,
1024*89c4ff92SAndroid Build Coastguard Worker                                    resizeDescriptor.m_TargetHeight,
1025*89c4ff92SAndroid Build Coastguard Worker                                    resizeDescriptor.m_TargetWidth,
1026*89c4ff92SAndroid Build Coastguard Worker                                    GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
1027*89c4ff92SAndroid Build Coastguard Worker                                    GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
1028*89c4ff92SAndroid Build Coastguard Worker                                    resizeDescriptor.m_AlignCorners,
1029*89c4ff92SAndroid Build Coastguard Worker                                    resizeDescriptor.m_HalfPixelCenters);
1030*89c4ff92SAndroid Build Coastguard Worker 
1031*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
1032*89c4ff92SAndroid Build Coastguard Worker                                                          flatBufferBaseLayer,
1033*89c4ff92SAndroid Build Coastguard Worker                                                          flatBufferDescriptor);
1034*89c4ff92SAndroid Build Coastguard Worker 
1035*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
1036*89c4ff92SAndroid Build Coastguard Worker }
1037*89c4ff92SAndroid Build Coastguard Worker 
SerializeSliceLayer(const armnn::IConnectableLayer * layer,const armnn::SliceDescriptor & sliceDescriptor,const char * name)1038*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeSliceLayer(const armnn::IConnectableLayer* layer,
1039*89c4ff92SAndroid Build Coastguard Worker                                         const armnn::SliceDescriptor& sliceDescriptor,
1040*89c4ff92SAndroid Build Coastguard Worker                                         const char* name)
1041*89c4ff92SAndroid Build Coastguard Worker {
1042*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1043*89c4ff92SAndroid Build Coastguard Worker 
1044*89c4ff92SAndroid Build Coastguard Worker     auto fbSliceBaseLayer  = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
1045*89c4ff92SAndroid Build Coastguard Worker     auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
1046*89c4ff92SAndroid Build Coastguard Worker                                                    m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Begin),
1047*89c4ff92SAndroid Build Coastguard Worker                                                    m_flatBufferBuilder.CreateVector(sliceDescriptor.m_Size));
1048*89c4ff92SAndroid Build Coastguard Worker 
1049*89c4ff92SAndroid Build Coastguard Worker     auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
1050*89c4ff92SAndroid Build Coastguard Worker 
1051*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
1052*89c4ff92SAndroid Build Coastguard Worker }
1053*89c4ff92SAndroid Build Coastguard Worker 
1054*89c4ff92SAndroid Build Coastguard Worker // Build FlatBuffer for Softmax Layer
SerializeSoftmaxLayer(const armnn::IConnectableLayer * layer,const armnn::SoftmaxDescriptor & softmaxDescriptor,const char * name)1055*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeSoftmaxLayer(const armnn::IConnectableLayer* layer,
1056*89c4ff92SAndroid Build Coastguard Worker                                           const armnn::SoftmaxDescriptor& softmaxDescriptor,
1057*89c4ff92SAndroid Build Coastguard Worker                                           const char* name)
1058*89c4ff92SAndroid Build Coastguard Worker {
1059*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1060*89c4ff92SAndroid Build Coastguard Worker 
1061*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
1062*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
1063*89c4ff92SAndroid Build Coastguard Worker 
1064*89c4ff92SAndroid Build Coastguard Worker     // Create the FlatBuffer SoftmaxDescriptor
1065*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferSoftmaxDesc =
1066*89c4ff92SAndroid Build Coastguard Worker         serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder,
1067*89c4ff92SAndroid Build Coastguard Worker                                             softmaxDescriptor.m_Beta,
1068*89c4ff92SAndroid Build Coastguard Worker                                             softmaxDescriptor.m_Axis);
1069*89c4ff92SAndroid Build Coastguard Worker 
1070*89c4ff92SAndroid Build Coastguard Worker     // Create the FlatBuffer SoftmaxLayer
1071*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferSoftmaxLayer =
1072*89c4ff92SAndroid Build Coastguard Worker         serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
1073*89c4ff92SAndroid Build Coastguard Worker                                        flatBufferSoftmaxBaseLayer,
1074*89c4ff92SAndroid Build Coastguard Worker                                        flatBufferSoftmaxDesc);
1075*89c4ff92SAndroid Build Coastguard Worker 
1076*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
1077*89c4ff92SAndroid Build Coastguard Worker }
1078*89c4ff92SAndroid Build Coastguard Worker 
SerializePooling2dLayer(const armnn::IConnectableLayer * layer,const armnn::Pooling2dDescriptor & pooling2dDescriptor,const char * name)1079*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializePooling2dLayer(const armnn::IConnectableLayer* layer,
1080*89c4ff92SAndroid Build Coastguard Worker                                             const armnn::Pooling2dDescriptor& pooling2dDescriptor,
1081*89c4ff92SAndroid Build Coastguard Worker                                             const char* name)
1082*89c4ff92SAndroid Build Coastguard Worker {
1083*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1084*89c4ff92SAndroid Build Coastguard Worker 
1085*89c4ff92SAndroid Build Coastguard Worker     auto fbPooling2dBaseLayer  = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
1086*89c4ff92SAndroid Build Coastguard Worker     auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
1087*89c4ff92SAndroid Build Coastguard Worker         m_flatBufferBuilder,
1088*89c4ff92SAndroid Build Coastguard Worker         GetFlatBufferPoolingAlgorithm(pooling2dDescriptor.m_PoolType),
1089*89c4ff92SAndroid Build Coastguard Worker         pooling2dDescriptor.m_PadLeft,
1090*89c4ff92SAndroid Build Coastguard Worker         pooling2dDescriptor.m_PadRight,
1091*89c4ff92SAndroid Build Coastguard Worker         pooling2dDescriptor.m_PadTop,
1092*89c4ff92SAndroid Build Coastguard Worker         pooling2dDescriptor.m_PadBottom,
1093*89c4ff92SAndroid Build Coastguard Worker         pooling2dDescriptor.m_PoolWidth,
1094*89c4ff92SAndroid Build Coastguard Worker         pooling2dDescriptor.m_PoolHeight,
1095*89c4ff92SAndroid Build Coastguard Worker         pooling2dDescriptor.m_StrideX,
1096*89c4ff92SAndroid Build Coastguard Worker         pooling2dDescriptor.m_StrideY,
1097*89c4ff92SAndroid Build Coastguard Worker         GetFlatBufferOutputShapeRounding(pooling2dDescriptor.m_OutputShapeRounding),
1098*89c4ff92SAndroid Build Coastguard Worker         GetFlatBufferPaddingMethod(pooling2dDescriptor.m_PaddingMethod),
1099*89c4ff92SAndroid Build Coastguard Worker         GetFlatBufferDataLayout(pooling2dDescriptor.m_DataLayout));
1100*89c4ff92SAndroid Build Coastguard Worker 
1101*89c4ff92SAndroid Build Coastguard Worker     auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1102*89c4ff92SAndroid Build Coastguard Worker                                                              fbPooling2dBaseLayer,
1103*89c4ff92SAndroid Build Coastguard Worker                                                              fbPooling2dDescriptor);
1104*89c4ff92SAndroid Build Coastguard Worker 
1105*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1106*89c4ff92SAndroid Build Coastguard Worker }
1107*89c4ff92SAndroid Build Coastguard Worker 
SerializePooling3dLayer(const armnn::IConnectableLayer * layer,const armnn::Pooling3dDescriptor & pooling3dDescriptor,const char * name)1108*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializePooling3dLayer(const armnn::IConnectableLayer* layer,
1109*89c4ff92SAndroid Build Coastguard Worker                                             const armnn::Pooling3dDescriptor& pooling3dDescriptor,
1110*89c4ff92SAndroid Build Coastguard Worker                                             const char* name)
1111*89c4ff92SAndroid Build Coastguard Worker {
1112*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1113*89c4ff92SAndroid Build Coastguard Worker 
1114*89c4ff92SAndroid Build Coastguard Worker     auto fbPooling3dBaseLayer  = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling3d);
1115*89c4ff92SAndroid Build Coastguard Worker     auto fbPooling3dDescriptor = serializer::CreatePooling3dDescriptor(
1116*89c4ff92SAndroid Build Coastguard Worker         m_flatBufferBuilder,
1117*89c4ff92SAndroid Build Coastguard Worker         GetFlatBufferPoolingAlgorithm(pooling3dDescriptor.m_PoolType),
1118*89c4ff92SAndroid Build Coastguard Worker         pooling3dDescriptor.m_PadLeft,
1119*89c4ff92SAndroid Build Coastguard Worker         pooling3dDescriptor.m_PadRight,
1120*89c4ff92SAndroid Build Coastguard Worker         pooling3dDescriptor.m_PadTop,
1121*89c4ff92SAndroid Build Coastguard Worker         pooling3dDescriptor.m_PadBottom,
1122*89c4ff92SAndroid Build Coastguard Worker         pooling3dDescriptor.m_PadFront,
1123*89c4ff92SAndroid Build Coastguard Worker         pooling3dDescriptor.m_PadBack,
1124*89c4ff92SAndroid Build Coastguard Worker         pooling3dDescriptor.m_PoolWidth,
1125*89c4ff92SAndroid Build Coastguard Worker         pooling3dDescriptor.m_PoolHeight,
1126*89c4ff92SAndroid Build Coastguard Worker         pooling3dDescriptor.m_PoolDepth,
1127*89c4ff92SAndroid Build Coastguard Worker         pooling3dDescriptor.m_StrideX,
1128*89c4ff92SAndroid Build Coastguard Worker         pooling3dDescriptor.m_StrideY,
1129*89c4ff92SAndroid Build Coastguard Worker         pooling3dDescriptor.m_StrideZ,
1130*89c4ff92SAndroid Build Coastguard Worker         GetFlatBufferOutputShapeRounding(pooling3dDescriptor.m_OutputShapeRounding),
1131*89c4ff92SAndroid Build Coastguard Worker         GetFlatBufferPaddingMethod(pooling3dDescriptor.m_PaddingMethod),
1132*89c4ff92SAndroid Build Coastguard Worker         GetFlatBufferDataLayout(pooling3dDescriptor.m_DataLayout));
1133*89c4ff92SAndroid Build Coastguard Worker 
1134*89c4ff92SAndroid Build Coastguard Worker     auto fbPooling3dLayer = serializer::CreatePooling3dLayer(m_flatBufferBuilder,
1135*89c4ff92SAndroid Build Coastguard Worker                                                              fbPooling3dBaseLayer,
1136*89c4ff92SAndroid Build Coastguard Worker                                                              fbPooling3dDescriptor);
1137*89c4ff92SAndroid Build Coastguard Worker 
1138*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbPooling3dLayer.o, serializer::Layer::Layer_Pooling3dLayer);
1139*89c4ff92SAndroid Build Coastguard Worker }
1140*89c4ff92SAndroid Build Coastguard Worker 
SerializePreluLayer(const armnn::IConnectableLayer * layer,const char * name)1141*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializePreluLayer(const armnn::IConnectableLayer* layer,
1142*89c4ff92SAndroid Build Coastguard Worker                                         const char* name)
1143*89c4ff92SAndroid Build Coastguard Worker {
1144*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1145*89c4ff92SAndroid Build Coastguard Worker 
1146*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
1147*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1148*89c4ff92SAndroid Build Coastguard Worker 
1149*89c4ff92SAndroid Build Coastguard Worker     // Create the FlatBuffer AdditionLayer
1150*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1151*89c4ff92SAndroid Build Coastguard Worker 
1152*89c4ff92SAndroid Build Coastguard Worker     // Add the AnyLayer to the FlatBufferLayers
1153*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
1154*89c4ff92SAndroid Build Coastguard Worker }
1155*89c4ff92SAndroid Build Coastguard Worker 
SerializeQuantizeLayer(const armnn::IConnectableLayer * layer,const char * name)1156*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeQuantizeLayer(const armnn::IConnectableLayer *layer, const char *name)
1157*89c4ff92SAndroid Build Coastguard Worker {
1158*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1159*89c4ff92SAndroid Build Coastguard Worker 
1160*89c4ff92SAndroid Build Coastguard Worker     auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1161*89c4ff92SAndroid Build Coastguard Worker     auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1162*89c4ff92SAndroid Build Coastguard Worker                                                            fbQuantizeBaseLayer);
1163*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1164*89c4ff92SAndroid Build Coastguard Worker }
1165*89c4ff92SAndroid Build Coastguard Worker 
1166*89c4ff92SAndroid Build Coastguard Worker // Build FlatBuffer for FullyConnected Layer
SerializeFullyConnectedLayer(const armnn::IConnectableLayer * layer,const armnn::FullyConnectedDescriptor & fullyConnectedDescriptor,const char *)1167*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeFullyConnectedLayer(const armnn::IConnectableLayer* layer,
1168*89c4ff92SAndroid Build Coastguard Worker                                                       const armnn::FullyConnectedDescriptor& fullyConnectedDescriptor,
1169*89c4ff92SAndroid Build Coastguard Worker                                                       const char*)
1170*89c4ff92SAndroid Build Coastguard Worker {
1171*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
1172*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1173*89c4ff92SAndroid Build Coastguard Worker 
1174*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer FullyConnectedDescriptor
1175*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferDescriptor =
1176*89c4ff92SAndroid Build Coastguard Worker         serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1177*89c4ff92SAndroid Build Coastguard Worker                                                    fullyConnectedDescriptor.m_BiasEnabled,
1178*89c4ff92SAndroid Build Coastguard Worker                                                    fullyConnectedDescriptor.m_TransposeWeightMatrix,
1179*89c4ff92SAndroid Build Coastguard Worker                                                    fullyConnectedDescriptor.m_ConstantWeights);
1180*89c4ff92SAndroid Build Coastguard Worker 
1181*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer FullyConnectedLayer
1182*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1183*89c4ff92SAndroid Build Coastguard Worker                                                                  flatBufferBaseLayer,
1184*89c4ff92SAndroid Build Coastguard Worker                                                                  flatBufferDescriptor);
1185*89c4ff92SAndroid Build Coastguard Worker 
1186*89c4ff92SAndroid Build Coastguard Worker     // Add created FullyConnectedLayer to the FlatBufferLayers
1187*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1188*89c4ff92SAndroid Build Coastguard Worker }
1189*89c4ff92SAndroid Build Coastguard Worker 
1190*89c4ff92SAndroid Build Coastguard Worker // Build FlatBuffer for SpaceToBatchNd Layer
SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer * layer,const armnn::SpaceToBatchNdDescriptor & spaceToBatchNdDescriptor,const char * name)1191*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeSpaceToBatchNdLayer(const armnn::IConnectableLayer* layer,
1192*89c4ff92SAndroid Build Coastguard Worker                                                  const armnn::SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
1193*89c4ff92SAndroid Build Coastguard Worker                                                  const char* name)
1194*89c4ff92SAndroid Build Coastguard Worker {
1195*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1196*89c4ff92SAndroid Build Coastguard Worker 
1197*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
1198*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1199*89c4ff92SAndroid Build Coastguard Worker 
1200*89c4ff92SAndroid Build Coastguard Worker     std::vector<unsigned int> padList;
1201*89c4ff92SAndroid Build Coastguard Worker     padList.reserve(spaceToBatchNdDescriptor.m_PadList.size()*2);
1202*89c4ff92SAndroid Build Coastguard Worker     for (auto& pad : spaceToBatchNdDescriptor.m_PadList)
1203*89c4ff92SAndroid Build Coastguard Worker     {
1204*89c4ff92SAndroid Build Coastguard Worker         padList.push_back(pad.first);
1205*89c4ff92SAndroid Build Coastguard Worker         padList.push_back(pad.second);
1206*89c4ff92SAndroid Build Coastguard Worker     }
1207*89c4ff92SAndroid Build Coastguard Worker 
1208*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferDescriptor =
1209*89c4ff92SAndroid Build Coastguard Worker         CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1210*89c4ff92SAndroid Build Coastguard Worker                                        m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.m_BlockShape),
1211*89c4ff92SAndroid Build Coastguard Worker                                        m_flatBufferBuilder.CreateVector(padList),
1212*89c4ff92SAndroid Build Coastguard Worker                                        GetFlatBufferDataLayout(spaceToBatchNdDescriptor.m_DataLayout));
1213*89c4ff92SAndroid Build Coastguard Worker 
1214*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1215*89c4ff92SAndroid Build Coastguard Worker                                                                  flatBufferBaseLayer,
1216*89c4ff92SAndroid Build Coastguard Worker                                                                  flatBufferDescriptor);
1217*89c4ff92SAndroid Build Coastguard Worker 
1218*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1219*89c4ff92SAndroid Build Coastguard Worker }
1220*89c4ff92SAndroid Build Coastguard Worker 
1221*89c4ff92SAndroid Build Coastguard Worker // Build FlatBuffer for SpaceToDepthLayer
SerializeSpaceToDepthLayer(const armnn::IConnectableLayer * layer,const armnn::SpaceToDepthDescriptor & spaceToDepthDescriptor,const char * name)1222*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeSpaceToDepthLayer(const armnn::IConnectableLayer* layer,
1223*89c4ff92SAndroid Build Coastguard Worker                                                const armnn::SpaceToDepthDescriptor& spaceToDepthDescriptor,
1224*89c4ff92SAndroid Build Coastguard Worker                                                const char* name)
1225*89c4ff92SAndroid Build Coastguard Worker {
1226*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1227*89c4ff92SAndroid Build Coastguard Worker 
1228*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferBaseLayer  = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1229*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferDescriptor =
1230*89c4ff92SAndroid Build Coastguard Worker         CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1231*89c4ff92SAndroid Build Coastguard Worker                                      spaceToDepthDescriptor.m_BlockSize,
1232*89c4ff92SAndroid Build Coastguard Worker                                      GetFlatBufferDataLayout(spaceToDepthDescriptor.m_DataLayout));
1233*89c4ff92SAndroid Build Coastguard Worker 
1234*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1235*89c4ff92SAndroid Build Coastguard Worker                                                                flatBufferBaseLayer,
1236*89c4ff92SAndroid Build Coastguard Worker                                                                flatBufferDescriptor);
1237*89c4ff92SAndroid Build Coastguard Worker 
1238*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
1239*89c4ff92SAndroid Build Coastguard Worker }
1240*89c4ff92SAndroid Build Coastguard Worker 
1241*89c4ff92SAndroid Build Coastguard Worker // Build FlatBuffer for Splitter Layer
SerializeSplitterLayer(const armnn::IConnectableLayer * layer,const armnn::ViewsDescriptor & viewsDescriptor,const char * name)1242*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeSplitterLayer(const armnn::IConnectableLayer* layer,
1243*89c4ff92SAndroid Build Coastguard Worker                                            const armnn::ViewsDescriptor& viewsDescriptor,
1244*89c4ff92SAndroid Build Coastguard Worker                                            const char* name)
1245*89c4ff92SAndroid Build Coastguard Worker {
1246*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1247*89c4ff92SAndroid Build Coastguard Worker 
1248*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer ViewOrigins
1249*89c4ff92SAndroid Build Coastguard Worker     std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1250*89c4ff92SAndroid Build Coastguard Worker     flatBufferViewOrigins.reserve(viewsDescriptor.GetNumViews());
1251*89c4ff92SAndroid Build Coastguard Worker 
1252*89c4ff92SAndroid Build Coastguard Worker     for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1253*89c4ff92SAndroid Build Coastguard Worker     {
1254*89c4ff92SAndroid Build Coastguard Worker         std::vector<uint32_t> viewOrigin;
1255*89c4ff92SAndroid Build Coastguard Worker         viewOrigin.reserve(viewsDescriptor.GetNumDimensions());
1256*89c4ff92SAndroid Build Coastguard Worker 
1257*89c4ff92SAndroid Build Coastguard Worker         // Copy vector
1258*89c4ff92SAndroid Build Coastguard Worker         for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1259*89c4ff92SAndroid Build Coastguard Worker         {
1260*89c4ff92SAndroid Build Coastguard Worker             viewOrigin.push_back(viewsDescriptor.GetViewOrigin(vIdx)[dIdx]);
1261*89c4ff92SAndroid Build Coastguard Worker         }
1262*89c4ff92SAndroid Build Coastguard Worker 
1263*89c4ff92SAndroid Build Coastguard Worker         flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1264*89c4ff92SAndroid Build Coastguard Worker                                                          m_flatBufferBuilder.CreateVector(viewOrigin)));
1265*89c4ff92SAndroid Build Coastguard Worker     }
1266*89c4ff92SAndroid Build Coastguard Worker 
1267*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer OriginsDescriptor
1268*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1269*89c4ff92SAndroid Build Coastguard Worker                                                               viewsDescriptor.GetOrigins().GetConcatAxis(),
1270*89c4ff92SAndroid Build Coastguard Worker                                                               viewsDescriptor.GetOrigins().GetNumViews(),
1271*89c4ff92SAndroid Build Coastguard Worker                                                               viewsDescriptor.GetOrigins().GetNumDimensions(),
1272*89c4ff92SAndroid Build Coastguard Worker                                                               m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1273*89c4ff92SAndroid Build Coastguard Worker 
1274*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer ViewOrigins
1275*89c4ff92SAndroid Build Coastguard Worker     std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1276*89c4ff92SAndroid Build Coastguard Worker     flatBufferViewSizes.reserve(viewsDescriptor.GetNumViews());
1277*89c4ff92SAndroid Build Coastguard Worker 
1278*89c4ff92SAndroid Build Coastguard Worker     for(unsigned int vIdx = 0; vIdx < viewsDescriptor.GetNumViews(); ++vIdx)
1279*89c4ff92SAndroid Build Coastguard Worker     {
1280*89c4ff92SAndroid Build Coastguard Worker         std::vector<uint32_t> viewSize;
1281*89c4ff92SAndroid Build Coastguard Worker         viewSize.reserve(viewsDescriptor.GetNumDimensions());
1282*89c4ff92SAndroid Build Coastguard Worker 
1283*89c4ff92SAndroid Build Coastguard Worker         // Copy vector
1284*89c4ff92SAndroid Build Coastguard Worker         for(unsigned int dIdx = 0; dIdx < viewsDescriptor.GetNumDimensions(); ++dIdx)
1285*89c4ff92SAndroid Build Coastguard Worker         {
1286*89c4ff92SAndroid Build Coastguard Worker             viewSize.push_back(viewsDescriptor.GetViewSizes(vIdx)[dIdx]);
1287*89c4ff92SAndroid Build Coastguard Worker         }
1288*89c4ff92SAndroid Build Coastguard Worker 
1289*89c4ff92SAndroid Build Coastguard Worker         flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1290*89c4ff92SAndroid Build Coastguard Worker                                                        m_flatBufferBuilder.CreateVector(viewSize)));
1291*89c4ff92SAndroid Build Coastguard Worker     }
1292*89c4ff92SAndroid Build Coastguard Worker 
1293*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer ViewsDescriptor
1294*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1295*89c4ff92SAndroid Build Coastguard Worker                                                            flatBufferOriginDescriptor,
1296*89c4ff92SAndroid Build Coastguard Worker                                                            m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1297*89c4ff92SAndroid Build Coastguard Worker 
1298*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
1299*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1300*89c4ff92SAndroid Build Coastguard Worker 
1301*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1302*89c4ff92SAndroid Build Coastguard Worker                                                                    flatBufferBaseLayer,
1303*89c4ff92SAndroid Build Coastguard Worker                                                                    flatBufferViewsDescriptor);
1304*89c4ff92SAndroid Build Coastguard Worker 
1305*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1306*89c4ff92SAndroid Build Coastguard Worker }
1307*89c4ff92SAndroid Build Coastguard Worker 
SerializeNormalizationLayer(const armnn::IConnectableLayer * layer,const armnn::NormalizationDescriptor & descriptor,const char * name)1308*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeNormalizationLayer(const armnn::IConnectableLayer* layer,
1309*89c4ff92SAndroid Build Coastguard Worker                                                 const armnn::NormalizationDescriptor& descriptor,
1310*89c4ff92SAndroid Build Coastguard Worker                                                 const char* name)
1311*89c4ff92SAndroid Build Coastguard Worker {
1312*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1313*89c4ff92SAndroid Build Coastguard Worker 
1314*89c4ff92SAndroid Build Coastguard Worker     auto fbNormalizationBaseLayer  = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1315*89c4ff92SAndroid Build Coastguard Worker 
1316*89c4ff92SAndroid Build Coastguard Worker     auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1317*89c4ff92SAndroid Build Coastguard Worker         m_flatBufferBuilder,
1318*89c4ff92SAndroid Build Coastguard Worker         GetFlatBufferNormalizationAlgorithmChannel(descriptor.m_NormChannelType),
1319*89c4ff92SAndroid Build Coastguard Worker         GetFlatBufferNormalizationAlgorithmMethod(descriptor.m_NormMethodType),
1320*89c4ff92SAndroid Build Coastguard Worker         descriptor.m_NormSize,
1321*89c4ff92SAndroid Build Coastguard Worker         descriptor.m_Alpha,
1322*89c4ff92SAndroid Build Coastguard Worker         descriptor.m_Beta,
1323*89c4ff92SAndroid Build Coastguard Worker         descriptor.m_K,
1324*89c4ff92SAndroid Build Coastguard Worker         GetFlatBufferDataLayout(descriptor.m_DataLayout));
1325*89c4ff92SAndroid Build Coastguard Worker 
1326*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1327*89c4ff92SAndroid Build Coastguard Worker                                                                 fbNormalizationBaseLayer,
1328*89c4ff92SAndroid Build Coastguard Worker                                                                 fbNormalizationDescriptor);
1329*89c4ff92SAndroid Build Coastguard Worker 
1330*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1331*89c4ff92SAndroid Build Coastguard Worker }
1332*89c4ff92SAndroid Build Coastguard Worker 
SerializeShapeLayer(const armnn::IConnectableLayer * layer,const char * name)1333*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeShapeLayer(const armnn::IConnectableLayer* layer,
1334*89c4ff92SAndroid Build Coastguard Worker                                              const char* name)
1335*89c4ff92SAndroid Build Coastguard Worker {
1336*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1337*89c4ff92SAndroid Build Coastguard Worker 
1338*89c4ff92SAndroid Build Coastguard Worker     auto shapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Shape);
1339*89c4ff92SAndroid Build Coastguard Worker     auto shapeLayer = serializer::CreateShapeLayer(m_flatBufferBuilder, shapeBaseLayer);
1340*89c4ff92SAndroid Build Coastguard Worker 
1341*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(shapeLayer.o, serializer::Layer::Layer_ShapeLayer);
1342*89c4ff92SAndroid Build Coastguard Worker }
1343*89c4ff92SAndroid Build Coastguard Worker 
SerializeStackLayer(const armnn::IConnectableLayer * layer,const armnn::StackDescriptor & stackDescriptor,const char * name)1344*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeStackLayer(const armnn::IConnectableLayer* layer,
1345*89c4ff92SAndroid Build Coastguard Worker                                         const armnn::StackDescriptor& stackDescriptor,
1346*89c4ff92SAndroid Build Coastguard Worker                                         const char* name)
1347*89c4ff92SAndroid Build Coastguard Worker {
1348*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1349*89c4ff92SAndroid Build Coastguard Worker 
1350*89c4ff92SAndroid Build Coastguard Worker     auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1351*89c4ff92SAndroid Build Coastguard Worker 
1352*89c4ff92SAndroid Build Coastguard Worker     std::vector<unsigned int> inputShape;
1353*89c4ff92SAndroid Build Coastguard Worker     for (unsigned int i =0; i < stackDescriptor.m_InputShape.GetNumDimensions(); i++)
1354*89c4ff92SAndroid Build Coastguard Worker     {
1355*89c4ff92SAndroid Build Coastguard Worker         inputShape.push_back(stackDescriptor.m_InputShape[i]);
1356*89c4ff92SAndroid Build Coastguard Worker     }
1357*89c4ff92SAndroid Build Coastguard Worker 
1358*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1359*89c4ff92SAndroid Build Coastguard Worker                                                            stackDescriptor.m_Axis,
1360*89c4ff92SAndroid Build Coastguard Worker                                                            stackDescriptor.m_NumInputs,
1361*89c4ff92SAndroid Build Coastguard Worker                                                            m_flatBufferBuilder.CreateVector(inputShape));
1362*89c4ff92SAndroid Build Coastguard Worker 
1363*89c4ff92SAndroid Build Coastguard Worker     auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1364*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
1365*89c4ff92SAndroid Build Coastguard Worker }
1366*89c4ff92SAndroid Build Coastguard Worker 
SerializeStandInLayer(const armnn::IConnectableLayer * layer,const armnn::StandInDescriptor & standInDescriptor,const char * name)1367*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeStandInLayer(const armnn::IConnectableLayer *layer,
1368*89c4ff92SAndroid Build Coastguard Worker                                           const armnn::StandInDescriptor& standInDescriptor,
1369*89c4ff92SAndroid Build Coastguard Worker                                           const char *name)
1370*89c4ff92SAndroid Build Coastguard Worker {
1371*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1372*89c4ff92SAndroid Build Coastguard Worker 
1373*89c4ff92SAndroid Build Coastguard Worker     auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1374*89c4ff92SAndroid Build Coastguard Worker                                                             standInDescriptor.m_NumInputs,
1375*89c4ff92SAndroid Build Coastguard Worker                                                             standInDescriptor.m_NumOutputs);
1376*89c4ff92SAndroid Build Coastguard Worker 
1377*89c4ff92SAndroid Build Coastguard Worker     auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1378*89c4ff92SAndroid Build Coastguard Worker     auto fbLayer     = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1379*89c4ff92SAndroid Build Coastguard Worker 
1380*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
1381*89c4ff92SAndroid Build Coastguard Worker }
1382*89c4ff92SAndroid Build Coastguard Worker 
SerializeStridedSliceLayer(const armnn::IConnectableLayer * layer,const armnn::StridedSliceDescriptor & stridedSliceDescriptor,const char * name)1383*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeStridedSliceLayer(const armnn::IConnectableLayer* layer,
1384*89c4ff92SAndroid Build Coastguard Worker                                                const armnn::StridedSliceDescriptor& stridedSliceDescriptor,
1385*89c4ff92SAndroid Build Coastguard Worker                                                const char* name)
1386*89c4ff92SAndroid Build Coastguard Worker {
1387*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1388*89c4ff92SAndroid Build Coastguard Worker 
1389*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1390*89c4ff92SAndroid Build Coastguard Worker 
1391*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferDescriptor =
1392*89c4ff92SAndroid Build Coastguard Worker         CreateStridedSliceDescriptor(m_flatBufferBuilder,
1393*89c4ff92SAndroid Build Coastguard Worker                                      m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Begin),
1394*89c4ff92SAndroid Build Coastguard Worker                                      m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_End),
1395*89c4ff92SAndroid Build Coastguard Worker                                      m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.m_Stride),
1396*89c4ff92SAndroid Build Coastguard Worker                                      stridedSliceDescriptor.m_BeginMask,
1397*89c4ff92SAndroid Build Coastguard Worker                                      stridedSliceDescriptor.m_EndMask,
1398*89c4ff92SAndroid Build Coastguard Worker                                      stridedSliceDescriptor.m_ShrinkAxisMask,
1399*89c4ff92SAndroid Build Coastguard Worker                                      stridedSliceDescriptor.m_EllipsisMask,
1400*89c4ff92SAndroid Build Coastguard Worker                                      stridedSliceDescriptor.m_NewAxisMask,
1401*89c4ff92SAndroid Build Coastguard Worker                                      GetFlatBufferDataLayout(stridedSliceDescriptor.m_DataLayout));
1402*89c4ff92SAndroid Build Coastguard Worker 
1403*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1404*89c4ff92SAndroid Build Coastguard Worker                                                                flatBufferBaseLayer,
1405*89c4ff92SAndroid Build Coastguard Worker                                                                flatBufferDescriptor);
1406*89c4ff92SAndroid Build Coastguard Worker 
1407*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1408*89c4ff92SAndroid Build Coastguard Worker }
1409*89c4ff92SAndroid Build Coastguard Worker 
SerializeSubtractionLayer(const armnn::IConnectableLayer * layer,const char * name)1410*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeSubtractionLayer(const armnn::IConnectableLayer* layer, const char* name)
1411*89c4ff92SAndroid Build Coastguard Worker {
1412*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1413*89c4ff92SAndroid Build Coastguard Worker 
1414*89c4ff92SAndroid Build Coastguard Worker     auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1415*89c4ff92SAndroid Build Coastguard Worker     auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1416*89c4ff92SAndroid Build Coastguard Worker 
1417*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1418*89c4ff92SAndroid Build Coastguard Worker }
1419*89c4ff92SAndroid Build Coastguard Worker 
SerializeSwitchLayer(const armnn::IConnectableLayer * layer,const char * name)1420*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeSwitchLayer(const armnn::IConnectableLayer* layer, const char* name)
1421*89c4ff92SAndroid Build Coastguard Worker {
1422*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1423*89c4ff92SAndroid Build Coastguard Worker 
1424*89c4ff92SAndroid Build Coastguard Worker     auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1425*89c4ff92SAndroid Build Coastguard Worker     auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1426*89c4ff92SAndroid Build Coastguard Worker 
1427*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1428*89c4ff92SAndroid Build Coastguard Worker }
1429*89c4ff92SAndroid Build Coastguard Worker 
SerializeTransposeConvolution2dLayer(const armnn::IConnectableLayer * layer,const armnn::TransposeConvolution2dDescriptor & descriptor,const std::vector<armnn::ConstTensor> & constants,const char * name)1430*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeTransposeConvolution2dLayer(
1431*89c4ff92SAndroid Build Coastguard Worker     const armnn::IConnectableLayer* layer,
1432*89c4ff92SAndroid Build Coastguard Worker     const armnn::TransposeConvolution2dDescriptor& descriptor,
1433*89c4ff92SAndroid Build Coastguard Worker     const std::vector<armnn::ConstTensor>& constants,
1434*89c4ff92SAndroid Build Coastguard Worker     const char* name)
1435*89c4ff92SAndroid Build Coastguard Worker {
1436*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1437*89c4ff92SAndroid Build Coastguard Worker 
1438*89c4ff92SAndroid Build Coastguard Worker     const armnn::ConstTensor& weights = constants.at(0);
1439*89c4ff92SAndroid Build Coastguard Worker 
1440*89c4ff92SAndroid Build Coastguard Worker     auto fbBaseLayer  = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1441*89c4ff92SAndroid Build Coastguard Worker     auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1442*89c4ff92SAndroid Build Coastguard Worker                                                                descriptor.m_PadLeft,
1443*89c4ff92SAndroid Build Coastguard Worker                                                                descriptor.m_PadRight,
1444*89c4ff92SAndroid Build Coastguard Worker                                                                descriptor.m_PadTop,
1445*89c4ff92SAndroid Build Coastguard Worker                                                                descriptor.m_PadBottom,
1446*89c4ff92SAndroid Build Coastguard Worker                                                                descriptor.m_StrideX,
1447*89c4ff92SAndroid Build Coastguard Worker                                                                descriptor.m_StrideY,
1448*89c4ff92SAndroid Build Coastguard Worker                                                                descriptor.m_BiasEnabled,
1449*89c4ff92SAndroid Build Coastguard Worker                                                                GetFlatBufferDataLayout(descriptor.m_DataLayout));
1450*89c4ff92SAndroid Build Coastguard Worker 
1451*89c4ff92SAndroid Build Coastguard Worker     // weights & biases
1452*89c4ff92SAndroid Build Coastguard Worker     auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1453*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1454*89c4ff92SAndroid Build Coastguard Worker     if (constants.size() > 1)
1455*89c4ff92SAndroid Build Coastguard Worker     {
1456*89c4ff92SAndroid Build Coastguard Worker         const armnn::ConstTensor& biases = constants.at(1);
1457*89c4ff92SAndroid Build Coastguard Worker         fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
1458*89c4ff92SAndroid Build Coastguard Worker     }
1459*89c4ff92SAndroid Build Coastguard Worker 
1460*89c4ff92SAndroid Build Coastguard Worker     auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1461*89c4ff92SAndroid Build Coastguard Worker                                                      fbBaseLayer,
1462*89c4ff92SAndroid Build Coastguard Worker                                                      fbDescriptor,
1463*89c4ff92SAndroid Build Coastguard Worker                                                      fbWeightsConstTensorInfo,
1464*89c4ff92SAndroid Build Coastguard Worker                                                      fbBiasesConstTensorInfo);
1465*89c4ff92SAndroid Build Coastguard Worker 
1466*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
1467*89c4ff92SAndroid Build Coastguard Worker }
1468*89c4ff92SAndroid Build Coastguard Worker 
SerializeTransposeLayer(const armnn::IConnectableLayer * layer,const armnn::TransposeDescriptor & descriptor,const char * name)1469*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeTransposeLayer(const armnn::IConnectableLayer* layer,
1470*89c4ff92SAndroid Build Coastguard Worker                                             const armnn::TransposeDescriptor& descriptor,
1471*89c4ff92SAndroid Build Coastguard Worker                                             const char* name)
1472*89c4ff92SAndroid Build Coastguard Worker {
1473*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1474*89c4ff92SAndroid Build Coastguard Worker 
1475*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer BaseLayer
1476*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1477*89c4ff92SAndroid Build Coastguard Worker 
1478*89c4ff92SAndroid Build Coastguard Worker     std::vector<unsigned int> dimMappings;
1479*89c4ff92SAndroid Build Coastguard Worker     for (unsigned int i=0; i<descriptor.m_DimMappings.GetSize(); ++i)
1480*89c4ff92SAndroid Build Coastguard Worker     {
1481*89c4ff92SAndroid Build Coastguard Worker         dimMappings.push_back(descriptor.m_DimMappings[i]);
1482*89c4ff92SAndroid Build Coastguard Worker     }
1483*89c4ff92SAndroid Build Coastguard Worker 
1484*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1485*89c4ff92SAndroid Build Coastguard Worker                                                                 m_flatBufferBuilder.CreateVector(dimMappings));
1486*89c4ff92SAndroid Build Coastguard Worker 
1487*89c4ff92SAndroid Build Coastguard Worker     // Create the FlatBuffer TransposeLayer
1488*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1489*89c4ff92SAndroid Build Coastguard Worker                                                             flatBufferBaseLayer,
1490*89c4ff92SAndroid Build Coastguard Worker                                                             flatBufferDesc);
1491*89c4ff92SAndroid Build Coastguard Worker 
1492*89c4ff92SAndroid Build Coastguard Worker     // Add the AnyLayer to the FlatBufferLayers
1493*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1494*89c4ff92SAndroid Build Coastguard Worker }
1495*89c4ff92SAndroid Build Coastguard Worker 
SerializeQLstmLayer(const armnn::IConnectableLayer * layer,const armnn::QLstmDescriptor & descriptor,const std::vector<armnn::ConstTensor> & constants,const char * name)1496*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeQLstmLayer(const armnn::IConnectableLayer* layer,
1497*89c4ff92SAndroid Build Coastguard Worker                                              const armnn::QLstmDescriptor& descriptor,
1498*89c4ff92SAndroid Build Coastguard Worker                                              const std::vector<armnn::ConstTensor>& constants,
1499*89c4ff92SAndroid Build Coastguard Worker                                              const char* name)
1500*89c4ff92SAndroid Build Coastguard Worker {
1501*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1502*89c4ff92SAndroid Build Coastguard Worker 
1503*89c4ff92SAndroid Build Coastguard Worker     auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1504*89c4ff92SAndroid Build Coastguard Worker 
1505*89c4ff92SAndroid Build Coastguard Worker     auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1506*89c4ff92SAndroid Build Coastguard Worker             m_flatBufferBuilder,
1507*89c4ff92SAndroid Build Coastguard Worker             descriptor.m_CifgEnabled,
1508*89c4ff92SAndroid Build Coastguard Worker             descriptor.m_PeepholeEnabled,
1509*89c4ff92SAndroid Build Coastguard Worker             descriptor.m_ProjectionEnabled,
1510*89c4ff92SAndroid Build Coastguard Worker             descriptor.m_LayerNormEnabled,
1511*89c4ff92SAndroid Build Coastguard Worker             descriptor.m_CellClip,
1512*89c4ff92SAndroid Build Coastguard Worker             descriptor.m_ProjectionClip,
1513*89c4ff92SAndroid Build Coastguard Worker             descriptor.m_InputIntermediateScale,
1514*89c4ff92SAndroid Build Coastguard Worker             descriptor.m_ForgetIntermediateScale,
1515*89c4ff92SAndroid Build Coastguard Worker             descriptor.m_CellIntermediateScale,
1516*89c4ff92SAndroid Build Coastguard Worker             descriptor.m_OutputIntermediateScale,
1517*89c4ff92SAndroid Build Coastguard Worker             descriptor.m_HiddenStateZeroPoint,
1518*89c4ff92SAndroid Build Coastguard Worker             descriptor.m_HiddenStateScale
1519*89c4ff92SAndroid Build Coastguard Worker             );
1520*89c4ff92SAndroid Build Coastguard Worker 
1521*89c4ff92SAndroid Build Coastguard Worker     // Index for constants vector
1522*89c4ff92SAndroid Build Coastguard Worker     std::size_t i = 0;
1523*89c4ff92SAndroid Build Coastguard Worker 
1524*89c4ff92SAndroid Build Coastguard Worker     // Mandatory params
1525*89c4ff92SAndroid Build Coastguard Worker     auto inputToForgetWeights     = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1526*89c4ff92SAndroid Build Coastguard Worker     auto inputToCellWeights       = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1527*89c4ff92SAndroid Build Coastguard Worker     auto inputToOutputWeights     = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1528*89c4ff92SAndroid Build Coastguard Worker     auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1529*89c4ff92SAndroid Build Coastguard Worker     auto recurrentToCellWeights   = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1530*89c4ff92SAndroid Build Coastguard Worker     auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1531*89c4ff92SAndroid Build Coastguard Worker     auto forgetGateBias           = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1532*89c4ff92SAndroid Build Coastguard Worker     auto cellBias                 = CreateConstTensorInfo(constants[i++]); //CellBias
1533*89c4ff92SAndroid Build Coastguard Worker     auto outputGateBias           = CreateConstTensorInfo(constants[i++]); //OutputGateBias
1534*89c4ff92SAndroid Build Coastguard Worker 
1535*89c4ff92SAndroid Build Coastguard Worker     // CIFG
1536*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1537*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1538*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1539*89c4ff92SAndroid Build Coastguard Worker 
1540*89c4ff92SAndroid Build Coastguard Worker     if (!descriptor.m_CifgEnabled)
1541*89c4ff92SAndroid Build Coastguard Worker     {
1542*89c4ff92SAndroid Build Coastguard Worker         inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1543*89c4ff92SAndroid Build Coastguard Worker         recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1544*89c4ff92SAndroid Build Coastguard Worker         inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
1545*89c4ff92SAndroid Build Coastguard Worker     }
1546*89c4ff92SAndroid Build Coastguard Worker 
1547*89c4ff92SAndroid Build Coastguard Worker     // Peephole
1548*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1549*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1550*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1551*89c4ff92SAndroid Build Coastguard Worker 
1552*89c4ff92SAndroid Build Coastguard Worker     if (descriptor.m_PeepholeEnabled)
1553*89c4ff92SAndroid Build Coastguard Worker     {
1554*89c4ff92SAndroid Build Coastguard Worker         if (!descriptor.m_CifgEnabled)
1555*89c4ff92SAndroid Build Coastguard Worker         {
1556*89c4ff92SAndroid Build Coastguard Worker             cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
1557*89c4ff92SAndroid Build Coastguard Worker         }
1558*89c4ff92SAndroid Build Coastguard Worker         cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1559*89c4ff92SAndroid Build Coastguard Worker         cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1560*89c4ff92SAndroid Build Coastguard Worker     }
1561*89c4ff92SAndroid Build Coastguard Worker 
1562*89c4ff92SAndroid Build Coastguard Worker     // Projection
1563*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1564*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1565*89c4ff92SAndroid Build Coastguard Worker 
1566*89c4ff92SAndroid Build Coastguard Worker     if (descriptor.m_ProjectionEnabled)
1567*89c4ff92SAndroid Build Coastguard Worker     {
1568*89c4ff92SAndroid Build Coastguard Worker         projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1569*89c4ff92SAndroid Build Coastguard Worker         projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
1570*89c4ff92SAndroid Build Coastguard Worker     }
1571*89c4ff92SAndroid Build Coastguard Worker 
1572*89c4ff92SAndroid Build Coastguard Worker     // Layer norm
1573*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1574*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1575*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1576*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1577*89c4ff92SAndroid Build Coastguard Worker 
1578*89c4ff92SAndroid Build Coastguard Worker     if (descriptor.m_LayerNormEnabled)
1579*89c4ff92SAndroid Build Coastguard Worker     {
1580*89c4ff92SAndroid Build Coastguard Worker         if (!descriptor.m_CifgEnabled)
1581*89c4ff92SAndroid Build Coastguard Worker         {
1582*89c4ff92SAndroid Build Coastguard Worker             inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
1583*89c4ff92SAndroid Build Coastguard Worker         }
1584*89c4ff92SAndroid Build Coastguard Worker         forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1585*89c4ff92SAndroid Build Coastguard Worker         cellLayerNormWeights   = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1586*89c4ff92SAndroid Build Coastguard Worker         outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
1587*89c4ff92SAndroid Build Coastguard Worker     }
1588*89c4ff92SAndroid Build Coastguard Worker 
1589*89c4ff92SAndroid Build Coastguard Worker     auto fbQLstmParams = serializer::CreateQLstmInputParams(
1590*89c4ff92SAndroid Build Coastguard Worker             m_flatBufferBuilder,
1591*89c4ff92SAndroid Build Coastguard Worker             inputToForgetWeights,
1592*89c4ff92SAndroid Build Coastguard Worker             inputToCellWeights,
1593*89c4ff92SAndroid Build Coastguard Worker             inputToOutputWeights,
1594*89c4ff92SAndroid Build Coastguard Worker             recurrentToForgetWeights,
1595*89c4ff92SAndroid Build Coastguard Worker             recurrentToCellWeights,
1596*89c4ff92SAndroid Build Coastguard Worker             recurrentToOutputWeights,
1597*89c4ff92SAndroid Build Coastguard Worker             forgetGateBias,
1598*89c4ff92SAndroid Build Coastguard Worker             cellBias,
1599*89c4ff92SAndroid Build Coastguard Worker             outputGateBias,
1600*89c4ff92SAndroid Build Coastguard Worker             inputToInputWeights,
1601*89c4ff92SAndroid Build Coastguard Worker             recurrentToInputWeights,
1602*89c4ff92SAndroid Build Coastguard Worker             inputGateBias,
1603*89c4ff92SAndroid Build Coastguard Worker             projectionWeights,
1604*89c4ff92SAndroid Build Coastguard Worker             projectionBias,
1605*89c4ff92SAndroid Build Coastguard Worker             cellToInputWeights,
1606*89c4ff92SAndroid Build Coastguard Worker             cellToForgetWeights,
1607*89c4ff92SAndroid Build Coastguard Worker             cellToOutputWeights,
1608*89c4ff92SAndroid Build Coastguard Worker             inputLayerNormWeights,
1609*89c4ff92SAndroid Build Coastguard Worker             forgetLayerNormWeights,
1610*89c4ff92SAndroid Build Coastguard Worker             cellLayerNormWeights,
1611*89c4ff92SAndroid Build Coastguard Worker             outputLayerNormWeights);
1612*89c4ff92SAndroid Build Coastguard Worker 
1613*89c4ff92SAndroid Build Coastguard Worker     auto fbQLstmLayer = serializer::CreateQLstmLayer(
1614*89c4ff92SAndroid Build Coastguard Worker             m_flatBufferBuilder,
1615*89c4ff92SAndroid Build Coastguard Worker             fbQLstmBaseLayer,
1616*89c4ff92SAndroid Build Coastguard Worker             fbQLstmDescriptor,
1617*89c4ff92SAndroid Build Coastguard Worker             fbQLstmParams);
1618*89c4ff92SAndroid Build Coastguard Worker 
1619*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
1620*89c4ff92SAndroid Build Coastguard Worker }
1621*89c4ff92SAndroid Build Coastguard Worker 
SerializeQuantizedLstmLayer(const armnn::IConnectableLayer * layer,const std::vector<armnn::ConstTensor> & constants,const char * name)1622*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeQuantizedLstmLayer(const armnn::IConnectableLayer* layer,
1623*89c4ff92SAndroid Build Coastguard Worker                                                      const std::vector<armnn::ConstTensor>& constants,
1624*89c4ff92SAndroid Build Coastguard Worker                                                      const char* name)
1625*89c4ff92SAndroid Build Coastguard Worker {
1626*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1627*89c4ff92SAndroid Build Coastguard Worker 
1628*89c4ff92SAndroid Build Coastguard Worker     auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1629*89c4ff92SAndroid Build Coastguard Worker 
1630*89c4ff92SAndroid Build Coastguard Worker     // index for constants vector
1631*89c4ff92SAndroid Build Coastguard Worker     size_t i = 0;
1632*89c4ff92SAndroid Build Coastguard Worker 
1633*89c4ff92SAndroid Build Coastguard Worker     // Get input parameters
1634*89c4ff92SAndroid Build Coastguard Worker     auto inputToInputWeights  = CreateConstTensorInfo(constants[i++]);
1635*89c4ff92SAndroid Build Coastguard Worker     auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1636*89c4ff92SAndroid Build Coastguard Worker     auto inputToCellWeights   = CreateConstTensorInfo(constants[i++]);
1637*89c4ff92SAndroid Build Coastguard Worker     auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
1638*89c4ff92SAndroid Build Coastguard Worker 
1639*89c4ff92SAndroid Build Coastguard Worker     auto recurrentToInputWeights  = CreateConstTensorInfo(constants[i++]);
1640*89c4ff92SAndroid Build Coastguard Worker     auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1641*89c4ff92SAndroid Build Coastguard Worker     auto recurrentToCellWeights   = CreateConstTensorInfo(constants[i++]);
1642*89c4ff92SAndroid Build Coastguard Worker     auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
1643*89c4ff92SAndroid Build Coastguard Worker 
1644*89c4ff92SAndroid Build Coastguard Worker     auto inputGateBias  = CreateConstTensorInfo(constants[i++]);
1645*89c4ff92SAndroid Build Coastguard Worker     auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1646*89c4ff92SAndroid Build Coastguard Worker     auto cellBias       = CreateConstTensorInfo(constants[i++]);
1647*89c4ff92SAndroid Build Coastguard Worker     auto outputGateBias = CreateConstTensorInfo(constants[i++]);
1648*89c4ff92SAndroid Build Coastguard Worker 
1649*89c4ff92SAndroid Build Coastguard Worker     auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1650*89c4ff92SAndroid Build Coastguard Worker         m_flatBufferBuilder,
1651*89c4ff92SAndroid Build Coastguard Worker         inputToInputWeights,
1652*89c4ff92SAndroid Build Coastguard Worker         inputToForgetWeights,
1653*89c4ff92SAndroid Build Coastguard Worker         inputToCellWeights,
1654*89c4ff92SAndroid Build Coastguard Worker         inputToOutputWeights,
1655*89c4ff92SAndroid Build Coastguard Worker         recurrentToInputWeights,
1656*89c4ff92SAndroid Build Coastguard Worker         recurrentToForgetWeights,
1657*89c4ff92SAndroid Build Coastguard Worker         recurrentToCellWeights,
1658*89c4ff92SAndroid Build Coastguard Worker         recurrentToOutputWeights,
1659*89c4ff92SAndroid Build Coastguard Worker         inputGateBias,
1660*89c4ff92SAndroid Build Coastguard Worker         forgetGateBias,
1661*89c4ff92SAndroid Build Coastguard Worker         cellBias,
1662*89c4ff92SAndroid Build Coastguard Worker         outputGateBias);
1663*89c4ff92SAndroid Build Coastguard Worker 
1664*89c4ff92SAndroid Build Coastguard Worker     auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1665*89c4ff92SAndroid Build Coastguard Worker         m_flatBufferBuilder,
1666*89c4ff92SAndroid Build Coastguard Worker         fbQuantizedLstmBaseLayer,
1667*89c4ff92SAndroid Build Coastguard Worker         fbQuantizedLstmParams);
1668*89c4ff92SAndroid Build Coastguard Worker 
1669*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
1670*89c4ff92SAndroid Build Coastguard Worker }
1671*89c4ff92SAndroid Build Coastguard Worker 
SerializeUnidirectionalSequenceLstmLayer(const armnn::IConnectableLayer * layer,const armnn::UnidirectionalSequenceLstmDescriptor & descriptor,const std::vector<armnn::ConstTensor> & constants,const char * name)1672*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::SerializeUnidirectionalSequenceLstmLayer(
1673*89c4ff92SAndroid Build Coastguard Worker     const armnn::IConnectableLayer* layer,
1674*89c4ff92SAndroid Build Coastguard Worker     const armnn::UnidirectionalSequenceLstmDescriptor& descriptor,
1675*89c4ff92SAndroid Build Coastguard Worker     const std::vector<armnn::ConstTensor>& constants,
1676*89c4ff92SAndroid Build Coastguard Worker     const char* name)
1677*89c4ff92SAndroid Build Coastguard Worker {
1678*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(name);
1679*89c4ff92SAndroid Build Coastguard Worker 
1680*89c4ff92SAndroid Build Coastguard Worker     auto fbUnidirectionalSequenceLstmBaseLayer =
1681*89c4ff92SAndroid Build Coastguard Worker         CreateLayerBase(layer, serializer::LayerType::LayerType_UnidirectionalSequenceLstm);
1682*89c4ff92SAndroid Build Coastguard Worker 
1683*89c4ff92SAndroid Build Coastguard Worker     auto fbUnidirectionalSequenceLstmDescriptor = serializer::CreateUnidirectionalSequenceLstmDescriptor(
1684*89c4ff92SAndroid Build Coastguard Worker         m_flatBufferBuilder,
1685*89c4ff92SAndroid Build Coastguard Worker         descriptor.m_ActivationFunc,
1686*89c4ff92SAndroid Build Coastguard Worker         descriptor.m_ClippingThresCell,
1687*89c4ff92SAndroid Build Coastguard Worker         descriptor.m_ClippingThresProj,
1688*89c4ff92SAndroid Build Coastguard Worker         descriptor.m_CifgEnabled,
1689*89c4ff92SAndroid Build Coastguard Worker         descriptor.m_PeepholeEnabled,
1690*89c4ff92SAndroid Build Coastguard Worker         descriptor.m_ProjectionEnabled,
1691*89c4ff92SAndroid Build Coastguard Worker         descriptor.m_LayerNormEnabled,
1692*89c4ff92SAndroid Build Coastguard Worker         descriptor.m_TimeMajor);
1693*89c4ff92SAndroid Build Coastguard Worker 
1694*89c4ff92SAndroid Build Coastguard Worker     // Index for constants vector
1695*89c4ff92SAndroid Build Coastguard Worker     std::size_t i = 0;
1696*89c4ff92SAndroid Build Coastguard Worker 
1697*89c4ff92SAndroid Build Coastguard Worker     // Get mandatory/basic input parameters
1698*89c4ff92SAndroid Build Coastguard Worker     auto inputToForgetWeights     = CreateConstTensorInfo(constants[i++]); //InputToForgetWeights
1699*89c4ff92SAndroid Build Coastguard Worker     auto inputToCellWeights       = CreateConstTensorInfo(constants[i++]); //InputToCellWeights
1700*89c4ff92SAndroid Build Coastguard Worker     auto inputToOutputWeights     = CreateConstTensorInfo(constants[i++]); //InputToOutputWeights
1701*89c4ff92SAndroid Build Coastguard Worker     auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToForgetWeights
1702*89c4ff92SAndroid Build Coastguard Worker     auto recurrentToCellWeights   = CreateConstTensorInfo(constants[i++]); //RecurrentToCellWeights
1703*89c4ff92SAndroid Build Coastguard Worker     auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToOutputWeights
1704*89c4ff92SAndroid Build Coastguard Worker     auto forgetGateBias           = CreateConstTensorInfo(constants[i++]); //ForgetGateBias
1705*89c4ff92SAndroid Build Coastguard Worker     auto cellBias                 = CreateConstTensorInfo(constants[i++]); //CellBias
1706*89c4ff92SAndroid Build Coastguard Worker     auto outputGateBias           = CreateConstTensorInfo(constants[i++]); //OutputGateBias
1707*89c4ff92SAndroid Build Coastguard Worker 
1708*89c4ff92SAndroid Build Coastguard Worker     //Define optional parameters, these will be set depending on configuration in Lstm descriptor
1709*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1710*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1711*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1712*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1713*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1714*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1715*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1716*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1717*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1718*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1719*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1720*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1721*89c4ff92SAndroid Build Coastguard Worker 
1722*89c4ff92SAndroid Build Coastguard Worker     if (!descriptor.m_CifgEnabled)
1723*89c4ff92SAndroid Build Coastguard Worker     {
1724*89c4ff92SAndroid Build Coastguard Worker         inputToInputWeights = CreateConstTensorInfo(constants[i++]); //InputToInputWeights
1725*89c4ff92SAndroid Build Coastguard Worker         recurrentToInputWeights = CreateConstTensorInfo(constants[i++]); //RecurrentToInputWeights
1726*89c4ff92SAndroid Build Coastguard Worker         inputGateBias = CreateConstTensorInfo(constants[i++]); //InputGateBias
1727*89c4ff92SAndroid Build Coastguard Worker     }
1728*89c4ff92SAndroid Build Coastguard Worker 
1729*89c4ff92SAndroid Build Coastguard Worker     if (descriptor.m_PeepholeEnabled)
1730*89c4ff92SAndroid Build Coastguard Worker     {
1731*89c4ff92SAndroid Build Coastguard Worker         if (!descriptor.m_CifgEnabled)
1732*89c4ff92SAndroid Build Coastguard Worker         {
1733*89c4ff92SAndroid Build Coastguard Worker             cellToInputWeights = CreateConstTensorInfo(constants[i++]); //CellToInputWeights
1734*89c4ff92SAndroid Build Coastguard Worker         }
1735*89c4ff92SAndroid Build Coastguard Worker         cellToForgetWeights = CreateConstTensorInfo(constants[i++]); //CellToForgetWeights
1736*89c4ff92SAndroid Build Coastguard Worker         cellToOutputWeights = CreateConstTensorInfo(constants[i++]); //CellToOutputWeights
1737*89c4ff92SAndroid Build Coastguard Worker     }
1738*89c4ff92SAndroid Build Coastguard Worker 
1739*89c4ff92SAndroid Build Coastguard Worker     if (descriptor.m_ProjectionEnabled)
1740*89c4ff92SAndroid Build Coastguard Worker     {
1741*89c4ff92SAndroid Build Coastguard Worker         projectionWeights = CreateConstTensorInfo(constants[i++]); //ProjectionWeights
1742*89c4ff92SAndroid Build Coastguard Worker         projectionBias = CreateConstTensorInfo(constants[i++]); //ProjectionBias
1743*89c4ff92SAndroid Build Coastguard Worker     }
1744*89c4ff92SAndroid Build Coastguard Worker 
1745*89c4ff92SAndroid Build Coastguard Worker     if (descriptor.m_LayerNormEnabled)
1746*89c4ff92SAndroid Build Coastguard Worker     {
1747*89c4ff92SAndroid Build Coastguard Worker         if (!descriptor.m_CifgEnabled)
1748*89c4ff92SAndroid Build Coastguard Worker         {
1749*89c4ff92SAndroid Build Coastguard Worker             inputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //InputLayerNormWeights
1750*89c4ff92SAndroid Build Coastguard Worker         }
1751*89c4ff92SAndroid Build Coastguard Worker         forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]); //ForgetLayerNormWeights
1752*89c4ff92SAndroid Build Coastguard Worker         cellLayerNormWeights   = CreateConstTensorInfo(constants[i++]); //CellLayerNormWeights
1753*89c4ff92SAndroid Build Coastguard Worker         outputLayerNormWeights = CreateConstTensorInfo(constants[i++]); //OutputLayerNormWeights
1754*89c4ff92SAndroid Build Coastguard Worker     }
1755*89c4ff92SAndroid Build Coastguard Worker 
1756*89c4ff92SAndroid Build Coastguard Worker     auto fbUnidirectionalSequenceLstmParams = serializer::CreateLstmInputParams(
1757*89c4ff92SAndroid Build Coastguard Worker         m_flatBufferBuilder,
1758*89c4ff92SAndroid Build Coastguard Worker         inputToForgetWeights,
1759*89c4ff92SAndroid Build Coastguard Worker         inputToCellWeights,
1760*89c4ff92SAndroid Build Coastguard Worker         inputToOutputWeights,
1761*89c4ff92SAndroid Build Coastguard Worker         recurrentToForgetWeights,
1762*89c4ff92SAndroid Build Coastguard Worker         recurrentToCellWeights,
1763*89c4ff92SAndroid Build Coastguard Worker         recurrentToOutputWeights,
1764*89c4ff92SAndroid Build Coastguard Worker         forgetGateBias,
1765*89c4ff92SAndroid Build Coastguard Worker         cellBias,
1766*89c4ff92SAndroid Build Coastguard Worker         outputGateBias,
1767*89c4ff92SAndroid Build Coastguard Worker         inputToInputWeights,
1768*89c4ff92SAndroid Build Coastguard Worker         recurrentToInputWeights,
1769*89c4ff92SAndroid Build Coastguard Worker         cellToInputWeights,
1770*89c4ff92SAndroid Build Coastguard Worker         inputGateBias,
1771*89c4ff92SAndroid Build Coastguard Worker         projectionWeights,
1772*89c4ff92SAndroid Build Coastguard Worker         projectionBias,
1773*89c4ff92SAndroid Build Coastguard Worker         cellToForgetWeights,
1774*89c4ff92SAndroid Build Coastguard Worker         cellToOutputWeights,
1775*89c4ff92SAndroid Build Coastguard Worker         inputLayerNormWeights,
1776*89c4ff92SAndroid Build Coastguard Worker         forgetLayerNormWeights,
1777*89c4ff92SAndroid Build Coastguard Worker         cellLayerNormWeights,
1778*89c4ff92SAndroid Build Coastguard Worker         outputLayerNormWeights);
1779*89c4ff92SAndroid Build Coastguard Worker 
1780*89c4ff92SAndroid Build Coastguard Worker     auto fbUnidirectionalSequenceLstmLayer = serializer::CreateUnidirectionalSequenceLstmLayer(
1781*89c4ff92SAndroid Build Coastguard Worker         m_flatBufferBuilder,
1782*89c4ff92SAndroid Build Coastguard Worker         fbUnidirectionalSequenceLstmBaseLayer,
1783*89c4ff92SAndroid Build Coastguard Worker         fbUnidirectionalSequenceLstmDescriptor,
1784*89c4ff92SAndroid Build Coastguard Worker         fbUnidirectionalSequenceLstmParams);
1785*89c4ff92SAndroid Build Coastguard Worker 
1786*89c4ff92SAndroid Build Coastguard Worker     CreateAnyLayer(fbUnidirectionalSequenceLstmLayer.o, serializer::Layer::Layer_UnidirectionalSequenceLstmLayer);
1787*89c4ff92SAndroid Build Coastguard Worker }
1788*89c4ff92SAndroid Build Coastguard Worker 
CreateLayerBase(const IConnectableLayer * layer,const serializer::LayerType layerType)1789*89c4ff92SAndroid Build Coastguard Worker fb::Offset<serializer::LayerBase> SerializerStrategy::CreateLayerBase(const IConnectableLayer* layer,
1790*89c4ff92SAndroid Build Coastguard Worker                                                                      const serializer::LayerType layerType)
1791*89c4ff92SAndroid Build Coastguard Worker {
1792*89c4ff92SAndroid Build Coastguard Worker 
1793*89c4ff92SAndroid Build Coastguard Worker     uint32_t fbIndex = GetSerializedId(layer->GetGuid());
1794*89c4ff92SAndroid Build Coastguard Worker 
1795*89c4ff92SAndroid Build Coastguard Worker     std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1796*89c4ff92SAndroid Build Coastguard Worker     std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1797*89c4ff92SAndroid Build Coastguard Worker 
1798*89c4ff92SAndroid Build Coastguard Worker     return serializer::CreateLayerBase(m_flatBufferBuilder,
1799*89c4ff92SAndroid Build Coastguard Worker                                        fbIndex,
1800*89c4ff92SAndroid Build Coastguard Worker                                        m_flatBufferBuilder.CreateString(layer->GetName()),
1801*89c4ff92SAndroid Build Coastguard Worker                                        layerType,
1802*89c4ff92SAndroid Build Coastguard Worker                                        m_flatBufferBuilder.CreateVector(inputSlots),
1803*89c4ff92SAndroid Build Coastguard Worker                                        m_flatBufferBuilder.CreateVector(outputSlots));
1804*89c4ff92SAndroid Build Coastguard Worker }
1805*89c4ff92SAndroid Build Coastguard Worker 
CreateAnyLayer(const flatbuffers::Offset<void> & layer,const serializer::Layer serializerLayer)1806*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::CreateAnyLayer(const flatbuffers::Offset<void>& layer, const serializer::Layer serializerLayer)
1807*89c4ff92SAndroid Build Coastguard Worker {
1808*89c4ff92SAndroid Build Coastguard Worker 
1809*89c4ff92SAndroid Build Coastguard Worker     auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
1810*89c4ff92SAndroid Build Coastguard Worker     m_serializedLayers.push_back(anyLayer);
1811*89c4ff92SAndroid Build Coastguard Worker }
1812*89c4ff92SAndroid Build Coastguard Worker 
1813*89c4ff92SAndroid Build Coastguard Worker template <typename T>
CreateDataVector(const void * memory,unsigned int size)1814*89c4ff92SAndroid Build Coastguard Worker flatbuffers::Offset<flatbuffers::Vector<T>> SerializerStrategy::CreateDataVector(const void* memory, unsigned int size)
1815*89c4ff92SAndroid Build Coastguard Worker {
1816*89c4ff92SAndroid Build Coastguard Worker     const T* buffer = reinterpret_cast<const T*>(memory);
1817*89c4ff92SAndroid Build Coastguard Worker     std::vector<T> vector(buffer, buffer + (size / sizeof(T)));
1818*89c4ff92SAndroid Build Coastguard Worker     auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1819*89c4ff92SAndroid Build Coastguard Worker     return fbVector;
1820*89c4ff92SAndroid Build Coastguard Worker }
1821*89c4ff92SAndroid Build Coastguard Worker 
CreateTensorInfo(const armnn::TensorInfo & tensorInfo)1822*89c4ff92SAndroid Build Coastguard Worker flatbuffers::Offset<TensorInfo>  SerializerStrategy::CreateTensorInfo(const armnn::TensorInfo& tensorInfo)
1823*89c4ff92SAndroid Build Coastguard Worker {
1824*89c4ff92SAndroid Build Coastguard Worker     // Get the dimensions
1825*89c4ff92SAndroid Build Coastguard Worker     std::vector<unsigned int> shape;
1826*89c4ff92SAndroid Build Coastguard Worker     std::vector<bool> specificity;
1827*89c4ff92SAndroid Build Coastguard Worker     // This assumes that the TensorShape constructors have ensured that the size of m_DimensionsSpecificity
1828*89c4ff92SAndroid Build Coastguard Worker     // matches the size of dimensions.
1829*89c4ff92SAndroid Build Coastguard Worker     for(unsigned int dim = 0; dim < tensorInfo.GetShape().GetNumDimensions(); ++dim)
1830*89c4ff92SAndroid Build Coastguard Worker     {
1831*89c4ff92SAndroid Build Coastguard Worker         specificity.push_back(tensorInfo.GetShape().GetDimensionSpecificity(dim));
1832*89c4ff92SAndroid Build Coastguard Worker 
1833*89c4ff92SAndroid Build Coastguard Worker         if (tensorInfo.GetShape().GetDimensionSpecificity(dim))
1834*89c4ff92SAndroid Build Coastguard Worker         {
1835*89c4ff92SAndroid Build Coastguard Worker             shape.push_back(tensorInfo.GetShape()[dim]);
1836*89c4ff92SAndroid Build Coastguard Worker         }
1837*89c4ff92SAndroid Build Coastguard Worker         else
1838*89c4ff92SAndroid Build Coastguard Worker         {
1839*89c4ff92SAndroid Build Coastguard Worker             shape.push_back(0);
1840*89c4ff92SAndroid Build Coastguard Worker         }
1841*89c4ff92SAndroid Build Coastguard Worker     }
1842*89c4ff92SAndroid Build Coastguard Worker 
1843*89c4ff92SAndroid Build Coastguard Worker     if (tensorInfo.HasPerAxisQuantization())
1844*89c4ff92SAndroid Build Coastguard Worker     {
1845*89c4ff92SAndroid Build Coastguard Worker         // Create FlatBuffer TensorInfo
1846*89c4ff92SAndroid Build Coastguard Worker         auto flatBufferTensorInfo =
1847*89c4ff92SAndroid Build Coastguard Worker             serializer::CreateTensorInfo(m_flatBufferBuilder,
1848*89c4ff92SAndroid Build Coastguard Worker                                          m_flatBufferBuilder.CreateVector(shape),
1849*89c4ff92SAndroid Build Coastguard Worker                                          GetFlatBufferDataType(tensorInfo.GetDataType()),
1850*89c4ff92SAndroid Build Coastguard Worker                                          tensorInfo.GetQuantizationScales()[0],
1851*89c4ff92SAndroid Build Coastguard Worker                                          tensorInfo.GetQuantizationOffset(),
1852*89c4ff92SAndroid Build Coastguard Worker                                          m_flatBufferBuilder.CreateVector(tensorInfo.GetQuantizationScales()),
1853*89c4ff92SAndroid Build Coastguard Worker                                          tensorInfo.GetQuantizationDim().value(),
1854*89c4ff92SAndroid Build Coastguard Worker                                          static_cast<unsigned int>
1855*89c4ff92SAndroid Build Coastguard Worker                                          (tensorInfo.GetShape().GetDimensionality()),
1856*89c4ff92SAndroid Build Coastguard Worker                                          m_flatBufferBuilder.CreateVector(specificity));
1857*89c4ff92SAndroid Build Coastguard Worker         return flatBufferTensorInfo;
1858*89c4ff92SAndroid Build Coastguard Worker     }
1859*89c4ff92SAndroid Build Coastguard Worker 
1860*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer TensorInfo
1861*89c4ff92SAndroid Build Coastguard Worker     auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1862*89c4ff92SAndroid Build Coastguard Worker                                                              m_flatBufferBuilder.CreateVector(shape),
1863*89c4ff92SAndroid Build Coastguard Worker                                                              GetFlatBufferDataType(tensorInfo.GetDataType()),
1864*89c4ff92SAndroid Build Coastguard Worker                                                              tensorInfo.GetQuantizationScale(),
1865*89c4ff92SAndroid Build Coastguard Worker                                                              tensorInfo.GetQuantizationOffset(),
1866*89c4ff92SAndroid Build Coastguard Worker                                                              0,
1867*89c4ff92SAndroid Build Coastguard Worker                                                              0,
1868*89c4ff92SAndroid Build Coastguard Worker                                                              static_cast<unsigned int>
1869*89c4ff92SAndroid Build Coastguard Worker                                                              (tensorInfo.GetShape().GetDimensionality()),
1870*89c4ff92SAndroid Build Coastguard Worker                                                              m_flatBufferBuilder.CreateVector(specificity));
1871*89c4ff92SAndroid Build Coastguard Worker     return flatBufferTensorInfo;
1872*89c4ff92SAndroid Build Coastguard Worker }
1873*89c4ff92SAndroid Build Coastguard Worker 
1874*89c4ff92SAndroid Build Coastguard Worker flatbuffers::Offset<serializer::ConstTensor>
CreateConstTensorInfo(const armnn::ConstTensor & constTensor)1875*89c4ff92SAndroid Build Coastguard Worker     SerializerStrategy::CreateConstTensorInfo(const armnn::ConstTensor& constTensor)
1876*89c4ff92SAndroid Build Coastguard Worker {
1877*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo tensorInfo = constTensor.GetInfo();
1878*89c4ff92SAndroid Build Coastguard Worker 
1879*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<void> fbPayload;
1880*89c4ff92SAndroid Build Coastguard Worker 
1881*89c4ff92SAndroid Build Coastguard Worker     switch (tensorInfo.GetDataType())
1882*89c4ff92SAndroid Build Coastguard Worker     {
1883*89c4ff92SAndroid Build Coastguard Worker         case armnn::DataType::Signed64:
1884*89c4ff92SAndroid Build Coastguard Worker         {
1885*89c4ff92SAndroid Build Coastguard Worker             auto fbVector = CreateDataVector<int64_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1886*89c4ff92SAndroid Build Coastguard Worker             flatbuffers::Offset<serializer::LongData> flatBuffersData = serializer::CreateLongData(
1887*89c4ff92SAndroid Build Coastguard Worker                     m_flatBufferBuilder,
1888*89c4ff92SAndroid Build Coastguard Worker                     fbVector);
1889*89c4ff92SAndroid Build Coastguard Worker             fbPayload = flatBuffersData.o;
1890*89c4ff92SAndroid Build Coastguard Worker             break;
1891*89c4ff92SAndroid Build Coastguard Worker         }
1892*89c4ff92SAndroid Build Coastguard Worker         case armnn::DataType::Float32:
1893*89c4ff92SAndroid Build Coastguard Worker         case armnn::DataType::Signed32:
1894*89c4ff92SAndroid Build Coastguard Worker         {
1895*89c4ff92SAndroid Build Coastguard Worker             auto fbVector = CreateDataVector<int32_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1896*89c4ff92SAndroid Build Coastguard Worker             flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1897*89c4ff92SAndroid Build Coastguard Worker                     m_flatBufferBuilder,
1898*89c4ff92SAndroid Build Coastguard Worker                     fbVector);
1899*89c4ff92SAndroid Build Coastguard Worker             fbPayload = flatBuffersData.o;
1900*89c4ff92SAndroid Build Coastguard Worker             break;
1901*89c4ff92SAndroid Build Coastguard Worker         }
1902*89c4ff92SAndroid Build Coastguard Worker         case armnn::DataType::Float16:
1903*89c4ff92SAndroid Build Coastguard Worker         case armnn::DataType::BFloat16:
1904*89c4ff92SAndroid Build Coastguard Worker         case armnn::DataType::QSymmS16:
1905*89c4ff92SAndroid Build Coastguard Worker         {
1906*89c4ff92SAndroid Build Coastguard Worker             auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1907*89c4ff92SAndroid Build Coastguard Worker             flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1908*89c4ff92SAndroid Build Coastguard Worker                     m_flatBufferBuilder,
1909*89c4ff92SAndroid Build Coastguard Worker                     fbVector);
1910*89c4ff92SAndroid Build Coastguard Worker             fbPayload = flatBuffersData.o;
1911*89c4ff92SAndroid Build Coastguard Worker             break;
1912*89c4ff92SAndroid Build Coastguard Worker         }
1913*89c4ff92SAndroid Build Coastguard Worker         case armnn::DataType::QSymmS8:
1914*89c4ff92SAndroid Build Coastguard Worker         case armnn::DataType::QAsymmS8:
1915*89c4ff92SAndroid Build Coastguard Worker         case armnn::DataType::QAsymmU8:
1916*89c4ff92SAndroid Build Coastguard Worker         case armnn::DataType::Boolean:
1917*89c4ff92SAndroid Build Coastguard Worker         default:
1918*89c4ff92SAndroid Build Coastguard Worker         {
1919*89c4ff92SAndroid Build Coastguard Worker             auto fbVector = CreateDataVector<int8_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
1920*89c4ff92SAndroid Build Coastguard Worker             flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1921*89c4ff92SAndroid Build Coastguard Worker                     m_flatBufferBuilder,
1922*89c4ff92SAndroid Build Coastguard Worker                     fbVector);
1923*89c4ff92SAndroid Build Coastguard Worker             fbPayload = flatBuffersData.o;
1924*89c4ff92SAndroid Build Coastguard Worker         }
1925*89c4ff92SAndroid Build Coastguard Worker     }
1926*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1927*89c4ff92SAndroid Build Coastguard Worker             m_flatBufferBuilder,
1928*89c4ff92SAndroid Build Coastguard Worker             CreateTensorInfo(tensorInfo),
1929*89c4ff92SAndroid Build Coastguard Worker             GetFlatBufferConstTensorData(tensorInfo.GetDataType()),
1930*89c4ff92SAndroid Build Coastguard Worker             fbPayload);
1931*89c4ff92SAndroid Build Coastguard Worker     return flatBufferConstTensor;
1932*89c4ff92SAndroid Build Coastguard Worker }
1933*89c4ff92SAndroid Build Coastguard Worker 
GetVersionTable()1934*89c4ff92SAndroid Build Coastguard Worker flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
1935*89c4ff92SAndroid Build Coastguard Worker {
1936*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1937*89c4ff92SAndroid Build Coastguard Worker         serializer::CreateFeatureCompatibilityVersions(
1938*89c4ff92SAndroid Build Coastguard Worker                 m_flatBufferBuilder,
1939*89c4ff92SAndroid Build Coastguard Worker                 1, // Binding ids scheme version
1940*89c4ff92SAndroid Build Coastguard Worker                 1, // Weights layout scheme version
1941*89c4ff92SAndroid Build Coastguard Worker                 1  // Constant tensors as inputs version
1942*89c4ff92SAndroid Build Coastguard Worker             );
1943*89c4ff92SAndroid Build Coastguard Worker     return versionsTable;
1944*89c4ff92SAndroid Build Coastguard Worker }
1945*89c4ff92SAndroid Build Coastguard Worker 
1946*89c4ff92SAndroid Build Coastguard Worker std::vector<fb::Offset<serializer::InputSlot>>
CreateInputSlots(const armnn::IConnectableLayer * layer)1947*89c4ff92SAndroid Build Coastguard Worker     SerializerStrategy::CreateInputSlots(const armnn::IConnectableLayer* layer)
1948*89c4ff92SAndroid Build Coastguard Worker {
1949*89c4ff92SAndroid Build Coastguard Worker     std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
1950*89c4ff92SAndroid Build Coastguard Worker 
1951*89c4ff92SAndroid Build Coastguard Worker     // Get the InputSlots
1952*89c4ff92SAndroid Build Coastguard Worker     for (unsigned int slotIndex = 0; slotIndex<layer->GetNumInputSlots(); ++slotIndex)
1953*89c4ff92SAndroid Build Coastguard Worker     {
1954*89c4ff92SAndroid Build Coastguard Worker         const IInputSlot& inputSlot = layer->GetInputSlot(slotIndex);
1955*89c4ff92SAndroid Build Coastguard Worker 
1956*89c4ff92SAndroid Build Coastguard Worker         // Get the Connection for the InputSlot
1957*89c4ff92SAndroid Build Coastguard Worker         const IOutputSlot* connection = inputSlot.GetConnection();
1958*89c4ff92SAndroid Build Coastguard Worker 
1959*89c4ff92SAndroid Build Coastguard Worker         // Create FlatBuffer Connection
1960*89c4ff92SAndroid Build Coastguard Worker         serializer::Connection conn(GetSerializedId(inputSlot.GetConnection()->GetOwningLayerGuid()),
1961*89c4ff92SAndroid Build Coastguard Worker                                     connection->CalculateIndexOnOwner());
1962*89c4ff92SAndroid Build Coastguard Worker         // Create FlatBuffer InputSlot
1963*89c4ff92SAndroid Build Coastguard Worker         inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1964*89c4ff92SAndroid Build Coastguard Worker     }
1965*89c4ff92SAndroid Build Coastguard Worker     return inputSlots;
1966*89c4ff92SAndroid Build Coastguard Worker }
1967*89c4ff92SAndroid Build Coastguard Worker 
1968*89c4ff92SAndroid Build Coastguard Worker std::vector<fb::Offset<serializer::OutputSlot>>
CreateOutputSlots(const armnn::IConnectableLayer * layer)1969*89c4ff92SAndroid Build Coastguard Worker     SerializerStrategy::CreateOutputSlots(const armnn::IConnectableLayer* layer)
1970*89c4ff92SAndroid Build Coastguard Worker {
1971*89c4ff92SAndroid Build Coastguard Worker     std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1972*89c4ff92SAndroid Build Coastguard Worker 
1973*89c4ff92SAndroid Build Coastguard Worker     // Get the OutputSlots
1974*89c4ff92SAndroid Build Coastguard Worker     for (unsigned int slotIndex = 0; slotIndex < layer->GetNumOutputSlots(); ++slotIndex)
1975*89c4ff92SAndroid Build Coastguard Worker     {
1976*89c4ff92SAndroid Build Coastguard Worker         const IOutputSlot& outputSlot = layer->GetOutputSlot(slotIndex);
1977*89c4ff92SAndroid Build Coastguard Worker         const armnn::TensorInfo& tensorInfo = outputSlot.GetTensorInfo();
1978*89c4ff92SAndroid Build Coastguard Worker 
1979*89c4ff92SAndroid Build Coastguard Worker         // Create FlatBuffer Outputslot
1980*89c4ff92SAndroid Build Coastguard Worker         outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1981*89c4ff92SAndroid Build Coastguard Worker                                                            slotIndex,
1982*89c4ff92SAndroid Build Coastguard Worker                                                            CreateTensorInfo(tensorInfo)));
1983*89c4ff92SAndroid Build Coastguard Worker     }
1984*89c4ff92SAndroid Build Coastguard Worker     return outputSlots;
1985*89c4ff92SAndroid Build Coastguard Worker }
1986*89c4ff92SAndroid Build Coastguard Worker 
ExecuteStrategy(const armnn::IConnectableLayer * layer,const BaseDescriptor & descriptor,const std::vector<armnn::ConstTensor> & constants,const char * name,const armnn::LayerBindingId id)1987*89c4ff92SAndroid Build Coastguard Worker void SerializerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer,
1988*89c4ff92SAndroid Build Coastguard Worker                                          const BaseDescriptor& descriptor,
1989*89c4ff92SAndroid Build Coastguard Worker                                          const std::vector<armnn::ConstTensor>& constants,
1990*89c4ff92SAndroid Build Coastguard Worker                                          const char* name,
1991*89c4ff92SAndroid Build Coastguard Worker                                          const armnn::LayerBindingId id)
1992*89c4ff92SAndroid Build Coastguard Worker {
1993*89c4ff92SAndroid Build Coastguard Worker     IgnoreUnused(constants);
1994*89c4ff92SAndroid Build Coastguard Worker 
1995*89c4ff92SAndroid Build Coastguard Worker     switch (layer->GetType())
1996*89c4ff92SAndroid Build Coastguard Worker     {
1997*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Activation :
1998*89c4ff92SAndroid Build Coastguard Worker         {
1999*89c4ff92SAndroid Build Coastguard Worker             const armnn::ActivationDescriptor& layerDescriptor =
2000*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::ActivationDescriptor&>(descriptor);
2001*89c4ff92SAndroid Build Coastguard Worker             SerializeActivationLayer(layer, layerDescriptor, name);
2002*89c4ff92SAndroid Build Coastguard Worker             break;
2003*89c4ff92SAndroid Build Coastguard Worker         }
2004*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Addition :
2005*89c4ff92SAndroid Build Coastguard Worker         {
2006*89c4ff92SAndroid Build Coastguard Worker             SerializeAdditionLayer(layer, name);
2007*89c4ff92SAndroid Build Coastguard Worker             break;
2008*89c4ff92SAndroid Build Coastguard Worker         }
2009*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::ArgMinMax :
2010*89c4ff92SAndroid Build Coastguard Worker         {
2011*89c4ff92SAndroid Build Coastguard Worker             const armnn::ArgMinMaxDescriptor& layerDescriptor =
2012*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::ArgMinMaxDescriptor&>(descriptor);
2013*89c4ff92SAndroid Build Coastguard Worker             SerializeArgMinMaxLayer(layer, layerDescriptor, name);
2014*89c4ff92SAndroid Build Coastguard Worker             break;
2015*89c4ff92SAndroid Build Coastguard Worker         }
2016*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::BatchMatMul:
2017*89c4ff92SAndroid Build Coastguard Worker         {
2018*89c4ff92SAndroid Build Coastguard Worker             const armnn::BatchMatMulDescriptor& layerDescriptor =
2019*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::BatchMatMulDescriptor&>(descriptor);
2020*89c4ff92SAndroid Build Coastguard Worker             SerializeBatchMatMulLayer(layer,
2021*89c4ff92SAndroid Build Coastguard Worker                                       layerDescriptor,
2022*89c4ff92SAndroid Build Coastguard Worker                                       name);
2023*89c4ff92SAndroid Build Coastguard Worker             break;
2024*89c4ff92SAndroid Build Coastguard Worker         }
2025*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::BatchNormalization :
2026*89c4ff92SAndroid Build Coastguard Worker         {
2027*89c4ff92SAndroid Build Coastguard Worker             const armnn::BatchNormalizationDescriptor& layerDescriptor =
2028*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor);
2029*89c4ff92SAndroid Build Coastguard Worker             SerializeBatchNormalizationLayer(layer,
2030*89c4ff92SAndroid Build Coastguard Worker                                              layerDescriptor,
2031*89c4ff92SAndroid Build Coastguard Worker                                              constants,
2032*89c4ff92SAndroid Build Coastguard Worker                                              name);
2033*89c4ff92SAndroid Build Coastguard Worker             break;
2034*89c4ff92SAndroid Build Coastguard Worker         }
2035*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::BatchToSpaceNd :
2036*89c4ff92SAndroid Build Coastguard Worker         {
2037*89c4ff92SAndroid Build Coastguard Worker             const armnn::BatchToSpaceNdDescriptor& layerDescriptor =
2038*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::BatchToSpaceNdDescriptor&>(descriptor);
2039*89c4ff92SAndroid Build Coastguard Worker             SerializeBatchToSpaceNdLayer(layer,
2040*89c4ff92SAndroid Build Coastguard Worker                                          layerDescriptor,
2041*89c4ff92SAndroid Build Coastguard Worker                                          name);
2042*89c4ff92SAndroid Build Coastguard Worker             break;
2043*89c4ff92SAndroid Build Coastguard Worker         }
2044*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Cast :
2045*89c4ff92SAndroid Build Coastguard Worker         {
2046*89c4ff92SAndroid Build Coastguard Worker             SerializeCastLayer(layer, name);
2047*89c4ff92SAndroid Build Coastguard Worker             break;
2048*89c4ff92SAndroid Build Coastguard Worker         }
2049*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::ChannelShuffle :
2050*89c4ff92SAndroid Build Coastguard Worker         {
2051*89c4ff92SAndroid Build Coastguard Worker             const armnn::ChannelShuffleDescriptor& layerDescriptor =
2052*89c4ff92SAndroid Build Coastguard Worker                                                      static_cast<const armnn::ChannelShuffleDescriptor&>(descriptor);
2053*89c4ff92SAndroid Build Coastguard Worker             SerializeChannelShuffleLayer(layer,
2054*89c4ff92SAndroid Build Coastguard Worker                                          layerDescriptor,
2055*89c4ff92SAndroid Build Coastguard Worker                                          name);
2056*89c4ff92SAndroid Build Coastguard Worker             break;
2057*89c4ff92SAndroid Build Coastguard Worker         }
2058*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Comparison :
2059*89c4ff92SAndroid Build Coastguard Worker         {
2060*89c4ff92SAndroid Build Coastguard Worker             const armnn::ComparisonDescriptor& layerDescriptor =
2061*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::ComparisonDescriptor&>(descriptor);
2062*89c4ff92SAndroid Build Coastguard Worker             SerializeComparisonLayer(layer,
2063*89c4ff92SAndroid Build Coastguard Worker                                      layerDescriptor,
2064*89c4ff92SAndroid Build Coastguard Worker                                      name);
2065*89c4ff92SAndroid Build Coastguard Worker             break;
2066*89c4ff92SAndroid Build Coastguard Worker         }
2067*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Concat :
2068*89c4ff92SAndroid Build Coastguard Worker         {
2069*89c4ff92SAndroid Build Coastguard Worker             const armnn::ConcatDescriptor& layerDescriptor =
2070*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::ConcatDescriptor&>(descriptor);
2071*89c4ff92SAndroid Build Coastguard Worker             SerializeConcatLayer(layer,
2072*89c4ff92SAndroid Build Coastguard Worker                                  layerDescriptor,
2073*89c4ff92SAndroid Build Coastguard Worker                                  name);
2074*89c4ff92SAndroid Build Coastguard Worker             break;
2075*89c4ff92SAndroid Build Coastguard Worker         }
2076*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Constant :
2077*89c4ff92SAndroid Build Coastguard Worker         {
2078*89c4ff92SAndroid Build Coastguard Worker             SerializeConstantLayer(layer,
2079*89c4ff92SAndroid Build Coastguard Worker                                    constants,
2080*89c4ff92SAndroid Build Coastguard Worker                                    name);
2081*89c4ff92SAndroid Build Coastguard Worker             break;
2082*89c4ff92SAndroid Build Coastguard Worker         }
2083*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Convolution2d :
2084*89c4ff92SAndroid Build Coastguard Worker         {
2085*89c4ff92SAndroid Build Coastguard Worker             const armnn::Convolution2dDescriptor& layerDescriptor =
2086*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::Convolution2dDescriptor&>(descriptor);
2087*89c4ff92SAndroid Build Coastguard Worker             SerializeConvolution2dLayer(layer,
2088*89c4ff92SAndroid Build Coastguard Worker                                         layerDescriptor,
2089*89c4ff92SAndroid Build Coastguard Worker                                         name);
2090*89c4ff92SAndroid Build Coastguard Worker             break;
2091*89c4ff92SAndroid Build Coastguard Worker         }
2092*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Convolution3d :
2093*89c4ff92SAndroid Build Coastguard Worker         {
2094*89c4ff92SAndroid Build Coastguard Worker             const armnn::Convolution3dDescriptor& layerDescriptor =
2095*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::Convolution3dDescriptor&>(descriptor);
2096*89c4ff92SAndroid Build Coastguard Worker             SerializeConvolution3dLayer(layer,
2097*89c4ff92SAndroid Build Coastguard Worker                                         layerDescriptor,
2098*89c4ff92SAndroid Build Coastguard Worker                                         name);
2099*89c4ff92SAndroid Build Coastguard Worker             break;
2100*89c4ff92SAndroid Build Coastguard Worker         }
2101*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::DepthToSpace :
2102*89c4ff92SAndroid Build Coastguard Worker         {
2103*89c4ff92SAndroid Build Coastguard Worker             const armnn::DepthToSpaceDescriptor& layerDescriptor =
2104*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::DepthToSpaceDescriptor&>(descriptor);
2105*89c4ff92SAndroid Build Coastguard Worker             SerializeDepthToSpaceLayer(layer,
2106*89c4ff92SAndroid Build Coastguard Worker                                        layerDescriptor,
2107*89c4ff92SAndroid Build Coastguard Worker                                        name);
2108*89c4ff92SAndroid Build Coastguard Worker             break;
2109*89c4ff92SAndroid Build Coastguard Worker         }
2110*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::DepthwiseConvolution2d :
2111*89c4ff92SAndroid Build Coastguard Worker         {
2112*89c4ff92SAndroid Build Coastguard Worker             const armnn::DepthwiseConvolution2dDescriptor& layerDescriptor =
2113*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor);
2114*89c4ff92SAndroid Build Coastguard Worker             SerializeDepthwiseConvolution2dLayer(layer,
2115*89c4ff92SAndroid Build Coastguard Worker                                                  layerDescriptor,
2116*89c4ff92SAndroid Build Coastguard Worker                                                  name);
2117*89c4ff92SAndroid Build Coastguard Worker             break;
2118*89c4ff92SAndroid Build Coastguard Worker         }
2119*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Dequantize :
2120*89c4ff92SAndroid Build Coastguard Worker         {
2121*89c4ff92SAndroid Build Coastguard Worker             SerializeDequantizeLayer(layer,
2122*89c4ff92SAndroid Build Coastguard Worker                                      name);
2123*89c4ff92SAndroid Build Coastguard Worker             break;
2124*89c4ff92SAndroid Build Coastguard Worker         }
2125*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::DetectionPostProcess :
2126*89c4ff92SAndroid Build Coastguard Worker         {
2127*89c4ff92SAndroid Build Coastguard Worker             const armnn::DetectionPostProcessDescriptor& layerDescriptor =
2128*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::DetectionPostProcessDescriptor&>(descriptor);
2129*89c4ff92SAndroid Build Coastguard Worker             SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
2130*89c4ff92SAndroid Build Coastguard Worker             break;
2131*89c4ff92SAndroid Build Coastguard Worker         }
2132*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Division :
2133*89c4ff92SAndroid Build Coastguard Worker         {
2134*89c4ff92SAndroid Build Coastguard Worker             SerializeDivisionLayer(layer, name);
2135*89c4ff92SAndroid Build Coastguard Worker             break;
2136*89c4ff92SAndroid Build Coastguard Worker         }
2137*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::ElementwiseBinary :
2138*89c4ff92SAndroid Build Coastguard Worker         {
2139*89c4ff92SAndroid Build Coastguard Worker             const armnn::ElementwiseBinaryDescriptor& layerDescriptor =
2140*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::ElementwiseBinaryDescriptor&>(descriptor);
2141*89c4ff92SAndroid Build Coastguard Worker             SerializeElementwiseBinaryLayer(layer, layerDescriptor, name);
2142*89c4ff92SAndroid Build Coastguard Worker             break;
2143*89c4ff92SAndroid Build Coastguard Worker         }
2144*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::ElementwiseUnary :
2145*89c4ff92SAndroid Build Coastguard Worker         {
2146*89c4ff92SAndroid Build Coastguard Worker             const armnn::ElementwiseUnaryDescriptor& layerDescriptor =
2147*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::ElementwiseUnaryDescriptor&>(descriptor);
2148*89c4ff92SAndroid Build Coastguard Worker             SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
2149*89c4ff92SAndroid Build Coastguard Worker             break;
2150*89c4ff92SAndroid Build Coastguard Worker         }
2151*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Fill :
2152*89c4ff92SAndroid Build Coastguard Worker         {
2153*89c4ff92SAndroid Build Coastguard Worker             const armnn::FillDescriptor& layerDescriptor =
2154*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::FillDescriptor&>(descriptor);
2155*89c4ff92SAndroid Build Coastguard Worker             SerializeFillLayer(layer, layerDescriptor, name);
2156*89c4ff92SAndroid Build Coastguard Worker             break;
2157*89c4ff92SAndroid Build Coastguard Worker         }
2158*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Floor :
2159*89c4ff92SAndroid Build Coastguard Worker         {
2160*89c4ff92SAndroid Build Coastguard Worker             SerializeFloorLayer(layer, name);
2161*89c4ff92SAndroid Build Coastguard Worker             break;
2162*89c4ff92SAndroid Build Coastguard Worker         }
2163*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::FullyConnected :
2164*89c4ff92SAndroid Build Coastguard Worker         {
2165*89c4ff92SAndroid Build Coastguard Worker             const armnn::FullyConnectedDescriptor& layerDescriptor =
2166*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::FullyConnectedDescriptor&>(descriptor);
2167*89c4ff92SAndroid Build Coastguard Worker             SerializeFullyConnectedLayer(layer, layerDescriptor, name);
2168*89c4ff92SAndroid Build Coastguard Worker             break;
2169*89c4ff92SAndroid Build Coastguard Worker         }
2170*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Gather :
2171*89c4ff92SAndroid Build Coastguard Worker         {
2172*89c4ff92SAndroid Build Coastguard Worker             const armnn::GatherDescriptor& layerDescriptor =
2173*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::GatherDescriptor&>(descriptor);
2174*89c4ff92SAndroid Build Coastguard Worker             SerializeGatherLayer(layer, layerDescriptor, name);
2175*89c4ff92SAndroid Build Coastguard Worker             break;
2176*89c4ff92SAndroid Build Coastguard Worker         }
2177*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::GatherNd :
2178*89c4ff92SAndroid Build Coastguard Worker         {
2179*89c4ff92SAndroid Build Coastguard Worker             SerializeGatherNdLayer(layer, name);
2180*89c4ff92SAndroid Build Coastguard Worker             break;
2181*89c4ff92SAndroid Build Coastguard Worker         }
2182*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Input:
2183*89c4ff92SAndroid Build Coastguard Worker         {
2184*89c4ff92SAndroid Build Coastguard Worker             SerializeInputLayer(layer, id, name);
2185*89c4ff92SAndroid Build Coastguard Worker             break;
2186*89c4ff92SAndroid Build Coastguard Worker         }
2187*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::InstanceNormalization :
2188*89c4ff92SAndroid Build Coastguard Worker         {
2189*89c4ff92SAndroid Build Coastguard Worker             const armnn::InstanceNormalizationDescriptor& layerDescriptor =
2190*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::InstanceNormalizationDescriptor&>(descriptor);
2191*89c4ff92SAndroid Build Coastguard Worker             SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
2192*89c4ff92SAndroid Build Coastguard Worker             break;
2193*89c4ff92SAndroid Build Coastguard Worker         }
2194*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::L2Normalization :
2195*89c4ff92SAndroid Build Coastguard Worker         {
2196*89c4ff92SAndroid Build Coastguard Worker             const armnn::L2NormalizationDescriptor& layerDescriptor =
2197*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::L2NormalizationDescriptor&>(descriptor);
2198*89c4ff92SAndroid Build Coastguard Worker             SerializeL2NormalizationLayer(layer, layerDescriptor, name);
2199*89c4ff92SAndroid Build Coastguard Worker             break;
2200*89c4ff92SAndroid Build Coastguard Worker         }
2201*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::LogicalBinary :
2202*89c4ff92SAndroid Build Coastguard Worker         {
2203*89c4ff92SAndroid Build Coastguard Worker             const armnn::LogicalBinaryDescriptor& layerDescriptor =
2204*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::LogicalBinaryDescriptor&>(descriptor);
2205*89c4ff92SAndroid Build Coastguard Worker             SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
2206*89c4ff92SAndroid Build Coastguard Worker             break;
2207*89c4ff92SAndroid Build Coastguard Worker         }
2208*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::LogSoftmax :
2209*89c4ff92SAndroid Build Coastguard Worker         {
2210*89c4ff92SAndroid Build Coastguard Worker             const armnn::LogSoftmaxDescriptor& layerDescriptor =
2211*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::LogSoftmaxDescriptor&>(descriptor);
2212*89c4ff92SAndroid Build Coastguard Worker             SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
2213*89c4ff92SAndroid Build Coastguard Worker             break;
2214*89c4ff92SAndroid Build Coastguard Worker         }
2215*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Lstm :
2216*89c4ff92SAndroid Build Coastguard Worker         {
2217*89c4ff92SAndroid Build Coastguard Worker             const armnn::LstmDescriptor& layerDescriptor =
2218*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::LstmDescriptor&>(descriptor);
2219*89c4ff92SAndroid Build Coastguard Worker             SerializeLstmLayer(layer, layerDescriptor, constants, name);
2220*89c4ff92SAndroid Build Coastguard Worker             break;
2221*89c4ff92SAndroid Build Coastguard Worker         }
2222*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::QLstm :
2223*89c4ff92SAndroid Build Coastguard Worker         {
2224*89c4ff92SAndroid Build Coastguard Worker             const armnn::QLstmDescriptor& layerDescriptor =
2225*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::QLstmDescriptor&>(descriptor);
2226*89c4ff92SAndroid Build Coastguard Worker             SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2227*89c4ff92SAndroid Build Coastguard Worker             break;
2228*89c4ff92SAndroid Build Coastguard Worker         }
2229*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Maximum :
2230*89c4ff92SAndroid Build Coastguard Worker         {
2231*89c4ff92SAndroid Build Coastguard Worker             SerializeMaximumLayer(layer, name);
2232*89c4ff92SAndroid Build Coastguard Worker             break;
2233*89c4ff92SAndroid Build Coastguard Worker         }
2234*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Mean :
2235*89c4ff92SAndroid Build Coastguard Worker         {
2236*89c4ff92SAndroid Build Coastguard Worker             const armnn::MeanDescriptor& layerDescriptor =
2237*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::MeanDescriptor&>(descriptor);
2238*89c4ff92SAndroid Build Coastguard Worker             SerializeMeanLayer(layer, layerDescriptor, name);
2239*89c4ff92SAndroid Build Coastguard Worker             break;
2240*89c4ff92SAndroid Build Coastguard Worker         }
2241*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Merge :
2242*89c4ff92SAndroid Build Coastguard Worker         {
2243*89c4ff92SAndroid Build Coastguard Worker             SerializeMergeLayer(layer, name);
2244*89c4ff92SAndroid Build Coastguard Worker             break;
2245*89c4ff92SAndroid Build Coastguard Worker         }
2246*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Minimum :
2247*89c4ff92SAndroid Build Coastguard Worker         {
2248*89c4ff92SAndroid Build Coastguard Worker             SerializeMinimumLayer(layer, name);
2249*89c4ff92SAndroid Build Coastguard Worker             break;
2250*89c4ff92SAndroid Build Coastguard Worker         }
2251*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Multiplication :
2252*89c4ff92SAndroid Build Coastguard Worker         {
2253*89c4ff92SAndroid Build Coastguard Worker             SerializeMultiplicationLayer(layer, name);
2254*89c4ff92SAndroid Build Coastguard Worker             break;
2255*89c4ff92SAndroid Build Coastguard Worker         }
2256*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Normalization :
2257*89c4ff92SAndroid Build Coastguard Worker         {
2258*89c4ff92SAndroid Build Coastguard Worker             const armnn::NormalizationDescriptor& layerDescriptor =
2259*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::NormalizationDescriptor&>(descriptor);
2260*89c4ff92SAndroid Build Coastguard Worker             SerializeNormalizationLayer(layer, layerDescriptor, name);
2261*89c4ff92SAndroid Build Coastguard Worker             break;
2262*89c4ff92SAndroid Build Coastguard Worker         }
2263*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Output:
2264*89c4ff92SAndroid Build Coastguard Worker         {
2265*89c4ff92SAndroid Build Coastguard Worker             SerializeOutputLayer(layer, id, name);
2266*89c4ff92SAndroid Build Coastguard Worker             break;
2267*89c4ff92SAndroid Build Coastguard Worker         }
2268*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Pad :
2269*89c4ff92SAndroid Build Coastguard Worker         {
2270*89c4ff92SAndroid Build Coastguard Worker             const armnn::PadDescriptor& layerDescriptor =
2271*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::PadDescriptor&>(descriptor);
2272*89c4ff92SAndroid Build Coastguard Worker             SerializePadLayer(layer, layerDescriptor, name);
2273*89c4ff92SAndroid Build Coastguard Worker             break;
2274*89c4ff92SAndroid Build Coastguard Worker         }
2275*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Permute :
2276*89c4ff92SAndroid Build Coastguard Worker         {
2277*89c4ff92SAndroid Build Coastguard Worker             const armnn::PermuteDescriptor& layerDescriptor =
2278*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::PermuteDescriptor&>(descriptor);
2279*89c4ff92SAndroid Build Coastguard Worker             SerializePermuteLayer(layer, layerDescriptor, name);
2280*89c4ff92SAndroid Build Coastguard Worker             break;
2281*89c4ff92SAndroid Build Coastguard Worker         }
2282*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Pooling2d :
2283*89c4ff92SAndroid Build Coastguard Worker         {
2284*89c4ff92SAndroid Build Coastguard Worker             const armnn::Pooling2dDescriptor& layerDescriptor =
2285*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::Pooling2dDescriptor&>(descriptor);
2286*89c4ff92SAndroid Build Coastguard Worker             SerializePooling2dLayer(layer, layerDescriptor, name);
2287*89c4ff92SAndroid Build Coastguard Worker             break;
2288*89c4ff92SAndroid Build Coastguard Worker         }
2289*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Pooling3d :
2290*89c4ff92SAndroid Build Coastguard Worker         {
2291*89c4ff92SAndroid Build Coastguard Worker             const armnn::Pooling3dDescriptor& layerDescriptor =
2292*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::Pooling3dDescriptor&>(descriptor);
2293*89c4ff92SAndroid Build Coastguard Worker             SerializePooling3dLayer(layer, layerDescriptor, name);
2294*89c4ff92SAndroid Build Coastguard Worker             break;
2295*89c4ff92SAndroid Build Coastguard Worker         }
2296*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Prelu :
2297*89c4ff92SAndroid Build Coastguard Worker         {
2298*89c4ff92SAndroid Build Coastguard Worker             SerializePreluLayer(layer, name);
2299*89c4ff92SAndroid Build Coastguard Worker             break;
2300*89c4ff92SAndroid Build Coastguard Worker         }
2301*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Quantize :
2302*89c4ff92SAndroid Build Coastguard Worker         {
2303*89c4ff92SAndroid Build Coastguard Worker             SerializeQuantizeLayer(layer, name);
2304*89c4ff92SAndroid Build Coastguard Worker             break;
2305*89c4ff92SAndroid Build Coastguard Worker         }
2306*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::QuantizedLstm:
2307*89c4ff92SAndroid Build Coastguard Worker             SerializeQuantizedLstmLayer(layer, constants, name);
2308*89c4ff92SAndroid Build Coastguard Worker             break;
2309*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Reshape:
2310*89c4ff92SAndroid Build Coastguard Worker         {
2311*89c4ff92SAndroid Build Coastguard Worker             const armnn::ReshapeDescriptor &layerDescriptor =
2312*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::ReshapeDescriptor &>(descriptor);
2313*89c4ff92SAndroid Build Coastguard Worker             SerializeReshapeLayer(layer, layerDescriptor, name);
2314*89c4ff92SAndroid Build Coastguard Worker             break;
2315*89c4ff92SAndroid Build Coastguard Worker         }
2316*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Rank:
2317*89c4ff92SAndroid Build Coastguard Worker         {
2318*89c4ff92SAndroid Build Coastguard Worker             SerializeRankLayer(layer, name);
2319*89c4ff92SAndroid Build Coastguard Worker             break;
2320*89c4ff92SAndroid Build Coastguard Worker         }
2321*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Reduce:
2322*89c4ff92SAndroid Build Coastguard Worker         {
2323*89c4ff92SAndroid Build Coastguard Worker             const armnn::ReduceDescriptor& layerDescriptor =
2324*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::ReduceDescriptor&>(descriptor);
2325*89c4ff92SAndroid Build Coastguard Worker             SerializeReduceLayer(layer, layerDescriptor, name);
2326*89c4ff92SAndroid Build Coastguard Worker             break;
2327*89c4ff92SAndroid Build Coastguard Worker         }
2328*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Resize:
2329*89c4ff92SAndroid Build Coastguard Worker         {
2330*89c4ff92SAndroid Build Coastguard Worker             const armnn::ResizeDescriptor& layerDescriptor =
2331*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::ResizeDescriptor&>(descriptor);
2332*89c4ff92SAndroid Build Coastguard Worker             SerializeResizeLayer(layer, layerDescriptor, name);
2333*89c4ff92SAndroid Build Coastguard Worker             break;
2334*89c4ff92SAndroid Build Coastguard Worker         }
2335*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Shape:
2336*89c4ff92SAndroid Build Coastguard Worker         {
2337*89c4ff92SAndroid Build Coastguard Worker             SerializeShapeLayer(layer, name);
2338*89c4ff92SAndroid Build Coastguard Worker             break;
2339*89c4ff92SAndroid Build Coastguard Worker         }
2340*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Slice:
2341*89c4ff92SAndroid Build Coastguard Worker         {
2342*89c4ff92SAndroid Build Coastguard Worker             const armnn::SliceDescriptor& layerDescriptor =
2343*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::SliceDescriptor&>(descriptor);
2344*89c4ff92SAndroid Build Coastguard Worker             SerializeSliceLayer(layer, layerDescriptor, name);
2345*89c4ff92SAndroid Build Coastguard Worker             break;
2346*89c4ff92SAndroid Build Coastguard Worker         }
2347*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Softmax:
2348*89c4ff92SAndroid Build Coastguard Worker         {
2349*89c4ff92SAndroid Build Coastguard Worker             const armnn::SoftmaxDescriptor& layerDescriptor =
2350*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::SoftmaxDescriptor&>(descriptor);
2351*89c4ff92SAndroid Build Coastguard Worker             SerializeSoftmaxLayer(layer, layerDescriptor, name);
2352*89c4ff92SAndroid Build Coastguard Worker             break;
2353*89c4ff92SAndroid Build Coastguard Worker         }
2354*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::SpaceToBatchNd:
2355*89c4ff92SAndroid Build Coastguard Worker         {
2356*89c4ff92SAndroid Build Coastguard Worker             const armnn::SpaceToBatchNdDescriptor& layerDescriptor =
2357*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::SpaceToBatchNdDescriptor&>(descriptor);
2358*89c4ff92SAndroid Build Coastguard Worker             SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2359*89c4ff92SAndroid Build Coastguard Worker             break;
2360*89c4ff92SAndroid Build Coastguard Worker         }
2361*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::SpaceToDepth:
2362*89c4ff92SAndroid Build Coastguard Worker         {
2363*89c4ff92SAndroid Build Coastguard Worker             const armnn::SpaceToDepthDescriptor& layerDescriptor =
2364*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::SpaceToDepthDescriptor&>(descriptor);
2365*89c4ff92SAndroid Build Coastguard Worker             SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2366*89c4ff92SAndroid Build Coastguard Worker             break;
2367*89c4ff92SAndroid Build Coastguard Worker         }
2368*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Splitter:
2369*89c4ff92SAndroid Build Coastguard Worker         {
2370*89c4ff92SAndroid Build Coastguard Worker             const armnn::SplitterDescriptor& layerDescriptor =
2371*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::SplitterDescriptor&>(descriptor);
2372*89c4ff92SAndroid Build Coastguard Worker             SerializeSplitterLayer(layer, layerDescriptor, name);
2373*89c4ff92SAndroid Build Coastguard Worker             break;
2374*89c4ff92SAndroid Build Coastguard Worker         }
2375*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Stack:
2376*89c4ff92SAndroid Build Coastguard Worker         {
2377*89c4ff92SAndroid Build Coastguard Worker             const armnn::StackDescriptor& layerDescriptor =
2378*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::StackDescriptor&>(descriptor);
2379*89c4ff92SAndroid Build Coastguard Worker             SerializeStackLayer(layer, layerDescriptor, name);
2380*89c4ff92SAndroid Build Coastguard Worker             break;
2381*89c4ff92SAndroid Build Coastguard Worker         }
2382*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::StandIn:
2383*89c4ff92SAndroid Build Coastguard Worker         {
2384*89c4ff92SAndroid Build Coastguard Worker             const armnn::StandInDescriptor& layerDescriptor =
2385*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::StandInDescriptor&>(descriptor);
2386*89c4ff92SAndroid Build Coastguard Worker             SerializeStandInLayer(layer, layerDescriptor, name);
2387*89c4ff92SAndroid Build Coastguard Worker             break;
2388*89c4ff92SAndroid Build Coastguard Worker         }
2389*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::StridedSlice:
2390*89c4ff92SAndroid Build Coastguard Worker         {
2391*89c4ff92SAndroid Build Coastguard Worker             const armnn::StridedSliceDescriptor& layerDescriptor =
2392*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::StridedSliceDescriptor&>(descriptor);
2393*89c4ff92SAndroid Build Coastguard Worker             SerializeStridedSliceLayer(layer, layerDescriptor, name);
2394*89c4ff92SAndroid Build Coastguard Worker             break;
2395*89c4ff92SAndroid Build Coastguard Worker         }
2396*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Subtraction:
2397*89c4ff92SAndroid Build Coastguard Worker         {
2398*89c4ff92SAndroid Build Coastguard Worker             SerializeSubtractionLayer(layer, name);
2399*89c4ff92SAndroid Build Coastguard Worker             break;
2400*89c4ff92SAndroid Build Coastguard Worker         }
2401*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Switch:
2402*89c4ff92SAndroid Build Coastguard Worker         {
2403*89c4ff92SAndroid Build Coastguard Worker             SerializeSwitchLayer(layer, name);
2404*89c4ff92SAndroid Build Coastguard Worker             break;
2405*89c4ff92SAndroid Build Coastguard Worker         }
2406*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::Transpose:
2407*89c4ff92SAndroid Build Coastguard Worker         {
2408*89c4ff92SAndroid Build Coastguard Worker             const armnn::TransposeDescriptor& layerDescriptor =
2409*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::TransposeDescriptor&>(descriptor);
2410*89c4ff92SAndroid Build Coastguard Worker             SerializeTransposeLayer(layer, layerDescriptor, name);
2411*89c4ff92SAndroid Build Coastguard Worker             break;
2412*89c4ff92SAndroid Build Coastguard Worker         }
2413*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::TransposeConvolution2d:
2414*89c4ff92SAndroid Build Coastguard Worker         {
2415*89c4ff92SAndroid Build Coastguard Worker             const armnn::TransposeConvolution2dDescriptor& layerDescriptor =
2416*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::TransposeConvolution2dDescriptor&>(descriptor);
2417*89c4ff92SAndroid Build Coastguard Worker             SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2418*89c4ff92SAndroid Build Coastguard Worker             break;
2419*89c4ff92SAndroid Build Coastguard Worker         }
2420*89c4ff92SAndroid Build Coastguard Worker         case armnn::LayerType::UnidirectionalSequenceLstm :
2421*89c4ff92SAndroid Build Coastguard Worker         {
2422*89c4ff92SAndroid Build Coastguard Worker             const armnn::UnidirectionalSequenceLstmDescriptor& layerDescriptor =
2423*89c4ff92SAndroid Build Coastguard Worker                     static_cast<const armnn::UnidirectionalSequenceLstmDescriptor&>(descriptor);
2424*89c4ff92SAndroid Build Coastguard Worker             SerializeUnidirectionalSequenceLstmLayer(layer, layerDescriptor, constants, name);
2425*89c4ff92SAndroid Build Coastguard Worker             break;
2426*89c4ff92SAndroid Build Coastguard Worker         }
2427*89c4ff92SAndroid Build Coastguard Worker         default:
2428*89c4ff92SAndroid Build Coastguard Worker         {
2429*89c4ff92SAndroid Build Coastguard Worker             throw InvalidArgumentException(
2430*89c4ff92SAndroid Build Coastguard Worker                     fmt::format("A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2431*89c4ff92SAndroid Build Coastguard Worker                                 layer->GetName(),
2432*89c4ff92SAndroid Build Coastguard Worker                                 id));
2433*89c4ff92SAndroid Build Coastguard Worker         }
2434*89c4ff92SAndroid Build Coastguard Worker     }
2435*89c4ff92SAndroid Build Coastguard Worker }
2436*89c4ff92SAndroid Build Coastguard Worker 
Serialize(const INetwork & inNetwork)2437*89c4ff92SAndroid Build Coastguard Worker void ISerializer::SerializerImpl::Serialize(const INetwork& inNetwork)
2438*89c4ff92SAndroid Build Coastguard Worker {
2439*89c4ff92SAndroid Build Coastguard Worker     // Iterate through to network
2440*89c4ff92SAndroid Build Coastguard Worker     inNetwork.ExecuteStrategy(m_SerializerStrategy);
2441*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
2442*89c4ff92SAndroid Build Coastguard Worker 
2443*89c4ff92SAndroid Build Coastguard Worker     // Create FlatBuffer SerializedGraph
2444*89c4ff92SAndroid Build Coastguard Worker     auto serializedGraph = serializer::CreateSerializedGraph(
2445*89c4ff92SAndroid Build Coastguard Worker             fbBuilder,
2446*89c4ff92SAndroid Build Coastguard Worker             fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2447*89c4ff92SAndroid Build Coastguard Worker             fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2448*89c4ff92SAndroid Build Coastguard Worker             fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2449*89c4ff92SAndroid Build Coastguard Worker             m_SerializerStrategy.GetVersionTable());
2450*89c4ff92SAndroid Build Coastguard Worker 
2451*89c4ff92SAndroid Build Coastguard Worker     // Serialize the graph
2452*89c4ff92SAndroid Build Coastguard Worker     fbBuilder.Finish(serializedGraph);
2453*89c4ff92SAndroid Build Coastguard Worker }
2454*89c4ff92SAndroid Build Coastguard Worker 
2455*89c4ff92SAndroid Build Coastguard Worker 
SaveSerializedToStream(std::ostream & stream)2456*89c4ff92SAndroid Build Coastguard Worker bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
2457*89c4ff92SAndroid Build Coastguard Worker {
2458*89c4ff92SAndroid Build Coastguard Worker     flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
2459*89c4ff92SAndroid Build Coastguard Worker 
2460*89c4ff92SAndroid Build Coastguard Worker     auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
2461*89c4ff92SAndroid Build Coastguard Worker     stream.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer()), bytesToWrite);
2462*89c4ff92SAndroid Build Coastguard Worker     return !stream.bad();
2463*89c4ff92SAndroid Build Coastguard Worker }
2464*89c4ff92SAndroid Build Coastguard Worker 
2465*89c4ff92SAndroid Build Coastguard Worker } // namespace armnnSerializer
2466