1 //
2 // Copyright © 2022-2023 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5
6 #include "TosaMappings.hpp"
7
8 using namespace armnn;
9 using namespace tosa;
10
CreateEmptyTosaSerializationBasicBlock()11 TosaSerializationBasicBlock* CreateEmptyTosaSerializationBasicBlock()
12 {
13 // Empty basic block when no TOSA mapping implemented/exists
14 auto* op = new TosaSerializationOperator(Op_UNKNOWN, Attribute_NONE, nullptr, {}, {});
15 return new TosaSerializationBasicBlock("", {op}, {}, {}, {});
16 }
17
GetTosaMapping(const Layer * layer,const LayerType type,const std::vector<const TensorInfo * > & inputs,const std::vector<const TensorInfo * > & outputs,const BaseDescriptor & descriptor)18 TosaSerializationBasicBlock* GetTosaMapping(const Layer* layer,
19 const LayerType type,
20 const std::vector<const TensorInfo*>& inputs,
21 const std::vector<const TensorInfo*>& outputs,
22 const BaseDescriptor& descriptor)
23 {
24 switch (type)
25 {
26 case LayerType::Addition:
27 case LayerType::Multiplication:
28 case LayerType::Subtraction:
29 {
30 return ConvertElementwiseBinaryToTosaOperator(layer, type, inputs, outputs);
31 }
32 case LayerType::ElementwiseUnary:
33 {
34 auto unaryDesc = PolymorphicDowncast<const ElementwiseUnaryDescriptor*>(&descriptor);
35 return ConvertElementwiseUnaryOperator(layer, inputs, outputs, unaryDesc);
36 }
37 case LayerType::Concat:
38 {
39 auto concatDesc = PolymorphicDowncast<const OriginsDescriptor*>(&descriptor);
40 return ConvertConcatToTosaOperator(layer, inputs, outputs, concatDesc);
41 }
42 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);
50 }
51 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 {
65 return ConvertAvgPool2DIgnoreValueToTosaOperator(layer, inputs, outputs, poolDesc);
66 }
67 else
68 {
69 return ConvertPooling2DToTosaOperator(layer, inputs, outputs, poolDesc);
70 }
71 }
72 case LayerType::Reshape:
73 {
74 auto reshapeDesc = PolymorphicDowncast<const ReshapeDescriptor*>(&descriptor);
75 return ConvertReshapeToTosaOperator(layer, inputs, outputs, reshapeDesc);
76 }
77 case LayerType::Slice:
78 {
79 auto sliceDesc = PolymorphicDowncast<const SliceDescriptor*>(&descriptor);
80 return ConvertSliceToTosaOperator(layer, inputs, outputs, sliceDesc);
81 }
82 case LayerType::TransposeConvolution2d:
83 {
84 auto transposeConv2dDesc = PolymorphicDowncast<const TransposeConvolution2dDescriptor*>(&descriptor);
85 return ConvertTransposeConv2dToTosaOperator(layer, inputs, outputs, transposeConv2dDesc);
86 }
87 case LayerType::Transpose:
88 {
89 auto transposeDesc = PolymorphicDowncast<const TransposeDescriptor*>(&descriptor);
90 return ConvertTransposeToTosaOperator(layer, inputs, outputs, transposeDesc);
91 }
92 default:
93 {
94 return CreateEmptyTosaSerializationBasicBlock();
95 }
96 }
97 }
98
GetTosaMappingFromLayer(Layer * layer)99 TosaSerializationBasicBlock* GetTosaMappingFromLayer(Layer* layer)
100 {
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
113 TosaSerializationBasicBlock* basicBlock = GetTosaMapping(layer,
114 layer->GetType(),
115 inputs,
116 outputs,
117 layer->GetParameters());
118 return basicBlock;
119 }
120