{ "cells": [ { "cell_type": "markdown", "id": "f23e9b3a", "metadata": {}, "source": [ "(sec-tutorial-ops-qubits)=\n", "\n", "# Tutorial: Operations and Qubits\n", "\n", "```{seealso}\n", "The complete source code of this tutorial can be found in\n", "\n", "{nb-download}`Operations and Qubits.ipynb`\n", "```\n", "\n", "## Gates, measurements and qubits\n", "\n", "In the previous tutorials, experiments were created on the {ref}`quantum-device level`. On this level,\n", "operations are defined in terms of explicit signals and locations on the chip, rather than the qubit and the intended operation.\n", "To work at a greater level of abstraction, `quantify-scheduler` allows creating operations on the\n", "{ref}`quantum-circuit level`.\n", "Instead of signals, clocks, and ports, operations are defined by the effect they have on specific qubits. This representation of the schedules can be compiled to the quantum-device level to create the pulse schemes.\n", "\n", "In this tutorial we show how to define operations on the {ref}`quantum-circuit level`, combine them into schedules, and show their circuit-level visualization.\n", "We go through the configuration file needed to compile the schedule to the quantum-device level and show how these configuration files can be created automatically and dynamically.\n", "Finally, we showcase the hybrid nature of `quantify-scheduler`, allowing the scheduling of circuit-level and device-level operations side by side in the same schedule.\n", "\n", "Many of the gates used in the circuit layer description are defined in\n", "{class}`~quantify_scheduler.operations.gate_library` such as {class}`~quantify_scheduler.operations.gate_library.Reset`, {class}`~quantify_scheduler.operations.gate_library.X90` and\n", "{class}`~quantify_scheduler.operations.gate_library.Measure`.\n", "Operations are instantiated by providing them with the name of the qubit(s) on which\n", "they operate:" ] }, { "cell_type": "code", "execution_count": 1, "id": "b5da2c62", "metadata": {}, "outputs": [], "source": [ "from quantify_scheduler.operations import CZ, Measure, Reset, X90\n", "\n", "q0, q1 = (\"q0\", \"q1\")\n", "X90(q0)\n", "Measure(q1)\n", "CZ(q0, q1)\n", "Reset(q0);\n" ] }, { "cell_type": "markdown", "id": "973f21b4", "metadata": {}, "source": [ "Let's investigate the different components present in the circuit-level description of\n", "the operation. As an example, we create a 45 degree rotation operation over the\n", "x-axis." ] }, { "cell_type": "code", "execution_count": 2, "id": "eb23ae80", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'acquisition_info': [],\n", " 'gate_info': {'device_overrides': {},\n", " 'operation_type': 'Rxy',\n", " 'phi': 0.0,\n", " 'plot_func': 'quantify_scheduler.schedules._visualization.circuit_diagram.gate_box',\n", " 'qubits': ['q0'],\n", " 'tex': '$R_{xy}^{45, 0}$',\n", " 'theta': 45.0,\n", " 'unitary': array([[0.92387953+0.j , 0. -0.38268343j],\n", " [0. -0.38268343j, 0.92387953+0.j ]])},\n", " 'logic_info': {},\n", " 'name': \"Rxy(45, 0, 'q0')\",\n", " 'pulse_info': []}\n" ] } ], "source": [ "from pprint import pprint\n", "from quantify_scheduler.operations import Rxy\n", "\n", "rxy45 = Rxy(theta=45.0, phi=0.0, qubit=q0)\n", "pprint(rxy45.data)\n" ] }, { "cell_type": "markdown", "id": "a622d101", "metadata": {}, "source": [ "As we can see, the structure of a circuit-level operation is similar to a pulse-level\n", "operation. However, the information is contained inside the {code}`gate_info` entry rather\n", "than the {code}`pulse_info` entry of the data dictionary.\n", "Importantly, there is no device-specific information coupled to the operation such that\n", "it represents the abstract notion of this qubit rotation, rather than how to perform it\n", "on any physical qubit implementation.\n", "\n", "The entries present above are documented in the `operation` schema.\n", "Generally, these schemas are only important when defining custom operations, which is\n", "not part of this tutorial. This schema can be inspected via:" ] }, { "cell_type": "code", "execution_count": 3, "id": "825522d9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'operation_type': {'description': 'Defines what class of operations this gate '\n", " 'refers to (e.g. Rxy, CZ etc.).',\n", " 'type': 'string'},\n", " 'plot_func': {'description': 'reference to a function for plotting this '\n", " 'operation. If not specified, defaults to using '\n", " ':func:`~quantify_scheduler.schedules._visualization.circuit_diagram.gate_box`.',\n", " 'type': ['string', 'null']},\n", " 'qubits': {'description': 'A list of strings indicating the qubits the gate '\n", " 'acts on. Valid qubits are strings that appear in '\n", " 'the device_config.json file.',\n", " 'type': 'array'},\n", " 'symmetric': {'description': 'A boolean to indicate whether a two qubit gate '\n", " 'is symmetric. This is used in the device config '\n", " 'compilation stage. By default, it is set as '\n", " 'False',\n", " 'type': 'boolean'},\n", " 'tex': {'description': 'latex snippet for plotting', 'type': 'string'},\n", " 'unitary': {'description': 'A unitary matrix describing the operation.'}}\n" ] } ], "source": [ "import importlib.resources\n", "import json\n", "from quantify_scheduler import schemas\n", "\n", "operation_schema = json.loads(importlib.resources.read_text(schemas, \"operation.json\"))\n", "pprint(operation_schema[\"properties\"][\"gate_info\"][\"properties\"])\n" ] }, { "cell_type": "markdown", "id": "efce0d14", "metadata": {}, "source": [ "## Schedule creation from the circuit layer (Bell)\n", "\n", "The circuit-level operations can be used to create a {class}`~quantify_scheduler.schedules.schedule.Schedule` within\n", "`quantify-scheduler` using the same method as for the pulse-level operations.\n", "This enables creating schedules on a more abstract level.\n", "Here, we demonstrate this extra layer of abstraction by creating a {class}`~quantify_scheduler.schedules.schedule.Schedule` for measuring\n", "Bell violations.\n", "\n", "```{note}\n", "Within a single {class}`~quantify_scheduler.schedules.schedule.Schedule`, high-level circuit layer operations can be mixed with quantum-device level operations. This mixed representation is useful for experiments where some pulses cannot easily be represented as qubit gates. An example of this is given by the `Chevron` experiment given in {ref}`Mixing pulse and circuit layer operations (Chevron)`.\n", "```\n", "\n", "As the first example, we want to create a schedule for performing the\n", "[Bell experiment](https://en.wikipedia.org/wiki/Bell%27s_theorem).\n", "The goal of the Bell experiment is to create a Bell state\n", "{math}`|\\Phi ^+\\rangle=\\frac{1}{2}(|00\\rangle+|11\\rangle)` which is a perfectly entangled state, followed by a measurement.\n", "By rotating the measurement basis, or equivalently one of the qubits, it is possible\n", "to observe violations of the CSHS inequality.\n", "\n", "We create this experiment using the\n", "{ref}`quantum-circuit level` description.\n", "This allows defining the Bell schedule as:" ] }, { "cell_type": "code", "execution_count": 4, "id": "c5718780", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Schedule \"Bell experiment\" containing (66) 147 (unique) operations." ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "from quantify_scheduler import Schedule\n", "from quantify_scheduler.operations import CZ, Measure, Reset, Rxy, X90\n", "\n", "sched = Schedule(\"Bell experiment\")\n", "\n", "for acq_idx, theta in enumerate(np.linspace(0, 360, 21)):\n", " sched.add(Reset(q0, q1))\n", " sched.add(X90(q0))\n", " sched.add(X90(q1), ref_pt=\"start\") # Start at the same time as the other X90\n", " sched.add(CZ(q0, q1))\n", " sched.add(Rxy(theta=theta, phi=0, qubit=q0))\n", "\n", " sched.add(Measure(q0, acq_index=acq_idx), label=\"M q0 {:.2f} deg\".format(theta))\n", " sched.add( \n", " Measure(q1, acq_index=acq_idx),\n", " label=\"M q1 {:.2f} deg\".format(theta),\n", " ref_pt=\"start\", # Start at the same time as the other measure\n", " )\n", "\n", "sched\n" ] }, { "cell_type": "markdown", "id": "6a9e9530", "metadata": {}, "source": [ "By scheduling 7 operations for 21 different values for {code}`theta` we indeed get a schedule containing 7\\*21=147 operations. To minimize the size of the schedule, identical operations are stored only once. For example, the {class}`~quantify_scheduler.operations.gate_library.CZ` operation is stored only once but used 21 times, which leaves only 66 unique operations in the schedule.\n", "\n", "```{note}\n", "The acquisitions are different for every iteration due to their different {code}`acq_index`. The {class}`~quantify_scheduler.operations.gate_library.Rxy`-gate rotates over a different angle every iteration and must therefore also be different for every iteration (except for the last since {math}`R^{360}=R^0`). Hence the number of unique operations is 3\\*21-1+4=66.\n", "```\n", "\n", "(sec-tutorial-ops-qubits-vis)=\n", "## Visualizing the quantum circuit\n", "\n", "We can directly visualize the created schedule on the\n", "{ref}`quantum-circuit level` with the {meth}`~quantify_scheduler.schedules.schedule.ScheduleBase.plot_circuit_diagram` method.\n", "This visualization shows every operation on a line representing the different qubits." ] }, { "cell_type": "code", "execution_count": 5, "id": "3b5674d5", "metadata": {}, "outputs": [ { "data": { "image/png": "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hos7XQaa14vixg4aB12VBPtGiu+++27eMIKmTZvSuXPnUvXjcrmqbAEDygGBUA5QDpDSUw4otN0K32KYi4+P58EHHwx1GFJJRbgND/aJI8JlKO2BFGMgwmV4oE8cbpeOwEnpZGVlkZqaitfrxeVyMWTIEB3RRTlAypdygISLypADglLEWGt7W2sfDEZfoaYEJuWtef0oJg1oRKTLEGj+cRmIdBkmDWhE8/oaBy2lt2zZsrxpOn0+X6mGEVRGygFS3pQDJBxUhhygMzEiIZDQpDrThzWleb2SJaGzea55vSimD2tKQpPq5RecVAmLFy/GGIMxhk6dOoXVVLQilZ1ygIRaZcgBuiZGJESa1/cno+VpR1myKYsfsgrevMrtAm/u5OWNYyJJ7lSbvu1rE+F21uleCT979+5l06ZNec+HDRsWwmhEqiblAAmVypIDVMSIhFCE25DUMYbEhNqkZ2azdf8pXv23f+aavu1rER8bTesG0bSIjXLcWFUJX8uWLcv7d0REBImJiedpLSLlRTlAQqGy5AAVMSJhwBhDywbRNKkTmZfAbr+mPtUiNeJTgq9r167Ur1+fQ4cOccMNN1TKe7uIOIlygFSkypIDVMSIiFQxnTt3ZvXq1WzZsoV27dqFOhwREalAlSUHqIgREamC3G43nTp1CnUYIiISApUhB+g8pYiIiIiIOIqKGBERERERcRQVMSIiIiIi4igqYkRERERExFF0YX8VMfaG+FCHICJFcPLMMOIcygEi4Uk5oPR0JkZERERERBxFRYyIiIiIiDiKihgREREREXEUFTEiIiIiIuIoKmJERERERMRRVMSIiIiIiIijqIgRERERERFHUREjIiIiIiKOoiJGREREREQcRUWMiIiIiIg4iooYERERERFxFBUxIiIiIiLiKCpiRERERETEUVTEiIiIiIiIo6iIERERERERR1ERIyIiIiIijqIiRkREREREHEVFjIiIiIiIOIqKGBERERERcRQVMSIiIiIi4igqYkRERERExFFUxIiIiIiIiKOoiBEREREREUdRESMiIiIiIo6iIkZERERERBxFRYyIiIiIiDiKihgREREREXEUFTEiIiIiIuIoKmJERERERMRRVMSIiIiIiIijqIgRERERERFHUREjIiIiIiKOoiJGREREREQcRUWMiIiIiIg4iooYERERERFxFBUxIiIi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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "_, ax = sched.plot_circuit_diagram()\n", "# all gates are plotted, but it doesn't all fit in a matplotlib figure.\n", "# Therefore we use :code:`set_xlim` to limit the number of gates shown.\n", "ax.set_xlim(-0.5, 9.5)\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "a29fbed8", "metadata": {}, "source": [ "In previous tutorials, we visualized the `schedules` on the pulse level using {meth}`~quantify_scheduler.schedules.schedule.ScheduleBase.plot_pulse_diagram` .\n", "Up until now, however, all gates have been defined on the\n", "{ref}`quantum-circuit level` without defining the\n", "corresponding pulse shapes.\n", "Therefore, trying to run {meth}`~quantify_scheduler.schedules.schedule.ScheduleBase.plot_pulse_diagram` will raise an error which\n", "signifies no {code}`pulse_info` is present in the schedule:" ] }, { "cell_type": "code", "execution_count": 6, "id": "83303ba4", "metadata": { "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "KeyError", "evalue": "'abs_time'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[6], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43msched\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mplot_pulse_diagram\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m/usr/local/lib/python3.9/site-packages/quantify_scheduler/schedules/schedule.py:456\u001b[0m, in \u001b[0;36mScheduleBase.plot_pulse_diagram\u001b[0;34m(self, port_list, sampling_rate, modulation, modulation_if, plot_backend, x_range, combine_waveforms_on_same_port, **backend_kwargs)\u001b[0m\n\u001b[1;32m 450\u001b[0m \u001b[38;5;66;03m# NB imported here to avoid circular import\u001b[39;00m\n\u001b[1;32m 452\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21;01mquantify_scheduler\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mschedules\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_visualization\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpulse_diagram\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[1;32m 453\u001b[0m sample_schedule,\n\u001b[1;32m 454\u001b[0m )\n\u001b[0;32m--> 456\u001b[0m sampled_pulses_and_acqs \u001b[38;5;241m=\u001b[39m \u001b[43msample_schedule\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 457\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 458\u001b[0m \u001b[43m \u001b[49m\u001b[43msampling_rate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msampling_rate\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 459\u001b[0m \u001b[43m \u001b[49m\u001b[43mport_list\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mport_list\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 460\u001b[0m \u001b[43m \u001b[49m\u001b[43mmodulation\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmodulation\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 461\u001b[0m \u001b[43m \u001b[49m\u001b[43mmodulation_if\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmodulation_if\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 462\u001b[0m \u001b[43m \u001b[49m\u001b[43mx_range\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mx_range\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 463\u001b[0m \u001b[43m \u001b[49m\u001b[43mcombine_waveforms_on_same_port\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcombine_waveforms_on_same_port\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 464\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 466\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m plot_backend \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmpl\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 467\u001b[0m \u001b[38;5;66;03m# NB imported here to avoid circular import\u001b[39;00m\n\u001b[1;32m 469\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21;01mquantify_scheduler\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mschedules\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_visualization\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpulse_diagram\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[1;32m 470\u001b[0m pulse_diagram_matplotlib,\n\u001b[1;32m 471\u001b[0m )\n", "File \u001b[0;32m/usr/local/lib/python3.9/site-packages/quantify_scheduler/schedules/_visualization/pulse_diagram.py:441\u001b[0m, in \u001b[0;36msample_schedule\u001b[0;34m(schedule, port_list, modulation, modulation_if, sampling_rate, x_range, combine_waveforms_on_same_port)\u001b[0m\n\u001b[1;32m 438\u001b[0m pulse_infos: \u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, \u001b[38;5;28mlist\u001b[39m[ScheduledInfo]] \u001b[38;5;241m=\u001b[39m defaultdict(\u001b[38;5;28mlist\u001b[39m)\n\u001b[1;32m 439\u001b[0m acq_infos: \u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, \u001b[38;5;28mlist\u001b[39m[ScheduledInfo]] \u001b[38;5;241m=\u001b[39m defaultdict(\u001b[38;5;28mlist\u001b[39m)\n\u001b[0;32m--> 441\u001b[0m \u001b[43m_extract_schedule_infos\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 442\u001b[0m \u001b[43m \u001b[49m\u001b[43mschedule\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 443\u001b[0m \u001b[43m \u001b[49m\u001b[43mport_list\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 444\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 445\u001b[0m \u001b[43m \u001b[49m\u001b[43moffset_infos\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 446\u001b[0m \u001b[43m \u001b[49m\u001b[43mpulse_infos\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 447\u001b[0m \u001b[43m \u001b[49m\u001b[43macq_infos\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 448\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 450\u001b[0m x_min, x_max \u001b[38;5;241m=\u001b[39m x_range\n\u001b[1;32m 452\u001b[0m sampled_pulses \u001b[38;5;241m=\u001b[39m get_sampled_pulses_from_voltage_offsets(\n\u001b[1;32m 453\u001b[0m schedule\u001b[38;5;241m=\u001b[39mschedule,\n\u001b[1;32m 454\u001b[0m offset_infos\u001b[38;5;241m=\u001b[39moffset_infos,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 458\u001b[0m modulation_if\u001b[38;5;241m=\u001b[39mmodulation_if,\n\u001b[1;32m 459\u001b[0m )\n", "File \u001b[0;32m/usr/local/lib/python3.9/site-packages/quantify_scheduler/schedules/_visualization/pulse_diagram.py:338\u001b[0m, in \u001b[0;36m_extract_schedule_infos\u001b[0;34m(operation, port_list, time_offset, offset_infos, pulse_infos, acq_infos)\u001b[0m\n\u001b[1;32m 336\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m schedulable \u001b[38;5;129;01min\u001b[39;00m operation\u001b[38;5;241m.\u001b[39mschedulables\u001b[38;5;241m.\u001b[39mvalues():\n\u001b[1;32m 337\u001b[0m inner_operation \u001b[38;5;241m=\u001b[39m operation\u001b[38;5;241m.\u001b[39moperations[schedulable[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moperation_id\u001b[39m\u001b[38;5;124m\"\u001b[39m]]\n\u001b[0;32m--> 338\u001b[0m abs_time \u001b[38;5;241m=\u001b[39m \u001b[43mschedulable\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mabs_time\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\n\u001b[1;32m 339\u001b[0m _extract_schedule_infos(\n\u001b[1;32m 340\u001b[0m inner_operation,\n\u001b[1;32m 341\u001b[0m port_list,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 345\u001b[0m acq_infos,\n\u001b[1;32m 346\u001b[0m )\n\u001b[1;32m 347\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(operation, ConditionalOperation):\n", "File \u001b[0;32m/usr/local/lib/python3.9/collections/__init__.py:1058\u001b[0m, in \u001b[0;36mUserDict.__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 1056\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m__missing__\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[1;32m 1057\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__missing__\u001b[39m(\u001b[38;5;28mself\u001b[39m, key)\n\u001b[0;32m-> 1058\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key)\n", "\u001b[0;31mKeyError\u001b[0m: 'abs_time'" ] } ], "source": [ "sched.plot_pulse_diagram()" ] }, { "cell_type": "markdown", "id": "fb1ffb7d", "metadata": {}, "source": [ "And similarly for the {code}`timing_table`:" ] }, { "cell_type": "code", "execution_count": 7, "id": "1cc2f502", "metadata": { "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "ValueError", "evalue": "Absolute time has not been determined yet. Please compile your schedule.", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[7], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43msched\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtiming_table\u001b[49m\n", "File \u001b[0;32m/usr/local/lib/python3.9/site-packages/quantify_scheduler/schedules/schedule.py:647\u001b[0m, in \u001b[0;36mScheduleBase.timing_table\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 553\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 554\u001b[0m \u001b[38;5;124;03mA styled pandas dataframe containing the absolute timing of pulses and acquisitions in a schedule.\u001b[39;00m\n\u001b[1;32m 555\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 644\u001b[0m \n\u001b[1;32m 645\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m \u001b[38;5;66;03m# noqa: E501\u001b[39;00m\n\u001b[1;32m 646\u001b[0m timing_table_list \u001b[38;5;241m=\u001b[39m []\n\u001b[0;32m--> 647\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_generate_timing_table_list\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtiming_table_list\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 648\u001b[0m timing_table \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mconcat(timing_table_list, ignore_index\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m 649\u001b[0m timing_table \u001b[38;5;241m=\u001b[39m timing_table\u001b[38;5;241m.\u001b[39msort_values(by\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mabs_time\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", "File \u001b[0;32m/usr/local/lib/python3.9/site-packages/quantify_scheduler/schedules/schedule.py:507\u001b[0m, in \u001b[0;36mScheduleBase._generate_timing_table_list\u001b[0;34m(cls, operation, time_offset, timing_table_list, operation_id)\u001b[0m\n\u001b[1;32m 504\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m schedulable \u001b[38;5;129;01min\u001b[39;00m operation\u001b[38;5;241m.\u001b[39mschedulables\u001b[38;5;241m.\u001b[39mvalues():\n\u001b[1;32m 505\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mabs_time\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m schedulable:\n\u001b[1;32m 506\u001b[0m \u001b[38;5;66;03m# when this exception is encountered\u001b[39;00m\n\u001b[0;32m--> 507\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 508\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAbsolute time has not been determined yet. \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 509\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPlease compile your schedule.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 510\u001b[0m )\n\u001b[1;32m 511\u001b[0m \u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39m_generate_timing_table_list(\n\u001b[1;32m 512\u001b[0m operation\u001b[38;5;241m.\u001b[39moperations[schedulable[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moperation_id\u001b[39m\u001b[38;5;124m\"\u001b[39m]],\n\u001b[1;32m 513\u001b[0m time_offset \u001b[38;5;241m+\u001b[39m schedulable[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mabs_time\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n\u001b[1;32m 514\u001b[0m timing_table_list,\n\u001b[1;32m 515\u001b[0m schedulable[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moperation_id\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n\u001b[1;32m 516\u001b[0m )\n\u001b[1;32m 517\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(operation, LoopOperation):\n", "\u001b[0;31mValueError\u001b[0m: Absolute time has not been determined yet. Please compile your schedule." ] } ], "source": [ "sched.timing_table" ] }, { "cell_type": "markdown", "id": "47ede668", "metadata": {}, "source": [ "## Device configuration\n", "\n", "Up until now, the schedule is not specific to any qubit implementation.\n", "The aim of this section is to add device-specific information to the schedule.\n", "This knowledge is contained in the {ref}`device configuration`, which we introduce in this section.\n", "By compiling the schedule to the quantum-device layer, we incorporate the device configuration into the schedule (for example by adding pulse information to every gate) and thereby enable it to run on a specific qubit implementation.\n", "\n", "To start this section, we will unpack the structure of the device configuration.\n", "Here we will use an example device configuration for a transmon-based system that is used in the\n", "`quantify-scheduler` test suite." ] }, { "cell_type": "code", "execution_count": 8, "id": "d3f5f490", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['clocks', 'elements', 'edges', 'scheduling_strategy', 'compilation_passes']" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from quantify_scheduler.backends.circuit_to_device import DeviceCompilationConfig\n", "from quantify_scheduler.schemas import example_transmon_cfg\n", "\n", "device_cfg = DeviceCompilationConfig.model_validate(example_transmon_cfg)\n", "\n", "list(device_cfg.model_dump())" ] }, { "cell_type": "markdown", "id": "9d41e677", "metadata": {}, "source": [ "Before explaining how this can be used to compile schedules, let us first investigate\n", "the contents of the device configuration." ] }, { "cell_type": "code", "execution_count": 9, "id": "d360fbe3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[SimpleNodeConfig(name='circuit_to_device', compilation_func=)]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "device_cfg.compilation_passes\n" ] }, { "cell_type": "markdown", "id": "89eaab38", "metadata": {}, "source": [ "The compilation passes of the device configuration specifies which function(s) will be used to \n", "compile the {class}`~.Schedule` to the {ref}`sec-user-guide-quantum-device`. In other words, \n", "it specifies how to interpret the qubit parameters present in the device configuration and achieve\n", "the required gates. Let us briefly investigate the compilation function:" ] }, { "cell_type": "code", "execution_count": 10, "id": "f83888ca", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on function compile_circuit_to_device_with_config_validation in module quantify_scheduler.backends.circuit_to_device:\n", "\n", "compile_circuit_to_device_with_config_validation(schedule: 'Schedule', config: 'CompilationConfig') -> 'Schedule'\n", " Add pulse information to all gates in the schedule.\n", " \n", " Before calling this function, the schedule can contain abstract operations (gates or\n", " measurements). This function adds pulse and acquisition information with respect to\n", " ``config`` as they are expected to arrive to device (latency or distortion corrections\n", " are not taken into account).\n", " \n", " From a point of view of :ref:`sec-compilation`, this function converts a schedule\n", " defined on a quantum-circuit layer to a schedule defined on a quantum-device layer.\n", " \n", " Parameters\n", " ----------\n", " schedule\n", " The schedule to be compiled.\n", " config\n", " Compilation config for\n", " :class:`~quantify_scheduler.backends.graph_compilation.QuantifyCompiler`, of\n", " which only the :attr:`.CompilationConfig.device_compilation_config`\n", " is used in this compilation step.\n", " \n", " Returns\n", " -------\n", " :\n", " The modified ``schedule`` with pulse information added to all gates, or the unmodified\n", " schedule if circuit to device compilation is not necessary.\n", "\n" ] } ], "source": [ "help(device_cfg.compilation_passes[0].compilation_func)\n" ] }, { "cell_type": "markdown", "id": "917d1e1b", "metadata": {}, "source": [ "The {ref}`device configuration ` also contains the\n", "parameters required by the backend for all qubits and edges." ] }, { "cell_type": "code", "execution_count": 11, "id": "a7c104f7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['q0', 'q1']\n", "['q0_q1']\n", "['q0.01', 'q0.ro', 'q1.01', 'q1.ro']\n" ] } ], "source": [ "print(list(device_cfg.elements))\n", "print(list(device_cfg.edges))\n", "print(list(device_cfg.clocks))\n" ] }, { "cell_type": "markdown", "id": "7d6a0c70", "metadata": {}, "source": [ "For every qubit and edge, we can investigate the contained parameters." ] }, { "cell_type": "code", "execution_count": 12, "id": "a7608bcc", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'reset': OperationCompilationConfig(factory_func=, factory_kwargs={'duration': 0.0002}, gate_info_factory_kwargs=None), 'Rxy': OperationCompilationConfig(factory_func=, factory_kwargs={'amp180': 0.32, 'motzoi': 0.45, 'port': 'q0:mw', 'clock': 'q0.01', 'duration': 2e-08}, gate_info_factory_kwargs=['theta', 'phi']), 'Rz': OperationCompilationConfig(factory_func=, factory_kwargs={'clock': 'q0.01'}, gate_info_factory_kwargs=['theta']), 'H': OperationCompilationConfig(factory_func=, factory_kwargs={'qubit': 'q0'}, gate_info_factory_kwargs=None), 'measure': OperationCompilationConfig(factory_func=, factory_kwargs={'port': 'q0:res', 'clock': 'q0.ro', 'pulse_type': 'SquarePulse', 'pulse_amp': 0.25, 'pulse_duration': 1.6e-07, 'acq_delay': 1.2e-07, 'acq_duration': 3e-07, 'acq_channel': 0, 'acq_rotation': 0, 'acq_threshold': 0, 'freq': None}, gate_info_factory_kwargs=['acq_channel_override', 'acq_index', 'bin_mode', 'acq_protocol'])}\n", "{'amp180': 0.32, 'motzoi': 0.45, 'port': 'q0:mw', 'clock': 'q0.01', 'duration': 2e-08}\n" ] } ], "source": [ "print(device_cfg.elements[\"q0\"])\n", "print(device_cfg.elements[\"q0\"][\"Rxy\"].factory_kwargs)\n" ] }, { "cell_type": "code", "execution_count": 13, "id": "da8e7502", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'q0_q1': {'CZ': OperationCompilationConfig(factory_func=, factory_kwargs={'square_port': 'q0:fl', 'square_clock': 'cl0.baseband', 'square_amp': 0.5, 'square_duration': 2e-08, 'virt_z_parent_qubit_phase': 44, 'virt_z_parent_qubit_clock': 'q0.01', 'virt_z_child_qubit_phase': 63, 'virt_z_child_qubit_clock': 'q1.01'}, gate_info_factory_kwargs=None)}}\n" ] } ], "source": [ "print(device_cfg.edges)\n" ] }, { "cell_type": "code", "execution_count": 14, "id": "5e6986da", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'q0.01': 6020000000.0, 'q0.ro': 7040000000.0, 'q1.01': 5020000000.0, 'q1.ro': 6900000000.0}\n" ] } ], "source": [ "print(device_cfg.clocks)\n", "\n" ] }, { "cell_type": "markdown", "id": "7e5feee0", "metadata": {}, "source": [ "Lastly, the complete example device configuration (also see {class}`~quantify_scheduler.backends.graph_compilation.DeviceCompilationConfig`):" ] }, { "cell_type": "code", "execution_count": 15, "id": "a055ae2b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'clocks': {'q0.01': 6020000000.0,\n", " 'q0.ro': 7040000000.0,\n", " 'q1.01': 5020000000.0,\n", " 'q1.ro': 6900000000.0},\n", " 'compilation_passes': [{'compilation_func': 'quantify_scheduler.backends.circuit_to_device.compile_circuit_to_device_with_config_validation',\n", " 'name': 'circuit_to_device'}],\n", " 'edges': {'q0_q1': {'CZ': {'factory_func': 'quantify_scheduler.operations.pulse_factories.composite_square_pulse',\n", " 'factory_kwargs': {'square_amp': 0.5,\n", " 'square_clock': 'cl0.baseband',\n", " 'square_duration': 2e-08,\n", " 'square_port': 'q0:fl',\n", " 'virt_z_child_qubit_clock': 'q1.01',\n", " 'virt_z_child_qubit_phase': 63,\n", " 'virt_z_parent_qubit_clock': 'q0.01',\n", " 'virt_z_parent_qubit_phase': 44}}}},\n", " 'elements': {'q0': {'H': {'factory_func': 'quantify_scheduler.operations.composite_factories.hadamard_as_y90z',\n", " 'factory_kwargs': {'qubit': 'q0'}},\n", " 'Rxy': {'factory_func': 'quantify_scheduler.operations.pulse_factories.rxy_drag_pulse',\n", " 'factory_kwargs': {'amp180': 0.32,\n", " 'clock': 'q0.01',\n", " 'duration': 2e-08,\n", " 'motzoi': 0.45,\n", " 'port': 'q0:mw'},\n", " 'gate_info_factory_kwargs': ['theta', 'phi']},\n", " 'Rz': {'factory_func': 'quantify_scheduler.operations.pulse_factories.phase_shift',\n", " 'factory_kwargs': {'clock': 'q0.01'},\n", " 'gate_info_factory_kwargs': ['theta']},\n", " 'measure': {'factory_func': 'quantify_scheduler.operations.measurement_factories.dispersive_measurement_transmon',\n", " 'factory_kwargs': {'acq_channel': 0,\n", " 'acq_delay': 1.2e-07,\n", " 'acq_duration': 3e-07,\n", " 'acq_rotation': 0,\n", " 'acq_threshold': 0,\n", " 'clock': 'q0.ro',\n", " 'freq': None,\n", " 'port': 'q0:res',\n", " 'pulse_amp': 0.25,\n", " 'pulse_duration': 1.6e-07,\n", " 'pulse_type': 'SquarePulse'},\n", " 'gate_info_factory_kwargs': ['acq_channel_override',\n", " 'acq_index',\n", " 'bin_mode',\n", " 'acq_protocol']},\n", " 'reset': {'factory_func': 'quantify_scheduler.operations.pulse_library.IdlePulse',\n", " 'factory_kwargs': {'duration': 0.0002}}},\n", " 'q1': {'Rxy': {'factory_func': 'quantify_scheduler.operations.pulse_factories.rxy_drag_pulse',\n", " 'factory_kwargs': {'amp180': 0.4,\n", " 'clock': 'q1.01',\n", " 'duration': 2e-08,\n", " 'motzoi': 0.25,\n", " 'port': 'q1:mw'},\n", " 'gate_info_factory_kwargs': ['theta', 'phi']},\n", " 'Rz': {'factory_func': 'quantify_scheduler.operations.pulse_factories.phase_shift',\n", " 'factory_kwargs': {'clock': 'q1.01'},\n", " 'gate_info_factory_kwargs': ['theta']},\n", " 'measure': {'factory_func': 'quantify_scheduler.operations.measurement_factories.dispersive_measurement_transmon',\n", " 'factory_kwargs': {'acq_channel': 1,\n", " 'acq_delay': 1.2e-07,\n", " 'acq_duration': 3e-07,\n", " 'acq_rotation': 0,\n", " 'acq_threshold': 0,\n", " 'clock': 'q1.ro',\n", " 'freq': None,\n", " 'port': 'q1:res',\n", " 'pulse_amp': 0.21,\n", " 'pulse_duration': 1.6e-07,\n", " 'pulse_type': 'SquarePulse'},\n", " 'gate_info_factory_kwargs': ['acq_channel_override',\n", " 'acq_index',\n", " 'bin_mode',\n", " 'acq_protocol']},\n", " 'reset': {'factory_func': 'quantify_scheduler.operations.pulse_library.IdlePulse',\n", " 'factory_kwargs': {'duration': 0.0002}}}}}\n" ] } ], "source": [ "pprint(example_transmon_cfg)\n" ] }, { "cell_type": "markdown", "id": "b0eb7955", "metadata": {}, "source": [ "## Quantum Devices and Elements\n", "\n", "The {ref}`device configuration` contains all knowledge\n", "of the physical device under test (DUT).\n", "To generate these device configurations on the fly, `quantify-scheduler` provides the\n", "{class}`~quantify_scheduler.device_under_test.quantum_device.QuantumDevice` and\n", "{class}`~quantify_scheduler.device_under_test.device_element.DeviceElement` classes.\n", "\n", "These classes contain the information necessary to generate the device configs and allow\n", "changing their parameters on-the-fly.\n", "The {class}`~quantify_scheduler.device_under_test.quantum_device.QuantumDevice` class\n", "represents the DUT containing different {class}`~quantify_scheduler.device_under_test.device_element.DeviceElement` s.\n", "Currently, `quantify-scheduler` contains the\n", "{class}`~quantify_scheduler.device_under_test.transmon_element.BasicTransmonElement` class\n", "to represent a fixed-frequency transmon qubit connected to a feedline. We show their interaction below:" ] }, { "cell_type": "code", "execution_count": 16, "id": "84a757ef", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(, ['qubit'])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from quantify_scheduler import BasicTransmonElement, QuantumDevice\n", "\n", "# First create a device under test\n", "dut = QuantumDevice(\"DUT\")\n", "\n", "# Then create a transmon element\n", "qubit = BasicTransmonElement(\"qubit\")\n", "\n", "# Finally, add the transmon element to the QuantumDevice\n", "dut.add_element(qubit)\n", "dut, dut.elements()\n" ] }, { "cell_type": "markdown", "id": "e405f8d3", "metadata": {}, "source": [ "The different transmon properties can be set through attributes of the {class}`~quantify_scheduler.device_under_test.transmon_element.BasicTransmonElement` class instance, e.g.:" ] }, { "cell_type": "code", "execution_count": 17, "id": "8444eddd", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['reset', 'rxy', 'measure', 'pulse_compensation', 'ports', 'clock_freqs']\n", "\n", "qubit.reset: ['duration']\n", "qubit.rxy: ['amp180', 'motzoi', 'duration']\n", "qubit.measure: ['pulse_type', 'pulse_amp', 'pulse_duration', 'acq_channel', 'acq_delay', 'integration_time', 'reset_clock_phase', 'acq_weights_a', 'acq_weights_b', 'acq_weights_sampling_rate', 'acq_weight_type', 'acq_rotation', 'acq_threshold', 'num_points']\n", "qubit.pulse_compensation: ['max_compensation_amp', 'time_grid', 'sampling_rate']\n", "qubit.ports: ['microwave', 'flux', 'readout']\n", "qubit.clock_freqs: ['f01', 'f12', 'readout']\n" ] } ], "source": [ "qubit.clock_freqs.f01(6e9)\n", "\n", "print(list(qubit.submodules.keys()))\n", "print()\n", "for submodule_name, submodule in qubit.submodules.items():\n", " print(f\"{qubit.name}.{submodule_name}: {list(submodule.parameters.keys())}\")\n" ] }, { "cell_type": "markdown", "id": "f587ae5e", "metadata": {}, "source": [ "The device configuration is now simply obtained using {code}`dut.generate_device_config()`.\n", "In order for this command to provide a correct device configuration, the different properties need to be set to applicable values in the {class}`~quantify_scheduler.device_under_test.transmon_element.BasicTransmonElement` and {class}`~quantify_scheduler.device_under_test.quantum_device.QuantumDevice` objects." ] }, { "cell_type": "code", "execution_count": 18, "id": "d168929e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "DeviceCompilationConfig(clocks={'qubit.01': 6000000000.0, 'qubit.12': nan, 'qubit.ro': nan}, elements={'qubit': {'reset': OperationCompilationConfig(factory_func=, factory_kwargs={'duration': 0.0002}, gate_info_factory_kwargs=None), 'Rxy': OperationCompilationConfig(factory_func=, factory_kwargs={'amp180': nan, 'motzoi': 0, 'port': 'qubit:mw', 'clock': 'qubit.01', 'duration': 2e-08, 'reference_magnitude': None}, gate_info_factory_kwargs=['theta', 'phi']), 'Rz': OperationCompilationConfig(factory_func=, factory_kwargs={'clock': 'qubit.01'}, gate_info_factory_kwargs=['theta']), 'H': OperationCompilationConfig(factory_func=, factory_kwargs={'qubit': 'qubit'}, gate_info_factory_kwargs=None), 'pulse_compensation': OperationCompilationConfig(factory_func=None, factory_kwargs={'port': 'qubit:mw', 'clock': 'qubit.01', 'max_compensation_amp': nan, 'time_grid': nan, 'sampling_rate': nan}, gate_info_factory_kwargs=None), 'measure': OperationCompilationConfig(factory_func=, factory_kwargs={'port': 'qubit:res', 'clock': 'qubit.ro', 'pulse_type': 'SquarePulse', 'pulse_amp': 0.25, 'pulse_duration': 3e-07, 'acq_delay': 0, 'acq_duration': 1e-06, 'acq_channel': 0, 'acq_protocol_default': 'SSBIntegrationComplex', 'reset_clock_phase': True, 'reference_magnitude': None, 'acq_weights_a': array([], dtype=float64), 'acq_weights_b': array([], dtype=float64), 'acq_weights_sampling_rate': 1000000000.0, 'acq_rotation': 0, 'acq_threshold': 0, 'num_points': 1, 'freq': None}, gate_info_factory_kwargs=['acq_channel_override', 'acq_index', 'bin_mode', 'acq_protocol', 'feedback_trigger_label'])}}, edges={}, scheduling_strategy='asap', compilation_passes=[SimpleNodeConfig(name='circuit_to_device', compilation_func=), SimpleNodeConfig(name='set_pulse_and_acquisition_clock', compilation_func=), SimpleNodeConfig(name='process_compensation_pulses', compilation_func=), SimpleNodeConfig(name='determine_absolute_timing', compilation_func=)])\n" ] } ], "source": [ "pprint(dut.generate_device_config())\n" ] }, { "cell_type": "markdown", "id": "9aaccdee", "metadata": {}, "source": [ "## Specifying pulse magnitudes\n", "\n", "```{warning}\n", "Please note that currently only the user interface of the reference magnitude is defined. The physical magnitude scaling has not yet been implemented in any hardware backend. Therefore, changing the reference magnitude parameter will not have any physical effect in the current version of `quantify-scheduler`.\n", "```\n", "\n", "In the course of a quantum experiment, we may use a variety of electronic pulses of varying amplitudes or powers. The size of the pulses can potentially vary across many orders of magnitude. Additionally, there are many ways in which we might express the magnitude of said pulses (such as amplitude in volts, current in amps or power in dBm), which we may use in different contexts. When generating arbitrary waveforms, it is typical to use a DAC with limited dynamic range, so only a limited range of pulse amplitudes may be generated electronically. Therefore, devices such as variable attenuators or amplifiers are often used to produce pulses over many different orders of magnitude. In quantify, we provide the functionality to express the absolute magnitude of pulses in a range of different units, as well as to define the amplitude of any signal produced by an arbitrary waveform generator.\n", "\n", "In the definition of any pulse operation in `quantify-scheduler`, there will typically be two parameters related to the magnitude of the pulse: the `amplitude` and the `reference_magnitude`. The `amplitude` is a unitless parameter which expresses the amplitude of the signal produced by the DAC of the signal generator, relative to the maximum output level of the DAC. The `amplitude` can vary from -1 to 1, where 1 is the maximum output level. Since `amplitude` is a relative scale, it does not express the absolute power level of the signal that reaches the device. This will be affected by a number of different variables, including any attenuation or gain that is applied to the signal after it produced by the DAC. In order to specify the magnitude of the signal in absolute terms, we have the `reference_magnitude` parameter. This provides a reference scale for the absolute magnitude of the signal when it reaches the device port in question. The reference magnitude can be specified in a number of different units: Volts, current in Amperes or power in dBm or W, depending on the physical implementation of the control pulse. The scaling is defined such that the power/amplitude of a pulse with amplitude 1 will have a value equal to the `reference_magnitude` when it reaches the port. How exactly this scaling is implemented physically will depend on the hardware backend. For example, it may be that a variable attenuation is applied to the pulse in order to scale its power to the right level. Or the gain of an amplifier will be varied. Whenever a quantify schedule is compiled, the quantify compilation backend will automatically compile all instructions necessary for all hardware instruments required to scale the pulse magnitude to the correct level.\n", "\n", "The reference magnitude and amplitude of a pulse can both be configured via QCoDeS parameters in the device element. The pulse amplitude can be configured via a standard QCoDeS parameter, for example `qubit.rxy.amp180` can be used to set the pi-pulse amplitude of an RXY operation of a transmon qubit (between -1 and 1). The reference magnitude is configured slightly differently. Because of the need to express the reference magnitude in a variety of different units in different contexts, the reference magnitude is configured via a custom QCoDeS submodule within the device element - of class {class}`~quantify_scheduler.device_under_test.transmon_element.ReferenceMagnitude`. For example, we may have the submodule `qubit.rxy.reference_magnitude`, which is used to scale the amplitudes of the aforementioned RXY pulses. The {class}`~quantify_scheduler.device_under_test.transmon_element.ReferenceMagnitude` submodule contains three parameters, one for each of the possible units which the reference magnitude may be expressed in: Volts, dBm and Amperes. Only one of these unit parameters may have a defined numerical value at any given time. That is, if `reference_magnitude.dBm` is set to a particular value, both of the other parameters will automatically be set to `nan`. This allows the reference magnitude to be uniquely defined with respect to a particular unit. The defined unit and value of reference magnitude can be inquired via the `get_val_unit` method of the submodule, which returns both the numerical value and the unit in a tuple. If all of the reference magnitude parameters are `nan`, then no reference magnitude is defined and no extra scaling will be applied to the pulse.\n", "\n", "## Mixing pulse and circuit layer operations (Chevron)\n", "\n", "As well as defining our schedules in terms of gates, we can also mix the circuit layer\n", "representation with pulse-level operations.\n", "This can be useful for experiments involving pulses not easily represented by Gates,\n", "such as the Chevron experiment.\n", "In this experiment, we want to vary the length and amplitude of a square pulse between\n", "X gates on a pair of qubits." ] }, { "cell_type": "code", "execution_count": 19, "id": "c3ed4fb4", "metadata": {}, "outputs": [], "source": [ "from quantify_scheduler import ClockResource, Schedule\n", "from quantify_scheduler.operations import Measure, Reset, SquarePulse, X, X90\n", "\n", "sched = Schedule(\"Chevron Experiment\")\n", "acq_idx = 0\n", "\n", "for duration in np.linspace(start=20e-9, stop=60e-9, num=6):\n", " for amp in np.linspace(start=0.1, stop=1.0, num=10):\n", " reset = sched.add(Reset(\"q0\", \"q1\"))\n", " sched.add(X(\"q0\"), ref_op=reset, ref_pt=\"end\") # Start at the end of the reset\n", " # We specify a clock for tutorial purposes, Chevron experiments do not necessarily use modulated square pulses\n", " square = sched.add(SquarePulse(amp=amp, duration=duration, port=\"q0:mw\", clock=\"q0.01\"))\n", " sched.add(X90(\"q0\"), ref_op=square) # Start at the end of the square pulse\n", " sched.add(X90(\"q1\"), ref_op=square)\n", " sched.add(Measure(q0, acq_index=acq_idx), label=f\"M q0 {acq_idx}\")\n", " sched.add(\n", " Measure(q1, acq_index=acq_idx),\n", " label=f\"M q1 {acq_idx}\",\n", " ref_pt=\"start\", # Start at the same time as the other measure\n", " )\n", "\n", " acq_idx += 1\n", "\n", "\n", "# Specify the frequencies for the clocks; this can also be done via the DeviceElement (BasicTransmonElement) instead\n", "sched.add_resources([ClockResource(\"q0.01\", 6.02e9), ClockResource(\"q1.01\", 6.02e9), ClockResource(\"q0.ro\", 5.02e9), ClockResource(\"q1.ro\", 5.02e9)]) " ] }, { "cell_type": "code", "execution_count": 20, "id": "188d9f89", "metadata": {}, "outputs": [ { "data": { "image/png": "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REqC4pADAnIlxlp7VSCOEw6UwESkJFiwYEHWMJ1er7dAzQiKI+UAESkJikMOUHMyEZESaM6cOVln3Vq0aKHhf0VESpDikANUxIiIlDA7d+5kzZo1WfP9+/cPYTQiIlKUiksOUJ8YEZESZsGCBVnPo6Ki6N69+1m2FhGR4qS45AAVMSIiJUzbtm2pWrUqAF26dCmW93YREZHcFZccoOZkIiIlTKtWrVi2bBnr1q2jcePGoQ5HRESKUHHJASpiRERKoMjISFq2bBnqMEREJASKQw5QczIREREREXEVFTEiIiIiIuIqKmJERERERMRVVMSIiIiIiIirGGttqGPITVgGJSIiIiIiQWXyspGuxIiIiIiIiKuoiBEREREREVdRESMiIiIiIq6iIkZERERERFxFRYyIiIiIiLiKihgREREREXEVFTEiIiIiIuIqKmJERERERMRVVMSIiIiIiIirqIgRERERERFXUREjIiIiIiKuoiJGRERERERcRUWMiIiIiIi4iooYERERERFxFRUxIiIiIiLiKipiREqg2NhYJk2aFOowREQkBJQDpDhQESMlzr59+xg2bBh169aldOnSXHDBBXTv3p0VK1aEOrQ8ue222zDGYIwhOjqahg0b8sQTT3Dy5MlQhyYiEvaUA0SKh6hQByBS1Pr3709GRgZvv/029evXJyUlhcWLF7N///6QxpWRkUF0dHSetu3RowfTp08nPT2dTz75hLvvvptSpUoxZsyYIEcpIuJuygEixYOuxEiJcujQIZYvX86ECRO4+uqrqVevHu3atWPMmDH07dsXgM2bN9OpUyfKlClD06ZNWbhwIcYY5s2bB0BSUhLGGA4dOpR13O+//x5jDNu2bQNg//793HzzzdSuXZty5crRokUL3n//fb9YrrrqKkaMGMHIkSOpVq0a3bt3B2Dt2rX07NmTmJgYatSowa233kpqaqrfvplnD+vVq8ewYcPo1q0biYmJWccdOXKk3/YJCQncdtttuX4m1lrGjx+fdVayVq1a3HvvvVnr09PTeeCBB6hduzbly5enffv2JCUl5eNTFxEJD8oBp1MOELdSESMlSkxMDDExMcybN4/09PTT1nu9Xvr160d0dDSrVq3itdde4+GHH8736xw/fpzWrVszf/581q5dy1133cWtt97KV1995bfd22+/TXR0NCtWrOC1117j0KFD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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = sched.plot_circuit_diagram()\n", "ax.set_xlim(-0.5, 9.5)\n", "for t in ax.texts:\n", " if t.get_position()[0] > 9.5:\n", " t.set_visible(False)\n" ] }, { "cell_type": "markdown", "id": "50e64aa0", "metadata": {}, "source": [ "This example shows that we add gates using the same interface as pulses. Gates are Operations, and\n", "as such support the same timing and reference operators as Pulses.\n", "\n", "\n", "## Device and Hardware compilation combined: Serial Compiler\n", "\n", "{class}`~quantify_scheduler.backends.graph_compilation.SerialCompiler` can be used to execute the device and hardware compilation separately, or execute both in one call. Here we will not set the hardware configuration thus only executing device compilation. The {ref}`Compiling to Hardware ` tutorial demonstrates how to set the hardware configuration.\n", "\n", "{class}`~quantify_scheduler.backends.graph_compilation.SerialCompiler` requires a {class}`~quantify_scheduler.backends.graph_compilation.CompilationConfig` and this holds both the device and hardware configurations (when set). In the example below, we generate a {class}`~quantify_scheduler.backends.graph_compilation.CompilationConfig` via {meth}`~quantify_scheduler.device_under_test.quantum_device.QuantumDevice.generate_compilation_config` of {class}`~quantify_scheduler.device_under_test.quantum_device.QuantumDevice`." ] }, { "cell_type": "code", "execution_count": 21, "id": "22e0dadd", "metadata": {}, "outputs": [], "source": [ "from quantify_scheduler import BasicTransmonElement, QuantumDevice, SerialCompiler\n", "\n", "dut.close()\n", "dut = QuantumDevice(\"DUT\")\n", "q0_dev = BasicTransmonElement(\"q0\")\n", "q1_dev = BasicTransmonElement(\"q1\")\n", "dut.add_element(q0_dev)\n", "dut.add_element(q1_dev)\n", "dut.get_element(\"q0\").rxy.amp180(0.65)\n", "dut.get_element(\"q1\").rxy.amp180(0.55)\n", "dut.get_element(\"q0\").measure.pulse_amp(0.28)\n", "dut.get_element(\"q1\").measure.pulse_amp(0.22)\n", "\n", "compiler = SerialCompiler(name='compiler')\n", "compiled_sched = compiler.compile(schedule=sched, config=dut.generate_compilation_config())" ] }, { "cell_type": "markdown", "id": "449d59eb", "metadata": {}, "source": [ "So, finally, we can show the timing table associated with the Chevron schedule and plot\n", "its pulse diagram:" ] }, { "cell_type": "code", "execution_count": 22, "id": "a7fcdf96", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 portclockabs_timedurationis_acquisitionoperationwf_idxoperation_hash
0Nonecl0.baseband0.0 ns200,000.0 nsFalseReset('q0','q1')0-4165314597228969501
1Nonecl0.baseband0.0 ns200,000.0 nsFalseReset('q0','q1')1-4165314597228969501
2q0:mwq0.01200,000.0 ns20.0 nsFalseX(qubit='q0')0-5401617599067295002
3q0:mwq0.01200,020.0 ns20.0 nsFalseSquarePulse(amp=0.1,duration=2e-08,port='q0:mw',clock='q0.01',reference_magnitude=None,t0=0)0675530864692045373
4q0:mwq0.01200,040.0 ns20.0 nsFalseX90(qubit='q0')07829212948617661091
5q1:mwq1.01200,040.0 ns20.0 nsFalseX90(qubit='q1')0-3395605342369720120
\n" ], "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "compiled_sched.timing_table.hide(slice(11, None), axis=\"index\").hide(\n", " \"waveform_op_id\", axis=\"columns\"\n", ")\n" ] }, { "cell_type": "code", "execution_count": 23, "id": "483e7be9", "metadata": {}, "outputs": [ { "data": { "image/png": "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doiIyESv18NgMFR/oQ0KCwvRp08fvPXWW3a9ryti2HERt041L2I3FhFRvRQfH4+pU6di6tSpCAgIQEhICF555RWY77t948YNJCYmokmTJvD29sbgwYNx9uxZ+fzatWsRGBiIjRs3IjY2Fh4eHpgwYQLWrVuH77//HpIkQZKkSldFLiwsRGJiInx9fREREYFFixYhPj4e06dPl68ZO3Ys5syZg4SEBKufzdSuH374ATExMfD29sbDDz+MoqIirFu3Di1btkSTJk3w7LPPQq83/kf7+++/j06dOsn32LBhAyRJwsqVK+VjCQkJePnll61uh62cHnYuXryIxx57DMHBwfDy8kLnzp1x4MAB+bwQAnPmzEFERAS8vLyQkJBg8QsBANevX8eYMWPg7++PwMBATJw4EQUFBY5+lFoxVXIkyfi6WMvKDhGRBSEATaFzvsyCijXWrVsHNzc37Nu3D++99x7effddrFq1Sj4/fvx4HDhwABs3bkRqaiqEELj//vuh1Wrla4qKivDWW29h1apVOHnyJJYuXYpHHnkEgwYNwuXLl3H58mXcddddFX7+zJkzkZKSgu+//x7btm1DcnIyDh06ZPO3fPz48YiPj7c4VlRUhKVLl+Lrr7/Gli1bkJycjL///e/YtGkTNm3ahM8++wwffvgh/vOf/wAA+vbti1OnTuHKlSsAgJSUFISEhMhBTavVIjU1tdzn2JNT98a6ceMG7r77btx3333YvHkzmjZtirNnz6JJkybyNQsXLsTSpUuxbt06tGrVCq+88goGDhyIU6dOyVu9jxkzBpcvX8b27duh1Wrx+OOPY9KkSfjyyy+d9Wg2M1V2/D3dkVesRTG7sYiILGmLgPmRzvnsly4BKh+rL4+KisLixYshSRJiYmJw/PhxLF68GElJSTh79iw2btyIX3/9VQ4rX3zxBaKiorBhwwaMHDkSgDEErFixAl27dpXv6+XlBbVajfDw8Eo/u6CgAKtXr8bnn3+O/v37AzCGr+bNm9v82BEREeW6z7RaLT744AO0adMGAPDwww/js88+Q3Z2Nnx9fREbG4v77rsPu3btwqOPPopOnTohKCgIKSkpePjhh5GcnIznn38e7733HgBg37590Gq1lQY3e3BqZeett95CVFQU1qxZgzvvvBOtWrXCgAED5G+gEAJLlizByy+/jGHDhqFLly749NNP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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f, ax = compiled_sched.plot_pulse_diagram(x_range=(200e-6, 200.4e-6))" ] }, { "cell_type": "markdown", "id": "4855db27", "metadata": {}, "source": [ "## Overriding device parameters on circuit-level operations\n", "\n", "The Quantify compiler has an additional feature which adds more low-level control for users how\n", "a circuit-level operation is compiled to device-level. It is possible to **override** the parameters of\n", "the `DeviceElement` using the `device_overrides` keyword argument in each circuit-level operation.\n", "\n", "For example, to override the parameters of the `X` operation\n", "\n", "```{code-block} ipython\n", "X(\"q0\", motzoi=0.5, duration=2e-6)\n", "```\n", "\n", "Let's create, compile and show it on an actual schedule." ] }, { "cell_type": "code", "execution_count": 24, "id": "7bd0b7cf", "metadata": {}, "outputs": [], "source": [ "sched = Schedule(\"Rabi\")\n", "\n", "amps = np.linspace(start=0.1, stop=1.0, num=10)\n", "durations = np.linspace(start=1e-6, stop=1e-4, num=10)\n", "\n", "for i, (amp, duration) in enumerate(zip(amps, durations)):\n", " sched.add(Reset(\"q0\"))\n", " sched.add(X(\"q0\", duration=duration, motzoi=0.5/amp))\n", " sched.add(Measure(\"q0\", acq_index=i))\n", "\n", "sched.add_resources([ClockResource(\"q0.01\", 6.02e9), ClockResource(\"q0.ro\", 5.02e9)]) \n", "\n", "compiler = SerialCompiler(name='compiler')\n", "compiled_sched = compiler.compile(schedule=sched, config=dut.generate_compilation_config())" ] }, { "cell_type": "code", "execution_count": 25, "id": "a7628a89", "metadata": {}, "outputs": [ { "data": { "image/png": "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HfLz8/Gf//wHubm5WLJkCVJTU7s58rPX0WP/17/+hUceeQQLFizAwYMHsWzZMnz00Uf43//9326OXD61tbUYOXIk3nzzTaVDkUVHj++7777D7373O6xfvx67d+/GJZdcgquvvhp79uyROdKu1dn/r1VVVcjOzsZll10mU2Ty6sxxX3/99di4cSOWLVuG3NxcfPjhh0hPT5cxyrMg0lkZN26cOHv2bOm2w+EQU1JSxIULF7br9+12uxgeHi6uXLlSrhBl0Znjttvt4oUXXiguXbpUvPXWW8Vp06Z1Q6Rdq6PH/fbbb4v9+/cXbTZbd4Uom44e++zZs8VLL73U57558+aJEyZMkDVOpQAQP/nkE6XDkE1nj2/YsGHiU0891fUBdZOOHPcNN9wgPvbYY+KCBQvEkSNHyhqX3Npz3F988YUYGRkplpeXd09QZ4kVnrNgs9mwe/duZGVlSfdpNBpkZWVh+/bt7XqOuro6NDQ0ICYmRq4wu1xnj/vpp59GQkIC7rjjju4Is8t15rjXrVuH8ePHY/bs2UhMTMS5556L5557Dg6Ho7vC7hKdOfYLL7wQu3fvloa9jh49ivXr12Pq1KndEjMpz+l0wmw296j3t8567733cPToUSxYsEDpULrNunXrMHbsWLz44otITU3F4MGD8eCDD6K+vl7p0FrE5qFnoaysDA6HA4mJiT73JyYm4rfffmvXczz88MNISUnxuZD4u84c97Zt27Bs2TLs3bu3GyKUR2eO++jRo/j2229x8803Y/369Thy5AjuvfdeNDQ09Kg3xs4c+0033YSysjJMnDgRoijCbrfjT3/6U0ANaVHbXn75ZdTU1OD6669XOhRZHT58GI888gi2bt0KnU49l9WjR49i27ZtCAoKwieffIKysjLce++9KC8vx3vvvad0eM2wwqOg559/HqtXr8Ynn3yCoKAgpcORjdlsxowZM7BkyRLExcUpHU63cjqdSEhIwLvvvosxY8bghhtuwKOPPop33nlH6dBkt3nzZjz33HN46623kJOTgzVr1uDzzz/H3/72N6VDo27wr3/9C0899RQ+/vhjJCQkKB2ObBwOB2666SY89dRTGDx4sNLhdCun0wlBELBq1SqMGzcOU6dOxauvvoqVK1f6ZZVHPamoDOLi4qDValFSUuJzf0lJCZKSktr83ZdffhnPP/88vvnmG4wY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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f, ax = compiled_sched.plot_pulse_diagram(x_range=(000e-6, 1800.4e-6), port_list=[\"q0:mw\"])" ] }, { "cell_type": "markdown", "id": "4f8ca4c0", "metadata": {}, "source": [ "As you can see, the amplitude of the pulse (which was compiled from the `X` gate) changes.\n", "\n", "```{important}\n", "A few device element parameter names do not correspond to the `device_overrides` key names. The `integration_time` of device elements can be overriden with the `\"acq_duration\"` key. These discrepancies are rare; in all cases the device element's `factory_kwargs` must be used in the already generated compilation config.\n", "```" ] } ], "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" }, "mystnb": { "execution_timeout": 120 }, "source_map": [ 8, 38, 47, 53, 60, 73, 81, 106, 129, 144, 153, 162, 167, 171, 175, 188, 195, 200, 203, 210, 213, 218, 223, 227, 233, 238, 242, 246, 249, 267, 280, 284, 292, 297, 300, 323, 352, 359, 371, 387, 392, 399, 401, 417, 434, 436 ] }, "nbformat": 4, "nbformat_minor": 5 }