IVGCVSW-5829 Segfault in tflite-parser, int8 models

 * Updated ParseSplit TfLiteParser function to read correct axis data.
 * Improved validation in ParseSplit and ParseSplitV function.
 * Added TensorFlow BOOL support to TfLiteParser.
 * Added supported ElementWiseUnary operators to TfLiteParser
   E.g. ABS, LOGICAL_NOT and RSQRT.
 * Removed ParseExp and ParseNeg function implementation in favour
   of reusable ParseElementWiseUnary function.
 * Removed Exp.cpp and Neg.cpp files and moved tests to ElementWiseUnary.cpp.

Signed-off-by: Matthew Sloyan <matthew.sloyan@arm.com>
Change-Id: Ibce36e3ce4d95755dda88abc2ddde1e07e62c5e2
diff --git a/src/armnnTfLiteParser/test/ElementWiseUnary.cpp b/src/armnnTfLiteParser/test/ElementWiseUnary.cpp
new file mode 100644
index 0000000..dc236d2
--- /dev/null
+++ b/src/armnnTfLiteParser/test/ElementWiseUnary.cpp
@@ -0,0 +1,148 @@
+//
+// Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include <boost/test/unit_test.hpp>
+#include "ParserFlatbuffersFixture.hpp"
+#include "../TfLiteParser.hpp"
+
+#include <string>
+
+BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)
+
+struct ElementWiseUnaryFixture : public ParserFlatbuffersFixture
+{
+    explicit ElementWiseUnaryFixture(const std::string& operatorCode,
+                                     const std::string& dataType,
+                                     const std::string& inputShape,
+                                     const std::string& outputShape)
+    {
+        m_JsonString = R"(
+            {
+                "version": 3,
+                "operator_codes": [ { "builtin_code": )" + operatorCode + R"( } ],
+                "subgraphs": [ {
+                    "tensors": [
+                        {
+                            "shape": )" + inputShape + R"(,
+                            "type": )" + dataType + R"( ,
+                            "buffer": 0,
+                            "name": "inputTensor",
+                            "quantization": {
+                                "min": [ 0.0 ],
+                                "max": [ 255.0 ],
+                                "scale": [ 1.0 ],
+                                "zero_point": [ 0 ],
+                            }
+                        },
+                        {
+                            "shape": )" + outputShape + R"( ,
+                            "type": )" + dataType + R"( ,
+                            "buffer": 1,
+                            "name": "outputTensor",
+                            "quantization": {
+                                "min": [ 0.0 ],
+                                "max": [ 255.0 ],
+                                "scale": [ 1.0 ],
+                                "zero_point": [ 0 ],
+                            }
+                        }
+                    ],
+                    "inputs": [ 0 ],
+                    "outputs": [ 1 ],
+                    "operators": [
+                        {
+                            "opcode_index": 0,
+                            "inputs": [ 0 ],
+                            "outputs": [ 1 ],
+                            "custom_options_format": "FLEXBUFFERS"
+                        }
+                    ],
+                } ],
+                "buffers" : [
+                    { },
+                    { }
+                ]
+            }
+        )";
+        Setup();
+    }
+};
+
+struct SimpleAbsFixture : public ElementWiseUnaryFixture
+{
+    SimpleAbsFixture() : ElementWiseUnaryFixture("ABS", "FLOAT32", "[ 2, 2 ]", "[ 2, 2 ]") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseAbs, SimpleAbsFixture)
+{
+    std::vector<float> inputValues
+    {
+        -0.1f, 0.2f,
+        0.3f, -0.4f
+    };
+
+    // Calculate output data
+    std::vector<float> expectedOutputValues(inputValues.size());
+    for (unsigned int i = 0; i < inputValues.size(); ++i)
+    {
+        expectedOutputValues[i] = std::abs(inputValues[i]);
+    }
+
+    RunTest<2, armnn::DataType::Float32>(0, {{ "inputTensor", { inputValues } }},
+                                            {{ "outputTensor",{ expectedOutputValues } } });
+}
+
+struct SimpleExpFixture : public ElementWiseUnaryFixture
+{
+    SimpleExpFixture() : ElementWiseUnaryFixture("EXP", "FLOAT32", "[ 1, 2, 3, 1 ]", "[ 1, 2, 3, 1 ]") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseExp, SimpleExpFixture)
+{
+    RunTest<4, armnn::DataType::Float32>(0, {{ "inputTensor", { 0.0f,  1.0f,  2.0f,
+                                                                3.0f,  4.0f,  5.0f} }},
+                                            {{ "outputTensor",{ 1.0f,  2.718281f,  7.3890515f,
+                                                                20.0855185f, 54.5980834f, 148.4129329f} } });
+}
+
+struct SimpleLogicalNotFixture : public ElementWiseUnaryFixture
+{
+    SimpleLogicalNotFixture() : ElementWiseUnaryFixture("LOGICAL_NOT", "BOOL", "[ 1, 1, 1, 4 ]", "[ 1, 1, 1, 4 ]") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseLogicalNot, SimpleLogicalNotFixture)
+{
+    RunTest<4, armnn::DataType::Boolean>(0, {{ "inputTensor", { 0, 1, 0, 1 } }},
+                                            {{ "outputTensor",{ 1, 0, 1, 0 } } });
+}
+
+struct SimpleNegFixture : public ElementWiseUnaryFixture
+{
+    SimpleNegFixture() : ElementWiseUnaryFixture("NEG", "FLOAT32", "[ 1, 2, 3, 1 ]", "[ 1, 2, 3, 1 ]") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseNeg, SimpleNegFixture)
+{
+    RunTest<4, armnn::DataType::Float32>(0, {{ "inputTensor", { 0.0f, 1.0f, -2.0f,
+                                                                20.0855185f, -54.5980834f, 5.0f} }},
+                                            {{ "outputTensor",{ 0.0f, -1.0f, 2.0f,
+                                                                -20.0855185f, 54.5980834f, -5.0f} }});
+}
+
+struct SimpleRsqrtFixture : public ElementWiseUnaryFixture
+{
+    SimpleRsqrtFixture() : ElementWiseUnaryFixture("RSQRT", "FLOAT32", "[ 1, 2, 3, 1 ]", "[ 1, 2, 3, 1 ]") {}
+};
+
+BOOST_FIXTURE_TEST_CASE(ParseRsqrt, SimpleRsqrtFixture)
+{
+    RunTest<4, armnn::DataType::Float32>(0, {{ "inputTensor", { 1.0f, 4.0f, 16.0f,
+                                                                25.0f, 64.0f, 100.0f } }},
+                                            {{ "outputTensor",{ 1.0f, 0.5f, 0.25f,
+                                                                0.2f, 0.125f, 0.1f} }});
+}
+
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/armnnTfLiteParser/test/Exp.cpp b/src/armnnTfLiteParser/test/Exp.cpp
deleted file mode 100644
index 168cc45..0000000
--- a/src/armnnTfLiteParser/test/Exp.cpp
+++ /dev/null
@@ -1,85 +0,0 @@
-//
-// Copyright © 2020 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include <boost/test/unit_test.hpp>
-#include "ParserFlatbuffersFixture.hpp"
-#include "../TfLiteParser.hpp"
-
-#include <string>
-
-BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)
-
-struct ExpFixture : public ParserFlatbuffersFixture
-{
-    explicit ExpFixture(const std::string & inputShape,
-                                   const std::string & outputShape)
-    {
-        m_JsonString = R"(
-            {
-                "version": 3,
-                "operator_codes": [ { "builtin_code": "EXP" } ],
-                "subgraphs": [ {
-                    "tensors": [
-                        {
-                            "shape": )" + inputShape + R"(,
-                            "type": "FLOAT32",
-                            "buffer": 0,
-                            "name": "inputTensor",
-                            "quantization": {
-                                "min": [ 0.0 ],
-                                "max": [ 255.0 ],
-                                "scale": [ 1.0 ],
-                                "zero_point": [ 0 ],
-                            }
-                        },
-                        {
-                            "shape": )" + outputShape + R"( ,
-                            "type": "FLOAT32",
-                            "buffer": 1,
-                            "name": "outputTensor",
-                            "quantization": {
-                                "min": [ 0.0 ],
-                                "max": [ 255.0 ],
-                                "scale": [ 1.0 ],
-                                "zero_point": [ 0 ],
-                            }
-                        }
-                    ],
-                    "inputs": [ 0 ],
-                    "outputs": [ 1 ],
-                    "operators": [
-                        {
-                            "opcode_index": 0,
-                            "inputs": [ 0 ],
-                            "outputs": [ 1 ],
-                            "custom_options_format": "FLEXBUFFERS"
-                        }
-                    ],
-                } ],
-                "buffers" : [
-                    { },
-                    { }
-                ]
-            }
-        )";
-        Setup();
-    }
-};
-
-struct SimpleExpFixture : public ExpFixture
-{
-    SimpleExpFixture() : ExpFixture("[ 1, 2, 3, 1 ]", "[ 1, 2, 3, 1 ]") {}
-};
-
-BOOST_FIXTURE_TEST_CASE(ParseExp, SimpleExpFixture)
-{
-    using armnn::DataType;
-    RunTest<4, DataType::Float32>(0, {{ "inputTensor", { 0.0f,  1.0f,  2.0f,
-                                                            3.0f,  4.0f,  5.0f} }},
-                                  {{ "outputTensor", { 1.0f,  2.718281f,  7.3890515f,
-                                                         20.0855185f, 54.5980834f, 148.4129329f} } });
-}
-
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
diff --git a/src/armnnTfLiteParser/test/Neg.cpp b/src/armnnTfLiteParser/test/Neg.cpp
deleted file mode 100644
index 39e1f9e..0000000
--- a/src/armnnTfLiteParser/test/Neg.cpp
+++ /dev/null
@@ -1,85 +0,0 @@
-//
-// Copyright © 2020 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include <boost/test/unit_test.hpp>
-#include "ParserFlatbuffersFixture.hpp"
-#include "../TfLiteParser.hpp"
-
-#include <string>
-
-BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)
-
-struct NegFixture : public ParserFlatbuffersFixture
-{
-    explicit NegFixture(const std::string & inputShape,
-                        const std::string & outputShape)
-    {
-        m_JsonString = R"(
-            {
-                "version": 3,
-                "operator_codes": [ { "builtin_code": "NEG" } ],
-                "subgraphs": [ {
-                    "tensors": [
-                        {
-                            "shape": )" + inputShape + R"(,
-                            "type": "FLOAT32",
-                            "buffer": 0,
-                            "name": "inputTensor",
-                            "quantization": {
-                                "min": [ 0.0 ],
-                                "max": [ 255.0 ],
-                                "scale": [ 1.0 ],
-                                "zero_point": [ 0 ],
-                            }
-                        },
-                        {
-                            "shape": )" + outputShape + R"( ,
-                            "type": "FLOAT32",
-                            "buffer": 1,
-                            "name": "outputTensor",
-                            "quantization": {
-                                "min": [ 0.0 ],
-                                "max": [ 255.0 ],
-                                "scale": [ 1.0 ],
-                                "zero_point": [ 0 ],
-                            }
-                        }
-                    ],
-                    "inputs": [ 0 ],
-                    "outputs": [ 1 ],
-                    "operators": [
-                        {
-                            "opcode_index": 0,
-                            "inputs": [ 0 ],
-                            "outputs": [ 1 ],
-                            "custom_options_format": "FLEXBUFFERS"
-                        }
-                    ],
-                } ],
-                "buffers" : [
-                    { },
-                    { }
-                ]
-            }
-        )";
-        Setup();
-    }
-};
-
-struct SimpleNegFixture : public NegFixture
-{
-    SimpleNegFixture() : NegFixture("[ 1, 2, 3, 1 ]", "[ 1, 2, 3, 1 ]") {}
-};
-
-BOOST_FIXTURE_TEST_CASE(ParseNeg, SimpleNegFixture)
-{
-    using armnn::DataType;
-    RunTest<4, DataType::Float32>(0, {{ "inputTensor", { 0.0f, 1.0f, -2.0f,
-                                                         20.0855185f, -54.5980834f, 5.0f} }},
-                                     {{ "outputTensor",{ 0.0f, -1.0f, 2.0f,
-                                                         -20.0855185f, 54.5980834f, -5.0f} }});
-}
-
-BOOST_AUTO_TEST_SUITE_END()