def test_convert_to_ion_circuit():
    q0 = cirq.LineQubit(0)
    q1 = cirq.LineQubit(1)
    us = cirq.Duration(nanos=1000)
    ion_device = cirq.IonDevice(us, us, us, [q0, q1])

    clifford_circuit_1 = cirq.Circuit()
    clifford_circuit_1.append(
        [cirq.X(q0), cirq.H(q1),
         cirq.ms(np.pi / 4).on(q0, q1)])
    ion_circuit_1 = cirq.ion.ConvertToIonGates().convert_circuit(
        clifford_circuit_1)

    ion_device.validate_circuit(ion_circuit_1)
    cirq.testing.assert_circuits_with_terminal_measurements_are_equivalent(
        clifford_circuit_1, ion_circuit_1, atol=1e-6)
    clifford_circuit_2 = cirq.Circuit()
    clifford_circuit_2.append(
        [cirq.X(q0),
         cirq.CNOT(q1, q0),
         cirq.ms(np.pi / 4).on(q0, q1)])
    ion_circuit_2 = cirq.ion.ConvertToIonGates().convert_circuit(
        clifford_circuit_2)
    ion_device.validate_circuit(ion_circuit_2)
    cirq.testing.assert_circuits_with_terminal_measurements_are_equivalent(
        clifford_circuit_2, ion_circuit_2, atol=1e-6)
def test_init():
    d = ion_device(3)
    ms = 1000 * cirq.Duration(nanos=1)
    q0 = cirq.LineQubit(0)
    q1 = cirq.LineQubit(1)
    q2 = cirq.LineQubit(2)

    assert d.qubits == {q0, q1, q2}
    assert d.duration_of(cirq.Z(q0)) == 10 * ms
    assert d.duration_of(cirq.measure(q0)) == 100 * ms
    assert d.duration_of(cirq.measure(q0, q1)) == 100 * ms
    assert d.duration_of(cirq.ops.XX(q0, q1)) == 200 * ms
    with pytest.raises(ValueError, match="Unsupported gate type"):
        _ = d.duration_of(cirq.I(q0))

    with pytest.raises(TypeError, match="NamedQubit"):
        with cirq.testing.assert_deprecated(
                "Use cirq_aqt.aqt_device.AQTDevice", deadline='v0.16'):
            _ = cirq.IonDevice(
                measurement_duration=ms,
                twoq_gates_duration=ms,
                oneq_gates_duration=ms,
                qubits=[cirq.LineQubit(0),
                        cirq.NamedQubit("a")],
            )
Exemple #3
0
def get_aqt_device(
        num_qubits: int) -> Tuple[cirq.IonDevice, List[cirq.LineQubit]]:
    """Returns an AQT ion device

    Args:
        num_qubits: number of qubits

    Returns:
         IonDevice, qubit_list
    """
    qubit_list = cirq.LineQubit.range(num_qubits)
    us = 1000 * cirq.Duration(nanos=1)
    ion_device = cirq.IonDevice(
        measurement_duration=100 * us,
        twoq_gates_duration=200 * us,
        oneq_gates_duration=10 * us,
        qubits=qubit_list,
    )
    return ion_device, qubit_list
Exemple #4
0
def test_convert_to_ion_circuit():
    q0 = cirq.LineQubit(0)
    q1 = cirq.LineQubit(1)
    us = cirq.Duration(nanos=1000)
    with cirq.testing.assert_deprecated("cirq_aqt.aqt_device.AQTDevice",
                                        deadline='v0.16',
                                        count=2):
        ion_device = cirq.IonDevice(us, us, us, [q0, q1])
    with cirq.testing.assert_deprecated("cirq_aqt.aqt_device.AQTTargetGateset",
                                        deadline='v0.16',
                                        count=None):
        convert_to_ion_gates = cirq.ion.ConvertToIonGates()

    clifford_circuit_1 = cirq.Circuit()
    clifford_circuit_1.append(
        [cirq.X(q0), cirq.H(q1),
         cirq.ms(np.pi / 4).on(q0, q1)])
    ion_circuit_1 = convert_to_ion_gates.convert_circuit(clifford_circuit_1)
    ion_circuit_1_using_device = ion_device.decompose_circuit(
        clifford_circuit_1)

    ion_device.validate_circuit(ion_circuit_1)
    ion_device.validate_circuit(ion_circuit_1_using_device)
    cirq.testing.assert_circuits_with_terminal_measurements_are_equivalent(
        clifford_circuit_1, ion_circuit_1, atol=1e-6)
    cirq.testing.assert_circuits_with_terminal_measurements_are_equivalent(
        clifford_circuit_1, ion_circuit_1_using_device, atol=1e-6)

    clifford_circuit_2 = cirq.Circuit()
    clifford_circuit_2.append(
        [cirq.X(q0),
         cirq.CNOT(q1, q0),
         cirq.ms(np.pi / 4).on(q0, q1)])
    ion_circuit_2 = convert_to_ion_gates.convert_circuit(clifford_circuit_2)
    ion_circuit_2_using_device = ion_device.decompose_circuit(
        clifford_circuit_2)
    ion_device.validate_circuit(ion_circuit_2)
    ion_device.validate_circuit(ion_circuit_2_using_device)
    cirq.testing.assert_circuits_with_terminal_measurements_are_equivalent(
        clifford_circuit_2, ion_circuit_2, atol=1e-6)
    cirq.testing.assert_circuits_with_terminal_measurements_are_equivalent(
        clifford_circuit_2, ion_circuit_2_using_device, atol=1e-6)
Exemple #5
0
def test_init():
    d = ion_device(3)
    ms = 1000 * cirq.Duration(nanos=1)
    q0 = cirq.LineQubit(0)
    q1 = cirq.LineQubit(1)
    q2 = cirq.LineQubit(2)

    assert d.qubits == {q0, q1, q2}
    assert d.duration_of(cirq.Z(q0)) == 10 * ms
    assert d.duration_of(cirq.measure(q0)) == 100 * ms
    assert d.duration_of(cirq.measure(q0, q1)) == 100 * ms
    assert d.duration_of(cirq.ops.XX(q0, q1)) == 200 * ms
    with pytest.raises(ValueError):
        _ = d.duration_of(cirq.SingleQubitGate().on(q0))

    with pytest.raises(TypeError, match="NamedQubit"):
        _ = cirq.IonDevice(
            measurement_duration=ms,
            twoq_gates_duration=ms,
            oneq_gates_duration=ms,
            qubits=[cirq.LineQubit(0), cirq.NamedQubit("a")],
        )