Last active
May 10, 2022 12:34
-
-
Save proppy/b8a35e01e22c9685a79fa144e0df3f36 to your computer and use it in GitHub Desktop.
mosfet_simulation.ipynb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"colab": { | |
"name": "mosfet_simulation.ipynb", | |
"provenance": [], | |
"collapsed_sections": [], | |
"include_colab_link": true | |
}, | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3" | |
}, | |
"language_info": { | |
"name": "python" | |
} | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/proppy/b8a35e01e22c9685a79fa144e0df3f36/mosfet_simulation.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"# Custom MOSFET simulation\n", | |
"\n", | |
"```\n", | |
"Copyright 2022 Google LLC.\n", | |
"SPDX-License-Identifier: Apache-2.0\n", | |
"```\n", | |
"\n", | |
"## How to use this notebook\n", | |
"\n", | |
"1. Click ▷ for the [first code cell](#scrollTo=yEJCPg3Ylyk4).\n", | |
"1. Wait for the runtime to restart (should display a *Your session crashed for an unknown reason* toast message, [read why?](https://github.com/conda-incubator/condacolab#usage)).\n", | |
"1. Click `Runtime > Run after` if you're in an hurry or simply run the remaining cells one by one." | |
], | |
"metadata": { | |
"id": "9quLG8jhYqwq" | |
} | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"## Install conda" | |
], | |
"metadata": { | |
"id": "xXTLUi3t9Ez7" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "yEJCPg3Ylyk4", | |
"outputId": "b524511f-0b8b-42b7-e189-4f46bbb1b227" | |
}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"⏬ Downloading https://github.com/jaimergp/miniforge/releases/latest/download/Mambaforge-colab-Linux-x86_64.sh...\n", | |
"📦 Installing...\n", | |
"📌 Adjusting configuration...\n", | |
"🩹 Patching environment...\n", | |
"⏲ Done in 0:00:31\n", | |
"🔁 Restarting kernel...\n" | |
] | |
} | |
], | |
"source": [ | |
"!pip install -q condacolab\n", | |
"import condacolab\n", | |
"condacolab.install()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"import condacolab\n", | |
"condacolab.check()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "5-H8BmLS0_pW", | |
"outputId": "7dc6625f-283d-4d2d-8f16-95090a326023" | |
}, | |
"execution_count": 1, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"✨🍰✨ Everything looks OK!\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"## Install dependencies" | |
], | |
"metadata": { | |
"id": "G2o3U9tr9Pul" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"!conda install -c conda-forge --yes gdstk ngspice-lib\n", | |
"!conda install -c Litex-Hub --yes magic open_pdks.sky130a\n", | |
"!pip install cairosvg pyspice" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 1000 | |
}, | |
"id": "Qyci9ZG0n_Gm", | |
"outputId": "b6d5cbc5-1c0c-4710-e498-5f6802cd9da5" | |
}, | |
"execution_count": 2, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Collecting package metadata (current_repodata.json): - \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\bdone\n", | |
"Solving environment: / \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\bdone\n", | |
"\n", | |
"## Package Plan ##\n", | |
"\n", | |
" environment location: /usr/local\n", | |
"\n", | |
" added / updated specs:\n", | |
" - gdstk\n", | |
" - ngspice-lib\n", | |
"\n", | |
"\n", | |
"The following packages will be downloaded:\n", | |
"\n", | |
" package | build\n", | |
" ---------------------------|-----------------\n", | |
" ca-certificates-2021.10.8 | ha878542_0 139 KB conda-forge\n", | |
" certifi-2021.10.8 | py37h89c1867_2 145 KB conda-forge\n", | |
" conda-4.12.0 | py37h89c1867_0 1.0 MB conda-forge\n", | |
" gdstk-0.8.2 | py37hcceba20_1 584 KB conda-forge\n", | |
" libblas-3.9.0 |14_linux64_openblas 12 KB conda-forge\n", | |
" libcblas-3.9.0 |14_linux64_openblas 12 KB conda-forge\n", | |
" libgcc-ng-11.2.0 | h1d223b6_16 902 KB conda-forge\n", | |
" libgfortran-ng-11.2.0 | h69a702a_16 23 KB conda-forge\n", | |
" libgfortran5-11.2.0 | h5c6108e_16 1.7 MB conda-forge\n", | |
" libgomp-11.2.0 | h1d223b6_16 428 KB conda-forge\n", | |
" liblapack-3.9.0 |14_linux64_openblas 12 KB conda-forge\n", | |
" libopenblas-0.3.20 |pthreads_h78a6416_0 10.1 MB conda-forge\n", | |
" libstdcxx-ng-11.2.0 | he4da1e4_16 4.2 MB conda-forge\n", | |
" libzlib-1.2.11 | h166bdaf_1014 60 KB conda-forge\n", | |
" ncurses-6.3 | h27087fc_1 1002 KB conda-forge\n", | |
" ngspice-lib-36 | hf248978_7 2.9 MB conda-forge\n", | |
" numpy-1.21.6 | py37h976b520_0 6.1 MB conda-forge\n", | |
" openssl-1.1.1o | h166bdaf_0 2.1 MB conda-forge\n", | |
" python-3.7.11 | h12debd9_0 45.3 MB\n", | |
" python_abi-3.7 | 2_cp37m 4 KB conda-forge\n", | |
" readline-8.1 | h46c0cb4_0 295 KB conda-forge\n", | |
" sqlite-3.38.5 | h4ff8645_0 1.5 MB conda-forge\n", | |
" zlib-1.2.11 | h166bdaf_1014 88 KB conda-forge\n", | |
" ------------------------------------------------------------\n", | |
" Total: 78.7 MB\n", | |
"\n", | |
"The following NEW packages will be INSTALLED:\n", | |
"\n", | |
" gdstk conda-forge/linux-64::gdstk-0.8.2-py37hcceba20_1\n", | |
" libblas conda-forge/linux-64::libblas-3.9.0-14_linux64_openblas\n", | |
" libcblas conda-forge/linux-64::libcblas-3.9.0-14_linux64_openblas\n", | |
" libgfortran-ng conda-forge/linux-64::libgfortran-ng-11.2.0-h69a702a_16\n", | |
" libgfortran5 conda-forge/linux-64::libgfortran5-11.2.0-h5c6108e_16\n", | |
" liblapack conda-forge/linux-64::liblapack-3.9.0-14_linux64_openblas\n", | |
" libopenblas conda-forge/linux-64::libopenblas-0.3.20-pthreads_h78a6416_0\n", | |
" libzlib conda-forge/linux-64::libzlib-1.2.11-h166bdaf_1014\n", | |
" ngspice-lib conda-forge/linux-64::ngspice-lib-36-hf248978_7\n", | |
" numpy conda-forge/linux-64::numpy-1.21.6-py37h976b520_0\n", | |
"\n", | |
"The following packages will be UPDATED:\n", | |
"\n", | |
" ca-certificates 2020.12.5-ha878542_0 --> 2021.10.8-ha878542_0\n", | |
" certifi 2020.12.5-py37h89c1867_1 --> 2021.10.8-py37h89c1867_2\n", | |
" conda 4.9.2-py37h89c1867_0 --> 4.12.0-py37h89c1867_0\n", | |
" libgcc-ng 9.3.0-h2828fa1_18 --> 11.2.0-h1d223b6_16\n", | |
" libgomp 9.3.0-h2828fa1_18 --> 11.2.0-h1d223b6_16\n", | |
" libstdcxx-ng 9.3.0-h6de172a_18 --> 11.2.0-he4da1e4_16\n", | |
" ncurses 6.2-h58526e2_4 --> 6.3-h27087fc_1\n", | |
" openssl 1.1.1j-h7f98852_0 --> 1.1.1o-h166bdaf_0\n", | |
" python conda-forge::python-3.7.10-hffdb5ce_1~ --> pkgs/main::python-3.7.11-h12debd9_0\n", | |
" python_abi 3.7-1_cp37m --> 3.7-2_cp37m\n", | |
" readline 8.0-he28a2e2_2 --> 8.1-h46c0cb4_0\n", | |
" sqlite 3.34.0-h74cdb3f_0 --> 3.38.5-h4ff8645_0\n", | |
" zlib 1.2.11-h516909a_1010 --> 1.2.11-h166bdaf_1014\n", | |
"\n", | |
"\n", | |
"\n", | |
"Downloading and Extracting Packages\n", | |
"python_abi-3.7 | 4 KB | : 100% 1.0/1 [00:00<00:00, 9.36it/s]\n", | |
"ncurses-6.3 | 1002 KB | : 100% 1.0/1 [00:00<00:00, 1.48it/s]\n", | |
"libcblas-3.9.0 | 12 KB | : 100% 1.0/1 [00:00<00:00, 17.91it/s]\n", | |
"libgfortran5-11.2.0 | 1.7 MB | : 100% 1.0/1 [00:00<00:00, 1.85it/s]\n", | |
"libopenblas-0.3.20 | 10.1 MB | : 100% 1.0/1 [00:02<00:00, 2.87s/it]\n", | |
"certifi-2021.10.8 | 145 KB | : 100% 1.0/1 [00:00<00:00, 13.20it/s]\n", | |
"numpy-1.21.6 | 6.1 MB | : 100% 1.0/1 [00:02<00:00, 2.31s/it]\n", | |
"conda-4.12.0 | 1.0 MB | : 100% 1.0/1 [00:00<00:00, 2.21it/s]\n", | |
"libzlib-1.2.11 | 60 KB | : 100% 1.0/1 [00:00<00:00, 19.48it/s]\n", | |
"readline-8.1 | 295 KB | : 100% 1.0/1 [00:00<00:00, 7.09it/s]\n", | |
"ca-certificates-2021 | 139 KB | : 100% 1.0/1 [00:00<00:00, 13.79it/s]\n", | |
"libgfortran-ng-11.2. | 23 KB | : 100% 1.0/1 [00:00<00:00, 18.33it/s]\n", | |
"gdstk-0.8.2 | 584 KB | : 100% 1.0/1 [00:00<00:00, 5.28it/s]\n", | |
"liblapack-3.9.0 | 12 KB | : 100% 1.0/1 [00:00<00:00, 21.14it/s]\n", | |
"libgomp-11.2.0 | 428 KB | : 100% 1.0/1 [00:00<00:00, 7.19it/s]\n", | |
"openssl-1.1.1o | 2.1 MB | : 100% 1.0/1 [00:00<00:00, 1.74it/s]\n", | |
"sqlite-3.38.5 | 1.5 MB | : 100% 1.0/1 [00:00<00:00, 2.31it/s]\n", | |
"zlib-1.2.11 | 88 KB | : 100% 1.0/1 [00:00<00:00, 13.81it/s]\n", | |
"libstdcxx-ng-11.2.0 | 4.2 MB | : 100% 1.0/1 [00:01<00:00, 1.02s/it] \n", | |
"python-3.7.11 | 45.3 MB | : 100% 1.0/1 [00:01<00:00, 1.70s/it] \n", | |
"ngspice-lib-36 | 2.9 MB | : 100% 1.0/1 [00:00<00:00, 1.10it/s]\n", | |
"libblas-3.9.0 | 12 KB | : 100% 1.0/1 [00:00<00:00, 20.58it/s]\n", | |
"libgcc-ng-11.2.0 | 902 KB | : 100% 1.0/1 [00:00<00:00, 4.38it/s]\n", | |
"Preparing transaction: | \b\b/ \b\b- \b\b\\ \b\bdone\n", | |
"Verifying transaction: / \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\bdone\n", | |
"Executing transaction: - \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\bdone\n", | |
"Collecting package metadata (current_repodata.json): - \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\bdone\n", | |
"Solving environment: / \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\bdone\n", | |
"\n", | |
"## Package Plan ##\n", | |
"\n", | |
" environment location: /usr/local\n", | |
"\n", | |
" added / updated specs:\n", | |
" - magic\n", | |
" - open_pdks.sky130a\n", | |
"\n", | |
"\n", | |
"The following packages will be downloaded:\n", | |
"\n", | |
" package | build\n", | |
" ---------------------------|-----------------\n", | |
" cairo-1.16.0 | h6cf1ce9_1008 1.5 MB conda-forge\n", | |
" cffi-1.15.0 | py37h036bc23_0 225 KB conda-forge\n", | |
" expat-2.4.8 | h27087fc_0 187 KB conda-forge\n", | |
" fontconfig-2.14.0 | h8e229c2_0 305 KB conda-forge\n", | |
" freetype-2.10.4 | h0708190_1 890 KB conda-forge\n", | |
" gettext-0.19.8.1 | h73d1719_1008 3.6 MB conda-forge\n", | |
" libffi-3.4.2 | h7f98852_5 57 KB conda-forge\n", | |
" libglib-2.70.2 | h174f98d_4 3.1 MB conda-forge\n", | |
" libnsl-2.0.0 | h7f98852_0 31 KB conda-forge\n", | |
" libpng-1.6.37 | h21135ba_2 306 KB conda-forge\n", | |
" libuuid-2.32.1 | h7f98852_1000 28 KB conda-forge\n", | |
" libxcb-1.13 | h7f98852_1004 391 KB conda-forge\n", | |
" magic-8.3.289_0_g9402b0d | 20220409_131122 5.6 MB Litex-Hub\n", | |
" open_pdks.sky130a-1.0.308_0_g660c6bd| 20220409_131122 119.6 MB Litex-Hub\n", | |
" pcre-8.45 | h9c3ff4c_0 253 KB conda-forge\n", | |
" pixman-0.40.0 | h36c2ea0_0 627 KB conda-forge\n", | |
" pthread-stubs-0.4 | h36c2ea0_1001 5 KB conda-forge\n", | |
" python-3.7.12 |hb7a2778_100_cpython 57.3 MB conda-forge\n", | |
" tk-8.6.12 | h27826a3_0 3.3 MB conda-forge\n", | |
" xorg-kbproto-1.0.7 | h7f98852_1002 27 KB conda-forge\n", | |
" xorg-libice-1.0.10 | h7f98852_0 58 KB conda-forge\n", | |
" xorg-libsm-1.2.3 | hd9c2040_1000 26 KB conda-forge\n", | |
" xorg-libx11-1.7.2 | h7f98852_0 941 KB conda-forge\n", | |
" xorg-libxau-1.0.9 | h7f98852_0 13 KB conda-forge\n", | |
" xorg-libxdmcp-1.1.3 | h7f98852_0 19 KB conda-forge\n", | |
" xorg-libxext-1.3.4 | h7f98852_1 54 KB conda-forge\n", | |
" xorg-libxrender-0.9.10 | h7f98852_1003 32 KB conda-forge\n", | |
" xorg-renderproto-0.11.1 | h7f98852_1002 9 KB conda-forge\n", | |
" xorg-xextproto-7.3.0 | h7f98852_1002 28 KB conda-forge\n", | |
" xorg-xproto-7.0.31 | h7f98852_1007 73 KB conda-forge\n", | |
" ------------------------------------------------------------\n", | |
" Total: 198.5 MB\n", | |
"\n", | |
"The following NEW packages will be INSTALLED:\n", | |
"\n", | |
" cairo conda-forge/linux-64::cairo-1.16.0-h6cf1ce9_1008\n", | |
" expat conda-forge/linux-64::expat-2.4.8-h27087fc_0\n", | |
" fontconfig conda-forge/linux-64::fontconfig-2.14.0-h8e229c2_0\n", | |
" freetype conda-forge/linux-64::freetype-2.10.4-h0708190_1\n", | |
" gettext conda-forge/linux-64::gettext-0.19.8.1-h73d1719_1008\n", | |
" libglib conda-forge/linux-64::libglib-2.70.2-h174f98d_4\n", | |
" libnsl conda-forge/linux-64::libnsl-2.0.0-h7f98852_0\n", | |
" libpng conda-forge/linux-64::libpng-1.6.37-h21135ba_2\n", | |
" libuuid conda-forge/linux-64::libuuid-2.32.1-h7f98852_1000\n", | |
" libxcb conda-forge/linux-64::libxcb-1.13-h7f98852_1004\n", | |
" magic Litex-Hub/linux-64::magic-8.3.289_0_g9402b0d-20220409_131122\n", | |
" open_pdks.sky130a Litex-Hub/noarch::open_pdks.sky130a-1.0.308_0_g660c6bd-20220409_131122\n", | |
" pcre conda-forge/linux-64::pcre-8.45-h9c3ff4c_0\n", | |
" pixman conda-forge/linux-64::pixman-0.40.0-h36c2ea0_0\n", | |
" pthread-stubs conda-forge/linux-64::pthread-stubs-0.4-h36c2ea0_1001\n", | |
" xorg-kbproto conda-forge/linux-64::xorg-kbproto-1.0.7-h7f98852_1002\n", | |
" xorg-libice conda-forge/linux-64::xorg-libice-1.0.10-h7f98852_0\n", | |
" xorg-libsm conda-forge/linux-64::xorg-libsm-1.2.3-hd9c2040_1000\n", | |
" xorg-libx11 conda-forge/linux-64::xorg-libx11-1.7.2-h7f98852_0\n", | |
" xorg-libxau conda-forge/linux-64::xorg-libxau-1.0.9-h7f98852_0\n", | |
" xorg-libxdmcp conda-forge/linux-64::xorg-libxdmcp-1.1.3-h7f98852_0\n", | |
" xorg-libxext conda-forge/linux-64::xorg-libxext-1.3.4-h7f98852_1\n", | |
" xorg-libxrender conda-forge/linux-64::xorg-libxrender-0.9.10-h7f98852_1003\n", | |
" xorg-renderproto conda-forge/linux-64::xorg-renderproto-0.11.1-h7f98852_1002\n", | |
" xorg-xextproto conda-forge/linux-64::xorg-xextproto-7.3.0-h7f98852_1002\n", | |
" xorg-xproto conda-forge/linux-64::xorg-xproto-7.0.31-h7f98852_1007\n", | |
"\n", | |
"The following packages will be UPDATED:\n", | |
"\n", | |
" cffi 1.14.5-py37hc58025e_0 --> 1.15.0-py37h036bc23_0\n", | |
" libffi 3.3-h58526e2_2 --> 3.4.2-h7f98852_5\n", | |
" python pkgs/main::python-3.7.11-h12debd9_0 --> conda-forge::python-3.7.12-hb7a2778_100_cpython\n", | |
" tk 8.6.10-h21135ba_1 --> 8.6.12-h27826a3_0\n", | |
"\n", | |
"\n", | |
"\n", | |
"Downloading and Extracting Packages\n", | |
"libuuid-2.32.1 | 28 KB | : 100% 1.0/1 [00:00<00:00, 8.17it/s] \n", | |
"xorg-xproto-7.0.31 | 73 KB | : 100% 1.0/1 [00:00<00:00, 12.41it/s]\n", | |
"libnsl-2.0.0 | 31 KB | : 100% 1.0/1 [00:00<00:00, 17.81it/s]\n", | |
"freetype-2.10.4 | 890 KB | : 100% 1.0/1 [00:00<00:00, 3.45it/s]\n", | |
"xorg-libice-1.0.10 | 58 KB | : 100% 1.0/1 [00:00<00:00, 18.12it/s]\n", | |
"xorg-libxau-1.0.9 | 13 KB | : 100% 1.0/1 [00:00<00:00, 16.19it/s]\n", | |
"pixman-0.40.0 | 627 KB | : 100% 1.0/1 [00:00<00:00, 4.35it/s]\n", | |
"cffi-1.15.0 | 225 KB | : 100% 1.0/1 [00:00<00:00, 9.95it/s]\n", | |
"xorg-renderproto-0.1 | 9 KB | : 100% 1.0/1 [00:00<00:00, 24.29it/s]\n", | |
"pthread-stubs-0.4 | 5 KB | : 100% 1.0/1 [00:00<00:00, 17.08it/s]\n", | |
"libpng-1.6.37 | 306 KB | : 100% 1.0/1 [00:00<00:00, 8.37it/s]\n", | |
"magic-8.3.289_0_g940 | 5.6 MB | : 100% 1.0/1 [00:01<00:00, 1.77s/it]\n", | |
"xorg-xextproto-7.3.0 | 28 KB | : 100% 1.0/1 [00:00<00:00, 18.63it/s]\n", | |
"libglib-2.70.2 | 3.1 MB | : 100% 1.0/1 [00:00<00:00, 1.01it/s]\n", | |
"cairo-1.16.0 | 1.5 MB | : 100% 1.0/1 [00:00<00:00, 1.85it/s]\n", | |
"gettext-0.19.8.1 | 3.6 MB | : 100% 1.0/1 [00:01<00:00, 1.28s/it]\n", | |
"xorg-libsm-1.2.3 | 26 KB | : 100% 1.0/1 [00:00<00:00, 18.03it/s]\n", | |
"xorg-libxrender-0.9. | 32 KB | : 100% 1.0/1 [00:00<00:00, 20.73it/s]\n", | |
"fontconfig-2.14.0 | 305 KB | : 100% 1.0/1 [00:00<00:00, 7.48it/s]\n", | |
"expat-2.4.8 | 187 KB | : 100% 1.0/1 [00:00<00:00, 10.66it/s]\n", | |
"pcre-8.45 | 253 KB | : 100% 1.0/1 [00:00<00:00, 9.15it/s]\n", | |
"xorg-kbproto-1.0.7 | 27 KB | : 100% 1.0/1 [00:00<00:00, 19.31it/s]\n", | |
"open_pdks.sky130a-1. | 119.6 MB | : 100% 1.0/1 [01:01<00:00, 61.75s/it]\n", | |
"libffi-3.4.2 | 57 KB | : 100% 1.0/1 [00:00<00:00, 13.20it/s]\n", | |
"libxcb-1.13 | 391 KB | : 100% 1.0/1 [00:00<00:00, 4.47it/s]\n", | |
"xorg-libxext-1.3.4 | 54 KB | : 100% 1.0/1 [00:00<00:00, 17.25it/s]\n", | |
"tk-8.6.12 | 3.3 MB | : 100% 1.0/1 [00:00<00:00, 1.15it/s]\n", | |
"xorg-libxdmcp-1.1.3 | 19 KB | : 100% 1.0/1 [00:00<00:00, 22.62it/s]\n", | |
"xorg-libx11-1.7.2 | 941 KB | : 100% 1.0/1 [00:00<00:00, 3.48it/s]\n", | |
"python-3.7.12 | 57.3 MB | : 100% 1.0/1 [00:11<00:00, 11.63s/it] \n", | |
"Preparing transaction: / \b\b- \b\b\\ \b\b| \b\b/ \b\bdone\n", | |
"Verifying transaction: \\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\bdone\n", | |
"Executing transaction: / \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\b\\ \b\b| \b\b/ \b\b- \b\bdone\n", | |
"Collecting cairosvg\n", | |
" Downloading CairoSVG-2.5.2-py3-none-any.whl (45 kB)\n", | |
"\u001b[K |████████████████████████████████| 45 kB 1.8 MB/s \n", | |
"\u001b[?25hCollecting pyspice\n", | |
" Downloading PySpice-1.5-py2.py3-none-any.whl (158 kB)\n", | |
"\u001b[K |████████████████████████████████| 158 kB 9.4 MB/s \n", | |
"\u001b[?25hCollecting cssselect2\n", | |
" Downloading cssselect2-0.6.0-py3-none-any.whl (15 kB)\n", | |
"Collecting pillow\n", | |
" Downloading Pillow-9.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB)\n", | |
"\u001b[K |████████████████████████████████| 4.3 MB 46.3 MB/s \n", | |
"\u001b[?25hCollecting cairocffi\n", | |
" Downloading cairocffi-1.3.0.tar.gz (88 kB)\n", | |
"\u001b[K |████████████████████████████████| 88 kB 5.6 MB/s \n", | |
"\u001b[?25hCollecting tinycss2\n", | |
" Downloading tinycss2-1.1.1-py3-none-any.whl (21 kB)\n", | |
"Collecting defusedxml\n", | |
" Downloading defusedxml-0.7.1-py2.py3-none-any.whl (25 kB)\n", | |
"Collecting PyYAML>=5.3\n", | |
" Downloading PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (596 kB)\n", | |
"\u001b[K |████████████████████████████████| 596 kB 39.0 MB/s \n", | |
"\u001b[?25hRequirement already satisfied: numpy>=1.18 in /usr/local/lib/python3.7/site-packages (from pyspice) (1.21.6)\n", | |
"Collecting ply>=3.11\n", | |
" Downloading ply-3.11-py2.py3-none-any.whl (49 kB)\n", | |
"\u001b[K |████████████████████████████████| 49 kB 5.9 MB/s \n", | |
"\u001b[?25hRequirement already satisfied: cffi>=1.14 in /usr/local/lib/python3.7/site-packages (from pyspice) (1.15.0)\n", | |
"Collecting scipy>=1.4\n", | |
" Downloading scipy-1.7.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (38.1 MB)\n", | |
"\u001b[K |████████████████████████████████| 38.1 MB 1.2 MB/s \n", | |
"\u001b[?25hRequirement already satisfied: requests>=2.23 in /usr/local/lib/python3.7/site-packages (from pyspice) (2.25.1)\n", | |
"Collecting matplotlib>=3.2\n", | |
" Downloading matplotlib-3.5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (11.2 MB)\n", | |
"\u001b[K |████████████████████████████████| 11.2 MB 46.4 MB/s \n", | |
"\u001b[?25hRequirement already satisfied: pycparser in /usr/local/lib/python3.7/site-packages (from cffi>=1.14->pyspice) (2.20)\n", | |
"Collecting fonttools>=4.22.0\n", | |
" Downloading fonttools-4.33.3-py3-none-any.whl (930 kB)\n", | |
"\u001b[K |████████████████████████████████| 930 kB 56.6 MB/s \n", | |
"\u001b[?25hCollecting pyparsing>=2.2.1\n", | |
" Downloading pyparsing-3.0.8-py3-none-any.whl (98 kB)\n", | |
"\u001b[K |████████████████████████████████| 98 kB 6.7 MB/s \n", | |
"\u001b[?25hCollecting cycler>=0.10\n", | |
" Downloading cycler-0.11.0-py3-none-any.whl (6.4 kB)\n", | |
"Collecting python-dateutil>=2.7\n", | |
" Downloading python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)\n", | |
"\u001b[K |████████████████████████████████| 247 kB 55.4 MB/s \n", | |
"\u001b[?25hCollecting kiwisolver>=1.0.1\n", | |
" Downloading kiwisolver-1.4.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.1 MB)\n", | |
"\u001b[K |████████████████████████████████| 1.1 MB 29.7 MB/s \n", | |
"\u001b[?25hCollecting packaging>=20.0\n", | |
" Downloading packaging-21.3-py3-none-any.whl (40 kB)\n", | |
"\u001b[K |████████████████████████████████| 40 kB 5.7 MB/s \n", | |
"\u001b[?25hCollecting typing-extensions\n", | |
" Downloading typing_extensions-4.2.0-py3-none-any.whl (24 kB)\n", | |
"Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/site-packages (from python-dateutil>=2.7->matplotlib>=3.2->pyspice) (1.15.0)\n", | |
"Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/site-packages (from requests>=2.23->pyspice) (2.10)\n", | |
"Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/site-packages (from requests>=2.23->pyspice) (2021.10.8)\n", | |
"Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.7/site-packages (from requests>=2.23->pyspice) (1.26.3)\n", | |
"Requirement already satisfied: chardet<5,>=3.0.2 in /usr/local/lib/python3.7/site-packages (from requests>=2.23->pyspice) (4.0.0)\n", | |
"Collecting webencodings\n", | |
" Downloading webencodings-0.5.1-py2.py3-none-any.whl (11 kB)\n", | |
"Building wheels for collected packages: cairocffi\n", | |
" Building wheel for cairocffi (setup.py) ... \u001b[?25l\u001b[?25hdone\n", | |
" Created wheel for cairocffi: filename=cairocffi-1.3.0-py3-none-any.whl size=89650 sha256=3705a89ca4ec97ceaf1d69311a7871daf57e855f8af73da2398abfd2a9d2bf77\n", | |
" Stored in directory: /root/.cache/pip/wheels/4e/ca/e1/5c8a9692a27f639a07c949044bec943f26c81cd53d3805319f\n", | |
"Successfully built cairocffi\n", | |
"Installing collected packages: webencodings, typing-extensions, pyparsing, tinycss2, python-dateutil, pillow, packaging, kiwisolver, fonttools, cycler, scipy, PyYAML, ply, matplotlib, defusedxml, cssselect2, cairocffi, pyspice, cairosvg\n", | |
"Successfully installed PyYAML-6.0 cairocffi-1.3.0 cairosvg-2.5.2 cssselect2-0.6.0 cycler-0.11.0 defusedxml-0.7.1 fonttools-4.33.3 kiwisolver-1.4.2 matplotlib-3.5.2 packaging-21.3 pillow-9.1.0 ply-3.11 pyparsing-3.0.8 pyspice-1.5 python-dateutil-2.8.2 scipy-1.7.3 tinycss2-1.1.1 typing-extensions-4.2.0 webencodings-0.5.1\n" | |
] | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/vnd.colab-display-data+json": { | |
"pip_warning": { | |
"packages": [ | |
"cycler", | |
"dateutil", | |
"kiwisolver" | |
] | |
} | |
} | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"## Draw a MOSFET with magic" | |
], | |
"metadata": { | |
"id": "CQdALyHZ9Z01" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"%%script bash -c \"PDK_ROOT=/usr/local/share/pdk PDKPATH=/usr/local/share/pdk/sky130A magic -dnull -noconsole -rcfile /usr/local/share/pdk/sky130A/libs.tech/magic/sky130A.magicrc\"\n", | |
"cellname rename (UNNAMED) mosfet\n", | |
"\n", | |
"box 0 0 950nm 650nm\n", | |
"paint ndiffusion\n", | |
"\n", | |
"box 400nm -600nm 550nm 1200nm\n", | |
"paint polysilicon\n", | |
"\n", | |
"box 0 0 400nm 650nm\n", | |
"label source\n", | |
"port make 3\n", | |
"\n", | |
"box 550nm 0 950nm 650nm\n", | |
"label drain\n", | |
"port make 1\n", | |
"\n", | |
"box 400nm -600nm 550nm 0\n", | |
"label gate\n", | |
"port make 2\n", | |
"\n", | |
"extract\n", | |
"ext2spice lvs\n", | |
"ext2spice cthresh 0\n", | |
"ext2spice\n", | |
"\n", | |
"gds labels no\n", | |
"gds write mosfet.gds" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "hhpUJrMBmlfj", | |
"outputId": "528d852b-ddb6-46d1-9d52-6ecc933a0b94" | |
}, | |
"execution_count": 3, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"\n", | |
"Magic 8.3 revision 289 - Compiled on Mon Apr 11 07:12:34 UTC 2022.\n", | |
"Starting magic under Tcl interpreter\n", | |
"Using the terminal as the console.\n", | |
"Using NULL graphics device.\n", | |
"Processing system .magicrc file\n", | |
"Sourcing design .magicrc for technology sky130A ...\n", | |
"2 Magic internal units = 1 Lambda\n", | |
"Input style sky130(vendor): scaleFactor=2, multiplier=2\n", | |
"The following types are not handled by extraction and will be treated as non-electrical types:\n", | |
" ubm \n", | |
"Scaled tech values by 2 / 1 to match internal grid scaling\n", | |
"Loading sky130A Device Generator Menu ...\n", | |
"Using technology \"sky130A\", version 1.0.308-0-g660c6bd\n", | |
"Root cell box:\n", | |
" width x height ( llx, lly ), ( urx, ury ) area (units^2)\n", | |
"\n", | |
"microns: 0.950 x 0.650 ( 0.000, 0.000), ( 0.950, 0.650) 0.618 \n", | |
"lambda: 95.00 x 65.00 ( 0.00, 0.00 ), ( 95.00, 65.00) 6175.00 \n", | |
"internal: 190 x 130 ( 0, 0 ), ( 190, 130 ) 24700 \n", | |
"Root cell box:\n", | |
" width x height ( llx, lly ), ( urx, ury ) area (units^2)\n", | |
"\n", | |
"microns: 0.150 x 1.800 ( 0.400, -0.600), ( 0.550, 1.200) 0.270 \n", | |
"lambda: 15.00 x 180.00 ( 40.00, -60.00), ( 55.00, 120.00) 2700.00 \n", | |
"internal: 30 x 360 ( 80, -120 ), ( 110, 240 ) 10800 \n", | |
"Root cell box:\n", | |
" width x height ( llx, lly ), ( urx, ury ) area (units^2)\n", | |
"\n", | |
"microns: 0.400 x 0.650 ( 0.000, 0.000), ( 0.400, 0.650) 0.260 \n", | |
"lambda: 40.00 x 65.00 ( 0.00, 0.00 ), ( 40.00, 65.00) 2600.00 \n", | |
"internal: 80 x 130 ( 0, 0 ), ( 80, 130 ) 10400 \n", | |
"Moving label \"source\" from space to ndiff in cell mosfet.\n", | |
"Root cell box:\n", | |
" width x height ( llx, lly ), ( urx, ury ) area (units^2)\n", | |
"\n", | |
"microns: 0.400 x 0.650 ( 0.550, 0.000), ( 0.950, 0.650) 0.260 \n", | |
"lambda: 40.00 x 65.00 ( 55.00, 0.00 ), ( 95.00, 65.00) 2600.00 \n", | |
"internal: 80 x 130 ( 110, 0 ), ( 190, 130 ) 10400 \n", | |
"Moving label \"drain\" from space to ndiff in cell mosfet.\n", | |
"Root cell box:\n", | |
" width x height ( llx, lly ), ( urx, ury ) area (units^2)\n", | |
"\n", | |
"microns: 0.150 x 0.600 ( 0.400, -0.600), ( 0.550, 0.000) 0.090 \n", | |
"lambda: 15.00 x 60.00 ( 40.00, -60.00), ( 55.00, 0.00 ) 900.00 \n", | |
"internal: 30 x 120 ( 80, -120 ), ( 110, 0 ) 3600 \n", | |
"Moving label \"gate\" from space to poly in cell mosfet.\n", | |
"Extracting mosfet into mosfet.ext:\n", | |
"exttospice finished.\n", | |
" Generating output for cell mosfet\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"import gdstk\n", | |
"import cairosvg\n", | |
"from IPython.display import Image\n", | |
"\n", | |
"library = gdstk.read_gds('mosfet.gds')\n", | |
"top_cells = library.top_level()\n", | |
"top_cells[0].write_svg('mosfet.svg')\n", | |
"cairosvg.svg2png(url='mosfet.svg', write_to='mosfet.png', scale=30.0)\n", | |
"Image('mosfet.png')" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 611 | |
}, | |
"id": "xjz3IYz55vu2", | |
"outputId": "960ed624-2bf9-407a-9a3d-be5cd1b0cdc3" | |
}, | |
"execution_count": 4, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"<IPython.core.display.Image object>" | |
], | |
"image/png": "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\n" | |
}, | |
"metadata": {}, | |
"execution_count": 4 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"## Simulate the MOFSET with PySpice" | |
], | |
"metadata": { | |
"id": "YZdXQnCJ9h_o" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"from PySpice.Spice.Netlist import Circuit, SubCircuit, SubCircuitFactory\n", | |
"from PySpice.Unit import *\n", | |
"import matplotlib.pyplot as plt\n", | |
"\n", | |
"circuit = Circuit('mosfet0')\n", | |
"circuit.lib('/usr/local/share/pdk/sky130A/libs.tech/ngspice/sky130.lib.spice', 'tt')\n", | |
"circuit.include('mosfet.spice')\n", | |
"circuit.X('mosfet0', 'mosfet', 'DRAIN', 'GATE', 'VGND')\n", | |
"circuit.V('gnd', 'VGND', 0, 0)\n", | |
"circuit.V('dd', 'VPWR', 'VGND', 1.8)\n", | |
"circuit.R('', 'VPWR', 'DRAIN', '10k')\n", | |
"circuit.PulseVoltageSource('Vin', 'GATE', 'VGND',\n", | |
" initial_value=0@u_V, pulsed_value=1.8@u_V,\n", | |
" rise_time=10@u_ps, fall_time=10@u_ps,\n", | |
" pulse_width=1@u_ns, period=2@u_ns, delay_time=1@u_ns)\n", | |
"print(str(circuit))\n", | |
"simulator = circuit.simulator()\n", | |
"analysis = simulator.transient(step_time=10@u_ps, end_time=2@u_ns)\n", | |
"print('done')\n", | |
"fig, ax = plt.subplots(figsize=(20, 10))\n", | |
"ax.set_title('mosfet')\n", | |
"ax.set_xlabel('time in 1e-14s')\n", | |
"ax.set_ylabel('voltage in V')\n", | |
"ax.plot(analysis.GATE)\n", | |
"ax.plot(analysis.DRAIN)\n", | |
"ax.legend(('GATE', 'DRAIN'))\n", | |
"plt.tight_layout()\n", | |
"plt.show()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 787 | |
}, | |
"id": "9scIFl1w7Lk6", | |
"outputId": "f7242863-76b0-4f41-9df2-196f709384ad" | |
}, | |
"execution_count": 5, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stderr", | |
"text": [ | |
"Unsupported Ngspice version 36\n" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
".title mosfet0\n", | |
".include /content/mosfet.spice\n", | |
".lib /usr/local/share/pdk/sky130A/libs.tech/ngspice/sky130.lib.spice tt\n", | |
"Xmosfet0 DRAIN GATE VGND mosfet\n", | |
"Vgnd VGND 0 0\n", | |
"Vdd VPWR VGND 1.8\n", | |
"R VPWR DRAIN 10k\n", | |
"VVin GATE VGND DC 0V PULSE(0V 1.8V 1ns 10ps 10ps 1ns 2ns)\n", | |
"\n", | |
"done\n" | |
] | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": [ | |
"<Figure size 1440x720 with 1 Axes>" | |
], | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAABZgAAALICAYAAADyhJW9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzde5Cld33f+c+vT5++CKSRBOJijUASwbGRDQPIIDbgYELsssHBFywbV5ZLxWFxsNfKYnuN94KpZGvjlLGrAAcW23FCYk9YbHAB4RKIA8akghEgmwitDYaBmeEmCWaErO4+fc757R/ndKtnpm8zzHnOeejXq2rq6T63+Ul/nXrXd75PqbUGAAAAAADO19y0DwAAAAAAQDsJzAAAAAAAXBCBGQAAAACACyIwAwAAAABwQQRmAAAAAAAuiMAMAAAAAMAFEZgBAGBKysjvllK+Vkr5s2mfBwAAzpfADAAA0/PUJH8/yeFa65P2enEp5Vgp5ZmTPxYAAOyPwAwAANPzyCTHaq1/M+2DAADAhRCYAQBgB+OJ4V8opfxFKeVvSim/U0p5aCnlXaWUr5dS3ldKuWL82n9QSrm9lHKqlPL+Usq3b/mc/7WUcnL8nr8spfy9Uso/SvLbSZ5SSrm3lPLK8WufXUq5bfw5/7WU8tjx4/8uySOSvH38+l9s/v8IAACcqdRap30GAACYSaWUY0m+lOQ5SeaTfDzJiST/KMkdSd6Z5ANJjo6f+6Ek70/yT5O8OMljklyX5H1Jnlxr/UIp5doknVrrX5dSXpjkp2qtTx3/fY9P8p4kP5jk1iT/MMkrk/ztWuva+Dw/VWt932T/ywEAYH9MMAMAwO5eU2v9cq31ZJIPJvlwrfXjtdbVJG9N8vgkP57kP9Za31trXU/ya0mWk/wPSQZJFpM8ppTSrbUeq7X+9Q5/14uT/D+11g/XWge11n+bZC3JTZP9TwQAgAsjMAMAwO6+vOXnlW1+f2CSb0nyuY0Ha63DJMeTXF1r/XSSW5L8SpKvlFL+QynlW3b4ux6Z5GXj9RinSimnklwz/nwAAJg5AjMAAHzjvpBRHE6SlFJKRmH4ZJLUWn9/vAbjkUlqkl/d4XOOJ/m/aq2Xb/lzSa316Ph5++0AAJgpAjMAAHzj/t8kzxrfvK+b5GUZrbb4r6WUv11KeUYpZTHJakZTz8MdPue3kryklPLkMvKAUsqzSimXjp//cpLrJ/zfAgAA+yYwAwDAN6jW+pcZ3ZDvNUnuyugmfT9Ya+1ltH/5X4wf/1KShyR5+Q6fc2uSf5zktUm+luTTSV645SX/d5L/fbw+4+cn8h8DAADnodTqX9kBAAAAAHD+TDADAAAAAHBBBGYAAAAAAC6IwAwAAAAAwAURmAEAAAAAuCDz0z7A+Xrwgx9cr7322mkfAwAAAADgwPjoRz96V631qrMfb11gvvbaa3PrrbdO+xgAAAAAAAdGKeVz2z1uRQYAAAAAABdEYAYAAAAA4IIIzAAAAAAAXJDW7WAGAAAAALiY1tfXc+LEiayurk77KFO3tLSUw4cPp9vt7uv1AjMAAAAAcKCdOHEil156aa699tqUUqZ9nKmptebuu+/OiRMnct111+3rPVZkAAAAAAAH2urqah70oAcd6LicJKWUPOhBDzqvSW6BGQAAAAA48A56XN5wvv8fBGYAAAAAAC6IwAwAAAAAMAO+/OUv5yd/8idz/fXX54lPfGKe8pSn5K1vfevm87fcckuuvvrqDIfDfOITn8iRI0dy5MiRXHnllbnuuuty5MiRPPOZz8yxY8eyvLy8+fyRI0fyxje+cSJndpM/AAAAAIApq7Xmh37oh/KCF7wgv//7v58k+dznPpe3ve1tSZLhcJi3vvWtueaaa/KBD3wg3/M935PbbrstSfLCF74wz372s/Pc5z43SXLs2LE86lGP2nx+kkwwAwAAAABM2R//8R9nYWEhL3nJSzYfe+QjH5mf/dmfTZK8//3vzw033JCf/umfztGjR6d1zHOYYAYAAAAAGHvl22/PJ79wz0X9zMd8y2V5xQ/esOtrbr/99jzhCU/Y8fmjR4/mec97Xp7znOfkl3/5l7O+vp5ut7vj6//6r/86R44c2fz9Na95TZ72tKed/+H3IDADAAAAAMyYl770pfnTP/3TLCws5EMf+lDe+c535td//ddz6aWX5slPfnLe85735NnPfvaO729qRYbADAAAAAAwttek8aTccMMN+cM//MPN33/zN38zd911V2688ca85z3vyalTp/Kd3/mdSZL77rsvy8vLuwbmptjBDAAAAAAwZc94xjOyurqa173udZuP3XfffUlG6zF++7d/O8eOHcuxY8fy2c9+Nu9973s3n58mgRkAAAAAYMpKKfmjP/qjfOADH8h1112XJz3pSXnBC16QV77ylXn3u9+dZz3rWZuvfcADHpCnPvWpefvb377j523sYN748+pXv3oy5661TuSDJ+XGG2+st95667SPAQAAAAB8k7jjjjvy7d/+7dM+xszY7v9HKeWjtdYbz36tCWYAAAAAAC6IwAwAAAAAwAURmAEAAAAAuCACMwAAAAAAF0RgBgAAAADgggjMAAAAAABcEIEZAAAAAGDKOp1Ojhw5khtuuCGPe9zj8qpXvSrD4TBJ8v73vz+HDh3KkSNH8m3f9m35+Z//+TPee9ddd6Xb7eb1r3/9GY9fe+21ueuuu5IkpZS87GUv23zu137t1/Irv/Ir3/C5BWYAAAAAgClbXl7Obbfdlttvvz3vfe978653vSuvfOUrN59/2tOelttuuy0f//jH8453vCMf+tCHNp9785vfnJtuuilHjx7d8fMXFxfzlre8ZTM4XywCMwAAAADADHnIQx6SN7zhDXnta1+bWusZzy0vL+fIkSM5efLk5mNHjx7Nq171qpw8eTInTpzY9jPn5+fz4he/OL/xG79xUc86f1E/DQAAAACgzd71S8mXPnFxP/Nh35l8/784r7dcf/31GQwG+cpXvnLG41/72tfyqU99Kt/93d+dJDl+/Hi++MUv5klPelJuvvnmvOlNbzpjFcZWL33pS/PYxz42v/iLv3hh/x3bMMEMAACzbLCevP2W5KufmfZJAACYog9+8IN53OMel6uvvjrf933fl4c97GFJkje96U25+eabkyQ/8RM/seuajMsuuyzPf/7z8+pXv/qincsEMwAAzLI7/zL56O8mD70hedL10z4NAMA3v/OcNJ6Uz3zmM+l0OnnIQx6SO+64I0972tPyjne8I5/97Gdz00035eabb86RI0dy9OjRfOlLX8rv/d7vJUm+8IUv5FOf+lQe/ehHb/u5t9xyS57whCfkRS960UU5pwlmAACYZaePj66rp6Z7DgAAGnPnnXfmJS95SX7mZ34mpZQznrvuuuvyS7/0S/nVX/3V/NVf/VXuvffenDx5MseOHcuxY8fy8pe/fNcp5iuvvDI333xzfud3fueinFVgBgCAWXZqIzCfnu45AACYqJWVlRw5ciQ33HBDnvnMZ+Z7v/d784pXvGLb177kJS/Jn/zJn+To0aP54R/+4TOe+9Ef/dFdA3OSvOxl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\n" | |
}, | |
"metadata": { | |
"needs_background": "light" | |
} | |
} | |
] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment