{ "cells": [ { "cell_type": "markdown", "id": "2dc74e4a", "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": "a0269925", "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": "bc28130a", "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": "f7eb9a16", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'acquisition_info': [],\n", " 'gate_info': {'device_elements': ['q0'],\n", " 'device_overrides': {},\n", " 'operation_type': 'Rxy',\n", " 'phi': 0.0,\n", " 'plot_func': 'quantify_scheduler.schedules._visualization.circuit_diagram.gate_box',\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": "aebda34e", "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": "22f15f02", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'device_elements': {'description': 'A list of strings indicating the '\n", " 'device_elements the gate acts on. Valid '\n", " 'device_elements are strings that appear '\n", " 'in the device_config.json file.',\n", " 'type': 'array'},\n", " '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': 'Deprecated. A list of strings indicating the '\n", " 'qubits the gate acts on. Valid qubits are strings '\n", " 'that appear in the device_config.json file.',\n", " 'type': 'array'},\n", " 'symmetric': {'description': 'A boolean to indicate whether a two device '\n", " 'elements is symmetric. This is used in the '\n", " 'device config compilation stage. By default, it '\n", " 'is set as 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": "b622d7fa", "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": "fc7e8955", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Schedule \"Bell experiment\" containing (26) 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 theta in 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), label=\"M q0 {:.2f} deg\".format(theta))\n", " sched.add( \n", " Measure(q1),\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": "9996e701", "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. 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": "63c37521", "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": "f23d1298", "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": "acfb8001", "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:420\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 416\u001b[0m \u001b[38;5;66;03m# NB imported here to avoid circular import\u001b[39;00m\n\u001b[1;32m 418\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 sample_schedule\n\u001b[0;32m--> 420\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 421\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 422\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 423\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 424\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 425\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 426\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 427\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 428\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 430\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 431\u001b[0m \u001b[38;5;66;03m# NB imported here to avoid circular import\u001b[39;00m\n\u001b[1;32m 433\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 434\u001b[0m pulse_diagram_matplotlib,\n\u001b[1;32m 435\u001b[0m )\n", "File \u001b[0;32m/usr/local/lib/python3.9/site-packages/quantify_scheduler/schedules/_visualization/pulse_diagram.py:457\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 454\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 455\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--> 457\u001b[0m \u001b[43m_extract_schedule_infos\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 458\u001b[0m \u001b[43m \u001b[49m\u001b[43mschedule\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 459\u001b[0m \u001b[43m \u001b[49m\u001b[43mport_list\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 460\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 461\u001b[0m \u001b[43m \u001b[49m\u001b[43moffset_infos\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 462\u001b[0m \u001b[43m \u001b[49m\u001b[43mpulse_infos\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 463\u001b[0m \u001b[43m \u001b[49m\u001b[43macq_infos\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 x_min, x_max \u001b[38;5;241m=\u001b[39m x_range\n\u001b[1;32m 468\u001b[0m sampled_pulses \u001b[38;5;241m=\u001b[39m get_sampled_pulses_from_voltage_offsets(\n\u001b[1;32m 469\u001b[0m schedule\u001b[38;5;241m=\u001b[39mschedule,\n\u001b[1;32m 470\u001b[0m offset_infos\u001b[38;5;241m=\u001b[39moffset_infos,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 474\u001b[0m modulation_if\u001b[38;5;241m=\u001b[39mmodulation_if,\n\u001b[1;32m 475\u001b[0m )\n", "File \u001b[0;32m/usr/local/lib/python3.9/site-packages/quantify_scheduler/schedules/_visualization/pulse_diagram.py:354\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 352\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 353\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--> 354\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 355\u001b[0m _extract_schedule_infos(\n\u001b[1;32m 356\u001b[0m inner_operation,\n\u001b[1;32m 357\u001b[0m port_list,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 361\u001b[0m acq_infos,\n\u001b[1;32m 362\u001b[0m )\n\u001b[1;32m 363\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": "aa1e7f23", "metadata": {}, "source": [ "And similarly for the {code}`timing_table`:" ] }, { "cell_type": "code", "execution_count": 7, "id": "a3e0176f", "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:609\u001b[0m, in \u001b[0;36mScheduleBase.timing_table\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 515\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 516\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 517\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 606\u001b[0m \n\u001b[1;32m 607\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m \u001b[38;5;66;03m# noqa: E501\u001b[39;00m\n\u001b[1;32m 608\u001b[0m timing_table_list \u001b[38;5;241m=\u001b[39m []\n\u001b[0;32m--> 609\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 610\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 611\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:470\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 467\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 468\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 469\u001b[0m \u001b[38;5;66;03m# when this exception is encountered\u001b[39;00m\n\u001b[0;32m--> 470\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 471\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAbsolute time has not been determined yet. Please compile your schedule.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 472\u001b[0m )\n\u001b[1;32m 473\u001b[0m \u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39m_generate_timing_table_list(\n\u001b[1;32m 474\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 475\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 476\u001b[0m timing_table_list,\n\u001b[1;32m 477\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 478\u001b[0m )\n\u001b[1;32m 479\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": "93e1bdf4", "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": "4abde1a4", "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": "c369cf01", "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": "b662cee1", "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": "8a54fd31", "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": "3041a109", "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": "6e19eadb", "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": "4c05cf17", "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": "aa04c7d5", "metadata": {}, "source": [ "For every qubit and edge, we can investigate the contained parameters." ] }, { "cell_type": "code", "execution_count": 12, "id": "179b64ac", "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', 'coords', '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": "c01b6068", "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": "114be369", "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": "3b29038b", "metadata": {}, "source": [ "Lastly, the complete example device configuration (also see {class}`~quantify_scheduler.backends.graph_compilation.DeviceCompilationConfig`):" ] }, { "cell_type": "code", "execution_count": 15, "id": "a3830149", "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", " 'coords',\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", " 'coords',\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": "c795d472", "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": "d0124548", "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": "ac41a379", "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": "5fe8b910", "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": "33c8c71b", "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": "512669d0", "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', 'coords', 'acq_index', 'bin_mode', 'acq_protocol', 'feedback_trigger_label'])}}, edges={}, scheduling_strategy=, 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=), SimpleNodeConfig(name='normalize_absolute_timing', compilation_func=)])\n" ] } ], "source": [ "pprint(dut.generate_device_config())\n" ] }, { "cell_type": "markdown", "id": "25b7e254", "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": "f9eb1a82", "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", "\n", "for duration in np.linspace(start=20e-9, stop=60e-9, num=6):\n", " for acq_idx, amp in enumerate(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), label=f\"M q0 {acq_idx} {duration}\")\n", " sched.add(\n", " Measure(q1),\n", " label=f\"M q1 {acq_idx} {duration}\",\n", " ref_pt=\"start\", # Start at the same time as the other measure\n", " )\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": "cefd54ce", "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": "1246f475", "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": "be8ef841", "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": "9179de99", "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": "aee24f35", "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-4250724087257208999
1Nonecl0.baseband0.0 ns200,000.0 nsFalseReset('q0','q1')1-4250724087257208999
2q0:mwq0.01200,000.0 ns20.0 nsFalseX(qubit='q0')0-4852933745138923246
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)07634991207135013308
4q0:mwq0.01200,040.0 ns20.0 nsFalseX90(qubit='q0')04932291167086711892
5q1:mwq1.01200,040.0 ns20.0 nsFalseX90(qubit='q1')0-5794020929979894471
\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": "8ac73499", "metadata": {}, "outputs": [ { "data": { "image/png": "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XfH666+LmJgY4e7uLn8WRUVF4t133xUAxJ133inf6759+4QQQhw8eFAEBASI2NhYMXv2bPHOO++IAQMGCEmSxJdffim/1tmzZ0WbNm1Eq1atxIsvvijeeOMN0aVLFxEXFycAiJMnT9b63lVl+d5u3brVpvO/++47ER8fL4KDg+X2f/XVV0IIIU6ePCkAiGXLlsnnjxkzRnh6eorY2Fjx6KOPioULF4p+/frJ57Vt21ZMmTJFLFiwQFxzzTVCrVaLP//8U35+cXGxiIuLE61btxbPPvusWLx4sUhNTRWSJIlJkyZZtQuAGDRokFi4cKFYuHChSE9PFyNHjrT5vaDmwYBELqugoEAAqPYXRl0ACI1GI44fPy4f27dvnwAgFixYIB8bP368CA8PtwoEQghx3333iYCAADlQvPfeewKA1V9EQggRGxsrbr75Zvl3S0Dq37+/MBgM8vH8/Hyh0WjE4MGDhdFolI+/8847AoBYunSpfGzgwIECgPjoo4/kY1qtVoSFhYm777673nuPiooSAGr8mTVrltW5o0ePFt7e3uLo0aPijTfeEADE2rVrrc6xtGfOnDlW7YmPjxchISFyuFu5cqVQqVTip59+snr+4sWLBQDx888/y8cACJVKJf74449q7a8tIE2YMEE+ZjAYRLt27YQkSXIAFUKIS5cuCS8vLzFmzBj5mL3tsuV7Y3mvbP2L3fIeLl682Oq4vW0DIHbt2iUfO336tPD09BR33nmnfMzW77TBYBBardbqnEuXLonQ0FDx0EMPycfOnTtX7TOxGDRokOjZs6coKyuTj5lMJtGvXz/RpUsX+djkyZMFALFjxw75WH5+vggICGjygCSEELfddpuIioqqdry2gARAvPrqq/Ixy/dKkiSxatUq+fiRI0eqvTcvv/yy8PHxEUePHrV6rWeeeUao1WqRk5MjhBBi0qRJwt/f3+q/E+Sa2MVGLquwsBCAucxuj5SUFHTq1En+PS4uDv7+/vjzzz8BAEII/O9//8OwYcMghMD58+flnyFDhqCgoAB79uwBANx1111wc3PD6tWr5esdPHgQhw4dsuqOskhLS4NarZZ//+GHH6DT6TB58mSoVCqr8/z9/auNn/L19bUaQ6TRaNC3b1+57fVJTEzE999/X+1n9OjRVue98847CAgIwD333IMXXngBDz74IIYPH17tem5ubnjk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lpaG4uJivPnmmwDM+0wOHjwYKSkpWLx4MQ4cOICHHnoIgYGBmDBhAgDgl19+wejRozFr1izcfvvt+PTTTzFixAjs2bMHPXr0aM7btebklbyJiKxU3str/vz5wt/f3+qYM7ccWbZsmQgICGiSa1u2aLl06VKTXJ+oIQYOHGi1XU59Xn/9ddGhQwf590WLFolWrVpZ7V06depUERMTI/9+7733ittuu83qOomJieKRRx6p9XXGjBkjhg8fbnVs0qRJVltqffHFF6JHjx7C09NTBAUFiUGDBomioiKb74VdbETkUsLCwuSfgIAASJJkdczX17daF1tycjL+85//YPLkyWjVqhVCQ0PxwQcfoLi4GOPGjYOfnx86d+6MjRs3Wr3WwYMHccstt8DX1xehoaF48MEHcf78ebvbHB0djVdffRUPPfQQ/Pz80L59e7z//vvy4zqdDunp6QgPD4enpyeioqIwa9asBr9HRK6qoKAAQUFB8u9ZWVkYMGAANBqNfGzIkCHIzs7GpUuX5HNSUlKsrjNkyBBkZWU1uB1nz57F6NGj8dBDD+Hw4cPIzMzEXXfdZVflmQGJiFqEFStWIDg4GDt37sR//vMfPPbYYxg5ciT69euHPXv2YPDgwXjwwQdRUlICALh8+TJuvvlm9O7dG7t27cKmTZuQl5eHe++9t0GvP2fOHPTp0we///47Hn/8cTz22GPIzs4GALz99ttYv349Pv/8c2RnZ+OTTz5BdHS0o26dyCUcP34cCxYswCOPPCIfy83NRWhoqNV5lt9zc3PrPMfyeEOcPXsWBoMBd911F6Kjo9GzZ088/vjj8PX1tfkaDEhE1CL06tULzz//PLp06YJp06bB09MTwcHBSEtLQ5cuXTB9+nRcuHAB+/fvBwC888476N27N1599VV069YNvXv3xtKlS7F161YcPXrU7te/9dZb8fjjj6Nz586YOnUqgoODsXXrVgBATk4OunTpgv79+yMqKgr9+/fH6NGjHXr/RI7w6quvwtfXV/756aef8Oijj1ody8nJqfa8f/75B0OHDsXIkSORlpbmhJZb69WrFwYNGoSePXti5MiR+OCDD+SKla0YkIioRYiLi5P/rFar0bp1a/Ts2VM+ZvkXan5+PgBg37592Lp1q9V/+Lt16wYAOHHiRKNe39ItaHmtsWPHYu/evYiJicETTzyB7777zv4bJGoGjz76KPbu3Sv/9OnTBy+99JLVsbZt21o958yZM7jpppvQr18/q65lwNxlnpeXZ3XM8ntYWFid51get5XRaJT/rFar8f3332Pjxo2IjY3FggULEBMTg5MnT9p8PQYkImoR3N3drX6XJMnqmGV2nMlkAgAUFRVh2LBhVv/h37t3L44dO4YBAwY45PUtr3Xttdfi5MmTePnll1FaWop7770X99xzj92vQdTUgoKC0LlzZ/nHy8sLISEhVsfc3ComwP/zzz9ITk5GQkICli1bBpXKOlYkJSXhxx9/hF6vl499//33iImJQatWreRzNm/ebPW877//HklJSXW2tWqo+vPPP61+lyQJN9xwA2bOnInff/8dGo0GX331lc3vBaf5E9FV6dprr8X//vc/REdHW/0Hv6n4+/tj1KhRGDVqFO655x4MHToUFy9etBrQSqQklnAUFRWFN998E+fOnZMfs1R//v3vf2PmzJkYP348pk6dioMHD+Ktt97CvHnz5HMnTZqEgQMHYs6cObjtttuwatUq7Nq1q1o1qqodO3bggw8+wKBBg7BlyxZ8++236NSpE06ePIn8/Hxs3rwZgwcPRkhICHbs2IFz586he/fuNt8fK0hEdFWaOHEiLl68iNGjR+O3337DiRMn8O2332LcuHFWpXpHmDt3Lj777DMcOXIER48exRdffIGwsDAEBgY69HWImtP333+P48ePY/PmzWjXrh3Cw8PlH4uAgAB89913OHnyJBISEvDkk09i+vTp8hpIANCvXz98+umneP/999GrVy+sWbMGa9eurXcNpJtuugn/+9//0L17d3zwwQdYtmwZzp49izfeeAP+/v748ccfceutt6Jr1654/vnnMWfOHNxyyy023x8rSER0VWrbti1+/vlnTJ06FYMHD4ZWq0VUVBSGDh1arZugsfz8/PD666/j2LFjUKvVuO6667BhwwaHvw6Ro2VmZtb6WG0LSFYVFxeHn376qc5zRo4ciZEjR9rVNj8/P6xdu9bq2IMPPij/edOmTXZdrypJ2LMoABHRVWz58uWYPHlyk2wHkpmZiZtuugmXLl1iZYmoHmPHjsXly5erBSRH4j9fiIjsUFBQAF9fX0ydOtVh17zmmmvsKv0TUdNjBYmIyEZXrlyRZ84EBgYiODjYIdc9ffq0PMunY8eO7HojcgEMSERERERV8J8pRERERFUwIBERERFVwYBEREREVAUDEhEREVEVDEhEREREVTAgEREREVXBgERERERUBQMSERERURUMSERERERV/H8a+5oevDTh7gAAAABJRU5ErkJggg==", "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": "3e202765", "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": "1a5555ae", "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 amp, duration in zip(amps, durations):\n", " sched.add(Reset(\"q0\"))\n", " sched.add(X(\"q0\", duration=duration, motzoi=0.5/amp))\n", " sched.add(Measure(\"q0\"))\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": "77c9cc5a", "metadata": {}, "outputs": [ { "data": { "image/png": "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R61WQ6fTAQDsdjsKCwthtVoxdOhQ7N+/v85zTp06FQkJCdL9YcOGYfjw4Vi/fn2LYtTr9bjnnns8tn3++efo27cv+vTpg/z8fOl25ZVXAkCdLsgRI0ZgyJAh0v0uXbpgypQp+P7772Gz2SCKIr744gtMnjwZoih6POf48eNRUlIinWtzr0dthYWF2Lx5M26++WaUlpZKxykoKMD48eNx7NgxaUbl+vXrcdlll2HYsGHS46OionDHHXe04Eq2j/vuu0/6d1hYGJKTkxEYGOgxBi85ORlhYWE4efKktO3zzz/H6NGjER4e7nH9x40bB5vNJnXLhoWFoby8HBs3bmy/kyJqBXbzEXVwb775Jnr37o2SkhKsWLECP/30E/R6fZ39Vq1ahVdffRXp6emorq6Wtru6aNz16tWrzrbevXvjs88+a1GMCQkJUvLicuzYMRw5ckQal1RbXl5ek2KqqKjAhQsXoFKpUFxcjOXLl2P58uUXfc7mXI/ajh8/DlEU8cwzz+CZZ55p8FgJCQk4ffo0hg8fXufnycnJFz2OHAwGQ53fSWhoKDp37lxnjFxoaCiKioqk+8eOHcPBgwcv+jt96KGH8Nlnn2HixIlISEjANddcg5tvvhkTJkxo47MhahtMpog6uGHDhkmz+aZOnYrLL78ct99+OzIyMqTxMR9++CFmzJiBqVOn4rHHHkN0dDTUajUWLVrkMVDdW+obH2S325GSkoLXXnut3sckJiY26xiuAc533nkn7r777nr3cY13au31cB3r73//O8aPH1/vPj179mxW/L5CrVY3a7soitK/7XY7rr76ajz++OP17tu7d28AQHR0NNLS0vD999/ju+++w3fffYf33nsP06dPx6pVq1p5BkRtj8kUkYK4EoKxY8fiP//5D+bNmwcAWLNmDbp3744vv/zSo3VhwYIF9T7PsWPH6mw7evSoNBOsLfTo0QO//fYbrrrqqibNCmwopoCAAKklJDg4GDabDePGjWv0uZp6PRqKq3v37gAArVZ70WMlJSXVG3tGRkajj2sr7VmlvkePHigrK7voNQEAnU6HyZMnY/LkybDb7XjooYfwv//9D88884zfJqLUcXHMFJHCpKamYtiwYVi6dKlUuNPVquDeirB7927s3Lmz3udYu3atRxX1PXv2YPfu3Zg4cWKbxXnzzTfj3LlzePvtt+v8rLKy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j9Pr9YiNjfVCRK0zNCkcZ4sqER9mlDsUIiIixVJUy1RLbd26FdHR0UhOTsaDDz6IgoICuUMiIiIiH6GolqmWmDBhAm644QZ069YNJ06cwJNPPomJEydi586dUKvV9T7GbDbDbDZL900mk1di259VDKCmEjoRERG1P79vmZo3b16dAeK1b+np6S1+/ltvvRV//vOfkZKSgqlTp+Kbb77Br7/+iq1btzb4mEWLFiE0NFS6JSYmtvj4jckqrAAAHMgq8srzExER0cX5fcvUo48+ihkzZjS6T/fu3dvseN27d0dkZCSOHz+Oq666qt595s+fj7lz50r3TSaT1xIqIiIikpffJ1NRUVGIiopqt+OdPXsWBQUFiIuLa3AfvV4PvV7fbjEZtfV3NxIREZH3+X03X3NkZWUhLS0NWVlZsNlsSEtLQ1paGsrKyqR9+vTpg6+++goAUFZWhsceewy7du1CZmYmNm3ahClTpqBnz54YP368XKchcS0nc00/LidDREQkF79vmWqOZ599FqtWrZLuDx48GACwZcsWpKamAgAyMjJQUlICAFCr1Th48CBWrVqF4uJixMfH45prrsHzzz/fri1PRERE5LsUlUytXLnyojWmRFGU/m00GvH99997OSoiIiLyZ4rq5utoXMvJbDuWL3MkREREysVkyo9FBzu6GrtEBMgcCRERkXIxmfJjI3p0AgAkhnM5GSIiIrkwmSIiIiJqBSZTfuz3845lavJKzRfZk4iIiLyFyZQfO57nqI/1a2ahzJEQEREpF5MpIiIiolZgMtUB6NT8NRIREcmFn8J+bFKKY33Aif1jZY6EiIhIuZhMEREREbUCkykiIiKiVmAy5ce+PZQNAPjlRIHMkRARESkXkyk/FmJwrFMdE2KQORIiIiLlYjLlx8YkRwMAukZybT4iIiK5MJkiIiIiagUmU37sWG4pAKCgzCJzJERERMrFZMqPpec4kqmdJzkAnYiISC5MpoiIiIhagclUB6ASBLlDICIiUiwmU35s0gDHcjLXOf9PRERE7Y/JFBEREVErMJkiIiIiagUmU37s24OO5WT2nCqUORIiIiLlYjLlx/Qax68vPFAncyRERETKxWTKj13dLwYA0DMqSOZIiIiIlIvJFBEREVErMJnyY1mFFQCA4spqmSMhIiJSLiZTfuzg2RIAwPZjF2SOhIiISLmYTBER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mM1m/PTTTzh06BAWL17MligiH8NkiogUZeDAgXj66afRq1cvzJ8/HwaDAZGRkZg5cyZ69eqFZ599FgUFBTh48CAA4D//+Q8GDx6MF198EX369MHgwYOxYsUKbNmyBUePHm328a+99lr89a9/lY5lMplw6aWXYtq0aejduzeeeOIJHDlyBLm5uQCArKwsjBo1CikpKejevTuuu+46XHHFFW16TYiodZhMEZGiDBgwQPq3Wq1Gp06dkJKSIm2LiYkBAOTl5QEAfvvtN2zZskUagxUUFIQ+ffoAAE6cONGq47uO1djx//a3v+GFF17AqFGjsGDBAinJIyLfwWSKiBRFq9V63BcEwWOba5ag3W4HAJSVlWHy5MlIS0vzuB07dqxFLUT1Haux49933304efIk7rrrLhw6dAhDhw7FG2+80ezjEpH3MJkiImrEn/70J/z+++/o2rUrevbs6XHzZtkDd4mJiXjggQfw5Zdf4tFHH8Xbb7/dLscloqZhMkVE1IhZs2ahsLAQt912G3799VecOHEC33//Pe655x7YbDavH3/OnDn4/vvvcerUKezfvx9btmxB3759vX5cImo6JlNERI2Ij4/Hjh07YLPZcM011yAlJQVz5sxBWFgYVCrvv4XabDbMmjULffv2xYQJE9C7d2+89dZbXj8uETWdIMpVHpiIqINauXIl5syZg+Li4nY53nPPPYe1a9ciLS2tXY5HRJ7YMkVE5AUlJSUICgrCE0884bVjZGVlISgoCC+++KLXjkFEF8eWKSKiNlZaWirViQoLC0NkZKRXjmO1WpGZmQkA0Ov1SExM9MpxiKhxTKaIiIiIWoHdfEREREStwGSKiIiIqBWYTBERERG1ApMpIiIiolZgMkVERETUCkymiIiIiFqByRQRERFRKzCZIiIiImoFJlNERERErfD/AUMwLZIYVa6JAAAAAElFTkSuQmCC", "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": "3f6e4788", "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 overridden 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.23" }, "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, 349, 356, 368, 384, 389, 396, 398, 414, 431, 433 ] }, "nbformat": 4, "nbformat_minor": 5 }