IVGCVSW-3369 Add conversion method to HAL1.2 Policy for PReLU activation

 * Added ConvertPrelu method to HalPolicy V1.2

Signed-off-by: Matteo Martincigh <matteo.martincigh@arm.com>
Change-Id: I8248d2e2bd236295845da665b2d4e687478368ef
diff --git a/1.2/HalPolicy.cpp b/1.2/HalPolicy.cpp
index b3b1d69..4e638cf 100644
--- a/1.2/HalPolicy.cpp
+++ b/1.2/HalPolicy.cpp
@@ -121,19 +121,23 @@
 
         return hal_1_0::HalPolicy::ConvertOperation(v10Operation, v10Model, data);
     }
-    else if (HandledByV1_1(operation) && compliantWithV1_1(model))
+
+    if (HandledByV1_1(operation) && compliantWithV1_1(model))
     {
         hal_1_1::HalPolicy::Operation v11Operation = ConvertToV1_1(operation);
         hal_1_1::HalPolicy::Model v11Model = convertToV1_1(model);
 
         return hal_1_1::HalPolicy::ConvertOperation(v11Operation, v11Model, data);
     }
+
     switch (operation.type)
     {
         case V1_2::OperationType::CONV_2D:
             return ConvertConv2d(operation, model, data);
         case V1_2::OperationType::DEPTHWISE_CONV_2D:
             return ConvertDepthwiseConv2d(operation, model, data);
+        case V1_2::OperationType::PRELU:
+            return ConvertPrelu(operation, model, data);
         default:
             return Fail("%s: Operation type %s not supported in ArmnnDriver",
                         __func__, toString(operation.type).c_str());
@@ -418,5 +422,49 @@
     return SetupAndTrackLayerOutputSlot<hal_1_2::HalPolicy>(operation, 0, *endLayer, model, data);
 }
 
+bool HalPolicy::ConvertPrelu(const Operation& operation, const Model& model, ConversionData& data)
+{
+    LayerInputHandle input = ConvertToLayerInputHandle<hal_1_2::HalPolicy>(operation, 0, model, data);
+    LayerInputHandle alpha = ConvertToLayerInputHandle<hal_1_2::HalPolicy>(operation, 1, model, data);
+
+    if (!input.IsValid() || !alpha.IsValid())
+    {
+        return Fail("%s: Operation has invalid inputs", __func__);
+    }
+
+    const Operand* output = GetOutputOperand<hal_1_2::HalPolicy>(operation, 0, model);
+
+    if (!output)
+    {
+        return Fail("%s: Could not read output 0", __func__);
+    }
+
+    const armnn::TensorInfo& inputInfo  = input.GetTensorInfo();
+    const armnn::TensorInfo& alphaInfo  = alpha.GetTensorInfo();
+    const armnn::TensorInfo& outputInfo = GetTensorInfoForOperand(*output);
+
+    if (!IsLayerSupportedForAnyBackend(__func__,
+                                       armnn::IsPreluSupported,
+                                       data.m_Backends,
+                                       inputInfo,
+                                       alphaInfo,
+                                       outputInfo))
+    {
+        return false;
+    }
+
+    armnn::IConnectableLayer* const layer = data.m_Network->AddPreluLayer();
+
+    if (!layer)
+    {
+        return Fail("%s: AddPreluLayer failed", __func__);
+    }
+
+    input.Connect(layer->GetInputSlot(0));
+    alpha.Connect(layer->GetInputSlot(1));
+
+    return SetupAndTrackLayerOutputSlot<hal_1_2::HalPolicy>(operation, 0, *layer, model, data);
+}
+
 } // namespace hal_1_2
-} // namespace armnn_driver
\ No newline at end of file
+} // namespace armnn_driver
diff --git a/1.2/HalPolicy.hpp b/1.2/HalPolicy.hpp
index 516e1eb..0966145 100644
--- a/1.2/HalPolicy.hpp
+++ b/1.2/HalPolicy.hpp
@@ -31,7 +31,8 @@
 private:
     static bool ConvertConv2d(const Operation& operation, const Model& model, ConversionData& data);
     static bool ConvertDepthwiseConv2d(const Operation& operation, const Model& model, ConversionData& data);
+    static bool ConvertPrelu(const Operation& operation, const Model& model, ConversionData& data);
 };
 
 } // namespace hal_1_2
-} // namespace armnn_driver
\ No newline at end of file
+} // namespace armnn_driver
diff --git a/Android.mk b/Android.mk
index 8f598ca..bee57dd 100644
--- a/Android.mk
+++ b/Android.mk
@@ -327,15 +327,15 @@
         1.1/HalPolicy.cpp \
         1.2/ArmnnDriverImpl.cpp \
         1.2/HalPolicy.cpp \
-        ArmnnDriverImpl.cpp \
-        DriverOptions.cpp \
         ArmnnDevice.cpp \
+        ArmnnDriverImpl.cpp \
         ArmnnPreparedModel.cpp \
         ArmnnPreparedModel_1_2.cpp \
+        ConversionUtils.cpp \
+        DriverOptions.cpp \
         ModelToINetworkConverter.cpp \
         RequestThread.cpp \
-        Utils.cpp \
-        ConversionUtils.cpp
+        Utils.cpp
 
 LOCAL_STATIC_LIBRARIES := \
         libneuralnetworks_common \