IVGCVSW-2839 Add QuantisedSymm16 support to the ArmNN frontend

Change-Id: I76f4e7db55b0efbb1a5f7d1a32bf451e66add0c7
Signed-off-by: Nattapat Chaimanowong <nattapat.chaimanowong@arm.com>
diff --git a/include/armnn/Types.hpp b/include/armnn/Types.hpp
index 598eaaf..36e3c5b 100644
--- a/include/armnn/Types.hpp
+++ b/include/armnn/Types.hpp
@@ -29,7 +29,8 @@
     Float32 = 1,
     QuantisedAsymm8 = 2,
     Signed32 = 3,
-    Boolean = 4
+    Boolean = 4,
+    QuantisedSymm16 = 5
 };
 
 enum class DataLayout
diff --git a/include/armnn/TypesUtils.hpp b/include/armnn/TypesUtils.hpp
index e765264..b5fb95d 100644
--- a/include/armnn/TypesUtils.hpp
+++ b/include/armnn/TypesUtils.hpp
@@ -83,6 +83,7 @@
         case DataType::Float32:
         case DataType::Signed32:         return 4U;
         case DataType::QuantisedAsymm8:  return 1U;
+        case DataType::QuantisedSymm16:  return 2U;
         case DataType::Boolean:          return 1U;
         default:                         return 0U;
     }
@@ -128,6 +129,7 @@
         case DataType::Float16:         return "Float16";
         case DataType::Float32:         return "Float32";
         case DataType::QuantisedAsymm8: return "Unsigned8";
+        case DataType::QuantisedSymm16: return "Signed16";
         case DataType::Signed32:        return "Signed32";
         case DataType::Boolean:         return "Boolean";
 
diff --git a/src/armnn/CompatibleTypes.hpp b/src/armnn/CompatibleTypes.hpp
index 2449876..4e31aed 100644
--- a/src/armnn/CompatibleTypes.hpp
+++ b/src/armnn/CompatibleTypes.hpp
@@ -36,6 +36,12 @@
 }
 
 template<>
+inline bool CompatibleTypes<int16_t>(DataType dataType)
+{
+    return dataType == DataType::QuantisedSymm16;
+}
+
+template<>
 inline bool CompatibleTypes<int32_t>(DataType dataType)
 {
     return dataType == DataType::Signed32;
diff --git a/src/armnn/TypeUtils.hpp b/src/armnn/TypeUtils.hpp
index f7d0e07..55269f4 100644
--- a/src/armnn/TypeUtils.hpp
+++ b/src/armnn/TypeUtils.hpp
@@ -33,6 +33,12 @@
 };
 
 template<>
+struct ResolveTypeImpl<DataType::QuantisedSymm16>
+{
+    using Type = int16_t;
+};
+
+template<>
 struct ResolveTypeImpl<DataType::Signed32>
 {
     using Type = int32_t;
diff --git a/src/armnnDeserializer/Deserializer.cpp b/src/armnnDeserializer/Deserializer.cpp
index fc84462..152a5b4 100644
--- a/src/armnnDeserializer/Deserializer.cpp
+++ b/src/armnnDeserializer/Deserializer.cpp
@@ -373,6 +373,9 @@
         case DataType_QuantisedAsymm8:
             type = armnn::DataType::QuantisedAsymm8;
             break;
+        case DataType_QuantisedSymm16:
+            type = armnn::DataType::QuantisedSymm16;
+            break;
         case DataType_Signed32:
             type = armnn::DataType::Signed32;
             break;
diff --git a/src/armnnSerializer/ArmnnSchema.fbs b/src/armnnSerializer/ArmnnSchema.fbs
index 00c1a45..a11eead 100644
--- a/src/armnnSerializer/ArmnnSchema.fbs
+++ b/src/armnnSerializer/ArmnnSchema.fbs
@@ -27,7 +27,8 @@
     Float32 = 1,
     QuantisedAsymm8 = 2,
     Signed32 = 3,
-    Boolean = 4
+    Boolean = 4,
+    QuantisedSymm16 = 5
 }
 
 enum DataLayout : byte {
diff --git a/src/armnnSerializer/Serializer.cpp b/src/armnnSerializer/Serializer.cpp
index 0340f56..cf67022 100644
--- a/src/armnnSerializer/Serializer.cpp
+++ b/src/armnnSerializer/Serializer.cpp
@@ -855,6 +855,15 @@
             fbPayload = flatBuffersData.o;
             break;
         }
+        case armnn::DataType::QuantisedSymm16:
+        {
+            auto fbVector = CreateDataVector<int16_t>(constTensor.GetMemoryArea(), constTensor.GetNumBytes());
+            flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
+                    m_flatBufferBuilder,
+                    fbVector);
+            fbPayload = flatBuffersData.o;
+            break;
+        }
         case armnn::DataType::QuantisedAsymm8:
         case armnn::DataType::Boolean:
         default: