blob: 0bdb1fec3d3bea99487211825b654dc51b735eca [file] [log] [blame]
Matthew Sloyan164bf4f2022-10-28 18:02:17 +01001//
David Monahand7fca092023-01-12 14:53:34 +00002// Copyright © 2022-2023 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 {
26 case LayerType::Addition:
Nikhil Raj9a339462022-12-05 11:24:35 +000027 case LayerType::Multiplication:
28 case LayerType::Subtraction:
Matthew Sloyan164bf4f2022-10-28 18:02:17 +010029 {
Nikhil Raj9a339462022-12-05 11:24:35 +000030 return ConvertElementwiseBinaryToTosaOperator(layer, type, inputs, outputs);
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +000031 }
David Monahand7fca092023-01-12 14:53:34 +000032 case LayerType::ElementwiseUnary:
33 {
34 auto unaryDesc = PolymorphicDowncast<const ElementwiseUnaryDescriptor*>(&descriptor);
35 return ConvertElementwiseUnaryOperator(layer, inputs, outputs, unaryDesc);
36 }
Kevin May5b58e312022-12-15 10:15:21 +000037 case LayerType::Concat:
38 {
39 auto concatDesc = PolymorphicDowncast<const OriginsDescriptor*>(&descriptor);
40 return ConvertConcatToTosaOperator(layer, inputs, outputs, concatDesc);
41 }
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +000042 case LayerType::Constant:
43 {
44 return ConvertConstantToTosaOperator(layer, outputs);
45 }
46 case LayerType::Convolution2d:
47 {
48 auto conv2dDesc = PolymorphicDowncast<const Convolution2dDescriptor*>(&descriptor);
49 return ConvertConv2dToTosaOperator(layer, inputs, outputs, conv2dDesc);
Matthew Sloyan164bf4f2022-10-28 18:02:17 +010050 }
Cathal Corbettbd18eab2022-11-15 12:56:16 +000051 case LayerType::Pooling2d:
52 {
53 auto poolDesc = PolymorphicDowncast<const Pooling2dDescriptor*>(&descriptor);
54
55 bool avgPoolIgnoreValue =
56 (poolDesc->m_PoolType == PoolingAlgorithm::Average) &&
57 (poolDesc->m_PaddingMethod == PaddingMethod::IgnoreValue);
58
59 if (poolDesc->m_PoolType == PoolingAlgorithm::L2)
60 {
61 return CreateEmptyTosaSerializationBasicBlock();
62 }
63 else if (avgPoolIgnoreValue)
64 {
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +000065 return ConvertAvgPool2DIgnoreValueToTosaOperator(layer, inputs, outputs, poolDesc);
Cathal Corbettbd18eab2022-11-15 12:56:16 +000066 }
67 else
68 {
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +000069 return ConvertPooling2DToTosaOperator(layer, inputs, outputs, poolDesc);
Cathal Corbettbd18eab2022-11-15 12:56:16 +000070 }
71 }
Cathal Corbettb30e6552022-12-07 11:50:50 +000072 case LayerType::Reshape:
73 {
74 auto reshapeDesc = PolymorphicDowncast<const ReshapeDescriptor*>(&descriptor);
75 return ConvertReshapeToTosaOperator(layer, inputs, outputs, reshapeDesc);
76 }
Teresa Charlince655882023-11-21 15:44:13 +000077 case LayerType::Resize:
78 {
79 auto resizeDesc = PolymorphicDowncast<const ResizeDescriptor*>(&descriptor);
80 return ConvertResizeToTosaOperator(layer, inputs, outputs, resizeDesc);
81 }
Cathal Corbett3b9acd52022-12-09 12:17:27 +000082 case LayerType::Slice:
83 {
84 auto sliceDesc = PolymorphicDowncast<const SliceDescriptor*>(&descriptor);
85 return ConvertSliceToTosaOperator(layer, inputs, outputs, sliceDesc);
86 }
Kevin May1bea6be2023-12-12 11:18:46 +000087 case LayerType::Splitter:
88 {
89 auto splitDesc = PolymorphicDowncast<const SplitterDescriptor*>(&descriptor);
90 return ConvertSplitToTosaOperator(layer, inputs, outputs, splitDesc);
91 }
Matthew Sloyanfc9d5e72022-12-08 13:38:23 +000092 case LayerType::TransposeConvolution2d:
93 {
94 auto transposeConv2dDesc = PolymorphicDowncast<const TransposeConvolution2dDescriptor*>(&descriptor);
95 return ConvertTransposeConv2dToTosaOperator(layer, inputs, outputs, transposeConv2dDesc);
96 }
Cathal Corbett0bb096d2022-12-22 13:09:38 +000097 case LayerType::Transpose:
98 {
99 auto transposeDesc = PolymorphicDowncast<const TransposeDescriptor*>(&descriptor);
100 return ConvertTransposeToTosaOperator(layer, inputs, outputs, transposeDesc);
101 }
Matthew Sloyan164bf4f2022-10-28 18:02:17 +0100102 default:
103 {
Cathal Corbettbd18eab2022-11-15 12:56:16 +0000104 return CreateEmptyTosaSerializationBasicBlock();
Matthew Sloyan164bf4f2022-10-28 18:02:17 +0100105 }
106 }
107}
108
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +0000109TosaSerializationBasicBlock* GetTosaMappingFromLayer(Layer* layer)
Matthew Sloyan164bf4f2022-10-28 18:02:17 +0100110{
111 std::vector<const TensorInfo*> inputs;
112 for (auto inputSlot : layer->GetInputSlots())
113 {
Mike Kellya9ac6ba2023-06-30 15:18:26 +0100114 inputs.push_back(&inputSlot.GetTensorInfo());
Matthew Sloyan164bf4f2022-10-28 18:02:17 +0100115 }
116
117 std::vector<const TensorInfo*> outputs;
118 for (auto& outputSlot : layer->GetOutputSlots())
119 {
120 outputs.push_back(&outputSlot.GetTensorInfo());
121 }
122
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +0000123 TosaSerializationBasicBlock* basicBlock = GetTosaMapping(layer,
124 layer->GetType(),
Matthew Sloyan164bf4f2022-10-28 18:02:17 +0100125 inputs,
126 outputs,
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +0000127 layer->GetParameters());
Matthew Sloyan164bf4f2022-10-28 18:02:17 +0100128 return basicBlock;
129}