{ "cells": [ { "cell_type": "markdown", "id": "2ddc0857", "metadata": { "lines_to_next_cell": 2 }, "source": [ "In-situ Mixer Calibration\n", "------------------------\n", "\n", "The Cluster RF Modules (QCM-RF and QRM-RF) have integrated IQ mixers that handle both upconversion and downconversion of RF signals.\n", "These mixers use a local oscillator (LO) with a frequency of $\\omega_{LO}$.\n", "During upconversion, they combine signals from the I and Q paths, which have a frequency of $\\omega_{NCO}$, resulting in an output signal at $\\omega_{LO} + \\omega_{NCO}$.\n", "However, due to the inherent mathematical imperfections of IQ mixers, the output also includes an unwanted signal at $\\omega_{LO}$ (known as leakage) and another at $\\omega_{LO} - \\omega_{NCO}$ (called the undesired sideband).\n", "\n", "\n", "In this tutorial, we are going to look at ways to suppress the LO leakage and undesired sideband. This process is called mixer calibration.\n", "\n", "To run this tutorial optimally, you will need:\n", "\n", "* A QCM-RF or QRM-RF module\n", "\n", "* Spectrum analyzer\n", "\n", "* Two SMA-cables" ] }, { "cell_type": "markdown", "id": "befc9189", "metadata": { "tags": [] }, "source": [ "Setup\n", "-----\n", "\n", "First, we are going to import the required packages." ] }, { "cell_type": "code", "execution_count": 1, "id": "0bac343a", "metadata": { "execution": { "iopub.execute_input": "2025-05-07T16:49:27.728152Z", "iopub.status.busy": "2025-05-07T16:49:27.727757Z", "iopub.status.idle": "2025-05-07T16:49:28.094879Z", "shell.execute_reply": "2025-05-07T16:49:28.094138Z" }, "tags": [ "imports" ] }, "outputs": [], "source": [ "from __future__ import annotations\n", "\n", "import json\n", "from typing import TYPE_CHECKING, Callable\n", "\n", "from qcodes.instrument import find_or_create_instrument\n", "\n", "from qblox_instruments import Cluster, ClusterType\n", "\n", "if TYPE_CHECKING:\n", " from qblox_instruments.qcodes_drivers.module import Module" ] }, { "cell_type": "markdown", "id": "20a02c78", "metadata": {}, "source": [ "### Scan For Clusters\n", "\n", "We scan for the available devices connected via ethernet using the Plug & Play functionality of the Qblox Instruments package (see [Plug & Play](https://docs.qblox.com/en/main/api_reference/tools.html#api-pnp) for more info)." ] }, { "cell_type": "markdown", "id": "64ea5367", "metadata": {}, "source": [ "`!qblox-pnp list`" ] }, { "cell_type": "code", "execution_count": 2, "id": "bcdd4a10", "metadata": { "execution": { "iopub.execute_input": "2025-05-07T16:49:28.097894Z", "iopub.status.busy": "2025-05-07T16:49:28.097452Z", "iopub.status.idle": "2025-05-07T16:49:28.100182Z", "shell.execute_reply": "2025-05-07T16:49:28.099725Z" } }, "outputs": [], "source": [ "cluster_ip = \"10.10.200.42\"\n", "cluster_name = \"cluster0\"" ] }, { "cell_type": "markdown", "id": "8dcf787d", "metadata": {}, "source": [ "### Connect to Cluster\n", "\n", "We now make a connection with the Cluster." ] }, { "cell_type": "code", "execution_count": 3, "id": "5fd826f7", "metadata": { "execution": { "iopub.execute_input": "2025-05-07T16:49:28.101545Z", "iopub.status.busy": "2025-05-07T16:49:28.101385Z", "iopub.status.idle": "2025-05-07T16:49:28.950449Z", "shell.execute_reply": "2025-05-07T16:49:28.949858Z" }, "lines_to_next_cell": 2 }, "outputs": [], "source": [ "cluster = find_or_create_instrument(\n", " Cluster,\n", " recreate=True,\n", " name=cluster_name,\n", " identifier=cluster_ip,\n", " dummy_cfg=(\n", " {\n", " 2: ClusterType.CLUSTER_QCM,\n", " 4: ClusterType.CLUSTER_QRM,\n", " 6: ClusterType.CLUSTER_QCM_RF,\n", " 8: ClusterType.CLUSTER_QRM_RF,\n", " 10: ClusterType.CLUSTER_QTM,\n", " }\n", " if cluster_ip is None\n", " else None\n", " ),\n", ")" ] }, { "cell_type": "markdown", "id": "dec99e11", "metadata": { "lines_to_next_cell": 2 }, "source": [ "#### Get connected modules" ] }, { "cell_type": "code", "execution_count": 4, "id": "e4efa357", "metadata": { "execution": { "iopub.execute_input": "2025-05-07T16:49:28.952807Z", "iopub.status.busy": "2025-05-07T16:49:28.952647Z", "iopub.status.idle": "2025-05-07T16:49:28.956131Z", "shell.execute_reply": "2025-05-07T16:49:28.955742Z" } }, "outputs": [], "source": [ "def get_connected_modules(cluster: Cluster, filter_fn: Callable | None = None) -> dict[int, Module]:\n", " def checked_filter_fn(mod: ClusterType) -> bool:\n", " if filter_fn is not None:\n", " return filter_fn(mod)\n", " return True\n", "\n", " return {\n", " mod.slot_idx: mod for mod in cluster.modules if mod.present() and checked_filter_fn(mod)\n", " }" ] }, { "cell_type": "code", "execution_count": 5, "id": "13edbe24", "metadata": { "execution": { "iopub.execute_input": "2025-05-07T16:49:28.957880Z", "iopub.status.busy": "2025-05-07T16:49:28.957744Z", "iopub.status.idle": "2025-05-07T16:49:28.975384Z", "shell.execute_reply": "2025-05-07T16:49:28.975001Z" }, "tags": [ "module_select" ] }, "outputs": [], "source": [ "# QCM-RF modules\n", "modules = get_connected_modules(cluster, lambda mod: not mod.is_qrm_type and mod.is_rf_type)" ] }, { "cell_type": "code", "execution_count": 6, "id": "9e8f6a57", "metadata": { "execution": { "iopub.execute_input": "2025-05-07T16:49:28.976984Z", "iopub.status.busy": "2025-05-07T16:49:28.976846Z", "iopub.status.idle": "2025-05-07T16:49:28.979048Z", "shell.execute_reply": "2025-05-07T16:49:28.978672Z" } }, "outputs": [], "source": [ "# This uses the module of the correct type with the lowest slot index\n", "module = list(modules.values())[0]" ] }, { "cell_type": "markdown", "id": "a1bfc5c9", "metadata": {}, "source": [ "### Reset the Cluster\n", "\n", "We reset the Cluster to enter a well-defined state. Note that resetting will clear all stored parameters, so resetting between experiments is usually not desirable." ] }, { "cell_type": "code", "execution_count": 7, "id": "64ede799", "metadata": { "execution": { "iopub.execute_input": "2025-05-07T16:49:28.980642Z", "iopub.status.busy": "2025-05-07T16:49:28.980508Z", "iopub.status.idle": "2025-05-07T16:49:31.552283Z", "shell.execute_reply": "2025-05-07T16:49:31.551144Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Status: OKAY, Flags: NONE, Slot flags: NONE\n" ] } ], "source": [ "cluster.reset()\n", "print(cluster.get_system_status())" ] }, { "cell_type": "markdown", "id": "7ef414d7", "metadata": { "title": "BODY" }, "source": [ "We upload a simple sequence program that keeps playing the DC waveform at 30 percent IF power (waveform amplitude = 0.3). This will be modulated and upconverted within the QRM-RF before outputting." ] }, { "cell_type": "code", "execution_count": 8, "id": "f3657cf6", "metadata": { "execution": { "iopub.execute_input": "2025-05-07T16:49:31.556298Z", "iopub.status.busy": "2025-05-07T16:49:31.555929Z", "iopub.status.idle": "2025-05-07T16:49:31.594180Z", "shell.execute_reply": "2025-05-07T16:49:31.593040Z" } }, "outputs": [], "source": [ "# Sequence program.\n", "seq_prog = \"\"\"\n", " wait_sync 4\n", "\n", "loop: play 0,0,1200\n", " jmp @loop\n", "\"\"\"\n", "waveforms = {\"dc\": {\"data\": [0.3 for i in range(0, 1200)], \"index\": 0}}\n", "\n", "# Add sequence to single dictionary and write to JSON file.\n", "sequence = {\n", " \"waveforms\": waveforms,\n", " \"weights\": {},\n", " \"acquisitions\": {},\n", " \"program\": seq_prog,\n", "}\n", "with open(\"sequence.json\", \"w\", encoding=\"utf-8\") as file:\n", " json.dump(sequence, file, indent=4)\n", " file.close()\n", "\n", "module.sequencer0.sequence(\"sequence.json\")" ] }, { "cell_type": "markdown", "id": "7bdca538", "metadata": {}, "source": [ "Let's configure the sequencer to generate an IF frequency of $100$ MHz. To get an output frequency of $5.0$ GHz, we then have to configure the LO to run at $4.9$ GHz." ] }, { "cell_type": "code", "execution_count": 9, "id": "3e083f55", "metadata": { "execution": { "iopub.execute_input": "2025-05-07T16:49:31.597778Z", "iopub.status.busy": "2025-05-07T16:49:31.597406Z", "iopub.status.idle": "2025-05-07T16:49:31.617374Z", "shell.execute_reply": "2025-05-07T16:49:31.616404Z" }, "lines_to_next_cell": 0 }, "outputs": [], "source": [ "# Configure the Local oscillator\n", "\n", "lo_freq = 4.9e9\n", "nco_freq = 100e6\n", "module.disconnect_outputs()" ] }, { "cell_type": "code", "execution_count": 10, "id": "5368c8fb", "metadata": { "execution": { "iopub.execute_input": "2025-05-07T16:49:31.620717Z", "iopub.status.busy": "2025-05-07T16:49:31.620329Z", "iopub.status.idle": "2025-05-07T16:49:31.647544Z", "shell.execute_reply": "2025-05-07T16:49:31.646410Z" }, "tags": [ "connect" ] }, "outputs": [], "source": [ "# Configure channel map\n", "module.sequencer0.connect_sequencer(\"out0\")\n", "module.out0_lo_freq(lo_freq)" ] }, { "cell_type": "code", "execution_count": 11, "id": "a2b2cab7", "metadata": { "execution": { "iopub.execute_input": "2025-05-07T16:49:31.651047Z", "iopub.status.busy": "2025-05-07T16:49:31.650681Z", "iopub.status.idle": "2025-05-07T16:49:31.712662Z", "shell.execute_reply": "2025-05-07T16:49:31.711138Z" }, "lines_to_next_cell": 2 }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Status: OKAY, State: RUNNING, Info Flags: NONE, Warning Flags: NONE, Error Flags: NONE, Log: []\n" ] } ], "source": [ "module.sequencer0.marker_ovr_en(True)\n", "module.sequencer0.marker_ovr_value(3) # Enables output on QRM-RF\n", "\n", "# Configure the sequencer\n", "module.sequencer0.mod_en_awg(True)\n", "module.sequencer0.nco_freq(nco_freq)\n", "module.sequencer0.sync_en(True)\n", "\n", "module.arm_sequencer(0)\n", "module.start_sequencer(0)\n", "\n", "print(module.get_sequencer_status(0))" ] }, { "cell_type": "markdown", "id": "a8433da4", "metadata": {}, "source": [ "Connect the output of the QRM-RF (O1) to the spectrum analyzer. This is what the output looks like on the spectrum analyzer (center frequency at 4.85 GHz with 600 MHz bandwidth). We see three peaks which correspond to (from the right) 5 GHz (desired signal), 4.9 GHz (LO Leakage) and 4.8 GHz (unwanted sideband)." ] }, { "cell_type": "markdown", "id": "783fe333", "metadata": {}, "source": [ "![IQ_Mixer_Calib_before.png](figures/IQ_Mixer_Calib_before.png)" ] }, { "cell_type": "markdown", "id": "be95796e", "metadata": {}, "source": [ "We will use the hardware mixer calibration capabilities of the Cluster RF modules to suppress the LO and sideband. This calibration routine is carried out by the internal circuitry of the modules hence requiring no cabling on the output channels.\n", "\n", "**PLEASE NOTE**:\n", "\n", "1. The output switches are turned OFF when the modules are performing calibration and are turned back ON after calibration.\n", "2. Calibration also interrupts other sequencers within the module. Consequently, please restart the necessary sequencers (`arm_sequencer` and `start_sequencer`) that should be operational after completing the calibration process. Sequencers in other modules will continue to run as usual.\n", "3. We expect a typical suppression of **35 dBc for LO and sideband tones when calibrating a (signal) tone with 30 percent of the maximum IF power**. It is possible to achieve more than 55 dBc of spurious free dynamic range (SFDR) when calibrating the mixers manually. Please follow the subsequent section for manually calibrating the mixer." ] }, { "cell_type": "markdown", "id": "6707333e", "metadata": {}, "source": [ "### Suppression of LO Leakage\n", "The `module.out0_in0_lo_cal()` or `module.out{x}_lo_cal()` functions can be called to calibrate the LO leakage as shown below." ] }, { "cell_type": "code", "execution_count": 12, "id": "415b68f7", "metadata": { "execution": { "iopub.execute_input": "2025-05-07T16:49:31.716986Z", "iopub.status.busy": "2025-05-07T16:49:31.716593Z", "iopub.status.idle": "2025-05-07T16:49:32.996500Z", "shell.execute_reply": "2025-05-07T16:49:32.995534Z" }, "tags": [ "calibrate_LO" ] }, "outputs": [], "source": [ "module.out0_lo_cal() # calibrate the LO leakage for output 0" ] }, { "cell_type": "markdown", "id": "56a64948", "metadata": {}, "source": [ "### Suppression of Undesired Sideband\n", "Similar to the LO suppression scheme, undesired sideband can also be suppressed using the `sequencer.sideband_cal()` function." ] }, { "cell_type": "code", "execution_count": 13, "id": "9d0ad26a", "metadata": { "execution": { "iopub.execute_input": "2025-05-07T16:49:32.999554Z", "iopub.status.busy": "2025-05-07T16:49:32.999146Z", "iopub.status.idle": "2025-05-07T16:49:33.538854Z", "shell.execute_reply": "2025-05-07T16:49:33.538038Z" } }, "outputs": [], "source": [ "module.sequencer0.sideband_cal()\n", "module.arm_sequencer(0)\n", "module.start_sequencer()" ] }, { "cell_type": "markdown", "id": "2abdad3d", "metadata": { "lines_to_next_cell": 2 }, "source": [ "**NOTE** : If you would like to achieve better SFDR for your experiments, please calibrate the mixer manually." ] }, { "cell_type": "markdown", "id": "4bf1e0c8", "metadata": {}, "source": [ "Stop\n", "----\n", "\n", "Finally, let's stop the sequencers if they haven't already and close the instrument connection. One can also display a detailed snapshot containing the instrument parameters before\n", "closing the connection by uncommenting the corresponding lines." ] }, { "cell_type": "code", "execution_count": 14, "id": "e177a2b0", "metadata": { "execution": { "iopub.execute_input": "2025-05-07T16:49:33.541624Z", "iopub.status.busy": "2025-05-07T16:49:33.541221Z", "iopub.status.idle": "2025-05-07T16:49:38.713915Z", "shell.execute_reply": "2025-05-07T16:49:38.712890Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Status: OKAY, State: STOPPED, Info Flags: FORCED_STOP, Warning Flags: NONE, Error Flags: NONE, Log: []\n", "Status: OKAY, State: STOPPED, Info Flags: NONE, Warning Flags: NONE, Error Flags: NONE, Log: []\n", "\n", "Snapshot:\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "cluster0_module6:\n", "\tparameter value\n", "--------------------------------------------------------------------------------\n", "connected :\tTrue \n", "marker0_exp0_config :\tbypassed \n", "marker0_exp1_config :\tbypassed \n", "marker0_exp2_config :\tbypassed \n", "marker0_exp3_config :\tbypassed \n", "marker0_fir_config :\tbypassed \n", "marker0_inv_en :\tFalse \n", "marker1_exp0_config :\tbypassed \n", "marker1_exp1_config :\tbypassed \n", "marker1_exp2_config :\tbypassed \n", "marker1_exp3_config :\tbypassed \n", "marker1_fir_config :\tbypassed \n", "marker1_inv_en :\tFalse \n", "marker2_exp0_config :\tbypassed \n", "marker2_exp1_config :\tbypassed \n", "marker2_exp2_config :\tbypassed \n", "marker2_exp3_config :\tbypassed \n", "marker2_fir_config :\tbypassed \n", "marker3_exp0_config :\tbypassed \n", "marker3_exp1_config :\tbypassed \n", "marker3_exp2_config :\tbypassed \n", "marker3_exp3_config :\tbypassed \n", "marker3_fir_config :\tbypassed \n", "out0_att :\t0 (dB)\n", "out0_exp0_config :\tbypassed \n", "out0_exp1_config :\tbypassed \n", "out0_exp2_config :\tbypassed \n", "out0_exp3_config :\tbypassed \n", "out0_fir_config :\tbypassed \n", "out0_latency :\t0 (s)\n", "out0_lo_en :\tTrue \n", "out0_lo_freq :\t4900000000 (Hz)\n", "out0_lo_freq_cal_type_default :\toff (Hz)\n", "out0_offset_path0 :\t-4.2155 (mV)\n", "out0_offset_path1 :\t-3.5413 (mV)\n", "out1_att :\t0 (dB)\n", "out1_exp0_config :\tbypassed \n", "out1_exp1_config :\tbypassed \n", "out1_exp2_config :\tbypassed \n", "out1_exp3_config :\tbypassed \n", "out1_fir_config :\tbypassed \n", "out1_latency :\t0 (s)\n", "out1_lo_en :\tTrue \n", "out1_lo_freq :\t6000000000 (Hz)\n", "out1_lo_freq_cal_type_default :\toff (Hz)\n", "out1_offset_path0 :\t7.625 (mV)\n", "out1_offset_path1 :\t7.625 (mV)\n", "present :\tTrue \n", "cluster0_module6_sequencer0:\n", "\tparameter value\n", "--------------------------------------------------------------------------------\n", "connect_out0 :\tIQ \n", "connect_out1 :\toff \n", "cont_mode_en_awg_path0 :\tFalse \n", "cont_mode_en_awg_path1 :\tFalse \n", "cont_mode_waveform_idx_awg_path0 :\t0 \n", "cont_mode_waveform_idx_awg_path1 :\t0 \n", "gain_awg_path0 :\t1 \n", "gain_awg_path1 :\t1 \n", "marker_ovr_en :\tTrue \n", "marker_ovr_value :\t3 \n", "mixer_corr_gain_ratio :\t0.98781 \n", "mixer_corr_phase_offset_degree :\t-19.775 \n", "mod_en_awg :\tTrue \n", "nco_freq :\t1e+08 (Hz)\n", "nco_freq_cal_type_default :\toff (Hz)\n", "nco_phase_offs :\t0 (Degrees)\n", "nco_prop_delay_comp :\t0 (ns)\n", "nco_prop_delay_comp_en :\tFalse (ns)\n", "offset_awg_path0 :\t0 \n", "offset_awg_path1 :\t0 \n", "sync_en :\tTrue \n", "trigger10_count_threshold :\t1 \n", "trigger10_threshold_invert :\tFalse \n", "trigger11_count_threshold :\t1 \n", "trigger11_threshold_invert :\tFalse \n", "trigger12_count_threshold :\t1 \n", "trigger12_threshold_invert :\tFalse \n", "trigger13_count_threshold :\t1 \n", "trigger13_threshold_invert :\tFalse \n", "trigger14_count_threshold :\t1 \n", "trigger14_threshold_invert :\tFalse \n", "trigger15_count_threshold :\t1 \n", "trigger15_threshold_invert :\tFalse \n", "trigger1_count_threshold :\t1 \n", "trigger1_threshold_invert :\tFalse \n", "trigger2_count_threshold :\t1 \n", "trigger2_threshold_invert :\tFalse \n", "trigger3_count_threshold :\t1 \n", "trigger3_threshold_invert :\tFalse \n", "trigger4_count_threshold :\t1 \n", "trigger4_threshold_invert :\tFalse \n", "trigger5_count_threshold :\t1 \n", "trigger5_threshold_invert :\tFalse \n", "trigger6_count_threshold :\t1 \n", "trigger6_threshold_invert :\tFalse \n", "trigger7_count_threshold :\t1 \n", "trigger7_threshold_invert :\tFalse \n", "trigger8_count_threshold :\t1 \n", "trigger8_threshold_invert :\tFalse \n", "trigger9_count_threshold :\t1 \n", "trigger9_threshold_invert :\tFalse \n", "upsample_rate_awg_path0 :\t0 \n", "upsample_rate_awg_path1 :\t0 \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "cluster0_module6_sequencer1:\n", "\tparameter value\n", "--------------------------------------------------------------------------------\n", "connect_out0 :\toff \n", "connect_out1 :\toff \n", "cont_mode_en_awg_path0 :\tFalse \n", "cont_mode_en_awg_path1 :\tFalse \n", "cont_mode_waveform_idx_awg_path0 :\t0 \n", "cont_mode_waveform_idx_awg_path1 :\t0 \n", "gain_awg_path0 :\t1 \n", "gain_awg_path1 :\t1 \n", "marker_ovr_en :\tFalse \n", "marker_ovr_value :\t0 \n", "mixer_corr_gain_ratio :\t1 \n", "mixer_corr_phase_offset_degree :\t-0 \n", "mod_en_awg :\tFalse \n", "nco_freq :\t0 (Hz)\n", "nco_freq_cal_type_default :\toff (Hz)\n", "nco_phase_offs :\t0 (Degrees)\n", "nco_prop_delay_comp :\t0 (ns)\n", "nco_prop_delay_comp_en :\tFalse (ns)\n", "offset_awg_path0 :\t0 \n", "offset_awg_path1 :\t0 \n", "sync_en :\tFalse \n", "trigger10_count_threshold :\t1 \n", "trigger10_threshold_invert :\tFalse \n", "trigger11_count_threshold :\t1 \n", "trigger11_threshold_invert :\tFalse \n", "trigger12_count_threshold :\t1 \n", "trigger12_threshold_invert :\tFalse \n", "trigger13_count_threshold :\t1 \n", "trigger13_threshold_invert :\tFalse \n", "trigger14_count_threshold :\t1 \n", "trigger14_threshold_invert :\tFalse \n", "trigger15_count_threshold :\t1 \n", "trigger15_threshold_invert :\tFalse \n", "trigger1_count_threshold :\t1 \n", "trigger1_threshold_invert :\tFalse \n", "trigger2_count_threshold :\t1 \n", "trigger2_threshold_invert :\tFalse \n", "trigger3_count_threshold :\t1 \n", "trigger3_threshold_invert :\tFalse \n", "trigger4_count_threshold :\t1 \n", "trigger4_threshold_invert :\tFalse \n", "trigger5_count_threshold :\t1 \n", "trigger5_threshold_invert :\tFalse \n", "trigger6_count_threshold :\t1 \n", "trigger6_threshold_invert :\tFalse \n", "trigger7_count_threshold :\t1 \n", "trigger7_threshold_invert :\tFalse \n", "trigger8_count_threshold :\t1 \n", "trigger8_threshold_invert :\tFalse \n", "trigger9_count_threshold :\t1 \n", "trigger9_threshold_invert :\tFalse \n", "upsample_rate_awg_path0 :\t0 \n", "upsample_rate_awg_path1 :\t0 \n", "cluster0_module6_sequencer2:\n", "\tparameter value\n", "--------------------------------------------------------------------------------\n", "connect_out0 :\toff \n", "connect_out1 :\toff \n", "cont_mode_en_awg_path0 :\tFalse \n", "cont_mode_en_awg_path1 :\tFalse \n", "cont_mode_waveform_idx_awg_path0 :\t0 \n", "cont_mode_waveform_idx_awg_path1 :\t0 \n", "gain_awg_path0 :\t1 \n", "gain_awg_path1 :\t1 \n", "marker_ovr_en :\tFalse \n", "marker_ovr_value :\t0 \n", "mixer_corr_gain_ratio :\t1 \n", "mixer_corr_phase_offset_degree :\t-0 \n", "mod_en_awg :\tFalse \n", "nco_freq :\t0 (Hz)\n", "nco_freq_cal_type_default :\toff (Hz)\n", "nco_phase_offs :\t0 (Degrees)\n", "nco_prop_delay_comp :\t0 (ns)\n", "nco_prop_delay_comp_en :\tFalse (ns)\n", "offset_awg_path0 :\t0 \n", "offset_awg_path1 :\t0 \n", "sync_en :\tFalse \n", "trigger10_count_threshold :\t1 \n", "trigger10_threshold_invert :\tFalse \n", "trigger11_count_threshold :\t1 \n", "trigger11_threshold_invert :\tFalse \n", "trigger12_count_threshold :\t1 \n", "trigger12_threshold_invert :\tFalse \n", "trigger13_count_threshold :\t1 \n", "trigger13_threshold_invert :\tFalse \n", "trigger14_count_threshold :\t1 \n", "trigger14_threshold_invert :\tFalse \n", "trigger15_count_threshold :\t1 \n", "trigger15_threshold_invert :\tFalse \n", "trigger1_count_threshold :\t1 \n", "trigger1_threshold_invert :\tFalse \n", "trigger2_count_threshold :\t1 \n", "trigger2_threshold_invert :\tFalse \n", "trigger3_count_threshold :\t1 \n", "trigger3_threshold_invert :\tFalse \n", "trigger4_count_threshold :\t1 \n", "trigger4_threshold_invert :\tFalse \n", "trigger5_count_threshold :\t1 \n", "trigger5_threshold_invert :\tFalse \n", "trigger6_count_threshold :\t1 \n", "trigger6_threshold_invert :\tFalse \n", "trigger7_count_threshold :\t1 \n", "trigger7_threshold_invert :\tFalse \n", "trigger8_count_threshold :\t1 \n", "trigger8_threshold_invert :\tFalse \n", "trigger9_count_threshold :\t1 \n", "trigger9_threshold_invert :\tFalse \n", "upsample_rate_awg_path0 :\t0 \n", "upsample_rate_awg_path1 :\t0 \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "cluster0_module6_sequencer3:\n", "\tparameter value\n", "--------------------------------------------------------------------------------\n", "connect_out0 :\toff \n", "connect_out1 :\toff \n", "cont_mode_en_awg_path0 :\tFalse \n", "cont_mode_en_awg_path1 :\tFalse \n", "cont_mode_waveform_idx_awg_path0 :\t0 \n", "cont_mode_waveform_idx_awg_path1 :\t0 \n", "gain_awg_path0 :\t1 \n", "gain_awg_path1 :\t1 \n", "marker_ovr_en :\tFalse \n", "marker_ovr_value :\t0 \n", "mixer_corr_gain_ratio :\t1 \n", "mixer_corr_phase_offset_degree :\t-0 \n", "mod_en_awg :\tFalse \n", "nco_freq :\t0 (Hz)\n", "nco_freq_cal_type_default :\toff (Hz)\n", "nco_phase_offs :\t0 (Degrees)\n", "nco_prop_delay_comp :\t0 (ns)\n", "nco_prop_delay_comp_en :\tFalse (ns)\n", "offset_awg_path0 :\t0 \n", "offset_awg_path1 :\t0 \n", "sync_en :\tFalse \n", "trigger10_count_threshold :\t1 \n", "trigger10_threshold_invert :\tFalse \n", "trigger11_count_threshold :\t1 \n", "trigger11_threshold_invert :\tFalse \n", "trigger12_count_threshold :\t1 \n", "trigger12_threshold_invert :\tFalse \n", "trigger13_count_threshold :\t1 \n", "trigger13_threshold_invert :\tFalse \n", "trigger14_count_threshold :\t1 \n", "trigger14_threshold_invert :\tFalse \n", "trigger15_count_threshold :\t1 \n", "trigger15_threshold_invert :\tFalse \n", "trigger1_count_threshold :\t1 \n", "trigger1_threshold_invert :\tFalse \n", "trigger2_count_threshold :\t1 \n", "trigger2_threshold_invert :\tFalse \n", "trigger3_count_threshold :\t1 \n", "trigger3_threshold_invert :\tFalse \n", "trigger4_count_threshold :\t1 \n", "trigger4_threshold_invert :\tFalse \n", "trigger5_count_threshold :\t1 \n", "trigger5_threshold_invert :\tFalse \n", "trigger6_count_threshold :\t1 \n", "trigger6_threshold_invert :\tFalse \n", "trigger7_count_threshold :\t1 \n", "trigger7_threshold_invert :\tFalse \n", "trigger8_count_threshold :\t1 \n", "trigger8_threshold_invert :\tFalse \n", "trigger9_count_threshold :\t1 \n", "trigger9_threshold_invert :\tFalse \n", "upsample_rate_awg_path0 :\t0 \n", "upsample_rate_awg_path1 :\t0 \n", "cluster0_module6_sequencer4:\n", "\tparameter value\n", "--------------------------------------------------------------------------------\n", "connect_out0 :\toff \n", "connect_out1 :\toff \n", "cont_mode_en_awg_path0 :\tFalse \n", "cont_mode_en_awg_path1 :\tFalse \n", "cont_mode_waveform_idx_awg_path0 :\t0 \n", "cont_mode_waveform_idx_awg_path1 :\t0 \n", "gain_awg_path0 :\t1 \n", "gain_awg_path1 :\t1 \n", "marker_ovr_en :\tFalse \n", "marker_ovr_value :\t0 \n", "mixer_corr_gain_ratio :\t1 \n", "mixer_corr_phase_offset_degree :\t-0 \n", "mod_en_awg :\tFalse \n", "nco_freq :\t0 (Hz)\n", "nco_freq_cal_type_default :\toff (Hz)\n", "nco_phase_offs :\t0 (Degrees)\n", "nco_prop_delay_comp :\t0 (ns)\n", "nco_prop_delay_comp_en :\tFalse (ns)\n", "offset_awg_path0 :\t0 \n", "offset_awg_path1 :\t0 \n", "sync_en :\tFalse \n", "trigger10_count_threshold :\t1 \n", "trigger10_threshold_invert :\tFalse \n", "trigger11_count_threshold :\t1 \n", "trigger11_threshold_invert :\tFalse \n", "trigger12_count_threshold :\t1 \n", "trigger12_threshold_invert :\tFalse \n", "trigger13_count_threshold :\t1 \n", "trigger13_threshold_invert :\tFalse \n", "trigger14_count_threshold :\t1 \n", "trigger14_threshold_invert :\tFalse \n", "trigger15_count_threshold :\t1 \n", "trigger15_threshold_invert :\tFalse \n", "trigger1_count_threshold :\t1 \n", "trigger1_threshold_invert :\tFalse \n", "trigger2_count_threshold :\t1 \n", "trigger2_threshold_invert :\tFalse \n", "trigger3_count_threshold :\t1 \n", "trigger3_threshold_invert :\tFalse \n", "trigger4_count_threshold :\t1 \n", "trigger4_threshold_invert :\tFalse \n", "trigger5_count_threshold :\t1 \n", "trigger5_threshold_invert :\tFalse \n", "trigger6_count_threshold :\t1 \n", "trigger6_threshold_invert :\tFalse \n", "trigger7_count_threshold :\t1 \n", "trigger7_threshold_invert :\tFalse \n", "trigger8_count_threshold :\t1 \n", "trigger8_threshold_invert :\tFalse \n", "trigger9_count_threshold :\t1 \n", "trigger9_threshold_invert :\tFalse \n", "upsample_rate_awg_path0 :\t0 \n", "upsample_rate_awg_path1 :\t0 \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "cluster0_module6_sequencer5:\n", "\tparameter value\n", "--------------------------------------------------------------------------------\n", "connect_out0 :\toff \n", "connect_out1 :\toff \n", "cont_mode_en_awg_path0 :\tFalse \n", "cont_mode_en_awg_path1 :\tFalse \n", "cont_mode_waveform_idx_awg_path0 :\t0 \n", "cont_mode_waveform_idx_awg_path1 :\t0 \n", "gain_awg_path0 :\t1 \n", "gain_awg_path1 :\t1 \n", "marker_ovr_en :\tFalse \n", "marker_ovr_value :\t0 \n", "mixer_corr_gain_ratio :\t1 \n", "mixer_corr_phase_offset_degree :\t-0 \n", "mod_en_awg :\tFalse \n", "nco_freq :\t0 (Hz)\n", "nco_freq_cal_type_default :\toff (Hz)\n", "nco_phase_offs :\t0 (Degrees)\n", "nco_prop_delay_comp :\t0 (ns)\n", "nco_prop_delay_comp_en :\tFalse (ns)\n", "offset_awg_path0 :\t0 \n", "offset_awg_path1 :\t0 \n", "sync_en :\tFalse \n", "trigger10_count_threshold :\t1 \n", "trigger10_threshold_invert :\tFalse \n", "trigger11_count_threshold :\t1 \n", "trigger11_threshold_invert :\tFalse \n", "trigger12_count_threshold :\t1 \n", "trigger12_threshold_invert :\tFalse \n", "trigger13_count_threshold :\t1 \n", "trigger13_threshold_invert :\tFalse \n", "trigger14_count_threshold :\t1 \n", "trigger14_threshold_invert :\tFalse \n", "trigger15_count_threshold :\t1 \n", "trigger15_threshold_invert :\tFalse \n", "trigger1_count_threshold :\t1 \n", "trigger1_threshold_invert :\tFalse \n", "trigger2_count_threshold :\t1 \n", "trigger2_threshold_invert :\tFalse \n", "trigger3_count_threshold :\t1 \n", "trigger3_threshold_invert :\tFalse \n", "trigger4_count_threshold :\t1 \n", "trigger4_threshold_invert :\tFalse \n", "trigger5_count_threshold :\t1 \n", "trigger5_threshold_invert :\tFalse \n", "trigger6_count_threshold :\t1 \n", "trigger6_threshold_invert :\tFalse \n", "trigger7_count_threshold :\t1 \n", "trigger7_threshold_invert :\tFalse \n", "trigger8_count_threshold :\t1 \n", "trigger8_threshold_invert :\tFalse \n", "trigger9_count_threshold :\t1 \n", "trigger9_threshold_invert :\tFalse \n", "upsample_rate_awg_path0 :\t0 \n", "upsample_rate_awg_path1 :\t0 \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Status: OKAY, Flags: NONE, Slot flags: NONE\n" ] } ], "source": [ "# Stop both sequencers.\n", "module.stop_sequencer()\n", "\n", "# Print status of both sequencers (should now say it is stopped).\n", "print(module.get_sequencer_status(0))\n", "print(module.get_sequencer_status(1))\n", "print()\n", "\n", "# Print an overview of the instrument parameters.\n", "print(\"Snapshot:\")\n", "module.print_readable_snapshot(update=True)\n", "\n", "# Reset the cluster\n", "cluster.reset()\n", "print(cluster.get_system_status())" ] } ], "metadata": { "files_to_bundle_in_zip_file": [ "figures/IQ_Mixer_Calib_before.png" ], "jupytext": { "cell_metadata_filter": "all", "notebook_metadata_filter": "files_to_bundle_in_zip_file,is_demo,execute" }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.20" } }, "nbformat": 4, "nbformat_minor": 5 }