Skip to content

Rv64

rv64

Rv64Functions dataclass

Bases: InterpreterFunctions

Source code in xdsl/interpreters/rv64.py
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
@register_impls
class Rv64Functions(InterpreterFunctions):
    @impl(rv64.SlliOp)
    def run_shift_left_i(
        self,
        interpreter: Interpreter,
        op: rv64.SlliOp,
        args: tuple[Any, ...],
    ):
        args = RiscvFunctions.get_reg_values(interpreter, op.operands, args)
        assert len(args) == 1
        assert isinstance(args[0], int)
        py_op_result = op.py_operation(IntegerAttr(args[0], i64))
        assert py_op_result is not None
        results = (py_op_result.value.data,)
        return RiscvFunctions.set_reg_values(interpreter, op.results, results)

    @impl(rv64.LiOp)
    def run_li(
        self,
        interpreter: Interpreter,
        op: rv64.LiOp,
        args: tuple[Any, ...],
    ):
        results = (RiscvFunctions.get_immediate_value(interpreter, op.immediate),)
        return RiscvFunctions.set_reg_values(interpreter, op.results, results)

    @impl(rv64.GetRegisterOp)
    def run_get_register(
        self, interpreter: Interpreter, op: rv64.GetRegisterOp, args: PythonValues
    ) -> PythonValues:
        attr = op.res.type

        if not attr.is_allocated:
            raise InterpretationError(
                f"Cannot get value for unallocated register {attr}"
            )

        name = attr.register_name

        registers = RiscvFunctions.registers(interpreter)

        if name not in registers:
            raise InterpretationError(f"Value not found for register name {name.data}")

        stored_value = registers[name]

        return (stored_value,)

run_shift_left_i(interpreter: Interpreter, op: rv64.SlliOp, args: tuple[Any, ...])

Source code in xdsl/interpreters/rv64.py
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@impl(rv64.SlliOp)
def run_shift_left_i(
    self,
    interpreter: Interpreter,
    op: rv64.SlliOp,
    args: tuple[Any, ...],
):
    args = RiscvFunctions.get_reg_values(interpreter, op.operands, args)
    assert len(args) == 1
    assert isinstance(args[0], int)
    py_op_result = op.py_operation(IntegerAttr(args[0], i64))
    assert py_op_result is not None
    results = (py_op_result.value.data,)
    return RiscvFunctions.set_reg_values(interpreter, op.results, results)

run_li(interpreter: Interpreter, op: rv64.LiOp, args: tuple[Any, ...])

Source code in xdsl/interpreters/rv64.py
35
36
37
38
39
40
41
42
43
@impl(rv64.LiOp)
def run_li(
    self,
    interpreter: Interpreter,
    op: rv64.LiOp,
    args: tuple[Any, ...],
):
    results = (RiscvFunctions.get_immediate_value(interpreter, op.immediate),)
    return RiscvFunctions.set_reg_values(interpreter, op.results, results)

run_get_register(interpreter: Interpreter, op: rv64.GetRegisterOp, args: PythonValues) -> PythonValues

Source code in xdsl/interpreters/rv64.py
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
@impl(rv64.GetRegisterOp)
def run_get_register(
    self, interpreter: Interpreter, op: rv64.GetRegisterOp, args: PythonValues
) -> PythonValues:
    attr = op.res.type

    if not attr.is_allocated:
        raise InterpretationError(
            f"Cannot get value for unallocated register {attr}"
        )

    name = attr.register_name

    registers = RiscvFunctions.registers(interpreter)

    if name not in registers:
        raise InterpretationError(f"Value not found for register name {name.data}")

    stored_value = registers[name]

    return (stored_value,)