Beispiel #1
0
                          shape=envelopes.flattop)
CZ = gates.Instruction(name="Id:CZ",
                       t_start=0.0,
                       t_end=cphase_time,
                       channels=["Q1", "Q2", "TC"])
CZ.add_component(flux_env, "TC")
CZ.add_component(carr_tc, "TC")
CZ.add_component(nodrive_env, "Q1")
CZ.add_component(carr_q1, "Q1")
CZ.comps['Q1']['carrier'].params['framechange'].set_value(framechange_q1)
CZ.add_component(nodrive_env, "Q2")
CZ.add_component(carr_q2, "Q2")
CZ.comps['Q2']['carrier'].params['framechange'].set_value(framechange_q2)

# ### MAKE EXPERIMENT
parameter_map = PMap(instructions=[CZ], model=model, generator=generator)
exp = Exp(pmap=parameter_map)

##### TESTING ######

with open("test/tunable_coupler_data.pickle", "rb") as filename:
    data = pickle.load(filename)


@pytest.mark.integration
def test_coupler_frequency() -> None:
    coupler_01 = np.abs(
        np.abs(model.eigenframe[model.state_labels.index((0, 0, 0))]) -
        np.abs(model.eigenframe[model.state_labels.index((1, 0, 0))]))
    rel_diff = np.abs((coupler_01 - data["coupler_01"]) / data["coupler_01"])
    assert rel_diff < 1e-12
Beispiel #2
0
def create_experiment(gatetime: np.float64 = 7e-9, anhar=-210e6) -> Exp:
    """

    Parameters
    ----------
    gatetime : longer gatetimes needed for a better FFT of the microwave signal
    """
    lindblad = False
    dressed = True
    qubit_lvls = 3
    freq = 5e9
    anhar = anhar
    init_temp = 0
    qubit_temp = 0
    t_final = gatetime  # Time for single qubit gates
    sim_res = 100e9
    awg_res = 2e9
    sideband = 50e6
    lo_freq = 5e9 + sideband
    lo2_freq = lo_freq + anhar  # for 1<->2

    # ### MAKE MODEL
    q1 = chip.Qubit(
        name="Q1",
        desc="Qubit 1",
        freq=Qty(
            value=freq,
            min_val=4.995e9,
            max_val=5.005e9,
            unit="Hz 2pi",
        ),
        anhar=Qty(
            value=anhar,
            # min_val=-380e9,
            # max_val=-120e6,
            unit="Hz 2pi",
        ),
        hilbert_dim=qubit_lvls,
        temp=Qty(value=qubit_temp, min_val=0.0, max_val=0.12, unit="K"),
    )

    drive = chip.Drive(
        name="d1",
        desc="Drive 1",
        comment="Drive line 1 on qubit 1",
        connected=["Q1"],
        hamiltonian_func=hamiltonians.x_drive,
    )
    phys_components = [q1]
    line_components = [drive]

    init_ground = tasks.InitialiseGround(
        init_temp=Qty(value=init_temp, min_val=-0.001, max_val=0.22, unit="K"))
    task_list = [init_ground]
    model = Mdl(phys_components, line_components, task_list)
    model.set_lindbladian(lindblad)
    model.set_dressed(dressed)

    # ### MAKE GENERATOR
    generator = Gnr(
        devices={
            "LO":
            devices.LO(name="lo", resolution=sim_res, outputs=1),
            "AWG":
            devices.AWG(name="awg", resolution=awg_res, outputs=1),
            "DigitalToAnalog":
            devices.DigitalToAnalog(name="dac",
                                    resolution=sim_res,
                                    inputs=1,
                                    outputs=1),
            "Response":
            devices.Response(
                name="resp",
                rise_time=Qty(value=0.3e-9,
                              min_val=0.05e-9,
                              max_val=0.6e-9,
                              unit="s"),
                resolution=sim_res,
                inputs=1,
                outputs=1,
            ),
            "Mixer":
            devices.Mixer(name="mixer", inputs=2, outputs=1),
            "VoltsToHertz":
            devices.VoltsToHertz(
                name="v_to_hz",
                V_to_Hz=Qty(value=1e9,
                            min_val=0.9e9,
                            max_val=1.1e9,
                            unit="Hz/V"),
                inputs=1,
                outputs=1,
            ),
        },
        chains={
            "d1": [
                "LO", "AWG", "DigitalToAnalog", "Response", "Mixer",
                "VoltsToHertz"
            ]
        },
    )
    generator.devices["AWG"].enable_drag_2()

    # ### MAKE GATESET
    gauss_params_single = {
        "amp":
        Qty(value=0.45, min_val=0.4, max_val=0.6, unit="V"),
        "t_final":
        Qty(value=t_final,
            min_val=0.5 * t_final,
            max_val=1.5 * t_final,
            unit="s"),
        "sigma":
        Qty(value=t_final / 4,
            min_val=t_final / 8,
            max_val=t_final / 2,
            unit="s"),
        "xy_angle":
        Qty(value=0.0, min_val=-0.5 * np.pi, max_val=2.5 * np.pi, unit="rad"),
        "freq_offset":
        Qty(
            value=-sideband - 0.5e6,
            min_val=-60 * 1e6,
            max_val=-40 * 1e6,
            unit="Hz 2pi",
        ),
        "delta":
        Qty(value=-1, min_val=-5, max_val=3, unit=""),
    }

    gauss_params_pi = {
        "amp":
        Qty(value=0.8, min_val=0.4, max_val=0.9, unit="V"),
        "t_final":
        Qty(value=t_final,
            min_val=0.5 * t_final,
            max_val=1.5 * t_final,
            unit="s"),
        "sigma":
        Qty(value=t_final / 4,
            min_val=t_final / 8,
            max_val=t_final / 2,
            unit="s"),
        "xy_angle":
        Qty(value=0.0, min_val=-0.5 * np.pi, max_val=2.5 * np.pi, unit="rad"),
        "freq_offset":
        Qty(
            value=-sideband - 0.5e6,
            min_val=-60 * 1e6,
            max_val=-40 * 1e6,
            unit="Hz 2pi",
        ),
        "delta":
        Qty(value=-1, min_val=-5, max_val=3, unit=""),
    }

    gauss_env_pi = pulse.Envelope(
        name="gauss",
        desc="Gaussian comp for single-qubit gates",
        params=gauss_params_pi,
        shape=envelopes.gaussian_nonorm,
    )

    gauss_env_single = pulse.Envelope(
        name="gauss",
        desc="Gaussian comp for single-qubit gates",
        params=gauss_params_single,
        shape=envelopes.gaussian_nonorm,
    )
    nodrive_env = pulse.Envelope(
        name="no_drive",
        params={
            "t_final":
            Qty(value=t_final,
                min_val=0.5 * t_final,
                max_val=1.5 * t_final,
                unit="s")
        },
        shape=envelopes.no_drive,
    )
    carrier_parameters = {
        "freq":
        Qty(
            value=lo_freq,
            min_val=4.5e9,
            max_val=6e9,
            unit="Hz 2pi",
        ),
        "framechange":
        Qty(value=0.0, min_val=-np.pi, max_val=3 * np.pi, unit="rad"),
    }
    carr = pulse.Carrier(
        name="carrier",
        desc="Frequency of the local oscillator",
        params=carrier_parameters,
    )

    #  for 1<->2
    carrier2_parameters = {
        "freq":
        Qty(
            value=lo2_freq,
            min_val=4.5e9,
            max_val=6e9,
            unit="Hz 2pi",
        ),
        "framechange":
        Qty(value=0.0, min_val=-np.pi, max_val=3 * np.pi, unit="rad"),
    }
    carr2 = pulse.Carrier(
        name="carrier",
        desc="Frequency of the local oscillator 2",
        params=carrier2_parameters,
    )

    PI01p = gates.Instruction(name="PI01p",
                              t_start=0.0,
                              t_end=t_final,
                              channels=["d1"])
    RX90p = gates.Instruction(name="RX90p",
                              t_start=0.0,
                              t_end=t_final,
                              channels=["d1"])
    RXp12 = gates.Instruction(name="RXp12",
                              t_start=0.0,
                              t_end=t_final,
                              channels=["d1"])
    RXp = gates.Instruction(name="RXp",
                            t_start=0.0,
                            t_end=t_final,
                            channels=["d1"])
    QId = gates.Instruction(name="Id",
                            t_start=0.0,
                            t_end=t_final,
                            channels=["d1"])

    PI01p.add_component(gauss_env_pi, "d1")
    PI01p.add_component(carr, "d1")
    RX90p.add_component(gauss_env_single, "d1")
    RX90p.add_component(carr, "d1")
    RXp12.add_component(gauss_env_pi, "d1")
    RXp12.add_component(carr2, "d1")
    RXp.add_component(gauss_env_pi, "d1")
    RXp.add_component(carr, "d1")

    QId.add_component(nodrive_env, "d1")
    QId.add_component(copy.deepcopy(carr), "d1")
    QId.comps["d1"]["carrier"].params["framechange"].set_value(
        (-sideband * t_final) % (2 * np.pi))
    RY90p = copy.deepcopy(RX90p)
    RY90p.name = "RY90p"
    RX90m = copy.deepcopy(RX90p)
    RX90m.name = "RX90m"
    RY90m = copy.deepcopy(RX90p)
    RY90m.name = "RY90m"
    RY90p.comps["d1"]["gauss"].params["xy_angle"].set_value(0.5 * np.pi)
    RX90m.comps["d1"]["gauss"].params["xy_angle"].set_value(np.pi)
    RY90m.comps["d1"]["gauss"].params["xy_angle"].set_value(1.5 * np.pi)

    parameter_map = PMap(
        instructions=[QId, RX90p, RY90p, RX90m, RY90m, RXp12, PI01p, RXp],
        model=model,
        generator=generator)

    # ### MAKE EXPERIMENT
    exp = Exp(pmap=parameter_map)
    return exp
Beispiel #3
0
def make_exp(simtime: np.float64 = 7e-9) -> Exp:
    """

    Parameters
    ----------
    simtime : np.float64
    """
    qubit_lvls = 3
    freq_q1 = 5e9
    anhar_q1 = -210e6
    t1_q1 = 27e-6
    t2star_q1 = 39e-6
    qubit_temp = 50e-3

    q1 = chip.Qubit(
        name="Q1",
        desc="Qubit 1",
        freq=Qty(value=freq_q1,
                 min_val=4.995e9,
                 max_val=5.005e9,
                 unit="Hz 2pi"),
        anhar=Qty(value=anhar_q1,
                  min_val=-380e6,
                  max_val=-120e6,
                  unit="Hz 2pi"),
        hilbert_dim=qubit_lvls,
        t1=Qty(value=t1_q1, min_val=1e-6, max_val=90e-6, unit="s"),
        t2star=Qty(value=t2star_q1, min_val=10e-6, max_val=90e-3, unit="s"),
        temp=Qty(value=qubit_temp, min_val=0.0, max_val=0.12, unit="K"),
    )

    freq_q2 = 5.6e9
    anhar_q2 = -240e6
    t1_q2 = 23e-6
    t2star_q2 = 31e-6
    q2 = chip.Qubit(
        name="Q2",
        desc="Qubit 2",
        freq=Qty(value=freq_q2,
                 min_val=5.595e9,
                 max_val=5.605e9,
                 unit="Hz 2pi"),
        anhar=Qty(value=anhar_q2,
                  min_val=-380e6,
                  max_val=-120e6,
                  unit="Hz 2pi"),
        hilbert_dim=qubit_lvls,
        t1=Qty(value=t1_q2, min_val=1e-6, max_val=90e-6, unit="s"),
        t2star=Qty(value=t2star_q2, min_val=10e-6, max_val=90e-6, unit="s"),
        temp=Qty(value=qubit_temp, min_val=0.0, max_val=0.12, unit="K"),
    )

    coupling_strength = 20e6
    q1q2 = chip.Coupling(
        name="Q1-Q2",
        desc="coupling",
        comment="Coupling qubit 1 to qubit 2",
        connected=["Q1", "Q2"],
        strength=Qty(value=coupling_strength,
                     min_val=-1 * 1e3,
                     max_val=200e6,
                     unit="Hz 2pi"),
        hamiltonian_func=hamiltonians.int_XX,
    )

    drive = chip.Drive(
        name="d1",
        desc="Drive 1",
        comment="Drive line 1 on qubit 1",
        connected=["Q1"],
        hamiltonian_func=hamiltonians.x_drive,
    )
    drive2 = chip.Drive(
        name="d2",
        desc="Drive 2",
        comment="Drive line 2 on qubit 2",
        connected=["Q2"],
        hamiltonian_func=hamiltonians.x_drive,
    )

    m00_q1 = 0.97  # Prop to read qubit 1 state 0 as 0
    m01_q1 = 0.04  # Prop to read qubit 1 state 0 as 1
    m00_q2 = 0.96  # Prop to read qubit 2 state 0 as 0
    m01_q2 = 0.05  # Prop to read qubit 2 state 0 as 1
    one_zeros = np.array([0] * qubit_lvls)
    zero_ones = np.array([1] * qubit_lvls)
    one_zeros[0] = 1
    zero_ones[0] = 0
    val1 = one_zeros * m00_q1 + zero_ones * m01_q1
    val2 = one_zeros * m00_q2 + zero_ones * m01_q2
    min_val = one_zeros * 0.8 + zero_ones * 0.0
    max_val = one_zeros * 1.0 + zero_ones * 0.2
    confusion_row1 = Qty(value=val1, min_val=min_val, max_val=max_val, unit="")
    confusion_row2 = Qty(value=val2, min_val=min_val, max_val=max_val, unit="")
    conf_matrix = tasks.ConfusionMatrix(Q1=confusion_row1, Q2=confusion_row2)

    init_temp = 50e-3
    init_ground = tasks.InitialiseGround(
        init_temp=Qty(value=init_temp, min_val=-0.001, max_val=0.22, unit="K"))

    model = Mdl(
        [q1, q2],  # Individual, self-contained components
        [drive, drive2, q1q2],  # Interactions between components
        [conf_matrix, init_ground],  # SPAM processing
    )

    model.set_lindbladian(False)
    model.set_dressed(True)

    sim_res = 100e9  # Resolution for numerical simulation
    awg_res = 2e9  # Realistic, limited resolution of an AWG

    generator = Gnr(
        devices={
            "LO":
            devices.LO(name="lo", resolution=sim_res, outputs=1),
            "AWG":
            devices.AWG(name="awg", resolution=awg_res, outputs=1),
            "DigitalToAnalog":
            devices.DigitalToAnalog(name="dac",
                                    resolution=sim_res,
                                    inputs=1,
                                    outputs=1),
            "Response":
            devices.Response(
                name="resp",
                rise_time=Qty(value=0.3e-9,
                              min_val=0.05e-9,
                              max_val=0.6e-9,
                              unit="s"),
                resolution=sim_res,
                inputs=1,
                outputs=1,
            ),
            "Mixer":
            devices.Mixer(name="mixer", inputs=2, outputs=1),
            "VoltsToHertz":
            devices.VoltsToHertz(
                name="v_to_hz",
                V_to_Hz=Qty(value=1e9,
                            min_val=0.9e9,
                            max_val=1.1e9,
                            unit="Hz/V"),
                inputs=1,
                outputs=1,
            ),
        },
        chains={
            "d1": [
                "LO", "AWG", "DigitalToAnalog", "Response", "Mixer",
                "VoltsToHertz"
            ],
            "d2": [
                "LO", "AWG", "DigitalToAnalog", "Response", "Mixer",
                "VoltsToHertz"
            ],
        },
    )

    t_final = simtime  # Time for single qubit gates
    sideband = 50e6
    gauss_params_single = {
        "amp":
        Qty(value=0.5, min_val=0.4, max_val=0.6, unit="V"),
        "t_final":
        Qty(value=t_final,
            min_val=0.5 * t_final,
            max_val=1.5 * t_final,
            unit="s"),
        "sigma":
        Qty(value=t_final / 4,
            min_val=t_final / 8,
            max_val=t_final / 2,
            unit="s"),
        "xy_angle":
        Qty(value=0.0, min_val=-0.5 * np.pi, max_val=2.5 * np.pi, unit="rad"),
        "freq_offset":
        Qty(value=-sideband - 3e6,
            min_val=-56 * 1e6,
            max_val=-52 * 1e6,
            unit="Hz 2pi"),
        "delta":
        Qty(value=-1, min_val=-5, max_val=3, unit=""),
    }

    gauss_env_single = pulse.Envelope(
        name="gauss",
        desc="Gaussian comp for single-qubit gates",
        params=gauss_params_single,
        shape=envelopes.gaussian_nonorm,
    )

    lo_freq_q1 = 5e9 + sideband
    carrier_parameters = {
        "freq":
        Qty(value=lo_freq_q1, min_val=4.5e9, max_val=6e9, unit="Hz 2pi"),
        "framechange":
        Qty(value=0.0, min_val=-np.pi, max_val=3 * np.pi, unit="rad"),
    }

    nodrive_env = pulse.Envelope(
        name="no_drive",
        params={
            "t_final":
            Qty(value=t_final,
                min_val=0.5 * t_final,
                max_val=1.5 * t_final,
                unit="s")
        },
        shape=envelopes.no_drive,
    )

    lo_freq_q1 = 5e9 + sideband
    carrier_parameters = {
        "freq":
        Qty(value=lo_freq_q1, min_val=4.5e9, max_val=6e9, unit="Hz 2pi"),
        "framechange":
        Qty(value=0.0, min_val=-np.pi, max_val=3 * np.pi, unit="rad"),
    }
    carr = pulse.Carrier(name="carrier",
                         desc="Frequency of the local oscillator",
                         params=carrier_parameters)

    lo_freq_q2 = 5.6e9 + sideband
    carr_2 = copy.deepcopy(carr)
    carr_2.params["freq"].set_value(lo_freq_q2)

    X90p_q1 = gates.Instruction(name="X90p",
                                channels=["d1"],
                                t_start=0.0,
                                t_end=t_final)
    X90p_q2 = gates.Instruction(name="X90p",
                                channels=["d2"],
                                t_start=0.0,
                                t_end=t_final)
    QId_q1 = gates.Instruction(name="Id",
                               channels=["d1"],
                               t_start=0.0,
                               t_end=t_final)
    QId_q2 = gates.Instruction(name="Id",
                               channels=["d2"],
                               t_start=0.0,
                               t_end=t_final)

    X90p_q1.add_component(gauss_env_single, "d1")
    X90p_q1.add_component(carr, "d1")
    QId_q1.add_component(nodrive_env, "d1")
    QId_q1.add_component(copy.deepcopy(carr), "d1")

    X90p_q2.add_component(copy.deepcopy(gauss_env_single), "d2")
    X90p_q2.add_component(carr_2, "d2")
    QId_q2.add_component(copy.deepcopy(nodrive_env), "d2")
    QId_q2.add_component(copy.deepcopy(carr_2), "d2")

    QId_q1.comps["d1"]["carrier"].params["framechange"].set_value(
        (-sideband * t_final) * 2 * np.pi % (2 * np.pi))
    QId_q2.comps["d2"]["carrier"].params["framechange"].set_value(
        (-sideband * t_final) * 2 * np.pi % (2 * np.pi))

    Y90p_q1 = copy.deepcopy(X90p_q1)
    Y90p_q1.name = "Y90p"
    X90m_q1 = copy.deepcopy(X90p_q1)
    X90m_q1.name = "X90m"
    Y90m_q1 = copy.deepcopy(X90p_q1)
    Y90m_q1.name = "Y90m"
    Y90p_q1.comps["d1"]["gauss"].params["xy_angle"].set_value(0.5 * np.pi)
    X90m_q1.comps["d1"]["gauss"].params["xy_angle"].set_value(np.pi)
    Y90m_q1.comps["d1"]["gauss"].params["xy_angle"].set_value(1.5 * np.pi)
    Q1_gates = [QId_q1, X90p_q1, Y90p_q1, X90m_q1, Y90m_q1]

    Y90p_q2 = copy.deepcopy(X90p_q2)
    Y90p_q2.name = "Y90p"
    X90m_q2 = copy.deepcopy(X90p_q2)
    X90m_q2.name = "X90m"
    Y90m_q2 = copy.deepcopy(X90p_q2)
    Y90m_q2.name = "Y90m"
    Y90p_q2.comps["d2"]["gauss"].params["xy_angle"].set_value(0.5 * np.pi)
    X90m_q2.comps["d2"]["gauss"].params["xy_angle"].set_value(np.pi)
    Y90m_q2.comps["d2"]["gauss"].params["xy_angle"].set_value(1.5 * np.pi)
    Q2_gates = [QId_q2, X90p_q2, Y90p_q2, X90m_q2, Y90m_q2]

    all_1q_gates_comb = []
    for g1 in Q1_gates:
        for g2 in Q2_gates:
            g = gates.Instruction(name="NONE",
                                  channels=[],
                                  t_start=0.0,
                                  t_end=t_final)
            g.name = g1.name + ":" + g2.name
            channels: List[str] = []
            channels.extend(g1.comps.keys())
            channels.extend(g2.comps.keys())
            for chan in channels:
                g.comps[chan] = {}
                if chan in g1.comps:
                    g.comps[chan].update(g1.comps[chan])
                if chan in g2.comps:
                    g.comps[chan].update(g2.comps[chan])
            all_1q_gates_comb.append(g)

    pmap = PMap(all_1q_gates_comb, generator, model)

    return Exp(pmap)
Beispiel #4
0
def create_experiment():
    lindblad = False
    dressed = True
    qubit_lvls = 3
    freq = 5e9 * 2 * np.pi
    anhar = -210e6 * 2 * np.pi
    init_temp = 0
    qubit_temp = 0
    v2hz = 1e9
    t_final = 7e-9   # Time for single qubit gates
    sim_res = 100e9
    awg_res = 2e9
    sideband = 50e6 * 2 * np.pi
    lo_freq = 5e9 * 2 * np.pi + sideband

    # ### MAKE MODEL
    q1 = chip.Qubit(
        name="Q1",
        desc="Qubit 1",
        freq=Qty(
            value=freq,
            min=4.995e9 * 2 * np.pi,
            max=5.005e9 * 2 * np.pi,
            unit='Hz 2pi'
        ),
        anhar=Qty(
            value=anhar,
            min=-380e6 * 2 * np.pi,
            max=-120e6 * 2 * np.pi,
            unit='Hz 2pi'
        ),
        hilbert_dim=qubit_lvls,
        temp=Qty(
            value=qubit_temp,
            min=0.0,
            max=0.12,
            unit='K'
        )
    )

    drive = chip.Drive(
        name="d1",
        desc="Drive 1",
        comment="Drive line 1 on qubit 1",
        connected=["Q1"],
        hamiltonian_func=hamiltonians.x_drive
    )
    phys_components = [q1]
    line_components = [drive]

    init_ground = tasks.InitialiseGround(
        init_temp=Qty(
            value=init_temp,
            min=-0.001,
            max=0.22,
            unit='K'
        )
    )
    task_list = [init_ground]
    model = Mdl(phys_components, line_components, task_list)
    model.set_lindbladian(lindblad)
    model.set_dressed(dressed)

    # ### MAKE GENERATOR
    lo = devices.LO(name='lo', resolution=sim_res)
    awg = devices.AWG(name='awg', resolution=awg_res)
    mixer = devices.Mixer(name='mixer')

    v_to_hz = devices.VoltsToHertz(
        name='v_to_hz',
        V_to_Hz=Qty(
            value=v2hz,
            min=0.9e9,
            max=1.1e9,
            unit='Hz 2pi/V'
        )
    )
    dig_to_an = devices.DigitalToAnalog(
        name="dac",
        resolution=sim_res
    )
    resp = devices.Response(
        name='resp',
        rise_time=Qty(
            value=0.3e-9,
            min=0.05e-9,
            max=0.6e-9,
            unit='s'
        ),
        resolution=sim_res
    )

    device_list = [lo, awg, mixer, v_to_hz, dig_to_an, resp]
    generator = Gnr(device_list)
    generator.devices['awg'].enable_drag_2()

    # ### MAKE GATESET
    gauss_params_single = {
        'amp': Qty(
            value=0.45,
            min=0.4,
            max=0.6,
            unit="V"
        ),
        't_final': Qty(
            value=t_final,
            min=0.5 * t_final,
            max=1.5 * t_final,
            unit="s"
        ),
        'sigma': Qty(
            value=t_final / 4,
            min=t_final / 8,
            max=t_final / 2,
            unit="s"
        ),
        'xy_angle': Qty(
            value=0.0,
            min=-0.5 * np.pi,
            max=2.5 * np.pi,
            unit='rad'
        ),
        'freq_offset': Qty(
            value=-sideband - 0.5e6 * 2 * np.pi,
            min=-60 * 1e6 * 2 * np.pi,
            max=-40 * 1e6 * 2 * np.pi,
            unit='Hz 2pi'
        ),
        'delta': Qty(
            value=-1,
            min=-5,
            max=3,
            unit=""
        )
    }

    gauss_env_single = pulse.Envelope(
        name="gauss",
        desc="Gaussian comp for single-qubit gates",
        params=gauss_params_single,
        shape=envelopes.gaussian_nonorm
    )
    nodrive_env = pulse.Envelope(
        name="no_drive",
        params={
            't_final': Qty(
                value=t_final,
                min=0.5 * t_final,
                max=1.5 * t_final,
                unit="s"
            )
        },
        shape=envelopes.no_drive
    )
    carrier_parameters = {
        'freq': Qty(
            value=lo_freq,
            min=4.5e9 * 2 * np.pi,
            max=6e9 * 2 * np.pi,
            unit='Hz 2pi'
        ),
        'framechange': Qty(
            value=0.0,
            min= -np.pi,
            max= 3 * np.pi,
            unit='rad'
        )
    }
    carr = pulse.Carrier(
        name="carrier",
        desc="Frequency of the local oscillator",
        params=carrier_parameters
    )

    X90p = gates.Instruction(
        name="X90p",
        t_start=0.0,
        t_end=t_final,
        channels=["d1"]
    )
    QId = gates.Instruction(
        name="Id",
        t_start=0.0,
        t_end=t_final,
        channels=["d1"]
    )

    X90p.add_component(gauss_env_single, "d1")
    X90p.add_component(carr, "d1")
    QId.add_component(nodrive_env, "d1")
    QId.add_component(copy.deepcopy(carr), "d1")
    QId.comps['d1']['carrier'].params['framechange'].set_value(
        (-sideband * t_final) % (2*np.pi)
    )
    Y90p = copy.deepcopy(X90p)
    Y90p.name = "Y90p"
    X90m = copy.deepcopy(X90p)
    X90m.name = "X90m"
    Y90m = copy.deepcopy(X90p)
    Y90m.name = "Y90m"
    Y90p.comps['d1']['gauss'].params['xy_angle'].set_value(0.5 * np.pi)
    X90m.comps['d1']['gauss'].params['xy_angle'].set_value(np.pi)
    Y90m.comps['d1']['gauss'].params['xy_angle'].set_value(1.5 * np.pi)

    parameter_map = PMap(instructions=[QId, X90p, Y90p, X90m, Y90m], model=model, generator=generator)

    # ### MAKE EXPERIMENT
    exp = Exp(pmap=parameter_map)
    return exp