Skip to content

Missing casts: angle() narrowing, angle(float), and int[n](bit[n]) #399

Description

@TheGupta2012

Limitation

The allowed casts table permits float -> angle
and bit -> int, and the
floating-point numbers section shows
an angle narrowed to a smaller width with angle(...).

pyqasm rejects all three.

Example QASM failure

Narrowing an angle — the spec's own example:

OPENQASM 3.0;
angle[20] a = pi / 2;
angle[20] b = pi;
angle[10] c;
c = angle(a + b);        // cast to angle[10]
ValidationError: Invalid initialization value for variable 'c'

float -> angle, marked Yes in the cast table:

OPENQASM 3.0;
float[64] f = 1.0;
angle[20] a = angle(f);
// ValidationError: Invalid initialization value for variable 'a'

bit -> int, also marked Yes:

OPENQASM 3.0;
bit[8] b = "00000101";
int[8] i = int[8](b);
// ValidationError: Invalid initialization value for variable 'i'

Casts that already work: int[n](float), uint(float), bool(int), bit[n](int).

Change Requested

  1. angle(x) and angle[n](x) where x is a float or an angle, applying the spec's
    fixed-point semantics: an angle[n] represents a value in [0, 2π) with n bits of
    precision, so narrowing truncates the low-order bits.
  2. int[n](b) and uint[n](b) where b is a bit[n], interpreting the bit register as the
    integer's binary representation.
  3. A cast the spec's table forbids must raise a ValidationError naming both types, rather
    than the current generic "Invalid initialization value" message.

Not in scope

  • float(duration) — the cast table marks this No; pyqasm's current rejection is correct.
  • float(angle) — the table also marks this No, though the spec's own comparison example uses
    it. pyqasm currently accepts it. Worth raising upstream on openqasm/openqasm to settle
    the inconsistency before changing behaviour either way.

Implementation Details

  • Cast handling is in Qasm3ExprEvaluator (src/pyqasm/expressions.py) together with the type
    maps in src/pyqasm/maps/expressions.py.
  • Angle semantics are the substantive part. An angle[n] is a fixed-point value: the stored
    integer is round(value / (2π) * 2**n), and narrowing from angle[m] to angle[n] with
    n < m truncates. Implementing that as an explicit representation makes the spec's worked
    results — 7 * (pi / 8) as angle[4] being "0111" — directly assertable in tests.
  • bit -> int depends on the width-carrying bit representation from the bit[n] operators
    issue; sequence that one first.
  • Encoding the spec's cast table as an explicit (from_type, to_type) -> allowed map gives
    correct rejection messages for free and documents the supported surface in one readable
    place.
  • Tests: tests/qasm3/test_casting.py — each newly supported cast with its expected value,
    angle narrowing against the spec's worked bit patterns, and a forbidden cast asserting a
    ValidationError that names both types.

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 requestllm-assistedUsed LLMs to fine tune issue description.qasm3Related to openqasm3qasm3-coverageAdding support for qasm3 constructs

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions