{ "cells": [ { "cell_type": "markdown", "id": "f8901cd3", "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 chip, rather than the qubit and the intended operation.\n", "To allow working 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 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 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": "cbba679e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'name': 'Reset q0', 'gate_info': {'unitary': None, 'tex': '$|0\\\\rangle$', 'plot_func': 'quantify_scheduler.visualization.circuit_diagram.reset', 'qubits': ['q0'], 'operation_type': 'reset'}, 'pulse_info': [], 'acquisition_info': [], 'logic_info': {}}" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "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", "\n" ] }, { "cell_type": "markdown", "id": "e5267582", "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": "1a43d7e9", "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.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", "\n" ] }, { "cell_type": "markdown", "id": "53e90789", "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": "1080f6f9", "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.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", "\n" ] }, { "cell_type": "markdown", "id": "f094574c", "metadata": {}, "source": [ "## Schedule creation from the circuit layer (Bell)\n", "\n", "The circuit-level operations can be used to create a `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", "We exemplify this extra layer of abstraction by creating a `schedule` for measuring\n", "`Bell violations`.\n", "\n", "```{note}\n", "Within a single `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": "d88d69dd", "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( # Start at the same time as the other measure\n", " Measure(q1, acq_index=acq_idx),\n", " label=\"M q1 {:.2f} deg\".format(theta),\n", " ref_pt=\"start\",\n", " )\n", "\n", "sched\n", "\n" ] }, { "cell_type": "markdown", "id": "8cf93381", "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": "bddd38e4", "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==\n", "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", "\n" ] }, { "cell_type": "markdown", "id": "e96df887", "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": "65a6711c", "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_qs0111/lib/python3.9/site-packages/quantify_scheduler/schedules/schedule.py:293\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 286\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 287\u001b[0m \u001b[38;5;66;03m# NB imported here to avoid circular import\u001b[39;00m\n\u001b[1;32m 288\u001b[0m \u001b[38;5;66;03m# pylint: disable=import-outside-toplevel\u001b[39;00m\n\u001b[1;32m 289\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;01mvisualization\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 290\u001b[0m pulse_diagram_matplotlib,\n\u001b[1;32m 291\u001b[0m )\n\u001b[0;32m--> 293\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mpulse_diagram_matplotlib\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 294\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 295\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 296\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 297\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 298\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 299\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 300\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 301\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 302\u001b[0m \u001b[38;5;66;03m# NB imported here to avoid circular import\u001b[39;00m\n\u001b[1;32m 303\u001b[0m \u001b[38;5;66;03m# pylint: disable=import-outside-toplevel\u001b[39;00m\n\u001b[1;32m 304\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;01mvisualization\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 305\u001b[0m pulse_diagram_plotly,\n\u001b[1;32m 306\u001b[0m )\n", "File \u001b[0;32m~/.local/opt/conda/envs/docs_qs0111/lib/python3.9/site-packages/quantify_scheduler/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_qs0111/lib/python3.9/site-packages/quantify_scheduler/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()\n" ] }, { "cell_type": "markdown", "id": "fdc2f88a", "metadata": {}, "source": [ "And similarly for the {code}`timing_table`:" ] }, { "cell_type": "code", "execution_count": 7, "id": "fdc41dbe", "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_qs0111/lib/python3.9/site-packages/quantify_scheduler/schedules/schedule.py:368\u001b[0m, in \u001b[0;36mScheduleBase.timing_table\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 365\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 366\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 367\u001b[0m \u001b[38;5;66;03m# when this exception is encountered\u001b[39;00m\n\u001b[0;32m--> 368\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 369\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 371\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\n" ] }, { "cell_type": "markdown", "id": "9e99947c", "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": "15668356", "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())\n", "\n" ] }, { "cell_type": "markdown", "id": "4b3dbbbd", "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": "03bf9678", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'quantify_scheduler.backends.circuit_to_device.compile_circuit_to_device'" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "device_cfg.backend\n", "\n" ] }, { "cell_type": "markdown", "id": "4645f1df", "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": "aeef7782", "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": [ "from quantify_scheduler.helpers.importers import import_python_object_from_string\n", "\n", "help(import_python_object_from_string(device_cfg.backend))\n", "\n" ] }, { "cell_type": "markdown", "id": "f4003574", "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": "081aa230", "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", "\n" ] }, { "cell_type": "markdown", "id": "e9055d2b", "metadata": {}, "source": [ "For every qubit and edge we can investigate the contained parameters." ] }, { "cell_type": "code", "execution_count": 12, "id": "f779cd40", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'reset': OperationCompilationConfig(factory_func='quantify_scheduler.operations.pulse_library.IdlePulse', factory_kwargs={'duration': 0.0002}, gate_info_factory_kwargs=None), 'Rxy': OperationCompilationConfig(factory_func='quantify_scheduler.operations.pulse_factories.rxy_drag_pulse', 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='quantify_scheduler.operations.pulse_library.SoftSquarePulse', factory_kwargs={'amp': 0.23, 'duration': 4e-09, 'port': 'q0:fl', 'clock': 'cl0.baseband'}, gate_info_factory_kwargs=None), 'measure': OperationCompilationConfig(factory_func='quantify_scheduler.operations.measurement_factories.dispersive_measurement', 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", "\n" ] }, { "cell_type": "code", "execution_count": 13, "id": "bb599da2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'q0_q1': {'CZ': OperationCompilationConfig(factory_func='quantify_scheduler.operations.pulse_factories.composite_square_pulse', 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", "\n" ] }, { "cell_type": "code", "execution_count": 14, "id": "8f865024", "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", "\n" ] }, { "cell_type": "markdown", "id": "1c915003", "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": "fa7c4a9e", "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", "\n" ] }, { "cell_type": "markdown", "id": "06019085", "metadata": {}, "source": [ "### Device compilation\n", "\n", "Now that we went through the different components of the configuration file, let's use\n", "it to compile our previously defined schedule.\n", "The {func}`~quantify_scheduler.compilation.device_compile` function takes care of this task and adds pulse information based\n", "on the configuration file, as discussed above.\n", "It also determines the timing of the different pulses in the schedule. Also see {ref}`Device and Hardware compilation combined`." ] }, { "cell_type": "code", "execution_count": 16, "id": "1e17f4db", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_23766/657737765.py:3: FutureWarning: Function quantify_scheduler.compilation.device_compile() is deprecated and will be removed in quantify-scheduler-0.9.0. Use the `QuantifyCompiler.compile` method instead. See the user guide section on compilers for details.\n", " pulse_sched = device_compile(sched, device_cfg)\n" ] } ], "source": [ "from quantify_scheduler.compilation import device_compile\n", "\n", "pulse_sched = device_compile(sched, device_cfg)\n", "\n" ] }, { "cell_type": "markdown", "id": "441852aa", "metadata": {}, "source": [ "Now that the timings have been determined, we can show the first few rows of the {code}`timing_table`:" ] }, { "cell_type": "code", "execution_count": 17, "id": "411d89b4", "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 nsX90(qubit='q0')0
3q1:mwq1.01False200,000.0 ns20.0 nsX90(qubit='q1')0
4q0:flcl0.basebandFalse200,020.0 ns20.0 nsCZ(qC='q0',qT='q1')0
5Noneq0.01False200,020.0 ns0.0 nsCZ(qC='q0',qT='q1')1
6Noneq1.01False200,020.0 ns0.0 nsCZ(qC='q0',qT='q1')2
7q0:mwq0.01False200,040.0 ns20.0 nsRxy(theta=0, phi=0, qubit='q0')0
8Noneq0.roFalse200,060.0 ns0.0 nsMeasure('q0', acq_index=0, acq_protocol=\"None\", bin_mode=None)0
9q0:resq0.roFalse200,060.0 ns160.0 nsMeasure('q0', acq_index=0, acq_protocol=\"None\", bin_mode=None)1
10q0:resq0.roTrue200,180.0 ns300.0 nsMeasure('q0', acq_index=0, acq_protocol=\"None\", bin_mode=None)0
\n" ], "text/plain": [ "" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pulse_sched.timing_table.hide(slice(11, None), axis=\"index\").hide(\n", " \"waveform_op_id\", axis=\"columns\"\n", ")\n", "\n" ] }, { "cell_type": "markdown", "id": "9bfaf56d", "metadata": {}, "source": [ "And since all pulse information has been determined, we can show the pulse diagram as\n", "well:" ] }, { "cell_type": "code", "execution_count": 18, "id": "6f720283", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.0004005, 0.0004006)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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rrzyShUUFGjWrFl68803dfXVV0uSXnvtNXXo0EGfffaZLrvsMi1btkzbt2/XRx99pISEBKWmpuovf/mLJkyYoEcffVShoaE1UjvMxTQN9uIpKVFlUFXACg2nJRgAzsTvaRouueQS/fGPf1RSUpKGDBmi7OzsGiyrSkFBgSR5uxs3bdqkiooKZWRkeNdp3769WrRoobVr10qS1q5dq06dOvl0Gfbv31+FhYX66quvTrmfsrIyFRYW+jxgrVBnVRAmYNmDp6RElcFV3YKhDQhYAHAmfgesWbNmKTc3V88//7z27dunvn37qk2bNnryySe1f/9+0wvzeDzKyspSr169dPHFF0uScnNzFRoaqtjYWJ91ExISlJub613np+Gq+vXq105l8uTJiomJ8T6Sk5NNPhoEijFY9lLVRfhjwKIFCwDOKKCJRiMiIjRs2DBlZ2dr586duu222/TSSy+pZcuWGjBggBYsWGBaYaNGjdK2bds0f/5807b5SyZOnKiCggLvY9++fTW+T5weXYT24ikpkdvbRejfdC0AUJ+d9UzurVu31uOPP669e/fqrbfe0meffaZbbrnFlKJGjx6txYsXa+XKlWrevLl3eWJiosrLy5Wfn++zfl5enhITE73r5OXlnfR69WunEhYWpujoaJ8HrMUgd3up6iJkDBYA+OucbpWTnZ2tYcOGadiwYXK73brnnnvOqRjDMDR69Gi98847WrFihVq1auXzerdu3RQSEqLly5d7l+3YsUM5OTnq2bOnJKlnz57aunWrDh065F3nww8/VHR0tDp27HhO9aH2ELDsxaeLkDFYAHBGAX9Tfv/995ozZ47mzJmjb7/9VldccYVeeOEF3XLLLQoPDz+nYkaNGqU333xT7777rqKiorxjpmJiYhQeHq6YmBgNHz5cY8eOVVxcnKKjozVmzBj17NlTl112mSSpX79+6tixo4YMGaKnn35aubm5euihhzRq1CiFhYWdU32oPd4uQsZg2cJPryIMowULAM7I72/K//f//p9mz56t5cuXKz4+XkOHDtVvfvMbtWnTxrRiZs6cKUlKT0/3Wf7aa69p2LBhkqRnn31WTqdTN910k89Eo9WCgoK0ePFijRw5Uj179lRkZKSGDh2qxx57zLQ6UfOqW7DKPdwqxw6qWrCqus7pIgSAM/P7m/J///d/NWDAAL3zzju67rrr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W25Ru3btNGHCBH399dfKy8uTJOXk5KhXr17q1KmTLrzwQl1//fW68sorTf1MANgfAQuArXXu3Nn756CgIDVq1EidOnXyLktISJAkHTp0SJL0xRdfaOXKld4xXS6XS+3bt5ck7d69+5z2X72v0+3/vvvu0+OPP65evXrpkUce8QY/APULAQuArYWEhPg8dzgcPsuqr070eDySpKKiIg0cOFBbtmzxeezateusWpJOta/T7f/uu+/Wt99+qyFDhmjr1q3q3r27ZsyYEfB+AdRtBCwA55WuXbvqq6++UsuWLdWmTRufR01OwfBTycnJ+u1vf6sFCxZo3LhxeuWVV2plvwDsg4AF4LwyatQoHT16VLfffrs2bNig3bt364MPPtBdd90lt9td4/vPysrSBx98oD179mjz5s1auXKlOnToUOP7BWAvBCwA55WmTZvqk08+kdvtVr9+/dSpUydlZWUpNjZWTmfNf+W53W6NGjVKHTp00DXXXKN27drphRdeqPH9ArAXh2HVtMkAYBNz5sxRVlaW8vPza2V/jz76qBYuXKgtW7bUyv4A1D5asABAUkFBgVwulyZMmFBj+8jJyZHL5dKTTz5ZY/sAYA+0YAGo944fP+6dxyo2NlaNGzeukf1UVlZq7969kqSwsDAlJyfXyH4AWI+ABQAAYDK6CAEAAExGwAIAADAZAQsAAMBkBCwAAACTEbAAAABMRsACAAAwGQELAADAZAQsAAAAk/1/NdDZuiVfTLQAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f, ax = pulse_sched.plot_pulse_diagram()\n", "ax.set_xlim(0.4005e-3, 0.4006e-3)\n", "\n" ] }, { "cell_type": "markdown", "id": "d30b69f1", "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": 19, "id": "56b48254", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(, ['qubit'])" ] }, "execution_count": 19, "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", "\n" ] }, { "cell_type": "markdown", "id": "7298bf0e", "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": 20, "id": "00faea99", "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", "\n" ] }, { "cell_type": "markdown", "id": "16228f7b", "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\n", "parameters need to be specified 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": 21, "id": "0d61371d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "DeviceCompilationConfig(backend='quantify_scheduler.backends.circuit_to_device.compile_circuit_to_device', clocks={'qubit.01': 6000000000.0, 'qubit.12': nan, 'qubit.ro': nan}, elements={'qubit': {'reset': OperationCompilationConfig(factory_func='quantify_scheduler.operations.pulse_library.IdlePulse', factory_kwargs={'duration': 0.0002}, gate_info_factory_kwargs=None), 'Rxy': OperationCompilationConfig(factory_func='quantify_scheduler.operations.pulse_factories.rxy_drag_pulse', 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='quantify_scheduler.operations.measurement_factories.dispersive_measurement', 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", "\n" ] }, { "cell_type": "markdown", "id": "78bf140e", "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": 22, "id": "30679fed", "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", "# Multiples of 4 ns need to be used due to sampling rate of the Qblox modules\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, duration, \"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( # Start at the same time as the other measure\n", " Measure(q1, acq_index=acq_idx),\n", " label=f\"M q1 {acq_idx}\",\n", " ref_pt=\"start\",\n", " )\n", "\n", " acq_idx += 1\n", " \n", "# Manually add the clocks\n", "sched.add_resources([ClockResource(\"q0.01\", 6.02e9), ClockResource(\"q0.ro\", 4.2e9), ClockResource(\"q1.01\", 6.02e9), ClockResource(\"q1.ro\", 4.2e9)])\n", "\n" ] }, { "cell_type": "code", "execution_count": 23, "id": "5c2e3a67", "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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\n", "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", "\n" ] }, { "cell_type": "markdown", "id": "dca21afe", "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", "```{warning}\n", "When adding a Pulse to a schedule, the clock is not automatically added to the\n", "resources of the schedule. It may be necessary to add this clock manually, as in\n", "the final line of the example above.\n", "```\n", "\n", "### Device and Hardware compilation combined\n", "\n", "Rather than first using {func}`~quantify_scheduler.compilation.device_compile` and subsequently\n", "{func}`~quantify_scheduler.compilation.hardware_compile`, the two function calls can be combined using\n", "{func}`~quantify_scheduler.compilation.qcompile`." ] }, { "cell_type": "code", "execution_count": 24, "id": "4c7b9e17", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_23766/652173263.py:14: FutureWarning: Function quantify_scheduler.compilation.qcompile() is deprecated and will be removed in quantify-scheduler-0.9.0. Use the `QuantifyCompiler.compile` method instead. See the user guide section on compilers for details.\n", " compiled_sched = qcompile(\n" ] } ], "source": [ "from quantify_scheduler.compilation import qcompile\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", "compiled_sched = qcompile(\n", " schedule=sched, device_cfg=dut.generate_device_config(), hardware_cfg=None\n", ")\n", "\n" ] }, { "cell_type": "markdown", "id": "ab3fe945", "metadata": {}, "source": [ "So, finally, we can show the timing table associated to the chevron schedule and plot\n", "its pulse diagram:" ] }, { "cell_type": "code", "execution_count": 25, "id": "4930e208", "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": 25, "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", "\n" ] }, { "cell_type": "code", "execution_count": 26, "id": "a2189977", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.0002, 0.0002004)" ] }, "execution_count": 26, "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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\n", "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, 37, 48, 54, 63, 76, 86, 111, 136, 150, 162, 171, 179, 183, 191, 204, 216, 221, 226, 233, 240, 245, 252, 256, 264, 271, 277, 281, 286, 296, 303, 307, 314, 319, 324, 342, 358, 362, 372, 378, 383, 394, 428, 437, 454, 474, 479, 488 ] }, "nbformat": 4, "nbformat_minor": 5 }