added support for json schemas
This commit is contained in:
parent
ab168b5f0a
commit
84b935c898
105
example3.json
Normal file
105
example3.json
Normal file
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
18
schema.py
18
schema.py
@ -1,19 +1,37 @@
|
||||
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:
|
||||
if ext == "yaml":
|
||||
schema = yaml.safe_load(f)
|
||||
|
||||
elif ext == "json":
|
||||
schema = json.load(f)
|
||||
|
||||
self.structures = {}
|
||||
|
||||
for id_, data in schema["structures"].items():
|
||||
|
Loading…
Reference in New Issue
Block a user