IVGCVSW-4508 Add BFloat16 data type

Signed-off-by: Narumol Prangnawarat <narumol.prangnawarat@arm.com>
Change-Id: Ie2fcf06d0bae9e2ef958e60ab9e8b121fdc7b590
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f55f391..6ab89a4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -41,6 +41,7 @@
     include/armnnUtils/FloatingPointConverter.hpp
     include/armnnUtils/TensorUtils.hpp
     include/armnnUtils/Transpose.hpp
+    src/armnnUtils/BFloat16.hpp
     src/armnnUtils/Filesystem.hpp
     src/armnnUtils/Filesystem.cpp
     src/armnnUtils/Processes.hpp
diff --git a/include/armnn/Types.hpp b/include/armnn/Types.hpp
index d66a1fd..29a0d4e 100644
--- a/include/armnn/Types.hpp
+++ b/include/armnn/Types.hpp
@@ -40,6 +40,7 @@
     QuantizedSymm8PerAxis ARMNN_DEPRECATED_ENUM_MSG("Per Axis property inferred by number of scales in TensorInfo") = 6,
     QSymmS8 = 7,
     QAsymmS8 = 8,
+    BFloat16 = 9,
 
     QuantisedAsymm8 ARMNN_DEPRECATED_ENUM_MSG("Use DataType::QAsymmU8 instead.") = QAsymmU8,
     QuantisedSymm16 ARMNN_DEPRECATED_ENUM_MSG("Use DataType::QSymmS16 instead.") = QSymmS16
diff --git a/include/armnn/TypesUtils.hpp b/include/armnn/TypesUtils.hpp
index 53a933b..5065152 100644
--- a/include/armnn/TypesUtils.hpp
+++ b/include/armnn/TypesUtils.hpp
@@ -116,6 +116,7 @@
 {
     switch (dataType)
     {
+        case DataType::BFloat16:
         case DataType::Float16:               return 2U;
         case DataType::Float32:
         case DataType::Signed32:              return 4U;
@@ -179,6 +180,7 @@
         case DataType::QSymmS16:              return "QSymm16";
         case DataType::Signed32:              return "Signed32";
         case DataType::Boolean:               return "Boolean";
+        case DataType::BFloat16:              return "BFloat16";
 
         default:
             return "Unknown";
diff --git a/src/armnn/ResolveType.hpp b/src/armnn/ResolveType.hpp
index 6630934..e1bea42 100644
--- a/src/armnn/ResolveType.hpp
+++ b/src/armnn/ResolveType.hpp
@@ -6,6 +6,7 @@
 #pragma once
 
 #include "armnn/Types.hpp"
+#include "BFloat16.hpp"
 #include "Half.hpp"
 
 namespace armnn
@@ -62,6 +63,12 @@
     using Type = uint8_t;
 };
 
+template<>
+struct ResolveTypeImpl<DataType::BFloat16>
+{
+    using Type = BFloat16;
+};
+
 template<DataType DT>
 using ResolveType = typename ResolveTypeImpl<DT>::Type;
 
diff --git a/src/armnn/test/UtilsTests.cpp b/src/armnn/test/UtilsTests.cpp
index 4c371d6..faf4480 100644
--- a/src/armnn/test/UtilsTests.cpp
+++ b/src/armnn/test/UtilsTests.cpp
@@ -85,6 +85,25 @@
     BOOST_CHECK((GetDataTypeName(armnn::DataType::Float16) == std::string("Float16")));
 }
 
+BOOST_AUTO_TEST_CASE(BFloatType)
+{
+    armnn::BFloat16 a = 16256;
+
+    // Test BFloat16 type
+    BOOST_CHECK_EQUAL(sizeof(a), 2);
+
+    // Test utility function returns correct type.
+    using ResolvedType = armnn::ResolveType<armnn::DataType::BFloat16>;
+    constexpr bool isBFloat16Type = std::is_same<armnn::BFloat16, ResolvedType>::value;
+    BOOST_CHECK(isBFloat16Type);
+
+    //Test utility functions return correct size
+    BOOST_CHECK(GetDataTypeSize(armnn::DataType::BFloat16) == 2);
+
+    //Test utility functions return correct name
+    BOOST_CHECK((GetDataTypeName(armnn::DataType::BFloat16) == std::string("BFloat16")));
+}
+
 BOOST_AUTO_TEST_CASE(GraphTopologicalSortSimpleTest)
 {
     std::map<int, std::vector<int>> graph;
diff --git a/src/armnnUtils/BFloat16.hpp b/src/armnnUtils/BFloat16.hpp
new file mode 100644
index 0000000..bce45aa
--- /dev/null
+++ b/src/armnnUtils/BFloat16.hpp
@@ -0,0 +1,13 @@
+//
+// Copyright © 2020 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#pragma once
+
+#include <stdint.h>
+
+namespace armnn
+{
+    using BFloat16 = uint16_t;
+} //namespace armnn