Skip to content

Commit

Permalink
Update: Remove barrier support until quilc has better compatibility
Browse files Browse the repository at this point in the history
  • Loading branch information
ameyer-rigetti committed Jul 28, 2021
1 parent c0a0d2d commit 2686f3d
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 86 deletions.
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
# Changelog

## [0.4.2](https://github.com/rigetti/qiskit-rigetti/releases/tag/v0.4.2)

### Updates

- Removed barrier support until quilc has better compatibility. For now, barriers are omitted during compilation from OpenQASM to Quil, though they will remain in effect for Qiskit's own transpilation/optimization passes (#15)


## [0.4.1](https://github.com/rigetti/qiskit-rigetti/releases/tag/v0.4.1)

### Updates

- Limited support for barriers (#12)
- Added example notebooks to docs (#13)


## [0.4.0](https://github.com/rigetti/qiskit-rigetti/releases/tag/v0.4.0)

### Announcements
Expand Down
18 changes: 3 additions & 15 deletions qiskit_rigetti/_qcs_job.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,23 +113,11 @@ def _start_circuit(self, circuit: QuantumCircuit) -> Response:
def _handle_barriers(qasm: str, num_circuit_qubits: int) -> str:
lines = []
for line in qasm.splitlines():
if not line.startswith("barrier"):
lines.append(line)
if line.startswith("barrier"):
warnings.warn("barriers are currently omitted during execution on a RigettiQCSBackend")
continue

qubits = line[(len("barrier ")) :]
num_qubits = qubits.count(",") + 1
if num_qubits < num_circuit_qubits:
warnings.warn(
"barriers not applied to all circuit qubits will be omitted during execution on a RigettiQCSBackend"
" -- apply barrier to all circuit qubits to preserve barrier effect",
)
continue

lines += [
"#pragma PRESERVE_BLOCK;",
"#pragma END_PRESERVE_BLOCK;",
]
lines.append(line)
return "\n".join(lines)

def result(self) -> Result:
Expand Down
73 changes: 2 additions & 71 deletions tests/test_qcs_job.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ def test_init__ensure_native_quil__missing(backend: RigettiQCSBackend, mocker: M
assert quil_to_native_quil_spy.call_count == 1, "compile not performed correct number of times"


def test_init__circuit_with_barrier__all_qubits(backend: RigettiQCSBackend, mocker: MockerFixture):
def test_init__circuit_with_barrier(backend: RigettiQCSBackend, mocker: MockerFixture):
circuit = QuilCircuit(QuantumRegister(2, "q"), ClassicalRegister(2, "ro"))
circuit.h(0)
circuit.barrier()
Expand All @@ -156,82 +156,13 @@ def test_init__circuit_with_barrier__all_qubits(backend: RigettiQCSBackend, mock
"qreg q[2];",
"creg ro[2];",
"h q[0];",
"#pragma PRESERVE_BLOCK;",
"#pragma END_PRESERVE_BLOCK;",
"h q[0];",
"measure q[0] -> ro[0];",
"measure q[1] -> ro[1];",
]
)

make_job(backend, circuit, qc)

program: Program = quil_to_native_quil_spy.call_args[0][0]
qasm = program.out(calibrations=False).rstrip()
assert qasm == expected_qasm


def test_init__circuit_with_barrier__all_qubits_by_qreg(backend: RigettiQCSBackend, mocker: MockerFixture):
qreg = QuantumRegister(2, "q")
circuit = QuilCircuit(qreg, ClassicalRegister(2, "ro"))
circuit.h(0)
circuit.barrier(qreg)
circuit.h(0)
circuit.measure([0, 1], [0, 1])
qc = get_qc(backend.configuration().backend_name)
quil_to_native_quil_spy = mocker.spy(qc.compiler, "quil_to_native_quil")

expected_qasm = "\n".join(
[
"OPENQASM 2.0;",
'include "qelib1.inc";',
"qreg q[2];",
"creg ro[2];",
"h q[0];",
"#pragma PRESERVE_BLOCK;",
"#pragma END_PRESERVE_BLOCK;",
"h q[0];",
"measure q[0] -> ro[0];",
"measure q[1] -> ro[1];",
]
)

make_job(backend, circuit, qc)

program: Program = quil_to_native_quil_spy.call_args[0][0]
qasm = program.out(calibrations=False).rstrip()
assert qasm == expected_qasm


def test_init__circuit_with_barrier__qubit_subset(backend: RigettiQCSBackend, mocker: MockerFixture):
circuit = QuilCircuit(QuantumRegister(2, "q"), ClassicalRegister(2, "ro"))
circuit.h(0)
circuit.barrier(0)
circuit.h(0)
circuit.measure([0, 1], [0, 1])
qc = get_qc(backend.configuration().backend_name)
quil_to_native_quil_spy = mocker.spy(qc.compiler, "quil_to_native_quil")

expected_qasm = "\n".join(
[
"OPENQASM 2.0;",
'include "qelib1.inc";',
"qreg q[2];",
"creg ro[2];",
"h q[0];",
"h q[0];",
"measure q[0] -> ro[0];",
"measure q[1] -> ro[1];",
]
)

with pytest.warns(
UserWarning,
match=(
"barriers not applied to all circuit qubits will be omitted during execution on a RigettiQCSBackend -- "
"apply barrier to all circuit qubits to preserve barrier effect"
),
):
with pytest.warns(UserWarning, match="barriers are currently omitted during execution on a RigettiQCSBackend"):
make_job(backend, circuit, qc)

program: Program = quil_to_native_quil_spy.call_args[0][0]
Expand Down

0 comments on commit 2686f3d

Please sign in to comment.