Skip to content

Commit c3aa63a

Browse files
committed
Handle cases with generators
1 parent 91a6e6a commit c3aa63a

File tree

2 files changed

+18
-6
lines changed

2 files changed

+18
-6
lines changed

oqpy/program.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -340,25 +340,28 @@ def delay(
340340
qubits_or_frames: AstConvertible | Iterable[AstConvertible] | None = None,
341341
) -> Program:
342342
"""Apply a delay to a set of qubits or frames."""
343-
if isinstance(qubits_or_frames, Iterable) and not any(True for _ in qubits_or_frames):
344-
return self
345-
elif qubits_or_frames is None:
343+
if qubits_or_frames is None:
346344
ast_qubits_or_frames = []
347345
else:
348346
if not isinstance(qubits_or_frames, Iterable):
349347
qubits_or_frames = [qubits_or_frames]
348+
else:
349+
qubits_or_frames = list(qubits_or_frames)
350+
if len(qubits_or_frames) == 0:
351+
return self
350352
ast_qubits_or_frames = map_to_ast(self, qubits_or_frames)
351353
ast_duration = to_ast(self, make_duration(time))
352354
self._add_statement(ast.DelayInstruction(ast_duration, ast_qubits_or_frames))
353355
return self
354356

355357
def barrier(self, qubits_or_frames: Iterable[AstConvertible] | None = None) -> Program:
356358
"""Apply a barrier to a set of qubits or frames."""
357-
if isinstance(qubits_or_frames, Iterable) and not any(True for _ in qubits_or_frames):
358-
return self
359-
elif qubits_or_frames is None:
359+
if qubits_or_frames is None:
360360
ast_qubits_or_frames = []
361361
else:
362+
qubits_or_frames = list(qubits_or_frames)
363+
if len(qubits_or_frames) == 0:
364+
return self
362365
ast_qubits_or_frames = map_to_ast(self, qubits_or_frames)
363366
self._add_statement(ast.QuantumBarrier(ast_qubits_or_frames))
364367
return self

tests/test_directives.py

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

438+
def frame_generator(frames):
439+
for frame in frames:
440+
yield frame
441+
442+
prog.barrier(frame_generator([frame, frame1]))
443+
prog.delay(5e-7, frame_generator([frame, frame1]))
444+
438445
expected = textwrap.dedent(
439446
"""
440447
OPENQASM 3.0;
@@ -446,6 +453,8 @@ def test_barrier_delay_arguments():
446453
barrier frame0, frame1;
447454
delay[300.0ns] frame1;
448455
delay[400.0ns] frame0, frame1;
456+
barrier frame0, frame1;
457+
delay[500.0ns] frame0, frame1;
449458
"""
450459
).strip()
451460

0 commit comments

Comments
 (0)