IVGCVSW-3301 Support PAD_V2 in HAL1.2 driver

Signed-off-by: Aron Virginas-Tar <Aron.Virginas-Tar@arm.com>
Change-Id: If3da7b9015fb816bb27b85ab491102005859b3b0
diff --git a/ConversionUtils.hpp b/ConversionUtils.hpp
index 9a711cb..d30b8a4 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 @@
 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,