diff --git a/example3.json b/example3.json new file mode 100644 index 0000000..fc15e6d --- /dev/null +++ b/example3.json @@ -0,0 +1,105 @@ +{ + "structures": { + "main": { + "bits": 32, + "ranges": { + "31-28": { + "name": "cond" + }, + "27": { + "name": "0" + }, + "26": { + "name": "1" + }, + "25": { + "name": "I" + }, + "24": { + "name": "P", + "description": "pre / post indexing bit", + "values": { + "0": "post, add offset after transfer", + "1": "pre, add offset before transfer" + } + }, + "23": { + "name": "U", + "description": "up / down bit", + "values": { + "0": "down, subtract offset from base", + "1": "up, addition offset to base" + } + }, + "22": { + "name": "B", + "description": "byte / word bit", + "values": { + "0": "transfer word quantity", + "1": "transfer byte quantity" + } + }, + "21": { + "name": "W", + "description": "write-back bit", + "values": { + "0": "no write-back", + "1": "write address into base" + } + }, + "20": { + "name": "L", + "description": "load / store bit", + "values": { + "0": "store to memory", + "1": "load from memory" + } + }, + "19-16": { + "name": "Rn", + "description": "base register" + }, + "15-12": { + "name": "Rd", + "description": "source / destination register" + }, + "11-0": { + "name": "offset", + "depends-on": "25", + "values": { + "0": { + "description": "offset is an immediate value", + "structure": "immediateOffset" + }, + "1": { + "description": "offset is a register", + "structure": "registerOffset" + } + } + } + } + }, + "immediateOffset": { + "bits": 12, + "ranges": { + "11-0": { + "name": "12-bit immediate offset", + "description": "unsigned number" + } + } + }, + "registerOffset": { + "bits": 12, + "ranges": { + "11-4": { + "name": "shift", + "description": "shift applied to Rm" + }, + "3-0": { + "name": "Rm", + "description": "offset register" + } + } + } + } +} diff --git a/schema.py b/schema.py index 2ccaa3e..7a4cec8 100644 --- a/schema.py +++ b/schema.py @@ -1,18 +1,36 @@ +import json +import os import yaml from config import Config from renderer import Renderer from structure import Structure +class UnsupportedFormatException(Exception): + ... + class InstructionSetSchema: + VALID_EXTENSIONS = ("yaml", "json") + def __init__(self, path: str, configPath: str = "config.json") -> None: self.config = Config(configPath) self.path = path self.load() def load(self) -> None: + _, ext = os.path.splitext(self.path) + ext = ext[1:].lower() + + if ext not in InstructionSetSchema.VALID_EXTENSIONS: + fmts = tuple(map(lambda fmt: f".{fmt}", InstructionSetSchema.VALID_EXTENSIONS)) + raise UnsupportedFormatException(f"'.{ext}' files are not supported. Valid formats: {fmts}") + with open(self.path, "r") as f: - schema = yaml.safe_load(f) + if ext == "yaml": + schema = yaml.safe_load(f) + + elif ext == "json": + schema = json.load(f) self.structures = {}