blob: 3932b62b7b7d6468ed38991912b0606643ee939d [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, {}, {});
Cathal Corbettbd18eab2022-11-15 12:56:16 +000015 return new TosaSerializationBasicBlock("", {op}, {}, {}, {});
16}
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 }
Cathal Corbett3b9acd52022-12-09 12:17:27 +000077 case LayerType::Slice:
78 {
79 auto sliceDesc = PolymorphicDowncast<const SliceDescriptor*>(&descriptor);
80 return ConvertSliceToTosaOperator(layer, inputs, outputs, sliceDesc);
81 }
Matthew Sloyanfc9d5e72022-12-08 13:38:23 +000082 case LayerType::TransposeConvolution2d:
83 {
84 auto transposeConv2dDesc = PolymorphicDowncast<const TransposeConvolution2dDescriptor*>(&descriptor);
85 return ConvertTransposeConv2dToTosaOperator(layer, inputs, outputs, transposeConv2dDesc);
86 }
Cathal Corbett0bb096d2022-12-22 13:09:38 +000087 case LayerType::Transpose:
88 {
89 auto transposeDesc = PolymorphicDowncast<const TransposeDescriptor*>(&descriptor);
90 return ConvertTransposeToTosaOperator(layer, inputs, outputs, transposeDesc);
91 }
Matthew Sloyan164bf4f2022-10-28 18:02:17 +010092 default:
93 {
Cathal Corbettbd18eab2022-11-15 12:56:16 +000094 return CreateEmptyTosaSerializationBasicBlock();
Matthew Sloyan164bf4f2022-10-28 18:02:17 +010095 }
96 }
97}
98
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +000099TosaSerializationBasicBlock* GetTosaMappingFromLayer(Layer* layer)
Matthew Sloyan164bf4f2022-10-28 18:02:17 +0100100{
101 std::vector<const TensorInfo*> inputs;
102 for (auto inputSlot : layer->GetInputSlots())
103 {
104 inputs.push_back(&inputSlot.GetConnection()->GetTensorInfo());
105 }
106
107 std::vector<const TensorInfo*> outputs;
108 for (auto& outputSlot : layer->GetOutputSlots())
109 {
110 outputs.push_back(&outputSlot.GetTensorInfo());
111 }
112
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +0000113 TosaSerializationBasicBlock* basicBlock = GetTosaMapping(layer,
114 layer->GetType(),
Matthew Sloyan164bf4f2022-10-28 18:02:17 +0100115 inputs,
116 outputs,
Matthew Sloyanc5fe6e72022-11-25 16:10:00 +0000117 layer->GetParameters());
Matthew Sloyan164bf4f2022-10-28 18:02:17 +0100118 return basicBlock;
119}