diff options
author | Aron Virginas-Tar <Aron.Virginas-Tar@arm.com> | 2019-07-05 15:47:07 +0100 |
---|---|---|
committer | Áron Virginás-Tar <aron.virginas-tar@arm.com> | 2019-07-05 15:40:00 +0000 |
commit | cb8ac845da5a6297f7009e26df282a2bfd73f3b9 (patch) | |
tree | eec2028892a95882412ff3cd869771c7a8f46f43 /ConversionUtils.hpp | |
parent | f4a7c7d7feb3a6f0ac91268978d047cb556329fd (diff) | |
download | android-nn-driver-cb8ac845da5a6297f7009e26df282a2bfd73f3b9.tar.gz |
IVGCVSW-3301 Support PAD_V2 in HAL1.2 driver
Signed-off-by: Aron Virginas-Tar <Aron.Virginas-Tar@arm.com>
Change-Id: If3da7b9015fb816bb27b85ab491102005859b3b0
Diffstat (limited to 'ConversionUtils.hpp')
-rw-r--r-- | ConversionUtils.hpp | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/ConversionUtils.hpp b/ConversionUtils.hpp index 9a711cb7..d30b8a4e 100644 --- a/ConversionUtils.hpp +++ b/ConversionUtils.hpp @@ -5,11 +5,12 @@ #pragma once +#include "Utils.hpp" + #include <armnn/ArmNN.hpp> #include "armnn/src/armnnUtils/DataLayoutIndexed.hpp" #include "armnn/src/armnnUtils/Permute.hpp" -#include "Utils.hpp" #include <ActivationFunctor.h> #include <CpuExecutor.h> @@ -1139,6 +1140,49 @@ bool ConvertToActivation(const HalOperation& operation, template<typename HalPolicy, typename HalOperation = typename HalPolicy::Operation, typename HalModel = typename HalPolicy::Model> +bool ConvertPaddings(const HalOperation& operation, + const HalModel& model, + ConversionData& data, + unsigned int rank, + armnn::PadDescriptor& padDescriptor) +{ + using HalOperand = typename HalPolicy::Operand; + + const HalOperand* paddingsOperand = GetInputOperand<HalPolicy>(operation, 1, model); + if (!paddingsOperand) + { + return Fail("%s: Could not read paddings operand", __func__); + } + + armnn::TensorShape paddingsOperandShape = GetTensorShapeForOperand(*paddingsOperand); + if (paddingsOperandShape.GetNumDimensions() != 2 || paddingsOperandShape.GetNumElements() != rank * 2) + { + return Fail("%s: Operation has invalid paddings operand: expected shape [%d, 2]", __func__, rank); + } + + std::vector<int32_t> paddings; + GetTensorInt32Values<HalPolicy>(*paddingsOperand, paddings, model, data); + + // add padding for each dimension of input tensor. + for (unsigned int i = 0; i < paddings.size() - 1; i += 2) + { + int paddingBeforeInput = paddings[i]; + int paddingAfterInput = paddings[i + 1]; + + if (paddingBeforeInput < 0 || paddingAfterInput < 0) + { + return Fail("%s: Operation has invalid paddings operand, invalid padding values.", __func__); + } + + padDescriptor.m_PadList.emplace_back((unsigned int) paddingBeforeInput, (unsigned int) paddingAfterInput); + } + + return true; +} + +template<typename HalPolicy, + typename HalOperation = typename HalPolicy::Operation, + typename HalModel = typename HalPolicy::Model> bool ConvertPooling2d(const HalOperation& operation, const char* operationName, armnn::PoolingAlgorithm poolType, |