def test_output_unitary_same_as_qiskit(): qubits = tuple(_make_qubits(5)) operations = _all_operations(*qubits, include_measurements=False) output = cirq.QasmOutput(operations, qubits, header='Generated from Cirq', precision=10) text = str(output) circuit = cirq.Circuit(operations) cirq_unitary = circuit.unitary(qubit_order=qubits) cq.assert_qiskit_parsed_qasm_consistent_with_unitary(text, cirq_unitary)
def test_unsupported_operation(): q0, = _make_qubits(1) class UnsupportedOperation(cirq.Operation): qubits = (q0,) with_qubits = NotImplemented output = cirq.QasmOutput((UnsupportedOperation(),), (q0,)) with pytest.raises(ValueError): _ = str(output)
def test_empty_circuit_one_qubit(): (q0, ) = _make_qubits(1) output = cirq.QasmOutput((), (q0, )) assert (str(output) == """OPENQASM 2.0; include "qelib1.inc"; // Qubits: [q0] qreg q[1]; """)
def test_empty_circuit_no_qubits(): output = cirq.QasmOutput((), ()) assert ( str(output) == """OPENQASM 2.0; include "qelib1.inc"; // Qubits: [] """ )
def test_header(): (q0, ) = _make_qubits(1) output = cirq.QasmOutput( (), (q0, ), header="""My test circuit Device: Bristlecone""", ) assert (str(output) == """// My test circuit // Device: Bristlecone OPENQASM 2.0; include "qelib1.inc"; // Qubits: [q0] qreg q[1]; """) output = cirq.QasmOutput( (), (q0, ), header=""" My test circuit Device: Bristlecone """, ) assert (str(output) == """// // My test circuit // Device: Bristlecone // OPENQASM 2.0; include "qelib1.inc"; // Qubits: [q0] qreg q[1]; """)
def test_precision(): (q0, ) = _make_qubits(1) output = cirq.QasmOutput((cirq.X(q0)**0.1234567, ), (q0, ), precision=3) assert (str(output) == """OPENQASM 2.0; include "qelib1.inc"; // Qubits: [q0] qreg q[1]; rx(pi*0.123) q[0]; """)
def test_single_gate_with_parameter(): (q0, ) = _make_qubits(1) output = cirq.QasmOutput((cirq.X(q0)**0.25, ), (q0, )) assert (str(output) == """OPENQASM 2.0; include "qelib1.inc"; // Qubits: [q0] qreg q[1]; rx(pi*0.25) q[0]; """)
def test_single_gate_no_parameter(): q0, = _make_qubits(1) output = cirq.QasmOutput((cirq.X(q0), ), (q0, )) assert (str(output) == """OPENQASM 2.0; include "qelib1.inc"; // Qubits: [q0] qreg q[1]; x q[0]; """)
def test_save_to_file(tmpdir): file_path = os.path.join(tmpdir, 'test.qasm') (q0, ) = _make_qubits(1) output = cirq.QasmOutput((), (q0, )) output.save(file_path) with open(file_path, 'r') as f: file_content = f.read() assert (file_content == """OPENQASM 2.0; include "qelib1.inc"; // Qubits: [q0] qreg q[1]; """)
def test_save_to_file(): q0, = _make_qubits(1) output = cirq.QasmOutput((), (q0, )) with cirq.testing.TempFilePath() as file_path: output.save(file_path) with open(file_path, 'r') as f: file_content = f.read() assert (file_content == """OPENQASM 2.0; include "qelib1.inc"; // Qubits: [q0] qreg q[1]; """)
def test_output_parseable_by_qiskit(): qubits = tuple(_make_qubits(5)) operations = _all_operations(*qubits) output = cirq.QasmOutput(operations, qubits, header='Generated from Cirq', precision=10) text = str(output) # coverage: ignore try: # We don't want to require qiskit as a dependency but # if Qiskit is installed, test QASM output against it. import qiskit # type: ignore except ImportError: return assert qiskit.qasm.Qasm(data=text).parse().qasm() is not None
def test_output_format(): def filter_unpredictable_numbers(text): return re.sub(r'u3\(.+\)', r'u3(<not-repeatable>)', text) qubits = tuple(_make_qubits(5)) operations = _all_operations(*qubits) output = cirq.QasmOutput(operations, qubits, header='Generated from Cirq!', precision=5) assert (filter_unpredictable_numbers( str(output)) == filter_unpredictable_numbers("""// Generated from Cirq! OPENQASM 2.0; include "qelib1.inc"; // Qubits: [q0, q1, q2, q3, q4] qreg q[5]; creg m_xX[1]; creg m_x_a[1]; creg m0[1]; // Measurement: x? creg m_X[1]; creg m__x[1]; creg m_multi[3]; z q[0]; rz(pi*0.625) q[0]; y q[0]; ry(pi*0.375) q[0]; x q[0]; rx(pi*0.875) q[0]; h q[1]; cz q[0],q[1]; // Gate: CZ**0.25 u3(pi*0.5,pi*1.0,pi*0.75) q[0]; u3(pi*0.5,pi*1.0,pi*0.25) q[1]; rx(pi*0.5) q[0]; cx q[0],q[1]; rx(pi*0.375) q[0]; ry(pi*0.5) q[1]; cx q[1],q[0]; rx(pi*-0.5) q[1]; rz(pi*0.5) q[1]; cx q[0],q[1]; u3(pi*0.5,pi*0.375,0) q[0]; u3(pi*0.5,pi*0.875,0) q[1]; cx q[0],q[1]; // Gate: CNOT**0.5 ry(pi*-0.5) q[1]; u3(pi*0.5,0,pi*0.25) q[0]; u3(pi*0.5,0,pi*0.75) q[1]; rx(pi*0.5) q[0]; cx q[0],q[1]; rx(pi*0.25) q[0]; ry(pi*0.5) q[1]; cx q[1],q[0]; rx(pi*-0.5) q[1]; rz(pi*0.5) q[1]; cx q[0],q[1]; u3(pi*0.5,pi*1.0,pi*1.0) q[0]; u3(pi*0.5,pi*0.5,pi*1.0) q[1]; ry(pi*0.5) q[1]; swap q[0],q[1]; // Gate: SWAP**0.75 cx q[0],q[1]; ry(pi*-0.5) q[0]; u3(pi*0.5,0,pi*0.45919) q[1]; u3(pi*0.5,0,pi*1.95919) q[0]; rx(pi*0.5) q[1]; cx q[1],q[0]; rx(pi*0.125) q[1]; ry(pi*0.5) q[0]; cx q[0],q[1]; rx(pi*-0.5) q[0]; rz(pi*0.5) q[0]; cx q[1],q[0]; u3(pi*0.5,pi*0.91581,pi*1.0) q[1]; u3(pi*0.5,pi*1.41581,pi*1.0) q[0]; ry(pi*0.5) q[0]; cx q[0],q[1]; h q[2]; ccx q[0],q[1],q[2]; h q[2]; ccx q[0],q[1],q[2]; // Gate: CCZ**0.5 rz(pi*0.125) q[0]; rz(pi*0.125) q[1]; rz(pi*0.125) q[2]; cx q[0],q[1]; cx q[1],q[2]; rz(pi*-0.125) q[1]; rz(pi*0.125) q[2]; cx q[0],q[1]; cx q[1],q[2]; rz(pi*-0.125) q[2]; cx q[0],q[1]; cx q[1],q[2]; rz(pi*-0.125) q[2]; cx q[0],q[1]; cx q[1],q[2]; // Gate: TOFFOLI**0.5 h q[2]; rz(pi*0.125) q[0]; rz(pi*0.125) q[1]; rz(pi*0.125) q[2]; cx q[0],q[1]; cx q[1],q[2]; rz(pi*-0.125) q[1]; rz(pi*0.125) q[2]; cx q[0],q[1]; cx q[1],q[2]; rz(pi*-0.125) q[2]; cx q[0],q[1]; cx q[1],q[2]; rz(pi*-0.125) q[2]; cx q[0],q[1]; cx q[1],q[2]; h q[2]; cswap q[0],q[1],q[2]; id q[0]; id q[0]; id q[1]; id q[2]; // Gate: ISWAP cx q[2],q[0]; h q[2]; cx q[0],q[2]; rz(pi*0.5) q[2]; cx q[0],q[2]; rz(pi*-0.5) q[2]; h q[2]; cx q[2],q[0]; u3(pi*-0.25, pi*0.611, pi*-0.611) q[1]; u2(pi*-0.167, pi*0.167) q[1]; u2(pi*1.277, pi*-1.277) q[1]; measure q[0] -> m_xX[0]; measure q[2] -> m_x_a[0]; measure q[1] -> m0[0]; measure q[3] -> m_X[0]; measure q[4] -> m__x[0]; measure q[2] -> m_x_a[0]; measure q[1] -> m_multi[0]; x q[2]; // Invert the following measurement measure q[2] -> m_multi[1]; measure q[3] -> m_multi[2]; // Dummy operation // Operation: DummyCompositeOperation() x q[0]; """))
def test_version(): q0, = _make_qubits(1) with pytest.raises(ValueError): output = cirq.QasmOutput((), (q0,), version='3.0') _ = str(output)