Skip to content

Commit 19978a1

Browse files
committed
Handle cases with generators
1 parent cda4f70 commit 19978a1

File tree

2 files changed

+20
-7
lines changed

2 files changed

+20
-7
lines changed

oqpy/program.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -389,25 +389,29 @@ def delay(
389389
qubits_or_frames: AstConvertible | Iterable[AstConvertible] | None = None,
390390
) -> Program:
391391
"""Apply a delay to a set of qubits or frames."""
392-
if isinstance(qubits_or_frames, Iterable) and not any(True for _ in qubits_or_frames):
393-
return self
394-
elif qubits_or_frames is None:
392+
ast_duration = to_ast(self, convert_float_to_duration(time))
393+
394+
if qubits_or_frames is None:
395395
ast_qubits_or_frames = []
396396
else:
397397
if not isinstance(qubits_or_frames, Iterable):
398398
qubits_or_frames = [qubits_or_frames]
399+
else:
400+
qubits_or_frames = list(qubits_or_frames)
401+
if len(qubits_or_frames) == 0:
402+
return self
399403
ast_qubits_or_frames = map_to_ast(self, qubits_or_frames)
400-
ast_duration = to_ast(self, convert_float_to_duration(time))
401404
self._add_statement(ast.DelayInstruction(ast_duration, ast_qubits_or_frames))
402405
return self
403406

404407
def barrier(self, qubits_or_frames: Iterable[AstConvertible] | None = None) -> Program:
405408
"""Apply a barrier to a set of qubits or frames."""
406-
if isinstance(qubits_or_frames, Iterable) and not any(True for _ in qubits_or_frames):
407-
return self
408-
elif qubits_or_frames is None:
409+
if qubits_or_frames is None:
409410
ast_qubits_or_frames = []
410411
else:
412+
qubits_or_frames = list(qubits_or_frames)
413+
if len(qubits_or_frames) == 0:
414+
return self
411415
ast_qubits_or_frames = map_to_ast(self, qubits_or_frames)
412416
self._add_statement(ast.QuantumBarrier(ast_qubits_or_frames))
413417
return self

tests/test_directives.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -875,6 +875,13 @@ def test_barrier_delay_arguments():
875875
prog.delay(3e-7, frame1)
876876
prog.delay(4e-7, [frame, frame1])
877877

878+
def frame_generator(frames):
879+
for frame in frames:
880+
yield frame
881+
882+
prog.barrier(frame_generator([frame, frame1]))
883+
prog.delay(5e-7, frame_generator([frame, frame1]))
884+
878885
expected = textwrap.dedent(
879886
"""
880887
OPENQASM 3.0;
@@ -886,6 +893,8 @@ def test_barrier_delay_arguments():
886893
barrier frame0, frame1;
887894
delay[300.0ns] frame1;
888895
delay[400.0ns] frame0, frame1;
896+
barrier frame0, frame1;
897+
delay[500.0ns] frame0, frame1;
889898
"""
890899
).strip()
891900

0 commit comments

Comments
 (0)