From c25dadaeaf8d9da28d3f0ada9a5a3b32e7cdeed7 Mon Sep 17 00:00:00 2001 From: "Ka Wing, Li" <68145845+kingiler@users.noreply.github.com> Date: Mon, 31 Jul 2023 12:09:36 +0000 Subject: [PATCH 1/4] dialect: (riscv) Throw parser error if immediate is not given --- xdsl/dialects/riscv.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xdsl/dialects/riscv.py b/xdsl/dialects/riscv.py index d508dbb315..c613ac04f2 100644 --- a/xdsl/dialects/riscv.py +++ b/xdsl/dialects/riscv.py @@ -765,6 +765,8 @@ def custom_parse_attributes(cls, parser: Parser) -> Mapping[str, Attribute]: ) elif immediate := parser.parse_optional_str_literal(): attributes["immediate"] = LabelAttr(immediate) + else: + parser.raise_error("Expected immediate") if parser.parse_optional_punctuation(","): attributes["rd"] = parser.parse_attribute() return attributes From 5c03ba794d35e6ae9332978d245c1975b9fb0250 Mon Sep 17 00:00:00 2001 From: "Ka Wing, Li" <68145845+kingiler@users.noreply.github.com> Date: Mon, 31 Jul 2023 13:37:15 +0000 Subject: [PATCH 2/4] dialect: (riscv) Make a helper function --- xdsl/dialects/riscv.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/xdsl/dialects/riscv.py b/xdsl/dialects/riscv.py index c613ac04f2..3777521e42 100644 --- a/xdsl/dialects/riscv.py +++ b/xdsl/dialects/riscv.py @@ -759,14 +759,13 @@ def assembly_line_args(self) -> tuple[AssemblyInstructionArg | None, ...]: @classmethod def custom_parse_attributes(cls, parser: Parser) -> Mapping[str, Attribute]: attributes = dict[str, Attribute]() - if immediate := parser.parse_optional_integer(allow_boolean=False): - attributes["immediate"] = IntegerAttr( - immediate, IntegerType(12, Signedness.SIGNED) - ) - elif immediate := parser.parse_optional_str_literal(): - attributes["immediate"] = LabelAttr(immediate) - else: - parser.raise_error("Expected immediate") + match immediate := _parse_int_or_str_literal(parser, "Expected immediate"): + case int(): + attributes["immediate"] = IntegerAttr( + immediate, IntegerType(12, Signedness.SIGNED) + ) + case str(): + attributes["immediate"] = LabelAttr(immediate) if parser.parse_optional_punctuation(","): attributes["rd"] = parser.parse_attribute() return attributes @@ -2992,6 +2991,15 @@ class FSwOp(RsRsImmFloatOperation): # endregion + +def _parse_int_or_str_literal(parser: Parser, msg: str) -> int | str: + if (term := parser.parse_optional_integer()) is not None: + return term + if (term := parser.parse_optional_str_literal()) is not None: + return term + parser.raise_error(msg) + + RISCV = Dialect( [ AddiOp, From abc78226b3cae1733cf3cd981f70f51696819a5b Mon Sep 17 00:00:00 2001 From: "Ka Wing, Li" <68145845+kingiler@users.noreply.github.com> Date: Mon, 31 Jul 2023 14:17:27 +0000 Subject: [PATCH 3/4] dialect: (riscv) better helper func with doc --- xdsl/dialects/riscv.py | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/xdsl/dialects/riscv.py b/xdsl/dialects/riscv.py index 3777521e42..77ff14d86b 100644 --- a/xdsl/dialects/riscv.py +++ b/xdsl/dialects/riscv.py @@ -9,6 +9,7 @@ from xdsl.dialects.builtin import ( AnyIntegerAttr, + IndexType, IntegerAttr, IntegerType, ModuleOp, @@ -759,13 +760,9 @@ def assembly_line_args(self) -> tuple[AssemblyInstructionArg | None, ...]: @classmethod def custom_parse_attributes(cls, parser: Parser) -> Mapping[str, Attribute]: attributes = dict[str, Attribute]() - match immediate := _parse_int_or_str_literal(parser, "Expected immediate"): - case int(): - attributes["immediate"] = IntegerAttr( - immediate, IntegerType(12, Signedness.SIGNED) - ) - case str(): - attributes["immediate"] = LabelAttr(immediate) + attributes["immediate"] = _parse_immediate_value( + parser, IntegerType(12, Signedness.SIGNED) + ) if parser.parse_optional_punctuation(","): attributes["rd"] = parser.parse_attribute() return attributes @@ -2992,12 +2989,25 @@ class FSwOp(RsRsImmFloatOperation): # endregion -def _parse_int_or_str_literal(parser: Parser, msg: str) -> int | str: - if (term := parser.parse_optional_integer()) is not None: - return term - if (term := parser.parse_optional_str_literal()) is not None: - return term - parser.raise_error(msg) +def _parse_optional_immediate_value( + parser: Parser, integer_type: IntegerType | IndexType +) -> IntegerAttr[IntegerType | IndexType] | LabelAttr | None: + """ + Parse an optional immediate value. If an integer is parsed, an integer attr with the specified type is created. + """ + if (immediate := parser.parse_optional_integer()) is not None: + return IntegerAttr(immediate, integer_type) + if (immediate := parser.parse_optional_str_literal()) is not None: + return LabelAttr(immediate) + + +def _parse_immediate_value( + parser: Parser, integer_type: IntegerType | IndexType +) -> IntegerAttr[IntegerType | IndexType] | LabelAttr: + return parser.expect( + lambda: _parse_optional_immediate_value(parser, integer_type), + "Expected immediate", + ) RISCV = Dialect( From 68a1d7dab5a3b54213a87d96c245411628c05591 Mon Sep 17 00:00:00 2001 From: "Ka Wing, Li" <68145845+kingiler@users.noreply.github.com> Date: Mon, 31 Jul 2023 14:29:41 +0000 Subject: [PATCH 4/4] test: (riscv) add test for helper function --- tests/dialects/test_riscv.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/tests/dialects/test_riscv.py b/tests/dialects/test_riscv.py index 614e246cfe..142b017f76 100644 --- a/tests/dialects/test_riscv.py +++ b/tests/dialects/test_riscv.py @@ -3,7 +3,9 @@ from xdsl.builder import Builder from xdsl.dialects import riscv from xdsl.dialects.builtin import IntegerAttr, ModuleOp, i32 -from xdsl.utils.exceptions import VerifyException +from xdsl.ir import MLContext +from xdsl.parser import Parser +from xdsl.utils.exceptions import ParseError, VerifyException from xdsl.utils.test_value import TestSSAValue @@ -246,3 +248,13 @@ def test_float_register(): f1 = TestSSAValue(riscv.Registers.FT0) f2 = TestSSAValue(riscv.Registers.FT1) riscv.FAddSOp(f1, f2).verify() + + +def test_riscv_parse_immediate_value(): + ctx = MLContext() + ctx.register_dialect(riscv.RISCV) + + prog = """riscv.jalr %0, 1.1, !riscv.reg<> : (!riscv.reg<>) -> ()""" + parser = Parser(ctx, prog) + with pytest.raises(ParseError, match="Expected immediate"): + parser.parse_operation()