{ "cells": [ { "cell_type": "markdown", "id": "28cba69f", "metadata": {}, "source": [ "(sec-timetagging)=\n", "\n", "# Tutorial: Timetagging\n", "\n", "```{seealso}\n", "The complete source code of this tutorial can be found in\n", "\n", "{nb-download}`Timetagging.ipynb`\n", "```\n", "\n", "## Introduction\n", "\n", "```{admonition} Note\n", "The Timetag and TimetagTrace protocols are currently only implemented for the Qblox backend, and they are available on the **QTM**. Please also see {ref}`sec-qblox-acquisition-details` for more information on Qblox module-specific behavior of these operations.\n", "```\n", "\n", "The timetag acquisitions return the time at which the input voltage crossed a set threshold. This tutorial explores various ways to perform timetag acquisitions, using a Qblox cluster with a QCM and a QTM module. Note that only a subset of the features of these acquisitions are shown here, see the {ref}`reference guide ` for more info.\n", "\n", "## Initial setup\n", "\n", "First, we import the required classes and set up the data directory." ] }, { "cell_type": "code", "execution_count": 1, "id": "2cfd8132", "metadata": { "mystnb": { "remove_code_outputs": true } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Data will be saved in:\n", "/Users/user/quantify-data\n" ] } ], "source": [ "from qblox_instruments import Cluster, ClusterType\n", "\n", "from quantify_core.data import handling as dh\n", "from quantify_scheduler import InstrumentCoordinator, QuantumDevice, Schedule, SerialCompiler\n", "from quantify_scheduler.enums import BinMode, TimeRef, TimeSource\n", "from quantify_scheduler.qblox import ClusterComponent\n", "from quantify_scheduler.operations import SquarePulse, Timetag, TimetagTrace, Trace\n", "\n", "dh.set_datadir(dh.default_datadir())" ] }, { "cell_type": "markdown", "id": "cfdc4494", "metadata": {}, "source": [ "Next, we write the {ref}`hardware configuration `: \n", "\n", "- In the `\"hardware_description\"` we define a QCM and a QTM module (when using physical hardware, we also connect port 1 of the QCM with port 1 of the QTM).\n", "\n", "- In the `\"connectivity\"` we assign the QCM port 1 (`\"cluster0.module{QCM_SLOT}.real_output_0\"`) to a mock device port `\"qcm:out\"`, and assign the QTM port 1 (`\"cluster0.module{QTM_SLOT}.digital_output_0\"`) to the mock device port `\"qtm:in\"`.\n", "\n", "- In the {ref}`sec-qblox-digitization-thresholds` of `\"hardware_options\"` we set the value of `in_threshold_primary` field, which is the value of the voltage threshold that needs to be crossed to register a timetag in QTM modules. Note the `\"qtm:in-digital\"` key that is used here; `digital` is the default clock assigned to digital channels." ] }, { "cell_type": "code", "execution_count": 2, "id": "b27d4dd2", "metadata": { "mystnb": { "remove_code_outputs": true } }, "outputs": [], "source": [ "QCM_SLOT = 7\n", "QTM_SLOT = 10\n", "\n", "hw_cfg = {\n", " \"config_type\": \"quantify_scheduler.backends.qblox_backend.QbloxHardwareCompilationConfig\",\n", " \"hardware_description\": {\n", " \"cluster0\": {\n", " \"instrument_type\": \"Cluster\",\n", " \"ref\": \"internal\",\n", " \"modules\": {\n", " f\"{QCM_SLOT}\": {\"instrument_type\": \"QCM\"},\n", " f\"{QTM_SLOT}\": {\"instrument_type\": \"QTM\"},\n", " },\n", " },\n", " },\n", " \"hardware_options\": {\n", " \"digitization_thresholds\": {\"qtm:in-digital\": {\"in_threshold_primary\": 0.5}},\n", " },\n", " \"connectivity\": {\n", " \"graph\": [\n", " [f\"cluster0.module{QCM_SLOT}.real_output_0\", \"qcm:out\"],\n", " [f\"cluster0.module{QTM_SLOT}.digital_input_0\", \"qtm:in\"],\n", " ]\n", " },\n", "}" ] }, { "cell_type": "markdown", "id": "75d39fae", "metadata": {}, "source": [ "We create an {class}`~quantify_scheduler.instrument_coordinator.instrument_coordinator.InstrumentCoordinator` instance with a cluster, where we also provide a `dummy_cfg` dummy configuration so that this notebook can run without physical hardware (when using a real cluster, provide `identifier` instead of `dummy_cfg`)." ] }, { "cell_type": "code", "execution_count": 3, "id": "96166643", "metadata": { "mystnb": { "remove_code_outputs": true } }, "outputs": [], "source": [ "instrument_coordinator = InstrumentCoordinator(name=\"ic\")\n", "cluster = Cluster(\n", " name=\"cluster0\",\n", " # identifier=\"10.10.10.10\",\n", " dummy_cfg={\n", " QCM_SLOT: ClusterType.CLUSTER_QCM,\n", " QTM_SLOT: ClusterType.CLUSTER_QTM,\n", " },\n", ")\n", "\n", "cluster_component = ClusterComponent(cluster)\n", "instrument_coordinator.add_component(cluster_component)" ] }, { "cell_type": "markdown", "id": "d6aadcf6", "metadata": {}, "source": [ "Finally, we define a {class}`~quantify_scheduler.device_under_test.quantum_device.QuantumDevice` (since we do not have a \"real\" quantum device, this object serves simply to generate the compilation configuration later on)." ] }, { "cell_type": "code", "execution_count": 4, "id": "85cdcf68", "metadata": { "mystnb": { "remove_code_outputs": true } }, "outputs": [], "source": [ "quantum_device = QuantumDevice(name=\"quantum_device\")\n", "quantum_device.hardware_config(hw_cfg)" ] }, { "cell_type": "markdown", "id": "6ebf376c", "metadata": {}, "source": [ "## Timetag acquisition\n", "\n", "In all examples in this tutorial, except the gate-level example, the QCM will send four pulses with increasing time between the pulses.\n", "\n", "In the first example, we'll record a single timetag using the {class}`~quantify_scheduler.operations.acquisition_library.Timetag` acquisition protocol. The event that triggers this timetag is defined by the {class}`time_source ` parameter, which we set to the first detected rising edge (`TimeSource.FIRST`). The timetag represents the time elapsed since the moment specified by the {class}`time_ref ` parameter, which we set to the start of the acquisition (`TimeRef.START`). We will simply do one repetition of the schedule.\n", "\n", "```{note}\n", "With the `bin_mode` parameter it is possible to change the behaviour of the acquisition for multiple repetitions. Please see the {ref}`reference guide ` for more information.\n", "```" ] }, { "cell_type": "code", "execution_count": 5, "id": "99a70649", "metadata": { "mystnb": { "remove_code_outputs": true } }, "outputs": [], "source": [ "sched = Schedule(\"Timetag\")\n", "\n", "sched.add(\n", " Timetag(\n", " duration=10e-6,\n", " port=\"qtm:in\",\n", " clock=\"digital\",\n", " time_source=TimeSource.FIRST,\n", " time_ref=TimeRef.START,\n", " )\n", ")\n", "\n", "square_pulse = SquarePulse(amp=1.0, duration=200e-9, port=\"qcm:out\")\n", "sched.add(square_pulse, rel_time=100e-9, ref_pt=\"start\")\n", "for rel_time in (1e-6, 2e-6, 3e-6):\n", " sched.add(square_pulse, rel_time=rel_time, ref_pt=\"start\")" ] }, { "cell_type": "markdown", "id": "d9ffe7b6", "metadata": {}, "source": [ "Let's compile the schedule." ] }, { "cell_type": "code", "execution_count": 6, "id": "d2ee9705", "metadata": { "mystnb": { "remove_code_outputs": true } }, "outputs": [], "source": [ "compiler = SerialCompiler(name=\"compiler\")\n", "compiled_schedule = compiler.compile(\n", " schedule=sched,\n", " config=quantum_device.generate_compilation_config(),\n", ")" ] }, { "cell_type": "markdown", "id": "3cecb9c8", "metadata": {}, "source": [ "And send it to the hardware, and execute it." ] }, { "cell_type": "code", "execution_count": null, "id": "3b65f480", "metadata": { "tags": [ "skip-execution" ] }, "outputs": [], "source": [ "instrument_coordinator.prepare(compiled_schedule)\n", "instrument_coordinator.start()\n", "instrument_coordinator.wait_done(timeout_sec=10)\n", "acquisition = instrument_coordinator.retrieve_acquisition()" ] }, { "cell_type": "markdown", "id": "2d987f93", "metadata": {}, "source": [ "The acquisition data shows one timetag, in this case around 73 ns. This value can differ depending on cable length." ] }, { "cell_type": "code", "execution_count": 7, "id": "1ac22054", "metadata": { "tags": [ "remove-cell" ] }, "outputs": [], "source": [ "import numpy as np\n", "import xarray as xr\n", "\n", "data_array = xr.DataArray(\n", " np.array([72.97265625]).reshape((1, 1)),\n", " dims=[\"repetition\", \"acq_index_0\"],\n", " coords={\"acq_index_0\": [0]},\n", " attrs={\"acq_protocol\": \"Timetag\"},\n", " )\n", "acquisition = xr.Dataset({0: data_array})" ] }, { "cell_type": "code", "execution_count": 8, "id": "76acea77", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset> Size: 16B\n",
                            "Dimensions:      (acq_index_0: 1)\n",
                            "Coordinates:\n",
                            "  * acq_index_0  (acq_index_0) int64 8B 0\n",
                            "Data variables:\n",
                            "    0            (acq_index_0) float64 8B 72.97
" ], "text/plain": [ " Size: 16B\n", "Dimensions: (acq_index_0: 1)\n", "Coordinates:\n", " * acq_index_0 (acq_index_0) int64 8B 0\n", "Data variables:\n", " 0 (acq_index_0) float64 8B 72.97" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "acquisition.isel(repetition=0)" ] }, { "cell_type": "markdown", "id": "52c120d2", "metadata": {}, "source": [ "Next up, we will show you how to record multiple timetags in an acquisition window.\n", "\n", "## TimetagTrace acquisition\n", "\n", "The {class}`~quantify_scheduler.operations.acquisition_library.TimetagTrace` acquisition can record a stream of timetags. Every time that a rising edge is detected, a timetag is recorded. Therefore, this time we expect to see 4 timetags from the 4 pulses sent by the QCM.\n", "\n", "The timetag values are equal to the time difference between the recorded rising edges and the `time_ref` ({class}`~quantify_scheduler.enums.TimeRef`), which we set to the start of the acquisition (`TimeRef.START`)." ] }, { "cell_type": "code", "execution_count": 9, "id": "055daf1c", "metadata": { "mystnb": { "remove_code_outputs": true } }, "outputs": [], "source": [ "sched = Schedule(\"TimetagTrace\")\n", "\n", "sched.add(\n", " TimetagTrace(duration=10e-6, port=\"qtm:in\", clock=\"digital\", time_ref=TimeRef.START)\n", ")\n", "\n", "square_pulse = SquarePulse(amp=1.0, duration=200e-9, port=\"qcm:out\")\n", "sched.add(square_pulse, rel_time=100e-9, ref_pt=\"start\")\n", "for rel_time in (1e-6, 2e-6, 3e-6):\n", " sched.add(square_pulse, rel_time=rel_time, ref_pt=\"start\")" ] }, { "cell_type": "markdown", "id": "af16a0a3", "metadata": {}, "source": [ "We compile the schedule." ] }, { "cell_type": "code", "execution_count": 10, "id": "0b21a58e", "metadata": {}, "outputs": [], "source": [ "compiler = SerialCompiler(name=\"compiler\")\n", "compiled_schedule = compiler.compile(\n", " schedule=sched,\n", " config=quantum_device.generate_compilation_config(),\n", ")" ] }, { "cell_type": "markdown", "id": "1e2687be", "metadata": {}, "source": [ "And we execute it on the hardware." ] }, { "cell_type": "code", "execution_count": null, "id": "b10ad641", "metadata": { "tags": [ "skip-execution" ] }, "outputs": [], "source": [ "instrument_coordinator.prepare(compiled_schedule)\n", "instrument_coordinator.start()\n", "instrument_coordinator.wait_done(timeout_sec=10)\n", "\n", "acquisition = instrument_coordinator.retrieve_acquisition()" ] }, { "cell_type": "markdown", "id": "0f695f10", "metadata": {}, "source": [ "As expected, we record 4 timetags. The first one is roughly around the same value as the single timetag recorded above, and the other ones are 1000, 3000, and 6000 ns later, respectively." ] }, { "cell_type": "code", "execution_count": 11, "id": "b6fec529", "metadata": { "tags": [ "remove-cell" ] }, "outputs": [], "source": [ "import xarray as xr\n", "\n", "data_array = xr.DataArray(\n", " np.array([72.99365234, 1072.96435547, 3072.94970703, 6072.97314453]).reshape((1, 1, 4)),\n", " dims=[\"repetition\", \"acq_index_0\", \"trace_index_0\"],\n", " coords={\"acq_index_0\": [0], \"trace_index_0\": list(range(4))},\n", " attrs={\"acq_protocol\": \"Timetag\"},\n", " )\n", "acquisition = xr.Dataset({0: data_array})" ] }, { "cell_type": "code", "execution_count": 12, "id": "0093b675", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset> Size: 72B\n",
                            "Dimensions:        (trace_index_0: 4)\n",
                            "Coordinates:\n",
                            "    acq_index_0    int64 8B 0\n",
                            "  * trace_index_0  (trace_index_0) int64 32B 0 1 2 3\n",
                            "Data variables:\n",
                            "    0              (trace_index_0) float64 32B 72.99 1.073e+03 ... 6.073e+03
" ], "text/plain": [ " Size: 72B\n", "Dimensions: (trace_index_0: 4)\n", "Coordinates:\n", " acq_index_0 int64 8B 0\n", " * trace_index_0 (trace_index_0) int64 32B 0 1 2 3\n", "Data variables:\n", " 0 (trace_index_0) float64 32B 72.99 1.073e+03 ... 6.073e+03" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "acquisition.isel(acq_index_0=0, repetition=0)" ] }, { "cell_type": "markdown", "id": "dec98780", "metadata": {}, "source": [ "## Trace acquisition\n", "\n", "Finally, we can measure a trace of the input signal. The QTM digitizes this signal and will return `0` whenever the voltage is below the digitization threshold, and `1` when the voltage is above. The trace has a 1 ns time resolution.\n", "\n", "We use the same schedule again, but with the {class}`~quantify_scheduler.operations.acquisition_library.Trace` protocol. Note the `bin_mode`, which must be set to `BinMode.FIRST` when using `Trace` acquisition on a QTM module." ] }, { "cell_type": "code", "execution_count": 13, "id": "0fe654da", "metadata": { "mystnb": { "remove_code_outputs": true } }, "outputs": [], "source": [ "sched = Schedule(\"Trace\")\n", "\n", "sched.add(Trace(duration=10e-6, port=\"qtm:in\", clock=\"digital\", bin_mode=BinMode.FIRST))\n", "\n", "square_pulse = SquarePulse(amp=1.0, duration=200e-9, port=\"qcm:out\")\n", "sched.add(square_pulse, rel_time=100e-9, ref_pt=\"start\")\n", "for rel_time in (1e-6, 2e-6, 3e-6):\n", " sched.add(square_pulse, rel_time=rel_time, ref_pt=\"start\")" ] }, { "cell_type": "markdown", "id": "ad62f2e7", "metadata": {}, "source": [ "We compile the schedule." ] }, { "cell_type": "code", "execution_count": 14, "id": "030b45df", "metadata": {}, "outputs": [], "source": [ "compiler = SerialCompiler(name=\"compiler\")\n", "compiled_schedule = compiler.compile(\n", " schedule=sched,\n", " config=quantum_device.generate_compilation_config(),\n", ")" ] }, { "cell_type": "markdown", "id": "858ef5bb", "metadata": {}, "source": [ "And execute it on the hardware again." ] }, { "cell_type": "code", "execution_count": null, "id": "75ffe36f", "metadata": { "tags": [ "skip-execution" ] }, "outputs": [], "source": [ "instrument_coordinator.prepare(compiled_schedule)\n", "instrument_coordinator.start()\n", "instrument_coordinator.wait_done(timeout_sec=10)\n", "\n", "acquisition = instrument_coordinator.retrieve_acquisition()" ] }, { "cell_type": "markdown", "id": "2cae16ec", "metadata": {}, "source": [ "The result is a trace of the pulses sent by the QCM, digitized by the QTM." ] }, { "cell_type": "code", "execution_count": 15, "id": "7319e2fe", "metadata": { "tags": [ "remove-cell" ] }, "outputs": [], "source": [ "import xarray as xr\n", "\n", "dummy_data = np.zeros((10000,))\n", "\n", "dummy_data[140:340] = 1\n", "dummy_data[1140:1340] = 1\n", "dummy_data[3140:3340] = 1\n", "dummy_data[6140:6340] = 1\n", "\n", "data_array = xr.DataArray(\n", " np.array(dummy_data, dtype=int).reshape(1, -1),\n", " dims=[\"acq_index_0\", \"trace_index_0\"],\n", " coords={\"acq_index_0\": [0], \"trace_index_0\": list(range(10000))},\n", " attrs={\"acq_protocol\": \"Timetag\"},\n", " )\n", "acquisition = xr.Dataset({0: data_array})" ] }, { "cell_type": "code", "execution_count": 16, "id": "15ef1007", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAHHCAYAAABtF1i4AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA4fklEQVR4nO3dCXxTVd7/8V9baAGRRSqtIFIUFJBVEAR13BBUBndBXEBEHBWeQXhEQVlERnEDcWYQBEWceVTAGWR0QBgGQUWqyKaCigtIEVlFyl6kvf/X7/xNSNo07Q1tTm7yeb9eoSS5SU7Pvc393nPPOTfJcRxHAAAALEm29cEAAACKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACuLBkyRJJSkoyP2P5PWHPo48+atZnJLKysuT3v/99icuxzSDeEEYAGHl5efLQQw9JnTp1pHLlytK+fXtZuHChlbLs2bNH7r77bjn55JPlhBNOkEsuuURWrVplpSyIzNtvvy3nnHOOVKpUSU477TQZNWqUHD161HaxEKMII4ALv/vd7+TQoUPmZ7y54447ZPz48XLrrbfK888/LykpKXLVVVfJ0qVLo1qOgoIC6dq1q7z++usyYMAAefrpp2XHjh1y8cUXy7fffiuxbvjw4WYbSWTvvvuuXHvttVKjRg35y1/+Yv7/pz/9Sf7nf/7HdtEQoyrYLgDgJcnJyeZIL94sX75cZsyYIc8884w88MAD5rFevXpJs2bN5MEHH5Rly5ZFrSz/+Mc/zOe9+eabcuONN5rHunfvLmeeeaY5utaQEosOHDhgWnEqVKhgbolMt6EWLVrIf/7zH39dVKtWTZ544gkZOHCgNG7c2HYREWNoGUFM2rRpk9x3331y1llnmVMGtWrVkptuukl++OGHkE36gwYNMufb09LS5NRTTzU70l27dvmX+fHHH83Rme4sateubZZfsGCB6/Puoc7V6xG77rS//PJLczqhSpUqUrduXXNEX1iocujpkVA++eQTueKKK6R69ermPS+66CL56KOP/M9/9dVXpm70dw2kLRnaqqGnXNwEAH2Nnhrx0dDVt29fyc7Ols2bN0u0aFkyMjLk+uuv9z+mp2s0kPzrX/8qtr7CvZ+us/fff7/Icy+++KJ5bu3ateb+559/blqITj/9dPP7Z2Zmyp133ik///xzyH4hus5vueUWqVmzplxwwQVBzwV65ZVX5NJLLzXrXLfRpk2byqRJk4ots+7EW7VqZcqgy86ePbtUv2tJ20w0aJ3oTbelwFCmf896kXhdH0BhiR3fEbM+/fRTc3R88803m3ChIUS/vHXHr190+kWr9u/fLxdeeKHZMetOQ89RawjR89W6409PTzdN5pdddpnk5OTIH//4R9Mn4u9//7u89957ZVbeX375xewEdAeqO039wtUw0Lx5c7nyyivNMm7KoY/p69q0aWNaA7RFxrdD+/DDD6Vdu3bSpEkTGTNmjAwZMsS0IFx99dXm6Fx3pnrk+dhjj5W6/KtXrzYtD3r0Gkg/R61Zs0bq1atX7OsPHjxobiXRwKM77pLKoutRf+fCZZkyZYp88803pl5LS0/5VK1aVWbNmmV2zoFmzpwpZ599tgmTSvvIbNiwQfr06WOCyLp168xn6s+PP/64SMjQgNyoUSNzxK872uLotqufo+tId9DvvPOO2TnrKan+/fsHLaunonr06CH33HOP9O7d26x3/Zz58+fL5ZdfXuxnlGabCScwvIdz4oknmkAVbv2ptm3bBj2u27v+LfueB4I4QAw6ePBgkceys7P1297529/+5n9s5MiR5rHZs2cXWb6goMD8nDBhgllm1qxZ/ucOHDjgNGzY0Dy+ePHiUpdLly38mosuuqhIufLy8pzMzEznhhtu8D9W2nJouRs1auR06dLF/zv46qRBgwbO5Zdf7n8sPz/fueCCC5yMjAxn165dTv/+/Z0KFSo4n376qePG2Wef7Vx66aVFHl+3bp0p2+TJk8O+ftSoUWa5km7169cvsSwnnHCCc+eddxZ5fO7cueY95s+f77jVs2dPp3bt2s7Ro0f9j23dutVJTk52HnvssbDb3RtvvGE+94MPPijy++r7FuZ7LlCo99X1e/rppwc9pvWjr/3nP//pfyw3N9c55ZRTnNatWxe7HbrZZopTmvWnt1deeSXs+zzzzDNmuZycnCLPnXvuuc55551XYlmQeGgZQUzS0w8+v/76q+zdu1caNmxoOsTpqIrbb7/dPPfPf/5TWrZsKdddd12R9/Adxc6bN09OOeUUf/8DpS0r2oys/SHKgh5533bbbf77qamp5khUj7J9SlsObYXQo2PtCFn49IC2rGhrih5R65Gv3qZPn27qQI+K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Z37Wq1fPdlEAAEAE+3GdFt7T16YpKCiQn376SU488URJSkoq08SmAWfz5s1c86YcUc/RQ11HB/UcHdSz9+tZI4YGkTp16gRdRNeTLSP6C5x66qnl9v5a+Wzo5Y96jh7qOjqo5+ignr1dz+FaRHzowAoAAKwijAAAAKsSOoykpaXJqFGjzE+UH+o5eqjr6KCeo4N6Tpx69kQHVgAAEL8SumUEAADYRxgBAABWEUYAAIBVhBEAAGBVQoeRiRMnSlZWllSqVEnat28vy5cvt12kmDV27Fg599xzzSy4tWvXlmuvvVbWr18ftMzhw4elf//+UqtWLalatarccMMNsn379qBlcnJypGvXrlKlShXzPkOGDJGjR48GLbNkyRI555xzTM/uhg0byvTp0yVRPfnkk2bW4fvvv9//GPVcNrZs2SK33XabqcfKlStL8+bNZcWKFf7ntW//yJEj5ZRTTjHPd+rUSb799tug99i9e7fceuutZqKoGjVqSN++fWX//v1By3z++edy4YUXmu8ZneXy6aeflkSRn58vI0aMkAYNGpg6POOMM2TMmDFB1ymhniPzwQcfSLdu3czMpvodMWfOnKDno1mvb775pjRu3Ngso39H8+bNc/8LOQlqxowZTmpqqjNt2jRn3bp1Tr9+/ZwaNWo427dvt120mNSlSxfnlVdecdauXeusWbPGueqqq5zTTjvN2b9/v3+Ze+65x6lXr56zaNEiZ8WKFc55553ndOzY0f/80aNHnWbNmjmdOnVyVq9e7cybN89JT093hg0b5l9mw4YNTpUqVZzBgwc7X375pfOXv/zFSUlJcebPn+8kmuXLlztZWVlOixYtnIEDB/ofp56P3+7du5369es7d9xxh/PJJ5+Y+liwYIHz3Xff+Zd58sknnerVqztz5sxxPvvsM+fqq692GjRo4Bw6dMi/zBVXXOG0bNnS+fjjj50PP/zQadiwodOzZ0//87m5uU5GRoZz6623mr+dN954w6lcubLz4osvOong8ccfd2rVquX8+9//djZu3Oi8+eabTtWqVZ3nn3/evwz1HBn9u37kkUec2bNna7Jz3nrrraDno1WvH330kfnuePrpp813yfDhw52KFSs6X3zxhavfJ2HDSLt27Zz+/fv77+fn5zt16tRxxo4da7VcXrFjxw7zB/D++++b+3v27DEboH7Z+Hz11Vdm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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "acquisition.to_dataarray().plot()" ] }, { "cell_type": "markdown", "id": "a844b7bd", "metadata": {}, "source": [ "## Gate-level: NV center example\n", "\n", "To finish the tutorial, we show how to use the timetag acquisition protocol with an NV center defined in the quantum device.\n", "\n", "To keep the tutorial focused, we only include the readout laser in the hardware configuration (and leave re-ionization and spin-pump lasers out). Again, we use port 1 of the QCM, this time connected to an optical modulator, and port 1 of the QTM, connected to a single-photon detector:" ] }, { "cell_type": "code", "execution_count": 17, "id": "66a95da1", "metadata": { "mystnb": { "remove_code_outputs": true } }, "outputs": [], "source": [ "QCM_SLOT = 7\n", "QTM_SLOT = 10\n", "\n", "hw_cfg = {\n", " \"config_type\": \"quantify_scheduler.backends.qblox_backend.QbloxHardwareCompilationConfig\",\n", " \"hardware_description\": {\n", " \"cluster0\": {\n", " \"instrument_type\": \"Cluster\",\n", " \"ref\": \"internal\",\n", " \"modules\": {\n", " f\"{QCM_SLOT}\": {\"instrument_type\": \"QCM\"},\n", " f\"{QTM_SLOT}\": {\"instrument_type\": \"QTM\"},\n", " },\n", " },\n", " \"red_laser\": {\"instrument_type\": \"LocalOscillator\", \"power\": 1},\n", " \"optical_mod_red_laser\": {\"instrument_type\": \"OpticalModulator\"},\n", " },\n", " \"hardware_options\": {\n", " \"modulation_frequencies\": {\n", " \"qe0:optical_control-qe0.ge0\": {\"interm_freq\": 0.0, \"lo_freq\": None},\n", " \"qe0:optical_readout-qe0.ge0\": {\"interm_freq\": 0.0, \"lo_freq\": None},\n", " },\n", " \"digitization_thresholds\": {\n", " \"qe0:optical_readout-qe0.ge0\": {\"in_threshold_primary\": 0.5}\n", " },\n", " },\n", " \"connectivity\": {\n", " \"graph\": [\n", " [f\"cluster0.module{QCM_SLOT}.real_output_0\", \"optical_mod_red_laser.if\"],\n", " [\"red_laser.output\", \"optical_mod_red_laser.lo\"],\n", " [\"optical_mod_red_laser.out\", \"qe0:optical_control\"],\n", " [f\"cluster0.module{QTM_SLOT}.digital_input_0\", \"qe0:optical_readout\"],\n", " ]\n", " },\n", "}" ] }, { "cell_type": "markdown", "id": "9b9bc649", "metadata": {}, "source": [ "We now add a mock laser to our instrument coordinator so that the example compiles." ] }, { "cell_type": "code", "execution_count": 18, "id": "2990c6e2", "metadata": { "mystnb": { "remove_code_outputs": true } }, "outputs": [], "source": [ "from quantify_scheduler import GenericInstrumentCoordinatorComponent, MockLocalOscillator\n", "\n", "red_laser = MockLocalOscillator(name=\"red_laser\")\n", "instrument_coordinator.add_component(GenericInstrumentCoordinatorComponent(red_laser))" ] }, { "cell_type": "markdown", "id": "2be5f7fb", "metadata": {}, "source": [ "Then we add a {class}`~quantify_scheduler.device_under_test.nv_element.BasicElectronicNVElement` (our NV center) to the quantum device. Note that measurement parameters such as `time_source` and `time_ref` are now defined on the quantum device element." ] }, { "cell_type": "code", "execution_count": 19, "id": "3858cae8", "metadata": { "mystnb": { "remove_code_outputs": true } }, "outputs": [], "source": [ "from quantify_scheduler import BasicElectronicNVElement\n", "\n", "quantum_device.hardware_config(hw_cfg)\n", "\n", "qe0 = BasicElectronicNVElement(\"qe0\")\n", "qe0.measure.pulse_amplitude(1.0)\n", "qe0.measure.time_source(TimeSource.FIRST)\n", "qe0.measure.time_ref(TimeRef.START)\n", "qe0.clock_freqs.ge0.set(470.4e12)\n", "quantum_device.add_element(qe0)" ] }, { "cell_type": "markdown", "id": "a2fad13d", "metadata": {}, "source": [ "The schedule consists simply of a `Measure` operation, which includes a readout pulse (sent from the QCM to the optical modulator) and a timetag acquisition." ] }, { "cell_type": "code", "execution_count": 20, "id": "99b45fc8", "metadata": { "mystnb": { "remove_code_outputs": true } }, "outputs": [ { "data": { "text/plain": [ "{'name': '9f94ba43-6ebd-4a8e-af5d-cb056a989576', 'operation_id': '-4115081704540046770', 'timing_constraints': [{'rel_time': 0, 'ref_schedulable': None, 'ref_pt_new': None, 'ref_pt': None}], 'label': '9f94ba43-6ebd-4a8e-af5d-cb056a989576'}" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from quantify_scheduler.operations import Measure\n", "\n", "sched = Schedule(\"NV Timetag\")\n", "\n", "sched.add(Measure(\"qe0\", acq_protocol=\"Timetag\", bin_mode=BinMode.APPEND))" ] }, { "cell_type": "markdown", "id": "9a4993ac", "metadata": {}, "source": [ "Finally, we compile the schedule and show the pulse and the acquisition operation in a pulse diagram." ] }, { "cell_type": "code", "execution_count": 21, "id": "81014f98", "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "fill": "tozeroy", "hoverinfo": "x+y+name", "hoverlabel": { "namelength": -1 }, "legendgroup": "0", "line": { "color": "#636EFA" }, "mode": "lines", "name": "VoltageOffset, clock qe0.ge0", "showlegend": true, "type": "scatter", "x": { "bdata": "AAAAAAAAAAB45zj4off0PoTmJKii9/Q+LUMc6+I2Cj8=", "dtype": "f8" }, "xaxis": "x", "y": { "bdata": "AAAAAAAA8D8AAAAAAADwPwAAAAAAAAAAAAAAAAAAAAA=", "dtype": "f8" }, "yaxis": "y" }, { "fill": "tozeroy", "hoverinfo": "x+y+name", "hoverlabel": { "namelength": -1 }, "legendgroup": "1", "line": { "color": "#EF553B" }, "mode": "lines", "name": "Measure qe0, clock qe0.ge0", "showlegend": true, "type": "scatter", "x": { "bdata": "eOc4+KH39D6E5iSoovf0Ph+HVGDn9/Q+uieEGCz49D5VyLPQcPj0PuVp99i0+PQ+8WjjiLX49D4=", "dtype": "f8" }, "xaxis": "x", "y": { "bdata": "AAAAAAAAAAAAAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAAAAA=", "dtype": "f8" }, "yaxis": "y" }, { "marker": { "color": "rgba(0,0,0,.25)", "size": 15, "symbol": [ "arrow-bar-left", "arrow-bar-right" ] }, "mode": "markers", "name": "Measure qe0", "type": "scatter", "x": [ 0, 5e-05 ], "xaxis": "x2", "y": [ 0, 0 ], "yaxis": "y2" } ], "layout": { "height": 600, "shapes": [ { "fillcolor": "rgba(255,0,0,0.1)", "layer": "below", "line": { "color": "rgba(0,0,0,0)", "width": 3 }, "name": "Measure qe0", "type": "rect", "x0": 0, "x1": 5e-05, "xref": "x", "y0": 0, "y1": 1, "yref": "y2 domain" } ], "showlegend": false, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1.0, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1.0, "#f0f921" ] ], "type": "heatmap" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1.0, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1.0, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermap": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermap" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0.0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1.0, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0.0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1.0, "#f0f921" ] ], "sequentialminus": [ [ 0.0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1.0, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "NV Timetag" }, "width": 1000, "xaxis": { "anchor": "y", "domain": [ 0.0, 1.0 ], "hoverformat": ".3s", "matches": "x2", "showgrid": true, "showticklabels": false, "tickformat": ".2s", "ticksuffix": "s" }, "xaxis2": { "anchor": "y2", "domain": [ 0.0, 1.0 ], "hoverformat": ".3s", "showgrid": true, "tickformat": ".2s", "tickformatstops": [ { "dtickrange": [ null, 1e-09 ], "value": ".10s" }, { "dtickrange": [ 1e-09, 1e-06 ], "value": ".7s" }, { "dtickrange": [ 1e-06, 0.001 ], "value": ".4s" } ], "ticksuffix": "s", "title": { "text": "Time" } }, "yaxis": { "anchor": "x", "autorange": true, "domain": [ 0.51, 1.0 ], "hoverformat": ".3s", "tickformat": ".2s", "ticksuffix": "V", "title": { "text": "qe0:optical_control" } }, "yaxis2": { "anchor": "x2", "autorange": true, "domain": [ 0.0, 0.49 ], "hoverformat": ".3s", "tickformat": ".2s", "ticksuffix": "V", "title": { "text": "qe0:optical_readout" } } } }, "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "compiler = SerialCompiler(name=\"compiler\")\n", "compiled_schedule = compiler.compile(\n", " schedule=sched,\n", " config=quantum_device.generate_compilation_config(),\n", ")\n", "\n", "compiled_schedule.plot_pulse_diagram(plot_backend=\"plotly\")" ] } ], "metadata": { "file_format": "mystnb", "kernelspec": { "display_name": "python3", "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.21" }, "source_map": [ 6, 30, 44, 54, 84, 88, 105, 110, 117, 130, 151, 155, 165, 169, 175, 179, 193, 195, 205, 220, 224, 230, 234, 241, 245, 258, 260, 268, 281, 285, 291, 295, 302, 306, 326, 328, 336, 376, 380, 389, 393, 408, 412, 422, 426 ] }, "nbformat": 4, "nbformat_minor": 5 }