IVGCVSW-3235 Add scalar to use as padding value in Reference Pad

Signed-off-by: David Monahan <david.monahan@arm.com>
Change-Id: If050f318fcb7626bbfae1b8737a1d232a4a5a915
diff --git a/src/backends/reference/workloads/Pad.cpp b/src/backends/reference/workloads/Pad.cpp
index 7a928a1..1e58124 100644
--- a/src/backends/reference/workloads/Pad.cpp
+++ b/src/backends/reference/workloads/Pad.cpp
@@ -5,8 +5,10 @@
 
 #include "Pad.hpp"
 #include "backendsCommon/WorkloadData.hpp"
-#include <boost/numeric/conversion/cast.hpp>
 #include "TensorBufferArrayView.hpp"
+#include "Encoders.hpp"
+
+#include <boost/numeric/conversion/cast.hpp>
 #include <cmath>
 #include <cstddef>
 #include <functional>
@@ -15,12 +17,25 @@
 
 namespace armnn
 {
+
+template <typename T>
+T ConvertToDataType(const float& value,
+                    const armnn::TensorInfo& tensorInfo)
+{
+    std::vector<T> output(1);
+    std::unique_ptr<armnn::Encoder<float>> pEncoder = armnn::MakeEncoder<float>(tensorInfo, output.data());
+    armnn::Encoder<float>& rEncoder = *pEncoder;
+    rEncoder.Set(value);
+    return output[0];
+}
+
 template <typename T>
 void Pad(const TensorInfo& inputInfo,
          const TensorInfo& outputInfo,
-         std::vector<std::pair<unsigned int, unsigned int>> m_PadList,
+         std::vector<std::pair<unsigned int, unsigned int>> m_padList,
          const T* inputData,
-         T* outData)
+         T* outData,
+         const float padValue)
 {
     unsigned int numOutputElements = outputInfo.GetNumElements();
 
@@ -45,9 +60,11 @@
     unsigned int outputHeight = 0;
     unsigned int outputWidth = 0;
 
+    T convertedPadValue = ConvertToDataType<T>(padValue, inputInfo);
+
     for (unsigned int i = 0; i < numOutputElements; ++i)
     {
-       outData[i] = 0;
+       outData[i] = convertedPadValue;
     }
 
     switch(numInputDimensions) {
@@ -58,7 +75,7 @@
 
             for (unsigned int w = 0; w < inputWidth ; w++)
             {
-                outData[w+std::get<0>(m_PadList[0])] = inputData[w];
+                outData[w+std::get<0>(m_padList[0])] = inputData[w];
             }
 
             break;
@@ -74,8 +91,8 @@
             {
                 for (unsigned int w = 0; w < inputWidth ; w++)
                 {
-                    outData[(h+std::get<0>(m_PadList[0]))*outputWidth
-                    + (w+std::get<0>(m_PadList[1]))] = inputData[h * inputWidth + w];
+                    outData[(h+std::get<0>(m_padList[0]))*outputWidth
+                    + (w+std::get<0>(m_padList[1]))] = inputData[h * inputWidth + w];
                 }
             }
 
@@ -96,9 +113,9 @@
                 {
                     for (unsigned int w = 0; w < inputWidth ; w++)
                     {
-                        outData[(c+std::get<0>(m_PadList[0]))*outputHeight*outputWidth
-                        + (h+std::get<0>(m_PadList[1]))*outputWidth
-                        + (w+std::get<0>(m_PadList[2]))] = inputData[c * inputHeight * inputWidth
+                        outData[(c+std::get<0>(m_padList[0]))*outputHeight*outputWidth
+                        + (h+std::get<0>(m_padList[1]))*outputWidth
+                        + (w+std::get<0>(m_padList[2]))] = inputData[c * inputHeight * inputWidth
                                                                       + h * inputWidth
                                                                       + w];
                     }
@@ -125,10 +142,10 @@
                     {
                         for (unsigned int w = 0; w < inputWidth ; w++)
                         {
-                            outData[(b+std::get<0>(m_PadList[0])) * outputChannels * outputHeight * outputWidth
-                                   + (c+std::get<0>(m_PadList[1])) * outputHeight * outputWidth
-                                   + (h+std::get<0>(m_PadList[2])) * outputWidth
-                                   + (w+std::get<0>(m_PadList[3]))] = inputData[b * inputChannels * inputHeight
+                            outData[(b+std::get<0>(m_padList[0])) * outputChannels * outputHeight * outputWidth
+                                   + (c+std::get<0>(m_padList[1])) * outputHeight * outputWidth
+                                   + (h+std::get<0>(m_padList[2])) * outputWidth
+                                   + (w+std::get<0>(m_padList[3]))] = inputData[b * inputChannels * inputHeight
                                                                                 * inputWidth
                                                                              + c * inputHeight * inputWidth
                                                                              + h * inputWidth
@@ -150,11 +167,13 @@
                          const TensorInfo& outputInfo,
                          std::vector<std::pair<unsigned int, unsigned int>> m_PadList,
                          const float* inputData,
-                         float* outData);
+                         float* outData,
+                         const float padValue);
 template void Pad<uint8_t>(const TensorInfo& inputInfo,
                            const TensorInfo& outputInfo,
                            std::vector<std::pair<unsigned int, unsigned int>> m_PadList,
                            const uint8_t* inputData,
-                           uint8_t* outData);
+                           uint8_t* outData,
+                           const float padValue);
 
 } //namespace armnn
\ No newline at end of file