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.
Activity