Files
darkfi/bin/app/pydrk/expr.py
2025-01-21 09:31:52 +01:00

88 lines
2.1 KiB
Python

from . import serial
class Op:
NULL = 0
ADD = 1
SUB = 2
MUL = 3
DIV = 4
CONST_BOOL = 5
CONST_UINT_32 = 6
CONST_FLOAT_32 = 7
CONST_STR = 8
LOAD_VAR = 9
MIN = 11
MAX = 12
IS_EQUAL = 13
LESS_THAN = 14
FLOAT32_TO_UINT32 = 15
@staticmethod
def from_str(op):
match op:
case "null":
return Op.NULL
case "+":
return Op.ADD
case "-":
return Op.SUB
case "*":
return Op.MUL
case "/":
return Op.DIV
case "bool":
return Op.CONST_BOOL
case "u32":
return Op.CONST_UINT_32
case "f32":
return Op.CONST_FLOAT_32
case "str":
return Op.CONST_STR
case "load":
return Op.LOAD_VAR
case "min":
return Op.MIN
case "max":
return Op.MAX
case "==":
return Op.IS_EQUAL
case "<":
return Op.LESS_THAN
case "as_u32":
return Op.FLOAT32_TO_UINT32
def encode_expr(by, code):
op, args = code[0], code[1:]
op = Op.from_str(op)
serial.write_u8(by, op)
match op:
case Op.CONST_BOOL:
serial.write_u8(by, int(args[0]))
case Op.CONST_UINT_32:
serial.write_u32(by, args[0])
case Op.CONST_FLOAT_32:
serial.write_f32(by, args[0])
case Op.CONST_STR:
serial.encode_str(by, args[0])
case Op.LOAD_VAR:
serial.encode_str(by, args[0])
case _:
for arg in args:
encode_expr(by, arg)
# python -m pydrk.expr
if __name__ == "__main__":
code = ["+",
["u32", 5],
["/",
["load", "sw"],
["u32", 2]
]
]
code_s = bytearray()
encode_expr(code_s, code)
assert code_s == bytearray(
[1, 6, 5, 0, 0, 0, 4, 9, 2, 115, 119, 6, 2, 0, 0, 0]
)