Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Bitwise, shift and index operations on `bit[n]` registers raise raw `TypeError`

Aperta
#385 0 commenti 0 reazioni 1 assegnatario Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@TheGupta2012 ci sta già lavorando.

Dal 21/8/2026.

  • #404 di @TheGupta2012 — aperta

Valutazione

Questa issue non è ancora stata valutata.

Descrizione

bug error-handling llm-assisted qasm3

Limitation

The spec defines bit[n] as a register of bits supporting
bitwise and shift operators and
indexing / slicing.

pyqasm stores a bit[n] value as a Python str, so every one of these operations reaches
a Python operator that str does not implement. The result is an uncaught TypeError
escaping the public API instead of either a correct value or a ValidationError.

Example QASM failure

import pyqasm

for op in ["a | b", "a & b", "a ^ b"]:
    m = pyqasm.loads(f'''
    OPENQASM 3.0;
    bit[4] a = "1010";
    bit[4] b = "0101";
    bit[4] c = {op};
    ''')
    m.validate()
TypeError: unsupported operand type(s) for |: 'str' and 'str'
TypeError: unsupported operand type(s) for &: 'str' and 'str'
TypeError: unsupported operand type(s) for ^: 'str' and 'str'

Shifts fail the same way:

OPENQASM 3.0;
bit[4] a = "1010";
bit[4] c = a << 1;
// TypeError: unsupported operand type(s) for <<: 'str' and 'int'

Indexing and slicing also fail, and these are plain reads:

OPENQASM 3.0;
bit[8] b = "00101010";
bit c = b[0];
// TypeError: string indices must be integers, not 'tuple'
OPENQASM 3.0;
bit[8] b = "00101010";
bit[4] c = b[0:3];
// TypeError: string indices must be integers, not 'tuple'

Related, and blocked by the same representation:

OPENQASM 3.0;
bit[4] a = "1010";
bit[4] c = ~a;
// ValidationError: Invalid initialization value for variable 'c'

Change Requested

  1. Give bit[n] an internal representation that supports the spec's operator set. A
    fixed-width integer plus an explicit width is the natural choice; the str form is then
    produced only at serialisation time.
  2. Support |, &, ^, ~, <<, >> on bit[n] operands, with the spec rule that both
    operands of a binary bitwise operator must have equal width.
  3. Support b[i] (yielding bit) and b[a:b] / b[a:step:b] (yielding bit[k]).
  4. No operation on a bit[n] should ever surface a raw Python exception; anything genuinely
    invalid must raise ValidationError with the offending span.

Implementation Details

  • Bit values are produced by the classical declaration path in
    Qasm3Visitor._visit_classical_declaration (src/pyqasm/visitor.py:~1991) and consumed by
    Qasm3ExprEvaluator in src/pyqasm/expressions.py.
  • The binary/unary operator dispatch in src/pyqasm/maps/expressions.py applies Python
    operators directly to the stored value. Bit-typed operands need to be converted to their
    integer form before the operator is applied, and the result re-widened and masked to n
    bits.
  • Indexing is handled by Qasm3Analyzer.analyze_classical_indices
    (src/pyqasm/analyzer.py); it currently assumes an indexable non-str container, which is
    where string indices must be integers, not 'tuple' originates.
  • A shared helper pair — bits_to_int(value, width) / int_to_bits(value, width) — keeps the
    conversion in one place and makes the serialiser's job unambiguous.
  • Once this lands, the rotl / rotr / popcount built-ins (separate issue) become
    straightforward, since they are defined on bit[n].
  • Tests: tests/qasm3/test_expressions.py — each operator, width-mismatch errors, single-bit
    and ranged reads, and a round-trip through dumps() confirming the "1010" literal form
    is preserved.
Lingua principale
Python
Stelle
29
Fork
33
Merge medio
2g 4h
PR unite (30g)
15

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di qBraid/pyqasm

Tutte le issue di qBraid/pyqasm

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.