IVGCVSW-3845 Add Reference FP16 support for required layers

* Working on layers required by FSRCNN, FCRN and DeepSpeaker
* Updates RefLayerSupport and RefWorkloadFactory methods
* Adds RefPadFloat16Workload
* Tested by successful execution of these networks on Reference FP16 backend

Signed-off-by: Matthew Jackson <matthew.jackson@arm.com>
Change-Id: I4817dca0a89bba6902f0feffc494b27a26a0ab2d
diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp
index 5692f9e..4958968 100644
--- a/src/backends/reference/RefLayerSupport.cpp
+++ b/src/backends/reference/RefLayerSupport.cpp
@@ -100,8 +100,9 @@
    bool supported = true;
 
     // Define supported types.
-    std::array<DataType,3> supportedTypes = {
+    std::array<DataType,4> supportedTypes = {
         DataType::Float32,
+        DataType::Float16,
         DataType::QuantisedAsymm8,
         DataType::QuantisedSymm16
     };
@@ -162,8 +163,9 @@
 {
     bool supported = true;
 
-    std::array<DataType,3> supportedTypes = {
+    std::array<DataType,4> supportedTypes = {
         DataType::Float32,
+        DataType::Float16,
         DataType::QuantisedAsymm8,
         DataType::QuantisedSymm16
     };
@@ -375,8 +377,9 @@
     bool supported = true;
 
     // Define supported types.
-    std::array<DataType,3> supportedTypes = {
+    std::array<DataType,4> supportedTypes = {
             DataType::Float32,
+            DataType::Float16,
             DataType::QuantisedAsymm8,
             DataType::QuantisedSymm16
     };
@@ -398,8 +401,9 @@
 
     if (biases.has_value())
     {
-        std::array<DataType,2> biasesSupportedTypes = {
+        std::array<DataType,3> biasesSupportedTypes = {
                 DataType::Float32,
+                DataType::Float16,
                 DataType::Signed32
         };
         supported &= CheckSupportRule(TypeAnyOf(biases.value(), biasesSupportedTypes), reasonIfUnsupported,
@@ -445,9 +449,10 @@
     bool supported = true;
 
     // Define supported types.
-    std::array<DataType,3> supportedTypes =
+    std::array<DataType,4> supportedTypes =
     {
         DataType::Float32,
+        DataType::Float16,
         DataType::QuantisedAsymm8,
         DataType::QuantisedSymm16
     };
@@ -469,9 +474,10 @@
 
     if (biases.has_value())
     {
-        std::array<DataType,2> biasesSupportedTypes =
+        std::array<DataType,3> biasesSupportedTypes =
         {
             DataType::Float32,
+            DataType::Float16,
             DataType::Signed32
         };
         supported &= CheckSupportRule(TypeAnyOf(biases.value(), biasesSupportedTypes), reasonIfUnsupported,
@@ -656,9 +662,10 @@
     bool supported = true;
 
     // Define supported types.
-    std::array<DataType,3> supportedTypes =
+    std::array<DataType,4> supportedTypes =
     {
             DataType::Float32,
+            DataType::Float16,
             DataType::QuantisedAsymm8,
             DataType::QuantisedSymm16
     };
@@ -681,10 +688,11 @@
     if (descriptor.m_BiasEnabled)
     {
         // Defined supported types for bias
-        std::array<DataType, 2>
+        std::array<DataType, 3>
         supportedBiasTypes =
         {
             DataType::Float32,
+            DataType::Float16,
             DataType::Signed32
         };
 
@@ -772,9 +780,10 @@
 {
     ignore_unused(descriptor);
     // Define supported types
-    std::array<DataType, 3> supportedTypes =
+    std::array<DataType, 4> supportedTypes =
     {
         DataType::Float32,
+        DataType::Float16,
         DataType::QuantisedAsymm8,
         DataType::QuantisedSymm16
     };
@@ -950,9 +959,10 @@
     std::string meanLayerStr = "Mean";
     std::string outputTensorStr = "output";
 
-    std::array<DataType,3> supportedTypes =
+    std::array<DataType,4> supportedTypes =
     {
         DataType::Float32,
+        DataType::Float16,
         DataType::QuantisedAsymm8,
         DataType::QuantisedSymm16
     };
@@ -1077,8 +1087,9 @@
 {
     bool supported = true;
 
-    std::array<DataType,3> supportedTypes = {
+    std::array<DataType,4> supportedTypes = {
         DataType::Float32,
+        DataType::Float16,
         DataType::QuantisedAsymm8,
         DataType::QuantisedSymm16
     };
@@ -1150,9 +1161,10 @@
     bool supported = true;
 
     // Define supported output and inputs types.
-    std::array<DataType,3> supportedTypes =
+    std::array<DataType,4> supportedTypes =
     {
         DataType::Float32,
+        DataType::Float16,
         DataType::QuantisedAsymm8,
         DataType::QuantisedSymm16
     };
@@ -1206,9 +1218,10 @@
     bool supported = true;
 
     // Define supported output and inputs types.
-    std::array<DataType,3> supportedTypes =
+    std::array<DataType,4> supportedTypes =
     {
         DataType::Float32,
+        DataType::Float16,
         DataType::QuantisedAsymm8,
         DataType::QuantisedSymm16
     };
@@ -1606,9 +1619,10 @@
 {
     bool supported = true;
 
-    std::array<DataType,3> supportedTypes =
+    std::array<DataType,4> supportedTypes =
     {
             DataType::Float32,
+            DataType::Float16,
             DataType::QuantisedAsymm8,
             DataType::QuantisedSymm16
     };
@@ -1630,9 +1644,10 @@
 
     if (biases.has_value())
     {
-        std::array<DataType,2> biasesSupportedTypes =
+        std::array<DataType,3> biasesSupportedTypes =
         {
                 DataType::Float32,
+                DataType::Float16,
                 DataType::Signed32
         };
         supported &= CheckSupportRule(TypeAnyOf(biases.value(), biasesSupportedTypes), reasonIfUnsupported,