forked from JCMoure/RVCAT
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathisa.py
More file actions
50 lines (37 loc) · 1.36 KB
/
Copy pathisa.py
File metadata and controls
50 lines (37 loc) · 1.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import csv
from typing import Optional
import importlib.resources
ISA_PATH = importlib.resources.files("rvcat").joinpath("isas")
global _isa
class ISA:
def __init__(self) -> None:
self.isas = {}
self.instructions = {}
def load_isa(self, name: str) -> None:
instrs = {}
file = f"{ISA_PATH}/{name}.csv"
with open(file, "r") as f:
lines = csv.DictReader(f, skipinitialspace=True)
instrs.update({l["mnemonic"]:l for l in lines})
self.instructions.update(instrs)
self.isas[name] = list(instrs.keys())
def info(self, mnemonic: str) -> Optional[dict]:
return self.instructions.get(mnemonic.upper())
def help(self, mnemonic: str) -> str:
info = self.info(mnemonic)
if info == None:
return f"No info for {mnemonic} avaliable"
desc = info.get("description")
fmt = info.get("format")
typ = info.get("type")
action = info.get("action").format(rd="rd", rs1="rs1", rs2="rs2",
rs3="rs3", imm="imm")
return f"{mnemonic} ({fmt} | {typ}): {desc}\n\t{action}"
def __repr__(self) -> str:
out = ""
for name, instrs in self.isas.items():
out += f"{name}:\n"
out += ", ".join(instrs)
out += "\n"
return out
_isa = ISA()