{ "cells": [ { "cell_type": "markdown", "id": "b95a98b8", "metadata": {}, "source": [ "(sec-tutorial-ops-qubits)=\n", "\n", "# Tutorial: Operations and Qubits\n", "\n", "```{seealso}\n", "The complete source code of this tutorial can be found in\n", "\n", "{nb-download}`Operations and Qubits.ipynb`\n", "```\n", "\n", "## Gates, measurements and qubits\n", "\n", "In the previous tutorials, experiments were created on the {ref}`quantum-device level`. On this level,\n", "operations are defined in terms of explicit signals and locations on the chip, rather than the qubit and the intended operation.\n", "To work at a greater level of abstraction, `quantify-scheduler` allows creating operations on the\n", "{ref}`quantum-circuit level`.\n", "Instead of signals, clocks, and ports, operations are defined by the effect they have on specific qubits. This representation of the schedules can be compiled to the quantum-device level to create the pulse schemes.\n", "\n", "In this tutorial we show how to define operations on the {ref}`quantum-circuit level`, combine them into schedules, and show their circuit-level visualization.\n", "We go through the configuration file needed to compile the schedule to the quantum-device level and show how these configuration files can be created automatically and dynamically.\n", "Finally, we showcase the hybrid nature of `quantify-scheduler`, allowing the scheduling of circuit-level and device-level operations side by side in the same schedule.\n", "\n", "Many of the gates used in the circuit layer description are defined in\n", "{class}`~quantify_scheduler.operations.gate_library` such as {class}`~quantify_scheduler.operations.gate_library.Reset`, {class}`~quantify_scheduler.operations.gate_library.X90` and\n", "{class}`~quantify_scheduler.operations.gate_library.Measure`.\n", "Operations are instantiated by providing them with the name of the qubit(s) on which\n", "they operate:" ] }, { "cell_type": "code", "execution_count": 1, "id": "4f86574e", "metadata": {}, "outputs": [], "source": [ "from quantify_scheduler.operations import CZ, Measure, Reset, X90\n", "\n", "q0, q1 = (\"q0\", \"q1\")\n", "X90(q0)\n", "Measure(q1)\n", "CZ(q0, q1)\n", "Reset(q0);\n" ] }, { "cell_type": "markdown", "id": "57b81d5a", "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": "7027fbc1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'acquisition_info': [],\n", " 'gate_info': {'device_elements': ['q0'],\n", " 'device_overrides': {},\n", " 'operation_type': 'Rxy',\n", " 'phi': 0.0,\n", " 'plot_func': 'quantify_scheduler.schedules._visualization.circuit_diagram.gate_box',\n", " 'tex': '$R_{xy}^{45, 0}$',\n", " 'theta': 45.0,\n", " 'unitary': array([[0.92387953+0.j , 0. -0.38268343j],\n", " [0. -0.38268343j, 0.92387953+0.j ]])},\n", " 'logic_info': {},\n", " 'name': \"Rxy(45, 0, 'q0')\",\n", " 'pulse_info': []}\n" ] } ], "source": [ "from pprint import pprint\n", "from quantify_scheduler.operations import Rxy\n", "\n", "rxy45 = Rxy(theta=45.0, phi=0.0, qubit=q0)\n", "pprint(rxy45.data)\n" ] }, { "cell_type": "markdown", "id": "892159e3", "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": "9dbf8545", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'device_elements': {'description': 'A list of strings indicating the '\n", " 'device_elements the gate acts on. Valid '\n", " 'device_elements are strings that appear '\n", " 'in the device_config.json file.',\n", " 'type': 'array'},\n", " 'operation_type': {'description': 'Defines what class of operations this gate '\n", " 'refers to (e.g. Rxy, CZ etc.).',\n", " 'type': 'string'},\n", " 'plot_func': {'description': 'reference to a function for plotting this '\n", " 'operation. If not specified, defaults to using '\n", " ':func:`~quantify_scheduler.schedules._visualization.circuit_diagram.gate_box`.',\n", " 'type': ['string', 'null']},\n", " 'qubits': {'description': 'Deprecated. A list of strings indicating the '\n", " 'qubits the gate acts on. Valid qubits are strings '\n", " 'that appear in the device_config.json file.',\n", " 'type': 'array'},\n", " 'symmetric': {'description': 'A boolean to indicate whether a two device '\n", " 'elements is symmetric. This is used in the '\n", " 'device config compilation stage. By default, it '\n", " 'is set as False',\n", " 'type': 'boolean'},\n", " 'tex': {'description': 'latex snippet for plotting', 'type': 'string'},\n", " 'unitary': {'description': 'A unitary matrix describing the operation.'}}\n" ] } ], "source": [ "import importlib.resources\n", "import json\n", "from quantify_scheduler import schemas\n", "\n", "operation_schema = json.loads(importlib.resources.read_text(schemas, \"operation.json\"))\n", "pprint(operation_schema[\"properties\"][\"gate_info\"][\"properties\"])\n" ] }, { "cell_type": "markdown", "id": "895a4f7c", "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": "3d2301fd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Schedule \"Bell experiment\" containing (66) 147 (unique) operations." ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "from quantify_scheduler import Schedule\n", "from quantify_scheduler.operations import CZ, Measure, Reset, Rxy, X90\n", "\n", "sched = Schedule(\"Bell experiment\")\n", "\n", "for acq_idx, theta in enumerate(np.linspace(0, 360, 21)):\n", " sched.add(Reset(q0, q1))\n", " sched.add(X90(q0))\n", " sched.add(X90(q1), ref_pt=\"start\") # Start at the same time as the other X90\n", " sched.add(CZ(q0, q1))\n", " sched.add(Rxy(theta=theta, phi=0, qubit=q0))\n", "\n", " sched.add(Measure(q0, acq_index=acq_idx), label=\"M q0 {:.2f} deg\".format(theta))\n", " sched.add( \n", " Measure(q1, acq_index=acq_idx),\n", " label=\"M q1 {:.2f} deg\".format(theta),\n", " ref_pt=\"start\", # Start at the same time as the other measure\n", " )\n", "\n", "sched\n" ] }, { "cell_type": "markdown", "id": "6f0fbed0", "metadata": {}, "source": [ "By scheduling 7 operations for 21 different values for {code}`theta` we indeed get a schedule containing 7\\*21=147 operations. To minimize the size of the schedule, identical operations are stored only once. For example, the {class}`~quantify_scheduler.operations.gate_library.CZ` operation is stored only once but used 21 times, which leaves only 66 unique operations in the schedule.\n", "\n", "```{note}\n", "The acquisitions are different for every iteration due to their different {code}`acq_index`. The {class}`~quantify_scheduler.operations.gate_library.Rxy`-gate rotates over a different angle every iteration and must therefore also be different for every iteration (except for the last since {math}`R^{360}=R^0`). Hence the number of unique operations is 3\\*21-1+4=66.\n", "```\n", "\n", "(sec-tutorial-ops-qubits-vis)=\n", "## Visualizing the quantum circuit\n", "\n", "We can directly visualize the created schedule on the\n", "{ref}`quantum-circuit level` with the {meth}`~quantify_scheduler.schedules.schedule.ScheduleBase.plot_circuit_diagram` method.\n", "This visualization shows every operation on a line representing the different qubits." ] }, { "cell_type": "code", "execution_count": 5, "id": "6c3f6d90", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "_, ax = sched.plot_circuit_diagram()\n", "# all gates are plotted, but it doesn't all fit in a matplotlib figure.\n", "# Therefore we use :code:`set_xlim` to limit the number of gates shown.\n", "ax.set_xlim(-0.5, 9.5)\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "0b3f5607", "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": "61d8243f", "metadata": { "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "KeyError", "evalue": "'abs_time'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[6], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43msched\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mplot_pulse_diagram\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/Documents/qblox/quantify-scheduler/quantify_scheduler/schedules/schedule.py:424\u001b[0m, in \u001b[0;36mScheduleBase.plot_pulse_diagram\u001b[0;34m(self, port_list, sampling_rate, modulation, modulation_if, plot_backend, x_range, combine_waveforms_on_same_port, **backend_kwargs)\u001b[0m\n\u001b[1;32m 420\u001b[0m \u001b[38;5;66;03m# NB imported here to avoid circular import\u001b[39;00m\n\u001b[1;32m 422\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21;01mquantify_scheduler\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mschedules\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_visualization\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpulse_diagram\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m sample_schedule\n\u001b[0;32m--> 424\u001b[0m sampled_pulses_and_acqs \u001b[38;5;241m=\u001b[39m \u001b[43msample_schedule\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 425\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 426\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 427\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 428\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 429\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 430\u001b[0m \u001b[43m \u001b[49m\u001b[43mx_range\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mx_range\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 431\u001b[0m \u001b[43m \u001b[49m\u001b[43mcombine_waveforms_on_same_port\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcombine_waveforms_on_same_port\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 432\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 434\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 435\u001b[0m \u001b[38;5;66;03m# NB imported here to avoid circular import\u001b[39;00m\n\u001b[1;32m 437\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21;01mquantify_scheduler\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mschedules\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_visualization\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpulse_diagram\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[1;32m 438\u001b[0m pulse_diagram_matplotlib,\n\u001b[1;32m 439\u001b[0m )\n", "File \u001b[0;32m~/Documents/qblox/quantify-scheduler/quantify_scheduler/schedules/_visualization/pulse_diagram.py:442\u001b[0m, in \u001b[0;36msample_schedule\u001b[0;34m(schedule, port_list, modulation, modulation_if, sampling_rate, x_range, combine_waveforms_on_same_port)\u001b[0m\n\u001b[1;32m 439\u001b[0m pulse_infos: \u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, \u001b[38;5;28mlist\u001b[39m[ScheduledInfo]] \u001b[38;5;241m=\u001b[39m defaultdict(\u001b[38;5;28mlist\u001b[39m)\n\u001b[1;32m 440\u001b[0m acq_infos: \u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, \u001b[38;5;28mlist\u001b[39m[ScheduledInfo]] \u001b[38;5;241m=\u001b[39m defaultdict(\u001b[38;5;28mlist\u001b[39m)\n\u001b[0;32m--> 442\u001b[0m \u001b[43m_extract_schedule_infos\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 443\u001b[0m \u001b[43m \u001b[49m\u001b[43mschedule\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 444\u001b[0m \u001b[43m \u001b[49m\u001b[43mport_list\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 445\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 446\u001b[0m \u001b[43m \u001b[49m\u001b[43moffset_infos\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 447\u001b[0m \u001b[43m \u001b[49m\u001b[43mpulse_infos\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 448\u001b[0m \u001b[43m \u001b[49m\u001b[43macq_infos\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 449\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 451\u001b[0m x_min, x_max \u001b[38;5;241m=\u001b[39m x_range\n\u001b[1;32m 453\u001b[0m sampled_pulses \u001b[38;5;241m=\u001b[39m get_sampled_pulses_from_voltage_offsets(\n\u001b[1;32m 454\u001b[0m schedule\u001b[38;5;241m=\u001b[39mschedule,\n\u001b[1;32m 455\u001b[0m offset_infos\u001b[38;5;241m=\u001b[39moffset_infos,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 459\u001b[0m modulation_if\u001b[38;5;241m=\u001b[39mmodulation_if,\n\u001b[1;32m 460\u001b[0m )\n", "File \u001b[0;32m~/Documents/qblox/quantify-scheduler/quantify_scheduler/schedules/_visualization/pulse_diagram.py:339\u001b[0m, in \u001b[0;36m_extract_schedule_infos\u001b[0;34m(operation, port_list, time_offset, offset_infos, pulse_infos, acq_infos)\u001b[0m\n\u001b[1;32m 337\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m schedulable \u001b[38;5;129;01min\u001b[39;00m operation\u001b[38;5;241m.\u001b[39mschedulables\u001b[38;5;241m.\u001b[39mvalues():\n\u001b[1;32m 338\u001b[0m inner_operation \u001b[38;5;241m=\u001b[39m operation\u001b[38;5;241m.\u001b[39moperations[schedulable[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moperation_id\u001b[39m\u001b[38;5;124m\"\u001b[39m]]\n\u001b[0;32m--> 339\u001b[0m abs_time \u001b[38;5;241m=\u001b[39m \u001b[43mschedulable\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mabs_time\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\n\u001b[1;32m 340\u001b[0m _extract_schedule_infos(\n\u001b[1;32m 341\u001b[0m inner_operation,\n\u001b[1;32m 342\u001b[0m port_list,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 346\u001b[0m acq_infos,\n\u001b[1;32m 347\u001b[0m )\n\u001b[1;32m 348\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(operation, ConditionalOperation):\n", "File \u001b[0;32m~/miniforge3/envs/dev39/lib/python3.9/collections/__init__.py:1058\u001b[0m, in \u001b[0;36mUserDict.__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 1056\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m__missing__\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[1;32m 1057\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__missing__\u001b[39m(\u001b[38;5;28mself\u001b[39m, key)\n\u001b[0;32m-> 1058\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key)\n", "\u001b[0;31mKeyError\u001b[0m: 'abs_time'" ] } ], "source": [ "sched.plot_pulse_diagram()" ] }, { "cell_type": "markdown", "id": "8b450836", "metadata": {}, "source": [ "And similarly for the {code}`timing_table`:" ] }, { "cell_type": "code", "execution_count": 7, "id": "094a45b3", "metadata": { "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "ValueError", "evalue": "Absolute time has not been determined yet. Please compile your schedule.", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[7], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43msched\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtiming_table\u001b[49m\n", "File \u001b[0;32m~/Documents/qblox/quantify-scheduler/quantify_scheduler/schedules/schedule.py:613\u001b[0m, in \u001b[0;36mScheduleBase.timing_table\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 519\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 520\u001b[0m \u001b[38;5;124;03mA styled pandas dataframe containing the absolute timing of pulses and acquisitions in a schedule.\u001b[39;00m\n\u001b[1;32m 521\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 610\u001b[0m \n\u001b[1;32m 611\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m \u001b[38;5;66;03m# noqa: E501\u001b[39;00m\n\u001b[1;32m 612\u001b[0m timing_table_list \u001b[38;5;241m=\u001b[39m []\n\u001b[0;32m--> 613\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_generate_timing_table_list\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtiming_table_list\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 614\u001b[0m timing_table \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mconcat(timing_table_list, ignore_index\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m 615\u001b[0m timing_table \u001b[38;5;241m=\u001b[39m timing_table\u001b[38;5;241m.\u001b[39msort_values(by\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mabs_time\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", "File \u001b[0;32m~/Documents/qblox/quantify-scheduler/quantify_scheduler/schedules/schedule.py:474\u001b[0m, in \u001b[0;36mScheduleBase._generate_timing_table_list\u001b[0;34m(cls, operation, time_offset, timing_table_list, operation_id)\u001b[0m\n\u001b[1;32m 471\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m schedulable \u001b[38;5;129;01min\u001b[39;00m operation\u001b[38;5;241m.\u001b[39mschedulables\u001b[38;5;241m.\u001b[39mvalues():\n\u001b[1;32m 472\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 473\u001b[0m \u001b[38;5;66;03m# when this exception is encountered\u001b[39;00m\n\u001b[0;32m--> 474\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 475\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAbsolute time has not been determined yet. Please compile your schedule.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 476\u001b[0m )\n\u001b[1;32m 477\u001b[0m \u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39m_generate_timing_table_list(\n\u001b[1;32m 478\u001b[0m operation\u001b[38;5;241m.\u001b[39moperations[schedulable[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moperation_id\u001b[39m\u001b[38;5;124m\"\u001b[39m]],\n\u001b[1;32m 479\u001b[0m time_offset \u001b[38;5;241m+\u001b[39m schedulable[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mabs_time\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n\u001b[1;32m 480\u001b[0m timing_table_list,\n\u001b[1;32m 481\u001b[0m schedulable[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moperation_id\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n\u001b[1;32m 482\u001b[0m )\n\u001b[1;32m 483\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(operation, LoopOperation):\n", "\u001b[0;31mValueError\u001b[0m: Absolute time has not been determined yet. Please compile your schedule." ] } ], "source": [ "sched.timing_table" ] }, { "cell_type": "markdown", "id": "3f655f09", "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": "c4ad2695", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['clocks', 'elements', 'edges', 'scheduling_strategy', 'compilation_passes']" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from quantify_scheduler.backends.circuit_to_device import DeviceCompilationConfig\n", "from quantify_scheduler.schemas import example_transmon_cfg\n", "\n", "device_cfg = DeviceCompilationConfig.model_validate(example_transmon_cfg)\n", "\n", "list(device_cfg.model_dump())" ] }, { "cell_type": "markdown", "id": "f7b27e7b", "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": "72cb8c10", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[SimpleNodeConfig(name='circuit_to_device', compilation_func=)]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "device_cfg.compilation_passes\n" ] }, { "cell_type": "markdown", "id": "7d9efe2d", "metadata": {}, "source": [ "The compilation passes of the device configuration specifies which function(s) will be used to \n", "compile the {class}`~.Schedule` to the {ref}`sec-user-guide-quantum-device`. In other words, \n", "it specifies how to interpret the qubit parameters present in the device configuration and achieve\n", "the required gates. Let us briefly investigate the compilation function:" ] }, { "cell_type": "code", "execution_count": 10, "id": "5d2e11f5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on function compile_circuit_to_device_with_config_validation in module quantify_scheduler.backends.circuit_to_device:\n", "\n", "compile_circuit_to_device_with_config_validation(schedule: 'Schedule', config: 'CompilationConfig') -> 'Schedule'\n", " Add pulse information to all gates in the schedule.\n", " \n", " Before calling this function, the schedule can contain abstract operations (gates or\n", " measurements). This function adds pulse and acquisition information with respect to\n", " ``config`` as they are expected to arrive to device (latency or distortion corrections\n", " are not taken into account).\n", " \n", " From a point of view of :ref:`sec-compilation`, this function converts a schedule\n", " defined on a quantum-circuit layer to a schedule defined on a quantum-device layer.\n", " \n", " Parameters\n", " ----------\n", " schedule\n", " The schedule to be compiled.\n", " config\n", " Compilation config for\n", " :class:`~quantify_scheduler.backends.graph_compilation.QuantifyCompiler`, of\n", " which only the :attr:`.CompilationConfig.device_compilation_config`\n", " is used in this compilation step.\n", " \n", " Returns\n", " -------\n", " :\n", " The modified ``schedule`` with pulse information added to all gates, or the unmodified\n", " schedule if circuit to device compilation is not necessary.\n", "\n" ] } ], "source": [ "help(device_cfg.compilation_passes[0].compilation_func)\n" ] }, { "cell_type": "markdown", "id": "8fc8047c", "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": "d51606c7", "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": "d3f3ca79", "metadata": {}, "source": [ "For every qubit and edge, we can investigate the contained parameters." ] }, { "cell_type": "code", "execution_count": 12, "id": "2589bf21", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'reset': OperationCompilationConfig(factory_func=, factory_kwargs={'duration': 0.0002}, gate_info_factory_kwargs=None), 'Rxy': OperationCompilationConfig(factory_func=, factory_kwargs={'amp180': 0.32, 'motzoi': 0.45, 'port': 'q0:mw', 'clock': 'q0.01', 'duration': 2e-08}, gate_info_factory_kwargs=['theta', 'phi']), 'Rz': OperationCompilationConfig(factory_func=, factory_kwargs={'clock': 'q0.01'}, gate_info_factory_kwargs=['theta']), 'H': OperationCompilationConfig(factory_func=, factory_kwargs={'qubit': 'q0'}, gate_info_factory_kwargs=None), 'measure': OperationCompilationConfig(factory_func=, factory_kwargs={'port': 'q0:res', 'clock': 'q0.ro', 'pulse_type': 'SquarePulse', 'pulse_amp': 0.25, 'pulse_duration': 1.6e-07, 'acq_delay': 1.2e-07, 'acq_duration': 3e-07, 'acq_channel': 0, 'acq_rotation': 0, 'acq_threshold': 0, 'freq': None}, gate_info_factory_kwargs=['acq_channel_override', 'acq_index', 'bin_mode', 'acq_protocol'])}\n", "{'amp180': 0.32, 'motzoi': 0.45, 'port': 'q0:mw', 'clock': 'q0.01', 'duration': 2e-08}\n" ] } ], "source": [ "print(device_cfg.elements[\"q0\"])\n", "print(device_cfg.elements[\"q0\"][\"Rxy\"].factory_kwargs)\n" ] }, { "cell_type": "code", "execution_count": 13, "id": "303cd0bc", "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": "c3249575", "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": "836d38ee", "metadata": {}, "source": [ "Lastly, the complete example device configuration (also see {class}`~quantify_scheduler.backends.graph_compilation.DeviceCompilationConfig`):" ] }, { "cell_type": "code", "execution_count": 15, "id": "eb9f3134", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'clocks': {'q0.01': 6020000000.0,\n", " 'q0.ro': 7040000000.0,\n", " 'q1.01': 5020000000.0,\n", " 'q1.ro': 6900000000.0},\n", " 'compilation_passes': [{'compilation_func': 'quantify_scheduler.backends.circuit_to_device.compile_circuit_to_device_with_config_validation',\n", " 'name': 'circuit_to_device'}],\n", " 'edges': {'q0_q1': {'CZ': {'factory_func': 'quantify_scheduler.operations.pulse_factories.composite_square_pulse',\n", " 'factory_kwargs': {'square_amp': 0.5,\n", " 'square_clock': 'cl0.baseband',\n", " 'square_duration': 2e-08,\n", " 'square_port': 'q0:fl',\n", " 'virt_z_child_qubit_clock': 'q1.01',\n", " 'virt_z_child_qubit_phase': 63,\n", " 'virt_z_parent_qubit_clock': 'q0.01',\n", " 'virt_z_parent_qubit_phase': 44}}}},\n", " 'elements': {'q0': {'H': {'factory_func': 'quantify_scheduler.operations.composite_factories.hadamard_as_y90z',\n", " 'factory_kwargs': {'qubit': 'q0'}},\n", " 'Rxy': {'factory_func': 'quantify_scheduler.operations.pulse_factories.rxy_drag_pulse',\n", " 'factory_kwargs': {'amp180': 0.32,\n", " 'clock': 'q0.01',\n", " 'duration': 2e-08,\n", " 'motzoi': 0.45,\n", " 'port': 'q0:mw'},\n", " 'gate_info_factory_kwargs': ['theta', 'phi']},\n", " 'Rz': {'factory_func': 'quantify_scheduler.operations.pulse_factories.phase_shift',\n", " 'factory_kwargs': {'clock': 'q0.01'},\n", " 'gate_info_factory_kwargs': ['theta']},\n", " 'measure': {'factory_func': 'quantify_scheduler.operations.measurement_factories.dispersive_measurement_transmon',\n", " 'factory_kwargs': {'acq_channel': 0,\n", " 'acq_delay': 1.2e-07,\n", " 'acq_duration': 3e-07,\n", " 'acq_rotation': 0,\n", " 'acq_threshold': 0,\n", " 'clock': 'q0.ro',\n", " 'freq': None,\n", " 'port': 'q0:res',\n", " 'pulse_amp': 0.25,\n", " 'pulse_duration': 1.6e-07,\n", " 'pulse_type': 'SquarePulse'},\n", " 'gate_info_factory_kwargs': ['acq_channel_override',\n", " 'acq_index',\n", " 'bin_mode',\n", " 'acq_protocol']},\n", " 'reset': {'factory_func': 'quantify_scheduler.operations.pulse_library.IdlePulse',\n", " 'factory_kwargs': {'duration': 0.0002}}},\n", " 'q1': {'Rxy': {'factory_func': 'quantify_scheduler.operations.pulse_factories.rxy_drag_pulse',\n", " 'factory_kwargs': {'amp180': 0.4,\n", " 'clock': 'q1.01',\n", " 'duration': 2e-08,\n", " 'motzoi': 0.25,\n", " 'port': 'q1:mw'},\n", " 'gate_info_factory_kwargs': ['theta', 'phi']},\n", " 'Rz': {'factory_func': 'quantify_scheduler.operations.pulse_factories.phase_shift',\n", " 'factory_kwargs': {'clock': 'q1.01'},\n", " 'gate_info_factory_kwargs': ['theta']},\n", " 'measure': {'factory_func': 'quantify_scheduler.operations.measurement_factories.dispersive_measurement_transmon',\n", " 'factory_kwargs': {'acq_channel': 1,\n", " 'acq_delay': 1.2e-07,\n", " 'acq_duration': 3e-07,\n", " 'acq_rotation': 0,\n", " 'acq_threshold': 0,\n", " 'clock': 'q1.ro',\n", " 'freq': None,\n", " 'port': 'q1:res',\n", " 'pulse_amp': 0.21,\n", " 'pulse_duration': 1.6e-07,\n", " 'pulse_type': 'SquarePulse'},\n", " 'gate_info_factory_kwargs': ['acq_channel_override',\n", " 'acq_index',\n", " 'bin_mode',\n", " 'acq_protocol']},\n", " 'reset': {'factory_func': 'quantify_scheduler.operations.pulse_library.IdlePulse',\n", " 'factory_kwargs': {'duration': 0.0002}}}}}\n" ] } ], "source": [ "pprint(example_transmon_cfg)\n" ] }, { "cell_type": "markdown", "id": "ef3d8290", "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": "5c6af4f1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(, ['qubit'])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from quantify_scheduler import BasicTransmonElement, QuantumDevice\n", "\n", "# First create a device under test\n", "dut = QuantumDevice(\"DUT\")\n", "\n", "# Then create a transmon element\n", "qubit = BasicTransmonElement(\"qubit\")\n", "\n", "# Finally, add the transmon element to the QuantumDevice\n", "dut.add_element(qubit)\n", "dut, dut.elements()\n" ] }, { "cell_type": "markdown", "id": "30ab5365", "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": "013636fe", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['reset', 'rxy', 'measure', 'pulse_compensation', 'ports', 'clock_freqs']\n", "\n", "qubit.reset: ['duration']\n", "qubit.rxy: ['amp180', 'motzoi', 'duration']\n", "qubit.measure: ['pulse_type', 'pulse_amp', 'pulse_duration', 'acq_channel', 'acq_delay', 'integration_time', 'reset_clock_phase', 'acq_weights_a', 'acq_weights_b', 'acq_weights_sampling_rate', 'acq_weight_type', 'acq_rotation', 'acq_threshold', 'num_points']\n", "qubit.pulse_compensation: ['max_compensation_amp', 'time_grid', 'sampling_rate']\n", "qubit.ports: ['microwave', 'flux', 'readout']\n", "qubit.clock_freqs: ['f01', 'f12', 'readout']\n" ] } ], "source": [ "qubit.clock_freqs.f01(6e9)\n", "\n", "print(list(qubit.submodules.keys()))\n", "print()\n", "for submodule_name, submodule in qubit.submodules.items():\n", " print(f\"{qubit.name}.{submodule_name}: {list(submodule.parameters.keys())}\")\n" ] }, { "cell_type": "markdown", "id": "18c2aa82", "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": "3ac495a9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "DeviceCompilationConfig(clocks={'qubit.01': 6000000000.0, 'qubit.12': nan, 'qubit.ro': nan}, elements={'qubit': {'reset': OperationCompilationConfig(factory_func=, factory_kwargs={'duration': 0.0002}, gate_info_factory_kwargs=None), 'Rxy': OperationCompilationConfig(factory_func=, factory_kwargs={'amp180': nan, 'motzoi': 0, 'port': 'qubit:mw', 'clock': 'qubit.01', 'duration': 2e-08, 'reference_magnitude': None}, gate_info_factory_kwargs=['theta', 'phi']), 'Rz': OperationCompilationConfig(factory_func=, factory_kwargs={'clock': 'qubit.01'}, gate_info_factory_kwargs=['theta']), 'H': OperationCompilationConfig(factory_func=, factory_kwargs={'qubit': 'qubit'}, gate_info_factory_kwargs=None), 'pulse_compensation': OperationCompilationConfig(factory_func=None, factory_kwargs={'port': 'qubit:mw', 'clock': 'qubit.01', 'max_compensation_amp': nan, 'time_grid': nan, 'sampling_rate': nan}, gate_info_factory_kwargs=None), 'measure': OperationCompilationConfig(factory_func=, factory_kwargs={'port': 'qubit:res', 'clock': 'qubit.ro', 'pulse_type': 'SquarePulse', 'pulse_amp': 0.25, 'pulse_duration': 3e-07, 'acq_delay': 0, 'acq_duration': 1e-06, 'acq_channel': 0, 'acq_protocol_default': 'SSBIntegrationComplex', 'reset_clock_phase': True, 'reference_magnitude': None, 'acq_weights_a': array([], dtype=float64), 'acq_weights_b': array([], dtype=float64), 'acq_weights_sampling_rate': 1000000000.0, 'acq_rotation': 0, 'acq_threshold': 0, 'num_points': 1, 'freq': None}, gate_info_factory_kwargs=['acq_channel_override', 'acq_index', 'bin_mode', 'acq_protocol', 'feedback_trigger_label'])}}, edges={}, scheduling_strategy='asap', compilation_passes=[SimpleNodeConfig(name='circuit_to_device', compilation_func=), SimpleNodeConfig(name='set_pulse_and_acquisition_clock', compilation_func=), SimpleNodeConfig(name='process_compensation_pulses', compilation_func=), SimpleNodeConfig(name='determine_absolute_timing', compilation_func=)])\n" ] } ], "source": [ "pprint(dut.generate_device_config())\n" ] }, { "cell_type": "markdown", "id": "8b0ebbcd", "metadata": {}, "source": [ "## Specifying pulse magnitudes\n", "\n", "```{warning}\n", "Please note that currently only the user interface of the reference magnitude is defined. The physical magnitude scaling has not yet been implemented in any hardware backend. Therefore, changing the reference magnitude parameter will not have any physical effect in the current version of `quantify-scheduler`.\n", "```\n", "\n", "In the course of a quantum experiment, we may use a variety of electronic pulses of varying amplitudes or powers. The size of the pulses can potentially vary across many orders of magnitude. Additionally, there are many ways in which we might express the magnitude of said pulses (such as amplitude in volts, current in amps or power in dBm), which we may use in different contexts. When generating arbitrary waveforms, it is typical to use a DAC with limited dynamic range, so only a limited range of pulse amplitudes may be generated electronically. Therefore, devices such as variable attenuators or amplifiers are often used to produce pulses over many different orders of magnitude. In quantify, we provide the functionality to express the absolute magnitude of pulses in a range of different units, as well as to define the amplitude of any signal produced by an arbitrary waveform generator.\n", "\n", "In the definition of any pulse operation in `quantify-scheduler`, there will typically be two parameters related to the magnitude of the pulse: the `amplitude` and the `reference_magnitude`. The `amplitude` is a unitless parameter which expresses the amplitude of the signal produced by the DAC of the signal generator, relative to the maximum output level of the DAC. The `amplitude` can vary from -1 to 1, where 1 is the maximum output level. Since `amplitude` is a relative scale, it does not express the absolute power level of the signal that reaches the device. This will be affected by a number of different variables, including any attenuation or gain that is applied to the signal after it produced by the DAC. In order to specify the magnitude of the signal in absolute terms, we have the `reference_magnitude` parameter. This provides a reference scale for the absolute magnitude of the signal when it reaches the device port in question. The reference magnitude can be specified in a number of different units: Volts, current in Amperes or power in dBm or W, depending on the physical implementation of the control pulse. The scaling is defined such that the power/amplitude of a pulse with amplitude 1 will have a value equal to the `reference_magnitude` when it reaches the port. How exactly this scaling is implemented physically will depend on the hardware backend. For example, it may be that a variable attenuation is applied to the pulse in order to scale its power to the right level. Or the gain of an amplifier will be varied. Whenever a quantify schedule is compiled, the quantify compilation backend will automatically compile all instructions necessary for all hardware instruments required to scale the pulse magnitude to the correct level.\n", "\n", "The reference magnitude and amplitude of a pulse can both be configured via QCoDeS parameters in the device element. The pulse amplitude can be configured via a standard QCoDeS parameter, for example `qubit.rxy.amp180` can be used to set the pi-pulse amplitude of an RXY operation of a transmon qubit (between -1 and 1). The reference magnitude is configured slightly differently. Because of the need to express the reference magnitude in a variety of different units in different contexts, the reference magnitude is configured via a custom QCoDeS submodule within the device element - of class {class}`~quantify_scheduler.device_under_test.transmon_element.ReferenceMagnitude`. For example, we may have the submodule `qubit.rxy.reference_magnitude`, which is used to scale the amplitudes of the aforementioned RXY pulses. The {class}`~quantify_scheduler.device_under_test.transmon_element.ReferenceMagnitude` submodule contains three parameters, one for each of the possible units which the reference magnitude may be expressed in: Volts, dBm and Amperes. Only one of these unit parameters may have a defined numerical value at any given time. That is, if `reference_magnitude.dBm` is set to a particular value, both of the other parameters will automatically be set to `nan`. This allows the reference magnitude to be uniquely defined with respect to a particular unit. The defined unit and value of reference magnitude can be inquired via the `get_val_unit` method of the submodule, which returns both the numerical value and the unit in a tuple. If all of the reference magnitude parameters are `nan`, then no reference magnitude is defined and no extra scaling will be applied to the pulse.\n", "\n", "## Mixing pulse and circuit layer operations (Chevron)\n", "\n", "As well as defining our schedules in terms of gates, we can also mix the circuit layer\n", "representation with pulse-level operations.\n", "This can be useful for experiments involving pulses not easily represented by Gates,\n", "such as the Chevron experiment.\n", "In this experiment, we want to vary the length and amplitude of a square pulse between\n", "X gates on a pair of qubits." ] }, { "cell_type": "code", "execution_count": 19, "id": "377e0928", "metadata": {}, "outputs": [], "source": [ "from quantify_scheduler import ClockResource, Schedule\n", "from quantify_scheduler.operations import Measure, Reset, SquarePulse, X, X90\n", "\n", "sched = Schedule(\"Chevron Experiment\")\n", "acq_idx = 0\n", "\n", "for duration in np.linspace(start=20e-9, stop=60e-9, num=6):\n", " for amp in np.linspace(start=0.1, stop=1.0, num=10):\n", " reset = sched.add(Reset(\"q0\", \"q1\"))\n", " sched.add(X(\"q0\"), ref_op=reset, ref_pt=\"end\") # Start at the end of the reset\n", " # We specify a clock for tutorial purposes, Chevron experiments do not necessarily use modulated square pulses\n", " square = sched.add(SquarePulse(amp=amp, duration=duration, port=\"q0:mw\", clock=\"q0.01\"))\n", " sched.add(X90(\"q0\"), ref_op=square) # Start at the end of the square pulse\n", " sched.add(X90(\"q1\"), ref_op=square)\n", " sched.add(Measure(q0, acq_index=acq_idx), label=f\"M q0 {acq_idx}\")\n", " sched.add(\n", " Measure(q1, acq_index=acq_idx),\n", " label=f\"M q1 {acq_idx}\",\n", " ref_pt=\"start\", # Start at the same time as the other measure\n", " )\n", "\n", " acq_idx += 1\n", "\n", "\n", "# Specify the frequencies for the clocks; this can also be done via the DeviceElement (BasicTransmonElement) instead\n", "sched.add_resources([ClockResource(\"q0.01\", 6.02e9), ClockResource(\"q1.01\", 6.02e9), ClockResource(\"q0.ro\", 5.02e9), ClockResource(\"q1.ro\", 5.02e9)]) " ] }, { "cell_type": "code", "execution_count": 20, "id": "0cf0cd20", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzEAAADECAYAAACvIa+3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAzD0lEQVR4nO3dB5hTVfrH8d9h6KJUUUGKoICIiCJYUFBAiigo4Lr+RbAsFhbQtfeK61oRyyKLioqry7KCoiiudFYFGxZQioAwoFKkCEMTuP/nvbkZMsOAM0Nmkpt8P89znyQ3N8mZzE3enHPec47zPE8AAAAAEBYlEl0AAAAAACgIKjEAAAAAQoVKDAAAAIBQoRIDAAAAIFSoxAAAAAAIFSoxAAAAAEKFSgwAAACAUKESAwAAACBUqMQAAAAACBUqMQBQzJxznnPumUSXA4X+392b6HIAQLqjEgMAceKcq++cG+acW+yc2+qc+9U596Fz7lrnXLlEly8ZOOd+CCoCeW0TEl2+VOCcO9UqWs65SokuCwAUlZJF9swAkEacc10kjZa0TdIrkuZIKi3pNEmPSjpG0pWJLmeS+FLS43ns/1HJzyqjO5TcTpV0j6SXJK1PdGEAoChQiQGA/eScO0LSvyQtldTW87yfYu5+1jl3pCSr5CQd59wBnudlFfPLrvA871WFhHPOshZKe5631bZElwcAQDoZAMTDzZIqSLoiVwXG53ne957nDcm93zl3nnNujnNum3NurnOuUx7H1HTOveicWxlz3OUx9x/inNvhnLsnj8c2DNK0+ge3Lw1ut3HO/d05t0rS8pjj+wXPb6/zo3Pu2dwpSc65qUGZGzvnpjjnNjvnVjjn7D2IC+dcdefc6uC1XMz+I51zWc65UXmUp7lz7iPn3Bbn3BLn3NV5PG8Z59x9zrnvg78x0zn3iO3Pa8ySc+5iez+C3rVOeY2JCdK2bF8D59yrzrkNQdkfsLI752o5594KUgt/ds7dEIdy7fW8CcpmPX9mSUyqXt39+68AQHKhJwYA9t+5khZ7nvdRAR5jaWbdJf1d0kZJAyW94Zyr7XneL9EKiqSZVg+SZBMBrJbUWdILzrmDPM970vM8q9xMk/QHSffleo0LJe0M0txi/T14rvslHRDz49cqQhMlDZXUUNI1klo451p5nvdbzOMrS7LxK2Mk/VtST0kPO+e+8TzvvXz87aWcc9Xy2J/led4Wz/NWOeeuCco9QNJTQW/IS8F71S/X46w87wZleT14L4Y657Z7nvdi8PfZ48cF7/s/JH0n6VhJf5HUQNJ5uZ6zbfA89r6vkfTD7/xNo4LnvDXodbtT0lpJV0maLOkWSRdLesw596nnedMLWa7fO2/GBI+7KHgOK7uC/zcApA7P89jY2NjYCrlJOiioZLxZgMd4Qet+/Zh9TYP9/WP2PR+ME6ma6/GvB2MdygW3bayNXWmS6zjrRZgUc/vS4LgZkjJi9h8clOd966GP2f/n4PjLYvZNDfZdErPPxv5YD9R/8vG3W2XA28t2a65jX7OKjaSjJN0YHNMt1zHR8lyfqzyzJa20ClOwr1dQoTst1+OtkmFXTs31/7FjG+/lf3dvzG2r/NmVYTH7MiRlStpllZeY/dartdkqYzH7Clqu/Jw30feqbqI/H2xsbGxeEW2kkwHA/rFKjIJW8YKY6HneougNz/O+lvSrpHp2O0ij6iHp7eBmtegWVDYqSjohePiYYLC59bz4nHNN7Ed40EOQ23DP8+yHc1T74Ie/9ezsij0uKFPu8TybJGWPafE8b7ukT6Jlz4dZks7KY7PKWSxLg9tglSNJD0ga6XneW3k8n/3tw3KVx25Xl9Q82H1B0MsxL9d7ab0k5sxczznN87xvlX/Px7y+vbef2b/Bes1i9lvFc36u96mg5drneQMA6YJ0MgDYP/YD0hxYwMcty2PfuiA1Kto7UinoZdnbrGbVgx+ya5xzk4L0p7uC+y4MftxbBSe3Jblu1wku7Qe2YisDNl10zP1Ryz1rBtuz7NYrkB9rPM+ztLV98jxvrXNuYJBWZr0qdj0vP+YxOcGC4LJukJJnvTlH7yOtyn8v9/EeFfT/aZUvmwhgTR77q8bcLmi5fu+8AYC0QCUGAPaD53k2YNtSvqznoyBie0JiRQeyR3vKrcfj5b0ca63wUTY72gjnXDPP874MKjST8vgRbbZo//xe2eOpY3BpP9IP348pg+39/MbSzvZyv6V/7c97tLOQ71NBy1Wc7z0AJC0qMQCw/96x3hLn3Cme530cp+dcHaSoZeSn18LG5AQpVBcGE3rZ4O6H8vlaNjW0gsH81vPic85ZiplNH52f14+7YNatP0l6JBgU/7Jz7iTP83Kv01Ijj6mi7e9XzIB8S8E6LqjY5e5FSqSiKFcy/X0AUCQYEwMA+89+ZNsP6OeDGcVycM7Vd85dW5AnDMZVvGHjYoLxLbmf8+Bcx68PxspYD8wfJW0PKjb5MTE4fmDslMY2ZXQw9ma8ilkwtfPzwVib24PKzAnB9bwa5K7KVfm6KqgIfh7stpnLakrqm8drlbNKkBKjKMoVrczlmB4bAFIJPTEAsJ9soLVz7v+i0+w6516RNCcYLH9qMHjbpgcuqFuDgd2znHM2yN4GmlcJfsy3D67HGhWkn9kUxO8HFZv8lN/WNXkomGJ5gnNuXNArY8/zaewg/jixtW9sVq7cNnmeF614DQnGjrQPKnRWLqvU3Gnrrnie91XM4yyd75ZgLZQFwXigZtY7FjM19Miggvecc87e0w+DWcQaBfs7BoPxi1tRlCtacXvQOWdphvYevJ2ARU0BoMhQiQGAOPA8b5xzzga232TTAAdrrGwLxq3YAofDC/GctgZMS0l3B2uDWKXil2DqZFt3JLdxwViOA/cyK9m+XssWbVwdzAg2OFjjxNYtuT3XGjHx0Cz48Z5XWtubzrmuknrb++Z53ryY+68PZjGztLIWMeWyge19JD0d9GisDKYczn7PbdY1WyQyWDvFnvv8YLrjxUGFKToRQLEqinJ5nvepc84meLAFPzsFWReWFkglBkDKcMmVGgwAQP4552ydmGqe5xV0YgUAQIgxJgYAAABAqFCJAQAAABAqVGIAAAAAhApjYgAAAACECj0xAAAAAEKFSgwAAACAUKESAwAAACBUknWxSwbqAAAAAOnH5ecgemIAAAAAhAqVGAAAAAChQiUGAAAAQKhQiQEAAAAQKlRiAAAAAIQKlRgAAAAAoUIlBgAAAECoUIkBAAAAECpUYgAAAACECpUYAAAAAKFCJQYAAABAqFCJAQAAABAqVGIAAAAAhAqVGAAAAAChQiUGAAAAQKhQiQEAAAAQKlRiAAAAAIQKlRgAAAAAoVIy0QUAkDqenvyD0tGAtnUL/dh58+YpHTVq1CjRRQAQZ8SAgiMGFB49MQAAAABChUoMAAAAgFChEgMAAAAgVKjEAAAAAAgVKjEAgDxlZWVp6dKliS4GACABspI8BlCJAQDsYdeuXbr55pvVqVMnfffdd4kuDgCgGO0KQQygEgMA2MPw4cM1efJk/3pGRkaiiwMAKEbDQxADqMQAAHKYPn26hgwZkn27VKlSCS0PAKD4TA9JDKASAwDItmzZMl1//fU59pUuXTph5QEAFJ9lIYoBVGIAAL7NmzerX79+2rp1qzzPS/oABgBI3xhQMtEFAAAkngWsO+64Q0uWLPEHdMZK1gAGAEjfGEAlBgCgkSNHasKECXnel6wBDACQvjGAdLJcpk6dqrp16xboMS+++KLmzZtXZGUC0pW1Bg26tJ3eeeHRHPvnzpysv3RsoK9m5P2Fi4Jbu3btXmehSdYAVhSIAUDyIAYUn7UhjAFUYvLh2Wef9YNa2bJlddJJJ+mTTz7Jcf+sWbM0bNiwhJUPSFUlSpTQWRf104y3RmrLpl/9fZkL5mjEAwPUte8tOu70TokuYsq49tpr/cGcO3fuzH7vnXP+ZbJOr1lciAFAYhADis+1IYwBcU8nc851l3S1pOaSqkg63vO8LxVSo0aN8v+pzz33nB+8nnzySXXs2FHz589X9erV/WO6deumAQMGaPDgwYkuLpByTmzfTRNGDtH0t15Ri/bna9idV+jkTj11Zs8rEl20UOQ4//zzz1qwYEH2tnz5cm3cuFGbNm3yA1SFChV04IEHqlatWv6CZhawrPWzSpUqatKkiQ477DClM2IAkFjEgMLzUjwGFMWYmAMk/U/Sv22tHIXcE088ob59++qyyy7zb1sgGz9+vJ8+cOutt/r72rVrp5UrV2rOnDn+PxxA/GRklFT7C6/WOyMe1xeT31bthk3V/c/3JLpYST27zMSJEzVu3Dh9+OGH+X7c7Nmzc9xes2aNf9miRQt/phrrhUhHxAAgsYgBBbM5jWJAgSsxzjmrpAyVZD0uGyU9JulcSV96nned53kjg+MKllSchLZv367PP/9ct912W/Y+q6G2b99eH3/8cfa+MmXKqEOHDv4JQwADiqYlbszf75eqHKxL73jK/xzmx0uDBur0rr00/qUntHHdL36XeMdLBuj4Nl2USqz7f+bMmf53kG3xHB9im+nRo4e6du2qE088Md/vf9gRA4DkQAzYt51pGgMK0xNjo6vaWA+6pFWS/irpBKvEKMVYLdROjEMOOSTHfrudexCnpRMMHTpUt99+ezGXEkh9o5+KtLplbVgrl88vT+sOX/PjUlWrWVfd+92tw49srF/XrtajV5+rxi3PVJly5ZUKqQIffPCBPy2mpQbk5eijj9YxxxyjBg0aqGHDhv7YjvLly2cP1LQf6llZWbriiiu0ePFi/zntR/m2bdtyPM8bb7zhb9WqVdOgQYPUpo2FgdRGDACSAzEgb16ax4ACVWKccxUkWRJiL8/zJgX7+khaXtgCOOfKWENW7L7vv/++SGdCsLy/eDv77LP9dAMLevYPzktmZmbcXxdIdeNHPK65s6bo+mfG6JmbLtHH745S6/N6Z9+/ctkiDR7YU+UqHKSy5Q/Q6hVL/WB1/jV3qtZRTVSxanV/MwdVOVgHVKyszRvXxzWAJeKzbT+iH3jgAX3xxRd73GfpTeedd55at279u9+ldv/69eu1aNEi/7blSFualD1+ypQpeuuttzRt2rTs4+077uqrr1arVq38H+z16tUrVPkT+X1IDADCgxiQfjGgVj6/owvaE1Pf/l6bjCW6w/O8tc65+So866fPkdxob3pRWrFiRb6Os0BkXY+W6xzLbh966KE59tniQJUqVfK3vTn55JMLWWIgHG4dmf/82/z4aPzrmjz6efV/7DXVrN9YZ/S4TJNGDVOrcy5SRslS/jGH1K6vukc382eqqVGvkQb1aatr/vaypo55UY1OPD3H8y1b8I28XbtUuXqNuJZzfz7bkyb57UH5tm7dOg0ZMsQfcB6rdu3a/o/oTp067fN7KC+WfhAdzGnfefYclv/cuXNnf7OpN999910NHz5cq1ZZB7z8XOsuXbqod+/e6t+/vz8wtCAS+X1IDACKBjGg4IgBhf+OTobFLh+ysZOxO6ZPn74hGeaktjI0b97cP8GsRmrsH2y37R+W+wSwlriSJff+llq+IpDK3lwYmZoxHqzlbfTT9+rSO5/SEY2P9/e17tZbk0f9Q598MFandP5D9rErMxereq162r51i/8ZtRa2BV985B8flfXrer36txv0xxvsKye+9uezbd34+fX111/r4osv1o4dO3Lsv//++9W9e/dCTYNpqQNjxozJDl6WIpA7ANosNb169dKFF17oB84HH3ww+75XXnlFY8eO9RdKs1SF/ArD9yExACgYYkDBEQMKr6CVGOtr+k3SSVahtR3OucqSGkja3ddUAJ7nWdJdzsS7JGJTa/bp08cfyNSyZUt/ek074aIz1cQGsLvuuqvYUxiApLLwh7g8jbWWjbi/v7r1vVXHndYxe7+lC7Q+/1JNfH2oTurQQyUyMrR18yaVLFXa35Yu+spvlbN9nrfLP978tn2bnr/7SrW/6GrVO8Zmf4+v/fls53eRxNGjR+vuu+/Ose/yyy/3u/UL2gKWOyhGW71s/Ef0x3peSpUq5Qcya3175pln9Nprr/n7bbpOe9xjjz3m35cfYfk+JAYABUAMKDBiQDFVYjzP2+Sce8EG9zvnfgkG9lt1bFf0GOecrQ1TW1K0r66h5ddJ+tnzvJ8VMlbrXL16tX/i2FzbzZo104QJE3IM9LQ0AlszwLrfAOy/2g2O1WPj5+Z5X5fLrve3qJ+XLtShdY70r69c9r2qH36EFsz+SEc1OyW7lemfj9yko44/VS3PskkVw8e67x9++OHs2zZvv3Xr169vGb77x358W+ubBS9bLyA/6byVK1f2f7D37NnT/zG/YcMGf7+1zp122mmqWLGiUgUxACh+xICciAF5K8wcaTdJmiHpbUkTgzVhPo+5v6tNN21jsYLb/wpu2wKYoWRpA0uXLvVnarCVmW3Bs9wnwBlnnLFfNWEAhfPTDwt1WF3rDJZKly2veZ//T999Ol2NmkdyoRfP+Uyzp76jbz78rx6+8mx/+3Fx/lq+koUtqmjrlRhbaPHtt9+OS/CyWWns+8uClwWxc845p0CTqtisN++//74ftMxTTz2VUhWYKGIAkLyIAekbAwo8JsZ6YyRdEmw+51x235HneS/Z1NxKI3YCWC4igOIXmxfdrHVnf3v0mq66YMB9/r76x7bQkImLFXbWOmbpBDZVZtC7vd9mzJiRPS2nBTFbA6CgLGANGzbMX+nZypaOiAFA4hAD0jcGJMPA/tAr6MwSAIrWTUPjt9hXMon3QopvvvlmdhpBzZo1/VSpwrBZbdK1AmOIAUByIQakRwxIjiU3k4gtAnTdddcluhgAUKQsh9lWYrbgZQHo/PPPj1vrXpgRAwCkgw0pEAPi0hPjed4ZShEEMADpwAanR6fptKk1C5NGkIqIAQDSwYQUiAGkkwFAGrJ1AaKtbsceeyzT/wJAGhmTAjGASgwApJnMzEx/bYCoHj16JLQ8AIDik5kiMYAxMQCQhmkEUbbCvE3ZCQBIDxNSJAZQiQGANNOiRQtVrVrVv962bduUXNsFAJDaMYB0MgBIMzaN5rRp0zR37lw1atQo0cUBABSjZikSA6jEAEAasrUBmjZtmuhiAAASICMFYgDpZAAAAABChUoMAAAAgFChEgMAAAAgVKjEAAAAAAgV53meklBSFgoAAABAkXL5OYieGAAAAAChQiUGAAAAQKhQiQEAAAAQKlRiAAAAAIQKlRgAAAAAoUIlBgAAAECoUIkBAAAAECpUYgAAAACECpUYAAAAAKFCJQYAAABAqFCJAQAAABAqVGIAAAAAhAqVGAAAAAChQiUGAAAAQKhQiQEAAAAQKlRigDRUt25dPfnkk4kuBgAgAYgBSAVUYpB2Vq9erWuuuUa1a9dWmTJldOihh6pjx4768MMPFQaXXnqpnHP+Vrp0aR155JG6//77tWPHjkQXDQCSHjEASA0lE10AoLj16NFD27dv18svv6x69epp5cqVmjRpkn755ZeElsvKZAEpPzp16qQRI0Zo27Ztevfdd/XnP/9ZpUqV0m233Vbk5QSAMCMGAKmBnhiklfXr12vGjBl6+OGHdeaZZ6pOnTpq2bKl/8XftWtX/5iFCxeqdevWKlu2rBo3bqwPPvjAb/F68803/funTp3q37bnivryyy/9fT/88IN/24LhRRddpJo1a6p8+fI69thj9frrr+coyxlnnKH+/fvruuuuU7Vq1fyWQDNnzhx17txZFSpU0CGHHKJLLrlEa9asyfHYaOuhld9aFNu3b69x48ZlP689Z6zzzjvPb73Li+d5uvfee7NbJWvUqKGBAwdm329B8sYbb/T/lgMOOEAnnXSS/x4AQNgQA/ZEDEBYUYlBWrGgYJsFI/tizm3Xrl3q3r273xo2a9YsPffcc7rlllsK/Dpbt25V8+bNNX78eD8gXXnllX4g+uSTT3IcZy2B9lqWxmCvZUGxbdu2Ov744/XZZ59pwoQJfivhH/7wh32+Xrly5fxWvMJ44403NHjwYA0bNswP3vbeWMCNsiD78ccf61//+pe+/vprXXDBBX4roB0LAGFCDNgTMQChZTXwJNyAIvOf//zHq1y5sle2bFnv1FNP9W677Tbvq6++8u97//33vZIlS3orVqzIPv69997z7KMyduxY//aUKVP82+vWrcs+Zvbs2f6+JUuW7PV1u3Tp4t1www3Zt9u0aeMdf/zxOY554IEHvA4dOuTYl5mZ6T/3/Pnz/dt9+vTxunXr5l/ftWuX98EHH3hlypTxbrzxxuznvfbaa3M8hx1vj4uqU6eON3jwYP/6448/7jVo0MDbvn37HmVeunSpl5GRkeP9MO3atfPfNwAIG2IAMQBJL1/1BcbEIC3zobt06eKnFMycOVPvvfeeHnnkET3//PPasGGDatWq5XenR51yyikFfo2dO3fqr3/9q/79739rxYoVfguZtfpZWkEsa6mL9dVXX2nKlCl+S2FuixYtUoMGDfzr77zzjn/Mb7/95rcc/t///Z+fDlAY1qpms9RYbri1rp199tk699xzVbJkSX3zzTf+3xJ93Sj7W6pWrVqo1wOARCIG5EQMQFhRiUFaslzns846y9/uuusu/elPf9I999yj66+//ncfW6JEJAvTWgGiLJDEevTRRzVkyBA/MFi3vOURW45y7u5+2x9r06ZNfvCwfO3cDjvssOzrlss9dOhQPw3Bgq0Fm9jyxZYtr/LFsoA9f/58TZw40c/97tevn1/+adOm+eXJyMjQ559/7l/GyivIAkAYEAN2IwYgrKjEAJI/eNPygI8++mhlZmbqp59+yg4Y1lIX6+CDD/Yv7ZjKlStnD+qMZfnN3bp1U69evfzb1lK2YMEC/3X25YQTTvDzk20O/9iglJsFPptWMy9WPitblLWiWU62Bb195VNb4LTNZrlp1KiR3wJnedn2+FWrVun000/fZ9kBIKyIAcQAhA8D+5FWbMYYGzT56quv+gMUlyxZotGjR/upBBZwbIYX6zbv06eP361v6QZ33HFHjuewwGEtV9Z1bwMbbeDm448/nuOYo446ym/R+uijj/Tdd9/pqquu8gdn/h4LHmvXrvVntfn000/99IH3339fl112mR9I8sP+PiuTbfPmzfNnromdRSe3l156SS+88IIf5BYvXuy/NxbQbNYbey8uvvhi9e7dW2PGjPHfLxuY+tBDD/nPDwBhQgzYEzEAYUUlBmnFur9tekibicWm0GzSpImfStC3b18988wzfjf82LFjtWXLFn/aTUsxePDBB3M8h83Fb1NlWnBo2rSp3+0/aNCgHMfceeedfouaTZlp013aVJg2xeXvsbQAa8GzYNWhQwc/DcFSECpVqpSdwvB7Lr/8cj8AW9Bp06aNn+e8rxY4e+7hw4erVatW/t9jKQVvv/12dr6zrUVgz3XDDTeoYcOG/t9hwdWm4wSAMCEG7IkYgLByufMmk0RSFgrpy+b/t8CWnyAEAEgtxACgWLn8HERPDAAAAIBQoRIDAAAAIFRIJwMAAAAQqnQyplgGksWqJdK4R6Vvp0quhHRsO+ncm6Sqhye6ZACAokYMAAqEnhggWYwfLI39a8595StK/UdKDQq+YjQAIESIAUCBemKoxADJwj6L7w2RjjrZVieT3rhfWvKFVLK0dN0oqdFpiS4hAKCoEAOAKCoxQNLbliWVLm/zd+Zx32bphmOkrZsixzyzRMrnOgEAgBAgBgB5YYplIOmNGCgNuUjasGrP+5bPjQQvs32zNP9/xV48AEARIgYAhUYlBkiUr/8rfTYuMohz/U973v/NxFy3JxVb0QAARYwYAOwXKjFAIvy2TXr9jsj1s66W6hy35zE/fBW5rN8icrlwlvTtNGnXzmIsKAAg7ogBwH5jiuU08fTkH5SOBrStq6Q0+QVp9Q9SxerSuTfmfcyyryOXba+QFn0q/TBbeqKn1PsJqfUlSkacZwU3b948paNGjRolughphc9mkiEGpBRiQGJiAD0xQHHLWh+ZStOcd5tUtsKex2xaJ/26OnL9uI5SmfKStyty+62HI4NBAQDhQwwA4oJKDFDc3ntK2rxeqnm01OqivI9ZtThyWfmwSICr2Thy+8Bq0oaV0qThxVdeAED8EAOAuKASAxSnnTukL9+LXO9+p1QiI+/jVgYBrHq9yGWNBpFLWz/AvPd0pKUOABAexAAgbqjEAMUpo6R0zxTpT0Olpmft/bg1SyOX1Y+IXB5SP3Jpi54dfoy05ddIax4AIDyIAUDcUIkBilupstLJPfNe3Czql8zIZdXDI5eHHhm5XLlI6n575Prk56W1PxZ1aZHGsrKytHRp8GMKQHwQAxASWUkeA6jEAMVlzuRIKkF+/LI8clnl8JwpBauWSE3aR1IKqtSUfs1jgTQgDnbt2qWbb75ZnTp10nfffZfo4gDhRwxAiOwKQQxgimWgOCycKT15YWRw5p3/lUqV2ffxuVvhDq4TubQUAhsQetVwqUJVqWSpIi440tXw4cM1efJk/3pGxl7y9gHkDzEAITM8BDGAnhigqNnCZM//OXL90Pq/H7w8T1oXrN5sLW2mdDmp0qG7W+LsOsELRWT69OkaMmRI9u1SpTjXgEIjBiBkpockBlCJAYraS9dJvyyLXJ//kbRl476Pz1on/bY1cj0atMzBwWJatkBa1I7fpP8OlT4bF/diIz0tW7ZM119/fY59pUuXTlh5gNAjBiBEloUoBlCJAYrSmmXSR6N23970izTjn/t+TLQFzlIFbADoHgEsZpDd9Jelf98t/fNWadPauBYd6Wfz5s3q16+ftm7dKs9ag5M8gAFJjxiAENkcshhAJQYoKvYF8PQldkXKKCVdcG9k/xdv7/tx63/avchZrGgAi069aU6/RKrRUNq4WvrnLZHXBArBAtYdd9yhJUuWaOfOnTnuS9YABiQ1YgBCxAthDKASAxQVm/5yxbeR6236SCd2i1xf/Lm0ddPvt8LFphHEDuxcFZNKYLnVlz0dWTDt0zelGa/G929A2hg5cqQmTJjgz0iTW7IGMCCpEQMQIiNDGAOoxOQydepU1a0btHbk04svvqh58+YpndlJP+jSdnrnhUdz7J87c7L+0rGBvpoxQWmnbrPgipM69Y/MMlO1VmSQ56LP9v64Dav2EsDyaIUzRxwvnR+sG2AtcQs+UqrgvCo+a9eu3essNMkawIoCMaBw+KzmgRiw3zivis/aEMYAKjH58Oyzz/pBrWzZsjrppJP0ySef5Lh/1qxZGjZsmNJZiRIldNZF/TTjrZHasulXf1/mgjka8cAAde17i447vZPSzvwPI5cNW+2eYaZ+i8jl0i/3/rj1P0cuKx6Sdyvcuh+l37blvK9jf6n5udLO36Sne0Va+lIA51Xxufbaa/3BnNE0AnvvnXP+ZbJOr1lciAG/j89qHogB+43zqvhcG8IYEPd1Ypz9xdJ9kvpaO4Ik+xRf43neQoXQqFGj/H/qc8895wevJ598Uh07dtT8+fNVvXp1/5hu3bppwIABGjx4sNLZie27acLIIZr+1itq0f58DbvzCp3cqafO7HmF0saH/4rM4d/+Kunj0ZF9p/TcfX+tJtInY6Rlc/b+HBtW5t0Kd2A1qcwB0rasyGDRw47afV+JEtIVz0ob10iLv9g9s00K4Lzavxznn3/+WQsWLMjeli9fro0bN2rTpk1+gKpQoYIOPPBA1apVy1/QzAKWtX5WqVJFTZo00WGH5crLTzPEgPzjs0oMKAqcV4XnpXgMKIrFLm+WNFBSH0lLJD0g6X3nXGPP80L3qXriiSfUt29fXXbZZf5tC2Tjx4/30wduvfVWf1+7du20cuVKzZkzx/+Hp6uMjJJqf+HVemfE4/pi8tuq3bCpuv/5HqWFnxdJbzwgzR5vNXmpbAXppwWRuf1POHf3cbWOiVxm5iOA5W6Fs+etXlfKnBtZJyA2gBl7rYGvScu+kcodJL33VKQc9U6U6jRVWKX1eVXI2WUmTpyocePG6cMPg5bgfJg9e3aO22vWrPEvW7Ro4c9UY70Q6YgYkH9p/VklBhSZtD6vCmFzGsWAAldinHMHSBoqqbskm+z8MUn2CbW+0b9Iuk7SIM/z3gqO7y3JPpHnSfqXQmT79u36/PPPddttt2Xvsxpq+/bt9fHHH2fvK1OmjDp06OCfMOkcwKItJmP+fr9U5WBdesdT/vuVkmzg2+ol0oKPpc/fkeZOjswKk1FSOudGaeGsyHEnnCOVP2j342o02j3P/47tUsnS+U8lMNXrBQFscd7lsoC1/Fvp9dtyzlJT5XCp7RVS83OkanUiwTANzquXBg3U6V17afxLT2jjul/8LvGOlwzQ8W26KJVY9//MmTP97yDb4jk+xDbTo0cPde3aVSeeeGLqfq5zIQYUHDGAGFAUiAH7tjNNY0BhemJsdFUb60G3OTIk/dU+pkEl5ghbj1bSxOjBnudtcM7Zp/mUsFVirBZqJ8Yhh+T8IrHbuQdxWjrB0KFDdfvtweC6NDX6qUjrSNaGtXJJcpLHnS0u9vTF0twpOfc37SD1uDPSAnZbkPd85uU5j7EpMy3I2Mw01pJmU2PmDoy/ro5cr5RXALOPmPYewBbO3B28jm0fCWaWP712ufSf+yJbu75S54F7piqk2Hll3eFrflyqajXrqnu/u3X4kY3169rVevTqc9W45ZkqU668UiFV4IMPPvCnxbTUgLwcffTROuaYY9SgQQM1bNjQH9tRvnz57IGa9kM9KytLV1xxhRYvXuw/p/0o37YtZ879G2+84W/VqlXToEGD1KaNhYHURgwoOGIAMaAoEAPy5qV5DChQJcY5V0GSJSH28jxvUrDP0saWB4dEPxFBX2g2u53np8U5V8YasmL3ff/990U6E4Ll/cXb2Wef7acbWNCzf3BeMjMzlcrGj3hcc2dN0fXPjNEzN12ij98dpdbnWUdcxMplizR4YE+Vq3CQypY/QKtXLPW/VK4bEuQNF4GieM9L/fitDo0JXjvLVdSGNlcp66Q/Sjs9VX3xLyq/8zdtrXuiVpc+xAqR4/HVq9ZVmRVztOabj7VlZ84v0RKb16mmDcy0sv+6TcrK+dgDSlVSFUlbl36r1bn/Ns/TIa/cpNKep6zjztXabvf6rW0VPnxJB/1vhDK2BqtETxqunxp30Y6NkddJ1fPq/GvuVK2jmqhi1er+Zg6qcrAOqFhZmzeuj2sAS8Rn235EP/DAA/riiy/2uM/Sm8477zy1bt36d79L7f7169dr0aJF/m3LkbY0KXv8lClT9NZbb2natGnZx9t33NVXX61WrVr5P9jr1atXqPIn8vuQGFA0iAHEgKJADEi/GFArn9/RBe2JqW9/r03GEt3hed5a59x8FZ710+dIbrQ3vSitWLEiX8dZILKuR8t1jmW3Dz00Z53MFgeqVKmSv+3NySefrES5dWT+8yIL46Pxr2vy6OfV/7HXVLN+Y53R4zJNGjVMrc65SBklS/nHHFK7vuoe3cyfUaRGvUYa1Ketrvnby0VarqJ4z2uU9XRt/RLqVTsyl3rGlg2qMuERadwjWpzlVKuyp992SV1f/VJzh+75+k813aEeNaVhg27V3xfnnPGjYYVdmny6tHa7dHKr0/d47ImVdumtU6S1c2ft8be1qbZLr7XYoawd0slPTNDav72vWxvs0ID6Oed8f+9npz+dfUFk2s8kP8/257yaOuZFNTox53u4bME38nbtUuXqNZLmPJs0yW8Pyrd169ZpyJAh/oDzWLVr1/Z/RHfq1Gmf30N5sfSD6GBO+86z57D8586dO/ubTb357rvvavjw4Vq1KjL9q+Vad+nSRb1791b//v39gaEFkcjvQ2JA/BEDiAGGGFBwxIDCf0fHe2B/kMgp6wMNVmvKvr23+QQfsrGTsTumT5++IRnmpLYyNG/e3D/BrEZq7B9st+0flvsEsJa4kiX3/pZavmKivLkw5+qr8WQtJKOfvleX3vmUjmh8vL+vdbfemjzqH/rkg7E6pfMfso9dmblY1WvV0/atW/z3sqi7c4vsPfd26ae1y1Vu7geq8Nm/lbFxtaqUlqqU9uTJ6dfz79EL93XN86EHTR0mTRuma/94rnp3vTvHfWUWzZRe7acDa9bXzJl7tk66Lb9Kj5yhGuWkWdMmybOZagLVXr9OWjBdu1pdpHcfuMnfVzrzK3kj/qStDU7T5kZtta3O8WpSqaZmFlE+dDzPs/09rxZ88ZF/fFTWr+v16t9u0B9vsK+c5DnPrBs/v77++mtdfPHF2rFjR479999/v7p3716oaTAtdWDMmDHZwctSBHIHQJulplevXrrwwgv9wPnggw9m3/fKK69o7Nix/kJplqqQX4n8PswvYkD+EAOIAVHEgIIjBhReQSsx1tdk/Y8nWYXWdjjnKktqIGlaMBuZVWTaRSstzrmDguNtMoA9eJ5nSXe5JjxPHja1Zp8+ffyBTC1btvSn17QTLjpTTWwAu+uuu4o9hSHfFsas8BtH1qox4v7+6tb3Vh13Wsfs/dat2/r8SzXx9aE6qUMPlcjI0NbNm1SyVGl/W7roK7/1pKgV6Xteu47UrJV08b3SdzOkUXdJy+fKyVPVxi1VdW+v3eB4/9NSIWulKuQ+JjOySFmpaofvvewVq/uLoR1eIkuq1Wj3bDbfR1rADmxyug6MPtYuj/la5SpWVzmF5zzb3/PK9nneLv9489v2bXr+7ivV/qKrVe+Y5kqm8yy/iySOHj1ad9+d8wfP5Zdf7nfrF7QFLHdQjLZ62fiP6I/1vJQqVcoPZNb69swzz+i1117z99t0nfa4xx57zL8vPxL6fVgAxIB9IwYQA3IgBhQYMaCYKjGe521yzr1gg/udc78EA/utOub3VXqe5znnnpR0p3NuYcwUyz9aBV0hZLXO1atX+yeOzbXdrFkzTZgwIcdAT0sjsDUDrPst3dRucKweGz83z/u6XHa9v0X9vHShDq1zpH995bLvVf3wYIBiKjj6dOneqbvXCIguaJaX6KrLNjvN3malyWtAZ9Thx0RWdLYZauoFX8azxkZWgbYBoy//RapSI7LAWjTgpdl5tWD2Rzqq2SnZrUz/fOQmHXX8qWp5lk2qGD7Wff/www9n37Z5+61bv379/f8RaD++rfXNgpetF5CfdN7KlSv7P9h79uzp/5jfsGGDv99a50477TRVrFhRqYIYsG/EgAAxIK6IATkRA/JWmKlDrI9yhqS3g1nI/icpdmnYRyQ9Lekfkj6VZJMBdArjGjFRljawdOlSf6YGW5nZFjzLfQKcccYZ+1UTTgc//bBQh9W1TjupdNnymvf5/5S1YZ1SSqs/Smddvfu2raocO81lbABb95O0fUv+1geIZYulmWVf794XTTuwGW9KlZZKJd987sV5Xn336XQ1ah7JhV485zPNnvqOvvnwv3r4yrP97cfF+Wv5Sha2qKKtV2JsocW33347LsHLZqWx7y8LXhbEzjnnnAJNqmKz3rz//vt+0DJPPfVUSlVgoogB8UEMCBAD4ooYkL4xoMBjYqw3RtIlweZzzmX3HVlvjCTr78rZ55XC7ASwXETsW2z+arPWnf0tpa1dIT3TWzq9l3RmTOpJhSq7p9hckynViHz55myF28fUl0dEcoO16LPI5Y/zdwezjFLSgFd3t86l6Xn16DVddcGA+/x99Y9toSET9zIdaYhY65ilE9hUmTZ7TDzMmDEje1pOC2K2BkBBWcAaNmyYv9KzlS0dEQPyhxgQIAbEFTEgfWNAvAf2p6WCziyBNDH73UhgsTzpBqdINYPcZfvysZY4W7HZ0gliA1i0FW5fqQRHtoxcrvhW2rROenfI7vsuflhqcKrS3U1D47fYVzKJ90KKb775ZnYaQc2aNf1UqcKwWW3StQJjiAHIEzEgYYgB6REDUnQlqsKzRYCuu+66RBcDqaDtn6Qm7aQd26QRAyP5ylEH14lcrlma8zHZrXCH7f15Lc2g5tGRFIWZ/5FmvRHZf+RJkRY/IB8sh9lWYrbgZQHo/PPPj1vrXpgRAxA3xAAksQ0pEAPiUonxPO8Mz/NS4lufAIa4sS+DS5+MrN78w2xpss2JkXtg59KcKzVbjnR0Ved9aX5u5PJft/tTfcqVkPqNiLwmkA82OD06TadNrVmYNIJURAxA3BADkMQmpEAMoCcGKEqW19wzGB721t+kX1fvfXaaTb9IwUrN+xzUaSy/2gJjVIdrpIMOjm/ZkdJsXQBrdbOtadOmoZnyGAgVYgCS1JgUiAFUYoCiZt37dY6TtmyU3nwoZypBbABbH7TAWSAq+TuzgxxYTbpxTCRd4ZoXpQvuLarSIwVlZmb6awPYPCy29ejRI9FFAlIXMQBJJjNFYgCVGKColciQ/jgocn3xF5EpN6sfsTuVwFIIzNofgzSCGr//nJY3XbOx9H8P7U4rAAqQRhBlK8zblJ0AiggxAElmQorEACoxQHE46mTpL/+W7poolSojVTlcyigp/bZ190DOXzIjl1UP3/dz2WDOYX2le06Xfviy6MuOlNOiRQtVrVrVv962bduUXNsFSCrEACSRFikSA5hiGSgux5y5+7oFr2q1pZWLpVWLI6sr/7I8cl/V38lL/eYDaeHMyGJmB4VvJWYknk2jOW3aNM2dO1eNGgXTvgIoWsQAJIlmKRID6IkBipu1vNm0mNWD1XZXLsp/K5ylHYz5a+S65UJb4AMKwdYGsMGcBVmdGUAcEAOQBDJSIAbQEwMUp507pPvOlH7+XmoWrFZt182qJZHLasGAz7x8MkZaPjcyK03ngcVQYABA3BADgLihJwYoTpZCEA1ctm6A+XFeJMfZUgrMIUHrXG42GPTNv0Wudx4gVahcHCUGAMQLMQCIGyoxQHGz1rPylXYP5lz+nbRhpbRtc2TBsujUm7lNGRFZ3dnWD2jXt1iLDACIE2IAEBdUYoDidkAlqctfdt+24PXdjMh1m3Zzb+sDLPk8ctntFqnMAcVQUABA3BEDgLhwtshNEkrKQgFxY2kBd5+2e6GzeidKiz+TWp4vXfmPvB9jn9V5M6SGrSLrDgAAwokYAOyLUz7QEwMkgq0TcNGDu29b8DJ1mu39Mc5JR7cmeAFA2BEDgP1GJQZIlKYdpPotcu47tn3O21nrpVdvljatLdaiAQCKGDEA2C9UYoBEGvhP6eC6keuWIlCjQc61BIZeLk0dIT3bJ2FFBAAUEWIAUGiMiQESbcMq6ev/SiecK00bIR11srRzp/TG/dKSL6Qy5aVb3pFqH5vokgIA4o0YABRqTAyVGCBZjB8sjQ1WYo4qX1HqP1JqcEqiSgUAKA7EAKBAlZiS+TkIQDFocZ7000Lp26mRtQKObSede5NU9fBElwwAUNSIAUCB0BMDAAAAIFkwxTIAAACA1EMlBgAAAECoUIkBAAAAECpUYgAAAACECpUYAAAAAKFCJQYAAABAqFCJAQAAABAqVGIAAAAAhAqVGAAAAAChQiUGAAAAQKhQiQEAAAAQKiWVnFyiCwAAAAAgOdETAwAAACBUqMQAAAAACBUqMQAAAABChUoMAAAAgFChEgMAAAAgVKjEAAAAAAgVKjEAAAAAQoVKDAAAAIBQoRIDAAAAQGHy//AD65WpuZ8HAAAAAElFTkSuQmCC", "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": "125f45ec", "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": "9963cb71", "metadata": {}, "outputs": [], "source": [ "from quantify_scheduler import BasicTransmonElement, QuantumDevice, SerialCompiler\n", "\n", "dut.close()\n", "dut = QuantumDevice(\"DUT\")\n", "q0_dev = BasicTransmonElement(\"q0\")\n", "q1_dev = BasicTransmonElement(\"q1\")\n", "dut.add_element(q0_dev)\n", "dut.add_element(q1_dev)\n", "dut.get_element(\"q0\").rxy.amp180(0.65)\n", "dut.get_element(\"q1\").rxy.amp180(0.55)\n", "dut.get_element(\"q0\").measure.pulse_amp(0.28)\n", "dut.get_element(\"q1\").measure.pulse_amp(0.22)\n", "\n", "compiler = SerialCompiler(name='compiler')\n", "compiled_sched = compiler.compile(schedule=sched, config=dut.generate_compilation_config())" ] }, { "cell_type": "markdown", "id": "75a63d7a", "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": "26b53bc1", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 portclockabs_timedurationis_acquisitionoperationwf_idxoperation_hash
0Nonecl0.baseband0.0 ns200,000.0 nsFalseReset('q0','q1')02526708905108354639
1Nonecl0.baseband0.0 ns200,000.0 nsFalseReset('q0','q1')12526708905108354639
2q0:mwq0.01200,000.0 ns20.0 nsFalseX(qubit='q0')0-3828226568086493990
3q0:mwq0.01200,020.0 ns20.0 nsFalseSquarePulse(amp=0.1,duration=2e-08,port='q0:mw',clock='q0.01',reference_magnitude=None,t0=0)0-3498430782503939668
4q0:mwq0.01200,040.0 ns20.0 nsFalseX90(qubit='q0')0-770060410173437980
5q1:mwq1.01200,040.0 ns20.0 nsFalseX90(qubit='q1')0-5426526134299045606
\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": "69f00ba9", "metadata": {}, "outputs": [ { "data": { "image/png": "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etTnelyuVQtDI/nFx8erUzDE2Mq/LSouJgitVzFYCLHkiyEGIi7evWAiERFRWQr7BuW4uDhp06aNLFmyxHudy+VSl42VHiIiIopOYV/ZAUw779Onj7Rt21auvPJKmTRpkmRkZKjZWURERBTdIiLs3HnnnXLs2DEZOXKkHDlyRFq3bi0LFy7M17RMRERE0SfsG5SD2eBERERE4ff+HfY9O0RERESFYdghIiKiiMawQ0RERBGNYYeIiIgiGsMOERERRTSGHSIiIopoDDtEREQU0Rh2iIiIKKIx7BAREVFEi4jtIkpLX0QaKzESERFReNDft4vaDIJhR0TOnj2rzuvXrx/qQyEiIqISvI9j24iCcG8sEXG5XHL48GGpWLGiWCyWMk2cCFB//PFH1O25Fa3PPVqfN/C5R99zj9bnDXzu9U3x3BFhEHTq1KkjVmvBnTms7KBxyWqVevXqldvj44ch1D8QoRKtzz1anzfwuUffc4/W5w187pVCfRiFVnR0bFAmIiKiiMawQ0RERBGNYaccxcfHy6hRo9R5tInW5x6tzxv43KPvuUfr8wY+91Fh9dzZoExEREQRjZUdIiIiimgMO0RERBTRGHaIiIgoojHsEBERUUSLqrBjt9vlueeek0suuUSSk5PViov333+/Wj25MFidcfDgwdKwYUNJTEyUq6++WtatW+dzny+//FK6dOki1apVU6swb9q0qUyOefv27dK7d29p1KiRetxJkyblu88PP/wgPXv2VM8H95k7d64EwwsvvKC+nvHUvHlz7+3Z2dkycOBA9T2pUKGCeh5Hjx6VcFTU9xh9/iNHjpTatWurn5HOnTvLnj17fO5z8uRJueeee9QiXFWqVJF+/fpJenq6hPPzfuCBB/L9DHTr1i3snzeMGzdOrrjiCrWyeo0aNeSWW26RXbt2+dwnkJ/xgwcPSo8ePSQpKUk9ztChQ8XhcEg4P+/rr78+3+v+6KOPhvXzhrffflsuvfRS72J57du3lwULFkT06x3ocw/31zyqwk5mZqZs3LhRRowYoc4RUPCf+Oabby708x566CFZvHixfPTRR7J161YVavBmdujQIe99MjIy5Nprr5VXXnmlzI/5ggsukJdffllq1arl9z742q1atZK33npLgu2iiy6Sv/76y3tauXKl97annnpK/ve//8mcOXNkxYoVKlTeeuutEo6K+h6PHz9eJk+eLNOmTZM1a9aoMN21a1f1y1GHN3yEV/wszZs3TwWJhx9+WMwskJ8thBvjz8Bnn33mc3s4Pm/Azyze2H7++Wd17PhjCf/38T0J9Gfc6XSqX/65ubmyatUqmTVrlsycOVMF43B+3tC/f3+f1x3/B8L5eQNW0sfv2g0bNsj69eulY8eO0qtXL/XzG6mvd6DPPexfcy3KrV27FlPvtd9//93v7ZmZmZrNZtPmzZvnc/3ll1+u/etf/8p3//3796vH++WXX/LddurUKa1fv35a9erVtYoVK2o33HCDtmnTpoCPtWHDhtrEiRMLvQ++9ldffaUFw6hRo7RWrVr5ve306dNabGysNmfOHO91O3fuVMe3evVqLZzl/R67XC6tVq1a2quvvurz/OPj47XPPvtMXd6xY4f6vHXr1nnvs2DBAs1isWiHDh3SwoG/n60+ffpovXr1KvBzIuF561JTU9VzWbFiRcA/4/Pnz9esVqt25MgR733efvttrVKlSlpOTo4Wjs8bOnTooA0aNKjAz4mE562rWrWq9v7770fN6+3vuUfCax5VlR1/zpw5o8pxKK/7gxIcEmtCQoLP9RiqMFYxAnH77bdLamqqKg0iPV9++eXSqVMnVeYPVxiqwRAHqk/4Cx5lTMDzw1+EqIDpMMTVoEEDWb16tUSS/fv3y5EjR3yeK/Zqadeunfe54hw/Y23btvXeB/fHvmyoBIWz5cuXq5J1s2bNZMCAAXLixAnvbZH0vPG7AlJSUgL+Gcc5hs1r1qzpvQ8qfthI0fgXczg9b90nn3wi1atXl4svvliGDRumqtC6SHje+L0/e/ZsVdHCkE60vN7+nnskvOZRvREohhjQw3P33XcXuJkZxq3xYo8dO1ZatGihXkiU6fHCNmnSJOCvhWC0du1aFXb0VSdfe+011QPxxRdfhEVZPy+8maNMiTc5lDRHjx4tf/vb32Tbtm3qzT8uLi5fiMT3D7dFEv35GP+T65f123COQGAUExOj3kDC+fuBISyU8c8//3zZt2+fPP/889K9e3f1/8Nms0XM83a5XKpv75prrlG/6CGQn3Gc+/u50G8Lx+cN//znP1UPI/7Q2bJli/o9ipYAtAaE+/NGqwJ+5+P9AX05X331lbRs2VL1YUb66721gOceCa95RIcdpNBHHnnEexkVFbwZAxL6HXfcoRpL0ZhVGPTq9O3bV+rWrat+gaMig4CEpB+ozZs3q6ZMNLYZZWVlqTcJVET0HyrAmwZOZoY3NR0a2xB+8J/h888/V5Uvinx33XWX92P8VYefg8aNG6tqD6qWkQI9LAjxxa3mRurzNv5xhtcdjfl4vfG7DK9/OMMfbwg2qGjhD9E+ffqo/pxo0KyA5473pnB/zSM67KDxGG/AOoQVY9D5/fffZenSpUVuUY8XEi84SnooyeFFvvPOO9XQTaAQdPB5eBPIC38p4GScwZW3ZBwO8BwuvPBC2bt3r/z9739XjWqnT5/2+UsIMxcKarQOV/rzwXPDa6zD5datW3vvg6pe3iFSDGFG0vcD/ydQ5sbPAH4RRsLzfvzxx72N1Wji1OH4i/oZxzkqukb67B2zP/+Cnrc/+u9ZvO74fRnOzxvVG71q36ZNGzXz9o033lC/8yP59S7sub/zzjsS7q95RPfsYAgKL5x+QrVBDzroNfn+++/zVVoKgxk2eDM7deqUfPfdd6pTPVCoBqGUhxK+8ZhwwptD3uvDMewg0CHl43uE/yixsbGyZMkS7+0oeaKCZRwDjgQYwsF/ZuNzRShGT4r+XHGOX5LGaiCCNoYJjIE83P3555+qZ0cPfeH8vFH1xRs+Svk4ZrzORoH8jOMcQwPGwIcZTvgDy1jJDafn7Y/+h5rxdQ+3510Q/Kzm5ORE7OsdyHOPiNdciyK5ubnazTffrNWrV0/Ngvrrr7+8J2O3eMeOHbUpU6Z4Ly9cuFDNIPntt9+0RYsWqRlI7dq1U4+nO3HihJqB9e2336ru/NmzZ6vLeGx9xs61116rPve7775Ts7Z++ukn7fnnn/eZqZIXjguPg1Pt2rW1Z555Rn28Z88e733Onj3rvQ++9uuvv64+LmiGWVl5+umnteXLl3ufS+fOndVMM8zegEcffVRr0KCBtnTpUm39+vVa+/bt1SkcFfU9fvnll7UqVapoX3/9tbZlyxY1Q+n888/XsrKyvI/RrVs37bLLLtPWrFmjrVy5UmvatKl29913a+H6vHEbfh4xEwU/A99//72apYjnlZ2dHdbPGwYMGKBVrlxZ/Ywbf1dghqauqJ9xh8OhXXzxxVqXLl3U7xz8LjnvvPO0YcOGaeH6vPfu3auNGTNGPV+87viZv+CCC7TrrrsurJ83/N///Z+adYbnhf/HuIyZg/i9H6mvdyDPPRJe86gKO/q0cH+nZcuW+UzxxrRq3X/+8x/1wsbFxakpxgMHDlTTEI1mzJjh93GNj5OWlqY98cQTWp06ddQUxvr162v33HOPdvDgwWIfM6YB6nDs/u6DacHl6c4771QBDN+XunXrqsv4T6HDG/1jjz2mpi8mJSVp//jHP7zhL9wU9T1GmB0xYoRWs2ZNNeW8U6dO2q5du3weA4EYb/IVKlRQ0zEffPBBFRjC9XnjzQ+/2PALDT/P+H/Tv39/n6mn4fq8oaDfFfi/Xpyf8QMHDmjdu3fXEhMT1R8D+CPBbrdr4fq88fsKb3IpKSnqZ71Jkyba0KFDtTNnzoT184a+ffuqn2P8TsPPNf4f60EnUl/vQJ57JLzmFvwT6uoSERERUXmJ6J4dIiIiIoYdIiIiimgMO0RERBTRGHaIiIgoojHsEBERUURj2CEiIqKIxrBDREREEY1hh4hC7oEHHpBbbrkl6F935syZYrFY1Am7e5eVRo0aeR8X22UQhYMDBw5Iv3791BYh2F4Je16NGjVK7QlmhF3Psal2QkKC1K9fX8aPH5/vsebMmSPNmzdX98HGofPnz5dQiuiNQIko9PCGXxj8MsVmg6Fa3xR792CPI+x9V1awgeKPP/4ovXv3LrPHJCoL119/vfrjAqe8fv31V7UfFjb+xB6N2PG+f//+ahPs1157zbvvX5cuXaRz584ybdo0tR9W37591eao+s7oq1atkrvvvlvGjRsnN910k3z66afqj5mNGzfKxRdfLCER6iWciSiyGfdXmjRpktoywnhdKLeOwBYI2AeqPLfaOHXqVLk8PlFJdOjQwWfLk6KMHz9e7fOnmzp1qtouw7if5HPPPac1a9bMe/mOO+7QevTo4fM42E/ykUceKfDrYAsa7CloNGjQIJ+tkebMmaP230pISFBbV2BLi/T09ICeB4exiKhcYUd4/VS5cmVV6TFeV6FChXzDWPjr84knnlBDS1WrVpWaNWvKe++9p/7CfPDBB6VixYrqL88FCxb4fC38Jdq9e3f1mPic++67T44fP16iYaiXXnpJ/cWKr9WgQQN59913vbejrI+dwbHjM8r0DRs2VH/FEkWaM2fOSEpKivfy6tWr5brrrpO4uDjvdV27dlXV0VOnTnnvg8qPEe6D60vqr7/+UtUi/J/cuXOnLF++XG699daAK8IMO0RkSrNmzZLq1avL2rVrVfAZMGCA3H777XL11VercjhK6QgzmZmZ6v7ojenYsaNcdtllsn79elm4cKEcPXpU7rjjjhJ9/QkTJkjbtm3ll19+kccee0x9ffxCh8mTJ8s333wjn3/+ubruk08+UQGJKJLs3btXpkyZIo888oj3uiNHjqg/JIz0y7itsPvot5c07DgcDhVw8H8NfUD4f4k/bALBsENEptSqVSsZPny4NG3aVIYNG6YqKAg/6CHAdSNHjpQTJ06oZkl48803VdBBRQaNkfj4gw8+kGXLlsnu3buL/fVvvPFG9csUFaTnnntOfW08Fhw8eFAdw7XXXquqOjjHX51EZoP/DxUqVPCe0Ev26KOP+lyHn+e8Dh06JN26dVN/YOD/nBl+H3Tq1EmFHBwTKr16JSkQDDtEZEqXXnqp92ObzSbVqlVTv+h0+l+Oqamp6nzz5s0qjBh/iSP0wL59+0r19fWhN/1rYdht06ZN0qxZM3nyySdl0aJFpXimROUHwWbTpk3eE6qVY8aM8bmuTp06Pp9z+PBhueGGG1QV1Th8C/h/gIqpkX4ZtxV2H/32QDmdTp/fAYsXL1ZD1y1btlQVJ/z/279/f0CPxbBDRKYUGxvrcxmBw3idPssLs0cgPT1devbs6fNLHKc9e/aoHoOy+Pr617r88svVL9mxY8dKVlaWGiq77bbbSvQ8icoT+m2aNGniPWFKeY0aNXyui4mJ8anooGeuTZs2MmPGDLFafWNC+/bt5YcffhC73e69DiEEwQP9dfp9lixZ4vN5uA+uL0zegPTbb7/l+z94zTXXyOjRo9XwMvqGvvrqq4C+D5x6TkQRAQHkv//9rxrPN/7yLs8p63feeac6Ieig5H/y5EmfZk6icHLIE3QwNIup5seOHfPepldl/vnPf6qwgfV4MLyLSQFYOmLixIne+w4aNEg6dOig+t569Oghs2fPVn10eatEea1Zs0YNT2G4aunSpfLdd9+ptX7whwWqqghQ6NVDWMN9cXwtWrQI6LmxskNEEWHgwIEqbKB3BuvcYOgKvywxe8tYDi8Lr7/+unz22WdqXRL0A2EBNbwZYK0RonC1ePFi1ZSMUFGvXj0121A/6TCjEsO2CCCo/jz99NOqf05fYwcw/IW1dRBu0GvzxRdfyNy5c4tcYwdDZ/iDBQEGoQeVJTQmv/rqq+qPC1SU0Et34YUXqn4+hCnMvgwEKztEFBHQd/DTTz+pvzbx119OTo76CxUVl7yl+NLCdHSsGoshMvQSXHHFFWqF2LL+OkRlbfny5QXeVtBig/762dDoXBg0EeNU3P9XCEVGmHGpwwzLkrJgsZ0SfzYRURjDdhFYy6c8tnTAmwr+UsWMEVZ8iAqHkIX/h3nDTlnhnyFEJNG+aBpmbqEiVFYuuuiigMvrRFT+WNkhoqh19uxZ7wwQVF+wlk5Z+P33372zVS644AIObxGFGMMOERERRTT+uUFEREQRjWGHiIiIIhrDDhEREUU0hh0iIiKKaAw7REREFNEYdoiIiCiiMewQERFRRGPYISIioojGsENEREQSyf4f1evDgf3qZSIAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f, ax = compiled_sched.plot_pulse_diagram(x_range=(200e-6, 200.4e-6))" ] }, { "cell_type": "markdown", "id": "6090c6f1", "metadata": {}, "source": [ "## Overriding device parameters on circuit-level operations\n", "\n", "The Quantify compiler has an additional feature which adds more low-level control for users how\n", "a circuit-level operation is compiled to device-level. It is possible to **override** the parameters of\n", "the `DeviceElement` using the `device_overrides` keyword argument in each circuit-level operation.\n", "\n", "For example, to override the parameters of the `X` operation\n", "\n", "```{code-block} ipython\n", "X(\"q0\", motzoi=0.5, duration=2e-6)\n", "```\n", "\n", "Let's create, compile and show it on an actual schedule." ] }, { "cell_type": "code", "execution_count": 24, "id": "d12942ec", "metadata": {}, "outputs": [], "source": [ "sched = Schedule(\"Rabi\")\n", "\n", "amps = np.linspace(start=0.1, stop=1.0, num=10)\n", "durations = np.linspace(start=1e-6, stop=1e-4, num=10)\n", "\n", "for i, (amp, duration) in enumerate(zip(amps, durations)):\n", " sched.add(Reset(\"q0\"))\n", " sched.add(X(\"q0\", duration=duration, motzoi=0.5/amp))\n", " sched.add(Measure(\"q0\", acq_index=i))\n", "\n", "sched.add_resources([ClockResource(\"q0.01\", 6.02e9), ClockResource(\"q0.ro\", 5.02e9)]) \n", "\n", "compiler = SerialCompiler(name='compiler')\n", "compiled_sched = compiler.compile(schedule=sched, config=dut.generate_compilation_config())" ] }, { "cell_type": "code", "execution_count": 25, "id": "3af51212", "metadata": {}, "outputs": [ { "data": { "image/png": "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vufhhx8WU+El/r187DyZXeratasIahry6aefisnvau5LWh07dqTnn39eud8cHPHjd/r0aXEf+XN8Pzdv3qx8T3Z2Nl1//fXUrl078d+BJ7p/8sknLr+HA5kbb7xRBIT8WM6aNavO7/bz86Px48eL49QaAh4AAAspqahq8FJWWd2iX9scHJj4+/vTpk2bxFLMzJkzXU7ovDTFJ14+Ia9fv14EIHzCrKysrD2WkhJ66aWXxPf9/vvvIhszceJEuuyyy+jUqVPiwlmP+jzyyCP0008/ieDou+++E4HR1q1blX/nqd28TMTLWBIHZ4MHDxbHI/GJnY9V7dChQyKTwQELBwcffPABXX755XTy5EnxO/mYOZDirBEbMWIErVu3TgRFjL+Gg0AZrKWmpoqfyb+rPjk5ObR7924aOHDgGR93DkYuvPBC2rZtmzimSZMmiQDopptuEve/S5cu4rYMPjmbNWDAAPr6669p165dokaIv4f/u0lTp06ln3/+Wfy3WrlyJa1du9blsZQGDRok/k1r2KUFAGAhvZ/+tsF/u6RHPH146yDl9oB/fE+lboGNNLhTDH1211Dl9vCXVivL+NLRf17e5ONLSUkRJ1/OZPTo0YN27twpbk+ZMkVkcvjkySdRGbAsWrRIfA9nV6655hrxOQ5+3n77berXr5/yc7nWpry8XGRSGlJUVCSCkI8++ohGjx6tBGDJycnK13Cww9q0aePyvXxb/hvjLA5nNdR4aY0zPLycxNmnSy65hPbt20fLly8nX19fcX856Fm9erUIoC666CKRJeEghIOLNWvWiIBMZpI48OEMC2d56nP8+HERoCQlJZ3xceeg8a677hIfc33SO++8QxdccIHymD722GM0dOhQysjIEI8h/17OQEn3338/ffvtt/T555+LAIaPmx+7jz/+WHksP/zww3qPhT934sQJ8fjw46AVBDwAAGAYvGuHgx2JT7K8rMRZjj179ojsDwcDUmxsrAgU+N+kwMBAsQTTVJwtqaiocPn5XO/CP7+peJnLHS8dqWtnOEjiJR31SZ4/l5mZKT7mpTkO2jiw4fvEF86kPPPMMyI444wPZ4EaUlpaKq6DgoLOeLzqx0sGc7xM5f45PjYOePi/x4svvigCHM408ePGASUvb7HDhw+LwJODH3UmrL7HkoNRDnb4+/ljrSDg0VDn+FC9DwEAwMXu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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f, ax = compiled_sched.plot_pulse_diagram(x_range=(000e-6, 1800.4e-6), port_list=[\"q0:mw\"])" ] }, { "cell_type": "markdown", "id": "7f1384a6", "metadata": {}, "source": [ "As you can see, the amplitude of the pulse (which was compiled from the `X` gate) changes.\n", "\n", "```{important}\n", "A few device element parameter names do not correspond to the `device_overrides` key names. The `integration_time` of device elements can be overridden with the `\"acq_duration\"` key. These discrepancies are rare; in all cases the device element's `factory_kwargs` must be used in the already generated compilation config.\n", "```" ] } ], "metadata": { "file_format": "mystnb", "kernelspec": { "display_name": "python3", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.21" }, "mystnb": { "execution_timeout": 120 }, "source_map": [ 8, 38, 47, 53, 60, 73, 81, 106, 129, 144, 153, 162, 167, 171, 175, 188, 195, 200, 203, 210, 213, 218, 223, 227, 233, 238, 242, 246, 249, 267, 280, 284, 292, 297, 300, 323, 352, 359, 371, 387, 392, 399, 401, 417, 434, 436 ] }, "nbformat": 4, "nbformat_minor": 5 }