Skip to content

Add arguments screen

add_arguments_screen

AddArguments

Bases: Screen[ModulePass | None]

Screen called when selected pass has arguments requiring user input.

Source code in xdsl/interactive/add_arguments_screen.py
13
14
15
16
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
class AddArguments(Screen[ModulePass | None]):
    """
    Screen called when selected pass has arguments requiring user input.
    """

    CSS_PATH = "add_arguments_screen.tcss"

    selected_pass_type: type[ModulePass]
    selected_pass_value = Reactive[ModulePass | None](None)
    argument_text_area: TextArea

    def __init__(self, selected_pass_type: type[ModulePass]):
        self.selected_pass_type = selected_pass_type
        self.argument_text_area = TextArea(
            " ".join(
                f"{n}={t if d is None else d}"
                for n, t, d in get_pass_option_infos(selected_pass_type)
            ),
            id="argument_text_area",
        )
        self.enter_button = Button("Enter", id="enter_button")

        super().__init__()

    def compose(self) -> ComposeResult:
        with ScrollableContainer(id="container"):
            yield self.argument_text_area
            with Horizontal(id="cancel_enter_buttons"):
                yield Button("Clear Text", id="clear_input_screen_button")
                yield self.enter_button
                yield Button("Cancel", id="quit_screen_button")

    def on_mount(self) -> None:
        """Configure widgets in this application before it is first shown."""
        self.query_one(
            "#argument_text_area"
        ).border_title = "Provide arguments to apply to selected pass."
        # Initialize parsed pass
        self.update_selected_pass_value()
        # Initialize enter button
        self.watch_selected_pass_value()

    @on(TextArea.Changed, "#argument_text_area")
    def update_selected_pass_value(self) -> None:
        concatenated_arg_val = self.argument_text_area.text

        try:
            parsed_spec = list(
                parse_pipeline(
                    f"{self.selected_pass_type.name}{{{concatenated_arg_val}}}"
                )
            )[0]
        except PassPipelineParseError:
            self.selected_pass_value = None
            return

        missing_fields = self.selected_pass_type.required_fields().difference(
            parsed_spec.args.keys()
        )

        if missing_fields:
            self.selected_pass_value = None
            return

        try:
            self.selected_pass_value = self.selected_pass_type.from_pass_spec(
                parsed_spec
            )
        except ValueError:
            self.selected_pass_value = None

    def watch_selected_pass_value(self):
        self.enter_button.disabled = self.selected_pass_value is None

    @on(Button.Pressed, "#quit_screen_button")
    def exit_screen(self, event: Button.Pressed) -> None:
        self.dismiss(None)

    @on(Button.Pressed, "#clear_input_screen_button")
    def clear_text_area(self, event: Button.Pressed) -> None:
        self.argument_text_area.load_text("")

    @on(Button.Pressed, "#enter_button")
    def enter_arguments(self, event: Button.Pressed) -> None:
        assert self.selected_pass_value is not None
        self.dismiss(self.selected_pass_value)

CSS_PATH = 'add_arguments_screen.tcss' class-attribute instance-attribute

selected_pass_value = Reactive[ModulePass | None](None) class-attribute instance-attribute

selected_pass_type: type[ModulePass] = selected_pass_type instance-attribute

argument_text_area: TextArea = TextArea(' '.join(f'{n}={t if d is None else d}' for n, t, d in (get_pass_option_infos(selected_pass_type))), id='argument_text_area') instance-attribute

enter_button = Button('Enter', id='enter_button') instance-attribute

__init__(selected_pass_type: type[ModulePass])

Source code in xdsl/interactive/add_arguments_screen.py
24
25
26
27
28
29
30
31
32
33
34
35
def __init__(self, selected_pass_type: type[ModulePass]):
    self.selected_pass_type = selected_pass_type
    self.argument_text_area = TextArea(
        " ".join(
            f"{n}={t if d is None else d}"
            for n, t, d in get_pass_option_infos(selected_pass_type)
        ),
        id="argument_text_area",
    )
    self.enter_button = Button("Enter", id="enter_button")

    super().__init__()

compose() -> ComposeResult

Source code in xdsl/interactive/add_arguments_screen.py
37
38
39
40
41
42
43
def compose(self) -> ComposeResult:
    with ScrollableContainer(id="container"):
        yield self.argument_text_area
        with Horizontal(id="cancel_enter_buttons"):
            yield Button("Clear Text", id="clear_input_screen_button")
            yield self.enter_button
            yield Button("Cancel", id="quit_screen_button")

on_mount() -> None

Configure widgets in this application before it is first shown.

Source code in xdsl/interactive/add_arguments_screen.py
45
46
47
48
49
50
51
52
53
def on_mount(self) -> None:
    """Configure widgets in this application before it is first shown."""
    self.query_one(
        "#argument_text_area"
    ).border_title = "Provide arguments to apply to selected pass."
    # Initialize parsed pass
    self.update_selected_pass_value()
    # Initialize enter button
    self.watch_selected_pass_value()

update_selected_pass_value() -> None

Source code in xdsl/interactive/add_arguments_screen.py
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
@on(TextArea.Changed, "#argument_text_area")
def update_selected_pass_value(self) -> None:
    concatenated_arg_val = self.argument_text_area.text

    try:
        parsed_spec = list(
            parse_pipeline(
                f"{self.selected_pass_type.name}{{{concatenated_arg_val}}}"
            )
        )[0]
    except PassPipelineParseError:
        self.selected_pass_value = None
        return

    missing_fields = self.selected_pass_type.required_fields().difference(
        parsed_spec.args.keys()
    )

    if missing_fields:
        self.selected_pass_value = None
        return

    try:
        self.selected_pass_value = self.selected_pass_type.from_pass_spec(
            parsed_spec
        )
    except ValueError:
        self.selected_pass_value = None

watch_selected_pass_value()

Source code in xdsl/interactive/add_arguments_screen.py
84
85
def watch_selected_pass_value(self):
    self.enter_button.disabled = self.selected_pass_value is None

exit_screen(event: Button.Pressed) -> None

Source code in xdsl/interactive/add_arguments_screen.py
87
88
89
@on(Button.Pressed, "#quit_screen_button")
def exit_screen(self, event: Button.Pressed) -> None:
    self.dismiss(None)

clear_text_area(event: Button.Pressed) -> None

Source code in xdsl/interactive/add_arguments_screen.py
91
92
93
@on(Button.Pressed, "#clear_input_screen_button")
def clear_text_area(self, event: Button.Pressed) -> None:
    self.argument_text_area.load_text("")

enter_arguments(event: Button.Pressed) -> None

Source code in xdsl/interactive/add_arguments_screen.py
95
96
97
98
@on(Button.Pressed, "#enter_button")
def enter_arguments(self, event: Button.Pressed) -> None:
    assert self.selected_pass_value is not None
    self.dismiss(self.selected_pass_value)