Skip to content

Instantly share code, notes, and snippets.

@proppy
Last active May 10, 2022 12:34
Show Gist options
  • Save proppy/b8a35e01e22c9685a79fa144e0df3f36 to your computer and use it in GitHub Desktop.
Save proppy/b8a35e01e22c9685a79fa144e0df3f36 to your computer and use it in GitHub Desktop.
mosfet_simulation.ipynb
Display the source blob
Display the rendered blob
Raw
{
"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