Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

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

Abierto
#385 0 comentarios 0 reacciones 1 asignado Ver en GitHub

Los mantenedores suelen responder en 1 día

@TheGupta2012 ya está trabajando en esto.

Desde el 21/8/2026.

  • #404 de @TheGupta2012 — abierto

Evaluación

Este issue todavía no se ha evaluado.

Descripción

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.
Lenguaje dominante
Python
Estrellas
29
Forks
33
Merge medio
2 d 4 h
PR fusionados (30 d)
15

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de qBraid/pyqasm

Todos los issues de qBraid/pyqasm

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.