COMPMID-3105: Update pad layer to PadV2

Adds the ability to set the padding value in the pad layer node.

Change-Id: I2f323146cbdfdfd6cfd617ee4bcafb5ffafedbbb
Signed-off-by: Georgios Pinitas <georgios.pinitas@arm.com>
Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/2727
Reviewed-by: Michele Di Giorgio <michele.digiorgio@arm.com>
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Tested-by: Arm Jenkins <bsgcomp@arm.com>
diff --git a/arm_compute/graph/GraphBuilder.h b/arm_compute/graph/GraphBuilder.h
index 23541c4..612703c 100644
--- a/arm_compute/graph/GraphBuilder.h
+++ b/arm_compute/graph/GraphBuilder.h
@@ -335,15 +335,16 @@
                                                 ITensorAccessorUPtr mean_accessor = nullptr, ITensorAccessorUPtr std_accessor = nullptr);
     /** Adds a pad layer node to the graph
      *
-     * @param[in] g       Graph to add the node to
-     * @param[in] params  Common node parameters
-     * @param[in] input   Input to the reshape layer node as a NodeID-Index pair
-     * @param[in] padding The padding for each spatial dimension of the input tensor. The pair padding[i]
-     *                    specifies the front and the end padding in the i-th dimension.
+     * @param[in] g         Graph to add the node to
+     * @param[in] params    Common node parameters
+     * @param[in] input     Input to the reshape layer node as a NodeID-Index pair
+     * @param[in] paddings  The padding for each spatial dimension of the input tensor. The pair padding[i]
+     *                      specifies the front and the end padding in the i-th dimension.
+     * @param[in] pad_value Padding value to be used. Defaults to 0
      *
      * @return Node ID of the created node, EmptyNodeID in case of error
      */
-    static NodeID add_pad_node(Graph &g, NodeParams params, NodeIdxPair input, PaddingList padding);
+    static NodeID add_pad_node(Graph &g, NodeParams params, NodeIdxPair input, const PaddingList &paddings, PixelValue pad_value = PixelValue());
     /** Adds a permute layer node to the graph
      *
      * @param[in] g      Graph to add the node to
diff --git a/arm_compute/graph/Types.h b/arm_compute/graph/Types.h
index 7c81641..296f757 100644
--- a/arm_compute/graph/Types.h
+++ b/arm_compute/graph/Types.h
@@ -25,6 +25,7 @@
 #define ARM_COMPUTE_GRAPH_TYPES_H
 
 #include "arm_compute/core/Error.h"
+#include "arm_compute/core/PixelValue.h"
 #include "arm_compute/core/Types.h"
 #include "arm_compute/runtime/CL/CLTunerTypes.h"
 
@@ -45,6 +46,7 @@
 using arm_compute::TensorShape;
 using arm_compute::Size2D;
 using arm_compute::PermutationVector;
+using arm_compute::PixelValue;
 
 using arm_compute::ActivationLayerInfo;
 using arm_compute::DetectionOutputLayerInfo;
diff --git a/arm_compute/graph/backends/FunctionHelpers.h b/arm_compute/graph/backends/FunctionHelpers.h
index 9f352ed..20c69bf 100644
--- a/arm_compute/graph/backends/FunctionHelpers.h
+++ b/arm_compute/graph/backends/FunctionHelpers.h
@@ -1048,15 +1048,16 @@
     validate_node<TargetInfo>(node, 1 /* expected inputs */, 1 /* expected outputs */);
 
     // Extract IO and info
-    typename TargetInfo::TensorType *input   = get_backing_tensor<TargetInfo>(node.input(0));
-    typename TargetInfo::TensorType *output  = get_backing_tensor<TargetInfo>(node.output(0));
-    const PaddingList               &padding = node.padding();
+    typename TargetInfo::TensorType *input     = get_backing_tensor<TargetInfo>(node.input(0));
+    typename TargetInfo::TensorType *output    = get_backing_tensor<TargetInfo>(node.output(0));
+    const PaddingList               &padding   = node.padding();
+    const PixelValue                 pad_value = node.pad_value();
     ARM_COMPUTE_ERROR_ON(input == nullptr);
     ARM_COMPUTE_ERROR_ON(output == nullptr);
 
     // Create and configure function
     auto func = support::cpp14::make_unique<PadLayerFunction>();
-    func->configure(input, output, padding);
+    func->configure(input, output, padding, pad_value);
 
     // Log info
     ARM_COMPUTE_LOG_GRAPH_INFO("Instantiated "
diff --git a/arm_compute/graph/frontend/Layers.h b/arm_compute/graph/frontend/Layers.h
index 420f715..61a6fd4 100644
--- a/arm_compute/graph/frontend/Layers.h
+++ b/arm_compute/graph/frontend/Layers.h
@@ -832,11 +832,12 @@
 public:
     /** Construct a pad layer.
      *
-     * @param[in] padding The padding for each spatial dimension of the input tensor. The pair padding[i]
-     *                    specifies the front and the end padding in the i-th dimension.
+     * @param[in] padding   The padding for each spatial dimension of the input tensor. The pair padding[i]
+     *                      specifies the front and the end padding in the i-th dimension.
+     * @param[in] pad_value Padding value to use. Defaults to 0.
      */
-    PadLayer(PaddingList padding)
-        : _padding(padding)
+    PadLayer(PaddingList padding, PixelValue pad_value = PixelValue())
+        : _padding(padding), _pad_value(pad_value)
     {
     }
 
@@ -844,11 +845,12 @@
     {
         NodeParams  common_params = { name(), s.hints().target_hint };
         NodeIdxPair input         = { s.tail_node(), 0 };
-        return GraphBuilder::add_pad_node(s.graph(), common_params, input, _padding);
+        return GraphBuilder::add_pad_node(s.graph(), common_params, input, _padding, _pad_value);
     }
 
 private:
     PaddingList _padding;
+    PixelValue  _pad_value;
 };
 
 /** Permute Layer */
diff --git a/arm_compute/graph/nodes/PadLayerNode.h b/arm_compute/graph/nodes/PadLayerNode.h
index 0b1bdda..852427a 100644
--- a/arm_compute/graph/nodes/PadLayerNode.h
+++ b/arm_compute/graph/nodes/PadLayerNode.h
@@ -36,15 +36,21 @@
 public:
     /** Constructor
      *
-     * @param[in] padding The padding for each spatial dimension of the input tensor. The pair padding[i]
-     *                    specifies the front and the end padding in the i-th dimension.
+     * @param[in] padding   The padding for each spatial dimension of the input tensor. The pair padding[i]
+     *                      specifies the front and the end padding in the i-th dimension.
+     * @param[in] pad_value Padding value to be used. Defaults to 0
      */
-    PadLayerNode(const PaddingList &padding);
+    PadLayerNode(const PaddingList &padding, PixelValue pad_value = PixelValue());
     /** Padding list accessor
      *
      * @return Padding list
      */
     const PaddingList &padding() const;
+    /** Padding value accessor
+     *
+     * @return Padding value
+     */
+    PixelValue pad_value() const;
 
     // Inherited overridden methods:
     NodeType         type() const override;
@@ -54,6 +60,7 @@
 
 private:
     PaddingList _padding;
+    PixelValue  _pad_value;
 };
 } // namespace graph
 } // namespace arm_compute