You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Move the QASM 2 printer and its branch pre-processing out of qasm2.py #447
Follow-up to #338. That PR fixes QASM 2 branch output with a Qasm2Printer in src/pyqasm/modules/qasm2.py. The fix works, but it grows qasm2.py from 216 to 564 lines. Most of the growth is module-level helpers that pre-process the unrolled AST before printing:
_parse_branch_condition, _add_chain_constraint, _flatten_branch — walk the unroller's per-bit if chain back into one if (creg == int) comparison.
_collapse_broadcast_measurement, _single_index, _writes_to_register — rebuild measure q -> c from per-bit measurements and guard multi-statement bodies.
_creg_sizes, _qreg_sizes, _qasm3_repr, _unsupported_condition_message — supporting lookups and error text.
These helpers mix three concerns in one file: the Qasm2Module class, QASM 2 validation, and QASM 2 serialization. Qasm2Module._filter_branch also calls _flatten_branch and discards the result, only to reuse its exceptions.
This issue moves the helpers and Qasm2Printer out of qasm2.py and simplifies their design. Behavior must not change.
Acceptance criteria
Qasm2Printer and the branch pre-processing helpers live in a separate module. qasm2.py keeps only Qasm2Module and imports what it needs.
Validation (_filter_branch) and printing still share one definition of what QASM 2 can express, so validate() is never stricter or looser than the printer.
Helpers with one caller fold into it, or get a clear name and docstring if they stay separate.
tests/qasm2/test_branching.py and the rest of the suite pass without changes to expected output or error messages.
Out of scope
Ideally, qasm2.py should not need this pre-processing at all. The unroller ravels if (c == 2) into a nested per-bit chain, and the printer then undoes that work. A cleaner fix is an unroller that keeps QASM 2 branches in their original form. That change touches the visitor and is larger, so this issue keeps the pre-processing and only relocates and simplifies it.
Implementation (Optional)
src/pyqasm/printer.py already holds circuit drawing, so the new code needs a different name. One option is src/pyqasm/modules/qasm2_printer.py.
_flatten_branch could return a small dataclass (register, value, body) in place of a tuple, and expose a separate check function for _filter_branch.
Hi @TheGupta2012, I’d like to take this one. Could you assign it to me?
Since this depends on #338, I’ll base the work on that branch and rebase once it merges.
Plan:
Move Qasm2Printer and the branch pre-processing helpers into src/pyqasm/modules/qasm2_printer.py, leaving only Qasm2Module in qasm2.py.
Have _flatten_branch return a small dataclass (register, value, body) and expose a separate check function, so _filter_branch stops calling it just to reuse its exceptions. Validation and printing will share that one definition, so validate() can’t drift from the printer.
Fold single-caller helpers into their caller; keep the rest with clear names and docstrings.
No behavior changes: tests/qasm2/test_branching.py and the rest of the suite should pass with no edits to expected output or error messages.
Hi @RazinShaikh, I’ve opened a PR for this: #625. It adds the missing static previews for the remaining rules_basic entries in zxlive/rewrite_data.py, following the style of the existing picture entries.
Activity
Riiocodee commentedon Oct 19, 2026
Hi @TheGupta2012, I’d like to take this one. Could you assign it to me?
Since this depends on #338, I’ll base the work on that branch and rebase once it merges.
Plan:
Move Qasm2Printer and the branch pre-processing helpers into src/pyqasm/modules/qasm2_printer.py, leaving only Qasm2Module in qasm2.py.
Have _flatten_branch return a small dataclass (register, value, body) and expose a separate check function, so _filter_branch stops calling it just to reuse its exceptions. Validation and printing will share that one definition, so validate() can’t drift from the printer.
Fold single-caller helpers into their caller; keep the rest with clear names and docstrings.
No behavior changes: tests/qasm2/test_branching.py and the rest of the suite should pass with no edits to expected output or error messages.
Thanks!
Riiocodee commentedon Oct 19, 2026
Hi @RazinShaikh, I’ve opened a PR for this: #625. It adds the missing static previews for the remaining rules_basic entries in zxlive/rewrite_data.py, following the style of the existing picture entries.
Thanks!