aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Peter McGoron 2023-02-09 16:32:32 +0000
committerGravatar Peter McGoron 2023-02-09 16:32:32 +0000
commitef84135a2e243ee8edf6f915405e2f5b65ab7500 (patch)
treece9a682df7f0da4f68cd07d4c5f60176c852251e
parentadd compile t est (diff)
change instructions to be an enum
-rw-r--r--asm/creole.py40
-rw-r--r--asm/test.py10
2 files changed, 25 insertions, 25 deletions
diff --git a/asm/creole.py b/asm/creole.py
index 1ed25e8..1d105a1 100644
--- a/asm/creole.py
+++ b/asm/creole.py
@@ -50,13 +50,23 @@ class TypecheckException(Exception):
self.opcode = opcode
def __str__(self):
return f'opcode {self.opcode} has invalid value {self.sarg} (expected {self.argtype} in position {self.i}'
-class Instruction:
- def __init__(self, opcode, argtypes):
+class Instruction(Enum):
+ NOP = 0
+ PUSH = 1, ArgType.VAL
+ POP = 2, ArgType.REG
+ ADD = 3, ArgType.VAL, ArgType.VAL, ArgType.VAL
+ MUL = 4, ArgType.VAL, ArgType.VAL, ArgType.VAL
+ DIV = 5, ArgType.VAL, ArgType.VAL, ArgType.VAL
+ JL = 6, ArgType.LAB, ArgType.VAL, ArgType.VAL
+ CLB = 7, ArgType.LAB
+ SYS = 8, ArgType.VAL
+
+ def __init__(self, opcode, *args):
if opcode > 0x7F or opcode < 0:
raise OpcodeException(opcode)
self.opcode = opcode
- self.argtypes = argtypes
+ self.argtypes = args
def typecheck(self, sargs):
rargs = []
if len(sargs) != len(self.argtypes):
@@ -71,18 +81,6 @@ class Instruction:
rargs.append(t)
return rargs
-instructions = {
-"nop" : Instruction(0, []),
-"push" : Instruction(1, [ArgType.VAL]),
-"pop" : Instruction(2, [ArgType.REG]),
-"add" : Instruction(3, [ArgType.VAL, ArgType.VAL, ArgType.VAL]),
-"mul" : Instruction(4, [ArgType.VAL, ArgType.VAL, ArgType.VAL]),
-"div" : Instruction(5, [ArgType.VAL, ArgType.VAL, ArgType.VAL]),
-"jl" : Instruction(6, [ArgType.LAB, ArgType.VAL, ArgType.VAL]),
-"clb" : Instruction(7, [ArgType.LAB]),
-"sys" : Instruction(8, [ArgType.VAL])
-}
-
encoding_types = {
# start mask A B
2: (0x7F, 0xC0, 7),
@@ -165,12 +163,14 @@ class Program:
def parse_asm_line(self, line):
line = line.split()
line[0] = line[0].casefold()
- if line[0] not in instructions:
+ try:
+ # TODO: is there no better way to do this in Python?
+ ins = getattr(Instruction, line[0].upper())
+ except Exception as e:
raise InstructionNotFoundException(line[0])
- else:
- ins = instructions[line[0]]
- args_w_type = ins.typecheck(line[1:])
- self.asm_push_line(ins.opcode, args_w_type)
+
+ args_w_type = ins.typecheck(line[1:])
+ self.asm_push_line(ins.opcode, args_w_type)
def __call__(self):
b = bytes()
diff --git a/asm/test.py b/asm/test.py
index 06a878f..640f3bf 100644
--- a/asm/test.py
+++ b/asm/test.py
@@ -9,7 +9,7 @@ class PushTest(unittest.TestCase):
b = p()
self.assertEqual(b, b'\x01\xC2\x85\x00')
ins = ffi.parse_line(b)
- self.assertEqual(ins[0], instructions["push"].opcode)
+ self.assertEqual(ins[0], Instruction.PUSH.opcode)
self.assertEqual(ins[1][0], (1,5))
def test_parse_push_imm(self):
@@ -18,7 +18,7 @@ class PushTest(unittest.TestCase):
b = p()
self.assertEqual(b, b'\x01\xC0\x85\x00')
ins = ffi.parse_line(b)
- self.assertEqual(ins[0], instructions["push"].opcode)
+ self.assertEqual(ins[0], Instruction.PUSH.opcode)
self.assertEqual(ins[1][0], (0,5))
def test_parse_push_catch_typecheck_push_lab(self):
@@ -55,7 +55,7 @@ class PushTest(unittest.TestCase):
def test_compile_push(self):
p = Program()
p.parse_asm_line("PUSH r0")
- p.parse_asm_line("PUSH r6")
+ p.parse_asm_line("PUSH 6")
b = p()
ex = ffi.ExecutionEnvironment()
@@ -71,7 +71,7 @@ class PushTest(unittest.TestCase):
self.assertEqual(ex.cenv.prg[0].w[2], 0)
self.assertEqual(ex.cenv.prg[1].opcode, 1)
- self.assertEqual(ex.cenv.prg[1].w_flags[0], 1)
+ self.assertEqual(ex.cenv.prg[1].w_flags[0], 0)
self.assertEqual(ex.cenv.prg[1].w_flags[1], 0)
self.assertEqual(ex.cenv.prg[1].w_flags[2], 0)
self.assertEqual(ex.cenv.prg[1].w[0], 6)
@@ -109,7 +109,7 @@ class ProgramTest(unittest.TestCase):
p = Program()
p.parse_asm_line("add r1 23 3648")
ins = ffi.parse_line(p())
- self.assertEqual(ins[0], instructions["add"].opcode)
+ self.assertEqual(ins[0], Instruction.ADD.opcode)
self.assertEqual(ins[1][0], (1,1))
self.assertEqual(ins[1][1], (0,23))
self.assertEqual(ins[1][2], (0,3648))
t/debian/changelog?h=v2.0.9&id=f1b4b5e18fe07a2c8418f5382cc753c11d426208&follow=1'>Bump up version numbers for release.Gravatar aeb 2-3/+11 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@44 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-11-24Added libraw1394.postinst.in to list of distributed files.Gravatar aeb 3-3/+35 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@43 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-11-23Add ldconfig in deb postinst for Debian policy conformance.Gravatar aeb 2-2/+17 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@42 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-11-23Removed acconfig.h, which wasn't needed for some time.Gravatar aeb 1-13/+0 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@41 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-11-22Added ieee1394.h header.Gravatar aeb 3-1/+38 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@40 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-09-13Fix raw1394_start_iso_write() which uses wrong variable.Gravatar aeb 1-1/+1 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@39 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-09-10Work around compiler warnings for int/ptr casts.Gravatar aeb 6-10/+20 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@38 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-09-10Added control files for Debian packages.Gravatar aeb 6-8/+106 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@37 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-09-01Added missing prototypes for iso send functions.Gravatar aeb 1-0/+7 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@36 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-08-08Added raw1394_get_irm_id().Gravatar aeb 7-7/+39 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@35 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-08-06Added support for isochronous sending.Gravatar aeb 3-0/+35 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@34 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-07-05Added raw1394_reset_bus() call.Gravatar aeb 4-0/+23 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@33 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-06-22- Set library version info in configure.in, use in src/Makefile.am.Gravatar aeb 4-2/+16 - Enable compiler warnings. git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@32 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-06-15Update libtool version number.Gravatar aeb 2-2/+2 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@31 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-06-14Added copyright headers.Gravatar aeb 6-0/+54 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@30 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-06-11Added explicit AC_PROG_INSTALL call.Gravatar aeb 1-0/+1 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@29 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-06-09Fix size of error field.Gravatar aeb 1-2/+2 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@28 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-06-02Modified support for 32/64 bit environments, control struct fields have ↵Gravatar aeb 7-43/+28 fixed size now. git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@27 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-05-28Added support for environments with 64 bit kernel and 32 bit userland.Gravatar aeb 8-7/+45 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@26 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-04-27Fixed missing setting of ext code in raw1394_start_lock()Gravatar aeb 1-0/+1 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@25 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-04-15Fixed lock transaction to actually return response value.Gravatar aeb 3-5/+11 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@24 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-04-12Add userdata functions as news.Gravatar aeb 1-0/+4 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@23 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-04-05Add userdata functions.Gravatar aeb 3-0/+18 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@22 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-03-18Bump version number to 0.6.Gravatar aeb 3-5/+6 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@21 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-03-18Mention byte order change.Gravatar aeb 1-0/+2 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@20 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-03-18Mention SourceForge home.Gravatar aeb 1-1/+5 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@19 53a565d1-3bb7-0310-b661-cf11e63c67ab