{ "cells": [ { "cell_type": "markdown", "id": "cf70a1bd", "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, {mod}`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 {mod}`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": "7dfe32e0", "metadata": {}, "outputs": [], "source": [ "from quantify_scheduler.operations.gate_library 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": "c1c21698", "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": "6058c5d2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'acquisition_info': [],\n", " 'gate_info': {'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.gate_library import Rxy\n", "\n", "rxy45 = Rxy(theta=45.0, phi=0.0, qubit=q0)\n", "pprint(rxy45.data)\n" ] }, { "cell_type": "markdown", "id": "2a4fa811", "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": "529eecdd", "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": "9a824264", "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": "a1dd2be5", "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.gate_library 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": "4379ce2f", "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", "## Visualizing the quantum circuit\n", "\n", "We can directly visualize the created schedule on the\n", "{ref}`quantum-circuit level`.\n", "This visualization shows every operation on a line representing the different qubits." ] }, { "cell_type": "code", "execution_count": 5, "id": "94d6511d", "metadata": {}, "outputs": [ { "data": { "image/png": "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J4wxffDPMnYj/vu4HMF/LcyjQJYx5kLgWeBda+3f8r3278aYEcBTxph/F/qjfFTu7/hkbswvAA8U2vaTxphtwO9ztwX+C+8/ADzl/d3KKtBxWWtPG2Nuw18YzcWfn5MoONxORERymbMnTBEREak4xpjH8P/h38hamxnkcERExIF0TYyIiIiIiDiKihgREREREXEUFTEiIiIiIuIouiZGREREREQcRWdiRERERETEUVTEiIiIiIiIo6iIERERERERRwnVm13qQh0RERERkerHlKSRzsSIiIiIiIijqIgRERERERFHUREjIiIiIiKOoiJGREREREQcRUWMiIiIiIg4iooYERERERFxFBUxIiIiIiLiKCpiRERERETEUVTEiIiIiIiIo6iIERERERERR1ERIyIiIiIijqIiRkREREREHEVFjIiIiIiIOIqKGBERERERcRQVMSIiIiIi4igqYkRERERExFFUxIiIiIiIiKOoiBEREREREUcJC3YAUjmeX70z2CEExfjrYoMdgsg5bd26NdghBEWHDh2CHUK1ohwgEpqUA8pOZ2JERERERMRRVMSIiIiIiIijqIgRERERERFHUREjIiIiIiKOoiJGRESKdPz4cXbt2hXsMEREJAhCPQeoiBERkbP4fD4efPBBEhISSE1NDXY4IiJSiZyQA1TEiIjIWebPn8/q1asBcLvdQY5GREQqkxNygIoYEREpYN26dcyePTvveXh4eBCjERGRyuSUHKCbXYqEAGstaZnZfLv/FHt+zCY7xxIRZmhRP4K2MZG0io7AGBPsMKUa2L17NxMmTCiwLCIiIkjRiFQPygESKpyUA1TEiARRjteyMvUIy1Ky+CErBwC3C7CAAa/P365pVBiDukTRv2NdwtxKZFIxTpw4wb333svJkyex1uYtD9UEJuJ0ygESSpyWA1TEiATJ7oPZzFq1n10HswssP5O0+Hn/wQ9ZOcxff5APvj7K/f1iaNkwNHco4lzWWiZPnkxaWho+n6/AulBNYCJOphwgocSJOUDXxIgEwZbvf+KhJfvYcyj7/I3z2XMom4eW7GPL9z9VUGRSXS1cuJAVK1aclbwgdBOYiFMpB0iocWIOUBFTSHJyMrGxsaV6zYIFC9i6dWvFBBSifD4f027vx7KXny6wfMunq/l9fDu+XL8iSJGFvt0Hs5m2LJ3TPovPnr99fj4L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2fjKcXGny0DLBhFc30njoKuTQN9I8e23384bRtC8eXO6du1apn5cLle1LWBAOaA0lAOUA6TslAMKbbfStxjiYmNjuf/++4MdhlRRYW7D/f1iCHMZynogxRgIcxnu6xeD26UjcFI2WVlZJCcn4/V6cblcDBs2TEd0UQ6QiqUcIKGiKuSAgBQx1tq+1tr7A9FXsCmBSUVr2TCCKYOaEO4ylDb/uAyEuwxTBjWhZUONg5ayW7FiRd40nT6fr0zDCKoi5QCpaMoBEgqqQg7QmRiRIIhrVpMZI5rTskHJktCZPNeyQQQzRjQnrlnNigtOqoWlS5dijMEYQ5cuXUJqKlqRqk45QIKtKuQAXRMjEiQtG/qT0crUIyxLyeKHrII3r3K7wJs7eXnTqHASu9Slf8e6hLmddbpXQs+ePXtISUnJez5ixIggRiNSPSkHSLBUlRygIkYkiMLchoTOUcTH1SUtM5ut6Sd5+SP/zDX9O9YhNjqSto0iaRUd4bixqhK6VqxYkffvsLAw4uPjz9FaRCqKcoAEQ1XJASpiREKAMYbWjSJpVi88L4HdelVDaoRrxKcEXvfu3WnYsCEHDx7kuuuuq5L3dhFxEuUAqUxVJQeoiBERqWa6du3K2rVr2bJlCx06dAh2OCIiUomqSg5QESMiUg253W66dOkS7DBERCQIqkIO0HlKERERERFxFBUxIiIiIiLiKCpiRERERETEUVTEiIiIiIiIo+jC/mpi/HWxwQ5BRIrg5JlhxDmUA0RCk3JA2elMjIiIiIiIOIqKGBERERERcRQVMSIiIiIi4igqYkRERERExFFUxIiIiIiIiKOoiBEREREREUdRESMiIiIiIo6iIkZERERERBxFRYyIiIiIiDiKihgREREREXEUFTEiIiIiIuIoKmJERERERMRRVMSIiIiIiIijqIgRERERERFHUREjIiIiIiKOoiJGREREREQcRUWMiIiIiIg4iooYERERERFxFBUxIiIiIiLiKCpiRERERETEUVTEiIiIiIiIo6iIERERERERR1ERIyIiIiIijqIiRkREREREHEVFjIiIiIiIOIqKGBERERERcRQVMSIiIiIi4igqYkRERERExFFUxIiIiIiIiKOoiBEREREREUdRESMiIiIiIo6iIkZERERERBxFRYyIiIiIiDiKihgREREREXEUFTEiIiIiIuIoKmJE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wYTnl+Q9v6xPYoEb5K33vM6Qux/G7a56u7dA30jx7bffzhtG0Lx5c7p27VqmflwuV7UtYEA5oDSUA5QDyqI67/fzUw4otN1K32KIi42N5f777w92GFJFhbkN9/eLIcxlKOuBFGMgzGW4r18MblfVPwJXUge+38W0264jskZNuvS8IdjhhLysrCySk5Pxer24XC6GDRtWLY7ono9ygFQk5YDA0n6/7KpCDghIyWqt7RuIfkKBEphUtJYNI5gyqAnTlqWT47OlOhrnyk1eUwY1oWXD6jEOuqQaNbuIKX9bHewwHGPFihV503T6fL4yDSOoipQDpKIpBwSO9vtlVxVygM7EiARBXLOazBjRnJYNSpaEzhwbadkgghkjmhPXrGbFBSfVwtKlSzHGYIyhS5cutGjRItghiVQbygESbFUhB1TtwYMiIaxlQ38yWpl6hGUpWfyQ5T8i4nbhv2LTgDf3rmhNo8JJ7FKX/h3rEuZ21uleCT179uwhJSUl7/mIESOCGI1I9aQcIMFSVXKAihiRIApzGxI6RxEfV5e0zGy+PXCKPYeyyc6xRIQZWjSIoG2jSFpFRzhurKqErhUrVuT9OywsjPj4+HO0FpGKohwgwVBVcoCKGJEQYIyhdaNIWlejm5ZJ8HTv3p2GDRty8OBBrrvuuip5bxcRJ1EOkMpUVXKAihgRkWqma9eurF27li1bttChQ4dghyMiIpWoquQAFTEiItWQ2+2mS5cuwQ5DRESCoCrkAM1OJiIiIiIijqIiRkREREREHEVFjIiIiIiIOIqKGBERERERcRRjrQ12DEUJyaBERERERKRCleimSDoTIyIiIiIijqIiRkREREREHEVFjIiIiIiIOIqKGBERERERcRQVMSIiIiIi4igqYkRERERExFFUxIiIiIiIiKOoiBEREREREUdRESMiIiIiIo6iIkZERERERBxFRYyIiIiIiDiKihgREREREXEUFTEiIiIiIuIoKmJERERERMRRVMSIiIiIiIijqIgRERERERFHUREjIiIiIiKOoiJGREREREQcJSzYARTDBDsAEREREREJTToTIyIiIiIijqIiRkREREREHEVFjIiIiIiIOIqKGBERERERcRQVMSIiIiIi4igqYkRERERExFFUxIiIiIiIiKOoiBEREREREUdRESMiIiIiIo7y/wGU2lZ37LD6FgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "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": "eb7feecc", "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": "77a56d14", "metadata": { "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "RuntimeError", "evalue": "Attempting to sample schedule Bell experiment, but the schedule does not contain any `pulse_info`. Please verify that the schedule has been populated and device compilation has been performed.", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mRuntimeError\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~/.local/opt/conda/envs/docs_qs0123/lib/python3.9/site-packages/quantify_scheduler/schedules/schedule.py:356\u001b[0m, in \u001b[0;36mScheduleBase.plot_pulse_diagram\u001b[0;34m(self, port_list, sampling_rate, modulation, modulation_if, plot_backend, plot_kwargs)\u001b[0m\n\u001b[1;32m 349\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 350\u001b[0m \u001b[38;5;66;03m# NB imported here to avoid circular import\u001b[39;00m\n\u001b[1;32m 351\u001b[0m \u001b[38;5;66;03m# pylint: disable=import-outside-toplevel\u001b[39;00m\n\u001b[1;32m 352\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \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;28;01mimport\u001b[39;00m (\n\u001b[1;32m 353\u001b[0m pulse_diagram_matplotlib,\n\u001b[1;32m 354\u001b[0m )\n\u001b[0;32m--> 356\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mpulse_diagram_matplotlib\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 357\u001b[0m \u001b[43m \u001b[49m\u001b[43mschedule\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 358\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 359\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 360\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 361\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 362\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mplot_kwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 363\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 364\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;124mplotly\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 365\u001b[0m \u001b[38;5;66;03m# NB imported here to avoid circular import\u001b[39;00m\n\u001b[1;32m 366\u001b[0m \u001b[38;5;66;03m# pylint: disable=import-outside-toplevel\u001b[39;00m\n\u001b[1;32m 367\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \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;28;01mimport\u001b[39;00m (\n\u001b[1;32m 368\u001b[0m pulse_diagram_plotly,\n\u001b[1;32m 369\u001b[0m )\n", "File \u001b[0;32m~/.local/opt/conda/envs/docs_qs0123/lib/python3.9/site-packages/quantify_scheduler/schedules/_visualization/pulse_diagram.py:484\u001b[0m, in \u001b[0;36mpulse_diagram_matplotlib\u001b[0;34m(schedule, port_list, sampling_rate, modulation, modulation_if, ax)\u001b[0m\n\u001b[1;32m 450\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mpulse_diagram_matplotlib\u001b[39m(\n\u001b[1;32m 451\u001b[0m schedule: Union[Schedule, CompiledSchedule],\n\u001b[1;32m 452\u001b[0m port_list: Optional[List[\u001b[38;5;28mstr\u001b[39m]] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 456\u001b[0m ax: Optional[matplotlib\u001b[38;5;241m.\u001b[39maxes\u001b[38;5;241m.\u001b[39mAxes] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 457\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tuple[matplotlib\u001b[38;5;241m.\u001b[39mfigure\u001b[38;5;241m.\u001b[39mFigure, matplotlib\u001b[38;5;241m.\u001b[39maxes\u001b[38;5;241m.\u001b[39mAxes]:\n\u001b[1;32m 458\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 459\u001b[0m \u001b[38;5;124;03m Plots a schedule using matplotlib.\u001b[39;00m\n\u001b[1;32m 460\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 482\u001b[0m \u001b[38;5;124;03m The matplotlib ax.\u001b[39;00m\n\u001b[1;32m 483\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 484\u001b[0m times, pulses \u001b[38;5;241m=\u001b[39m \u001b[43msample_schedule\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 485\u001b[0m \u001b[43m \u001b[49m\u001b[43mschedule\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 486\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 487\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 488\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 489\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 490\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 491\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ax \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 492\u001b[0m _, ax \u001b[38;5;241m=\u001b[39m plt\u001b[38;5;241m.\u001b[39msubplots()\n", "File \u001b[0;32m~/.local/opt/conda/envs/docs_qs0123/lib/python3.9/site-packages/quantify_scheduler/schedules/_visualization/pulse_diagram.py:386\u001b[0m, in \u001b[0;36msample_schedule\u001b[0;34m(schedule, port_list, modulation, modulation_if, sampling_rate)\u001b[0m\n\u001b[1;32m 383\u001b[0m logger\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtime_window \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtime_window\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m, port_map \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mport_map\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 385\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m time_window \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 386\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\n\u001b[1;32m 387\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAttempting to sample schedule \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mschedule\u001b[38;5;241m.\u001b[39mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 388\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mbut the schedule does not contain any `pulse_info`. \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 389\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPlease verify that the schedule has been populated and \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 390\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdevice compilation has been performed.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 391\u001b[0m )\n\u001b[1;32m 393\u001b[0m timestamps \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39marange(time_window[\u001b[38;5;241m0\u001b[39m], time_window[\u001b[38;5;241m1\u001b[39m], \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m/\u001b[39m sampling_rate)\n\u001b[1;32m 394\u001b[0m waveforms \u001b[38;5;241m=\u001b[39m {key: np\u001b[38;5;241m.\u001b[39mzeros_like(timestamps) \u001b[38;5;28;01mfor\u001b[39;00m key \u001b[38;5;129;01min\u001b[39;00m port_map}\n", "\u001b[0;31mRuntimeError\u001b[0m: Attempting to sample schedule Bell experiment, but the schedule does not contain any `pulse_info`. Please verify that the schedule has been populated and device compilation has been performed." ] } ], "source": [ "sched.plot_pulse_diagram()" ] }, { "cell_type": "markdown", "id": "d6e25d25", "metadata": {}, "source": [ "And similarly for the {code}`timing_table`:" ] }, { "cell_type": "code", "execution_count": 7, "id": "141a1ba2", "metadata": { "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "ValueError", "evalue": "Absolute time has not been determined yet.", "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~/.local/opt/conda/envs/docs_qs0123/lib/python3.9/site-packages/quantify_scheduler/schedules/schedule.py:431\u001b[0m, in \u001b[0;36mScheduleBase.timing_table\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 428\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m schedulable \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mschedulables\u001b[38;5;241m.\u001b[39mvalues():\n\u001b[1;32m 429\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 430\u001b[0m \u001b[38;5;66;03m# when this exception is encountered\u001b[39;00m\n\u001b[0;32m--> 431\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\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 432\u001b[0m operation \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moperations[schedulable[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moperation_repr\u001b[39m\u001b[38;5;124m\"\u001b[39m]]\n\u001b[1;32m 434\u001b[0m \u001b[38;5;66;03m# iterate over pulse information\u001b[39;00m\n", "\u001b[0;31mValueError\u001b[0m: Absolute time has not been determined yet." ] } ], "source": [ "sched.timing_table" ] }, { "cell_type": "markdown", "id": "808b0e3d", "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", "{mod}`quantify-scheduler` test suite." ] }, { "cell_type": "code", "execution_count": 8, "id": "ca499cf9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['backend', 'clocks', 'elements', 'edges']" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from quantify_scheduler.backends.circuit_to_device import DeviceCompilationConfig\n", "from quantify_scheduler.schemas.examples.circuit_to_device_example_cfgs import (\n", " example_transmon_cfg,\n", ")\n", "\n", "device_cfg = DeviceCompilationConfig.parse_obj(example_transmon_cfg)\n", "\n", "list(device_cfg.dict())" ] }, { "cell_type": "markdown", "id": "f217a2fd", "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": "02e8c633", "metadata": {}, "outputs": [ { "data": { "text/plain": [ " quantify_scheduler.schedules.schedule.Schedule>" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "device_cfg.backend\n" ] }, { "cell_type": "markdown", "id": "42a91090", "metadata": {}, "source": [ "The backend of the device configuration specifies what function will be used to add\n", "pulse information to the gates. In other words, it specifies how to interpret the\n", "qubit parameters present in the device configuration and achieve the required gates.\n", "Let us briefly investigate the backend function:" ] }, { "cell_type": "code", "execution_count": 10, "id": "a30cf6e0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on function compile_circuit_to_device in module quantify_scheduler.backends.circuit_to_device:\n", "\n", "compile_circuit_to_device(schedule: quantify_scheduler.schedules.schedule.Schedule, device_cfg: Union[quantify_scheduler.backends.circuit_to_device.DeviceCompilationConfig, dict, NoneType] = None) -> quantify_scheduler.schedules.schedule.Schedule\n", " Adds the information required to represent operations on the quantum-device\n", " abstraction layer to operations that contain information on how to be represented\n", " on the quantum-circuit layer.\n", " \n", " Parameters\n", " ----------\n", " schedule\n", " The schedule to be compiled.\n", " device_cfg\n", " Device specific configuration, defines the compilation step from\n", " the quantum-circuit layer to the quantum-device layer description.\n", " Note, if a dictionary is passed, it will be parsed to a\n", " :class:`~DeviceCompilationConfig`.\n", "\n" ] } ], "source": [ "help(device_cfg.backend)\n" ] }, { "cell_type": "markdown", "id": "31d6ccd1", "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": "5d04da2d", "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": "39952b70", "metadata": {}, "source": [ "For every qubit and edge, we can investigate the contained parameters." ] }, { "cell_type": "code", "execution_count": 12, "id": "0867434a", "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']), 'Z': OperationCompilationConfig(factory_func=, factory_kwargs={'amp': 0.23, 'duration': 4e-09, 'port': 'q0:fl', 'clock': 'cl0.baseband'}, 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}, gate_info_factory_kwargs=['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": "7075af7f", "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": "7320207f", "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": "279d701c", "metadata": {}, "source": [ "Lastly, the complete example device configuration (also see {class}`~quantify_scheduler.backends.circuit_to_device.DeviceCompilationConfig`):" ] }, { "cell_type": "code", "execution_count": 15, "id": "6a090c9f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'backend': 'quantify_scheduler.backends.circuit_to_device.compile_circuit_to_device',\n", " 'clocks': {'q0.01': 6020000000.0,\n", " 'q0.ro': 7040000000.0,\n", " 'q1.01': 5020000000.0,\n", " 'q1.ro': 6900000000.0},\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': {'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", " 'Z': {'factory_func': 'quantify_scheduler.operations.pulse_library.SoftSquarePulse',\n", " 'factory_kwargs': {'amp': 0.23,\n", " 'clock': 'cl0.baseband',\n", " 'duration': 4e-09,\n", " 'port': 'q0:fl'}},\n", " 'measure': {'factory_func': 'quantify_scheduler.operations.measurement_factories.dispersive_measurement',\n", " 'factory_kwargs': {'acq_channel': 0,\n", " 'acq_delay': 1.2e-07,\n", " 'acq_duration': 3e-07,\n", " 'clock': 'q0.ro',\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_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", " 'measure': {'factory_func': 'quantify_scheduler.operations.measurement_factories.dispersive_measurement',\n", " 'factory_kwargs': {'acq_channel': 1,\n", " 'acq_delay': 1.2e-07,\n", " 'acq_duration': 3e-07,\n", " 'clock': 'q1.ro',\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_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": "01339ba8", "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": "d300de17", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(, ['qubit'])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from quantify_scheduler.device_under_test.quantum_device import QuantumDevice\n", "from quantify_scheduler.device_under_test.transmon_element import BasicTransmonElement\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": "831452d3", "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": "04a22af7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['reset', 'rxy', 'measure', '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_weight_type']\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": "aa718aad", "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": "6cdefafa", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "DeviceCompilationConfig(backend=, 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}, gate_info_factory_kwargs=['theta', 'phi']), '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}, gate_info_factory_kwargs=['acq_index', 'bin_mode', 'acq_protocol'])}}, edges={})\n" ] } ], "source": [ "pprint(dut.generate_device_config())\n" ] }, { "cell_type": "markdown", "id": "5a9927ac", "metadata": {}, "source": [ "## 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": "2126769a", "metadata": {}, "outputs": [], "source": [ "from quantify_scheduler import Schedule\n", "from quantify_scheduler.operations.gate_library import Measure, Reset, X, X90\n", "from quantify_scheduler.operations.pulse_library import SquarePulse\n", "from quantify_scheduler.resources import ClockResource\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": "06206980", "metadata": {}, "outputs": [ { "data": { "image/png": "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SElQHHKAT36JsdZe44vzFAVKYCJSEsTHx2dM05mWlpavbgTFkXKAiJQExSEHqDuZiEgJtGjRooxv3a644gpN/ysiUoIUhxygIkZEpITZt28fGzduzFgfOHBgAKMREZHCVFxygMbEiIiUMPHx8Rn3S5UqRc+ePS+wt4iIFCfFJQeoiBERKWHatGlDlSpVAOjWrVuxvLaLiIhkr7jkAHUnExEpYVq2bMmKFSvYvHkzjRo1CnQ4IiJSiIpLDlARIyJSAoWGhtK8efNAhyEiIgFQHHKAupOJiIiIiEhQUREjIiIiIiJBRUWMiIiIiIgEFRUxIiIiIiISVIy1NtAxZKdIBiUiIiIiIn5lcrOTfokREREREZGgoiJGRERERESCiooYEREREREJKipiREREREQkqKiIERERERGRoKIiRkREREREgoqKGBERERERCSoqYkREREREJKioiBERERERkaCiIkZERERERIKKihgREREREQkqKmJERERERCSoqIgREREREZGgoiJGRERERESCiooYEREREREJKipiRLKRkJCAMYZjx44FOpQi5dFHH6Vly5aBDkNExK+UA7KnHCBFiYoYCUrDhw/HGMOoUaPO2/bXv/4VYwzDhw/36WPOmjWLFi1aUK5cOaKiomjVqhVPPvmkTx/Dn9KTcvqtevXqDBw4kJ07dwY6NBGRPFEOyDvlACluVMRI0Kpduzbvvvsuf/zxR0bb6dOnefvtt6lTp45PH2v27Nncc889jBs3jg0bNrBq1SomTJhAUlKSTx8nP9xuN2lpabnef9u2bezfv58FCxawefNm+vbti9vt9mOEIiK+pxzgUA6QkkpFjAStK6+8ktq1a7No0aKMtkWLFlGnTh1atWqV0ZaSksK4ceOIjo4mMjKSTp068e2333qd65NPPqFBgwaULl2aa6+9lt27d3ttd7lc3HzzzYwcOZL69evTtGlTbrnlFqZMmZKxj9vtZvz48URFRVGlShUmTJjAsGHDiIuLy9gnNjaWadOmeZ27ZcuWPProoxnrU6dO5YorrqBs2bLUrl2b0aNHeyXKuXPnEhUVhcvlokmTJkRERLB3715SUlL4xz/+Qc2aNSlbtizt2rUjISHhvNctOjqamJgYunTpwqRJk/jxxx/5+eefM86b2eLFizHG5PAv4Hyz17ZtW8qWLUtUVBQdO3Zkz549Gds//PBDrrzySiIjI6lbty6PPfYYZ8+ezfF8IiK5pRygHCAlm4oYCWq33XYbc+bMyVifPXs2I0aM8NpnwoQJLFy4kNdff51169ZRv359evbsyZEjRwDYt28fAwYMoG/fvmzYsIHbb7+diRMnep3jkksuYfXq1V4fzlk999xzzJ07l9mzZ/Pll19y5MgRPvjggzw/p5CQEF544QU2b97M66+/zvLly5kwYYLXPqdOneKpp57itddeY/PmzURHRzNmzBi+/vpr3n33XTZu3Mif/vQnevXqxU8//ZTjY5UuXRqA1NTUPMd59uxZ4uLi6Nq1Kxs3buTrr7/mzjvvzEh4K1euZOjQodx99938+OOPzJw5k7lz53olfRGRglAOUA6QEsxaWxRvIhc0bNgw279/f3vw4EEbERFhd+/ebXfv3m0jIyPtoUOHbP/+/e2wYcNsUlKSDQsLs2+99VbGsampqbZGjRr26aefttZae//999smTZp4nf++++6zgD169Ki11tr9+/fb9u3bW8A2aNDADhs2zM6fP9+63e6MY2JiYjLOaa21Z86csbVq1bL9+/fPaLv00kvt888/7/VYLVq0sI888kiOz3XBggW2SpUqGetz5syxgN2wYUNG2549e2xoaKj99ddfvY7t3r27vf/++6211n7++efnPaerr77a1qxZ06akpNg5c+bYihUreh3/wQcfWOdjwvHII4/YFi1aWGut/f333y1gExISso27e/fu9p///KdX27x582xMTEyOz1VEJDeUA5QDpFjLVb1QKjClk4hvVKtWjT59+jB37lystfTp04eqVatmbN+xYwdnzpyhY8eOGW1hYWG0bduWLVu2ALBlyxbatWvndd4OHTp4rcfExPD111+zadMmvvjiC7766iuGDRvGa6+9Rnx8PCdPnuS3337zOk+pUqVo3bo11to8PaelS5fy5JNPsnXrVk6cOMHZs2c5ffo0p06dokyZMgCEh4fTvHnzjGN++OEH3G43DRo08DpXSkoKVapU8WqrVasW1lpOnTpFixYtWLhwIeHh4XmKEaBy5coMHz6cnj17ct1119GjRw9uvvlmYmJiAPj+++9ZtWrVed0tsj4XEZH8Ug5wKAdISaQiRoLebbfdxpgxYwB4+eWX/fpYzZo1o1mzZowePZpRo0bRuXNnVqxYwZVXXpmr40NCQs5LaGfOnMm4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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": "cb9bd8de", "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": "309dba7b", "metadata": {}, "outputs": [], "source": [ "from quantify_scheduler.backends import SerialCompiler\n", "from quantify_scheduler.device_under_test.quantum_device import QuantumDevice\n", "from quantify_scheduler.device_under_test.transmon_element import BasicTransmonElement\n", "\n", "dut.close()\n", "dut = QuantumDevice(\"DUT\")\n", "q0 = BasicTransmonElement(\"q0\")\n", "q1 = BasicTransmonElement(\"q1\")\n", "dut.add_element(q0)\n", "dut.add_element(q1)\n", "dut.get_element(\"q0\").rxy.amp180(0.6)\n", "dut.get_element(\"q1\").rxy.amp180(0.6)\n", "\n", "compiler = SerialCompiler(name='compiler')\n", "compiled_sched = compiler.compile(schedule=sched, config=dut.generate_compilation_config())" ] }, { "cell_type": "markdown", "id": "691058a6", "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": "59e02229", "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", " \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", "
 portclockis_acquisitionabs_timedurationoperationwf_idx
0Nonecl0.basebandFalse0.0 ns200,000.0 nsReset('q0','q1')0
1Nonecl0.basebandFalse0.0 ns200,000.0 nsReset('q0','q1')1
2q0:mwq0.01False200,000.0 ns20.0 nsX(qubit='q0')0
3q0:mwq0.01False200,020.0 ns20.0 nsSquarePulse(amp=0.1,duration=2e-08,port='q0:mw',clock='q0.01',phase=0,t0=0)0
4q0:mwq0.01False200,040.0 ns20.0 nsX90(qubit='q0')0
5q1:mwq1.01False200,040.0 ns20.0 nsX90(qubit='q1')0
6Noneq0.roFalse200,060.0 ns0.0 nsMeasure('q0', acq_index=0, acq_protocol=\"None\", bin_mode=None)0
7q0:resq0.roFalse200,060.0 ns300.0 nsMeasure('q0', acq_index=0, acq_protocol=\"None\", bin_mode=None)1
8q0:resq0.roTrue200,060.0 ns1,000.0 nsMeasure('q0', acq_index=0, acq_protocol=\"None\", bin_mode=None)0
9Noneq1.roFalse200,060.0 ns0.0 nsMeasure('q1', acq_index=0, acq_protocol=\"None\", bin_mode=None)0
10q1:resq1.roFalse200,060.0 ns300.0 nsMeasure('q1', acq_index=0, acq_protocol=\"None\", bin_mode=None)1
\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": "3f58cca3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.0002, 0.0002004)" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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apSXlyM4ONjV5RARkZuora1FYWEhunXrZhE0PFViYiLi4uKQmZnp6lKs1tLfgTv9freLOVRERERErsRARURERGQnzqEiIiLyErm5ua4uod1iDxURERGRnRioiIiIiOzEQEVERERkJwYqIiIiIjsxUBERERHZiYGKiIiIyE4MVERERF7oo48+wp133okOHTpAEAQcPnzY1SV5NAYqIiIiL1RVVYXhw4dj2bJlri6lXWCgIiIiaoeqqqqQnJwMlUqFqKgorFy5EomJiZgzZw4AYPLkyUhPT0dSUpLV59y0aRNCQkLw6aefonfv3ggICMDEiRNRXV2NzZs3IzY2FqGhoXjqqadgMBgAAKtXr0a/fv2kc2zfvh2CICArK0valpSUhPnz5zum4S7CQEVERGQLUQT0VW3/EkWbypw7dy52796NTz75BF9++SVyc3Nx6NAhm84xZcoUJCYmWmyrrq7GqlWrsHXrVmRnZyM3Nxf33Xcfdu7ciZ07d+Kdd97BP/7xD3z44YcAgJEjR+Lo0aM4f/48AGD37t0IDw+XVm2vq6vDvn37Gl3H0/DRM0RERLaoqwaWRLf9dV84C/gFWrVrZWUlNmzYgHfffRejR48GAGzevBmdO3e26ZJRUVEwGo0W2+rq6rB27Vp0794dADBx4kS88847KCkpgUqlQt++fTFq1Cjs2rULDz74IPr164ewsDDs3r0bEydORG5uLp555hn8/e9/BwDs378fdXV1uO2222yqzd2wh4qIiKidKSgogF6vR0JCgrQtLCwMvXv3tuk8GRkZ2LJli8W2gIAAKUwBgEajQWxsLFQqlcW20tJSAIAgCLj99tuRm5uLsrIyHD16FE8++SR0Oh1+/fVX7N69GzfffDMCAgKup6lugz1UREREtvANMPUWueK6bsDX19fivSAITW67umcrMTERb731Fr755hvEx8cjODhYClm7d+/GyJEj26R2Z2IPFRERkS0EwTT01tYvQbC6xO7du8PX1xd5eXnStsuXL+PYsWPO+EZaZZ5H9a9//UuaK5WYmIivvvoK//3vfz1+/hTAHioiIqJ2R6VSYerUqZg7dy46dOiAiIgIvPjii5DJrvSjXLp0CUVFRTh71tTblp+fDwCIjIxEZGQkACAtLQ1nzpxpNOxnqwEDBiA0NBTvv/8+Pv30UwCmQPXss89CEAQMGzbMrvO7A/ZQERERtUOvvvoqRowYgbFjxyIpKQnDhw/H4MGDpc937NiB+Ph43HvvvQCAhx56CPHx8RbLGZw7dw5FRUV21yIIAkaMGAFBEDB8+HAAppAVHByMIUOGIDDQusn27kwQRRvvw2yHtFot1Go1ysvLERwc7OpyiIjITdTW1qKwsBDdunWDUql0dTl2S0xMRFxcHDIzM11ditVa+jtwp99v9lARERER2YmBioiIiMhOnJRORETkJcyrk5PjsYeKiIiIyE4MVERERER2YqAiIiIishMDFREREZGdGKiIiIiI7MRARURERGQntwxUa9asQWxsLJRKJRISErB///4W98/MzETv3r3h7++PmJgYPP3006itrW2jaomIiMjbuV2g2rZtG1JTU7Fw4UIcOnQIAwcOxJgxY1BaWtrk/u+//z6ef/55LFy4EL/88gs2bNiAbdu24YUXXmjjyomIiDyHKIpIT09HVFQU/P39kZSUhOPHj7u6LI/ldoHqtddew7Rp05CSkoK+ffsiKysLAQEB2LhxY5P7/+9//8OwYcPw8MMPIzY2FnfeeScmTZrUaq8WERGRN1u+fDlWrVqFrKws5OXlITAwEGPGjLFphEev1zuxQs/iVoFKr9fj4MGDSEpKkrbJZDIkJSVh3759TR5z22234eDBg1KAOnnyJHbu3Il77rmn2evodDpotVqLFxERUXtSVVWF5ORkqFQqREVFYeXKlUhMTMScOXMgiiIyMzMxf/58jB8/HgMGDMCWLVtw9uxZbN++vdlzvvTSS4iLi8P69estHlZcVlaGxx57DB07dkRwcDDuuOMO/PDDD9JxP/zwA0aNGoWgoCAEBwdj8ODB+O6775z9FbQpt3r0zIULF2AwGKDRaCy2azQa/Prrr00e8/DDD+PChQsYPnw4RFFEfX09nnjiiRaH/DIyMvDyyy87tHYiIvIOoiiipr6mza/r7+MPQRCs3n/u3LnYvXs3PvnkE0REROCFF17AoUOHEBcXh8LCQhQXF1t0YKjVaiQkJGDfvn146KGHAACJiYmIjY3Fpk2bpP1OnDiBf//73/joo48gl8sBAA888AD8/f3x+eefQ61W4x//+AdGjx6NY8eOISwsDI888gji4+Oxdu1ayOVyHD58GL6+vo75YtyEWwWq65Gbm4slS5bgzTffREJCAk6cOIG//e1v+L//+z8sWLCgyWPS0tKQmpoqvddqtYiJiWmrkomIyIPV1Ncg4f2ENr9u3sN5CPANsGrfyspKbNiwAe+++y5Gjx4NANi8eTM6d+4MACguLgaAJjswzJ8BQJcuXRAVFWWxj16vx5YtW9CxY0cAwN69e7F//36UlpZCoVAAAFasWIHt27fjww8/xPTp01FUVIS5c+eiT58+AICePXva2ny351aBKjw8HHK5HCUlJRbbS0pKEBkZ2eQxCxYswOTJk/HYY48BAPr374+qqipMnz4dL774ImSyxqOaCoVC+ksnIiJqbwoKCqDX65GQcCX4hYWFoXfv3jadZ8uWLY22de3aVQpTgGk4r7KyEh06dLDYr6amBgUFBQCA1NRUPPbYY3jnnXeQlJSEBx54AN27d7epFnfnVoHKz88PgwcPRk5ODiZMmAAAMBqNyMnJwaxZs5o8prq6ulFoMndBiqLo1HqJiMj7+Pv4I+/hPJdc11HMnRQlJSUWPVAlJSWIi4tr8djAwECL95WVlYiKikJubm6jfUNCQgCY5l49/PDD+Oyzz/D5559j4cKF2Lp1K+677z672uFO3CpQAaYU++ijj2LIkCEYOnQoMjMzUVVVhZSUFABAcnIyOnXqhIyMDADA2LFj8dprryE+Pl4a8luwYAHGjh0rBSsiIiJHEQTB6qE3V+nevTt8fX2Rl5eHLl26AAAuX76MY8eOYeTIkejWrRsiIyORk5MjBSitVou8vDzMmDHDpmsNGjQIxcXF8PHxQWxsbLP79erVC7169cLTTz+NSZMm4e2332agcqYHH3wQ58+fR3p6OoqLixEXF4fs7GxpnLeoqMiiR2r+/PkQBAHz58/HmTNn0LFjR4wdOxavvPKKq5pARETkUiqVClOnTsXcuXPRoUMHREREWEyDEQQBc+bMweLFi9GzZ09069YNCxYsQHR0tDRCBDTuxGhKUlISbr31VkyYMAHLly9Hr169cPbsWXz22We47777cNNNN2Hu3LmYOHEiunXrht9//x0HDhzA/fff7+yvoU25XaACgFmzZjU7xHdtl6KPjw8WLlyIhQsXtkFlREREnuHVV19FZWUlxo4di6CgIDzzzDMoLy+XPn/uueekOcdlZWUYPnw4srOzpaUQgMadGE0RBAE7d+7Eiy++iJSUFJw/fx6RkZG4/fbbodFoIJfLcfHiRSQnJ6OkpATh4eH405/+1O7uthdETjSCVquFWq1GeXk5goODXV0OERG5idraWhQWFlqsueTJEhMTERcXh8zMTFeXYrWW/g7c6ffbrRb2JCIiIvJEDFREREREdnLLOVRERETkeE0tbUCOwR4qIiIiIjsxUBERERHZiYGKiIiIyE4MVERERER2YqAiIiIishMDFREREZGdGKiIiIiI7MRARURE5IU++ugj3HnnnejQoQMEQcDhw4ddXZJHY6AiIiLyQlVVVRg+fDiWLVt23ecwGAwwGo0OrMpzMVARERG1Q1VVVUhOToZKpUJUVBRWrlyJxMREzJkzBwAwefJkpKenIykpyepzbtq0CSEhIdixYwf69u0LhUKBoqIi6HQ6PPvss+jUqRMCAwORkJBgsSr7b7/9hrFjxyI0NBSBgYG46aabsHPnTge32LX46BkiIiIbiKIIsaamza8r+PtDEASr9587dy52796NTz75BBEREXjhhRdw6NAhxMXFWX2OKVOm4NSpUxbhqLq6GsuWLcP69evRoUMHREREYNasWTh69Ci2bt2K6OhofPzxx7jrrrtw5MgR9OzZEzNnzoRer8eePXsQGBiIo0ePQqVS2dB698dARUREZAOxpgb5gwa3+XV7HzoIISDAqn0rKyuxYcMGvPvuuxg9ejQAYPPmzejcubNN14yKimo0pFdXV4c333wTAwcOBAAUFRXh7bffRlFREaKjowEAzz77LLKzs/H2229jyZIlKCoqwv3334/+/fsDAG644Qab6vAEDFRERETtTEFBAfR6PRISEqRtYWFh6N27t03nycjIaLTNz88PAwYMkN4fOXIEBoMBvXr1sthPp9OhQ4cOAICnnnoKM2bMwJdffomkpCTcf//9FudoDxioiIiIbCD4+6P3oYMuua478L9m6LGyshJyuRwHDx6EXC632Nc8rPfYY49hzJgx+Oyzz/Dll18iIyMDK1euxOzZs9u0dmdioCIiIrKBIAhWD725Svfu3eHr64u8vDx06dIFAHD58mUcO3YMI0eOdOi14uPjYTAYUFpaihEjRjS7X0xMDJ544gk88cQTSEtLw7p16xioiIiIyH2pVCpMnToVc+fOlSaOv/jii5DJrtzcf+nSJRQVFeHs2bMAgPz8fABAZGQkIiMjAQBpaWk4c+YMtmzZ0uy1evXqhUceeQTJyclYuXIl4uPjcf78eeTk5GDAgAG49957MWfOHNx9993o1asXLl++jF27duHGG2904jfQ9hioiIiI2qFXX30VlZWVGDt2LIKCgvDMM8+gvLxc+nzHjh1ISUmR3j/00EMAgIULF+Kll14CAJw7dw5FRUWtXuvtt9/G4sWL8cwzz+DMmTMIDw/HLbfcgj/+8Y8ATOtVzZw5E7///juCg4Nx11134fXXX3dga11PEEVRdHURrqbVaqFWq1FeXo7g4GBXl0NERG6itrYWhYWF6NatG5RKpavLsVtiYiLi4uKQmZnp6lKs1tLfgTv9fnNhTyIiIiI7MVARERER2YlzqIiIiLzE1Suek2Oxh4qIiIjITgxUREREreD9W67jKd89AxUREVEzfH19AZgeCEyuYf7uzX8X7opzqIiIiJohl8sREhKC0tJSAEBAQIDFY1fIeURRRHV1NUpLSxESEtLosTbuhoGKiIioBeZVw82hitpWSEiI9HfgzhioiIiIWiAIAqKiohAREYG6ujpXl+NVfH193b5nyswtA9WaNWvw6quvori4GAMHDsQbb7yBoUOHNrt/WVkZXnzxRXz00Ue4dOkSunbtiszMTNxzzz1tWDUREbVncrncY37cqe25XaDatm0bUlNTkZWVhYSEBGRmZmLMmDHIz89HREREo/31ej3+8Ic/ICIiAh9++CE6deqE3377DSEhIW1fPBEREXklt3uWX0JCAm6++WasXr0aAGA0GhETE4PZs2fj+eefb7R/VlYWXn31Vfz666/XfQeAOz0LiIiIiKzjTr/fbrVsgl6vx8GDB5GUlCRtk8lkSEpKwr59+5o8ZseOHbj11lsxc+ZMaDQa9OvXD0uWLIHBYGj2OjqdDlqt1uJFREREdL3cKlBduHABBoMBGo3GYrtGo0FxcXGTx5w8eRIffvghDAYDdu7ciQULFmDlypVYvHhxs9fJyMiAWq2WXjExMQ5tBxEREXkXtwpU18NoNCIiIgJvvfUWBg8ejAcffBAvvvgisrKymj0mLS0N5eXl0uv06dNtWDERERG1N241KT08PBxyuRwlJSUW20tKSppdgyIqKqrRbZU33ngjiouLodfr4efn1+gYhUIBhULh2OKJiIjIa7lVD5Wfnx8GDx6MnJwcaZvRaEROTg5uvfXWJo8ZNmwYTpw4AaPRKG07duwYoqKimgxTRERERI7mVoEKAFJTU7Fu3Tps3rwZv/zyC2bMmIGqqiqkpKQAAJKTk5GWlibtP2PGDFy6dAl/+9vfcOzYMXz22WdYsmQJZs6c6aomEBERkZdxqyE/AHjwwQdx/vx5pKeno7i4GHFxccjOzpYmqhcVFUEmu5IDY2Ji8MUXX+Dpp5/GgAED0KlTJ/ztb3/DvHnzXNUEIiIi8jJutw6VK7jTOhZERERkHXf6/Xa7IT8iIiIiT8NARURERGQnBioiIiIiOzFQEREREdmJgYqIiIjITgxURERERHZioCIiIiKyEwMVERERkZ0YqIiIiIjsxEBFREREZCcGKiIiIiI7MVARERER2YmBioiIiMhODFREREREdmKgIiIiIrITAxURERGRnRioiIiIiOzEQEVERERkJwYqIiIiIjsxUBERERHZiYGKiIiIyE4MVERERER2YqAiIiIishMDFREREZGdGKiIiIiI7MRARURERGQnBioiIiIiOzFQEREREdmJgYqIiIjITgxURERERHZioCIiIiKyk1sGqjVr1iA2NhZKpRIJCQnYv3+/Vcdt3boVgiBgwoQJzi2QiIiI6Co+1uwUFhZm00kFQcChQ4fQtWtXmwvatm0bUlNTkZWVhYSEBGRmZmLMmDHIz89HREREs8edOnUKzz77LEaMGGHzNYmIiIjsIYiiKLa2k0wmQ2ZmJtRqdasnFEURTz75JH766SfccMMNNheUkJCAm2++GatXrwYAGI1GxMTEYPbs2Xj++eebPMZgMOD222/HX//6V3zzzTcoKyvD9u3brb6mVquFWq1GeXk5goODba6ZiIiI2p47/X5b1UMFAA899FCLPURXmz179nUVo9frcfDgQaSlpUnbZDIZkpKSsG/fvmaPW7RoESIiIjB16lR88803rV5Hp9NBp9NJ77Va7XXVS0RERARYGaiMRqNNJ62oqLiuYi5cuACDwQCNRmOxXaPR4Ndff23ymL1792LDhg04fPiw1dfJyMjAyy+/fF01EhEREV3L6knpn376qc3BytkqKiowefJkrFu3DuHh4VYfl5aWhvLycul1+vRpJ1ZJRERE7Z3VQ34TJkyARqPBlClTkJKSgh49eji8mPDwcMjlcpSUlFhsLykpQWRkZKP9CwoKcOrUKYwdO1baZg59Pj4+yM/PR/fu3Rsdp1AooFAoHFw9EREReSure6gKCwvx+OOPY+vWrejduzdGjhyJd955BzU1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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f, ax = compiled_sched.plot_pulse_diagram()\n", "ax.set_xlim(200e-6, 200.4e-6)" ] } ], "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.18" }, "mystnb": { "execution_timeout": 120 }, "source_map": [ 8, 38, 47, 53, 60, 73, 81, 106, 129, 143, 153, 162, 167, 171, 175, 188, 197, 202, 205, 212, 215, 220, 225, 229, 235, 240, 244, 248, 251, 269, 283, 287, 295, 300, 303, 314, 345, 352, 364, 380, 385, 392 ] }, "nbformat": 4, "nbformat_minor": 5 }