// // Copyright © 2022-2024 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #include "TosaMappings.hpp" using namespace armnn; using namespace tosa; TosaSerializationBasicBlock* CreateEmptyTosaSerializationBasicBlock() { // Empty basic block when no TOSA mapping implemented/exists auto* op = new TosaSerializationOperator(Op_UNKNOWN, Attribute_NONE, nullptr, {}, {}); return new TosaSerializationBasicBlock("", "", {op}, {}, {}, {}); } TosaSerializationBasicBlock* GetTosaMapping(const Layer* layer, const LayerType type, const std::vector& inputs, const std::vector& outputs, const BaseDescriptor& descriptor) { switch (type) { case LayerType::Activation: { auto activationDesc = PolymorphicDowncast(&descriptor); if (activationDesc->m_Function == ActivationFunction::LeakyReLu) { return ConvertActivationToTosaOperator(layer, inputs, outputs, activationDesc); } else { return CreateEmptyTosaSerializationBasicBlock(); } } case LayerType::Addition: case LayerType::Multiplication: case LayerType::Subtraction: { return ConvertElementwiseBinaryToTosaOperator(layer, type, inputs, outputs); } case LayerType::ElementwiseBinary: { auto binaryDesc = PolymorphicDowncast(&descriptor); return ConvertElementwiseBinaryToTosaOperator(layer, type, inputs, outputs, binaryDesc); } case LayerType::ElementwiseUnary: { auto unaryDesc = PolymorphicDowncast(&descriptor); return ConvertElementwiseUnaryOperator(layer, inputs, outputs, unaryDesc); } case LayerType::Concat: { auto concatDesc = PolymorphicDowncast(&descriptor); return ConvertConcatToTosaOperator(layer, inputs, outputs, concatDesc); } case LayerType::Constant: { return ConvertConstantToTosaOperator(layer, outputs); } case LayerType::Convolution2d: { auto conv2dDesc = PolymorphicDowncast(&descriptor); return ConvertConv2dToTosaOperator(layer, inputs, outputs, conv2dDesc); } case LayerType::Pooling2d: { auto poolDesc = PolymorphicDowncast(&descriptor); bool avgPoolIgnoreValue = (poolDesc->m_PoolType == PoolingAlgorithm::Average) && (poolDesc->m_PaddingMethod == PaddingMethod::IgnoreValue); if (poolDesc->m_PoolType == PoolingAlgorithm::L2) { return CreateEmptyTosaSerializationBasicBlock(); } else if (avgPoolIgnoreValue) { return ConvertAvgPool2DIgnoreValueToTosaOperator(layer, inputs, outputs, poolDesc); } else { return ConvertPooling2DToTosaOperator(layer, inputs, outputs, poolDesc); } } case LayerType::Quantize: { return ConvertQuantizeToTosaOperator(layer, inputs, outputs); } case LayerType::Reshape: { auto reshapeDesc = PolymorphicDowncast(&descriptor); return ConvertReshapeToTosaOperator(layer, inputs, outputs, reshapeDesc); } case LayerType::Resize: { auto resizeDesc = PolymorphicDowncast(&descriptor); return ConvertResizeToTosaOperator(layer, inputs, outputs, resizeDesc); } case LayerType::Slice: { auto sliceDesc = PolymorphicDowncast(&descriptor); return ConvertSliceToTosaOperator(layer, inputs, outputs, sliceDesc); } case LayerType::Splitter: { auto splitDesc = PolymorphicDowncast(&descriptor); return ConvertSplitToTosaOperator(layer, inputs, outputs, splitDesc); } case LayerType::TransposeConvolution2d: { auto transposeConv2dDesc = PolymorphicDowncast(&descriptor); return ConvertTransposeConv2dToTosaOperator(layer, inputs, outputs, transposeConv2dDesc); } case LayerType::Transpose: { auto transposeDesc = PolymorphicDowncast(&descriptor); return ConvertTransposeToTosaOperator(layer, inputs, outputs, transposeDesc); } default: { return CreateEmptyTosaSerializationBasicBlock(); } } } TosaSerializationBasicBlock* GetTosaMappingFromLayer(const Layer* layer) { std::vector inputs; for (auto inputSlot : layer->GetInputSlots()) { inputs.push_back(&inputSlot.GetTensorInfo()); } std::vector outputs; for (auto& outputSlot : layer->GetOutputSlots()) { outputs.push_back(&outputSlot.GetTensorInfo()); } TosaSerializationBasicBlock* basicBlock = GetTosaMapping(layer, layer->GetType(), inputs, outputs, layer->GetParameters()); return basicBlock; }