Add desc.json schema validation with compliance/data_gen extensions

Rename scripts utlities to tosa_* such as tosa_json2numpy

Signed-off-by: Jeremy Johnson <jeremy.johnson@arm.com>
Change-Id: Ie8d584e2afb189fb74cf96b39590c7c27444ba14
diff --git a/scripts/schemavalidation/schemavalidation.py b/scripts/schemavalidation/schemavalidation.py
new file mode 100644
index 0000000..2848edf
--- /dev/null
+++ b/scripts/schemavalidation/schemavalidation.py
@@ -0,0 +1,79 @@
+# Copyright (c) 2023, ARM Limited.
+# SPDX-License-Identifier: Apache-2.0
+"""Validates desc.json against its JSON schema."""
+import json
+from pathlib import Path
+
+from jsonschema import validate
+from referencing import Registry
+from referencing import Resource
+
+TD_SCHEMA_FULL = "full"
+TD_SCHEMA_DATA_GEN = "data_gen"
+TD_SCHEMA_COMPLIANCE = "compliance"
+
+# Default file info
+SCRIPT = Path(__file__).absolute()
+TD_SCHEMAS = {
+    TD_SCHEMA_DATA_GEN: "datagen-config.schema.json",
+    TD_SCHEMA_COMPLIANCE: "compliance-config.schema.json",
+    TD_SCHEMA_FULL: "desc.schema.json",
+}
+
+
+class TestDescSchemaValidator:
+    def __init__(self):
+        """Initialize by loading all the schemas and setting up a registry."""
+        self.registry = Registry()
+        self.schemas = {}
+        for key, name in TD_SCHEMAS.items():
+            schema_path = SCRIPT.parent / name
+            with schema_path.open("r") as fd:
+                schema = json.load(fd)
+            self.schemas[key] = schema
+            if key != TD_SCHEMA_FULL:
+                resource = Resource.from_contents(schema)
+                self.registry = self.registry.with_resource(uri=name, resource=resource)
+
+    def validate_config(self, config, schema_type=TD_SCHEMA_FULL):
+        """Validate the whole (or partial) config versus the relevant schema."""
+        validate(config, self.schemas[schema_type], registry=self.registry)
+
+
+def main(argv=None):
+    """Command line interface for the schema validation."""
+    import argparse
+
+    parser = argparse.ArgumentParser()
+    parser.add_argument(
+        "path", type=Path, help="the path to the test directory to validate"
+    )
+    args = parser.parse_args(argv)
+    test_path = args.path
+
+    if not test_path.is_dir():
+        print(f"ERROR: Invalid directory - {test_path}")
+        return 2
+
+    test_desc_path = test_path / "desc.json"
+
+    if not test_desc_path.is_file():
+        print(f"ERROR: No test description found: {test_desc_path}")
+        return 2
+
+    # Load the JSON desc.json
+    try:
+        with test_desc_path.open("r") as fd:
+            test_desc = json.load(fd)
+    except Exception as e:
+        print(f"ERROR: Loading {test_desc_path} - {repr(e)}")
+        return 2
+
+    sv = TestDescSchemaValidator()
+    sv.validate_config(test_desc, TD_SCHEMA_FULL)
+
+    return 0
+
+
+if __name__ == "__main__":
+    exit(main())