{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# debug firmware\n",
    "This notebook uses a special firmware which doesn't have a tProcessor (so you can't run regular QICK programs, readout is less efficient, and interfaces are clunkier), but wires all DACs and ADCs and reads out through a full-speed (not decimated) buffer.\n",
    "\n",
    "We can use this to get power spectra at the ADCs and check for spurs.\n",
    "\n",
    "This notebook (and all notebooks in this directory) was run in loopback with 26 dB of external attenuation: 16 dB estimated end-to-end attenuation in the Run 14 NEXUS setup, and 10 dB additional pad."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "\n",
       "try {\n",
       "require(['notebook/js/codecell'], function(codecell) {\n",
       "  codecell.CodeCell.options_default.highlight_modes[\n",
       "      'magic_text/x-csrc'] = {'reg':[/^%%microblaze/]};\n",
       "  Jupyter.notebook.events.one('kernel_ready.Kernel', function(){\n",
       "      Jupyter.notebook.get_cells().map(function(cell){\n",
       "          if (cell.cell_type == 'code'){ cell.auto_highlight(); } }) ;\n",
       "  });\n",
       "});\n",
       "} catch (e) {};\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/javascript": [
       "\n",
       "try {\n",
       "require(['notebook/js/codecell'], function(codecell) {\n",
       "  codecell.CodeCell.options_default.highlight_modes[\n",
       "      'magic_text/x-csrc'] = {'reg':[/^%%pybind11/]};\n",
       "  Jupyter.notebook.events.one('kernel_ready.Kernel', function(){\n",
       "      Jupyter.notebook.get_cells().map(function(cell){\n",
       "          if (cell.cell_type == 'code'){ cell.auto_highlight(); } }) ;\n",
       "  });\n",
       "});\n",
       "} catch (e) {};\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Populating the interactive namespace from numpy and matplotlib\n"
     ]
    }
   ],
   "source": [
    "# from test_rfboard_dr import *\n",
    "from qick.rfboard import *\n",
    "\n",
    "from scipy.signal import welch\n",
    "%pylab inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Test(RFQickSocV2):\n",
    "    def __init__(self, bitfile=None, force_init_clks=True, ignore_version=True, **kwargs):\n",
    "        \"\"\"\n",
    "        By default, re-initialize the clocks every time.\n",
    "        This ensures that the LO output to the RF board is enabled.\n",
    "        \"\"\"\n",
    "        super().__init__(bitfile=bitfile, force_init_clks=force_init_clks, ignore_version=ignore_version, no_tproc=True, **kwargs)\n",
    "        \n",
    "        self.switch_gen = self.axis_dds_mr_switch_0\n",
    "        \n",
    "        # Signal Generators.\n",
    "        self.gen = [getattr(self, \"axis_signal_gen_v3_%d\"%(i)) for i in range(8)]\n",
    "        for i, gen in enumerate(self.gen):\n",
    "            gen.config(self.axi_dma_0, self.axis_dds_mr_switch_0, self.axis_switch_0, i, \"DAC\")\n",
    "                \n",
    "        # Signal Generators Control.\n",
    "        self.gen_ctrl = [getattr(self, \"axis_signal_gen_v3_c_%d\"%(i)) for i in range(8)]\n",
    "        for i, dac in enumerate(self.dacs): dac.gen_ctrl = self.gen_ctrl[i]\n",
    "        \n",
    "        # Buffer for ADC channels.\n",
    "        self.switch_buf = self.axis_switch_1\n",
    "        self.buf = self.mr_buffer_et_0\n",
    "        self.buf.config(self.axi_dma_1,self.switch_buf)\n",
    "\n",
    "        def capture(self):\n",
    "            self.switch.sel(slv=self.ch)\n",
    "            time.sleep(0.1)\n",
    "            self.buf.enable()\n",
    "            time.sleep(0.1)\n",
    "            self.buf.disable()\n",
    "        def transfer(self, buff):\n",
    "            self.buf.transfer(buff)\n",
    "        for i, adc in enumerate(self.adcs):\n",
    "            adc.switch = self.switch_buf\n",
    "            adc.buf = self.buf\n",
    "            adc.capture = capture.__get__(adc, adc.__class__)\n",
    "            adc.transfer = transfer.__get__(adc, adc.__class__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "resetting clocks: 204.8\n"
     ]
    }
   ],
   "source": [
    "# Load bitstream with custom overlay\n",
    "# soc = PfbSoc('../test_rfboard.bit',init_clks=True, ignore_version=True)\n",
    "#soc = RFQickSocV2('test_rfboard_v2.bit')\n",
    "soc = Test('test_rfboard_v2.bit')\n",
    "\n",
    "# Sampling frequency of ADC/DAC.\n",
    "#fs_adc = 8*384\n",
    "#fs_dac = 16*256\n",
    "fs_adc = 3072\n",
    "fs_dac = 6144\n",
    "\n",
    "# Set sampling frequency of controller.\n",
    "for i in range(8): soc.gen_ctrl[i].set_fs(fs_dac)\n",
    "for i in range(8): soc.gen_ctrl[i].add(freq=200,gain=0)\n",
    "    \n",
    "# Define receive buffer for Full-Speed data.\n",
    "buff = allocate(shape=(soc.buf.MAX_LENGTH), dtype=np.int16)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  i |   f_vco  | DIV | DLY_SEL |   n  | osc_2x |   R  | mult | R_pre |  f_pfd  |   f_out  | Delta f |   Metric   \n",
      "----|----------|-----|---------|------|--------|------|------|-------|---------|----------|---------|------------\n",
      "  0 | 13762.56 |   2 |       2 |  112 |  False |    1 |    1 |     1 |  122.88 |  6881.28 |    0.00 | 2.2400e+02\n",
      "\n",
      "Choosing solution 0 with minimal metric 224.\n",
      "LO locked on attempt 1 after 0.01 sec\n",
      "  i |   f_vco  | DIV | DLY_SEL |   n  | osc_2x |   R  | mult | R_pre |  f_pfd  |   f_out  | Delta f |   Metric   \n",
      "----|----------|-----|---------|------|--------|------|------|-------|---------|----------|---------|------------\n",
      "  0 | 13762.56 |   4 |       2 |  112 |  False |    1 |    1 |     1 |  122.88 |  3440.64 |    0.00 | 4.4800e+02\n",
      "\n",
      "Choosing solution 0 with minimal metric 448.\n",
      "lock attempt 1 failed\n",
      "LO locked on attempt 2 after 0.01 sec\n",
      "  i |   f_vco  | DIV | DLY_SEL |   n  | osc_2x |   R  | mult | R_pre |  f_pfd  |   f_out  | Delta f |   Metric   \n",
      "----|----------|-----|---------|------|--------|------|------|-------|---------|----------|---------|------------\n",
      "  0 | 13762.56 |   2 |       2 |  112 |  False |    1 |    1 |     1 |  122.88 |  6881.28 |    0.00 | 2.2400e+02\n",
      "\n",
      "Choosing solution 0 with minimal metric 224.\n",
      "LO locked on attempt 1 after 0.01 sec\n",
      "qubit IF=1216.460000, readout IF=1052.780000\n"
     ]
    }
   ],
   "source": [
    "# darkfreq800 = [6.18807, 5.8285, 6.075045, 5.95940] # Best for 800 gain\n",
    "# qubitresPulse = [4.800, 4.6571, 4.4928, 4.6518]\n",
    "\n",
    "hw_cfg={\"res_ch\":6, # RF board channel indexing (not tProc)\n",
    "        \"qubit_ch\":2,\n",
    "        \"ro_ch\":1,\n",
    "        \"f_res\":5828.5,\n",
    "        \"f_ge\": 4657.1\n",
    "       }\n",
    "\n",
    "rfb_cfg={\"f_lo_ro\":122.88*56,\n",
    "         \"f_lo_qubit\":122.88*28,\n",
    "        \"att_res\":(0,14.5),\n",
    "        \"att_qubit\":(0,16),\n",
    "         \"att_ro\":30\n",
    "       }\n",
    "# f_lo_ro = 122.88*56 # 6881\n",
    "# f_lo_qubit = 122.88*28 # 3441\n",
    "\n",
    "soc.rfb_set_lo(rfb_cfg['f_lo_ro'], ch=0, verbose=True) # ADCs\n",
    "soc.rfb_set_lo(rfb_cfg['f_lo_qubit'], ch=1, verbose=True) # DACs 0-3\n",
    "soc.rfb_set_lo(rfb_cfg['f_lo_ro'], ch=2, verbose=True) # DACs 4-7\n",
    "\n",
    "# as long as you're not saturating at any point in the chain (check with gain sweep), better to attenuate later\n",
    "soc.dacs[hw_cfg['res_ch']].set_rf(att1=rfb_cfg['att_res'][0], att2=rfb_cfg['att_res'][1])\n",
    "soc.adcs[hw_cfg['ro_ch']].set_attn_db(rfb_cfg['att_ro'])\n",
    "\n",
    "meas_cfg={\"res_gain\":800,\n",
    "    \"if_res\": abs(rfb_cfg['f_lo_ro'] - hw_cfg['f_res']), # MHz, start value\n",
    "    \"if_ge\": abs(rfb_cfg['f_lo_qubit'] - hw_cfg['f_ge']), # MHz, start value\n",
    "          \"nqz\":1,\n",
    "          \"qubit_gain\":19500\n",
    "       }\n",
    "\n",
    "print(\"qubit IF=%f, readout IF=%f\"%(meas_cfg['if_ge'], meas_cfg['if_res']))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[True, True, True]\n",
      "[6881.28, 3440.64, 6881.28]\n"
     ]
    }
   ],
   "source": [
    "print([lo.is_locked() for lo in soc.lo])\n",
    "print([lo.freq for lo in soc.lo])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0xffff7b55f070>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# normal readout config\n",
    "soc.dacs[hw_cfg['res_ch']].gen_ctrl.add(freq=meas_cfg['if_res'],gain=meas_cfg['res_gain'])\n",
    "\n",
    "time.sleep(0.1)\n",
    "# Capture data on adc.\n",
    "soc.adcs[hw_cfg['ro_ch']].capture()\n",
    "# Transfer\n",
    "soc.adcs[hw_cfg['ro_ch']].transfer(buff=buff)\n",
    "\n",
    "# back to normal\n",
    "soc.dacs[hw_cfg['res_ch']].gen_ctrl.add(freq=200,gain=0)\n",
    "\n",
    "fft_freqs, psd = welch(buff, fs_adc, nperseg=4096)\n",
    "plt.semilogy(fft_freqs, psd, label='PSD')\n",
    "plt.axvline(meas_cfg['if_res'], label=\"expected\",color='r', ymin=0,ymax=0.1)\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0xffff7b4d5c10>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# configure DAC for qubit drive and ADC for readout, to see if we have any interesting spurs on qubit drive\n",
    "# we need to reduce the power a lot, so as not to overdrive the ADC\n",
    "soc.rfb_set_lo(rfb_cfg['f_lo_ro'], ch=1) # DACs 0-3\n",
    "soc.rfb_set_lo(rfb_cfg['f_lo_qubit'], ch=2) # DACs 4-7\n",
    "# soc.dacs[hw_cfg['res_ch']].gen_ctrl.add(freq=meas_cfg['if_ge'],gain=meas_cfg['qubit_gain'])\n",
    "soc.dacs[hw_cfg['res_ch']].gen_ctrl.add(freq=meas_cfg['if_ge'],gain=1000)\n",
    "soc.dacs[hw_cfg['res_ch']].set_rf(att1=rfb_cfg['att_qubit'][0], att2=rfb_cfg['att_qubit'][1])\n",
    "\n",
    "time.sleep(0.1)\n",
    "# Capture data on adc.\n",
    "soc.adcs[hw_cfg['ro_ch']].capture()\n",
    "# Transfer\n",
    "soc.adcs[hw_cfg['ro_ch']].transfer(buff=buff)\n",
    "\n",
    "# back to normal\n",
    "soc.rfb_set_lo(rfb_cfg['f_lo_qubit'], ch=1) # DACs 0-3\n",
    "soc.rfb_set_lo(rfb_cfg['f_lo_ro'], ch=2) # DACs 4-7\n",
    "soc.dacs[hw_cfg['res_ch']].gen_ctrl.add(freq=200,gain=0)\n",
    "soc.dacs[hw_cfg['res_ch']].set_rf(att1=rfb_cfg['att_res'][0], att2=rfb_cfg['att_res'][1])\n",
    "\n",
    "fft_freqs, psd = welch(buff, fs_adc, nperseg=4096)\n",
    "plt.semilogy(fft_freqs, psd, label='psd')\n",
    "# qubit drive mixed with readout LO?\n",
    "plt.axvline(meas_cfg['if_ge'], label=\"spur1\",color='r', ymin=0,ymax=0.1)\n",
    "# lower sideband, RF->IF leakage, getting past the IF low-pass filter and into 2nd nyquist?\n",
    "plt.axvline(meas_cfg['if_ge']-(rfb_cfg['f_lo_qubit']-fs_adc), label=\"spur2\",color='g', ymin=0,ymax=0.1)\n",
    "# 2x IF (distortion maybe), mixed up with 2x LO and mixed down with 1/2 LO?\n",
    "plt.axvline(rfb_cfg['f_lo_qubit']-2*meas_cfg['if_ge'], label=\"spur3\", color='aqua', ymin=0,ymax=0.1)\n",
    "\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0xffff7b364d00>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# configure DAC for qubit drive and ADC for qubit drive\n",
    "# we need to reduce the power a lot, so as not to overdrive the ADC\n",
    "\n",
    "soc.rfb_set_lo(rfb_cfg['f_lo_qubit'], ch=0) # ADCs\n",
    "soc.rfb_set_lo(rfb_cfg['f_lo_ro'], ch=1) # DACs 0-3\n",
    "soc.rfb_set_lo(rfb_cfg['f_lo_qubit'], ch=2) # DACs 4-7\n",
    "# soc.dacs[hw_cfg['res_ch']].gen_ctrl.add(freq=meas_cfg['if_ge'],gain=meas_cfg['qubit_gain'])\n",
    "soc.dacs[hw_cfg['res_ch']].gen_ctrl.add(freq=meas_cfg['if_ge'],gain=1000)\n",
    "soc.dacs[hw_cfg['res_ch']].set_rf(att1=rfb_cfg['att_qubit'][0], att2=rfb_cfg['att_qubit'][1])\n",
    "\n",
    "time.sleep(0.1)\n",
    "# Capture data on adc.\n",
    "soc.adcs[hw_cfg['ro_ch']].capture()\n",
    "# Transfer\n",
    "soc.adcs[hw_cfg['ro_ch']].transfer(buff=buff)\n",
    "\n",
    "# back to normal\n",
    "soc.rfb_set_lo(rfb_cfg['f_lo_ro'], ch=0) # ADCs\n",
    "soc.rfb_set_lo(rfb_cfg['f_lo_qubit'], ch=1) # DACs 0-3\n",
    "soc.rfb_set_lo(rfb_cfg['f_lo_ro'], ch=2) # DACs 4-7\n",
    "soc.dacs[hw_cfg['res_ch']].gen_ctrl.add(freq=200,gain=0)\n",
    "soc.dacs[hw_cfg['res_ch']].set_rf(att1=rfb_cfg['att_res'][0], att2=rfb_cfg['att_res'][1])\n",
    "\n",
    "fft_freqs, psd = welch(buff, fs_adc, nperseg=4096)\n",
    "plt.semilogy(fft_freqs, psd, label='PSD')\n",
    "plt.axvline(meas_cfg['if_ge'], label=\"expected\",color='r', ymin=0,ymax=0.1)\n",
    "# nyquist image of RF->IF leakage, getting past the low-pass filter??\n",
    "plt.axvline(meas_cfg['if_ge']-(rfb_cfg['f_lo_qubit']-fs_adc), label=\"spur1\",color='g', ymin=0,ymax=0.1)\n",
    "# 2x IF (distortion) mixing with 2*LO? visible on spectrum analyzer at 4.44 GHz\n",
    "plt.axvline(rfb_cfg['f_lo_qubit']-2*meas_cfg['if_ge'], label=\"spur2\", color='aqua', ymin=0,ymax=0.1)\n",
    "\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0xffff7b229580>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYEAAAD4CAYAAAAKA1qZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3dd3hUZfbA8e+bTggESACBAKH3ogQEQalCBJG1F9wVRflZ0HXXApYVdUVZ3XVdV1fEAmIDC9KLAlKkhSJVQEIPRZoEAqS/vz+m5E5LJplJZm7mfJ6HJzN37sycFO6Zt51Xaa0RQggRmsICHYAQQojAkSQghBAhTJKAEEKEMEkCQggRwiQJCCFECIsIdAAAiYmJOjk5OdBhCCGEqWzcuPGU1rq2L68RFEkgOTmZDRs2BDoMIYQwFaXUQV9fQ7qDhBAihEkSEEKIECZJQAghQlhQjAkIIURZ5eXlkZGRQXZ2dqBDKTcxMTEkJSURGRnp99cOaBJQSg0FhjZv3jyQYQghTCwjI4Nq1aqRnJyMUirQ4fid1prTp0+TkZFBkyZN/P76Ae0O0lrP0VqPio+PD2QYQggTy87OJiEhoVImAAClFAkJCeXW0pExASGE6VXWBGBTnt+fJAEhQlja/jPsPn4+0GGIAJIkIEQIu+39NQx6a0WgwzC98PBwOnfuTPv27bn11lu5ePEiAOPHj6ddu3Z07NiRzp07s27dOgD69OlDq1at6NixI61bt2b06NGcPXs2ILFLEhBCCB9VqVKFzZs3s337dqKiopg4cSJr1qxh7ty5bNq0ia1bt7J48WIaNmxof87nn3/O1q1b2bp1K9HR0QwbNiwgsUsSEEIIP7r66qtJT0/n2LFjJCYmEh0dDUBiYiL169d3OT8qKorXX3+dQ4cOsWXLlooOV9YJCCEqj5fm7OCXo+f8+ppt61dn3NB2Xp2bn5/PggULSE1NZeDAgbz88su0bNmSAQMGcPvtt9O7d2+3zwsPD6dTp07s2rWLTp06+TP8EklLQAghfHTp0iU6d+5MSkoKjRo1YuTIkcTFxbFx40YmTZpE7dq1uf3225kyZYrH1wjUfu/SEhBCVBrefmL3N9uYgLPw8HD69OlDnz596NChA5988gkjRoxwOa+goIBt27bRpk2bCojWkbQEhBCiHOzevZs9e/bY72/evJnGjRu7nJeXl8czzzxDw4YN6dixY0WGCEhLQAghykVWVhaPPvooZ8+eJSIigubNmzNp0iT748OHDyc6OpqcnBwGDBjArFmzAhKnJAEhhPBRVlaWy7EuXbqwevVqt+cvW7asnCPynnQHCSFECJMkIIQQIUySgBBChDBJAkIIEcIkCQghRAiTJCCEECFMkoAQQoQwSQJCCBFECgoKKvT9/J4ElFJ9lFIrlVITlVJ9/P36QggRTC5cuMCQIUPo1KkT7du3Z/r06SQnJzNmzBi6detGt27dSE9PB2DEiBF888039ufGxcUBlsVjffv25a677qJDhw4VGr9XK4aVUh8D1wMntNbtDcdTgf8A4cCHWusJgAaygBggw+8RCyGEB48DrmXcfNMZeKuYxxcuXEj9+vWZN28eAJmZmYwZM4bq1auTlpbG1KlTefzxx5k7d26x75OWlsb27dtp0qSJ/4L3grctgSlAqvGAUioceBe4DmgL3KmUagus1FpfB4wBXvJfqEIIEXw6dOjA4sWLGTNmDCtXriQ+Ph6AO++80/51zZo1Jb5Ot27dKjwBgJctAa31CqVUstPhbkC61nofgFJqGjBMa/2L9fHfgWhPr6mUGgWMAmjUqFHpohZCCDeK+8ReXlq2bMnGjRuZP38+zzzzDAMHDgRAKWU/x3Y7IiKCwsJCwLJ/QG5urv2cqlWrVmDURXwZE2gAHDbczwAaKKVuUkq9D3wKvOPpyVrrSVrrFK11Su3atX0IQwghAufo0aPExsZy99138+STT7Jp0yYApk+fbv/ao0cPAJKTk9m4cSMAs2bNIi8vLzBBG/hSRVS5Oaa11jOAGT68rhBCmMa2bdt46qmnCAsLIzIykvfee49bbrmFnJwcrrzySgoLC/nyyy8BeOCBBxg2bBjdunWjf//+Afv0b+RLEsgAGhruJwFHS/MCSqmhwNDmzZv7EIYQQgTOoEGDGDRokMvxRx55hHHjxjkcq1u3LmvXrrXff+211wDsu48Fgi/dQeuBFkqpJkqpKOAOYHZpXkBrPUdrPco2kCKEqDiB2tNWBBevkoBS6ktgDdBKKZWhlBqptc4HRgOLgJ3AV1rrHeUXqhBCmMOBAwdITEwMdBhe8XZ20J0ejs8H5vs1IiGEKCWttcNsnMqmPFttUjZCiBBVWXqDYmJiOH36dKXt3tJac/r0aWJiYsrl9QO6x7AMDAshfJWUlERGRgYnT54MdCjlJiYmhqSkpHJ57YAmAa31HGBOSkrKA4GMQ4hQVFk+N0dGRgZkpW1lId1BQggRwiQJCCFECAtoElBKDVVKTcrMzAxkGEKEpMo6kCpKJ6BJQBaLCSFEYEl3kBAhStoBAiQJCCFESJMkIIQQIUwGhoUIUTIuLEAGhoUQIqRJd5AQQoQwSQJChCgt84MEkgSEECKkSRIQIkTJwLAASQJCCBHSZIqoEEKEMJkiKoQQIUy6g4QQIoRJEhAiRMnAsABJAkIIEdIkCQghRAiTJCBEiJIVwwJkiqgQQoQ0mSIqRIiSgWEB0h0khBAhTZKAEEKEMEkCQoQo6Q0SIElACCFCmiQBIYQIYZIEhAhRWqYHCSQJCCFESJMkIESIknaAAFkxLIQQIU1WDAshRAiT7iAhQpSMCwuQJCCEECFNkoAQoUpaAgJJAkIIEdIkCQghRAiTJCBEiJKdxQRIEhBCiJBWaZLAst0n2Hjw90CHIYQQphIR6AD8ZcTk9QAcmDAkwJEIYQ6yTkBAJWoJ2Jy5kMvj037m8JmLxZ735g+/kjx2HvkFhRUUmRBCBJ9KlwTmbzvGzM1Hufr1Hxk/7xf78bX7TvPZ2oP2+28v2QNATr4kARGapCEgoBImgVzDRf2DlfsBOJ2Vwx2T1vL8zO0UFDr+6bcbt4iF249VaIxCCBEsKl0VUedPN7uPn+fWiWvs9/MLXT/5f5l2uGzvpbV0JwkhTK3SVRF13i1p0Fsr2Hfqgv1+QaHmzR9+dTinUGs+XLmPS7kFpdptacy3W2n+3ALfAhYiQGRnMQGVsDuoJCt+PWUfD7BZuecUr8zbSZsXFnKPdZaRN77akOHv8IQQokJVuiRQ0oebBz/bWOzjK349CUBeQSFHz16yH8+8lOfxOc7jDEKYgfzVCqgESUBrzcgpRZ/ex8/f6ZfX7f+v5Vw1YSlZOflsP5JJp5e+Z95W9wPIeTIuIIQwKdMngXPZ+SzZdcKvr3k+O49D1nUG2XkFrNt/BoC0/afdni9JQAhhVqZPAmcu5Pr9Nc9n59tv/3zoLNPXHwIgMjzMvsis0NAFlFdQdPvHXSc4eLpoIFqIYCXjwgIqQRLILYfFXst2n7TffmDqBn79LQuAAq35YMU+AJ6Zsc1+jrElcO+U9fR+Y5nH1951/ByvzP3FPjPj83UH+dSwiE0IISqS6ZNAeXTFPPvdNrfHJ686QEyk5Uc2fUPR2gJ3iWjJzt8A6DlhKf3+tcx+fPgH6/jwp/32Fsxz323nbzO3+yt0IYQoFdMngfwKnpnz+0XXWUK51kT09Ddb7MdGfrKBE+eyOXL2EvtOGtYpWFsASqlyjlSI4sl+AgIqQRJYvfeUw/1377qiwmOwtUac1w2cz8l3d7oQQgQN0yeB1xfudrjfr3Udvnv4KiLDK+6Tdl6++09UOXmu3US2wbgffjnucPw2Q2kLISqENAQElSAJGI2/sT1VosK5vFFN9owfzM6XU+2P3Z7S0OHccUPb+u19dxzNZOPBMy7Hc92MV9gGhMd86zjukHbgDKeyckr93pdyCziWeankE4UQwo1KlQSchweqRIXbb7dvUN3hMX+u8h07Yxs3v+f6Sd7dexiP/HYu2+GxlFcWl/q97/k4jR6vLS3184QQAipZEii2IJbTQKzW0KputXKNx1h2ouiNi25e+eoSn98j7YBrC0QIb0hvkIBKlgSK+3TvPEJQqDXT/697qV5/WOf6pTp/4Q7Hfv9/Ltrt9WBxdl4Bf5u5nbMX/b8YTgghbEyfBBrUqGK/XWwScMoCBVpTIzaK9PHX2Y/9ZUBL++37ejZxeY2q0aXbktm51tA7P6Z79bzsvAJmbDrCp2sP8m9D2euVe07y7o/ppJ84z4jJaWTnFdgfW733FOv2Wcpa7Dp+jv8stlRKnbv1KAPeXE5OfgFCGMmKYQGVYKN542Ixd3/Uf7u+LXO2HEU5tQUub1gTgIjwojwYZjjl4b7N+HiVZWeyyHBFs9pxVDWMMZTWpBV7vT639d8W2m/nGkpS/PGjNAB+2nOKNftOs+nQ7/bH7vpgHQAHJgzhxndXcymvgIf7NuP1hbs5dOYix85mk5xYtczxCyEqJ9O3BIxJoMBNFhjZqwkzH+lpbwncntKQLeMG0qNZgv2c5wa3YeYjPckztCQiw4p+ND+/MJD5j11d6paA0avzd3l1nvO4RnZeARuc+v1tu6M5JzabS9YWQkGhtt92t6OaEEKYPgkYSzYUFtO+Tapp6TZqVqcq8VUiHR574JqmdG5YgwLDhTLCsM4gJiKMsDBF1ajybzg51xH67ucj3DJxDUcMg8w51u+5uO8XLEnAllRsRe6OZV6SPZUFEFwrhgsLNWO+2cq2DP9tNSu8Y/okkFegibV20yRUjfJ43tUtavP1gz24v1dTj+fkG7pewg19Q7bbtrpBnRrW8Cnm4rwwa4fb4z0nFE0DzbJWOS2pZEZ+obZ3kdm+t5v/t5oHP9vk0OLIvJRn30xHiEA4l53H9A2HuWXi6kCHEnLKJQkopaoqpTYqpa4vj9e30VqTW1DIfT2b8J87OnNrl4bFnt81uRZhYZ5XEl/fsWj2T6RhrMBW5yfW2hJokhDL80Pa+BK6T85Zk4BxYNidz9YetH/Wy7O2co5mWtYmGMtfP/z5Rv70cRqZbuoiCVERbF2bOeVQFVgUz6skoJT6WCl1Qim13el4qlJqt1IqXSk11vDQGOArfwbqju1CFhMZxrDODYq9wHujQ1LRhvdhCq5ukejwuK3FcSG3gGZ14nx6L1+cz7ZcrC/mFj/d9I1Fu+1dRv9dssc+YwjgVFYOszYfAbCXyna3wtlX57I9J5Zb3lvNwH8v9/t7Cu8E0+ygYOqaCjXednJPAd4BptoOKKXCgXeBa4EMYL1SajZQH/gFiPFrpG7YBoWjIvzfoFFK8eE9KWTnFl0YY60Dw5dyC+jVPJE7uzXi3p7JDPz3Cr+/f3Fsn5b+Mn1LCWcW/Uf/cfdJfjTsk3Dv5PXs/u08PZoWDZCX9j+i1pq8Au3x5z9r8xH+PG0zcx/tRfsG8S6Pbzj4u5tniVAUTAkp1Hh19dRarwCcl6Z2A9K11vu01rnANGAY0BfoDtwFPKCUcvseSqlRSqkNSqkNJ0+WrT/algSMXTe+mvlIT54caFkvEB0RTnxs0SCybYropbwCIsPDeO2mDrSsW40ujS3TTfu0qu3yeo8PaOG32Lzx52k/O9y/5KHLaPdv5wHIM4wbLNh23O25AFszzrL/lOOOaRMW7qLl8wvsv4fTTrWPlluTzq7j573/BkSZnL2Yy/HM7JJPNAim624wxRJqfLl6NgAOG+5nAA201s9prR8HvgA+0Fq77WPQWk/SWqdorVNq13a9eHrDNjPIn0mgc8MajO7n/sLduWENbu2SxOu3dHQ43q6+pS5R75a1HQaUZ4/uyeOGBWjuxPkw7dSdWZuPOtwvaee1nLwC+6yocbN3sHD7MY5nZpNfUMilXEsCyc4r4IZ3VtH3n8scnvvFWsu2m62eX8DE5Xvp8spi5m+zzDy6kJPPBWt31cLtx3lj0S6XJCH8p+eEpXR/zfcyJIFSbMkXUa58uXq664C3/ya11lO01nN9eP0S5ZZjd5A7EeFhvHFrJ5rVdhwPSG13GWAZQ1g9th9/vbYl7951BR2TXGcR9W7pmPCm3Nu1/AL2wvAP1zm0Fh78bBPdX1vCn6dtps0LlkVrY7/d6va50dbZUoUaJiywrINI229pMLYbt4hFOyy7qy3e+Rvv/riXhz/fxObDZ+1bdAr/uZAbfCvCV+45yUYvu/wkBQSOL1fPDMA4HScJOOrh3HJhGxiO8mNLoCyuap7IgQlDaF6nGnWrx/BY/xYM6VjP/vjU+7rZbz8x0LFlEBfjviXw6o0dyidYJ8cys8l2s+/BPOsneq01Mw2ti9z8QrTW/Lj7BKeyXOsahRWzY1ragTP84d1VjJ+/0w+RC1+V96fvP36Uxs3veTflUxoCgePL1XM90EIp1UQpFQXcAcwuzQsopYYqpSZlZpZtgUh5dAeVh2ta1qZOtWjA9SLZsGasw/1uybVYNbYfd3ZzP931surlPt7u4OR5xy6cls8v4LFpm7l38nq35yvluYaT/EcXnkh3UOB4O0X0S2AN0EoplaGUGqm1zgdGA4uAncBXWmv3K5080FrP0VqPio93nTniDduAZEQF7iJWVrNH9+LTkd3IslYRbZwQy75XB1M1OoL7ejaxDyrXjY+hQY0qKKVY/lQfl9d5/vo23JaSxB9KWdG0rMbNdv2VztniucEXpqDr+JL3RXBOFFprbn5vNQu2yWrmihJM190gCiXkeDs76E6tdT2tdaTWOklr/ZH1+HytdUutdTOt9fjyDdWz4E8BcFl8DFe3qE3DWpZP/k8Pam1f1/DC0LYM7mDpPjJ2bTVOqMqBCUMcXqd3y9q8fksn+repW+z7Navtn2JxR0s54+RYZjZnLpRc/jrPaU1CXoFm48HfeejzTaV6P2EeZy/meqxmG0wJKdQEdz9KCWx/OKqYfuhg06BGFfa/NthhzACK5v6XNMhtm01kSxo2tZxKZjjXRyqrMxdKN6Nn7lbvPskbk8DsLUfZc8LzNNLUt1Zw4/9WlSoOEXw6v/wDI6dscPuYLBYLnICWklZKDQWGNm/evEzPt/3hmCcFWLhLWp2sq5UHtKnj8XmrxvazPzc8TPHBn1JIjItiyc4TdEmu6dBP37BWLJsOnfU51vIqJXHg1EX77ce+/Nnl8cJCTYHWRIaHyTqDIJCdV8Bnaw8y4qpkh/LrpfVT+im3x6UlEDgBTQJa6znAnJSUlAd8eR0TNQQ86phUg11/TyUm0nXPgrdu70xCXJTDBjoA17a1dAld3qimfWqmzUs3tKNqdARfrDvkU1y2OkX+NvSdnzw+9tnagyzacZyVe04x8e4ryuX9Ren8b9le3l6yh2oxEdzetVGpnvuv73fzSN+iD3qLdhxnkHVatc2xTDdbsYoKYepNZSrbpwd3CQDgD5c3KPG5zh/OasRG8dzgNj4ngUB4fmZRiaoHP5MxgvJSmv8/5y7Z6lV5tx7h8Jmilt5/l6Y7vNf/fbqRjc8PICEu2n7s5vfWeB+M8CtzjwlYv1aGloCv3M3PrxodwdxHe9GruWMhvP+7xn057XAfC/AJcylLP7zzX8jprByWuylDfvXrPzrcd95atbitYEXFCmgS8HWdgG1usacdtkKJpwt4+wbxvHaT48KzqtERPNbftTTG3lcHl2si+M8dncvldTMv5clFpQxK8zPzNI//nslp3PNxWollzZs7Vd0taS8MUXECmgR8XSdg/zOSHGBvCbSqW43dr6Q6PNawVixvGOod3derCX+9tiWJcZYZRWNSWzP/sauB8v1R1jY0/8vCXe2hi7n5dHrpe8bPk1XIpVWa63BRq9vxL2TfSUtRQWMZ8nluZojVdxrPKqmmlag4pu4OspEcUNS/Gx6miI5wHVswfsJ3Llo3pEM92lqL4JVn15qvU3m7vLKYsxeL1iB8uHIfKa9YFqbN2VqhFUsqhZJW6f5+IddldpjzrzDC+neVk1fIscxLXMot4JEvXMdxnHeusyWNtP1nyLxU/Ay0nPwCbnt/DesPOBcyFv5g6iRQ2QaGfWG7yF/VLKHYx4d2KlppbLtdJaooadi61h7u08zlNW5PcSxlcaObAWvj+MOTTnWSUpJrev4GvPS74aL0yryd9oFKGc6wKE35hQLDucbkanPr+2sY/PZK0vafYeoay97Xzj9mW8mWk+dz6PHaUrq88oNX7/3cd9u4mJvPbe+vYeh/Pc8UA0g/kUXa/jM89902r15blI6pk4CtkWqmxWLlpW396kwf1Z1nBrvf9jIizFrx09AH8ML1bVn+VB9qV3Ptprmzm+M0wBkPX8UrN7Z3eO4/b+1EtHVxW+vLqgHQ1LBSuU+rojUPY1Jb+6XG05bDZ/ndzYrk4grXhZLS9PMXGnpk/rFwl8vj6SeyOHL2EmNnFFWR1Vi6cl6as4O9J7PsJVsGv70S8H720PoDv9P2hUUAHDLMJCqKTdvHGWxfncf+tNY+1xzSWvPm97tJL2axYmVn6iRgXzEc2DCCxpVNEzwO7NqO5xv+5yulaJzgVF7C+nRjYujetBZXNKpJZHgYgztY5ndXiQonPEwx4eYOxEaFM31UD5Y+0dv+u+jUsIbDbmJ1q/s2HmDz+PTN9JjgWjdfkoBFgRcXxX0nsxgxOc1he1J3FWGLzi/aTOiFWTto+fwCJq86wFNfb+G3c/7fI2LFryd5ac4OWv9tIQWFmmlplm1LbHW3bB6fvpkmz8y337+Qk2/fetUoJ78ArTWTVuyl+6uOfztnLuTy9tJ0/vRRGoWFmunrD9nHK+ZvO+Z2fKOyMffsIPvr+C+mysqWBEr6pHhH14YO5wN8YiiFbVso1NXatXPj5Un88nIq8bGRNDXsszCsk2OBO3ddR2WVnVfI3pNZDseOnL3EruPn3J6ffiKrxNkrlUWhh/HWbRmZLNxuuaD9fe4vLNt9kv8t22t4nua7nzNcFh0Wxx8r0t3508dpfGLtfvps7UG+3pgBWH7HRrYNlD5bazm3yys/0OHF7x3OuZCTT6vnF/KfJXt4df4ujp/LpuVzCxjzjaV1YxubuJhXwO2T1jDm221MWmH5uTz8+SYe+WIT24+U7fpkFqaeHWQjU0RLZtsas6SdzMYNbceOlwYRGR7GQ32a0a91HYeB5t4ta9v3TnDneuvFv6d1bOCft3Zi2qjufu+yO+C01SVA6lsrWX/gDIWFmreX7OHEecsOaQPeXM4DU93XrDG7fSezHGZNeWoJDH3nJ/vCO1uCX7rrhP3xJbtO8JfpW7jt/TXM3nLUodswkJyr2H6zMYOLufkOHwKen7md3PxCl30xzmXn8WWaZbHkW4v32I/nFhQyfYOldWHrvjp7MY/1B363Ps+xxXE8M5tvNmaQPHYev50rXUFFM5AVwyGiR7ME/nZ9W27pklTseeFhiqrWRDEmtXWp36drci2HyqclvR9YKp7uPel6US/OyE/cX9RvnbiGP3ZvzKdrD/LmD79Szbppz8o97mvWmMHprBy6vLKYTknxzBrdy+Gxfv9aTjVDYvdmTKCkhPzYlz/z6ZoDZQnVQUSY4scn+7gsHPPFk19v4bufM1iVftrh+LjZ2x3uFxRqRk5Zb7+wuzN/2zG3dauiwsP4fofjftszNllaIx+v2s8DVzcloWqUx5/jifPZVI+J9FgBINiYfEzANjAc4EBMQCnFyF5N/FZd1J+cS09v+tu1LH2id5lf71Nr9wDA+RJqH+XmFzJr8xGSx85zWyxv57FzfLXhsJtnVpw9JyyferdkWLoltNZcMPSPnzfcLizU/PrbeV6cvYOlu35z+3oRXkylKu7i6Y2Zj/Qk/dXB9tLp/uScAAC+TCv6HR05e4lmz84v8Xt4+PNNbhetRUWEsf1oUdfi/VM3sHqv5T3fX26Zljxl9QH745kX8/jFcH638Ut46LONXn8/gWbuJGD9KjnAfJ4a1Mp+u6ZTGexaVaMcxhf85Vx2HjM2ZdDkmXnk5Bewbt9pWj6/gD9P2wzA/tOurZHr/rOSp79xv8dyRckvcLxQTVi4i3bjFrHjqGtfdaHWDPz3CqasPsB9Uzawco9rSYewCphP627L1+gK2gu854SlPj1/8qr9vL1kT7HnvDTnF/vtuz5cy+C3VzrMVvpxt+vPPViZOwlIFjCd/955OV8/2IN+rS3TRwe2rcunI6+skPfu+KJlZbHWMHvzUWZsOuLw+MXcfL7ZmOF22mF+QWBWuGqtufujdQ7H3l++D4Ahb7vOrz9w2nG65ar00y79+xXx3yXSzW5/tm7GJon+2fCovPzuZfl0W+XTHdZWQE5+oX3fczOpJPsJSBYwC+NitS0vDCQ+1tI9NfneruTkFdKrRaKnp9q1b1Cd7UfczwQqyWlr19NTbj7d3/WB5WJbo0okA9o67tx2IbeA+CoV95lp+vpDfL7uEH1bOe4v8Zmhq8sd543dNZq3l+5xOlb+3O05EBsVzpkLlsQ2bVR34qIjeOKrLez+zZxz9Hu8tpR9rw623z93Kc+e6MykcswOkhxgSrYEANC3VR1S219W4uwlgC6NfF95XJz7p25ga4bj9EdPtW5+O5fNQTfdSKVxISef95btJXnsPPtCuDHfbmNrRiaTV+13ONdYZtsb7y/fx0+GQfEnvtpSIVnAXUvA1kWUX6jp3jSB9g3iTZsAbM5n59tXq+cWFLpsm2oGpu4Okh3pQkNVQ1mLiDDFw33L1nIsjVecCtIVepiKduWrS+j9xjKf3qvduEX2Fbt7T2Yx2lB7xx+b+mw4WDRA+u2mDOZtK/8FUO5Whydbu4HMeKH05Ni5S/ZCfFk5+fZtYs3E1ElAhgQqtxVP9WXuo7348ak+9mPrnu3vcXZLq7ru1y6UhfNUy2dnbKP3G2Wb6ph+IsvjBuvOHv58k9f7NAczd78jWyVbb6YNV7SuZaxrNWpq0Syg1LdWMmGBa/mNYGfuJGDCjeaF9xolxNK+Qbx9vnXVqHAS4qLtdZCc/efOzqQ6bVtYVs4DwUt2neCgddD1m40ZfLrmgFefaE9n5TDgzeV0fPF7twPOh53q5pw47/8yDGXlvA9FabgbE0iIi2bX31N54tpWbp4RWJ6mipYk43fH3993P4GNWdcAABLBSURBVB9xOWdbRmZQl842dxJA1gmEAtuv15bsjTmghmFcIToi3G3tpKu9GGx25mmWx57fzvPk11v426wdtHhuQYmvY6t3k5NfyD+/3+3y+GsLgncfhFu6JNE4oWzz/I2/hqVP9GbR49cAli1US5qieq3ToHxFcLdC2rkKrtvneeiStl2Thn+4lqHv/MT4eb+4PzEImDoJ2EgOqNyqWFsCT6daPkEaWwLfP34N9eJjAMtgpLu582XZzOZ8Tp7bypLpJ7LcnA2r0k9xzk3xMuPMtXd/3Ethoear9YfJzivg5vdWM3/bcZfn+EtJu8TVjI1kWOf6Hh+PDA9j5sM9WT22H0ue6E33prVczkmMs+xl/fGIFABustaIqmJYLdu0dhytLiu+q27LuIGsGtuP/a8NZrQXYz7edP01q+39VNRuTVy/N4AHrm7CW7eXfkc8W6PPtrBtc4bj32VufqFLKyJQzDefyUDKRoSGiPAwh1IUxpZfneox9kHb8DDlMk++rA6fucSAN1e4HH/oc/cb3w//cB2t6lYjJiqcV4a1p0OSZcabcy2fps9aql7O3HyEjQd9W5VbkpLKLIeHhfGvWzsxslcTbnhnldtzalaNwtZbPm1UD5LHzgNgdN/mnDyfw/gb29u7fn595TqiIsJ4sxQXzTGprflm42Hiq0TaV7NHuJlZ5Kyk/ZHrx8cwbVQPuo5f7HUcd3ZrRL9/LXc4/tyQtoClYqnR5BFduXfKepfXiYoIs3f9TF1zwBCwY7xjZ2xlxqYj7Hw51WE/j0CQKqLCdKIjwujRNIGP7rF8+rQtPoqOCHfb9eNtjXtf7f7tPFsOn2XoOz/xv2Xp/Lj7hMu8fZvSFiK7rHqMy7H4KpFMHtHV43NKKiMUHmZJsB2TatAt2f0nYU+eHNSKf9zS0aHv35s+dGcP9WnGkif6OBwzzizq0CDevleFUZbTrKk3b+vkcF8pRe1q0faS6M857bPx+s0dHe5HhIe5rFIvbv2RbSc+Z8a+/xdmFRW/y3XqXpxpHTtwV/q6opl6nYCWJcMhSSnFl6O607+Npe944t1d+HhECrWqRjk03Vc+3Zc5o3ux4WDFb0v4+sLd3Dt5vUtdJJvSFswLD1Ms+PPV9vuXN6rB93+5hk4Na7g9v0ODeCaUMLBrW7UN8NWDPeyJ4KN7UnjmutIXD/QX494Qcx7txT+sF+zXDftk/8GpNPlNVySx/aVBjBtq+eRue4k29SwX6wFt6/LDX66xn39b14akPdufLx/ozrcP9XAbh/HD5ZjU1jyd2oqv/q8HvVvWJsGp1ElJdh47Z59xdim3wJ6gP151IOAVW83dHWT9Ki2B0FYjNop+rS0JoZbhP2fDWrE0rOW4YUqjWrFud7IKRnWrR9s3bYkMV/YLGsDzQ9pQ19o6WPzXaxy6rm66ogFv3mZJhnExEVSNiuDeKesduipWPt2Xy+IdWxdTR3YjKyefxLhoe4J19u5dV3gcF/Efx4tip4Y17N2BR36/RP82dWhfP55H+7WgzQsL7efFRUfQr3UdXprzi/2a8M5dlzN/6zGSE2JdZhHWqR5DHacW1pInetPf2iXUu2Vt+/GHDNutdmti2V/jxaFteXGO9wO+d3+4jjX7HIvfTVy+lzb1qjGss//22ygtUycB29+K5ABho5TlE/Mew4Wq9WXV2HX8PM9c15qRvZrQ4vkFphtPirOWxLZdyI1lipvVjuOJa1vyrx9+BeCoYfOV6ztaBn63vzSI6IgwWjy3gOZ14txW94yJDC+x/PGQjvV8/l5KUtwH479cWzRjx11fuu33amtNVI+J5A6nrVKL06x2HHMf7UVeQSEtShh8HtGzSamSgHMCsHEuEFjRKsfsIGkKCIM29apzg6FG0dcP9uD+Xk2456pkIsLD7BcK535k265qwcJWBntAm7q8cYslVtv6BePsG6UUj/ZvYb9fu5rr+EFcdASR4WFMvrcrX9xfMQX7yiqxFLO5xt/Y3mE2kW2SgC9XhPYN4rncy9Ik4637bt/qwwK4RDd7fFckU7cESpohIARAtZhInr++rf1+VHgYuQWF3Hh5A/761RYA/nFzB25LaUh4mOLzdYcCFaqD4Vc24oOV+5n0xy72ufW2T8nFzSgprmSzc0G6YFSrahRf3H8lteJK7ncffmVjh/sJVS0XVOcxg/Iy/MrG9hhs22CWVkWV2PbE1C0B2WhelMW8x3rx1u2dHVqQg9pdhlKK8Td2oGZsYDbe+eu1jouTnh3chvTx1zksrrLVUYqJ8JwEnGfCmNFVzRNpfZn7GTjFiY+NZOfLqfzZ0DIyusbQzx8sPNWlqijmbgnYy0YENg5hLi3qVnPp7zVOS6xVNcrrmvL+NOqapnRpXJPhH1pKWiulXObMf/dIT77dmOGwUtqZ8yY9oaa4VtLU+7pVYCTeCfT4lLlbAtavsp+A8JVxjrsxIXz9oPvpgyVNv3TmadXpxLu72G/HRIbTs3nxJS5a1q3GM4PbyDhYJRLoloCpk4CN/H8QvjJWvbSVW/j7sHZ09bCI6vJGNe0lEtz53/ArHO4n1axiv21c+JVUswpf3H8lzw4umpf/05i+rHy6b+m+AWD5U33K9DzhX48PKOqKevXGkj8shHRLwOcVw4H+6YlKw/jJ2pYE2jewLGJ0V2ZYKXjt5g6sHtvP7es5l+2pEWvpounXug5Ln+xtOE9xVfNERl1TNA89qWZsmTZob5xQtVw2dhfemXKvZfX29R3rkWgd1K7lRddcSLcEfF4x7Od4hADLlEzAvpDo6wevYv9rgx3OKdSa6Ihw6teowoirkl1ew5hUDkwYQvM6cUy8+wr+N/wKYqMi7AXQPFTFFibUp1Ud6++6Gl0aWz44ePNBNdCfZU39JygDw6I8jO7bnLRn+9OgRlEXjnMffKGhPPyLN7Rz2Tw93M0fZWr7evbFWLZPf2Hyx1spvXhDO266vAF9W9dhTGrxJTgC3RIw9ewgZKN54aNpo7qz/Yhjd2RYmHIpJwCW6YUrfj0JQNVoxxkok/7Yhf2nLvDLsXPUj69i70pyV34ZoNVl1dhzIsuUG5OLktWLr2KvpvpQn2b27UPdCXRLwNR/gdISEL7q3jSB7k0TvDp36n3duJRbwM+Hf6dxguMnf9u004GGnc2M5a+dvX5LR4Zf2dihtSFCh1Jw4+UNmLHpSMBbAqbuDrKRJCAqSpWocK5qVvqdypzFRkXQo5l3yUdUPh/f05WRvZoAJZf8Lm+mTgIyMCyEMKO+resYxoNkTKDMispGSFNACBH8EuOi6dDAUg7DlgQC3RIwdxKQjeaFECYy4qrGjO5nWUxmW0siYwI+kAJyQggzuS2lqFy5sieBAAVjZeqWgI20BIQQwWzJE70JV45Tj21rTwJd+cDUSUAGhoUQZtDMaRN7KBoTCPQ6AZN3B8lG80IIc5IxAT+S7iAhhNnYZjUGekzA5FVEra/jx5iEEKIi2D68BnpMwORVRG1TRCUNCCHMpU71aGaP7kl/a9XaQDH1wLAQQphVdEQ4HZNqBDoMc48JSHeQEEL4pnIkAckCQghRJuZOAtavUjtICCHKxtxJQEvtICGE8IWpk4AQQgjfmDoJSNkIIYTwjamTADIwLIQQPjF1EpDFYkII4RtzJwFZJyCEED4xdRKwkYaAEEKUjamTgAwMCyGEb8ydBGSjeSGE8Im5k4BsNC+EED4xdxKQgWEhhPCJuZOA7YZkASGEKBNTJwEbGRMQQoiyMXcSCPC2bEIIYXZ+TwJKqTZKqYlKqW+UUg/5+/WN7KWkpSEghBBl4lUSUEp9rJQ6oZTa7nQ8VSm1WymVrpQaC6C13qm1fhC4DUjxf8hFZGBYCCF8421LYAqQajyglAoH3gWuA9oCdyql2lofuwH4CVjit0jdKNpPQNKAEEKUhVdJQGu9AjjjdLgbkK613qe1zgWmAcOs58/WWl8FDPf0mkqpUUqpDUqpDSdPnixb9LbX8unZQggRuiJ8eG4D4LDhfgZwpVKqD3ATEA3M9/RkrfUkYBJASkpKmUZ4ZVhYCCF840sScPcBXGutlwHLfHhdr8lG80II4RtfZgdlAA0N95OAo76FUzqy0bwQQvjGlySwHmihlGqilIoC7gBml+YFlFJDlVKTMjMzyxSAlulBQgjhE2+niH4JrAFaKaUylFIjtdb5wGhgEbAT+EprvaM0b661nqO1HhUfH1/auJ3i8+npQggRsrwaE9Ba3+nh+HyKGfytKJIDhBCibExdNkKqRgjhm8et/0To8mV2kM+UUkOBoc2bNy/T82WjeSF8sznQAYiAC2hLwNcxARkXFkII35i7O8j6VRoCQghRNqZOAjayTkAIIcrG1ElABoaFEMI3AU0CPi8Wk43mhRDCJ5ViYFgIIUTZmLo7yEZaAkIIUTamTgL2TWVkYFgIIcrE1EnARloCQghRNuYeGJYxASGE8Im5B4atX6UhIIQQZWPq7qDmdeIY0qEeYdIfJIQQZRLQAnK+GtyhHoM71At0GEIIYVqmbgkIIYTwjSQBIYQIYaaeHSSEEMI3pp4dJIQQwjfSHSSEECFMkoAQQoQwSQJCCBHCJAkIIUQIUzoICvAopU4CB8v49ETglB/D8TeJr+yCOTYI7viCOTaQ+HxhjK2x1rq2Ly8WFEnAF0qpDVrrlEDH4YnEV3bBHBsEd3zBHBtIfL7wd2zSHSSEECFMkoAQQoSwypAEJgU6gBJIfGUXzLFBcMcXzLGBxOcLv8Zm+jEBIYQQZVcZWgJCCCHKSJKAEEKEMFMnAaVUqlJqt1IqXSk1NgDv31Ap9aNSaqdSaodS6s/W47WUUj8opfZYv9Y0POcZa7y7lVKDKiDGcKXUz0qpuUEYWw2l1DdKqV3Wn2GPIIvvL9bf63al1JdKqZhAxqeU+lgpdUIptd1wrNTxKKW6KKW2WR97Wynft+bzENsb1t/tVqXUd0qpGoGIzVN8hseeVEpppVRisMWnlHrUGsMOpdTr5RKf1tqU/4BwYC/QFIgCtgBtKziGesAV1tvVgF+BtsDrwFjr8bHAP6y321rjjAaaWOMPL+cY/wp8Acy13g+m2D4B7rfejgJqBEt8QANgP1DFev8rYEQg4wOuAa4AthuOlToeIA3ogWV77gXAdeUU20Agwnr7H4GKzVN81uMNgUVYFqsmBlN8QF9gMRBtvV+nPOIzc0ugG5Cutd6ntc4FpgHDKjIArfUxrfUm6+3zwE4sF49hWC5wWL/+wXp7GDBNa52jtd4PpGP5PsqFUioJGAJ8aDgcLLFVx/KH/xGA1jpXa302WOKzigCqKKUigFjgaCDj01qvAM44HS5VPEqpekB1rfUabblqTDU8x6+xaa2/11rnW++uBZICEZun+Kz+DTwNGGfIBEt8DwETtNY51nNOlEd8Zk4CDYDDhvsZ1mMBoZRKBi4H1gF1tdbHwJIogDrW0yo65rew/IEXGo4FS2xNgZPAZGt31YdKqarBEp/W+gjwT+AQcAzI1Fp/HyzxGZQ2ngbW2xUd531YPpkGTWxKqRuAI1rrLU4PBUV8QEvgaqXUOqXUcqVU1/KIz8xJwF1fV0Dmuyql4oBvgce11ueKO9XNsXKJWSl1PXBCa73R26e4OVaeP88ILM3f97TWlwMXsHRneFKh8Vn71odhaW7XB6oqpe4u7ilujgVy/rWneCo8TqXUc0A+8LntkIcYKvL/RyzwHPCCu4c9xBGI/yM1ge7AU8BX1j5+v8Zn5iSQgaU/zyYJS3O9QimlIrEkgM+11jOsh3+zNs2wfrU14yoy5p7ADUqpA1i6yvoppT4Lkths75ehtV5nvf8NlqQQLPENAPZrrU9qrfOAGcBVQRSfTWnjyaCoW6bc41RK3QNcDwy3dlEES2zNsCT4Ldb/I0nAJqXUZUESH9b3m6Et0rC06BP9HZ+Zk8B6oIVSqolSKgq4A5hdkQFYs/JHwE6t9ZuGh2YD91hv3wPMMhy/QykVrZRqArTAMpDjd1rrZ7TWSVrrZCw/m6Va67uDITZrfMeBw0qpVtZD/YFfgiU+LN1A3ZVSsdbfc38sYz7BEp9NqeKxdhmdV0p1t35ffzI8x6+UUqnAGOAGrfVFp5gDGpvWepvWuo7WOtn6fyQDyySP48EQn9VMoB+AUqollskTp/wenz9GtgP1DxiMZUbOXuC5ALx/LyzNra3AZuu/wUACsATYY/1ay/Cc56zx7sZPMwu8iLMPRbODgiY2oDOwwfrzm4ml6RtM8b0E7AK2A59imY0RsPiAL7GMT+RhuWiNLEs8QIr1e9oLvIO1ckA5xJaOpe/a9n9jYiBi8xSf0+MHsM4OCpb4sFz0P7O+3yagX3nEJ2UjhBAihJm5O0gIIYSPJAkIIUQIkyQghBAhTJKAEEKEMEkCQggRwiQJCCFECJMkIIQQIez/ASh7Zqi6koXmAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# configure DAC for readout drive and ADC for qubit drive\n",
    "# this should tell us if the readout DAC drives any power at qubit frequencies\n",
    "\n",
    "soc.rfb_set_lo(rfb_cfg['f_lo_qubit'], ch=0) # ADCs\n",
    "soc.dacs[hw_cfg['res_ch']].gen_ctrl.add(freq=meas_cfg['if_res'],gain=meas_cfg['res_gain'])\n",
    "\n",
    "time.sleep(0.1)\n",
    "# Capture data on adc.\n",
    "soc.adcs[hw_cfg['ro_ch']].capture()\n",
    "# time.sleep(0.1)\n",
    "# Transfer\n",
    "soc.adcs[hw_cfg['ro_ch']].transfer(buff=buff)\n",
    "# time.sleep(0.1)\n",
    "\n",
    "# back to normal\n",
    "soc.rfb_set_lo(rfb_cfg['f_lo_ro'], ch=0) # ADCs\n",
    "soc.dacs[hw_cfg['res_ch']].gen_ctrl.add(freq=200,gain=0)\n",
    "\n",
    "fft_freqs, psd = welch(buff, fs_adc, nperseg=4096)\n",
    "plt.semilogy(fft_freqs, psd, label='PSD')\n",
    "# IF-RF leakage?\n",
    "plt.axvline(meas_cfg['if_res'], label=\"spur\",color='aqua', ymin=0,ymax=0.1)\n",
    "\n",
    "\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# scratchwork below"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Sweep LO and first attenuator.\n",
    "lo_f = np.linspace(start=4000, stop=8000, num=10)\n",
    "db = np.linspace(start=0, stop=30, num=50)\n",
    "for i in range(len(lo_f)):\n",
    "    # Set LO frequency.\n",
    "    soc.lo[1].set_freq(lo_f[i])\n",
    "    for j in range(len(db)):\n",
    "        #print(\"LO = %f MHz, ATT[1] = %f dB\" %(lo_f[i],db[j]))\n",
    "        soc.dacs[6].attn[0].set_att(db[j])\n",
    "        soc.dacs[7].attn[0].set_att(db[j])\n",
    "        time.sleep(0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Sweep LO.\n",
    "soc.dacs[6].attn[0].set_att(0)\n",
    "soc.dacs[6].attn[1].set_att(14)\n",
    "soc.dacs[7].attn[0].set_att(0)\n",
    "lo_f = np.linspace(start=7000, stop=8000, num=50)\n",
    "for i in range(len(lo_f)):\n",
    "    # Set LO frequency.\n",
    "    soc.lo[1].set_freq(lo_f[i])\n",
    "    time.sleep(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "soc.dacs[2].gen_ctrl.add(freq=1800,gain=5000)\n",
    "soc.dacs[2].attn[0].set_att(10)\n",
    "soc.dacs[2].attn[1].set_att(10)\n",
    "soc.dacs[2].rfsw_sel(\"DC\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in range(30):\n",
    "    soc.dacs[3].set_attn_db(0,0)\n",
    "    time.sleep(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "soc.lo[0].set_freq(4000)\n",
    "soc.dacs[2].gen_ctrl.add(freq=100,gain=25000)\n",
    "soc.dacs[3].gen_ctrl.add(freq=100,gain=25000)\n",
    "soc.dacs[2].attn[0].set_att(0)\n",
    "soc.dacs[2].attn[1].set_att(10)\n",
    "soc.dacs[3].attn[0].set_att(0)\n",
    "soc.dacs[3].attn[1].set_att(10)\n",
    "soc.dacs[2].rfsw_sel(\"RF\")\n",
    "soc.dacs[3].rfsw_sel(\"RF\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "soc.dacs[7].set_attn_db(0,10)\n",
    "soc.dacs[7].set_attn_db(1,20)\n",
    "#soc.adcs[0].set_attn_db(30)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "soc.adcs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "soc.dacs[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "soc.buf.enable()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "soc.buf.disable()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "fs_adc = 3072\n",
    "fs_dac = 6144"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "fs_adc,fs_dac"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Enable DC outputs\n",
    "soc.dac_pwr.bits_reset(bits=[0,1,2,3,4,5,6,7],dev_addr=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Disable DC outputs\n",
    "soc.dac_pwr.bits_set(bits=[0,1,2,3,4,5,6,7],dev_addr=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Enable RF outputs\n",
    "soc.dac_pwr.bits_set(bits=[0,1,2,3,4,5,6,7],dev_addr=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Disable RF outputs\n",
    "soc.dac_pwr.bits_reset(bits=[0,1,2,3,4,5,6,7],dev_addr=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Enable DC-Coupled ADC Inputs.\n",
    "soc.adc_pwr.bits_reset(bits=[4,5,6,7])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Disable DC-Coupled ADC Inputs.\n",
    "soc.adc_pwr.bits_set(bits=[4,5,6,7])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Enable RF ADC Inputs.\n",
    "soc.adc_pwr.bits_set(bits=[0,1,2,3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Disable RF ADC Inputs.\n",
    "soc.adc_pwr.bits_reset(bits=[0,1,2,3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Set DAC Output Switch\n",
    "for i in range(8):\n",
    "    soc.dacs[i].rfsw_sel(\"DC\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Set frequency.\n",
    "for i in range(8):\n",
    "    #soc.dacs[i].gen_ctrl.add(freq=500,gain=32000)\n",
    "    soc.gen_ctrl[i].add(freq=100,gain=32000)\n",
    "    soc.dacs[i].rfsw_sel(\"DC\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Set DAC Output Switch\n",
    "for i in range(8):\n",
    "    soc.dacs[i].rfsw_sel(\"RF\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# One tone on each channel.\n",
    "for i in range(8):\n",
    "    #soc.dacs[i].gen_ctrl.add(freq=1000,gain=15000)\n",
    "    soc.gen_ctrl[i].add(freq=1000,gain=32000)\n",
    "    soc.dacs[i].rfsw_sel(\"RF\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# use the fancy ipq thing\n",
    "for lo in soc.lo:\n",
    "    lo.reset()\n",
    "    lo.set_freq(122.88*62,pwr=31)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# One tone on each channel.\n",
    "for i in range(8):\n",
    "    soc.dacs[i].gen_ctrl.add(freq=1000,gain=30000)\n",
    "#     soc.gen_ctrl[i].add(freq=0,gain=0)\n",
    "    soc.dacs[i].rfsw_sel(\"RF\")\n",
    "    soc.dacs[i].attn[0].set_att(20)\n",
    "    soc.dacs[i].attn[1].set_att(31.75)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "soc.buf.route(2)\n",
    "soc.buf.capture()\n",
    "x = soc.buf.transfer()\n",
    "max(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.figure(figsize=(16,5))\n",
    "plt.plot(x)\n",
    "plt.xlim([500,1000])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "w = sp.hanning(len(x))\n",
    "xw = x*w\n",
    "F = (np.arange(len(x))/len(x)-0.5)*fs_adc\n",
    "Y = sp.fftpack.fftshift(sp.fft(xw))\n",
    "Y = abs(Y)\n",
    "plt.figure(figsize=(16,5))\n",
    "#plt.figure(1,dpi=100)\n",
    "plt.plot(F,20*np.log10(Y/np.max(Y)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "w = sp.hanning(len(x))\n",
    "xw = x*w\n",
    "F = (np.arange(len(x))/len(x)-0.5)*fs_adc\n",
    "Y = sp.fftpack.fftshift(sp.fft(xw))\n",
    "Y = abs(Y/len(x))\n",
    "plt.figure(figsize=(16,5))\n",
    "#plt.figure(1,dpi=100)\n",
    "plt.plot(F,20*np.log10(Y))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "soc.adcs[4].set_gain_db(db=-6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "soc.adcs[1].set_attn_db(30)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "fs_adc/len(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "fs_adc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Save data to file.\n",
    "fn = \"data.mat\"\n",
    "sio.savemat(fn,{'xi':x})\n",
    "\n",
    "print(\"Written file \" + fn)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Program DAC attenuators.\n",
    "chan=5\n",
    "soc.dacs[chan].attn[0].set_att(31.75)\n",
    "soc.dacs[chan].attn[1].set_att(31.75)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Sweep attenuator.\n",
    "chan = 5\n",
    "att = 0\n",
    "for i in np.linspace(start=0,stop=30, num=10):\n",
    "    soc.dacs[chan].attn[att].set_att(i)\n",
    "    time.sleep(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Program ADC attenuator.\n",
    "soc.adcs[3].set_attn_db(31)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "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.8.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
