blob: 0e44d54aabd13475be29a04f15ca698b8a8cdb20 [file] [log] [blame]
Matthew Sloyan164bf4f2022-10-28 18:02:17 +01001//
Tracy Narine10403ec2023-11-28 11:55:08 +00002// Copyright © 2022-2024 Arm Ltd and Contributors. All rights reserved.
Matthew Sloyan164bf4f2022-10-28 18:02:17 +01003// SPDX-License-Identifier: MIT
4//
5
6#include "TosaMappings.hpp"
7
8using namespace armnn;
9using namespace tosa;
10
Cathal Corbettbd18eab2022-11-15 12:56:16 +000011TosaSerializationBasicBlock* CreateEmptyTosaSerializationBasicBlock()
12{
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +000013 // Empty basic block when no TOSA mapping implemented/exists
14 auto* op = new TosaSerializationOperator(Op_UNKNOWN, Attribute_NONE, nullptr, {}, {});
Narumol Prangnawaratad323af2023-09-29 17:00:38 +010015 return new TosaSerializationBasicBlock("", "", {op}, {}, {}, {});
Cathal Corbettbd18eab2022-11-15 12:56:16 +000016}
17
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +000018TosaSerializationBasicBlock* GetTosaMapping(const Layer* layer,
19 const LayerType type,
Matthew Sloyan164bf4f2022-10-28 18:02:17 +010020 const std::vector<const TensorInfo*>& inputs,
21 const std::vector<const TensorInfo*>& outputs,
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +000022 const BaseDescriptor& descriptor)
Matthew Sloyan164bf4f2022-10-28 18:02:17 +010023{
24 switch (type)
25 {
Tracy Narine10403ec2023-11-28 11:55:08 +000026 case LayerType::Activation:
27 {
28 auto activationDesc = PolymorphicDowncast<const ActivationDescriptor*>(&descriptor);
29 if (activationDesc->m_Function == ActivationFunction::LeakyReLu)
30 {
31 return ConvertActivationToTosaOperator(layer, inputs, outputs, activationDesc);
32 }
33 else
34 {
35 return CreateEmptyTosaSerializationBasicBlock();
36 }
37 }
Matthew Sloyan164bf4f2022-10-28 18:02:17 +010038 case LayerType::Addition:
Nikhil Raj9a339462022-12-05 11:24:35 +000039 case LayerType::Multiplication:
40 case LayerType::Subtraction:
Matthew Sloyan164bf4f2022-10-28 18:02:17 +010041 {
Nikhil Raj9a339462022-12-05 11:24:35 +000042 return ConvertElementwiseBinaryToTosaOperator(layer, type, inputs, outputs);
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +000043 }
Tianle Cheng7790dc62023-12-12 13:52:22 +000044 case LayerType::ElementwiseBinary:
45 {
46 auto binaryDesc = PolymorphicDowncast<const ElementwiseBinaryDescriptor*>(&descriptor);
47 return ConvertElementwiseBinaryToTosaOperator(layer, type, inputs, outputs, binaryDesc);
48 }
David Monahand7fca092023-01-12 14:53:34 +000049 case LayerType::ElementwiseUnary:
50 {
51 auto unaryDesc = PolymorphicDowncast<const ElementwiseUnaryDescriptor*>(&descriptor);
52 return ConvertElementwiseUnaryOperator(layer, inputs, outputs, unaryDesc);
53 }
Kevin May5b58e312022-12-15 10:15:21 +000054 case LayerType::Concat:
55 {
56 auto concatDesc = PolymorphicDowncast<const OriginsDescriptor*>(&descriptor);
57 return ConvertConcatToTosaOperator(layer, inputs, outputs, concatDesc);
58 }
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +000059 case LayerType::Constant:
60 {
61 return ConvertConstantToTosaOperator(layer, outputs);
62 }
63 case LayerType::Convolution2d:
64 {
65 auto conv2dDesc = PolymorphicDowncast<const Convolution2dDescriptor*>(&descriptor);
66 return ConvertConv2dToTosaOperator(layer, inputs, outputs, conv2dDesc);
Matthew Sloyan164bf4f2022-10-28 18:02:17 +010067 }
Cathal Corbettbd18eab2022-11-15 12:56:16 +000068 case LayerType::Pooling2d:
69 {
70 auto poolDesc = PolymorphicDowncast<const Pooling2dDescriptor*>(&descriptor);
71
72 bool avgPoolIgnoreValue =
73 (poolDesc->m_PoolType == PoolingAlgorithm::Average) &&
74 (poolDesc->m_PaddingMethod == PaddingMethod::IgnoreValue);
75
76 if (poolDesc->m_PoolType == PoolingAlgorithm::L2)
77 {
78 return CreateEmptyTosaSerializationBasicBlock();
79 }
80 else if (avgPoolIgnoreValue)
81 {
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +000082 return ConvertAvgPool2DIgnoreValueToTosaOperator(layer, inputs, outputs, poolDesc);
Cathal Corbettbd18eab2022-11-15 12:56:16 +000083 }
84 else
85 {
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +000086 return ConvertPooling2DToTosaOperator(layer, inputs, outputs, poolDesc);
Cathal Corbettbd18eab2022-11-15 12:56:16 +000087 }
88 }
Teresa Charlinca5a23a2023-12-15 14:20:47 +000089 case LayerType::Quantize:
90 {
91 return ConvertQuantizeToTosaOperator(layer, inputs, outputs);
92 }
Cathal Corbettb30e6552022-12-07 11:50:50 +000093 case LayerType::Reshape:
94 {
95 auto reshapeDesc = PolymorphicDowncast<const ReshapeDescriptor*>(&descriptor);
96 return ConvertReshapeToTosaOperator(layer, inputs, outputs, reshapeDesc);
97 }
Teresa Charlince655882023-11-21 15:44:13 +000098 case LayerType::Resize:
99 {
100 auto resizeDesc = PolymorphicDowncast<const ResizeDescriptor*>(&descriptor);
101 return ConvertResizeToTosaOperator(layer, inputs, outputs, resizeDesc);
102 }
Cathal Corbett3b9acd52022-12-09 12:17:27 +0000103 case LayerType::Slice:
104 {
105 auto sliceDesc = PolymorphicDowncast<const SliceDescriptor*>(&descriptor);
106 return ConvertSliceToTosaOperator(layer, inputs, outputs, sliceDesc);
107 }
Kevin May1bea6be2023-12-12 11:18:46 +0000108 case LayerType::Splitter:
109 {
110 auto splitDesc = PolymorphicDowncast<const SplitterDescriptor*>(&descriptor);
111 return ConvertSplitToTosaOperator(layer, inputs, outputs, splitDesc);
112 }
Matthew Sloyanfc9d5e72022-12-08 13:38:23 +0000113 case LayerType::TransposeConvolution2d:
114 {
115 auto transposeConv2dDesc = PolymorphicDowncast<const TransposeConvolution2dDescriptor*>(&descriptor);
116 return ConvertTransposeConv2dToTosaOperator(layer, inputs, outputs, transposeConv2dDesc);
117 }
Cathal Corbett0bb096d2022-12-22 13:09:38 +0000118 case LayerType::Transpose:
119 {
120 auto transposeDesc = PolymorphicDowncast<const TransposeDescriptor*>(&descriptor);
121 return ConvertTransposeToTosaOperator(layer, inputs, outputs, transposeDesc);
122 }
Matthew Sloyan164bf4f2022-10-28 18:02:17 +0100123 default:
124 {
Cathal Corbettbd18eab2022-11-15 12:56:16 +0000125 return CreateEmptyTosaSerializationBasicBlock();
Matthew Sloyan164bf4f2022-10-28 18:02:17 +0100126 }
127 }
128}
129
Teresa Charlin8cfd0592024-04-23 16:22:47 +0100130TosaSerializationBasicBlock* GetTosaMappingFromLayer(const Layer* layer)
Matthew Sloyan164bf4f2022-10-28 18:02:17 +0100131{
132 std::vector<const TensorInfo*> inputs;
133 for (auto inputSlot : layer->GetInputSlots())
134 {
Mike Kellya9ac6ba2023-06-30 15:18:26 +0100135 inputs.push_back(&inputSlot.GetTensorInfo());
Matthew Sloyan164bf4f2022-10-28 18:02:17 +0100136 }
137
138 std::vector<const TensorInfo*> outputs;
139 for (auto& outputSlot : layer->GetOutputSlots())
140 {
141 outputs.push_back(&outputSlot.GetTensorInfo());
142 }
143
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +0000144 TosaSerializationBasicBlock* basicBlock = GetTosaMapping(layer,
145 layer->GetType(),
Matthew Sloyan164bf4f2022-10-28 18:02:17 +0100146 inputs,
147 outputs,
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +0000148 layer->GetParameters());
Matthew Sloyan164bf4f2022-10-28 18:02:17 +0100149 return basicBlock;
150}