Modify TOSA schema to force version to be written

Previously if the values were the default, they would not be written
to the file

Signed-off-by: Eric Kunze <eric.kunze@arm.com>
Change-Id: Ibdf13d3ce672d3e8f062a7853d65a966ab5b0877
diff --git a/include/tosa_generated.h b/include/tosa_generated.h
index 72c1822..cbc6eb9 100644
--- a/include/tosa_generated.h
+++ b/include/tosa_generated.h
@@ -2120,16 +2120,16 @@
     VT__DRAFT = 10
   };
   int32_t _major() const {
-    return GetField<int32_t>(VT__MAJOR, 0);
+    return GetField<int32_t>(VT__MAJOR, -1);
   }
   int32_t _minor() const {
-    return GetField<int32_t>(VT__MINOR, 70);
+    return GetField<int32_t>(VT__MINOR, -1);
   }
   int32_t _patch() const {
-    return GetField<int32_t>(VT__PATCH, 0);
+    return GetField<int32_t>(VT__PATCH, -1);
   }
   bool _draft() const {
-    return GetField<uint8_t>(VT__DRAFT, 1) != 0;
+    return GetField<uint8_t>(VT__DRAFT, 255) != 0;
   }
   bool Verify(flatbuffers::Verifier &verifier) const {
     return VerifyTableStart(verifier) &&
@@ -2146,16 +2146,16 @@
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
   void add__major(int32_t _major) {
-    fbb_.AddElement<int32_t>(Version::VT__MAJOR, _major, 0);
+    fbb_.AddElement<int32_t>(Version::VT__MAJOR, _major, -1);
   }
   void add__minor(int32_t _minor) {
-    fbb_.AddElement<int32_t>(Version::VT__MINOR, _minor, 70);
+    fbb_.AddElement<int32_t>(Version::VT__MINOR, _minor, -1);
   }
   void add__patch(int32_t _patch) {
-    fbb_.AddElement<int32_t>(Version::VT__PATCH, _patch, 0);
+    fbb_.AddElement<int32_t>(Version::VT__PATCH, _patch, -1);
   }
   void add__draft(bool _draft) {
-    fbb_.AddElement<uint8_t>(Version::VT__DRAFT, static_cast<uint8_t>(_draft), 1);
+    fbb_.AddElement<uint8_t>(Version::VT__DRAFT, static_cast<uint8_t>(_draft), 255);
   }
   explicit VersionBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
@@ -2170,9 +2170,9 @@
 
 inline flatbuffers::Offset<Version> CreateVersion(
     flatbuffers::FlatBufferBuilder &_fbb,
-    int32_t _major = 0,
-    int32_t _minor = 70,
-    int32_t _patch = 0,
+    int32_t _major = -1,
+    int32_t _minor = -1,
+    int32_t _patch = -1,
     bool _draft = true) {
   VersionBuilder builder_(_fbb);
   builder_.add__patch(_patch);
@@ -2724,7 +2724,7 @@
   }
   bool Verify(flatbuffers::Verifier &verifier) const {
     return VerifyTableStart(verifier) &&
-           VerifyOffset(verifier, VT_VERSION) &&
+           VerifyOffsetRequired(verifier, VT_VERSION) &&
            verifier.VerifyTable(version()) &&
            VerifyOffset(verifier, VT_REGIONS) &&
            verifier.VerifyVector(regions()) &&
@@ -2750,6 +2750,7 @@
   flatbuffers::Offset<TosaGraph> Finish() {
     const auto end = fbb_.EndTable(start_);
     auto o = flatbuffers::Offset<TosaGraph>(end);
+    fbb_.Required(o, TosaGraph::VT_VERSION);
     return o;
   }
 };
diff --git a/include/tosa_serialization_handler.h b/include/tosa_serialization_handler.h
index 04dac52..1665bfa 100644
--- a/include/tosa_serialization_handler.h
+++ b/include/tosa_serialization_handler.h
@@ -408,7 +408,6 @@
     tosa_err_t Clear();
     tosa_err_t Deserialize(const uint8_t* buf);
     tosa_err_t Serialize();
-    TosaVersion ParseTosaSchemaVersion(std::string schema);
 
 private:
     TosaVersion _version;                           /* version struct */
diff --git a/python/tosa/Version.py b/python/tosa/Version.py
index 692d76f..0abafaf 100644
--- a/python/tosa/Version.py
+++ b/python/tosa/Version.py
@@ -33,21 +33,21 @@
         o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
         if o != 0:
             return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)
-        return 0
+        return -1
 
     # Version
     def _minor(self):
         o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))
         if o != 0:
             return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)
-        return 70
+        return -1
 
     # Version
     def _patch(self):
         o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))
         if o != 0:
             return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)
-        return 0
+        return -1
 
     # Version
     def _draft(self):
@@ -59,16 +59,16 @@
 def VersionStart(builder): builder.StartObject(4)
 def Start(builder):
     return VersionStart(builder)
-def VersionAdd_major(builder, Major): builder.PrependInt32Slot(0, Major, 0)
+def VersionAdd_major(builder, Major): builder.PrependInt32Slot(0, Major, -1)
 def Add_major(builder, Major):
     return VersionAdd_major(builder, Major)
-def VersionAdd_minor(builder, Minor): builder.PrependInt32Slot(1, Minor, 70)
+def VersionAdd_minor(builder, Minor): builder.PrependInt32Slot(1, Minor, -1)
 def Add_minor(builder, Minor):
     return VersionAdd_minor(builder, Minor)
-def VersionAdd_patch(builder, Patch): builder.PrependInt32Slot(2, Patch, 0)
+def VersionAdd_patch(builder, Patch): builder.PrependInt32Slot(2, Patch, -1)
 def Add_patch(builder, Patch):
     return VersionAdd_patch(builder, Patch)
-def VersionAdd_draft(builder, Draft): builder.PrependBoolSlot(3, Draft, 1)
+def VersionAdd_draft(builder, Draft): builder.PrependBoolSlot(3, Draft, 255)
 def Add_draft(builder, Draft):
     return VersionAdd_draft(builder, Draft)
 def VersionEnd(builder): return builder.EndObject()
diff --git a/schema/tosa.fbs b/schema/tosa.fbs
index f7224fb..449c4ea 100644
--- a/schema/tosa.fbs
+++ b/schema/tosa.fbs
@@ -267,10 +267,10 @@
 }
 
 table Version {
-  _major: int32 = 0;
-  _minor: int32 = 70;
-  _patch: int32 = 0;
-  _draft: bool = true;
+  _major: int32 = -1;
+  _minor: int32 = -1;
+  _patch: int32 = -1;
+  _draft: bool = 255;
 }
 
 table TosaTensor {
@@ -301,7 +301,7 @@
 }
 
 table TosaGraph {
-  version:Version;
+  version:Version (required);
   regions:[TosaRegion];       // regions array
 }
 
diff --git a/src/tosa_serialization_handler.cpp b/src/tosa_serialization_handler.cpp
index 25ac5df..bed79b2 100644
--- a/src/tosa_serialization_handler.cpp
+++ b/src/tosa_serialization_handler.cpp
@@ -194,56 +194,6 @@
     Clear();    // deallocate all basic blocks
 }
 
-TosaVersion TosaSerializationHandler::ParseTosaSchemaVersion(std::string schema)
-{
-    // Parse all 4 version fields in schema file
-    static const char* keywords[4] = { "major: int32 = ", "minor: int32 = ", "patch: int32 = ", "draft: bool = " };
-    string keyword_str[4];
-    size_t search_pos = 0;
-    size_t keyword_pos;
-    size_t semicolon_pos;
-    // parse integer field first
-    for (int32_t i = 0; i < 4; i++)
-    {
-        keyword_pos = schema.find(keywords[i], search_pos);
-        if (keyword_pos == std::string::npos)
-        {
-            printf("ERROR: can't find keyword \"%s\" in schema\n", keywords[i]);
-            assert(0);
-        }
-        semicolon_pos = schema.find(';', keyword_pos);
-        if (keyword_pos == std::string::npos)
-        {
-            printf("ERROR: can't find ';' in schema\n");
-            assert(0);
-        }
-        keyword_str[i] =
-            schema.substr(keyword_pos + strlen(keywords[i]), semicolon_pos - keyword_pos - strlen(keywords[i]));
-        search_pos = semicolon_pos;
-    }
-
-    int32_t schema_major = 0;
-    int32_t schema_minor = 0;
-    int32_t schema_patch = 0;
-    bool schema_draft    = false;
-    try
-    {
-        schema_major = stoi(keyword_str[0]);
-        schema_minor = stoi(keyword_str[1]);
-        schema_patch = stoi(keyword_str[2]);
-        schema_draft = (keyword_str[3] == "true") ? true : false;
-    }
-    catch (std::invalid_argument& e)
-    {
-        printf("ERROR: fail at stoi(): %s\n", e.what());
-        assert(0);
-    }
-
-    TosaVersion schema_version(schema_major, schema_minor, schema_patch, schema_draft);
-
-    return schema_version;
-}
-
 tosa_err_t TosaSerializationHandler::LoadFileSchema(const char* schema_filename)
 {
     std::string schema;
@@ -258,23 +208,6 @@
 
     ok = _parser.Parse(schema.c_str());
 
-    TosaVersion schema_version = ParseTosaSchemaVersion(schema);
-
-    TosaVersion::compat_t is_compat = schema_version.is_compatible(GetVersion());
-    switch (is_compat)
-    {
-        case TosaVersion::compat_t::COMPLETELY_COMPATIBLE:
-            break;
-        case TosaVersion::compat_t::PARTIALLY_COMPATIBLE:
-            printf("WARNING: Schema flatbuffer version %s is partially compatible with serializer version %s\n",
-                   schema_version.to_string().c_str(), GetVersion().to_string().c_str());
-            break;
-        case TosaVersion::compat_t::NOT_COMPATIBLE:
-            printf("ERROR: Schema flatbuffer version %s is not compatible with serializer version %s\n",
-                   schema_version.to_string().c_str(), GetVersion().to_string().c_str());
-            return TOSA_VERSION_MISMATCH;
-    }
-
     if (!ok)
     {
         printf("Error parsing ISA schema file: %s\n", schema_filename);