Skip to content

Move the QASM 2 printer and its branch pre-processing out of qasm2.py #447

Open

Description

@TheGupta2012

Feature Description

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.

Depends on #338 merging first.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestqasm2Related to openqasm2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions