IVGCVSW-4517 Implement BFloat16 Encoder and Decoder

 * Add ConvertFloat32ToBFloat16
 * Add ConvertBFloat16ToFloat32
 * Add BFloat16Encoder
 * Add BFloat16Decoder
 * Unit tests

Signed-off-by: Narumol Prangnawarat <narumol.prangnawarat@arm.com>
Change-Id: I198888384c923aba28cfbed09a02edc6f8194b3e
diff --git a/src/backends/reference/workloads/BaseIterator.hpp b/src/backends/reference/workloads/BaseIterator.hpp
index c482018..3f01446 100644
--- a/src/backends/reference/workloads/BaseIterator.hpp
+++ b/src/backends/reference/workloads/BaseIterator.hpp
@@ -194,6 +194,23 @@
     const int32_t m_Offset;
 };
 
+class BFloat16Decoder : public TypedIterator<const BFloat16, Decoder<float>>
+{
+public:
+    BFloat16Decoder(const BFloat16* data)
+        : TypedIterator(data) {}
+
+    BFloat16Decoder()
+        : BFloat16Decoder(nullptr) {}
+
+    float Get() const override
+    {
+        float val = 0.f;
+        armnnUtils::FloatingPointConverter::ConvertBFloat16ToFloat32(m_Iterator, 1, &val);
+        return val;
+    }
+};
+
 class Float16Decoder : public TypedIterator<const Half, Decoder<float>>
 {
 public:
@@ -355,6 +372,28 @@
     const int32_t m_Offset;
 };
 
+class BFloat16Encoder : public TypedIterator<armnn::BFloat16, Encoder<float>>
+{
+public:
+    BFloat16Encoder(armnn::BFloat16* data)
+        : TypedIterator(data) {}
+
+    BFloat16Encoder()
+        : BFloat16Encoder(nullptr) {}
+
+    void Set(float right) override
+    {
+        armnnUtils::FloatingPointConverter::ConvertFloat32ToBFloat16(&right, 1, m_Iterator);
+    }
+
+    float Get() const override
+    {
+        float val = 0.f;
+        armnnUtils::FloatingPointConverter::ConvertBFloat16ToFloat32(m_Iterator, 1, &val);
+        return val;
+    }
+};
+
 class Float16Encoder : public TypedIterator<Half, Encoder<float>>
 {
 public: