ArmNN
 23.02
TosaMappings.cpp
Go to the documentation of this file.
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 
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 
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  {
29  {
30  return ConvertElementwiseBinaryToTosaOperator(layer, type, inputs, outputs);
31  }
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  }
43  {
44  return ConvertConstantToTosaOperator(layer, outputs);
45  }
47  {
48  auto conv2dDesc = PolymorphicDowncast<const Convolution2dDescriptor*>(&descriptor);
49  return ConvertConv2dToTosaOperator(layer, inputs, outputs, conv2dDesc);
50  }
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  {
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  }
83  {
84  auto transposeConv2dDesc = PolymorphicDowncast<const TransposeConvolution2dDescriptor*>(&descriptor);
85  return ConvertTransposeConv2dToTosaOperator(layer, inputs, outputs, transposeConv2dDesc);
86  }
88  {
89  auto transposeDesc = PolymorphicDowncast<const TransposeDescriptor*>(&descriptor);
90  return ConvertTransposeToTosaOperator(layer, inputs, outputs, transposeDesc);
91  }
92  default:
93  {
95  }
96  }
97 }
98 
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 }
ConvertAvgPool2DIgnoreValueToTosaOperator
TosaSerializationBasicBlock * ConvertAvgPool2DIgnoreValueToTosaOperator(const Layer *layer, const std::vector< const TensorInfo * > &inputs, const std::vector< const TensorInfo * > &outputs, const Pooling2dDescriptor *poolDescriptor)
Definition: AvgPool2DIgnoreValueOperator.cpp:8
armnn::LayerType::Transpose
@ Transpose
armnn::LayerType::TransposeConvolution2d
@ TransposeConvolution2d
ConvertConstantToTosaOperator
TosaSerializationBasicBlock * ConvertConstantToTosaOperator(const Layer *layer, const std::vector< const TensorInfo * > &outputs)
Definition: ConstantOperator.cpp:10
armnn::LayerType::Slice
@ Slice
armnn::LayerType::Subtraction
@ Subtraction
armnn::LayerType::Convolution2d
@ Convolution2d
TosaMappings.hpp
armnn::Layer
Definition: Layer.hpp:217
ConvertElementwiseBinaryToTosaOperator
TosaSerializationBasicBlock * ConvertElementwiseBinaryToTosaOperator(const Layer *layer, const LayerType type, const std::vector< const TensorInfo * > &inputs, const std::vector< const TensorInfo * > &outputs)
Definition: ElementwiseBinaryOperator.cpp:8
CreateEmptyTosaSerializationBasicBlock
TosaSerializationBasicBlock * CreateEmptyTosaSerializationBasicBlock()
Definition: TosaMappings.cpp:11
armnn::LayerType::Addition
@ Addition
armnn::PaddingMethod::IgnoreValue
@ IgnoreValue
The padding fields count, but are ignored.
ConvertElementwiseUnaryOperator
TosaSerializationBasicBlock * ConvertElementwiseUnaryOperator(const Layer *layer, const std::vector< const TensorInfo * > &inputs, const std::vector< const TensorInfo * > &outputs, const ElementwiseUnaryDescriptor *unaryDescriptor)
Definition: ElementwiseUnaryOperator.cpp:8
armnn::PoolingAlgorithm::L2
@ L2
ConvertSliceToTosaOperator
TosaSerializationBasicBlock * ConvertSliceToTosaOperator(const Layer *layer, const std::vector< const TensorInfo * > &inputs, const std::vector< const TensorInfo * > &outputs, const SliceDescriptor *sliceDescriptor)
Definition: SliceOperator.cpp:8
armnn
Copyright (c) 2021 ARM Limited and Contributors.
Definition: 01_00_quick_start.dox:6
GetTosaMapping
TosaSerializationBasicBlock * GetTosaMapping(const Layer *layer, const LayerType type, const std::vector< const TensorInfo * > &inputs, const std::vector< const TensorInfo * > &outputs, const BaseDescriptor &descriptor)
Definition: TosaMappings.cpp:18
armnn::LayerType
LayerType
When adding a new layer, adapt also the LastLayer enum value in the enum class LayerType below.
Definition: Types.hpp:466
armnn::LayerType::Reshape
@ Reshape
armnn::Layer::GetType
LayerType GetType() const override
Returns the armnn::LayerType of this layer.
Definition: Layer.hpp:273
armnn::Layer::GetParameters
virtual const BaseDescriptor & GetParameters() const override
If the layer has a descriptor return it.
Definition: Layer.hpp:365
armnn::Layer::GetOutputSlots
const std::vector< OutputSlot > & GetOutputSlots() const
Definition: Layer.hpp:246
armnn::LayerType::Pooling2d
@ Pooling2d
ConvertTransposeConv2dToTosaOperator
TosaSerializationBasicBlock * ConvertTransposeConv2dToTosaOperator(const Layer *layer, const std::vector< const TensorInfo * > &inputs, const std::vector< const TensorInfo * > &outputs, const TransposeConvolution2dDescriptor *descriptor)
Definition: TransposeConv2dOperator.cpp:10
ConvertConcatToTosaOperator
TosaSerializationBasicBlock * ConvertConcatToTosaOperator(const Layer *layer, const std::vector< const TensorInfo * > &inputs, const std::vector< const TensorInfo * > &outputs, const OriginsDescriptor *concatDescriptor)
Definition: ConcatOperator.cpp:8
armnn::LayerType::Constant
@ Constant
ConvertTransposeToTosaOperator
TosaSerializationBasicBlock * ConvertTransposeToTosaOperator(const Layer *layer, const std::vector< const TensorInfo * > &inputs, const std::vector< const TensorInfo * > &outputs, const TransposeDescriptor *transposeDescriptor)
Definition: TransposeOperator.cpp:8
armnn::LayerType::ElementwiseUnary
@ ElementwiseUnary
ConvertPooling2DToTosaOperator
TosaSerializationBasicBlock * ConvertPooling2DToTosaOperator(const Layer *layer, const std::vector< const TensorInfo * > &inputs, const std::vector< const TensorInfo * > &outputs, const Pooling2dDescriptor *poolDescriptor)
Definition: Pooling2DOperator.cpp:8
armnn::Layer::GetInputSlots
const std::vector< InputSlot > & GetInputSlots() const
Definition: Layer.hpp:245
armnn::BaseDescriptor
Base class for all descriptors.
Definition: Descriptors.hpp:22
armnn::PoolingAlgorithm::Average
@ Average
armnn::LayerType::Concat
@ Concat
ConvertReshapeToTosaOperator
TosaSerializationBasicBlock * ConvertReshapeToTosaOperator(const Layer *layer, const std::vector< const TensorInfo * > &inputs, const std::vector< const TensorInfo * > &outputs, const ReshapeDescriptor *reshapeDescriptor)
Definition: ReshapeOperator.cpp:8
ConvertConv2dToTosaOperator
TosaSerializationBasicBlock * ConvertConv2dToTosaOperator(const Layer *layer, const std::vector< const TensorInfo * > &inputs, const std::vector< const TensorInfo * > &outputs, const Convolution2dDescriptor *conv2dDescriptor)
Definition: Conv2dOperator.cpp:8
armnn::LayerType::Multiplication
@ Multiplication
GetTosaMappingFromLayer
TosaSerializationBasicBlock * GetTosaMappingFromLayer(Layer *layer)
Definition: TosaMappings.cpp:99