diff options
| author | Jan Tuomi <jans.tuomi@gmail.com> | 2023-04-10 21:10:16 +0300 |
|---|---|---|
| committer | Jan Tuomi <jans.tuomi@gmail.com> | 2023-04-10 23:55:17 +0300 |
| commit | 9a6001ad380e83a545188b58145387593b117b48 (patch) | |
| tree | a991cea5e5163b18c0666de89a7eccd55308b227 /src/assembler_ops.py | |
| parent | 56fd37c60eb0d58ed4762340ddc85b74347bcd71 (diff) | |
Refactor into multipass compiler
Diffstat (limited to 'src/assembler_ops.py')
| -rw-r--r-- | src/assembler_ops.py | 117 |
1 files changed, 69 insertions, 48 deletions
diff --git a/src/assembler_ops.py b/src/assembler_ops.py index 2313bfd..e4eeac4 100644 --- a/src/assembler_ops.py +++ b/src/assembler_ops.py @@ -4,115 +4,114 @@ from dataclasses import dataclass @dataclass class Options: - stack_pointer = "RG" - csr_scratch = "RF" + stack_pointer = "rg" + csr_scratch = "rf" @dataclass class Meta: address: int - options: Options -def make_alr(meta: Meta, alu_op: str, left: str, right: str, target: str) -> list[int]: +def make_alr(meta: Meta, labels: Labels, alu_op: str, left: str, right: str, target: str) -> int: """ALR 0000 TTTL LLRR RSSS""" - target_e = eval_expr(target, bits=3) - left_e = eval_expr(left, bits=3) - right_e = eval_expr(right, bits=3) - alu_op_e = eval_expr(alu_op, bits=3) + target_e = eval_expr(labels, target, bits=3) + left_e = eval_expr(labels, left, bits=3) + right_e = eval_expr(labels, right, bits=3) + alu_op_e = eval_expr(labels, alu_op, bits=3) word = (0b0000 << 12) + \ (target_e << 9) + \ (left_e << 6) + \ (right_e << 3) + \ alu_op_e - return [word] + return word -def make_ali(meta: Meta, alu_op: str, left: str, imm: str, target: str) -> list[int]: +def make_ali(meta: Meta, labels: Labels, alu_op: str, left: str, imm: str, target: str) -> int: """ALI 0001 TTTL LLII ISSS""" - target_e = eval_expr(target, bits=3) - left_e = eval_expr(left, bits=3) - imm_e = eval_expr(imm, bits=3) - alu_op_e = eval_expr(alu_op, bits=3) + target_e = eval_expr(labels, target, bits=3) + left_e = eval_expr(labels, left, bits=3) + imm_e = eval_expr(labels, imm, bits=3) + alu_op_e = eval_expr(labels, alu_op, bits=3) word = (0b0001 << 12) + \ (target_e << 9) + \ (left_e << 6) + \ (imm_e << 3) + \ alu_op_e - return [word] + return word -def make_ldr(meta: Meta, to_reg: str, addr_reg: str) -> list[int]: +def make_ldr(meta: Meta, labels: Labels, to_reg: str, addr_reg: str) -> int: """LDR 0010 TTTR RRXX XXXX""" - to_reg_e = eval_expr(to_reg, bits=3) - addr_reg_e = eval_expr(addr_reg, bits=3) + to_reg_e = eval_expr(labels, to_reg, bits=3) + addr_reg_e = eval_expr(labels, addr_reg, bits=3) word = (0b0010 << 12) + \ (to_reg_e << 9) + \ (addr_reg_e << 6) - return [word] + return word -def make_str(meta: Meta, from_reg: str, addr_reg: str) -> list[int]: +def make_str(meta: Meta, labels: Labels, from_reg: str, addr_reg: str) -> int: """STR 0011 TTTR RRXX XXXX""" - from_reg_e = eval_expr(from_reg, bits=3) - addr_reg_e = eval_expr(addr_reg, bits=3) + from_reg_e = eval_expr(labels, from_reg, bits=3) + addr_reg_e = eval_expr(labels, addr_reg, bits=3) word = (0b0011 << 12) + \ (from_reg_e << 9) + \ (addr_reg_e << 6) - return [word] + return word -def make_ldi(meta: Meta, to_reg: str, imm: str) -> list[int]: +def make_ldi(meta: Meta, labels: Labels, to_reg: str, imm: str) -> int: """LDI 0100 TTTI IIII IIII""" - to_reg_e = eval_expr(to_reg, bits=3) - imm_e = eval_expr(imm, bits=9) + to_reg_e = eval_expr(labels, to_reg, bits=3) + imm_e = eval_expr(labels, imm, bits=9) word = (0b0100 << 12) + \ (to_reg_e << 9) + \ imm_e - return [word] + return word -def make_jpr(meta: Meta, addr_reg: str) -> list[int]: +def make_jpr(meta: Meta, labels: Labels, addr_reg: str) -> int: """JPR 0101 XXXR RRXX XXXX""" - addr_reg_e = eval_expr(addr_reg, bits=3) + addr_reg_e = eval_expr(labels, addr_reg, bits=3) word = (0b0101 << 12) + \ (addr_reg_e << 6) - return [word] + return word -def make_jpi(meta: Meta, imm: str) -> list[int]: +def make_jpi(meta: Meta, labels: Labels, imm: str) -> int: """JPI 0110 XXXI IIII IIII""" - imm_e = eval_expr(imm, bits=9) + imm_e = eval_expr(labels, imm, bits=9) imm_e = imm_e - meta.address - 1 word = (0b0110 << 12) + \ imm_e - return [word] + return word -def make_brr(meta: Meta, flag_s: str, addr_reg: str) -> list[int]: +def make_brr(meta: Meta, labels: Labels, flag_s: str, addr_reg: str) -> int: """brr 0111 XFFR RRXX XXXX""" - flag_s_e = eval_expr(flag_s, bits=2) - addr_reg_e = eval_expr(addr_reg, bits=3) + flag_s_e = eval_expr(labels, flag_s, bits=2) + addr_reg_e = eval_expr(labels, addr_reg, bits=3) word = (0b0111 << 12) + \ (flag_s_e << 9) + \ (addr_reg_e << 6) - return [word] + return word -def make_bri(meta: Meta, flag_s: str, imm: str) -> list[int]: +def make_bri(meta: Meta, labels: Labels, flag_s: str, imm: str) -> int: """BRI 1000 XFFI IIII IIII""" - flag_s_e = eval_expr(flag_s, bits=2) - imm_e = eval_expr(imm, bits=9) + flag_s_e = eval_expr(labels, flag_s, bits=2) + imm_e = eval_expr(labels, imm, bits=9) imm_e = imm_e - meta.address - 1 word = (0b1000 << 12) + \ (flag_s_e << 9) + \ imm_e - return [word] + return word -def make_lpc(meta: Meta, target: str) -> list[int]: +def make_lpc(meta: Meta, labels: Labels, target: str) -> int: """LPC 1001 TTTX XXXX XXXX""" - target_e = eval_expr(target, bits=3) + target_e = eval_expr(labels, target, bits=3) word = (0b1001 << 12) + \ (target_e << 9) - return [word] + return word -def make_hlt(meta: Meta, ) -> list[int]: +def make_hlt(meta: Meta, labels: Labels) -> int: """HLT 1111 XXXX XXXX XXXX""" word = (0b1111 << 12) - return [word] + return word -operations: dict[str, Callable[..., list[int]]] = { - "alr": make_alr, +OpWordDict = dict[str, Callable[..., int]] +operations: OpWordDict = { "alr": make_alr, "ali": make_ali, "ldr": make_ldr, @@ -125,3 +124,25 @@ operations: dict[str, Callable[..., list[int]]] = { "lpc": make_lpc, "hlt": make_hlt, } + +ExpandResult = list[list[str]] +ExpandFn = Callable[..., ExpandResult] +OpExpansionDict = dict[str, ExpandFn] + +def expand_id(*parts: str) -> ExpandResult: + return [list(parts)] + +default_expansions: OpExpansionDict = { + "alr": lambda *args: expand_id("alr", *args), + "ali": lambda *args: expand_id("ali", *args), + "ldr": lambda *args: expand_id("ldr", *args), + "str": lambda *args: expand_id("str", *args), + "ldi": lambda *args: expand_id("ldi", *args), + "jpr": lambda *args: expand_id("jpr", *args), + "jpi": lambda *args: expand_id("jpi", *args), + "brr": lambda *args: expand_id("brr", *args), + "bri": lambda *args: expand_id("bri", *args), + "lpc": lambda *args: expand_id("lpc", *args), + "hlt": lambda *args: expand_id("hlt", *args), +} + |
