Skip to content

Xdsl run

xdsl_run

xDSLRunMain

Bases: CommandLineTool

Source code in xdsl/tools/xdsl_run.py
 17
 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
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
class xDSLRunMain(CommandLineTool):
    interpreter: Interpreter

    def __init__(
        self,
        description: str = "xDSL modular runner",
        args: Sequence[str] | None = None,
    ):
        self.available_frontends = {}

        self.ctx = Context()
        self.register_all_dialects()
        self.register_all_frontends()
        # arg handling
        arg_parser = argparse.ArgumentParser(description=description)
        self.register_all_arguments(arg_parser)
        self.args = arg_parser.parse_args(args=args)

        self.ctx.allow_unregistered = self.args.allow_unregistered_dialect

    def register_all_arguments(self, arg_parser: argparse.ArgumentParser):
        arg_parser.add_argument(
            "--verbose",
            default=False,
            action="store_true",
            help="Print resulting Python values.",
        )
        arg_parser.add_argument(
            "--symbol",
            default="main",
            type=str,
            help="Name of function to call.",
        )
        arg_parser.add_argument(
            "--index-bitwidth",
            choices=(32, 64),
            # Otherwise default is None, overriding interpreter default mechanism
            default=Interpreter.DEFAULT_BITWIDTH,
            type=int,
            nargs="?",
            help="Bitwidth of the index type representation.",
        )
        arg_parser.add_argument(
            "--args",
            default="",
            type=str,
            help="Arguments to pass to entry function. Comma-separated list of xDSL "
            "Attributes, that will be parsed and converted by the interpreter.",
        )
        return super().register_all_arguments(arg_parser)

    def register_implementations(self, interpreter: Interpreter):
        register_implementations(interpreter, self.ctx)

    def run(self):
        input, file_extension = self.get_input_stream()
        try:
            module = self.parse_chunk(input, file_extension)
            if module is not None:
                module.verify()
                interpreter = Interpreter(
                    module, index_bitwidth=self.args.index_bitwidth
                )
                self.register_implementations(interpreter)
                symbol = self.args.symbol
                assert isinstance(symbol, str)
                parser = Parser(self.ctx, self.args.args, "args")
                runner_args = parser.parse_optional_undelimited_comma_separated_list(
                    parser.parse_optional_attribute, parser.parse_attribute
                )
                if runner_args is None:
                    runner_args = ()
                op = interpreter.get_op_for_symbol(symbol)
                trait = op.get_trait(CallableOpInterface)
                assert trait is not None

                args = tuple(
                    interpreter.value_for_attribute(attr, attr_type)
                    for attr, attr_type in zip(
                        runner_args, trait.get_argument_types(op)
                    )
                )
                result = interpreter.call_op(op, args)
                if self.args.verbose:
                    if result:
                        if len(result) == 1:
                            print(f"result: {result[0]}")
                        else:
                            print("result: (")
                            print(",\n".join(f"    {res}" for res in result))
                            print(")")
                    else:
                        print("result: ()")
        finally:
            if input is not sys.stdin:
                input.close()

interpreter: Interpreter instance-attribute

available_frontends = {} instance-attribute

ctx = Context() instance-attribute

args = arg_parser.parse_args(args=args) instance-attribute

__init__(description: str = 'xDSL modular runner', args: Sequence[str] | None = None)

Source code in xdsl/tools/xdsl_run.py
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def __init__(
    self,
    description: str = "xDSL modular runner",
    args: Sequence[str] | None = None,
):
    self.available_frontends = {}

    self.ctx = Context()
    self.register_all_dialects()
    self.register_all_frontends()
    # arg handling
    arg_parser = argparse.ArgumentParser(description=description)
    self.register_all_arguments(arg_parser)
    self.args = arg_parser.parse_args(args=args)

    self.ctx.allow_unregistered = self.args.allow_unregistered_dialect

register_all_arguments(arg_parser: argparse.ArgumentParser)

Source code in xdsl/tools/xdsl_run.py
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
66
def register_all_arguments(self, arg_parser: argparse.ArgumentParser):
    arg_parser.add_argument(
        "--verbose",
        default=False,
        action="store_true",
        help="Print resulting Python values.",
    )
    arg_parser.add_argument(
        "--symbol",
        default="main",
        type=str,
        help="Name of function to call.",
    )
    arg_parser.add_argument(
        "--index-bitwidth",
        choices=(32, 64),
        # Otherwise default is None, overriding interpreter default mechanism
        default=Interpreter.DEFAULT_BITWIDTH,
        type=int,
        nargs="?",
        help="Bitwidth of the index type representation.",
    )
    arg_parser.add_argument(
        "--args",
        default="",
        type=str,
        help="Arguments to pass to entry function. Comma-separated list of xDSL "
        "Attributes, that will be parsed and converted by the interpreter.",
    )
    return super().register_all_arguments(arg_parser)

register_implementations(interpreter: Interpreter)

Source code in xdsl/tools/xdsl_run.py
68
69
def register_implementations(self, interpreter: Interpreter):
    register_implementations(interpreter, self.ctx)

run()

Source code in xdsl/tools/xdsl_run.py
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
def run(self):
    input, file_extension = self.get_input_stream()
    try:
        module = self.parse_chunk(input, file_extension)
        if module is not None:
            module.verify()
            interpreter = Interpreter(
                module, index_bitwidth=self.args.index_bitwidth
            )
            self.register_implementations(interpreter)
            symbol = self.args.symbol
            assert isinstance(symbol, str)
            parser = Parser(self.ctx, self.args.args, "args")
            runner_args = parser.parse_optional_undelimited_comma_separated_list(
                parser.parse_optional_attribute, parser.parse_attribute
            )
            if runner_args is None:
                runner_args = ()
            op = interpreter.get_op_for_symbol(symbol)
            trait = op.get_trait(CallableOpInterface)
            assert trait is not None

            args = tuple(
                interpreter.value_for_attribute(attr, attr_type)
                for attr, attr_type in zip(
                    runner_args, trait.get_argument_types(op)
                )
            )
            result = interpreter.call_op(op, args)
            if self.args.verbose:
                if result:
                    if len(result) == 1:
                        print(f"result: {result[0]}")
                    else:
                        print("result: (")
                        print(",\n".join(f"    {res}" for res in result))
                        print(")")
                else:
                    print("result: ()")
    finally:
        if input is not sys.stdin:
            input.close()

main()

Source code in xdsl/tools/xdsl_run.py
115
116
def main():
    return xDSLRunMain().run()