Skip to content

Commit 789ab2b

Browse files
committed
Add support for negative control for OpenQASMBackend
1 parent 2e499cb commit 789ab2b

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

projectq/backends/_qasm.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from copy import deepcopy
1818

1919
from projectq.cengines import BasicEngine
20-
from projectq.meta import get_control_count
20+
from projectq.meta import get_control_count, has_negative_control
2121
from projectq.ops import (
2222
X,
2323
NOT,
@@ -41,6 +41,7 @@
4141
FlushGate,
4242
)
4343

44+
4445
# ==============================================================================
4546

4647

@@ -115,9 +116,11 @@ def is_available(self, cmd):
115116
Args:
116117
cmd (Command): Command for which to check availability
117118
"""
118-
gate = cmd.gate
119-
n_controls = get_control_count(cmd)
119+
if has_negative_control(cmd):
120+
return False
120121

122+
n_controls = get_control_count(cmd)
123+
gate = cmd.gate
121124
is_available = False
122125

123126
if gate in (Measure, Allocate, Deallocate, Barrier):

projectq/backends/_qasm_test.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
Command,
4343
All,
4444
)
45+
from projectq.types import WeakQubitRef
4546
from ._qasm import OpenQASMBackend
4647

4748
# ==============================================================================
@@ -206,6 +207,22 @@ def test_qasm_is_available_2control(gate, is_available):
206207
assert eng.is_available(cmd) == is_available
207208

208209

210+
def test_ibm_backend_is_available_negative_control():
211+
backend = OpenQASMBackend()
212+
backend.is_last_engine = True
213+
214+
qb0 = WeakQubitRef(engine=None, idx=0)
215+
qb1 = WeakQubitRef(engine=None, idx=1)
216+
217+
assert backend.is_available(Command(None, X, qubits=([qb0],), controls=[qb1]))
218+
assert backend.is_available(Command(None, X, qubits=([qb0],), controls=[qb1], control_state='1'))
219+
assert not backend.is_available(Command(None, X, qubits=([qb0],), controls=[qb1], control_state='0'))
220+
221+
assert backend.is_available(Command(None, X, qubits=([qb0],), controls=[qb1]))
222+
assert backend.is_available(Command(None, X, qubits=([qb0],), controls=[qb1], control_state='1'))
223+
assert not backend.is_available(Command(None, X, qubits=([qb0],), controls=[qb1], control_state='0'))
224+
225+
209226
def test_qasm_test_qasm_single_qubit_gates():
210227
eng = MainEngine(backend=OpenQASMBackend(), engine_list=[])
211228
qubit = eng.allocate_qubit()

0 commit comments

Comments
 (0)