adding back in license info
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 0000000..3c52212
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,16 @@
+## Expected Behavior
+
+
+## Actual Behavior
+
+
+## Steps to Reproduce the Problem
+
+1.
+1.
+1.
+
+## Specifications
+
+- Version:
+- Platform:
\ No newline at end of file
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..0787bd9
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,6 @@
+Fixes #<issue_number_goes_here>
+
+> It's a good idea to open an issue first for discussion.
+
+- [ ] Tests pass
+- [ ] Appropriate changes to README are included in PR
\ No newline at end of file
diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml
new file mode 100644
index 0000000..dc8ed4d
--- /dev/null
+++ b/.github/workflows/checks.yml
@@ -0,0 +1,36 @@
+# Copyright 2019-2021 SkyWater PDK Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# This code is *alternatively* available under a BSD-3-Clause license, see
+# details in the README.md at the top level and the license text at
+# https://github.com/google/skywater-pdk-libs-sky130_bag3_pr/blob/master/LICENSE.alternative
+#
+# SPDX-License-Identifier: BSD-3-Clause OR Apache 2.0
+
+
+name: Checks
+
+
+on:
+  push:
+  pull_request:
+
+
+jobs:
+  Run:
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@v2
+
+    - uses: SymbiFlow/actions/checks@main
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9d13cf0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,18 @@
+# Misc files
+*~
+
+# Python files
+*.pyc
+__pycache__
+
+# Virtuoso files
+*.cdslck
+*.cdslck.*
+
+# Pycharm related files
+.idea/workspace.xml
+.idea/usage.statistics.xml
+.idea/tasks.xml
+
+# Jupyter files
+.ipynb_checkpoints
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..83bdf84
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2019-2021 SkyWater PDK Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+This code is *alternatively* available under a BSD-3-Clause license, see
+details in the README.md at the top level and the license text at
+https://github.com/google/skywater-pdk-libs-sky130_bag3_pr/blob/master/LICENSE.alternative
+
+SPDX-License-Identifier: BSD-3-Clause OR Apache 2.0
+-->
+<component name="InspectionProjectProfileManager">
+  <settings>
+    <option name="USE_PROJECT_PROFILE" value="false" />
+    <version value="1.0" />
+  </settings>
+</component>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..2b735f1
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2019-2021 SkyWater PDK Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+This code is *alternatively* available under a BSD-3-Clause license, see
+details in the README.md at the top level and the license text at
+https://github.com/google/skywater-pdk-libs-sky130_bag3_pr/blob/master/LICENSE.alternative
+
+SPDX-License-Identifier: BSD-3-Clause OR Apache 2.0
+-->
+<project version="4">
+  <component name="PreferredVcsStorage">
+    <preferredVcsName>ApexVCS</preferredVcsName>
+  </component>
+  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7" project-jdk-type="Python SDK" />
+</project>
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..6a0b79f
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2019-2021 SkyWater PDK Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+This code is *alternatively* available under a BSD-3-Clause license, see
+details in the README.md at the top level and the license text at
+https://github.com/google/skywater-pdk-libs-sky130_bag3_pr/blob/master/LICENSE.alternative
+
+SPDX-License-Identifier: BSD-3-Clause OR Apache 2.0
+-->
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/skywater130.iml" filepath="$PROJECT_DIR$/.idea/skywater130.iml" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/skywater130.iml b/.idea/skywater130.iml
new file mode 100644
index 0000000..4c55d75
--- /dev/null
+++ b/.idea/skywater130.iml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="PYTHON_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="xbase" />
+    <orderEntry type="module" module-name="BAG_framework" />
+  </component>
+</module>
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..23dbfa3
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,23 @@
+# This is the list of significant contributors.
+#
+# This does **not** necessarily list everyone who has contributed code,
+# especially since many employees of one corporation may be contributing.
+# To see the full list of contributors, see the revision history in
+# source control.
+
+# Companies
+Google LLC (google.com)
+BlueCheetah Analog (bcanalog.com)
+SkyWater Technology Foundry (skywatertechnology.com)
+efabless corporation (efabless.com)
+
+# Individuals
+tansell@google.com, me@mith.ro (Tim 'mithro' Ansell)
+pgron@google.com (Per Grön)
+ethanmoon@google.com (Per Grön)
+kevin.kelley@skywatertechnology.com, kevin.kelly@skywater.tools (Kevin Kelley)
+ayan@bcanalog.com (Ayan Biswas)
+elad@bcanalog.com (Elad Alon)
+eric@bcanalog.com, pkerichang@gmail.com (Eric Chang)
+krishna@bcanalog.com (Krishna Settaluri)
+nathan@bcanalog.com (Nathan Narevsky)
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/LICENSE.alternative b/LICENSE.alternative
new file mode 100644
index 0000000..fdddfd1
--- /dev/null
+++ b/LICENSE.alternative
@@ -0,0 +1,27 @@
+Copyright 2020-2021 Google LLC
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+   * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+   * Neither the name of Google LLC nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/OA/BAG_prim/.oalib b/OA/BAG_prim/.oalib
new file mode 100644
index 0000000..21ffef8
--- /dev/null
+++ b/OA/BAG_prim/.oalib
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+
+<Library DMSystem="oaDMFileSys">
+    <oaDMFileSys libReadOnly="No"
+                 origFileSystem="Unix"/>
+</Library>
diff --git a/OA/BAG_prim/cdsinfo.tag b/OA/BAG_prim/cdsinfo.tag
new file mode 100644
index 0000000..b75aa95
--- /dev/null
+++ b/OA/BAG_prim/cdsinfo.tag
@@ -0,0 +1,41 @@
+#
+# This is a cdsinfo.tag file.
+#
+# See the "Cadence Application Infrastructure Reference Manual" for
+# details on the format of this file, its semantics, and its use.
+#
+# The `#' character denotes a comment. Removing the leading `#'
+# character from any of the entries below will activate them.
+#
+# CDSLIBRARY entry - add this entry if the directory containing
+# this cdsinfo.tag file is the root of a Cadence library.
+# CDSLIBRARY
+#
+# CDSLIBCHECK - set this entry to require that libraries have
+# a cdsinfo.tag file with a CDSLIBRARY entry. Legal values are
+# ON and OFF. By default (OFF), directories named in a cds.lib file
+# do not have to have a cdsinfo.tag file with a CDSLIBRARY entry.
+# CDSLIBCHECK ON
+#
+# DMTYPE - set this entry to define the DM system for Cadence's
+# Generic DM facility. Values will be shifted to lower case.
+# DMTYPE none
+# DMTYPE crcs
+# DMTYPE tdm
+# DMTYPE sync
+#
+# NAMESPACE - set this entry to define the library namespace according
+# to the type of machine on which the data is stored. Legal values are
+# `LibraryNT' and
+# `LibraryUnix'.
+# NAMESPACE LibraryUnix
+#
+# Other entries may be added for use by specific applications as
+# name-value pairs. Application documentation will describe the
+# use and behaviour of these entries when appropriate.
+#
+# Current Settings:
+#
+CDSLIBRARY
+DMTYPE none
+NAMESPACE LibraryUnix
diff --git a/OA/BAG_prim/data.dm b/OA/BAG_prim/data.dm
new file mode 100644
index 0000000..a066651
--- /dev/null
+++ b/OA/BAG_prim/data.dm
Binary files differ
diff --git a/OA/BAG_prim/nmos4_hv/data.dm b/OA/BAG_prim/nmos4_hv/data.dm
new file mode 100644
index 0000000..32bc7f6
--- /dev/null
+++ b/OA/BAG_prim/nmos4_hv/data.dm
Binary files differ
diff --git a/OA/BAG_prim/nmos4_hv/schematic/data.dm b/OA/BAG_prim/nmos4_hv/schematic/data.dm
new file mode 100644
index 0000000..1a705a2
--- /dev/null
+++ b/OA/BAG_prim/nmos4_hv/schematic/data.dm
Binary files differ
diff --git a/OA/BAG_prim/nmos4_hv/schematic/master.tag b/OA/BAG_prim/nmos4_hv/schematic/master.tag
new file mode 100644
index 0000000..26be1be
--- /dev/null
+++ b/OA/BAG_prim/nmos4_hv/schematic/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+sch.oa
diff --git a/OA/BAG_prim/nmos4_hv/schematic/sch.oa b/OA/BAG_prim/nmos4_hv/schematic/sch.oa
new file mode 100644
index 0000000..8d2ef72
--- /dev/null
+++ b/OA/BAG_prim/nmos4_hv/schematic/sch.oa
Binary files differ
diff --git a/OA/BAG_prim/nmos4_hv/schematic/thumbnail_128x128.png b/OA/BAG_prim/nmos4_hv/schematic/thumbnail_128x128.png
new file mode 100644
index 0000000..1d46566
--- /dev/null
+++ b/OA/BAG_prim/nmos4_hv/schematic/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/nmos4_hv/symbol/master.tag b/OA/BAG_prim/nmos4_hv/symbol/master.tag
new file mode 100644
index 0000000..e1024da
--- /dev/null
+++ b/OA/BAG_prim/nmos4_hv/symbol/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+symbol.oa
diff --git a/OA/BAG_prim/nmos4_hv/symbol/symbol.oa b/OA/BAG_prim/nmos4_hv/symbol/symbol.oa
new file mode 100644
index 0000000..e563cd9
--- /dev/null
+++ b/OA/BAG_prim/nmos4_hv/symbol/symbol.oa
Binary files differ
diff --git a/OA/BAG_prim/nmos4_hv/symbol/thumbnail_128x128.png b/OA/BAG_prim/nmos4_hv/symbol/thumbnail_128x128.png
new file mode 100644
index 0000000..7c02f60
--- /dev/null
+++ b/OA/BAG_prim/nmos4_hv/symbol/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/nmos4_hvesd/data.dm b/OA/BAG_prim/nmos4_hvesd/data.dm
new file mode 100644
index 0000000..bdfd88e
--- /dev/null
+++ b/OA/BAG_prim/nmos4_hvesd/data.dm
Binary files differ
diff --git a/OA/BAG_prim/nmos4_hvesd/schematic/data.dm b/OA/BAG_prim/nmos4_hvesd/schematic/data.dm
new file mode 100644
index 0000000..1a705a2
--- /dev/null
+++ b/OA/BAG_prim/nmos4_hvesd/schematic/data.dm
Binary files differ
diff --git a/OA/BAG_prim/nmos4_hvesd/schematic/master.tag b/OA/BAG_prim/nmos4_hvesd/schematic/master.tag
new file mode 100644
index 0000000..26be1be
--- /dev/null
+++ b/OA/BAG_prim/nmos4_hvesd/schematic/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+sch.oa
diff --git a/OA/BAG_prim/nmos4_hvesd/schematic/sch.oa b/OA/BAG_prim/nmos4_hvesd/schematic/sch.oa
new file mode 100644
index 0000000..30855d6
--- /dev/null
+++ b/OA/BAG_prim/nmos4_hvesd/schematic/sch.oa
Binary files differ
diff --git a/OA/BAG_prim/nmos4_hvesd/schematic/thumbnail_128x128.png b/OA/BAG_prim/nmos4_hvesd/schematic/thumbnail_128x128.png
new file mode 100644
index 0000000..313567e
--- /dev/null
+++ b/OA/BAG_prim/nmos4_hvesd/schematic/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/nmos4_hvesd/symbol/master.tag b/OA/BAG_prim/nmos4_hvesd/symbol/master.tag
new file mode 100644
index 0000000..e1024da
--- /dev/null
+++ b/OA/BAG_prim/nmos4_hvesd/symbol/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+symbol.oa
diff --git a/OA/BAG_prim/nmos4_hvesd/symbol/symbol.oa b/OA/BAG_prim/nmos4_hvesd/symbol/symbol.oa
new file mode 100644
index 0000000..9ca4adf
--- /dev/null
+++ b/OA/BAG_prim/nmos4_hvesd/symbol/symbol.oa
Binary files differ
diff --git a/OA/BAG_prim/nmos4_hvesd/symbol/thumbnail_128x128.png b/OA/BAG_prim/nmos4_hvesd/symbol/thumbnail_128x128.png
new file mode 100644
index 0000000..7c02f60
--- /dev/null
+++ b/OA/BAG_prim/nmos4_hvesd/symbol/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/nmos4_lvt/data.dm b/OA/BAG_prim/nmos4_lvt/data.dm
new file mode 100644
index 0000000..d5a9d01
--- /dev/null
+++ b/OA/BAG_prim/nmos4_lvt/data.dm
Binary files differ
diff --git a/OA/BAG_prim/nmos4_lvt/schematic/data.dm b/OA/BAG_prim/nmos4_lvt/schematic/data.dm
new file mode 100644
index 0000000..1a705a2
--- /dev/null
+++ b/OA/BAG_prim/nmos4_lvt/schematic/data.dm
Binary files differ
diff --git a/OA/BAG_prim/nmos4_lvt/schematic/master.tag b/OA/BAG_prim/nmos4_lvt/schematic/master.tag
new file mode 100644
index 0000000..26be1be
--- /dev/null
+++ b/OA/BAG_prim/nmos4_lvt/schematic/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+sch.oa
diff --git a/OA/BAG_prim/nmos4_lvt/schematic/sch.oa b/OA/BAG_prim/nmos4_lvt/schematic/sch.oa
new file mode 100644
index 0000000..3889907
--- /dev/null
+++ b/OA/BAG_prim/nmos4_lvt/schematic/sch.oa
Binary files differ
diff --git a/OA/BAG_prim/nmos4_lvt/schematic/thumbnail_128x128.png b/OA/BAG_prim/nmos4_lvt/schematic/thumbnail_128x128.png
new file mode 100644
index 0000000..fc6a857
--- /dev/null
+++ b/OA/BAG_prim/nmos4_lvt/schematic/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/nmos4_lvt/symbol/master.tag b/OA/BAG_prim/nmos4_lvt/symbol/master.tag
new file mode 100644
index 0000000..e1024da
--- /dev/null
+++ b/OA/BAG_prim/nmos4_lvt/symbol/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+symbol.oa
diff --git a/OA/BAG_prim/nmos4_lvt/symbol/symbol.oa b/OA/BAG_prim/nmos4_lvt/symbol/symbol.oa
new file mode 100644
index 0000000..271e046
--- /dev/null
+++ b/OA/BAG_prim/nmos4_lvt/symbol/symbol.oa
Binary files differ
diff --git a/OA/BAG_prim/nmos4_lvt/symbol/thumbnail_128x128.png b/OA/BAG_prim/nmos4_lvt/symbol/thumbnail_128x128.png
new file mode 100644
index 0000000..7c02f60
--- /dev/null
+++ b/OA/BAG_prim/nmos4_lvt/symbol/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/nmos4_standard/data.dm b/OA/BAG_prim/nmos4_standard/data.dm
new file mode 100644
index 0000000..7773b27
--- /dev/null
+++ b/OA/BAG_prim/nmos4_standard/data.dm
Binary files differ
diff --git a/OA/BAG_prim/nmos4_standard/schematic/data.dm b/OA/BAG_prim/nmos4_standard/schematic/data.dm
new file mode 100644
index 0000000..1a705a2
--- /dev/null
+++ b/OA/BAG_prim/nmos4_standard/schematic/data.dm
Binary files differ
diff --git a/OA/BAG_prim/nmos4_standard/schematic/master.tag b/OA/BAG_prim/nmos4_standard/schematic/master.tag
new file mode 100644
index 0000000..26be1be
--- /dev/null
+++ b/OA/BAG_prim/nmos4_standard/schematic/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+sch.oa
diff --git a/OA/BAG_prim/nmos4_standard/schematic/sch.oa b/OA/BAG_prim/nmos4_standard/schematic/sch.oa
new file mode 100644
index 0000000..59f9bb6
--- /dev/null
+++ b/OA/BAG_prim/nmos4_standard/schematic/sch.oa
Binary files differ
diff --git a/OA/BAG_prim/nmos4_standard/schematic/thumbnail_128x128.png b/OA/BAG_prim/nmos4_standard/schematic/thumbnail_128x128.png
new file mode 100644
index 0000000..fc6a857
--- /dev/null
+++ b/OA/BAG_prim/nmos4_standard/schematic/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/nmos4_standard/symbol/master.tag b/OA/BAG_prim/nmos4_standard/symbol/master.tag
new file mode 100644
index 0000000..e1024da
--- /dev/null
+++ b/OA/BAG_prim/nmos4_standard/symbol/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+symbol.oa
diff --git a/OA/BAG_prim/nmos4_standard/symbol/symbol.oa b/OA/BAG_prim/nmos4_standard/symbol/symbol.oa
new file mode 100644
index 0000000..38063ef
--- /dev/null
+++ b/OA/BAG_prim/nmos4_standard/symbol/symbol.oa
Binary files differ
diff --git a/OA/BAG_prim/nmos4_standard/symbol/thumbnail_128x128.png b/OA/BAG_prim/nmos4_standard/symbol/thumbnail_128x128.png
new file mode 100644
index 0000000..7c02f60
--- /dev/null
+++ b/OA/BAG_prim/nmos4_standard/symbol/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/nmos4_svt/data.dm b/OA/BAG_prim/nmos4_svt/data.dm
new file mode 100644
index 0000000..4244604
--- /dev/null
+++ b/OA/BAG_prim/nmos4_svt/data.dm
Binary files differ
diff --git a/OA/BAG_prim/nmos4_svt/schematic/data.dm b/OA/BAG_prim/nmos4_svt/schematic/data.dm
new file mode 100644
index 0000000..1a705a2
--- /dev/null
+++ b/OA/BAG_prim/nmos4_svt/schematic/data.dm
Binary files differ
diff --git a/OA/BAG_prim/nmos4_svt/schematic/master.tag b/OA/BAG_prim/nmos4_svt/schematic/master.tag
new file mode 100644
index 0000000..26be1be
--- /dev/null
+++ b/OA/BAG_prim/nmos4_svt/schematic/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+sch.oa
diff --git a/OA/BAG_prim/nmos4_svt/schematic/sch.oa b/OA/BAG_prim/nmos4_svt/schematic/sch.oa
new file mode 100644
index 0000000..e3474a2
--- /dev/null
+++ b/OA/BAG_prim/nmos4_svt/schematic/sch.oa
Binary files differ
diff --git a/OA/BAG_prim/nmos4_svt/schematic/thumbnail_128x128.png b/OA/BAG_prim/nmos4_svt/schematic/thumbnail_128x128.png
new file mode 100644
index 0000000..fc6a857
--- /dev/null
+++ b/OA/BAG_prim/nmos4_svt/schematic/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/nmos4_svt/symbol/master.tag b/OA/BAG_prim/nmos4_svt/symbol/master.tag
new file mode 100644
index 0000000..e1024da
--- /dev/null
+++ b/OA/BAG_prim/nmos4_svt/symbol/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+symbol.oa
diff --git a/OA/BAG_prim/nmos4_svt/symbol/symbol.oa b/OA/BAG_prim/nmos4_svt/symbol/symbol.oa
new file mode 100644
index 0000000..fcd2ad0
--- /dev/null
+++ b/OA/BAG_prim/nmos4_svt/symbol/symbol.oa
Binary files differ
diff --git a/OA/BAG_prim/nmos4_svt/symbol/thumbnail_128x128.png b/OA/BAG_prim/nmos4_svt/symbol/thumbnail_128x128.png
new file mode 100644
index 0000000..7c02f60
--- /dev/null
+++ b/OA/BAG_prim/nmos4_svt/symbol/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/pmos4_hv/data.dm b/OA/BAG_prim/pmos4_hv/data.dm
new file mode 100644
index 0000000..80ab9ed
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hv/data.dm
Binary files differ
diff --git a/OA/BAG_prim/pmos4_hv/schematic/data.dm b/OA/BAG_prim/pmos4_hv/schematic/data.dm
new file mode 100644
index 0000000..cc4f188
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hv/schematic/data.dm
Binary files differ
diff --git a/OA/BAG_prim/pmos4_hv/schematic/master.tag b/OA/BAG_prim/pmos4_hv/schematic/master.tag
new file mode 100644
index 0000000..26be1be
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hv/schematic/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+sch.oa
diff --git a/OA/BAG_prim/pmos4_hv/schematic/sch.oa b/OA/BAG_prim/pmos4_hv/schematic/sch.oa
new file mode 100644
index 0000000..1207302
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hv/schematic/sch.oa
Binary files differ
diff --git a/OA/BAG_prim/pmos4_hv/schematic/thumbnail_128x128.png b/OA/BAG_prim/pmos4_hv/schematic/thumbnail_128x128.png
new file mode 100644
index 0000000..e5b4335
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hv/schematic/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/pmos4_hv/symbol/master.tag b/OA/BAG_prim/pmos4_hv/symbol/master.tag
new file mode 100644
index 0000000..e1024da
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hv/symbol/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+symbol.oa
diff --git a/OA/BAG_prim/pmos4_hv/symbol/symbol.oa b/OA/BAG_prim/pmos4_hv/symbol/symbol.oa
new file mode 100644
index 0000000..a234b3e
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hv/symbol/symbol.oa
Binary files differ
diff --git a/OA/BAG_prim/pmos4_hv/symbol/thumbnail_128x128.png b/OA/BAG_prim/pmos4_hv/symbol/thumbnail_128x128.png
new file mode 100644
index 0000000..d44f020
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hv/symbol/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/pmos4_hvesd/data.dm b/OA/BAG_prim/pmos4_hvesd/data.dm
new file mode 100644
index 0000000..60da08b
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hvesd/data.dm
Binary files differ
diff --git a/OA/BAG_prim/pmos4_hvesd/schematic/data.dm b/OA/BAG_prim/pmos4_hvesd/schematic/data.dm
new file mode 100644
index 0000000..cc4f188
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hvesd/schematic/data.dm
Binary files differ
diff --git a/OA/BAG_prim/pmos4_hvesd/schematic/master.tag b/OA/BAG_prim/pmos4_hvesd/schematic/master.tag
new file mode 100644
index 0000000..26be1be
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hvesd/schematic/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+sch.oa
diff --git a/OA/BAG_prim/pmos4_hvesd/schematic/sch.oa b/OA/BAG_prim/pmos4_hvesd/schematic/sch.oa
new file mode 100644
index 0000000..adc29aa
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hvesd/schematic/sch.oa
Binary files differ
diff --git a/OA/BAG_prim/pmos4_hvesd/schematic/thumbnail_128x128.png b/OA/BAG_prim/pmos4_hvesd/schematic/thumbnail_128x128.png
new file mode 100644
index 0000000..7e0aa55
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hvesd/schematic/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/pmos4_hvesd/symbol/master.tag b/OA/BAG_prim/pmos4_hvesd/symbol/master.tag
new file mode 100644
index 0000000..e1024da
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hvesd/symbol/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+symbol.oa
diff --git a/OA/BAG_prim/pmos4_hvesd/symbol/symbol.oa b/OA/BAG_prim/pmos4_hvesd/symbol/symbol.oa
new file mode 100644
index 0000000..f4c357f
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hvesd/symbol/symbol.oa
Binary files differ
diff --git a/OA/BAG_prim/pmos4_hvesd/symbol/thumbnail_128x128.png b/OA/BAG_prim/pmos4_hvesd/symbol/thumbnail_128x128.png
new file mode 100644
index 0000000..d44f020
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hvesd/symbol/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/pmos4_hvt/data.dm b/OA/BAG_prim/pmos4_hvt/data.dm
new file mode 100644
index 0000000..1620b20
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hvt/data.dm
Binary files differ
diff --git a/OA/BAG_prim/pmos4_hvt/schematic/data.dm b/OA/BAG_prim/pmos4_hvt/schematic/data.dm
new file mode 100644
index 0000000..cc4f188
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hvt/schematic/data.dm
Binary files differ
diff --git a/OA/BAG_prim/pmos4_hvt/schematic/master.tag b/OA/BAG_prim/pmos4_hvt/schematic/master.tag
new file mode 100644
index 0000000..26be1be
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hvt/schematic/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+sch.oa
diff --git a/OA/BAG_prim/pmos4_hvt/schematic/sch.oa b/OA/BAG_prim/pmos4_hvt/schematic/sch.oa
new file mode 100644
index 0000000..3dd2209
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hvt/schematic/sch.oa
Binary files differ
diff --git a/OA/BAG_prim/pmos4_hvt/schematic/thumbnail_128x128.png b/OA/BAG_prim/pmos4_hvt/schematic/thumbnail_128x128.png
new file mode 100644
index 0000000..90982fd
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hvt/schematic/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/pmos4_hvt/symbol/master.tag b/OA/BAG_prim/pmos4_hvt/symbol/master.tag
new file mode 100644
index 0000000..e1024da
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hvt/symbol/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+symbol.oa
diff --git a/OA/BAG_prim/pmos4_hvt/symbol/symbol.oa b/OA/BAG_prim/pmos4_hvt/symbol/symbol.oa
new file mode 100644
index 0000000..7eecf31
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hvt/symbol/symbol.oa
Binary files differ
diff --git a/OA/BAG_prim/pmos4_hvt/symbol/thumbnail_128x128.png b/OA/BAG_prim/pmos4_hvt/symbol/thumbnail_128x128.png
new file mode 100644
index 0000000..d44f020
--- /dev/null
+++ b/OA/BAG_prim/pmos4_hvt/symbol/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/pmos4_lvt/data.dm b/OA/BAG_prim/pmos4_lvt/data.dm
new file mode 100644
index 0000000..1fe4771
--- /dev/null
+++ b/OA/BAG_prim/pmos4_lvt/data.dm
Binary files differ
diff --git a/OA/BAG_prim/pmos4_lvt/schematic/data.dm b/OA/BAG_prim/pmos4_lvt/schematic/data.dm
new file mode 100644
index 0000000..cc4f188
--- /dev/null
+++ b/OA/BAG_prim/pmos4_lvt/schematic/data.dm
Binary files differ
diff --git a/OA/BAG_prim/pmos4_lvt/schematic/master.tag b/OA/BAG_prim/pmos4_lvt/schematic/master.tag
new file mode 100644
index 0000000..26be1be
--- /dev/null
+++ b/OA/BAG_prim/pmos4_lvt/schematic/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+sch.oa
diff --git a/OA/BAG_prim/pmos4_lvt/schematic/sch.oa b/OA/BAG_prim/pmos4_lvt/schematic/sch.oa
new file mode 100644
index 0000000..48a37ed
--- /dev/null
+++ b/OA/BAG_prim/pmos4_lvt/schematic/sch.oa
Binary files differ
diff --git a/OA/BAG_prim/pmos4_lvt/schematic/thumbnail_128x128.png b/OA/BAG_prim/pmos4_lvt/schematic/thumbnail_128x128.png
new file mode 100644
index 0000000..18ef0a2
--- /dev/null
+++ b/OA/BAG_prim/pmos4_lvt/schematic/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/pmos4_lvt/symbol/master.tag b/OA/BAG_prim/pmos4_lvt/symbol/master.tag
new file mode 100644
index 0000000..e1024da
--- /dev/null
+++ b/OA/BAG_prim/pmos4_lvt/symbol/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+symbol.oa
diff --git a/OA/BAG_prim/pmos4_lvt/symbol/symbol.oa b/OA/BAG_prim/pmos4_lvt/symbol/symbol.oa
new file mode 100644
index 0000000..402b9a2
--- /dev/null
+++ b/OA/BAG_prim/pmos4_lvt/symbol/symbol.oa
Binary files differ
diff --git a/OA/BAG_prim/pmos4_lvt/symbol/thumbnail_128x128.png b/OA/BAG_prim/pmos4_lvt/symbol/thumbnail_128x128.png
new file mode 100644
index 0000000..d44f020
--- /dev/null
+++ b/OA/BAG_prim/pmos4_lvt/symbol/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/pmos4_standard/data.dm b/OA/BAG_prim/pmos4_standard/data.dm
new file mode 100644
index 0000000..46e2f02
--- /dev/null
+++ b/OA/BAG_prim/pmos4_standard/data.dm
Binary files differ
diff --git a/OA/BAG_prim/pmos4_standard/schematic/data.dm b/OA/BAG_prim/pmos4_standard/schematic/data.dm
new file mode 100644
index 0000000..cc4f188
--- /dev/null
+++ b/OA/BAG_prim/pmos4_standard/schematic/data.dm
Binary files differ
diff --git a/OA/BAG_prim/pmos4_standard/schematic/master.tag b/OA/BAG_prim/pmos4_standard/schematic/master.tag
new file mode 100644
index 0000000..26be1be
--- /dev/null
+++ b/OA/BAG_prim/pmos4_standard/schematic/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+sch.oa
diff --git a/OA/BAG_prim/pmos4_standard/schematic/sch.oa b/OA/BAG_prim/pmos4_standard/schematic/sch.oa
new file mode 100644
index 0000000..20eb681
--- /dev/null
+++ b/OA/BAG_prim/pmos4_standard/schematic/sch.oa
Binary files differ
diff --git a/OA/BAG_prim/pmos4_standard/schematic/thumbnail_128x128.png b/OA/BAG_prim/pmos4_standard/schematic/thumbnail_128x128.png
new file mode 100644
index 0000000..d96f8b1
--- /dev/null
+++ b/OA/BAG_prim/pmos4_standard/schematic/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/pmos4_standard/symbol/master.tag b/OA/BAG_prim/pmos4_standard/symbol/master.tag
new file mode 100644
index 0000000..e1024da
--- /dev/null
+++ b/OA/BAG_prim/pmos4_standard/symbol/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+symbol.oa
diff --git a/OA/BAG_prim/pmos4_standard/symbol/symbol.oa b/OA/BAG_prim/pmos4_standard/symbol/symbol.oa
new file mode 100644
index 0000000..8fe93d3
--- /dev/null
+++ b/OA/BAG_prim/pmos4_standard/symbol/symbol.oa
Binary files differ
diff --git a/OA/BAG_prim/pmos4_standard/symbol/thumbnail_128x128.png b/OA/BAG_prim/pmos4_standard/symbol/thumbnail_128x128.png
new file mode 100644
index 0000000..d44f020
--- /dev/null
+++ b/OA/BAG_prim/pmos4_standard/symbol/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/pmos4_svt/data.dm b/OA/BAG_prim/pmos4_svt/data.dm
new file mode 100644
index 0000000..2ee0a48
--- /dev/null
+++ b/OA/BAG_prim/pmos4_svt/data.dm
Binary files differ
diff --git a/OA/BAG_prim/pmos4_svt/schematic/data.dm b/OA/BAG_prim/pmos4_svt/schematic/data.dm
new file mode 100644
index 0000000..cc4f188
--- /dev/null
+++ b/OA/BAG_prim/pmos4_svt/schematic/data.dm
Binary files differ
diff --git a/OA/BAG_prim/pmos4_svt/schematic/master.tag b/OA/BAG_prim/pmos4_svt/schematic/master.tag
new file mode 100644
index 0000000..26be1be
--- /dev/null
+++ b/OA/BAG_prim/pmos4_svt/schematic/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+sch.oa
diff --git a/OA/BAG_prim/pmos4_svt/schematic/sch.oa b/OA/BAG_prim/pmos4_svt/schematic/sch.oa
new file mode 100644
index 0000000..b1a0f9e
--- /dev/null
+++ b/OA/BAG_prim/pmos4_svt/schematic/sch.oa
Binary files differ
diff --git a/OA/BAG_prim/pmos4_svt/schematic/thumbnail_128x128.png b/OA/BAG_prim/pmos4_svt/schematic/thumbnail_128x128.png
new file mode 100644
index 0000000..d96f8b1
--- /dev/null
+++ b/OA/BAG_prim/pmos4_svt/schematic/thumbnail_128x128.png
Binary files differ
diff --git a/OA/BAG_prim/pmos4_svt/symbol/master.tag b/OA/BAG_prim/pmos4_svt/symbol/master.tag
new file mode 100644
index 0000000..e1024da
--- /dev/null
+++ b/OA/BAG_prim/pmos4_svt/symbol/master.tag
@@ -0,0 +1,2 @@
+-- Master.tag File, Rev:1.0
+symbol.oa
diff --git a/OA/BAG_prim/pmos4_svt/symbol/symbol.oa b/OA/BAG_prim/pmos4_svt/symbol/symbol.oa
new file mode 100644
index 0000000..8851993
--- /dev/null
+++ b/OA/BAG_prim/pmos4_svt/symbol/symbol.oa
Binary files differ
diff --git a/OA/BAG_prim/pmos4_svt/symbol/thumbnail_128x128.png b/OA/BAG_prim/pmos4_svt/symbol/thumbnail_128x128.png
new file mode 100644
index 0000000..d44f020
--- /dev/null
+++ b/OA/BAG_prim/pmos4_svt/symbol/thumbnail_128x128.png
Binary files differ
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..81661e9
--- /dev/null
+++ b/README.md
@@ -0,0 +1,41 @@
+<<<<<<< HEAD
+# BAG (BAG AMS Generator) Primitives Library for [SKY130](https://github.com/google/skywater-pdk)
+
+This repository contains the required primitives to use the BAG3 framework with
+the SkyWater proprietary S8 130nm PDK. You can get access to this PDK through
+signing an NDA and legal agreement with
+[SkyWater Technologies](https://www.skywatertechnology.com/).
+
+This repository also contains a **work in progress** to make these primitives
+and the BAG3 framework compatible with
+[the Google skywater-pdk, a fully open source, manufacturable PDK for SkyWater's 130nm (SKY13) process node](https://github.com/google/skywater-pdk).
+
+When combined with appropriate generator code, the primitives enables the
+creation of analog integrated circuits that are manufacturable at
+[SkyWater Technologies](https://www.skywatertechnology.com/) commercially or
+through programs like
+[Google's no-cost MPW shuttle program for open source designs, done in collaboration with efabless](https://efabless.com/open_shuttle_program).
+
+## What is BAG?
+
+[BAG AMS Generator (BAG)](https://github.com/ucb-art/bag) is the 3rd generation
+of the Berkeley Analog Generator framework (see also
+[BAG v2 framework](https://github.com/ucb-art/bag)).
+
+## License
+
+To enable wide compatibility with the existing BAG ecosystem, this repository
+is dual-licensed. It is available to you under your choice of the
+[the Apache 2.0 license](LICENSE) or a [3 clause BSD style](LICENSE.alternative).
+
+SPDX-License-Identifier: BSD-3-Clause OR Apache 2.0
+=======
+# skywater130
+
+skywater130 primitives for [BAG](https://github.com/bluecheetah/bag).
+
+## Licensing
+
+This library is licensed under the Apache-2.0 license.  See [here](LICENSE) for full text of the 
+Apache license.
+>>>>>>> 6131bbb6cb6705a9274fe8f91070bdc3fde555fd
diff --git a/calibre_setup/.cgidrcdb b/calibre_setup/.cgidrcdb
new file mode 120000
index 0000000..eb1c2f4
--- /dev/null
+++ b/calibre_setup/.cgidrcdb
@@ -0,0 +1 @@
+drc.runset
\ No newline at end of file
diff --git a/calibre_setup/.cgilvsdb b/calibre_setup/.cgilvsdb
new file mode 120000
index 0000000..6ea0df3
--- /dev/null
+++ b/calibre_setup/.cgilvsdb
@@ -0,0 +1 @@
+lvs_adc.runset
\ No newline at end of file
diff --git a/calibre_setup/drc.runset b/calibre_setup/drc.runset
new file mode 100644
index 0000000..7908bef
--- /dev/null
+++ b/calibre_setup/drc.runset
@@ -0,0 +1,28 @@
+*drcRulesFile: ${PDK_HOME}/DRC/Calibre/s8_drcRules
+*drcRunDir: ${BAG_WORK_DIR}/calibre_run/drc/myLib/myCell
+*drcLayoutPaths: myCell.calibre.db
+*drcLayoutPrimary: myCell
+*drcLayoutLibrary: myLib
+*drcLayoutView: layout
+*drcLayoutGetFromViewer: 1
+*drcResultsFile: myCell.drc.results
+*drcIncludeCmdsType: SVRF
+*drcSVRFCmds: {DRC KEEP EMPTY NO} {} {} {} {} {} {}
+*drcSummaryFile: myCell.drc.summary
+*drcViewSummary: 0
+*drcDFMDefaultsResultsFile: aib_mstr.dfmDefaults.db
+*cmnWarnLayoutOverwrite: 0
+*cmnPromptSaveRunset: 0
+*cmnShowOptions: 1
+*cmnSaveRunsetChanges: 0
+*cmnVConnectColon: 1
+*cmnDontWaitForLicense: 0
+*cmnRunMT: 1
+*cmnRunHyper: 1
+*cmnTemplate_RN: $BAG_WORK_DIR/calibre_run/drc/%L/%l
+*cmnSlaveHosts: {use {}} {hostName {}} {cpuCount {}} {a32a64 {}} {rsh {}} {maxMem {}} {workingDir {}} {layerDir {}} {mgcLibPath {}} {launchName {}}
+*cmnLSFSlaveTbl: {use 1} {totalCpus 1} {minCpus 1} {architecture {{}}} {minMemory {{}}} {resourceOptions {{}}} {submitOptions {{}}}
+*cmnGridSlaveTbl: {use 1} {totalCpus 1} {minCpus 1} {architecture {{}}} {minMemory {{}}} {resourceOptions {{}}} {submitOptions {{}}}
+*cmnFDILayoutLibrary: myLib
+*cmnFDILayoutView: layout
+*cmnFDIDEFLayoutPath: myCell.def
diff --git a/calibre_setup/drc.svrf b/calibre_setup/drc.svrf
new file mode 100644
index 0000000..f65cdad
--- /dev/null
+++ b/calibre_setup/drc.svrf
@@ -0,0 +1,18 @@
+LAYOUT PATH  "{{ layout_file }}"
+LAYOUT PRIMARY "{{ cell_name }}"
+LAYOUT SYSTEM {{layout_type}}
+
+DRC RESULTS DATABASE "{{ cell_name }}.drc.results" ASCII
+DRC MAXIMUM RESULTS 1000
+DRC MAXIMUM VERTEX 4096
+DRC KEEP EMPTY NO
+
+DRC CELL NAME YES CELL SPACE XFORM
+DRC SUMMARY REPORT "{{ cell_name }}.drc.summary" REPLACE HIER
+
+VIRTUAL CONNECT COLON YES
+VIRTUAL CONNECT REPORT NO
+
+DRC ICSTATION YES
+
+INCLUDE "$PDK_HOME/DRC/Calibre/s8_drcRules"
diff --git a/calibre_setup/lvs.runset b/calibre_setup/lvs.runset
new file mode 100644
index 0000000..c1a94bf
--- /dev/null
+++ b/calibre_setup/lvs.runset
@@ -0,0 +1,39 @@
+*lvsRulesFile: ${PDK_HOME}/LVS/Calibre/lvs_s8_opts
+*lvsRunDir: ${BAG_WORK_DIR}/calibre_run/lvs/myLib/top_cell
+*lvsLayoutPaths: top_cell.calibre.db
+*lvsLayoutPrimary: top_cell
+*lvsLayoutLibrary: myLib
+*lvsLayoutView: layout
+*lvsLayoutGetFromViewer: 1
+*lvsSourcePath: top_cell.src.net
+*lvsSourcePrimary: top_cell
+*lvsSourceLibrary: myLib
+*lvsSourceView: schematic
+*lvsSourceGetFromViewer: 1
+*lvsSpiceFile: top_cell.sp
+*lvsPowerNames: VDD
+*lvsGroundNames: VSS
+*lvsRecognizeGates: NONE
+*lvsConfigureSplitGates: 1
+*lvsReduceSplitGates: 0
+*lvsERCDatabase: top_cell.erc.results
+*lvsERCSummaryFile: top_cell.erc.summary
+*lvsReportFile: top_cell.lvs.report
+*lvsViewReport: 0
+*lvsSVDBcci: 1
+*lvsSVDBxcal: 1
+*lvsSVDBtxref: 1
+*lvsSVDBnopinloc: 1
+*cmnWarnLayoutOverwrite: 0
+*cmnWarnSourceOverwrite: 0
+*cmnPromptSaveRunset: 0
+*cmnShowOptions: 1
+*cmnSaveRunsetChanges: 0
+*cmnVConnectColon: 1
+*cmnTemplate_RN: $BAG_WORK_DIR/calibre_run/lvs/%L/%l
+*cmnSlaveHosts: {use {}} {hostName {}} {cpuCount {}} {a32a64 {}} {rsh {}} {maxMem {}} {workingDir {}} {layerDir {}} {mgcLibPath {}} {launchName {}}
+*cmnLSFSlaveTbl: {use 1} {totalCpus 1} {minCpus 1} {architecture {{}}} {minMemory {{}}} {resourceOptions {{}}} {submitOptions {{}}}
+*cmnGridSlaveTbl: {use 1} {totalCpus 1} {minCpus 1} {architecture {{}}} {minMemory {{}}} {resourceOptions {{}}} {submitOptions {{}}}
+*cmnFDILayoutLibrary: myLib
+*cmnFDILayoutView: layout
+*cmnFDIDEFLayoutPath: top_cell.def
diff --git a/calibre_setup/lvs.svrf b/calibre_setup/lvs.svrf
new file mode 100644
index 0000000..73b3fff
--- /dev/null
+++ b/calibre_setup/lvs.svrf
@@ -0,0 +1,47 @@
+LAYOUT PATH  "{{ layout_file }}"
+LAYOUT PRIMARY "{{ cell_name }}"
+LAYOUT SYSTEM {{layout_type}}
+
+SOURCE PATH "{{ netlist_file }}"
+SOURCE PRIMARY "{{ cell_name }}"
+SOURCE SYSTEM SPICE
+
+MASK SVDB DIRECTORY "svdb" QUERY CCI
+
+LVS REPORT "{{ cell_name }}.lvs.report"
+
+LVS REPORT OPTION NONE
+LVS FILTER UNUSED OPTION NONE SOURCE
+LVS FILTER UNUSED OPTION NONE LAYOUT
+LVS FILTER R(SH) SHORT SOURCE
+LVS REPORT MAXIMUM 50
+LVS POWER NAME VDD
+LVS GROUND NAME VSS
+
+LVS RECOGNIZE GATES NONE
+
+LVS REDUCE SPLIT GATES NO
+LVS REDUCE PARALLEL MOS YES
+LVS SHORT EQUIVALENT NODES NO
+
+LVS ABORT ON SOFTCHK NO
+LVS ABORT ON SUPPLY ERROR YES
+LVS IGNORE PORTS NO
+LVS SHOW SEED PROMOTIONS NO
+LVS SHOW SEED PROMOTIONS MAXIMUM 50
+
+LVS ISOLATE SHORTS NO
+
+VIRTUAL CONNECT COLON YES
+VIRTUAL CONNECT REPORT NO
+
+LVS EXECUTE ERC YES
+ERC RESULTS DATABASE "{{ cell_name }}.erc.results"
+ERC SUMMARY REPORT "{{ cell_name }}.erc.summary" REPLACE HIER
+ERC CELL NAME YES CELL SPACE XFORM
+ERC MAXIMUM RESULTS 1000
+ERC MAXIMUM VERTEX 4096
+
+DRC ICSTATION YES
+
+INCLUDE "$PDK_HOME/LVS/Calibre/lvs_s8_opts"
diff --git a/calibre_setup/lvs_adc.runset b/calibre_setup/lvs_adc.runset
new file mode 100644
index 0000000..cdac099
--- /dev/null
+++ b/calibre_setup/lvs_adc.runset
@@ -0,0 +1,40 @@
+*lvsRulesFile: ${PDK_HOME}/LVS/Calibre/lvs_s8_opts
+*lvsRunDir: $BAG_WORK_DIR/calibre_run/lvs/AAA_SAR_lay/AAA_Slice
+*lvsLayoutPaths: /tools/B/felicia_guo/bag3-sky130-2/calibre_run/lvs/AAA_SAR_lay/AAA_Slice/layout.gds
+*lvsLayoutPrimary: AAA_Slice
+*lvsLayoutLibrary: AAA_SAR_lay
+*lvsLayoutView: layout
+*lvsSourcePath: /tools/B/felicia_guo/bag3-sky130-2/gen_outputs/bag_sar/AAA_Slice.cdl
+*lvsSourcePrimary: AAA_Slice
+*lvsSourceLibrary: AAA_SAR_lay
+*lvsSourceView: schematic
+*lvsSpiceFile: AAA_Slice.sp
+*lvsPowerNames: VDD
+*lvsGroundNames: VSS
+*lvsRecognizeGates: NONE
+*lvsConfigureSplitGates: 1
+*lvsReduceSplitGates: 0
+*lvsERCDatabase: AAA_Slice.erc.results
+*lvsERCSummaryFile: AAA_Slice.erc.summary
+*lvsIncludeSVRFCmds: 1
+*lvsSVRFCmds: {LVS FILTER R(SH) SHORT SOURCE} {}
+*lvsReportFile: AAA_Slice.lvs.report
+*lvsViewReport: 0
+*lvsSVDBxcal: 1
+*lvsSVDBcci: 1
+*lvsSVDBtxref: 1
+*lvsSVDBnopinloc: 1
+*lvsMaskDBFile: AAA_Slice.maskdb
+*cmnWarnLayoutOverwrite: 0
+*cmnWarnSourceOverwrite: 0
+*cmnPromptSaveRunset: 0
+*cmnShowOptions: 1
+*cmnSaveRunsetChanges: 0
+*cmnVConnectColon: 1
+*cmnTemplate_RN: $BAG_WORK_DIR/calibre_run/lvs/%L/%l
+*cmnSlaveHosts: {use {}} {hostName {}} {cpuCount {}} {a32a64 {}} {rsh {}} {maxMem {}} {workingDir {}} {layerDir {}} {mgcLibPath {}} {launchName {}}
+*cmnLSFSlaveTbl: {use 1} {totalCpus 1} {minCpus 1} {architecture {{}}} {minMemory {{}}} {resourceOptions {{}}} {submitOptions {{}}}
+*cmnGridSlaveTbl: {use 1} {totalCpus 1} {minCpus 1} {architecture {{}}} {minMemory {{}}} {resourceOptions {{}}} {submitOptions {{}}}
+*cmnFDILayoutLibrary: AAA_SAR_lay
+*cmnFDILayoutView: layout
+*cmnFDIDEFLayoutPath: AAA_Slice.def
diff --git a/calibre_setup/source.added b/calibre_setup/source.added
new file mode 120000
index 0000000..09f6adb
--- /dev/null
+++ b/calibre_setup/source.added
@@ -0,0 +1 @@
+../workspace_setup/PDK/LVS/Calibre/source.cdl
\ No newline at end of file
diff --git a/corners_setup.yaml b/corners_setup.yaml
new file mode 100644
index 0000000..2399654
--- /dev/null
+++ b/corners_setup.yaml
@@ -0,0 +1,32 @@
+# Copyright 2019-2021 SkyWater PDK Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# This code is *alternatively* available under a BSD-3-Clause license, see
+# details in the README.md at the top level and the license text at
+# https://github.com/google/skywater-pdk-libs-sky130_bag3_pr/blob/master/LICENSE.alternative
+#
+# SPDX-License-Identifier: BSD-3-Clause OR Apache 2.0
+
+tt:
+  - !!python/tuple ['${BAG_TECH_CONFIG_DIR}/workspace_setup/PDK/MODELS/SPECTRE/s8phirs_10r/Models/design_wrapper.lib.scs', 'tt_fet']
+ff:
+  - !!python/tuple ['${BAG_TECH_CONFIG_DIR}/workspace_setup/PDK/MODELS/SPECTRE/s8phirs_10r/Models/design_wrapper.lib.scs', 'ff_fet']
+ss:
+  - !!python/tuple ['${BAG_TECH_CONFIG_DIR}/workspace_setup/PDK/MODELS/SPECTRE/s8phirs_10r/Models/design_wrapper.lib.scs', 'ss_fet']
+sf:
+  - !!python/tuple ['${BAG_TECH_CONFIG_DIR}/workspace_setup/PDK/MODELS/SPECTRE/s8phirs_10r/Models/design_wrapper.lib.scs', 'sf_fet']
+fs:
+  - !!python/tuple ['${BAG_TECH_CONFIG_DIR}/workspace_setup/PDK/MODELS/SPECTRE/s8phirs_10r/Models/design_wrapper.lib.scs', 'fs_fet']
+mc:
+  - !!python/tuple ['${BAG_TECH_CONFIG_DIR}/workspace_setup/PDK/MODELS/SPECTRE/s8phirs_10r/Models/design_wrapper.lib.scs', 'mc']
diff --git a/docs/code-of-conduct.rst b/docs/code-of-conduct.rst
new file mode 100644
index 0000000..3c58179
--- /dev/null
+++ b/docs/code-of-conduct.rst
@@ -0,0 +1,68 @@
+Google Open Source Community Guidelines
+---------------------------------------
+
+.. community_guidelines_text
+
+At Google, we recognize and celebrate the creativity and collaboration
+of open source contributors and the diversity of skills, experiences,
+cultures, and opinions they bring to the projects and communities they
+participate in.
+
+Every one of Google's open source projects and communities are inclusive
+environments, based on treating all individuals respectfully, regardless
+of gender identity and expression, sexual orientation, disabilities,
+neurodiversity, physical appearance, body size, ethnicity, nationality,
+race, age, religion, or similar personal characteristic.
+
+We value diverse opinions, but we value respectful behavior more.
+
+Respectful behavior includes:
+
+-  Being considerate, kind, constructive, and helpful.
+-  Not engaging in demeaning, discriminatory, harassing, hateful,
+   sexualized, or physically threatening behavior, speech, and imagery.
+-  Not engaging in unwanted physical contact.
+
+Some Google open source projects
+`may adopt <https://opensource.google/docs/releasing/preparing/#conduct>`__
+an explicit project code of conduct, which may have additional detailed
+expectations for participants. Most of those projects will use our
+`modified Contributor Covenant <https://opensource.google/docs/releasing/template/CODE_OF_CONDUCT/>`__.
+
+Resolve peacefully
+~~~~~~~~~~~~~~~~~~
+
+We do not believe that all conflict is necessarily bad; healthy debate
+and disagreement often yields positive results. However, it is never
+okay to be disrespectful.
+
+If you see someone behaving disrespectfully, you are encouraged to
+address the behavior directly with those involved. Many issues can be
+resolved quickly and easily, and this gives people more control over the
+outcome of their dispute. If you are unable to resolve the matter for
+any reason, or if the behavior is threatening or harassing, report it.
+We are dedicated to providing an environment where participants feel
+welcome and safe.
+
+Reporting problems
+~~~~~~~~~~~~~~~~~~
+
+Some Google open source projects may adopt a project-specific code of
+conduct. In those cases, a Google employee will be identified as the
+Project Steward, who will receive and handle reports of code of conduct
+violations. In the event that a project hasn’t identified a Project
+Steward, you can report problems by emailing opensource@google.com.
+
+We will investigate every complaint, but you may not receive a direct
+response. We will use our discretion in determining when and how to
+follow up on reported incidents, which may range from not taking action
+to permanent expulsion from the project and project-sponsored spaces. We
+will notify the accused of the report and provide them an opportunity to
+discuss it before any action is taken. The identity of the reporter will
+be omitted from the details of the report supplied to the accused. In
+potentially harmful situations, such as ongoing harassment or threats to
+anyone's safety, we may take action without notice.
+
+*This document was adapted from the*
+`IndieWeb Code of Conduct <https://indieweb.org/code-of-conduct>`_
+*and can also be found at* <https://opensource.google/conduct/>.
diff --git a/docs/contributing.rst b/docs/contributing.rst
new file mode 100644
index 0000000..14f6b0f
--- /dev/null
+++ b/docs/contributing.rst
@@ -0,0 +1,36 @@
+How to Contribute
+=================
+
+We'd love to accept your patches and contributions to this project.
+There are just a few small guidelines you need to follow.
+
+Contributor License Agreement
+-----------------------------
+
+Contributions to this project must be accompanied by a Contributor
+License Agreement. You (or your employer) retain the copyright to your
+contribution; this simply gives us permission to use and redistribute
+your contributions as part of the project. Head over to
+https://cla.developers.google.com/ to see your current agreements on
+file or to sign a new one.
+
+You generally only need to submit a CLA once, so if you've already
+submitted one (even if it was for a different project), you probably
+don't need to do it again.
+
+Code reviews
+------------
+
+All submissions, including submissions by project members, require
+review. We use GitHub pull requests for this purpose. Consult `GitHub
+Help <https://help.github.com/articles/about-pull-requests/>`__ for more
+information on using pull requests.
+
+Community Guidelines
+--------------------
+
+This project follows `Google's Open Source Community
+Guidelines <https://opensource.google/conduct/>`__.
+
+.. include:: code-of-conduct.rst
+    :start-after: community_guidelines_text
diff --git a/docs/license_header.txt b/docs/license_header.txt
new file mode 100644
index 0000000..5c5e95e
--- /dev/null
+++ b/docs/license_header.txt
@@ -0,0 +1,19 @@
+Copyright 2019-2021 SkyWater PDK Authors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+This code is *alternatively* available under a BSD-3-Clause license, see
+details in the README.md at the top level and the license text at
+https://github.com/google/skywater-pdk-libs-sky130_bag3_pr/blob/master/LICENSE.alternative
+
+SPDX-License-Identifier: BSD-3-Clause OR Apache 2.0
diff --git a/gds_setup/gds.layermap b/gds_setup/gds.layermap
new file mode 120000
index 0000000..33813b1
--- /dev/null
+++ b/gds_setup/gds.layermap
@@ -0,0 +1 @@
+../workspace_setup/PDK/VirtuosoOA/libs/s8phirs_10r/s8phirs_10r.layermap
\ No newline at end of file
diff --git a/gds_setup/gds.objectmap b/gds_setup/gds.objectmap
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/gds_setup/gds.objectmap
diff --git a/install.sh b/install.sh
new file mode 100755
index 0000000..a8611e7
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,93 @@
+#!/usr/bin/env bash
+# Copyright 2019-2021 SkyWater PDK Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# This code is *alternatively* available under a BSD-3-Clause license, see
+# details in the README.md at the top level and the license text at
+# https://github.com/google/skywater-pdk-libs-sky130_bag3_pr/blob/master/LICENSE.alternative
+#
+# SPDX-License-Identifier: BSD-3-Clause OR Apache 2.0
+
+export TECH_DIR="skywater130"
+export ROOT_DIR="${TECH_DIR}/workspace_setup"
+
+# files to copy from workspace_setup
+cp_files=( ".cdsenv.personal"
+           ".cdsinit.personal"
+           "bag_submodules.yaml" )
+
+# files to link from workspace_setup
+ln_files=( "bag_config.yaml"
+           ".cdsenv"
+           ".cdsinit"
+	   ".simrc"
+           ".bashrc"
+           ".bashrc_bag"
+           "cds.lib.core"
+           ".cshrc"
+           ".cshrc_bag"
+           "display.drf"
+           "models"
+           ".gitignore"
+           "leBindKeys.il"
+           "pvtech.lib"
+           "tutorial_files"
+           "start_tutorial.sh" )
+
+# user configuration files; copy
+for f in "${cp_files[@]}"; do
+    cp ${ROOT_DIR}/${f} .
+    git add -f ${f}
+done
+
+# standard configuration files; symlink
+for f in "${ln_files[@]}"; do
+    ln -s ${ROOT_DIR}/${f} .
+    git add -f ${f}
+done
+
+# setup .ipython
+export CUR_DIR=".ipython/profile_default"
+mkdir -p ${CUR_DIR}
+ln -s "../../${ROOT_DIR}/ipython_config.py" "${CUR_DIR}/ipython_config.py"
+git add -f ${CUR_DIR}/ipython_config.py
+
+# setup gen_libs folder
+mkdir gen_libs
+touch gen_libs/.gitignore
+git add -f gen_libs/.gitignore
+
+# setup cds.lib
+echo 'INCLUDE $BAG_WORK_DIR/cds.lib.core' > cds.lib
+
+# link BAG run scripts
+ln -s BAG_framework/run_scripts/start_bag_ICADV12d3.il start_bag.il
+ln -s BAG_framework/run_scripts/start_bag.sh .
+ln -s BAG_framework/run_scripts/run_bag.sh .
+ln -s BAG_framework/run_scripts/virt_server.sh .
+ln -s BAG_framework/run_scripts/setup_submodules.py .
+git add start_bag.il
+git add start_bag.sh
+git add run_bag.sh
+git add virt_server.sh
+git add setup_submodules.py
+
+# copy over transistor characterization examples
+# cp -r ${TECH_DIR}/specs_mos_char .
+# git add specs_mos_char
+# cp -r ${TECH_DIR}/scripts_char .
+# git add scripts_char
+# mkdir data
+# cp -r ${TECH_DIR}/mos_data/nch_w4 data/
+# cp -r ${TECH_DIR}/mos_data/pch_w4 data/
diff --git a/netlist_setup/bag_prim.cdl b/netlist_setup/bag_prim.cdl
new file mode 100644
index 0000000..fd9793a
--- /dev/null
+++ b/netlist_setup/bag_prim.cdl
@@ -0,0 +1,74 @@
+* Copyright 2019-2021 SkyWater PDK Authors
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     https://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+* This code is *alternatively* available under a BSD-3-Clause license, see
+* details in the README.md at the top level and the license text at
+* https://github.com/google/skywater-pdk-libs-sky130_bag3_pr/blob/master/LICENSE.alternative
+*
+* SPDX-License-Identifier: BSD-3-Clause OR Apache 2.0
+
+.SUBCKT nmos4_hv B D G S
+*.PININFO B:B D:B G:B S:B
+MM0 D G S B nhv l=l*1.0e6 w=w*1.0e6 m=nf mult=1
+.ENDS
+
+.SUBCKT nmos4_hvesd B D G S
+*.PININFO B:B D:B G:B S:B
+MM0 D G S B nhvesd l=l*1.0e6 w=w*1.0e6 m=nf mult=1
+.ENDS
+
+.SUBCKT nmos4_svt B D G S
+*.PININFO B:B D:B G:B S:B
+MM0 D G S B nshort l=l*1.0e6 w=w*1.0e6 m=nf mult=1
+.ENDS
+
+.SUBCKT nmos4_lvt B D G S
+*.PININFO B:B D:B G:B S:B
+MM0 D G S B nlowvt l=l*1.0e6 w=w*1.0e6 m=nf mult=1
+.ENDS
+
+.SUBCKT nmos4_standard B D G S
+*.PININFO B:B D:B G:B S:B
+MM0 D G S B nshort l=l*1.0e6 w=w*1.0e6 m=nf mult=1
+.ENDS
+
+.SUBCKT pmos4_hv B D G S
+*.PININFO B:B D:B G:B S:B
+MM0 D G S B phv l=l*1.0e6 w=w*1.0e6 m=nf mult=1
+.ENDS
+
+.SUBCKT pmos4_hvesd B D G S
+*.PININFO B:B D:B G:B S:B
+MM0 D G S B phvesd l=l*1.0e6 w=w*1.0e6 m=nf mult=1
+.ENDS
+
+.SUBCKT pmos4_svt B D G S
+*.PININFO B:B D:B G:B S:B
+MM0 D G S B pshort l=l*1.0e6 w=w*1.0e6 m=nf mult=1
+.ENDS
+
+.SUBCKT pmos4_lvt B D G S
+*.PININFO B:B D:B G:B S:B
+MM0 D G S B plowvt l=l*1.0e6 w=w*1.0e6 m=nf mult=1
+.ENDS
+
+.SUBCKT pmos4_hvt B D G S
+*.PININFO B:B D:B G:B S:B
+MM0 D G S B phighvt l=l*1.0e6 w=w*1.0e6 m=nf mult=1
+.ENDS
+
+.SUBCKT pmos4_standard B D G S
+*.PININFO B:B D:B G:B S:B
+MM0 D G S B pshort l=l*1.0e6 w=w*1.0e6 m=nf mult=1
+.ENDS
diff --git a/netlist_setup/bag_prim.scs b/netlist_setup/bag_prim.scs
new file mode 100644
index 0000000..358feb1
--- /dev/null
+++ b/netlist_setup/bag_prim.scs
@@ -0,0 +1,60 @@
+
+subckt nmos4_hv B D G S
+parameters l w nf
+MM0 D G S B nhv l=l * 1.0e6 w=w * 1.0e6 m=nf mult=1
+ends nmos4_hv
+
+subckt nmos4_hvesd B D G S
+parameters l w nf
+MM0 D G S B nhvesd l=l * 1.0e6 w=w * 1.0e6 m=nf mult=1
+ends nmos4_hvesd
+
+subckt nmos4_svt B D G S
+parameters l w nf
+MM0 D G S B nshort l=l * 1.0e6 w=w * 1.0e6 m=nf mult=1
+ends nmos4_svt
+
+subckt nmos4_lvt B D G S
+parameters l w nf
+MM0 D G S B nlowvt l=l * 1.0e6 w=w * 1.0e6 m=nf mult=1
+ends nmos4_lvt
+
+subckt nmos4_standard B D G S
+parameters l w nf
+MM0 D G S B nshort l=l * 1.0e6 w=w * 1.0e6 m=nf mult=1
+ends nmos4_standard
+
+subckt pmos4_hv B D G S
+parameters l w nf
+MM0 D G S B phv l=l * 1.0e6 w=w * 1.0e6 m=nf mult=1
+ends pmos4_hv
+
+subckt pmos4_hvesd B D G S
+parameters l w nf
+MM0 D G S B phvesd l=l * 1.0e6 w=w * 1.0e6 m=nf mult=1
+ends pmos4_hvesd
+
+subckt pmos4_svt B D G S
+parameters l w nf
+MM0 D G S B pshort l=l * 1.0e6 w=w * 1.0e6 m=nf mult=1
+ends pmos4_svt
+
+subckt pmos4_lvt B D G S
+parameters l w nf
+MM0 D G S B plowvt l=l * 1.0e6 w=w * 1.0e6 m=nf mult=1
+ends pmos4_lvt
+
+subckt pmos4_hvt B D G S
+parameters l w nf
+MM0 D G S B phighvt l=l * 1.0e6 w=w * 1.0e6 m=nf mult=1
+ends pmos4_hvt
+
+subckt pmos4_standard B D G S
+parameters l w nf
+MM0 D G S B pshort l=l * 1.0e6 w=w * 1.0e6 m=nf mult=1
+ends pmos4_standard
+
+subckt ideal_balun d c p n
+    K0 d 0 p c transformer n1=2
+    K1 d 0 c n transformer n1=2
+ends ideal_balun
diff --git a/netlist_setup/gen_config.yaml b/netlist_setup/gen_config.yaml
new file mode 100644
index 0000000..d778d65
--- /dev/null
+++ b/netlist_setup/gen_config.yaml
@@ -0,0 +1,71 @@
+# Copyright 2019-2021 SkyWater PDK Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# This code is *alternatively* available under a BSD-3-Clause license, see
+# details in the README.md at the top level and the license text at
+# https://github.com/google/skywater-pdk-libs-sky130_bag3_pr/blob/master/LICENSE.alternative
+#
+# SPDX-License-Identifier: BSD-3-Clause OR Apache 2.0
+
+header:
+  CDL:
+    includes: ["${BAG_TECH_CONFIG_DIR}/calibre_setup/source.added"]
+  SPECTRE:
+    includes: []
+  VERILOG:
+    includes: []
+  SYSVERILOG:
+    includes: []
+
+mos:
+  CDL:
+    - [l, l*1.0e6]
+    - [w, w*1.0e6]
+    - [m, nf]
+    - [mult, 1]
+  SPECTRE:
+    - [l, l * 1.0e6]
+    - [w, w * 1.0e6]
+    - [m, nf]
+    - [mult, 1]
+  VERILOG: []
+  SYSVERILOG: []
+  types:
+    - [nmos4_hv, nhv]
+    - [nmos4_hvesd, nhvesd]
+    - [nmos4_svt, nshort]
+    - [nmos4_lvt, nlowvt]
+    - [nmos4_standard, nshort]
+    - [pmos4_hv, phv]
+    - [pmos4_hvesd, phvesd]
+    - [pmos4_svt, pshort]
+    - [pmos4_lvt, plowvt]
+    - [pmos4_hvt, phighvt]
+    - [pmos4_standard, pshort]
+
+diode:
+  CDL: []
+  SPECTRE: []
+  VERILOG: []
+  SYSVERILOG: []
+  static: False
+  types: []
+  port_order: {}
+
+res_metal:
+  CDL: []
+  SPECTRE: []
+  VERILOG: []
+  SYSVERILOG: []
+  types: []
diff --git a/netlist_setup/netlist_setup.yaml b/netlist_setup/netlist_setup.yaml
new file mode 100644
index 0000000..b9a24a6
--- /dev/null
+++ b/netlist_setup/netlist_setup.yaml
@@ -0,0 +1,444 @@
+# Copyright 2019-2021 SkyWater PDK Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# This code is *alternatively* available under a BSD-3-Clause license, see
+# details in the README.md at the top level and the license text at
+# https://github.com/google/skywater-pdk-libs-sky130_bag3_pr/blob/master/LICENSE.alternative
+#
+# SPDX-License-Identifier: BSD-3-Clause OR Apache 2.0
+
+inc_list:
+  4: ['${BAG_TECH_CONFIG_DIR}/calibre_setup/source.added']
+  5: []
+  6: []
+  7: []
+netlist_map:
+  BAG_prim:
+    nmos4_hv:
+      cell_name: nmos4_hv
+      in_terms: []
+      io_terms: [B, D, G, S]
+      is_prim: true
+      lib_name: BAG_prim
+      nets: []
+      out_terms: []
+      props:
+        l: [3, '']
+        nf: [3, '']
+        w: [3, '']
+    nmos4_hvesd:
+      cell_name: nmos4_hvesd
+      in_terms: []
+      io_terms: [B, D, G, S]
+      is_prim: true
+      lib_name: BAG_prim
+      nets: []
+      out_terms: []
+      props:
+        l: [3, '']
+        nf: [3, '']
+        w: [3, '']
+    nmos4_lvt:
+      cell_name: nmos4_lvt
+      in_terms: []
+      io_terms: [B, D, G, S]
+      is_prim: true
+      lib_name: BAG_prim
+      nets: []
+      out_terms: []
+      props:
+        l: [3, '']
+        nf: [3, '']
+        w: [3, '']
+    nmos4_standard:
+      cell_name: nmos4_standard
+      in_terms: []
+      io_terms: [B, D, G, S]
+      is_prim: true
+      lib_name: BAG_prim
+      nets: []
+      out_terms: []
+      props:
+        l: [3, '']
+        nf: [3, '']
+        w: [3, '']
+    nmos4_svt:
+      cell_name: nmos4_svt
+      in_terms: []
+      io_terms: [B, D, G, S]
+      is_prim: true
+      lib_name: BAG_prim
+      nets: []
+      out_terms: []
+      props:
+        l: [3, '']
+        nf: [3, '']
+        w: [3, '']
+    pmos4_hv:
+      cell_name: pmos4_hv
+      in_terms: []
+      io_terms: [B, D, G, S]
+      is_prim: true
+      lib_name: BAG_prim
+      nets: []
+      out_terms: []
+      props:
+        l: [3, '']
+        nf: [3, '']
+        w: [3, '']
+    pmos4_hvesd:
+      cell_name: pmos4_hvesd
+      in_terms: []
+      io_terms: [B, D, G, S]
+      is_prim: true
+      lib_name: BAG_prim
+      nets: []
+      out_terms: []
+      props:
+        l: [3, '']
+        nf: [3, '']
+        w: [3, '']
+    pmos4_hvt:
+      cell_name: pmos4_hvt
+      in_terms: []
+      io_terms: [B, D, G, S]
+      is_prim: true
+      lib_name: BAG_prim
+      nets: []
+      out_terms: []
+      props:
+        l: [3, '']
+        nf: [3, '']
+        w: [3, '']
+    pmos4_lvt:
+      cell_name: pmos4_lvt
+      in_terms: []
+      io_terms: [B, D, G, S]
+      is_prim: true
+      lib_name: BAG_prim
+      nets: []
+      out_terms: []
+      props:
+        l: [3, '']
+        nf: [3, '']
+        w: [3, '']
+    pmos4_standard:
+      cell_name: pmos4_standard
+      in_terms: []
+      io_terms: [B, D, G, S]
+      is_prim: true
+      lib_name: BAG_prim
+      nets: []
+      out_terms: []
+      props:
+        l: [3, '']
+        nf: [3, '']
+        w: [3, '']
+    pmos4_svt:
+      cell_name: pmos4_svt
+      in_terms: []
+      io_terms: [B, D, G, S]
+      is_prim: true
+      lib_name: BAG_prim
+      nets: []
+      out_terms: []
+      props:
+        l: [3, '']
+        nf: [3, '']
+        w: [3, '']
+  analogLib:
+    cap:
+      cell_name: cap
+      in_terms: []
+      io_terms: [PLUS, MINUS]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props:
+        c: [3, '']
+        l: [3, '']
+        m: [3, '']
+        w: [3, '']
+    cccs:
+      cell_name: cccs
+      in_terms: []
+      io_terms: [PLUS, MINUS]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props:
+        fgain: [3, '1.0']
+        maxm: [3, '']
+        minm: [3, '']
+        vref: [3, '']
+    ccvs:
+      cell_name: ccvs
+      in_terms: []
+      io_terms: [PLUS, MINUS]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props:
+        hgain: [3, '1.0']
+        maxm: [3, '']
+        minm: [3, '']
+        vref: [3, '']
+    dcblock:
+      cell_name: dcblock
+      in_terms: []
+      io_terms: [PLUS, MINUS]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props:
+        c: [3, '']
+    dcfeed:
+      cell_name: dcfeed
+      in_terms: []
+      io_terms: [PLUS, MINUS]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props:
+        l: [3, '']
+    gnd:
+      cell_name: gnd
+      ignore: true
+      in_terms: []
+      io_terms: [gnd!]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props: {}
+    idc:
+      cell_name: idc
+      in_terms: []
+      io_terms: [PLUS, MINUS]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props:
+        acm: [3, '']
+        acp: [3, '']
+        idc: [3, '']
+        pacm: [3, '']
+        pacp: [3, '']
+        srcType: [3, dc]
+        xfm: [3, '']
+    ideal_balun:
+      cell_name: ideal_balun
+      in_terms: []
+      io_terms: [d, c, p, n]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props: {}
+    ind:
+      cell_name: ind
+      in_terms: []
+      io_terms: [PLUS, MINUS]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props:
+        l: [3, '']
+        m: [3, '']
+        r: [3, '']
+    iprobe:
+      cell_name: iprobe
+      in_terms: []
+      io_terms: [PLUS, MINUS]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props: {}
+    ipulse:
+      cell_name: ipulse
+      in_terms: []
+      io_terms: [PLUS, MINUS]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props:
+        i1: [3, '']
+        i2: [3, '']
+        idc: [3, '']
+        per: [3, '']
+        pw: [3, '']
+        srcType: [3, pulse]
+        td: [3, '']
+    isin:
+      cell_name: isin
+      in_terms: []
+      io_terms: [PLUS, MINUS]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props:
+        freq: [3, '']
+        ia: [3, '']
+        idc: [3, '']
+        srcType: [3, sine]
+    port:
+      cell_name: port
+      in_terms: []
+      io_terms: [PLUS, MINUS]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props:
+        num: [3, '']
+        r: [3, '']
+        srcType: [3, sine]
+    res:
+      cell_name: res
+      in_terms: []
+      io_terms: [PLUS, MINUS]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props:
+        l: [3, '']
+        m: [3, '']
+        r: [3, '']
+        w: [3, '']
+    switch:
+      cell_name: switch
+      in_terms: []
+      io_terms: [N+, N-, NC+, NC-]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props:
+        rc: [3, '']
+        ro: [3, '']
+        vt1: [3, '']
+        vt2: [3, '']
+    vccs:
+      cell_name: vccs
+      in_terms: []
+      io_terms: [PLUS, MINUS, NC+, NC-]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props:
+        ggain: [3, '1.0']
+        maxm: [3, '']
+        minm: [3, '']
+    vcvs:
+      cell_name: vcvs
+      in_terms: []
+      io_terms: [PLUS, MINUS, NC+, NC-]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props:
+        egain: [3, '1.0']
+        maxm: [3, '']
+        minm: [3, '']
+    vdc:
+      cell_name: vdc
+      in_terms: []
+      io_terms: [PLUS, MINUS]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props:
+        acm: [3, '']
+        acp: [3, '']
+        pacm: [3, '']
+        pacp: [3, '']
+        srcType: [3, dc]
+        vdc: [3, '']
+        xfm: [3, '']
+    vpulse:
+      cell_name: vpulse
+      in_terms: []
+      io_terms: [PLUS, MINUS]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props:
+        per: [3, '']
+        pw: [3, '']
+        srcType: [3, pulse]
+        td: [3, '']
+        v1: [3, '']
+        v2: [3, '']
+        vdc: [3, '']
+    vpwlf:
+      cell_name: vpwlf
+      in_terms: []
+      io_terms: [PLUS, MINUS]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props:
+        fileName: [3, '']
+        srcType: [3, pwl]
+    vsin:
+      cell_name: vsin
+      in_terms: []
+      io_terms: [PLUS, MINUS]
+      is_prim: true
+      lib_name: analogLib
+      nets: []
+      out_terms: []
+      props:
+        freq: [3, '']
+        srcType: [3, sine]
+        va: [3, '']
+        vdc: [3, '']
+  basic:
+    cds_thru:
+      cell_name: cds_thru
+      ignore: false
+      in_terms: []
+      io_terms: [src, dst]
+      is_prim: true
+      lib_name: basic
+      nets: []
+      out_terms: []
+      props: {}
+    noConn:
+      cell_name: noConn
+      ignore: true
+      in_terms: []
+      io_terms: [noConn]
+      is_prim: true
+      lib_name: basic
+      nets: []
+      out_terms: []
+      props: {}
+prim_files: {4: skywater130/netlist_setup/bag_prim.cdl, 5: '', 6: '', 7: skywater130/netlist_setup/bag_prim.scs}
diff --git a/netlist_setup/spectre_prim.scs b/netlist_setup/spectre_prim.scs
new file mode 100644
index 0000000..f8bde6b
--- /dev/null
+++ b/netlist_setup/spectre_prim.scs
@@ -0,0 +1,6 @@
+simulator lang=spectre
+
+subckt ideal_balun d c p n
+    K0 d 0 p c transformer n1=2
+    K1 d 0 c n transformer n1=2
+ends ideal_balun
diff --git a/pcell_setup/gen_skill.py b/pcell_setup/gen_skill.py
new file mode 100644
index 0000000..c7da0cc
--- /dev/null
+++ b/pcell_setup/gen_skill.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright 2019-2021 SkyWater PDK Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# This code is *alternatively* available under a BSD-3-Clause license, see
+# details in the README.md at the top level and the license text at
+# https://github.com/google/skywater-pdk-libs-sky130_bag3_pr/blob/master/LICENSE.alternative
+#
+# SPDX-License-Identifier: BSD-3-Clause OR Apache 2.0
+
+
+from jinja2 import Template
+
+tech_lib = 's8phirs_10r'
+# mos_w_default = '0.42'
+# mos_l_default = '0.15'
+res_w_default = '1u'
+res_l_default = '2u'
+res_metal_w_default = '400n'
+res_metal_l_default = '1u'
+dio_w_default = '1u'
+dio_l_default = '1u'
+
+mos_list = [
+    ('nmos4', 'standard', 'nfet', 'nshort', '0.42', '0.15'),
+    ('nmos4', 'svt', 'nfet', 'nshort', '0.42', '0.15'),
+    ('nmos4', 'hv', 'nfet', 'nhv', '0.75', '0.50'),
+    ('nmos4', 'hvesd', 'nfet', 'nhvesd', '17.50', '0.55'),
+    ('nmos4', 'lvt', 'nfet', 'nlowvt', '0.42', '0.15'),
+    ('pmos4', 'standard', 'pfet', 'pshort', '0.55', '0.15'),
+    ('pmos4', 'svt', 'pfet', 'pshort', '0.55', '0.15'),
+    ('pmos4', 'hvt', 'pfet', 'phighvt', '0.54', '0.15'),
+    ('pmos4', 'hv', 'pfet', 'phv', '0.42', '0.50'),
+    ('pmos4', 'hvesd', 'pfet', 'phvesd', '14.50', '0.55'),
+    ('pmos4', 'lvt', 'pfet', 'plowvt', '0.55', '0.35'),
+]
+
+res_list = [
+]
+
+res_metal_list = [
+]
+
+dio_list = [
+]
+
+
+def run_main() -> None:
+    in_fname = 'prim_pcell_jinja2.il'
+    out_fname = 'prim_pcell.il'
+
+    with open(in_fname, 'r') as f:
+        content = f.read()
+
+    result = Template(content).render(
+        tech_lib=tech_lib,
+        mos_list=mos_list,
+        # mos_w_default=mos_w_default,
+        # mos_l_default=mos_l_default,
+        res_list=res_list,
+        res_w_default=res_w_default,
+        res_l_default=res_l_default,
+        res_metal_list=res_metal_list,
+        res_metal_w_default=res_metal_w_default,
+        res_metal_l_default=res_metal_l_default,
+        dio_list=dio_list,
+        dio_w_default=dio_w_default,
+        dio_l_default=dio_l_default,
+    )
+
+    with open(out_fname, 'w') as f:
+        f.write(result)
+
+
+if __name__ == '__main__':
+    run_main()
diff --git a/pcell_setup/prim_pcell.il b/pcell_setup/prim_pcell.il
new file mode 100644
index 0000000..58a6a59
--- /dev/null
+++ b/pcell_setup/prim_pcell.il
@@ -0,0 +1,424 @@
+;; This skill file compiles schematic PCells for BAG primitives
+
+lib_obj = ddGetObj("BAG_prim")
+
+
+; nmos4_standard/nshort
+pcDefinePCell(
+    list( lib_obj "nmos4_standard" "schematic" "schematic")
+    (
+     (nf string "1")
+    )
+    let((inst iopin_master io_net io_pin)
+        nval = atoi(nf)
+        inst = dbCreateParamInstByMasterName( pcCellView "s8phirs_10r" "nfet" "symbol"
+                                              "N0" -0.375:0 "R0" 1
+                                              list(list("hspiceModelMenu" "string" "nshort")
+                                                   list("m" "string" nf)
+                                                )
+        iopin_master = dbOpenCellViewByType("basic" "iopin" "symbolr" nil "r")
+        io_net = dbCreateNet(pcCellView "D")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "D" -0.5:0.5625 "R0")
+                             "D" dbCreateTerm(io_net "D" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "d"))
+        io_net = dbCreateNet(pcCellView "G")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "G" -0.875:0 "R0")
+                             "G" dbCreateTerm(io_net "G" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "g"))
+        io_net = dbCreateNet(pcCellView "S")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "S" -0.5:-0.5 "R0")
+                             "S" dbCreateTerm(io_net "S" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "s"))
+        io_net = dbCreateNet(pcCellView "B")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "B" 0.125:0 "R0")
+                             "B" dbCreateTerm(io_net "B" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "b"))
+    )
+)
+
+; nmos4_svt/nshort
+pcDefinePCell(
+    list( lib_obj "nmos4_svt" "schematic" "schematic")
+    ((w string "0.42")
+     (l string "0.15")
+     (nf string "1")
+    )
+    let((inst iopin_master io_net io_pin)
+        wval = atoi(w)
+        nval = atoi(nf)
+        inst = dbCreateParamInstByMasterName( pcCellView "s8phirs_10r" "nfet" "symbol"
+                                              "N0" -0.375:0 "R0" 1
+                                              list(list("hspiceModelMenu" "string" "nshort")
+                                                   list("w" "string" w)
+                                                   list("l" "string" l)
+                                                   list("m" "string" nf)
+                                                   list("totalW" "string" sprintf(nil "%dn" wval * nval)))
+                                            )
+        iopin_master = dbOpenCellViewByType("basic" "iopin" "symbolr" nil "r")
+        io_net = dbCreateNet(pcCellView "D")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "D" -0.5:0.5625 "R0")
+                             "D" dbCreateTerm(io_net "D" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "d"))
+        io_net = dbCreateNet(pcCellView "G")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "G" -0.875:0 "R0")
+                             "G" dbCreateTerm(io_net "G" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "g"))
+        io_net = dbCreateNet(pcCellView "S")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "S" -0.5:-0.5 "R0")
+                             "S" dbCreateTerm(io_net "S" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "s"))
+        io_net = dbCreateNet(pcCellView "B")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "B" 0.125:0 "R0")
+                             "B" dbCreateTerm(io_net "B" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "b"))
+    )
+)
+
+; nmos4_hv/nhv
+pcDefinePCell(
+    list( lib_obj "nmos4_hv" "schematic" "schematic")
+    ((w string "0.75")
+     (l string "0.50")
+     (nf string "1")
+    )
+    let((inst iopin_master io_net io_pin)
+        wval = atoi(w)
+        nval = atoi(nf)
+        inst = dbCreateParamInstByMasterName( pcCellView "s8phirs_10r" "nfet" "symbol"
+                                              "N0" -0.375:0 "R0" 1
+                                              list(list("hspiceModelMenu" "string" "nhv")
+                                                   list("w" "string" w)
+                                                   list("l" "string" l)
+                                                   list("m" "string" nf)
+                                                   list("totalW" "string" sprintf(nil "%dn" wval * nval)))
+                                            )
+        iopin_master = dbOpenCellViewByType("basic" "iopin" "symbolr" nil "r")
+        io_net = dbCreateNet(pcCellView "D")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "D" -0.5:0.5625 "R0")
+                             "D" dbCreateTerm(io_net "D" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "d"))
+        io_net = dbCreateNet(pcCellView "G")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "G" -0.875:0 "R0")
+                             "G" dbCreateTerm(io_net "G" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "g"))
+        io_net = dbCreateNet(pcCellView "S")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "S" -0.5:-0.5 "R0")
+                             "S" dbCreateTerm(io_net "S" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "s"))
+        io_net = dbCreateNet(pcCellView "B")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "B" 0.125:0 "R0")
+                             "B" dbCreateTerm(io_net "B" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "b"))
+    )
+)
+
+; nmos4_hvesd/nhvesd
+pcDefinePCell(
+    list( lib_obj "nmos4_hvesd" "schematic" "schematic")
+    ((w string "17.50")
+     (l string "0.55")
+     (nf string "1")
+    )
+    let((inst iopin_master io_net io_pin)
+        wval = atoi(w)
+        nval = atoi(nf)
+        inst = dbCreateParamInstByMasterName( pcCellView "s8phirs_10r" "nfet" "symbol"
+                                              "N0" -0.375:0 "R0" 1
+                                              list(list("hspiceModelMenu" "string" "nhvesd")
+                                                   list("w" "string" w)
+                                                   list("l" "string" l)
+                                                   list("m" "string" nf)
+                                                   list("totalW" "string" sprintf(nil "%dn" wval * nval)))
+                                            )
+        iopin_master = dbOpenCellViewByType("basic" "iopin" "symbolr" nil "r")
+        io_net = dbCreateNet(pcCellView "D")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "D" -0.5:0.5625 "R0")
+                             "D" dbCreateTerm(io_net "D" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "d"))
+        io_net = dbCreateNet(pcCellView "G")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "G" -0.875:0 "R0")
+                             "G" dbCreateTerm(io_net "G" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "g"))
+        io_net = dbCreateNet(pcCellView "S")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "S" -0.5:-0.5 "R0")
+                             "S" dbCreateTerm(io_net "S" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "s"))
+        io_net = dbCreateNet(pcCellView "B")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "B" 0.125:0 "R0")
+                             "B" dbCreateTerm(io_net "B" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "b"))
+    )
+)
+
+; nmos4_lvt/nlowvt
+pcDefinePCell(
+    list( lib_obj "nmos4_lvt" "schematic" "schematic")
+    ((w string "0.42")
+     (l string "0.15")
+     (nf string "1")
+    )
+    let((inst iopin_master io_net io_pin)
+        wval = atoi(w)
+        nval = atoi(nf)
+        inst = dbCreateParamInstByMasterName( pcCellView "s8phirs_10r" "nfet" "symbol"
+                                              "N0" -0.375:0 "R0" 1
+                                              list(list("hspiceModelMenu" "string" "nlowvt")
+                                                   list("w" "string" w)
+                                                   list("l" "string" l)
+                                                   list("m" "string" nf)
+                                                   list("totalW" "string" sprintf(nil "%dn" wval * nval)))
+                                            )
+        iopin_master = dbOpenCellViewByType("basic" "iopin" "symbolr" nil "r")
+        io_net = dbCreateNet(pcCellView "D")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "D" -0.5:0.5625 "R0")
+                             "D" dbCreateTerm(io_net "D" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "d"))
+        io_net = dbCreateNet(pcCellView "G")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "G" -0.875:0 "R0")
+                             "G" dbCreateTerm(io_net "G" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "g"))
+        io_net = dbCreateNet(pcCellView "S")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "S" -0.5:-0.5 "R0")
+                             "S" dbCreateTerm(io_net "S" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "s"))
+        io_net = dbCreateNet(pcCellView "B")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "B" 0.125:0 "R0")
+                             "B" dbCreateTerm(io_net "B" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "b"))
+    )
+)
+
+; pmos4_standard/pshort
+pcDefinePCell(
+    list( lib_obj "pmos4_standard" "schematic" "schematic")
+    ((w string "0.55")
+     (l string "0.15")
+     (nf string "1")
+    )
+    let((inst iopin_master io_net io_pin)
+        wval = atoi(w)
+        nval = atoi(nf)
+        inst = dbCreateParamInstByMasterName( pcCellView "s8phirs_10r" "pfet" "symbol"
+                                              "N0" -0.375:0 "R0" 1
+                                              list(list("hspiceModelMenu" "string" "pshort")
+                                                   list("w" "string" w)
+                                                   list("l" "string" l)
+                                                   list("m" "string" nf)
+                                                   list("totalW" "string" sprintf(nil "%dn" wval * nval)))
+                                            )
+        iopin_master = dbOpenCellViewByType("basic" "iopin" "symbolr" nil "r")
+        io_net = dbCreateNet(pcCellView "D")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "D" -0.5:0.5625 "R0")
+                             "D" dbCreateTerm(io_net "D" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "d"))
+        io_net = dbCreateNet(pcCellView "G")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "G" -0.875:0 "R0")
+                             "G" dbCreateTerm(io_net "G" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "g"))
+        io_net = dbCreateNet(pcCellView "S")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "S" -0.5:-0.5 "R0")
+                             "S" dbCreateTerm(io_net "S" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "s"))
+        io_net = dbCreateNet(pcCellView "B")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "B" 0.125:0 "R0")
+                             "B" dbCreateTerm(io_net "B" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "b"))
+    )
+)
+
+; pmos4_svt/pshort
+pcDefinePCell(
+    list( lib_obj "pmos4_svt" "schematic" "schematic")
+    ((w string "0.55")
+     (l string "0.15")
+     (nf string "1")
+    )
+    let((inst iopin_master io_net io_pin)
+        wval = atoi(w)
+        nval = atoi(nf)
+        inst = dbCreateParamInstByMasterName( pcCellView "s8phirs_10r" "pfet" "symbol"
+                                              "N0" -0.375:0 "R0" 1
+                                              list(list("hspiceModelMenu" "string" "pshort")
+                                                   list("w" "string" w)
+                                                   list("l" "string" l)
+                                                   list("m" "string" nf)
+                                                   list("totalW" "string" sprintf(nil "%dn" wval * nval)))
+                                            )
+        iopin_master = dbOpenCellViewByType("basic" "iopin" "symbolr" nil "r")
+        io_net = dbCreateNet(pcCellView "D")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "D" -0.5:0.5625 "R0")
+                             "D" dbCreateTerm(io_net "D" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "d"))
+        io_net = dbCreateNet(pcCellView "G")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "G" -0.875:0 "R0")
+                             "G" dbCreateTerm(io_net "G" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "g"))
+        io_net = dbCreateNet(pcCellView "S")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "S" -0.5:-0.5 "R0")
+                             "S" dbCreateTerm(io_net "S" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "s"))
+        io_net = dbCreateNet(pcCellView "B")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "B" 0.125:0 "R0")
+                             "B" dbCreateTerm(io_net "B" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "b"))
+    )
+)
+
+; pmos4_hvt/phighvt
+pcDefinePCell(
+    list( lib_obj "pmos4_hvt" "schematic" "schematic")
+    ((w string "0.54")
+     (l string "0.15")
+     (nf string "1")
+    )
+    let((inst iopin_master io_net io_pin)
+        wval = atoi(w)
+        nval = atoi(nf)
+        inst = dbCreateParamInstByMasterName( pcCellView "s8phirs_10r" "pfet" "symbol"
+                                              "N0" -0.375:0 "R0" 1
+                                              list(list("hspiceModelMenu" "string" "phighvt")
+                                                   list("w" "string" w)
+                                                   list("l" "string" l)
+                                                   list("m" "string" nf)
+                                                   list("totalW" "string" sprintf(nil "%dn" wval * nval)))
+                                            )
+        iopin_master = dbOpenCellViewByType("basic" "iopin" "symbolr" nil "r")
+        io_net = dbCreateNet(pcCellView "D")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "D" -0.5:0.5625 "R0")
+                             "D" dbCreateTerm(io_net "D" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "d"))
+        io_net = dbCreateNet(pcCellView "G")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "G" -0.875:0 "R0")
+                             "G" dbCreateTerm(io_net "G" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "g"))
+        io_net = dbCreateNet(pcCellView "S")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "S" -0.5:-0.5 "R0")
+                             "S" dbCreateTerm(io_net "S" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "s"))
+        io_net = dbCreateNet(pcCellView "B")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "B" 0.125:0 "R0")
+                             "B" dbCreateTerm(io_net "B" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "b"))
+    )
+)
+
+; pmos4_hv/phv
+pcDefinePCell(
+    list( lib_obj "pmos4_hv" "schematic" "schematic")
+    ((w string "0.42")
+     (l string "0.50")
+     (nf string "1")
+    )
+    let((inst iopin_master io_net io_pin)
+        wval = atoi(w)
+        nval = atoi(nf)
+        inst = dbCreateParamInstByMasterName( pcCellView "s8phirs_10r" "pfet" "symbol"
+                                              "N0" -0.375:0 "R0" 1
+                                              list(list("hspiceModelMenu" "string" "phv")
+                                                   list("w" "string" w)
+                                                   list("l" "string" l)
+                                                   list("m" "string" nf)
+                                                   list("totalW" "string" sprintf(nil "%dn" wval * nval)))
+                                            )
+        iopin_master = dbOpenCellViewByType("basic" "iopin" "symbolr" nil "r")
+        io_net = dbCreateNet(pcCellView "D")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "D" -0.5:0.5625 "R0")
+                             "D" dbCreateTerm(io_net "D" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "d"))
+        io_net = dbCreateNet(pcCellView "G")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "G" -0.875:0 "R0")
+                             "G" dbCreateTerm(io_net "G" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "g"))
+        io_net = dbCreateNet(pcCellView "S")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "S" -0.5:-0.5 "R0")
+                             "S" dbCreateTerm(io_net "S" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "s"))
+        io_net = dbCreateNet(pcCellView "B")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "B" 0.125:0 "R0")
+                             "B" dbCreateTerm(io_net "B" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "b"))
+    )
+)
+
+; pmos4_hvesd/phvesd
+pcDefinePCell(
+    list( lib_obj "pmos4_hvesd" "schematic" "schematic")
+    ((w string "14.50")
+     (l string "0.55")
+     (nf string "1")
+    )
+    let((inst iopin_master io_net io_pin)
+        wval = atoi(w)
+        nval = atoi(nf)
+        inst = dbCreateParamInstByMasterName( pcCellView "s8phirs_10r" "pfet" "symbol"
+                                              "N0" -0.375:0 "R0" 1
+                                              list(list("hspiceModelMenu" "string" "phvesd")
+                                                   list("w" "string" w)
+                                                   list("l" "string" l)
+                                                   list("m" "string" nf)
+                                                   list("totalW" "string" sprintf(nil "%dn" wval * nval)))
+                                            )
+        iopin_master = dbOpenCellViewByType("basic" "iopin" "symbolr" nil "r")
+        io_net = dbCreateNet(pcCellView "D")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "D" -0.5:0.5625 "R0")
+                             "D" dbCreateTerm(io_net "D" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "d"))
+        io_net = dbCreateNet(pcCellView "G")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "G" -0.875:0 "R0")
+                             "G" dbCreateTerm(io_net "G" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "g"))
+        io_net = dbCreateNet(pcCellView "S")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "S" -0.5:-0.5 "R0")
+                             "S" dbCreateTerm(io_net "S" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "s"))
+        io_net = dbCreateNet(pcCellView "B")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "B" 0.125:0 "R0")
+                             "B" dbCreateTerm(io_net "B" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "b"))
+    )
+)
+
+; pmos4_lvt/plowvt
+pcDefinePCell(
+    list( lib_obj "pmos4_lvt" "schematic" "schematic")
+    ((w string "0.55")
+     (l string "0.35")
+     (nf string "1")
+    )
+    let((inst iopin_master io_net io_pin)
+        wval = atoi(w)
+        nval = atoi(nf)
+        inst = dbCreateParamInstByMasterName( pcCellView "s8phirs_10r" "pfet" "symbol"
+                                              "N0" -0.375:0 "R0" 1
+                                              list(list("hspiceModelMenu" "string" "plowvt")
+                                                   list("w" "string" w)
+                                                   list("l" "string" l)
+                                                   list("m" "string" nf)
+                                                   list("totalW" "string" sprintf(nil "%dn" wval * nval)))
+                                            )
+        iopin_master = dbOpenCellViewByType("basic" "iopin" "symbolr" nil "r")
+        io_net = dbCreateNet(pcCellView "D")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "D" -0.5:0.5625 "R0")
+                             "D" dbCreateTerm(io_net "D" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "d"))
+        io_net = dbCreateNet(pcCellView "G")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "G" -0.875:0 "R0")
+                             "G" dbCreateTerm(io_net "G" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "g"))
+        io_net = dbCreateNet(pcCellView "S")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "S" -0.5:-0.5 "R0")
+                             "S" dbCreateTerm(io_net "S" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "s"))
+        io_net = dbCreateNet(pcCellView "B")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "B" 0.125:0 "R0")
+                             "B" dbCreateTerm(io_net "B" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "b"))
+    )
+)
+
+
+
+
+
+
+
diff --git a/pcell_setup/prim_pcell_jinja2.il b/pcell_setup/prim_pcell_jinja2.il
new file mode 100644
index 0000000..033bd50
--- /dev/null
+++ b/pcell_setup/prim_pcell_jinja2.il
@@ -0,0 +1,143 @@
+;; This skill file compiles schematic PCells for BAG primitives
+
+lib_obj = ddGetObj("BAG_prim")
+
+{% for mtype, threshold, model, model_thres, w_def, l_def in mos_list  %}
+; {{ mtype }}_{{ threshold }}/{{ model_thres }}
+pcDefinePCell(
+    list( lib_obj "{{ mtype }}_{{ threshold }}" "schematic" "schematic")
+    (;(w string "{{ w_def }}")
+     ;(l string "{{ l_def }}")
+     (nf string "1")
+    )
+    let((inst iopin_master io_net io_pin)
+        ;wval = atoi(w)
+        ;nval = atoi(nf)
+        inst = dbCreateParamInstByMasterName( pcCellView "{{ tech_lib }}" "{{ model }}" "symbol"
+                                              "N0" -0.375:0 "R0" 1
+                                              list(list("hspiceModelMenu" "string" "{{ model_thres }}")
+                                                   ;list("w" "string" w)
+                                                   ;list("l" "string" l)
+                                                   list("m" "string" nf)
+                                                   ;list("totalW" "string" sprintf(nil "%dn" wval * nval)))
+                                            )
+        iopin_master = dbOpenCellViewByType("basic" "iopin" "symbolr" nil "r")
+        io_net = dbCreateNet(pcCellView "D")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "D" -0.5:0.5625 "R0")
+                             "D" dbCreateTerm(io_net "D" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "d"))
+        io_net = dbCreateNet(pcCellView "G")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "G" -0.875:0 "R0")
+                             "G" dbCreateTerm(io_net "G" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "g"))
+        io_net = dbCreateNet(pcCellView "S")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "S" -0.5:-0.5 "R0")
+                             "S" dbCreateTerm(io_net "S" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "s"))
+        io_net = dbCreateNet(pcCellView "B")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "B" 0.125:0 "R0")
+                             "B" dbCreateTerm(io_net "B" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "b"))
+    )
+)
+{% endfor %}
+
+{% for intent, model in res_list  %}
+; res_{{ intent }}/{{ model }}
+pcDefinePCell(
+    list( lib_obj "res_{{ intent }}" "schematic" "schematic")
+    ((w string "{{ res_w_default }}")
+     (l string "{{ res_l_default }}")
+    )
+    let((inst iopin_master io_net io_pin)
+        inst = dbCreateParamInstByMasterName( pcCellView "{{ tech_lib }}" "{{ model }}" "symbol"
+                                              "R0" 0.5:0 "R270" 1
+                                              list(list("w" "string" w)
+                                                   list("l" "string" l)
+                                                  )
+                                            )
+        iopin_master = dbOpenCellViewByType("basic" "iopin" "symbolr" nil "r")
+        io_net = dbCreateNet(pcCellView "PLUS")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "PLUS" 1:0 "R0")
+                             "PLUS" dbCreateTerm(io_net "PLUS" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "PLUS"))
+        io_net = dbCreateNet(pcCellView "MINUS")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "MINUS" -0.15:0 "R0")
+                             "MINUS" dbCreateTerm(io_net "MINUS" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "MINUS"))
+    )
+)
+{% endfor %}
+
+{% for layer, model, rsq in res_metal_list  %}
+; res_metal_{{ layer }}/{{ model }}
+pcDefinePCell(
+    list( lib_obj "res_metal_{{ layer }}" "schematic" "schematic")
+    ((w string "{{ res_metal_w_default }}")
+     (l string "{{ res_metal_l_default }}")
+    )
+    let((inst iopin_master io_net io_pin wval lval rval)
+        wval = cdfParseFloatString(w)
+        lval = cdfParseFloatString(l)
+        rval = {{ rsq }}*lval/wval
+        inst = dbCreateParamInstByMasterName( pcCellView "{{ tech_lib }}" "{{ model }}" "symbol"
+                                              "R0" 0.1:0 "R90" 1
+                                              list(list("w" "string" w)
+                                                   list("l" "string" l)
+                                                   list("effw" "string" w)
+                                                   list("effl" "string" l)
+                                                   list("r" "float" rval)
+                                                  )
+                                            )
+
+        iopin_master = dbOpenCellViewByType("basic" "iopin" "symbolr" nil "r")
+        io_net = dbCreateNet(pcCellView "PLUS")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "PLUS" -0.15:0 "R0")
+                             "PLUS" dbCreateTerm(io_net "PLUS" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "PLUS"))
+        io_net = dbCreateNet(pcCellView "MINUS")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "MINUS" 1.15:0 "R0")
+                             "MINUS" dbCreateTerm(io_net "MINUS" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "MINUS"))
+    )
+)
+{% endfor %}
+
+
+{% for dtype, intent, model in dio_list  %}
+; {{ dtype }}_{{ intent }}/{{ model }}
+pcDefinePCell(
+    list( lib_obj "{{ dtype }}_{{ intent }}" "schematic" "schematic")
+    ((w string "{{ dio_w_default }}")
+     (l string "{{ dio_l_default }}")
+    )
+    let((inst iopin_master io_net io_pin wval lval dio_w dio_l)
+        wval = atoi(w)
+        lval = atoi(l)
+        dio_w = (wval - 1)*48 + 14
+        dio_l = (lval + 1)*86 - 18
+
+        inst = dbCreateParamInstByMasterName( pcCellView "{{ tech_lib }}" "{{ model }}" "symbol"
+                                              "R0" 0.1:0 "R90" 1
+                                              list(list("nfin" "string" w)
+                                                   list("fw" "string" sprintf(nil "%dn" dio_w))
+                                                   list("nf" "string" l)
+                                                   list("dl" "string" sprintf(nil "%dn" dio_l))
+                                                   list("m" "string" "1")
+                                                   list("area" "float" dio_w*dio_l*1e-18)
+                                                   list("pj" "float" 2*1e-9*(dio_w + dio_l))
+                                                  )
+                                            )
+
+        iopin_master = dbOpenCellViewByType("basic" "iopin" "symbolr" nil "r")
+        io_net = dbCreateNet(pcCellView "PLUS")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "PLUS" -0.15:0 "R0")
+                             "PLUS" dbCreateTerm(io_net "PLUS" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "PLUS"))
+        io_net = dbCreateNet(pcCellView "MINUS")
+        io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "MINUS" 1.15:0 "R0")
+                             "MINUS" dbCreateTerm(io_net "MINUS" "inputOutput"))
+        dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "MINUS"))
+    )
+)
+{% endfor %}
diff --git a/src/BAG_prim/__init__.py b/src/BAG_prim/__init__.py
new file mode 100644
index 0000000..0c8e06e
--- /dev/null
+++ b/src/BAG_prim/__init__.py
@@ -0,0 +1,22 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright 2019-2021 SkyWater PDK Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# This code is *alternatively* available under a BSD-3-Clause license, see
+# details in the README.md at the top level and the license text at
+# https://github.com/google/skywater-pdk-libs-sky130_bag3_pr/blob/master/LICENSE.alternative
+#
+# SPDX-License-Identifier: BSD-3-Clause OR Apache 2.0
\ No newline at end of file
diff --git a/src/BAG_prim/schematic/__init__.py b/src/BAG_prim/schematic/__init__.py
new file mode 100644
index 0000000..5573caf
--- /dev/null
+++ b/src/BAG_prim/schematic/__init__.py
@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2019 Blue Cheetah Analog Design Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
diff --git a/src/BAG_prim/schematic/nmos4_hv.py b/src/BAG_prim/schematic/nmos4_hv.py
new file mode 100644
index 0000000..85993a3
--- /dev/null
+++ b/src/BAG_prim/schematic/nmos4_hv.py
@@ -0,0 +1,30 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2019 Blue Cheetah Analog Design Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from typing import Any
+
+
+from bag.design.module import MosModuleBase
+from bag.design.database import ModuleDB
+from bag.util.immutable import Param
+
+
+# noinspection PyPep8Naming
+class BAG_prim__nmos4_hv(MosModuleBase):
+    """design module for BAG_prim__nmos4_hv.
+    """
+
+    def __init__(self, database: ModuleDB, params: Param, **kwargs: Any) -> None:
+        MosModuleBase.__init__(self, '', database, params, **kwargs)
diff --git a/src/BAG_prim/schematic/nmos4_hvesd.py b/src/BAG_prim/schematic/nmos4_hvesd.py
new file mode 100644
index 0000000..dd6f92f
--- /dev/null
+++ b/src/BAG_prim/schematic/nmos4_hvesd.py
@@ -0,0 +1,30 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2019 Blue Cheetah Analog Design Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from typing import Any
+
+
+from bag.design.module import MosModuleBase
+from bag.design.database import ModuleDB
+from bag.util.immutable import Param
+
+
+# noinspection PyPep8Naming
+class BAG_prim__nmos4_hvesd(MosModuleBase):
+    """design module for BAG_prim__nmos4_hvesd.
+    """
+
+    def __init__(self, database: ModuleDB, params: Param, **kwargs: Any) -> None:
+        MosModuleBase.__init__(self, '', database, params, **kwargs)
diff --git a/src/BAG_prim/schematic/nmos4_lvt.py b/src/BAG_prim/schematic/nmos4_lvt.py
new file mode 100644
index 0000000..078eb09
--- /dev/null
+++ b/src/BAG_prim/schematic/nmos4_lvt.py
@@ -0,0 +1,30 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2019 Blue Cheetah Analog Design Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from typing import Any
+
+
+from bag.design.module import MosModuleBase
+from bag.design.database import ModuleDB
+from bag.util.immutable import Param
+
+
+# noinspection PyPep8Naming
+class BAG_prim__nmos4_lvt(MosModuleBase):
+    """design module for BAG_prim__nmos4_lvt.
+    """
+
+    def __init__(self, database: ModuleDB, params: Param, **kwargs: Any) -> None:
+        MosModuleBase.__init__(self, '', database, params, **kwargs)
diff --git a/src/BAG_prim/schematic/nmos4_standard.py b/src/BAG_prim/schematic/nmos4_standard.py
new file mode 100644
index 0000000..d51330f
--- /dev/null
+++ b/src/BAG_prim/schematic/nmos4_standard.py
@@ -0,0 +1,30 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2019 Blue Cheetah Analog Design Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from typing import Any
+
+
+from bag.design.module import MosModuleBase
+from bag.design.database import ModuleDB
+from bag.util.immutable import Param
+
+
+# noinspection PyPep8Naming
+class BAG_prim__nmos4_standard(MosModuleBase):
+    """design module for BAG_prim__nmos4_standard.
+    """
+
+    def __init__(self, database: ModuleDB, params: Param, **kwargs: Any) -> None:
+        MosModuleBase.__init__(self, '', database, params, **kwargs)
diff --git a/src/BAG_prim/schematic/nmos4_svt.py b/src/BAG_prim/schematic/nmos4_svt.py
new file mode 100644
index 0000000..6586144
--- /dev/null
+++ b/src/BAG_prim/schematic/nmos4_svt.py
@@ -0,0 +1,30 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2019 Blue Cheetah Analog Design Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from typing import Any
+
+
+from bag.design.module import MosModuleBase
+from bag.design.database import ModuleDB
+from bag.util.immutable import Param
+
+
+# noinspection PyPep8Naming
+class BAG_prim__nmos4_svt(MosModuleBase):
+    """design module for BAG_prim__nmos4_svt.
+    """
+
+    def __init__(self, database: ModuleDB, params: Param, **kwargs: Any) -> None:
+        MosModuleBase.__init__(self, '', database, params, **kwargs)
diff --git a/src/BAG_prim/schematic/pmos4_hv.py b/src/BAG_prim/schematic/pmos4_hv.py
new file mode 100644
index 0000000..ebe5843
--- /dev/null
+++ b/src/BAG_prim/schematic/pmos4_hv.py
@@ -0,0 +1,30 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2019 Blue Cheetah Analog Design Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from typing import Any
+
+
+from bag.design.module import MosModuleBase
+from bag.design.database import ModuleDB
+from bag.util.immutable import Param
+
+
+# noinspection PyPep8Naming
+class BAG_prim__pmos4_hv(MosModuleBase):
+    """design module for BAG_prim__pmos4_hv.
+    """
+
+    def __init__(self, database: ModuleDB, params: Param, **kwargs: Any) -> None:
+        MosModuleBase.__init__(self, '', database, params, **kwargs)
diff --git a/src/BAG_prim/schematic/pmos4_hvesd.py b/src/BAG_prim/schematic/pmos4_hvesd.py
new file mode 100644
index 0000000..77da33b
--- /dev/null
+++ b/src/BAG_prim/schematic/pmos4_hvesd.py
@@ -0,0 +1,30 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2019 Blue Cheetah Analog Design Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from typing import Any
+
+
+from bag.design.module import MosModuleBase
+from bag.design.database import ModuleDB
+from bag.util.immutable import Param
+
+
+# noinspection PyPep8Naming
+class BAG_prim__pmos4_hvesd(MosModuleBase):
+    """design module for BAG_prim__pmos4_hvesd.
+    """
+
+    def __init__(self, database: ModuleDB, params: Param, **kwargs: Any) -> None:
+        MosModuleBase.__init__(self, '', database, params, **kwargs)
diff --git a/src/BAG_prim/schematic/pmos4_hvt.py b/src/BAG_prim/schematic/pmos4_hvt.py
new file mode 100644
index 0000000..d967388
--- /dev/null
+++ b/src/BAG_prim/schematic/pmos4_hvt.py
@@ -0,0 +1,30 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2019 Blue Cheetah Analog Design Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from typing import Any
+
+
+from bag.design.module import MosModuleBase
+from bag.design.database import ModuleDB
+from bag.util.immutable import Param
+
+
+# noinspection PyPep8Naming
+class BAG_prim__pmos4_hvt(MosModuleBase):
+    """design module for BAG_prim__pmos4_hvt.
+    """
+
+    def __init__(self, database: ModuleDB, params: Param, **kwargs: Any) -> None:
+        MosModuleBase.__init__(self, '', database, params, **kwargs)
diff --git a/src/BAG_prim/schematic/pmos4_lvt.py b/src/BAG_prim/schematic/pmos4_lvt.py
new file mode 100644
index 0000000..f468132
--- /dev/null
+++ b/src/BAG_prim/schematic/pmos4_lvt.py
@@ -0,0 +1,30 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2019 Blue Cheetah Analog Design Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from typing import Any
+
+
+from bag.design.module import MosModuleBase
+from bag.design.database import ModuleDB
+from bag.util.immutable import Param
+
+
+# noinspection PyPep8Naming
+class BAG_prim__pmos4_lvt(MosModuleBase):
+    """design module for BAG_prim__pmos4_lvt.
+    """
+
+    def __init__(self, database: ModuleDB, params: Param, **kwargs: Any) -> None:
+        MosModuleBase.__init__(self, '', database, params, **kwargs)
diff --git a/src/BAG_prim/schematic/pmos4_standard.py b/src/BAG_prim/schematic/pmos4_standard.py
new file mode 100644
index 0000000..d079a5f
--- /dev/null
+++ b/src/BAG_prim/schematic/pmos4_standard.py
@@ -0,0 +1,30 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2019 Blue Cheetah Analog Design Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from typing import Any
+
+
+from bag.design.module import MosModuleBase
+from bag.design.database import ModuleDB
+from bag.util.immutable import Param
+
+
+# noinspection PyPep8Naming
+class BAG_prim__pmos4_standard(MosModuleBase):
+    """design module for BAG_prim__pmos4_standard.
+    """
+
+    def __init__(self, database: ModuleDB, params: Param, **kwargs: Any) -> None:
+        MosModuleBase.__init__(self, '', database, params, **kwargs)
diff --git a/src/BAG_prim/schematic/pmos4_svt.py b/src/BAG_prim/schematic/pmos4_svt.py
new file mode 100644
index 0000000..76a7282
--- /dev/null
+++ b/src/BAG_prim/schematic/pmos4_svt.py
@@ -0,0 +1,30 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2019 Blue Cheetah Analog Design Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from typing import Any
+
+
+from bag.design.module import MosModuleBase
+from bag.design.database import ModuleDB
+from bag.util.immutable import Param
+
+
+# noinspection PyPep8Naming
+class BAG_prim__pmos4_svt(MosModuleBase):
+    """design module for BAG_prim__pmos4_svt.
+    """
+
+    def __init__(self, database: ModuleDB, params: Param, **kwargs: Any) -> None:
+        MosModuleBase.__init__(self, '', database, params, **kwargs)
diff --git a/src/templates_skywater130/__init__.py b/src/templates_skywater130/__init__.py
new file mode 100644
index 0000000..b496742
--- /dev/null
+++ b/src/templates_skywater130/__init__.py
@@ -0,0 +1,23 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2019 Blue Cheetah Analog Design Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import os
+import pkg_resources
+
+from bag.io import read_yaml
+
+config_fname = pkg_resources.resource_filename(__name__, os.path.join('data', 'tech_params.yaml'))
+
+config = read_yaml(config_fname)
diff --git a/src/templates_skywater130/data/tech_params.yaml b/src/templates_skywater130/data/tech_params.yaml
new file mode 100755
index 0000000..4d5d47c
--- /dev/null
+++ b/src/templates_skywater130/data/tech_params.yaml
@@ -0,0 +1,860 @@
+# PDK library name.
+tech_lib: 'skywater130'
+# layout unit, in meters.
+layout_unit: 1.0e-6
+# layout resolution, in layout units.
+resolution: 0.005
+# GDS export layout resolution
+gds_resolution: 0.001
+# True if BAG needs to handle coloring metals.
+use_track_coloring: True
+# default purpose name
+default_purpose: drawing
+# pin purpose name
+pin_purpose: pin
+# True to create pin objects
+make_pin_obj: True
+
+imp_layers:
+  nch: !!python/tuple ['nsdm', 'drawing']
+  pch: !!python/tuple ['psdm', 'drawing']
+  ptap: !!python/tuple ['psdm', 'drawing']
+  ntap: !!python/tuple ['nsdm', 'drawing']
+
+# mapping from metal layer ID to layer/purpose pair that defines
+# a metal resistor.
+res_metal_layer_table: {}
+#  1: [!!python/tuple ['met1', 'res']]
+#  2: [!!python/tuple ['met2', 'res']]
+#  3: [!!python/tuple ['met3', 'res']]
+#  4: [!!python/tuple ['met4', 'res']]
+#  5: [!!python/tuple ['met5', 'res']]
+
+# mapping from metal layer ID to layer/purpose pair that
+# defines metal exclusion region.
+metal_exclude_table: {}
+#  1: !!python/tuple ['met1', 'drawing']
+#  2: !!python/tuple ['met2', 'drawing']
+#  3: !!python/tuple ['met3', 'drawing']
+#  4: !!python/tuple ['met4', 'drawing']
+#  5: !!python/tuple ['met5', 'drawing']
+
+exclude_is_blockage: true
+
+# mapping from metal layer ID to metal layer name.  Assume purpose is 'drawing'.
+lay_purp_list: &lp_list
+  1: [!!python/tuple ['met1', 'drawing']]
+  2: [!!python/tuple ['met2', 'drawing']]
+  3: [!!python/tuple ['met3', 'drawing']]
+  4: [!!python/tuple ['met4', 'drawing']]
+  5: [!!python/tuple ['met5', 'drawing']]
+#  6: [!!python/tuple ['capm', 'drawing']]
+
+dum_lay_purp_list: *lp_list
+
+width_intervals:
+  1:
+    - [[28, 801]]
+    - [[28, .inf]]
+  2:
+    - [[28, .inf]]
+    - [[28, 801]]
+  3:
+    - [[60, 801]]
+    - [[60, .inf]]
+  4:
+    - [[60, .inf]]
+    - [[60, 2001]]
+  5:
+    - [[284, .inf]]
+    - [[284, .inf]]
+  
+  6:
+    - [[60, .inf]]
+    - [[60, 2001]]
+
+# mapping from tuple of via layers to via ID.
+via_id:
+  [!!python/tuple ['tap', 'drawing'], !!python/tuple ['li1', 'drawing']]: TPL1_C
+  [!!python/tuple ['poly', 'drawing'], !!python/tuple ['li1', 'drawing']]: PYL1_C
+  [!!python/tuple ['li1', 'drawing'], !!python/tuple ['met1', 'drawing']]: L1M1_C
+  [!!python/tuple ['met1', 'drawing'], !!python/tuple ['met2', 'drawing']]: M1M2_C
+  [!!python/tuple ['met2', 'drawing'], !!python/tuple ['met3', 'drawing']]: M2M3_C
+  [!!python/tuple ['met3', 'drawing'], !!python/tuple ['met4', 'drawing']]: M3M4_C
+  [!!python/tuple ['met4', 'drawing'], !!python/tuple ['met5', 'drawing']]: M4M5_C
+
+# table of electromigration temperature scale factor
+idc_em_scale:
+  # scale factor for resistor
+  # scale[idx] is used if temperature is less than or equal to temp[idx]
+  res:
+    temp: [100, .inf]
+    scale: [1.0, 0.5]
+  # scale factor for this metal layer type
+  ['met1', 'drawing']: &x_em_scale
+    temp: [100, .inf]
+    scale: [1.0, 0.5]
+  ['met2', 'drawing']: *x_em_scale
+  ['met3', 'drawing']: *x_em_scale
+  ['met4', 'drawing']: *x_em_scale
+  ['met5', 'drawing']: *x_em_scale
+  # default scale vector
+  default:
+    temp: [100, .inf]
+    scale: [1.0, 0.5]
+
+# via enclosure/spacing rules
+flipped_vias: [TPL1_C, L1M1_C, M1M2_C, M2M3_C, M3M4_C, M4M5_C]
+via_square_list: [square]
+via:
+  M1M2_C:
+    - name: square
+      dim: [30, 30]
+      sp: [34, 34]
+      bot_enc: &square_1x_enc
+        - [.inf, [[17, 11], [11, 17]]]
+      top_enc: *square_1x_enc
+  M2M3_C:
+    - name: square
+      dim: [40, 40]
+      sp: [40, 40]
+      bot_enc:
+        - [.inf, [[17, 8], [8, 17]]]
+      top_enc:
+        - [.inf, [[17, 13], [13, 17]]]
+  M3M4_C:
+    - name: square
+      dim: [40, 40]
+      sp: [40, 40]
+      bot_enc:
+        - [.inf, [[18, 11], [11, 18]]]
+      top_enc:
+        - [.inf, [[13, 13]]]
+  M4M5_C:
+    - name: square
+      dim: [160, 160]
+      sp: [160, 160]
+      bot_enc:
+        - [.inf, [[38, 38]]]
+      top_enc:
+        - [.inf, [[62, 62]]]
+
+# minimum wire spacing rule.  Space is measured orthogonal to wire direction.
+# should be in resolution units
+sp_min:
+  [met1, drawing]: &sp_min_1x
+    - [.inf, 100]
+  [met2, drawing]: *sp_min_1x
+  [met3, drawing]: &sp_min_2x
+    - [.inf, 60] #60
+  [met4, drawing]: *sp_min_2x
+  [met5, drawing]:
+    - [.inf, 320]
+
+# minimum line-end spacing rule.  Space is measured parallel to wire direction.
+sp_le_min:
+  [met1, drawing]: &sp_le_min_1x
+    - [.inf, 100] #change from 28
+  [met2, drawing]: *sp_le_min_1x
+  [met3, drawing]: &sp_le_min_2x
+    - [.inf, 60]
+  [met4, drawing]: *sp_le_min_2x
+  [met5, drawing]:
+    - [.inf, 320]
+  
+
+# minimum length/minimum area rules.
+len_min:
+  [met1, drawing]:
+    w_al_list:
+      - [.inf, 3320, 0]
+    md_al_list: []
+  [met2, drawing]:
+    w_al_list:
+      - [.inf, 2704, 0]
+    md_al_list: []
+  [met3, drawing]:
+    w_al_list:
+      - [.inf, 9600, 0]
+    md_al_list: []
+  [met4, drawing]:
+    w_al_list:
+      - [.inf, 9600, 0]
+    md_al_list: []
+  [met5, drawing]:
+    w_al_list:
+      - [.inf, 160000, 0]
+    md_al_list: []
+  #[capm, drawing]:
+  #  w_al_list:
+  #    - [.inf, 9600, 0]
+  #  md_al_list: []
+
+margins:
+  well: [40, 40]
+
+# transistor DRC rules.
+mos:
+  # MOSBase vertical connection layer
+  conn_layer: 1
+  # min/max transistor width.
+  mos_w_range: [84, 1400]
+  # transistor width resolution
+  mos_w_resolution: 1
+  # source/drain pitch related constants.
+  # source/drain pitch is computed as val[0] + val[1] * lch_unit
+  sd_pitch_constants:
+    lch: [30, .inf]
+    val: [[172, 0], [42, 1]]
+  # drain connection info
+  d_wire_info:
+    bot_layer: 0
+    # wire_w, is_horiz, v_w, v_h, v_sp, v_bot_enc, v_top_enc
+    info_list:
+      - [34, False, 34, 34, 34, 12, 16]
+      - [52, False, 34, 34, 38, 8, 12]
+  # gate connection info
+  g_wire_info:
+    bot_layer: 0
+    # wire_w, is_horiz, v_w, v_h, v_sp, v_bot_enc, v_top_enc
+    info_list:
+      - [34, True, 34, 34, 34, 10, 10]
+      - [52, False, 34, 34, 38, 8, 12]
+
+  # minimum horizontal space between OD, in resolution units
+  od_spx: 54
+  # minimum vertical space between OD, in resolution units
+  od_spy: 54
+  # guard ring vertical space
+  od_spy_gr: 4000
+  # maximum vertical space between OD, in resolution units
+  od_spy_max: 4000
+  # set by via enclosure, licon.5
+  od_po_extx: 96
+
+  # poly.2
+  po_spy: 42
+  # cannot find constrant, set to od_w_min
+  po_h_min: 84
+  # poly.10
+  po_od_exty: 26
+  # from RF transistor
+  po_h_gate: 70
+
+  # licon.9
+  mg_imp_spy: 22
+
+  npc_w: 74
+  # licon1 height + licon1 enclosure
+  npc_h: 74
+
+  md_area_min: 2244
+  md_spy: 34
+
+  # nsdm.7
+  imp_od_encx: 26
+  # nsdm.7
+  imp_od_ency: 26
+  # nsdm.1
+  imp_h_min: 76
+
+  #might be redundant, well margin from edge to implant
+  nwell_imp: 40
+
+  grid_info:
+    - [1, 52, 1]
+    - [3, 66, 1]
+    - [5, 284, 1]
+
+fill: {}
+
+res_metal: {}
+
+layer:
+  nwell: 0
+  pwell: 1
+  diff: 2
+  tap: 3
+  poly: 4
+  mcon: 5
+  met1: 6
+  via: 7
+  met2: 8
+  via2: 9
+  met3: 10
+  pad: 11
+  via3: 12
+  met4: 13
+  via4: 14
+  met5: 15
+  prune: 21
+  li1: 22
+  dnwell: 23
+  inductor: 24
+  lvtn: 25
+  nsdm: 30
+  psdm: 31
+  hvntm: 36
+  cnsm: 37
+  tunm: 41
+  hvi: 42
+  licon1: 43
+  padCenter: 45
+  nsm: 47
+  cpwbm: 51
+  cfom: 52
+  ldntm: 53
+  cp1m: 55
+  cnsdm: 56
+  cpsdm: 57
+  cntm: 58
+  cctm1: 59
+  cmm1: 60
+  cviam: 61
+  cmm2: 62
+  cviam2: 63
+  cmm3: 64
+  cpdm: 66
+  cviam3: 67
+  cmm4: 68
+  cviam4: 69
+  cmm5: 70
+  capm: 75
+  pmm: 76
+  fom: 77
+  cdnm: 79
+  urpm: 81
+  crrpm: 82
+  cli1m: 83
+  curpm: 84
+  chvtpm: 85
+  cap2m: 86
+  crpm: 87
+  vhvi: 88
+  clvom: 89
+  cncm: 90
+  ctunm: 91
+  hvtp: 92
+  conom: 93
+  clicm1: 95
+  ncm: 96
+  cpmm: 97
+  overlap: 99
+  rrpm: 100
+  pnp: 101
+  chvntm: 102
+  capacitor: 103
+  rpm: 106
+  target: 107
+  cnwm: 109
+  areaid: 110
+  npn: 111
+  hvtr: 113
+  cpmm2: 114
+  npc: 115
+  cnpc: 116
+  pmm2: 117
+  chvtrm: 118
+  cpbo: 119
+  clvtnm: 120
+  pwelliso: 122
+  blanking: 123
+  cldntm: 126
+  rdl: 136
+  ubm: 140
+  bump: 141
+  ccu1m: 142
+  cubm: 143
+  cbump: 144
+  cpwdem: 169
+  pwde: 170
+  pwbm: 173
+  uhvi: 174
+purpose:
+  seal: 1
+  core: 2
+  frame: 3
+  waffleDrop: 4
+  standardc: 5
+  sigPadDiff: 6
+  sigPadWell: 7
+  sigPadMetNtr: 8
+  ferro: 9
+  moduleCut: 10
+  dieCut: 11
+  frameRect: 12
+  zener: 13
+  extDrain20: 14
+  cut: 15
+  res: 16
+  esd: 17
+  tmppnp: 18
+  short: 19
+  mask: 20
+  maskAdd: 21
+  maskDrop: 22
+  diode: 23
+  fuse: 24
+  gate: 25
+  hvnwell: 26
+  rdlprobepad: 27
+  hv: 28
+  probe: 29
+  extFab: 30
+  option1: 31
+  option2: 32
+  option3: 33
+  option4: 34
+  option5: 35
+  option6: 36
+  option7: 37
+  option8: 38
+  precres: 39
+  silicon: 40
+  vlc: 41
+  met3: 42
+  met2: 43
+  met1: 44
+  li1: 45
+  poly: 46
+  injection: 47
+  nodnw: 49
+  deadZon: 50
+  critCorner: 51
+  critSid: 52
+  substrateCut: 53
+  opcDrop: 54
+  cuPillar: 55
+  techCd: 56
+  term1: 57
+  term2: 58
+  term3: 59
+  scr: 60
+  port: 61
+  port1: 62
+  region: 63
+  ppath: 65
+  ppath1: 66
+  macro: 67
+  nwellIsolation: 68
+  waffleWindow: 69
+  block: 70
+  waffleAdd1: 71
+  waffleAdd2: 72
+  cuDrop: 74
+  extendedDrain: 75
+  subcktDevice: 76
+  pixel: 77
+  capacitor: 78
+  analog: 79
+  lvdnw: 80
+  photo: 81
+  guardring: 82
+  model: 83
+  ipExempt: 84
+  pitch: 85
+  HighVt: 86
+  lvNative: 87
+  psa1: 88
+  psa2: 89
+  psa3: 90
+  psa4: 91
+  psa5: 92
+  psa6: 93
+  hole: 94
+  select: 95
+  dummy: 96
+  umconly: 97
+  opc: 98
+  nodummy: 99
+  drc: 100
+  etest: 101
+  vss: 102
+  fc: 103
+  fix: 104
+  mim: 105
+  nmim: 106
+  pad: 107
+  per: 108
+  cvs: 109
+  ext: 110
+  ip: 111
+  low_vt: 112
+  cis_array: 113
+  imagers: 114
+  t3: 115
+  logic: 116
+  dio: 117
+  cap: 118
+  res1: 119
+  bjt: 120
+  efuseMark: 121
+  slotBlock: 122
+  fuseMark: 123
+  umcIP: 124
+  rfdiode: 125
+  lowTapDensity: 126
+  notCritSide: 127
+  oaCustomFill: 4294967284
+  oaFillOPC: 4294967285
+  redundant: 4294967288
+  gapFill: 4294967289
+  annotation: 4294967290
+  OPCAntiSerif: 4294967291
+  OPCSerif: 4294967292
+  slot: 4294967293
+  fill: 4294967294
+  drawing: 4294967295
+  label: 237
+  drawing1: 241
+  drawing2: 242
+  drawing3: 243
+  drawing4: 244
+  drawing5: 245
+  drawing6: 246
+  drawing7: 247
+  drawing8: 248
+  drawing9: 249
+  boundary: 250
+  pin: 251
+via_layers:
+  TPM2sd_varactor:
+    - [0, 4294967295]
+    - [3604534, 4294967295]
+    - [43, 4294967295]
+  TPM1sd_varactor:
+    - [0, 4294967295]
+    - [6488162, 4294967295]
+    - [43, 4294967295]
+  DFM1sd2:
+    - [2, 4294967295]
+    - [0, 4294967295]
+    - [43, 4294967295]
+  DFTPL1s2:
+    - [2, 4294967295]
+    - [3, 4294967295]
+    - [43, 4294967295]
+  hvDFL1sd2:
+    - [2, 4294967295]
+    - [8, 4294967295]
+    - [43, 4294967295]
+  hvDFTPM1s2:
+    - [2, 4294967295]
+    - [33, 4294967295]
+    - [43, 4294967295]
+  DFL1sdf:
+    - [2, 4294967295]
+    - [99, 4294967295]
+    - [43, 4294967295]
+  DFTPL1s:
+    - [2, 4294967295]
+    - [108, 4294967295]
+    - [43, 4294967295]
+  hvDFL1sd:
+    - [2, 4294967295]
+    - [128, 4294967295]
+    - [43, 4294967295]
+  DFTPM1s:
+    - [2, 4294967295]
+    - [508, 4294967295]
+    - [43, 4294967295]
+  pDFL1_PR:
+    - [2, 4294967295]
+    - [514, 4294967295]
+    - [22, 4294967295]
+  hvDFTPM1s:
+    - [2, 4294967295]
+    - [16908545, 4294967295]
+    - [43, 4294967295]
+  DFM1sd:
+    - [2, 4294967295]
+    - [27881312, 4294967295]
+    - [43, 4294967295]
+  DFL1sd2:
+    - [2, 4294967295]
+    - [27904192, 4294967295]
+    - [43, 4294967295]
+  hvDFM1sd:
+    - [2, 4294967295]
+    - [27909216, 4294967295]
+    - [43, 4294967295]
+  DFM1:
+    - [2, 4294967295]
+    - [27912840, 4294967295]
+    - [43, 4294967295]
+  hvDFTPM1s2enh:
+    - [2, 4294967295]
+    - [27919592, 4294967295]
+    - [43, 4294967295]
+  DFTPM1sw:
+    - [2, 4294967295]
+    - [27922480, 4294967295]
+    - [43, 4294967295]
+  DFL1:
+    - [2, 4294967295]
+    - [471538201, 4294967295]
+    - [43, 4294967295]
+  nDFL1_PR:
+    - [2, 4294967295]
+    - [697935992, 4294967295]
+    - [22, 4294967295]
+  DFL1sd:
+    - [2, 4294967295]
+    - [743437048, 4294967295]
+    - [43, 4294967295]
+  DFTPM1s2enh:
+    - [2, 4294967295]
+    - [1634216811, 4294967295]
+    - [43, 4294967295]
+  hvDFM1sd2:
+    - [2, 4294967295]
+    - [3355443200, 4294967295]
+    - [43, 4294967295]
+  TPL1_fence:
+    - [3, 4294967295]
+    - [128, 4294967295]
+    - [43, 4294967295]
+  TPL1sq:
+    - [3, 4294967295]
+    - [12255418, 4294967295]
+    - [43, 4294967295]
+  TPL1:
+    - [3, 4294967295]
+    - [22217042, 4294967295]
+    - [43, 4294967295]
+  TPM1s:
+    - [3, 4294967295]
+    - [27908744, 4294967295]
+    - [43, 4294967295]
+  TPL1s:
+    - [3, 4294967295]
+    - [27910816, 4294967295]
+    - [43, 4294967295]
+  TPL1a:
+    - [3, 4294967295]
+    - [79038577, 4294967295]
+    - [43, 4294967295]
+  pTPL1_PR:
+    - [3, 4294967295]
+    - [84214787, 4294967295]
+    - [22, 4294967295]
+  TPL1cen:
+    - [3, 4294967295]
+    - [155912518, 4294967295]
+    - [43, 4294967295]
+  nTPL1_PR:
+    - [3, 4294967295]
+    - [697935816, 4294967295]
+    - [22, 4294967295]
+  TPM1:
+    - [3, 4294967295]
+    - [3355443200, 4294967295]
+    - [43, 4294967295]
+  HRPoly_0p69_RPL1con:
+    - [4, 4294967295]
+    - [0, 4294967295]
+    - [43, 4294967295]
+  PYL1sq:
+    - [4, 4294967295]
+    - [1, 4294967295]
+    - [115, 4294967295]
+  PYM2_varactor:
+    - [4, 4294967295]
+    - [33, 4294967295]
+    - [115, 4294967295]
+  PYL1_C:
+    - [4, 4294967295]
+    - [43, 4294967295]
+    - [22, 4294967295]
+  PYL1:
+    - [4, 4294967295]
+    - [113, 4294967295]
+    - [115, 4294967295]
+  PYM1_varactor:
+    - [4, 4294967295]
+    - [720906, 4294967295]
+    - [115, 4294967295]
+  HRPoly_2p85_RPL1con:
+    - [4, 4294967295]
+    - [16843009, 4294967295]
+    - [43, 4294967295]
+  PYM1butt_varactor:
+    - [4, 4294967295]
+    - [27911952, 4294967295]
+    - [115, 4294967295]
+  HRPoly_5p73_RPL1con:
+    - [4, 4294967295]
+    - [144574618, 4294967295]
+    - [43, 4294967295]
+  PYM2butt_varactor:
+    - [4, 4294967295]
+    - [697935800, 4294967295]
+    - [115, 4294967295]
+  PYL1_PR:
+    - [4, 4294967295]
+    - [1195787588, 4294967295]
+    - [22, 4294967295]
+  HRPoly_1p41_RPL1con:
+    - [4, 4294967295]
+    - [1610612736, 4294967295]
+    - [43, 4294967295]
+  PYM1:
+    - [4, 4294967295]
+    - [3355443200, 4294967295]
+    - [115, 4294967295]
+  HRPoly_5p73_L1M1con:
+    - [5, 4294967295]
+    - [0, 4294967295]
+    - [22, 4294967295]
+  L1M2:
+    - [5, 4294967295]
+    - [513, 4294967295]
+    - [22, 4294967295]
+  HRPoly_1p41_L1M1con:
+    - [5, 4294967295]
+    - [16843009, 4294967295]
+    - [22, 4294967295]
+  L1M1sq:
+    - [5, 4294967295]
+    - [27916880, 4294967295]
+    - [22, 4294967295]
+  HRPoly_2p85_L1M1con:
+    - [5, 4294967295]
+    - [160369032, 4294967295]
+    - [22, 4294967295]
+  L1M1:
+    - [5, 4294967295]
+    - [697935800, 4294967295]
+    - [22, 4294967295]
+  L1M1_C:
+    - [6, 4294967295]
+    - [5, 4294967295]
+    - [22, 4294967295]
+  M1M2:
+    - [6, 4294967295]
+    - [33, 4294967295]
+    - [8, 4294967295]
+  M1M2_PR:
+    - [6, 4294967295]
+    - [43, 4294967295]
+    - [8, 4294967295]
+  ruleVia1:
+    - [6, 4294967295]
+    - [27908184, 4294967295]
+    - [8, 4294967295]
+  ruleVia:
+    - [6, 4294967295]
+    - [27908928, 4294967295]
+    - [8, 4294967295]
+  M1M2sq:
+    - [6, 4294967295]
+    - [27911664, 4294967295]
+    - [8, 4294967295]
+  M1M2_PR_R:
+    - [6, 4294967295]
+    - [743551240, 4294967295]
+    - [8, 4294967295]
+  ruleVia2:
+    - [8, 4294967295]
+    - [0, 4294967295]
+    - [10, 4294967295]
+  M1M2_C:
+    - [8, 4294967295]
+    - [7, 4294967295]
+    - [6, 4294967295]
+  M2M3_PR_R:
+    - [8, 4294967295]
+    - [9, 4294967295]
+    - [10, 4294967295]
+  M2M3_PR:
+    - [8, 4294967295]
+    - [43, 4294967295]
+    - [10, 4294967295]
+  M2M3sq:
+    - [8, 4294967295]
+    - [27907824, 4294967295]
+    - [10, 4294967295]
+  M2M3:
+    - [8, 4294967295]
+    - [27911136, 4294967295]
+    - [10, 4294967295]
+  M3M4sq:
+    - [10, 4294967295]
+    - [0, 4294967295]
+    - [13, 4294967295]
+  M3M4_PR:
+    - [10, 4294967295]
+    - [5, 4294967295]
+    - [13, 4294967295]
+  M3M4:
+    - [10, 4294967295]
+    - [8, 4294967295]
+    - [13, 4294967295]
+  M2M3_C:
+    - [10, 4294967295]
+    - [9, 4294967295]
+    - [8, 4294967295]
+  M3M4_PR_R:
+    - [10, 4294967295]
+    - [12, 4294967295]
+    - [13, 4294967295]
+  FUSE_M3M4:
+    - [10, 4294967295]
+    - [257, 4294967295]
+    - [13, 4294967295]
+  ruleVia3:
+    - [10, 4294967295]
+    - [101320202, 4294967295]
+    - [13, 4294967295]
+  M5RDLlg_atlas:
+    - [11, 4294967295]
+    - [1, 4294967295]
+    - [136, 4294967295]
+  M5RDL:
+    - [11, 4294967295]
+    - [743437048, 4294967295]
+    - [136, 4294967295]
+  CAPMM4:
+    - [12, 4294967295]
+    - [12255418, 4294967295]
+    - [75, 4294967295]
+  M4M5sq:
+    - [13, 4294967295]
+    - [0, 4294967295]
+    - [15, 4294967295]
+  M4M5_PR:
+    - [13, 4294967295]
+    - [7, 4294967295]
+    - [15, 4294967295]
+  M3M4_C:
+    - [13, 4294967295]
+    - [12, 4294967295]
+    - [10, 4294967295]
+  M4M5_PR_R:
+    - [13, 4294967295]
+    - [14, 4294967295]
+    - [15, 4294967295]
+  M4M5:
+    - [13, 4294967295]
+    - [27911304, 4294967295]
+    - [15, 4294967295]
+  ruleVia4:
+    - [13, 4294967295]
+    - [67372036, 4294967295]
+    - [15, 4294967295]
+  CAP2MM5:
+    - [14, 4294967295]
+    - [9371790, 4294967295]
+    - [86, 4294967295]
+  M4M5_C:
+    - [15, 4294967295]
+    - [14, 4294967295]
+    - [13, 4294967295]
+  TPL1_C:
+    - [22, 4294967295]
+    - [43, 4294967295]
+    - [3, 4294967295]
+  L1M1_PR:
+    - [22, 4294967295]
+    - [27902976, 4294967295]
+    - [6, 4294967295]
diff --git a/src/templates_skywater130/mos/__init__.py b/src/templates_skywater130/mos/__init__.py
new file mode 100755
index 0000000..5573caf
--- /dev/null
+++ b/src/templates_skywater130/mos/__init__.py
@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2019 Blue Cheetah Analog Design Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
diff --git a/src/templates_skywater130/mos/tech.py b/src/templates_skywater130/mos/tech.py
new file mode 100755
index 0000000..6c4652f
--- /dev/null
+++ b/src/templates_skywater130/mos/tech.py
@@ -0,0 +1,871 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2019 Blue Cheetah Analog Design Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from typing import Tuple, Optional, FrozenSet, List, Mapping, Any
+
+from dataclasses import dataclass
+from itertools import chain
+
+from pybag.enum import Orient2D
+from pybag.core import COORD_MAX, BBox
+
+from bag.util.immutable import ImmutableSortedDict, ImmutableList, Param
+from bag.layout.tech import TechInfo
+from bag.layout.routing.grid import TrackSpec
+from bag.util.immutable import ImmutableSortedDict, ImmutableList, Param
+
+from xbase.layout.enum import MOSType, MOSPortType, MOSCutMode, MOSAbutMode, DeviceType
+from xbase.layout.data import LayoutInfoBuilder, ViaInfo, CornerLayInfo
+from xbase.layout.exception import ODImplantEnclosureError
+from xbase.layout.mos.tech import MOSTech
+from xbase.layout.mos.data import (
+    MOSRowSpecs, MOSRowInfo, BlkExtInfo, MOSEdgeInfo, MOSLayInfo, ExtWidthInfo, LayoutInfo,
+    ExtEndLayInfo, RowExtInfo
+)
+from ..util import add_base, add_base_mos, get_arr_edge_dim
+
+MConnInfoType = Tuple[int, int, Orient2D, int, Tuple[str, str]]
+
+
+@dataclass(eq=True, frozen=True)
+class ConnInfo:
+    w: int
+    len_min: int
+    sp_le: int
+    orient: Orient2D
+    via_w: int
+    via_h: int
+    via_sp: int
+    via_bot_enc: int
+    via_top_enc: int
+
+    def get_via_info(self, via_type: str, xc: int, yc: int, bot_w: int, ortho: bool = True,
+                     num: int = 1, nx: int = 1, ny: int = 1, spx: int = 0, spy: int = 0) -> ViaInfo:
+        vw = self.via_w
+        vh = self.via_h
+        vsp = self.via_sp
+
+        bot_orient = self.orient
+        if ortho:
+            bot_orient = bot_orient.perpendicular()
+
+        if bot_orient is Orient2D.x:
+            bot_encx = self.via_bot_enc
+            bot_ency = (bot_w - vh) // 2
+        else:
+            bot_encx = (bot_w - vw) // 2
+            bot_ency = self.via_bot_enc
+
+        if self.orient is Orient2D.x:
+            top_encx = self.via_top_enc
+            top_ency = (self.w - vh) // 2
+            vnx = num
+            vny = 1
+        else:
+            top_encx = (self.w - vw) // 2
+            top_ency = self.via_top_enc
+            vnx = 1
+            vny = num
+
+        enc1 = (bot_encx, bot_encx, bot_ency, bot_ency)
+        enc2 = (top_encx, top_encx, top_ency, top_ency)
+        return ViaInfo(via_type, xc, yc, self.via_w, self.via_h, enc1, enc2,
+                       vnx, vny, vsp, vsp, nx, ny, spx, spy)
+
+
+class MOSTechSkywater130(MOSTech):
+    ignore_vm_sp_le_layers: FrozenSet[str] = frozenset(('m1',))
+
+    def __init__(self, tech_info: TechInfo, lch: int, arr_options: Mapping[str, Any]) -> None:
+        MOSTech.__init__(self, tech_info, lch, arr_options) 
+
+    @property
+    def blk_h_pitch(self) -> int:
+        return 2
+
+    @property
+    def end_h_min(self) -> int:
+        return self.mos_config['imp_h_min'] // 2
+
+    @property
+    def min_sep_col(self) -> int:
+        #return self._get_od_sep_col(self.mos_config['od_spx'])
+
+        #felicia copied
+        lch = self.lch
+        sd_pitch = self.sd_pitch
+        od_po_extx = self.od_po_extx
+
+        od_spx: int = self.mos_config['od_spx']
+        imp_od_encx: int = self.mos_config['imp_od_encx']
+        ans = -(-(od_spx + lch + 2 * od_po_extx + 2*imp_od_encx) // sd_pitch) - 1
+        return ans + (ans & 1)
+
+    @property
+    def sub_sep_col(self) -> int:
+        # column separation needed between transistor/substrate and substrate/substrate.
+        # This is guaranteed to be even.
+
+        #return self._get_od_sep_col(max(self.mos_config['od_spx'],
+        #                            2 * self.mos_config['imp_od_encx']))
+        
+        #felicia - copied method from cds_ff_mpt
+        #does something similar to _get_od_sep_col but seems to have 
+        #effective +1 that get_od doesn't have
+        lch = self.lch
+        sd_pitch = self.sd_pitch
+        od_po_extx = self.od_po_extx
+
+        mos_config = self.mos_config
+        od_spx: int = mos_config['od_spx']
+        imp_od_encx: int = mos_config['imp_od_encx']
+
+        od_spx = max(od_spx, 2 * imp_od_encx)
+        ans = -(-(od_spx + lch + 2 * od_po_extx) // sd_pitch) - 1
+        return ans + (ans & 1)
+        
+    @property
+    def min_sub_col(self) -> int:
+        return self.min_od_col
+
+    @property
+    def gr_edge_col(self) -> int:
+        return self.min_od_col
+
+    @property
+    def min_od_col(self) -> int:
+        lch = self.lch
+        sd_pitch = self.sd_pitch
+        od_po_extx = self.od_po_extx
+
+        od_w_min: int = self.mos_config['mos_w_range'][0]
+        return -(-max(0, od_w_min - 2 * od_po_extx - lch) // sd_pitch) + 1
+
+    @property
+    def abut_mode(self) -> MOSAbutMode:
+        return MOSAbutMode.NONE
+
+    @property
+    def od_po_extx(self) -> int:
+        return self.mos_config['od_po_extx']
+
+    @property
+    def well_w_edge(self) -> int:
+        imp_od_encx: int = self.mos_config['imp_od_encx']
+        nwell_imp: int = self.mos_config['nwell_imp']
+        return -(self.sd_pitch - self.lch) // 2 + self.od_po_extx + nwell_imp + imp_od_encx
+
+    def get_conn_info(self, conn_layer: int, is_gate: bool) -> ConnInfo:
+        mconf = self.mos_config
+        wire_info = mconf['g_wire_info' if is_gate else 'd_wire_info']
+
+        idx = conn_layer - wire_info['bot_layer']
+        w, is_horiz, v_w, v_h, v_sp, v_bot_enc, v_top_enc = wire_info['info_list'][idx]
+        orient = Orient2D(int(is_horiz ^ 1))
+        if conn_layer == 0:
+            sp_le = mconf['md_spy']
+            len_min = -(-mconf['md_area_min'] // w)
+        else:
+            tech_info = self.tech_info
+            lay, purp = tech_info.get_lay_purp_list(conn_layer)[0]
+            # make sure minimum length satisfies via enclosure rule
+            cur_len = 2 * v_top_enc + (v_w if is_horiz else v_h)
+            len_min = tech_info.get_next_length(lay, purp, orient, w, cur_len, even=True)
+            sp_le = tech_info.get_min_line_end_space(lay, w, purpose=purp, even=True)
+
+        return ConnInfo(w, len_min, sp_le, orient, v_w, v_h, v_sp, v_bot_enc, v_top_enc)
+
+    def can_short_adj_tracks(self, conn_layer: int) -> bool:
+        return False
+
+    def get_track_specs(self, conn_layer: int, top_layer: int) -> List[TrackSpec]:
+        assert conn_layer == 1, 'currently only work for conn_layer = 1'
+
+        sd_pitch = self.sd_pitch
+
+        grid_info = self.mos_config['grid_info']
+
+        return [TrackSpec(layer=lay, direction=Orient2D.y, width=vm_w,
+                          space=num_sd * sd_pitch - vm_w, offset=(num_sd * sd_pitch) // 2)
+                for lay, vm_w, num_sd in grid_info if conn_layer <= lay <= top_layer]
+
+    def get_edge_width(self, mos_arr_width: int, blk_pitch: int) -> int:
+        w_edge_min = self.mos_config['imp_od_encx'] + self.sd_pitch // 2
+        return get_arr_edge_dim(mos_arr_width, w_edge_min, blk_pitch)
+
+    def get_mos_row_info(self, conn_layer: int, specs: MOSRowSpecs, bot_mos_type: MOSType,
+                         top_mos_type: MOSType, global_options: Param) -> MOSRowInfo:
+        assert conn_layer == 1, 'currently only work for conn_layer = 1'
+
+        blk_p = self.blk_h_pitch
+
+        w = specs.width
+        w_sub = specs.sub_width
+        mos_type = specs.mos_type
+        threshold = specs.threshold
+
+        mconf = self.mos_config
+        po_spy: int = mconf['po_spy']
+        od_spy: int = mconf['od_spy']
+        po_h_gate: int = mconf['po_h_gate']
+        po_od_exty: int = mconf['po_od_exty']
+        mg_imp_spy: int = mconf['mg_imp_spy']
+        imp_h_min: int = mconf['imp_h_min']
+        imp_od_ency: int = mconf['imp_od_ency']
+        po_spy2 = po_spy // 2
+        imp_h_min2 = imp_h_min // 2
+
+        md_info = self.get_conn_info(0, False)
+        od_vency = md_info.via_bot_enc
+        md_top_vency = md_info.via_top_enc
+
+        mg_info = self.get_conn_info(0, False)
+        mg_h = mg_info.w
+
+        m1_info = self.get_conn_info(1, False)
+        v0_h = m1_info.via_h
+        m1_h_min = m1_info.len_min
+        m1_spy = m1_info.sp_le
+        md_bot_vency = m1_info.via_bot_enc
+        m1_vency = m1_info.via_top_enc
+
+        po_yl = po_spy2
+        po_yh_gate = po_yl + po_h_gate
+        po_yc_gate = (po_yl + po_yh_gate) // 2
+        gm1_yh = po_yc_gate + v0_h // 2 + m1_vency
+        gm1_yl = min(po_yc_gate - v0_h // 2 - m1_vency, gm1_yh - m1_h_min)
+        # fix mg_imp spacing
+        imp_yl = max(imp_h_min2, po_yc_gate + mg_h // 2 + mg_imp_spy)
+        od_yl = imp_yl + imp_od_ency
+
+        dm1_yl = gm1_yh + m1_spy
+        dv0_yl = dm1_yl + m1_vency
+        dmd_yl = dv0_yl - md_bot_vency
+        dvc_yl = dmd_yl + md_top_vency
+        od_yl = max(od_yl, dvc_yl - od_vency)
+
+        od_yh = od_yl + w
+        po_yh = od_yh + po_od_exty
+        blk_yh = max(od_yh + imp_od_ency + imp_h_min2, po_yh + po_spy2)
+
+        blk_yh = -(-blk_yh // blk_p) * blk_p
+
+        md_yl, md_yh, vc_num = self._get_conn_params(self.get_conn_info(0, False), od_yl, od_yh)
+        dm1_yl, dm1_yh, v0_num = self._get_conn_params(m1_info, md_yl, md_yh)
+
+        # return MOSRowInfo
+        top_einfo = RowExtInfo(
+            mos_type, threshold,
+            ImmutableSortedDict(dict(
+                mos_type=mos_type,
+                margins=dict(
+                    od=(blk_yh - od_yh, od_spy),
+                    po=(blk_yh - po_yh, po_spy),
+                    m1=(blk_yh - dm1_yh, m1_spy),
+                )
+            )),
+        )
+        bot_einfo = RowExtInfo(
+            mos_type, threshold,
+            ImmutableSortedDict(dict(
+                mos_type=mos_type,
+                margins=dict(
+                    od=(od_yl, od_spy),
+                    po=(po_yl, po_spy),
+                    m1=(gm1_yl, m1_spy),
+                ),
+            )),
+        )
+        info = dict(
+            imp_y=(od_yl - imp_od_ency, od_yh + imp_od_ency),
+            od_y=(od_yl, od_yh),
+            po_y=(po_yh_gate, po_yh),
+            po_y_gate=(po_yl, po_yh_gate),
+        )
+
+        g_y = (gm1_yl, gm1_yh)
+        g_m_y = (0, po_yl)
+        ds_y = ds_g_y = sub_y = (dm1_yl, dm1_yh)
+        ds_m_y = (po_yh, blk_yh)
+        return MOSRowInfo(self.lch, w, w_sub, mos_type, specs.threshold, blk_yh, specs.flip,
+                          top_einfo, bot_einfo, ImmutableSortedDict(info), g_y, g_m_y, ds_y,
+                          ds_m_y, ds_g_y, sub_y, guard_ring=False)
+
+    def get_ext_width_info(self, bot_row_ext_info: RowExtInfo, top_row_ext_info: RowExtInfo,
+                           ignore_vm_sp_le: bool = False) -> ExtWidthInfo:
+        assert not ignore_vm_sp_le, 'ignore_vm_sp_le is not supported'
+
+        blk_p = self.blk_h_pitch
+
+        bot_margins = bot_row_ext_info['margins']
+        top_margins = top_row_ext_info['margins']
+        ext_h_min = 0
+        for key, (bot_val, sp) in bot_margins.items():
+            top_info = top_margins.get(key, None)
+            if top_info is not None:
+                top_val = top_info[0]
+                ext_h_min = max(ext_h_min, sp - (top_val + bot_val))
+        w_min = -(-ext_h_min // blk_p)
+
+        return ExtWidthInfo([], w_min)
+
+    def get_extension_regions(self, bot_info: RowExtInfo, top_info: RowExtInfo, height: int
+                              ) -> Tuple[MOSCutMode, int, int]:
+        if _get_extend_bot_implant(bot_info, top_info):
+            # split at top
+            cut_mode = MOSCutMode.TOP
+            bot_exty = height
+            top_exty = 0
+        else:
+            # split at bottom
+            cut_mode = MOSCutMode.BOT
+            bot_exty = 0
+            top_exty = height
+
+        return cut_mode, bot_exty, top_exty
+
+    def get_mos_conn_info(self, row_info: MOSRowInfo, conn_layer: int, seg: int, w: int, stack: int,
+                          g_on_s: bool, options: Param) -> MOSLayInfo:
+        assert conn_layer == 1, 'currently only work for conn_layer = 1'
+
+        sep_g = options.get('sep_g', False)
+        export_mid = options.get('export_mid', False)
+        export_mid = export_mid and stack == 2
+
+        sd_pitch = self.sd_pitch
+
+        height = row_info.height
+        row_type = row_info.row_type
+        threshold = row_info.threshold
+        imp_y: Tuple[int, int] = row_info['imp_y']
+        po_y_gate: Tuple[int, int] = row_info['po_y_gate']
+
+        # compute gate wires location
+        fg = seg * stack
+        wire_pitch = stack * sd_pitch
+        conn_pitch = 2 * wire_pitch
+        num_s = seg // 2 + 1
+        num_d = (seg + 1) // 2
+        s_xc = 0
+        d_xc = wire_pitch
+
+        # get gate wires
+        g_pitch = 2 * sd_pitch
+        if g_on_s:
+            g_xc = 0
+            num_g = fg // 2 + 1
+        else:
+            g_xc = sd_pitch
+            num_g = (fg + 1) // 2
+
+        # draw device
+        builder = LayoutInfoBuilder()
+        od_y = self._add_mos_active(builder, row_info, 0, fg, w)
+
+        # draw gate connection
+        self._draw_g_conn(builder, sep_g, g_xc, po_y_gate, fg, g_pitch, g_on_s)
+
+        # draw drain/source connections
+        d0_info = self.get_conn_info(0, False)
+        d1_info = self.get_conn_info(1, False)
+        md_yl, md_yh, num_vc = self._get_conn_params(d0_info, od_y[0], od_y[1])
+        num_v0 = self._get_conn_params(d1_info, md_yl, md_yh)[2]
+        md_y = (md_yl, md_yh)
+        self._draw_ds_conn(builder, d0_info, d1_info, od_y, md_y, num_vc, num_v0,
+                           d_xc, num_d, conn_pitch)
+        self._draw_ds_conn(builder, d0_info, d1_info, od_y, md_y, num_vc, num_v0,
+                           s_xc, num_s, conn_pitch)
+
+        if export_mid:
+            m_xc = sd_pitch
+            num_m = fg + 1 - num_s - num_d
+            m_info = (m_xc, num_m, wire_pitch)
+            self._draw_ds_conn(builder, d0_info, d1_info, od_y, md_y, num_vc, num_v0,
+                               m_xc, num_m, wire_pitch)
+        else:
+            m_info = None
+
+        bbox = BBox(0, 0, fg * sd_pitch, height)
+
+        edge_info = MOSEdgeInfo(mos_type=row_type, imp_y=imp_y, has_od=True)
+        be = BlkExtInfo(row_type, row_info.threshold, False, ImmutableList([(fg, row_type)]),
+                        ImmutableSortedDict())
+        return MOSLayInfo(builder.get_info(bbox), edge_info, edge_info, be, be,
+                          g_info=(g_xc, num_g, g_pitch), d_info=(d_xc, num_d, conn_pitch),
+                          s_info=(s_xc, num_s, conn_pitch), m_info=m_info,
+                          shorted_ports=ImmutableList([MOSPortType.G]))
+
+    def _draw_g_conn(self, builder: LayoutInfoBuilder, sep_g: bool, g_xc: int,
+                     po_y_gate: Tuple[int, int], fg: int, conn_pitch: int, g_on_s: bool) -> None:
+        lch = self.lch
+        sd_pitch = self.sd_pitch
+        #breakpoint()
+        mconf = self.mos_config
+        npc_w: int = mconf['npc_w']
+        npc_h: int = mconf['npc_h']
+        npc_w2 = npc_w // 2
+        npc_h2 = npc_h // 2
+
+        g0_info = self.get_conn_info(0, True)
+        g1_info = self.get_conn_info(1, True)
+
+        po_lp = ('poly', 'drawing')
+        po_conn_w = sd_pitch + lch
+        po_xl_gate = g_xc - po_conn_w // 2
+
+        if g_on_s:
+            g_xc = 0
+            num_g = fg // 2 + 1
+            po_xl_even = g_xc
+            po_xh_even = g_xc + sd_pitch // 2 + lch // 2
+            po_xl_odd = sd_pitch + sd_pitch // 2 - lch // 2
+            po_xh_odd = 2 * sd_pitch
+        else:
+            g_xc = sd_pitch
+            num_g = (fg + 1) // 2
+            po_xl_even = sd_pitch // 2 - lch // 2
+            po_xh_even = sd_pitch
+            po_xl_odd = sd_pitch
+            po_xh_odd = sd_pitch + sd_pitch // 2 + lch // 2
+
+        # builder.add_rect_arr(po_lp, BBox(po_xl_gate, po_y_gate[0], po_xl_gate + po_conn_w,
+                                         # po_y_gate[1]), nx=num_g, spx=conn_pitch)
+        builder.add_rect_arr(po_lp, BBox(po_xl_even, po_y_gate[0], po_xh_even, po_y_gate[1]),
+                             nx=(fg - (fg // 2)), spx=conn_pitch)
+        builder.add_rect_arr(po_lp, BBox(po_xl_odd, po_y_gate[0], po_xh_odd, po_y_gate[1]),
+                             nx=(fg // 2), spx=conn_pitch)
+
+        po_yc_gate = (po_y_gate[0] + po_y_gate[1]) // 2
+        po_h_gate = po_y_gate[1] - po_y_gate[0]
+        builder.add_via(g0_info.get_via_info('PYL1_C', g_xc, po_yc_gate, po_h_gate,
+                                             ortho=False, num=1, nx=num_g, spx=conn_pitch))
+        # poly via draws npc layer wrong
+        npc_box = BBox(g_xc - npc_w2, po_yc_gate - npc_h2, g_xc + npc_w2, po_yc_gate + npc_h2)
+        builder.add_rect_arr(('npc', 'drawing'), npc_box, nx=num_g, spx=conn_pitch)
+
+        mp_h = g0_info.w
+        mp_w_min = g0_info.len_min
+        mp_lp = ('li1', 'drawing')
+        mp_yl = po_yc_gate - mp_h // 2
+        mp_yh = mp_yl + mp_h
+        if sep_g:
+            mp_xl = g_xc - mp_w_min // 2
+            builder.add_rect_arr(mp_lp, BBox(mp_xl, mp_yl, mp_xl + mp_w_min, mp_yh),
+                                 nx=num_g, spx=conn_pitch)
+        else:
+            mp_dx = g0_info.via_w # felicia - // 2 + g0_info.via_top_enc
+                                  # for licon.5
+            mp_xl = g_xc - mp_dx
+            mp_xh = g_xc + (num_g - 1) * conn_pitch + mp_dx
+            builder.add_rect_arr(mp_lp, BBox(mp_xl, mp_yl, mp_xh, mp_yh))
+
+        # connect MP to M1
+        builder.add_via(g1_info.get_via_info('L1M1_C', g_xc, po_yc_gate, mp_h, ortho=True,
+                                             num=1, nx=num_g, spx=conn_pitch))
+
+    @staticmethod
+    def _draw_ds_conn(builder: LayoutInfoBuilder, d0_info: ConnInfo, d1_info: ConnInfo,
+                      od_y: Tuple[int, int], md_y: Tuple[int, int], num_vc: int, num_v0: int,
+                      xc: int, nx: int, spx: int) -> None:
+        # connect to MD
+        md_w = d0_info.w
+        vc_w = d0_info.via_w
+        vc_h = d0_info.via_h
+        vc_sp = d0_info.via_sp
+        vc_p = vc_w + vc_sp
+        vc_w2 = vc_w // 2
+        vc_h2 = vc_h // 2
+        md_w2 = md_w // 2
+
+        od_yc = (od_y[0] + od_y[1]) // 2
+        vc_h_arr = num_vc * vc_p - vc_sp
+        vc_yc_bot = od_yc + (vc_h - vc_h_arr) // 2
+        vc_box = BBox(xc - vc_w2, vc_yc_bot - vc_h2, xc + vc_w2, vc_yc_bot + vc_h2)
+        md_box = BBox(xc - md_w2, md_y[0], xc + md_w2, md_y[1])
+        builder.add_rect_arr(('licon1', 'drawing'), vc_box, nx=nx, spx=spx, ny=num_vc, spy=vc_p)
+        builder.add_rect_arr(('li1', 'drawing'), md_box, nx=nx, spx=spx)
+        # connect to M1
+        builder.add_via(d1_info.get_via_info('L1M1_C', xc, od_yc, md_w, ortho=False,
+                                             num=num_v0, nx=nx, spx=spx))
+
+    def get_mos_abut_info(self, row_info: MOSRowInfo, edgel: MOSEdgeInfo, edger: MOSEdgeInfo
+                          ) -> LayoutInfo:
+        raise ValueError('This method is not supported in this technology.')
+
+    def get_mos_tap_info(self, row_info: MOSRowInfo, conn_layer: int, seg: int,
+                         options: Param) -> MOSLayInfo:
+        assert conn_layer == 1, 'currently only work for conn_layer = 1'
+        #print(row_info)
+        row_type = row_info.row_type
+
+        guard_ring: bool = options.get('guard_ring', row_info.guard_ring)
+        if guard_ring:
+            sub_type: MOSType = options.get('sub_type', row_type.sub_type)
+        else:
+            #print(row_type.sub_type)
+            sub_type: MOSType = row_type.sub_type
+
+        sd_pitch = self.sd_pitch
+
+        w = row_info.sub_width
+        height = row_info.height
+        threshold = row_info.threshold
+        imp_y: Tuple[int, int] = row_info['imp_y']
+
+        # draw device
+        builder = LayoutInfoBuilder()
+        #draws diffusion and tap
+        #if (row_type is MOSType.nch):
+        od_y = self._add_mos_active(builder, row_info, 0, seg, w, is_sub=True)
+        #print(row_info)
+        #else:
+        #    od_y = (193, 303)
+        # draw drain/source connections
+        d0_info = self.get_conn_info(0, False)
+        d1_info = self.get_conn_info(1, False)
+        md_yl, md_yh, num_vc = self._get_conn_params(d0_info, od_y[0], od_y[1])
+        num_v0 = self._get_conn_params(d1_info, md_yl, md_yh)[2]
+        md_y = (md_yl, md_yh)
+
+        #draws in vias connecting tap cell to metal 1
+        self._draw_ds_conn(builder, d0_info, d1_info, od_y, md_y, num_vc, num_v0,
+                           0, seg + 1, sd_pitch)
+
+        # draw base
+        # add extra imp)od_encx for ntap and ptap
+        imp_od_encx: int = self.mos_config['imp_od_encx']
+        bbox = BBox(0-2*imp_od_encx, 0, seg * sd_pitch + 2*imp_od_encx, height)
+        add_base_mos(builder, sub_type, threshold, imp_y, bbox, is_sub=True)
+        
+        edge_info = MOSEdgeInfo(mos_type=sub_type, imp_y=imp_y, has_od=True)
+        be = BlkExtInfo(row_type, row_info.threshold, guard_ring, ImmutableList([(seg, sub_type)]),
+                        ImmutableSortedDict())
+        wire_info = (0, seg + 1, sd_pitch)
+        return MOSLayInfo(builder.get_info(bbox), edge_info, edge_info, be, be,
+                          g_info=wire_info, d_info=wire_info, s_info=wire_info,
+                          shorted_ports=ImmutableList())
+
+    def get_mos_space_info(self, row_info: MOSRowInfo, num_cols: int, left_info: MOSEdgeInfo,
+                           right_info: MOSEdgeInfo) -> MOSLayInfo:
+        lch = self.lch
+        sd_pitch = self.sd_pitch
+        od_po_extx = self.od_po_extx
+
+        imp_od_encx: int = self.mos_config['imp_od_encx']
+
+        row_type = row_info.row_type
+        threshold = row_info.threshold
+        imp_y: Tuple[int, int] = row_info['imp_y']
+
+        blk_xh = num_cols * sd_pitch
+        blk_yh = row_info.height
+        bbox = BBox(0, 0, blk_xh, blk_yh)
+
+        # get information from edge information dictionary
+        # if MOSEdgeInfo evaluates to False, that means this space block is on the boundary.
+        if left_info:
+            typel: MOSType = left_info['mos_type']
+            if right_info:
+                typer: MOSType = right_info['mos_type']
+            else:
+                typer = typel
+        elif right_info:
+            typer: MOSType = right_info['mos_type']
+            typel = typer
+        else:
+            typel = typer = row_type
+
+        builder = LayoutInfoBuilder()
+
+        # find dummy OD columns
+        od_extx = od_po_extx - (sd_pitch - lch) // 2
+        delta_implant = od_extx + imp_od_encx
+        delta_implant = -(-delta_implant // sd_pitch) * sd_pitch
+        if typel == typer:
+            # same implant on left and right
+            be = BlkExtInfo(row_type, threshold, False, ImmutableList([(num_cols, typel)]),
+                            ImmutableSortedDict())
+            add_base(builder, typel, threshold, imp_y, bbox)
+            edger = edgel = MOSEdgeInfo(mos_type=typel, imp_y=imp_y, has_od=False)
+        else:
+            # find implant split coordinate
+            # split closer to the side with the following priority:
+            # 1. is a opposite tap (i.e. ntap in nmos row)
+            # 2. is a substrate tap (i.e. ptap in nmos row)
+            if typel is not row_type:
+                if delta_implant > blk_xh:
+                    raise ODImplantEnclosureError('Insufficient space to satisfy '
+                                                  'implant-OD horizontal enclosure.')
+                add_base(builder, typel, threshold, imp_y, BBox(0, 0, delta_implant, blk_yh))
+                xl = delta_implant
+                fgl = delta_implant // sd_pitch
+            else:
+                xl = 0
+                fgl = 0
+
+            if typer is not row_type:
+                xr = blk_xh - delta_implant
+                if xr < xl:
+                    raise ODImplantEnclosureError('Insufficient space to satisfy '
+                                                  'implant-OD horizontal enclosure.')
+                add_base(builder, typer, threshold, imp_y, BBox(xr, 0, blk_xh, blk_yh))
+                fgr = delta_implant // sd_pitch
+            else:
+                xr = blk_xh
+                fgr = 0
+
+            if xr > xl:
+                # draw implant in middle region
+                fgm = (xr - xl) // sd_pitch
+                if typel is row_type:
+                    fgl += fgm
+                    add_base(builder, typel, threshold, imp_y, BBox(xl, 0, xr, blk_yh))
+                else:
+                    fgr += fgm
+                    add_base(builder, typer, threshold, imp_y, BBox(xl, 0, xr, blk_yh))
+
+            fg_dev_list = []
+            if fgl > 0:
+                fg_dev_list.append((fgl, typel))
+            if fgr > 0:
+                fg_dev_list.append((fgr, typer))
+
+            be = BlkExtInfo(row_type, threshold, False, ImmutableList(fg_dev_list),
+                            ImmutableSortedDict())
+            edgel = MOSEdgeInfo(mos_type=typel, imp_y=imp_y, has_od=False)
+            edger = edgel.copy_with(mos_type=typer)
+
+        wire_info = (0, 0, 0)
+        return MOSLayInfo(builder.get_info(bbox), edgel, edger, be, be, g_info=wire_info,
+                          d_info=wire_info, s_info=wire_info, shorted_ports=ImmutableList())
+
+    def get_mos_ext_info(self, num_cols: int, blk_h: int, bot_einfo: RowExtInfo,
+                         top_einfo: RowExtInfo, gr_info: Tuple[int, int]) -> ExtEndLayInfo:
+        raise ValueError('Not implemented.')
+
+    def get_mos_ext_gr_info(self, num_cols: int, edge_cols: int, blk_h: int, bot_einfo: RowExtInfo,
+                            top_einfo: RowExtInfo, sub_type: MOSType, einfo: MOSEdgeInfo
+                            ) -> ExtEndLayInfo:
+        raise ValueError('Not implemented.')
+
+    def get_ext_geometries(self, re_bot: RowExtInfo, re_top: RowExtInfo,
+                           be_bot: ImmutableList[BlkExtInfo], be_top: ImmutableList[BlkExtInfo],
+                           cut_mode: MOSCutMode, bot_exty: int, top_exty: int,
+                           dx: int, dy: int, w_edge: int) -> LayoutInfo:
+        sd_pitch = self.sd_pitch
+        well_w_edge = self.well_w_edge
+
+        ymid = dy + bot_exty
+        ytop = ymid + top_exty
+
+        # draw extensions
+        builder = LayoutInfoBuilder()
+        if bot_exty > 0:
+            xcur = dx
+            for info in be_bot:
+                xcur = _add_blk_ext_info(sd_pitch, builder, info, xcur, dy, ymid)
+            w_tot = xcur + w_edge
+            _add_blk_ext_edge(sd_pitch, builder, be_bot[0], dy, ymid, w_edge, 0, well_w_edge)
+            _add_blk_ext_edge(sd_pitch, builder, be_bot[-1], dy, ymid, w_edge, w_tot, well_w_edge)
+        if top_exty > 0:
+            xcur = dx
+            for info in be_top:
+                xcur = _add_blk_ext_info(sd_pitch, builder, info, xcur, ymid, ytop)
+            w_tot = xcur + w_edge
+            _add_blk_ext_edge(sd_pitch, builder, be_top[0], ymid, ytop, w_edge, 0, well_w_edge)
+            _add_blk_ext_edge(sd_pitch, builder, be_top[-1], ymid, ytop, w_edge, w_tot, well_w_edge)
+
+        # Note: bbox not used, just pass in some value.
+        return builder.get_info(BBox(0, 0, 0, 0))
+
+    def get_mos_end_info(self, blk_h: int, num_cols: int, einfo: RowExtInfo) -> ExtEndLayInfo:
+        blk_rect = BBox(0, 0, num_cols * self.sd_pitch, blk_h)
+        builder = LayoutInfoBuilder()
+        row_type = einfo.row_type
+        threshold = einfo.threshold
+        imp_y = (blk_rect.yl, blk_rect.yl)
+        add_base(builder, row_type, threshold, imp_y, blk_rect)
+        edge_info = MOSEdgeInfo(row_type=row_type, imp_y=imp_y, threshold=threshold)
+        return ExtEndLayInfo(builder.get_info(blk_rect), edge_info)
+
+    def get_mos_row_edge_info(self, blk_w: int, rinfo: MOSRowInfo, einfo: MOSEdgeInfo
+                              ) -> LayoutInfo:
+        blk_h = rinfo.height
+        mos_type: MOSType = einfo['mos_type']
+        return self._edge_info_helper(blk_w, blk_h, mos_type, rinfo.threshold, rinfo['imp_y'])
+
+    def get_mos_ext_edge_info(self, blk_w: int, einfo: MOSEdgeInfo) -> LayoutInfo:
+        row_type: MOSType = einfo['row_type']
+        threshold: str = einfo['threshold']
+        blk_h: int = einfo['blk_h']
+        imp_y: Tuple[int, int] = einfo['imp_y']
+        return self._edge_info_helper(blk_w, blk_h, row_type, threshold, imp_y)
+
+    def get_mos_corner_info(self, blk_w: int, blk_h: int, einfo: MOSEdgeInfo) -> CornerLayInfo:
+        lch = self.lch
+        sd_pitch = self.sd_pitch
+        well_w_edge = self.well_w_edge
+
+        row_type: MOSType = einfo['row_type']
+        threshold: str = einfo['threshold']
+
+        well_yl = 0
+        blk_rect = BBox(blk_w - sd_pitch, well_yl, blk_w, blk_h)
+        builder = LayoutInfoBuilder()
+
+        well_xl = blk_w - well_w_edge
+        add_base(builder, row_type, threshold, (blk_rect.yl, blk_rect.yl), blk_rect,
+                 well_x=(well_xl, blk_w))
+
+        x_margins = dict(well=well_xl)
+        y_margins = dict(well=well_yl)
+        edgel = ImmutableSortedDict(dict(dev_type=DeviceType.MOS, lch=lch, margins=x_margins))
+        edgeb = ImmutableSortedDict(dict(dev_type=DeviceType.MOS, lch=lch, margins=y_margins))
+        return CornerLayInfo(builder.get_info(blk_rect), (0, 0), edgel, edgeb)
+
+    @staticmethod
+    def _get_conn_params(info: ConnInfo, bot_cl: int, bot_ch: int) -> Tuple[int, int, int]:
+        v_dim = info.via_h if info.orient is Orient2D.y else info.via_w
+        v_sp = info.via_sp
+        v_bot_enc = info.via_bot_enc
+        v_top_enc = info.via_top_enc
+        v_pitch = v_dim + v_sp
+
+        v_num = (bot_ch - bot_cl - v_bot_enc * 2 + v_sp) // v_pitch
+        v_dim_arr = v_num * v_pitch - v_sp
+        top_dim = max(info.len_min, v_dim_arr + 2 * v_top_enc)
+        top_cl = (bot_cl + bot_ch - top_dim) // 2
+        top_ch = top_cl + top_dim
+        return top_cl, top_ch, v_num
+
+    def _get_od_sep_col(self, spx: int) -> int:
+        lch = self.lch
+        sd_pitch = self.sd_pitch
+        od_po_extx = self.od_po_extx
+
+        return -(-(spx + lch + 2 * od_po_extx) // sd_pitch) - 1
+
+    def _add_mos_active(self, builder: LayoutInfoBuilder, row_info: MOSRowInfo,
+                        start: int, stop: int, w: int, is_sub: bool = False
+                        ) -> Tuple[int, int]:
+        po_yl: int = row_info['po_y'][0]
+        od_yl: int = row_info['od_y'][0]
+
+        lch = self.lch
+        sd_pitch = self.sd_pitch
+        od_po_extx = self.od_po_extx
+
+        mconf = self.mos_config
+        po_h_min: int = mconf['po_h_min']
+        po_od_exty: int = mconf['po_od_exty']
+
+        # draw PO
+        od_yh = od_yl + w
+        if is_sub:
+            od_lp = ('tap', 'drawing')
+        else:
+            od_lp = ('diff', 'drawing')
+            po_y = (po_yl, max(po_yl + po_h_min, od_yh + po_od_exty))
+            self._add_po_array(builder, po_y, start, stop)
+
+        # draw OD
+        po_xl = (sd_pitch - lch) // 2
+        od_sd_dx = od_po_extx - po_xl
+        od_xl = start * sd_pitch - od_sd_dx
+        od_xh = stop * sd_pitch + od_sd_dx
+        builder.add_rect_arr(od_lp, BBox(od_xl, od_yl, od_xh, od_yh))
+
+        # draw base
+        imp_od_encx: int = self.mos_config['imp_od_encx']
+        bbox = BBox(od_xl-imp_od_encx, 0, od_xh+imp_od_encx, row_info.height)
+        
+        #if drawing tap cells, flip the implant type so its opposite of row
+        if is_sub:
+            if (row_info.row_type is MOSType.nch):
+                add_base_mos(builder, MOSType.pch, row_info.threshold, row_info['imp_y'], bbox, is_sub=True)
+            elif (row_info.row_type is MOSType.pch):
+                add_base_mos(builder, MOSType.nch, row_info.threshold, row_info['imp_y'], bbox, is_sub=True)
+        else:    
+            add_base_mos(builder, row_info.row_type, row_info.threshold, row_info['imp_y'], bbox)
+
+        return od_yl, od_yh
+
+    def _add_po_array(self, builder: LayoutInfoBuilder, po_y: Tuple[int, int], start: int,
+                      stop: int) -> None:
+        lch = self.lch
+        sd_pitch = self.sd_pitch
+
+        po_x0 = (sd_pitch - lch) // 2 + sd_pitch * start
+        fg = stop - start
+        if po_y[1] > po_y[0]:
+            builder.add_rect_arr(('poly', 'drawing'), BBox(po_x0, po_y[0], po_x0 + lch, po_y[1]),
+                                 nx=fg, spx=sd_pitch)
+
+    def _edge_info_helper(self, blk_w: int, blk_h: int, row_type: MOSType, threshold: str,
+                          imp_y: Tuple[int, int]) -> LayoutInfo:
+        sd_pitch = self.sd_pitch
+        well_w_edge = self.well_w_edge
+
+        blk_rect = BBox(blk_w - sd_pitch, 0, blk_w, blk_h)
+        builder = LayoutInfoBuilder()
+        add_base(builder, row_type, threshold, imp_y, blk_rect, well_x=(blk_w - well_w_edge, blk_w))
+        return builder.get_info(blk_rect)
+
+
+def _get_extend_bot_implant(bot_info: RowExtInfo, top_info: RowExtInfo) -> bool:
+    # prefer n implant over p implant, prefer transistor over substrate
+    bot_row_type = bot_info.row_type
+    top_row_type = top_info.row_type
+    if bot_row_type.is_pwell:
+        return True
+    if top_row_type.is_pwell:
+        return False
+    if not bot_row_type.is_substrate and top_row_type.is_substrate:
+        return True
+    if not top_row_type.is_substrate and bot_row_type.is_substrate:
+        return False
+    return bot_info.threshold < top_info.threshold
+
+
+def _add_blk_ext_edge(sd_pitch: int, builder: LayoutInfoBuilder, binfo: BlkExtInfo,
+                      yl: int, yh: int, blk_w: int, w_tot: int, well_w_edge: int) -> None:
+    threshold = binfo.threshold
+
+    if w_tot == 0:
+        blk_rect = BBox(blk_w - sd_pitch, yl, blk_w, yh)
+        mos_idx = 0
+        well_x = (blk_w - well_w_edge, blk_w)
+    else:
+        xl = w_tot - blk_w
+        blk_rect = BBox(xl, yl, xl + sd_pitch, yh)
+        mos_idx = -1
+        well_x = (xl, xl + well_w_edge)
+
+    add_base(builder, binfo.fg_dev[mos_idx][1], threshold, (blk_rect.yl, blk_rect.yl),
+             blk_rect, well_x=well_x)
+
+
+def _add_blk_ext_info(sd_pitch: int, builder: LayoutInfoBuilder,
+                      info: BlkExtInfo, xl: int, yl: int, yh: int) -> int:
+    threshold = info.threshold
+
+    # add base
+    xcur = xl
+    for fg, dev in info.fg_dev:
+        xh = xcur + fg * sd_pitch
+        add_base(builder, dev, threshold, (yl, yl), BBox(xcur, yl, xh, yh))
+        xcur = xh
+
+    return xcur
diff --git a/src/templates_skywater130/tech.py b/src/templates_skywater130/tech.py
new file mode 100755
index 0000000..b46db94
--- /dev/null
+++ b/src/templates_skywater130/tech.py
@@ -0,0 +1,162 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2019 Blue Cheetah Analog Design Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from typing import Tuple, Optional, Mapping
+
+from pybag.core import BBox
+
+from bag.util.immutable import Param
+from bag.layout.tech import TechInfo
+from bag.layout.template import TemplateBase
+
+from xbase.layout.enum import DeviceType
+
+from . import config as _config
+from . import config_fname as _config_fname
+from .mos.tech import MOSTechSkywater130
+# from .fill.tech import FillTechSkywater130
+# from .res.tech import ResTechSkywater130
+
+
+class TechInfoSkywater130(TechInfo):
+    def __init__(self, process_params):
+        TechInfo.__init__(self, process_params, _config, _config_fname)
+
+        self.register_device_tech('mos', MOSTechSkywater130)
+        # self.register_device_tech('fill', FillTechCDSFFMPT)
+        # self.register_device_tech('res', ResTechCDSFFMPT)
+
+    def get_margin(self, is_vertical: bool, edge1: Param, edge2: Optional[Param]) -> int:
+        if edge2 is None:
+            dev_type = edge1['dev_type']
+            if dev_type is DeviceType.MOS:
+                margins: Mapping[str, int] = edge1['margins']
+                table: Mapping[str, Tuple[int, int]] = self.config['margins']
+                max_sp = 0
+                for name, val in margins.items():
+                    sp_tot = -(-table[name][is_vertical] // 2)
+                    max_sp = max(sp_tot - val, max_sp)
+                return max_sp
+            else:
+                # TODO: implement this
+                raise ValueError('Not implemented yet, see developer.')
+        else:
+            # TODO: implement this
+            raise ValueError('Not implemented yet, see developer.')
+
+    def add_cell_boundary(self, template: TemplateBase, box: BBox) -> None:
+        if box.is_physical():
+            pt_list = [(box.xl, box.yl), (box.xl, box.yh), (box.xh, box.yh), (box.xh, box.yl)]
+            # template.add_boundary(BoundaryType.PR, pt_list)
+
+    def draw_device_blockage(self, template: TemplateBase) -> None:
+        pass
+
+    def get_metal_em_specs(self, layer: str, purpose: str, w: int, length: int = -1,
+                           vertical: bool = False, dc_temp: int = -1000, rms_dt: int = -1000
+                           ) -> Tuple[float, float, float]:
+        idc = self._get_metal_idc(layer, purpose, w, length, vertical, dc_temp)
+        irms = self._get_metal_irms(layer, purpose, w, rms_dt)
+        ipeak = float('inf')
+        return idc, irms, ipeak
+
+    def get_via_em_specs(self, layer_dir: int, layer: str, purpose: str, adj_layer: str,
+                         adj_purpose: str, cut_w: int, cut_h: int, m_w: int = -1, m_l: int = -1,
+                         adj_m_w: int = -1, adj_m_l: int = -1, array: bool = False,
+                         dc_temp: int = -1000, rms_dt: int = -1000) -> Tuple[float, float, float]:
+        def_purpose = self.default_purpose
+        purpose = purpose or def_purpose
+        adj_purpose = adj_purpose or def_purpose
+
+        lay_vec = [None, None]
+        dim_vec = [None, None]
+
+        lay_vec[layer_dir] = (layer, purpose)
+        lay_vec[1 - layer_dir] = (adj_layer, adj_purpose)
+        dim_vec[layer_dir] = (m_w, m_l)
+        dim_vec[1 - layer_dir] = (adj_m_w, adj_m_l)
+
+        idc = self._get_via_idc(lay_vec[0], lay_vec[1], cut_w, cut_h, dim_vec[0], dim_vec[1],
+                                array, dc_temp)
+        # via do not have AC current specs
+        irms = float('inf')
+        ipeak = float('inf')
+        return idc, irms, ipeak
+
+    def get_res_em_specs(self, res_type: str, w: int, *, length: int = -1,
+                         dc_temp: int = -1000, rms_dt: int = -1000) -> Tuple[float, float, float]:
+        dc_temp = self.get_dc_temp(dc_temp)
+        rms_dt = self.get_rms_dt(rms_dt)
+
+        idc_scale = self.get_idc_scale_factor('', '', dc_temp, is_res=True)
+        idc = 1.0e-3 * w * idc_scale
+
+        irms = 1e-3 * (0.02 * rms_dt * w * (w + 0.5)) ** 0.5
+
+        ipeak = 5e-3 * 2 * w
+        return idc, irms, ipeak
+
+    # noinspection PyUnusedLocal,PyMethodMayBeStatic
+    def _get_metal_idc_factor(self, layer: str, purpose: str, w: int, length: int):
+        return 1
+
+    def _get_metal_idc(self, layer: str, purpose: str, w: int, length: int,
+                       vertical: bool, dc_temp: int) -> float:
+        if vertical:
+            raise NotImplementedError('Vertical DC current not supported yet')
+
+        inorm, woff = 1.0, 0.0
+        idc = inorm * self._get_metal_idc_factor(layer, purpose, w, length) * (w - woff)
+        return self.get_idc_scale_factor(layer, purpose, self.get_dc_temp(dc_temp)) * idc * 1e-3
+
+    # noinspection PyUnusedLocal
+    def _get_metal_irms(self, layer: str, purpose: str, w: int, rms_dt: int):
+        b = 0.0443
+        k, wo, a = 6.0, 0.0, 0.2
+
+        irms_ma = (k * self.get_rms_dt(rms_dt) * (w - wo)**2 * (w - wo + a) / (w - wo + b))**0.5
+        return irms_ma * 1e-3
+
+    # noinspection PyUnusedLocal
+    def _get_via_idc(self, bot_lp: Tuple[str, str], top_lp: Tuple[str, str], cut_w: int,
+                     cut_h: int, bot_dim: Tuple[int, int], top_dim: Tuple[int, int],
+                     array: bool, dc_temp: int) -> float:
+        if bot_dim[0] > 0:
+            bf = self._get_metal_idc_factor(bot_lp[0], bot_lp[1], bot_dim[0], bot_dim[1])
+        else:
+            bf = 1.0
+
+        if top_dim[0] > 0:
+            tf = self._get_metal_idc_factor(top_lp[0], top_lp[1], top_dim[0], top_dim[1])
+        else:
+            tf = 1.0
+
+        factor = min(bf, tf)
+        via_id = self.config['via_id'][(bot_lp, top_lp)]
+
+        if via_id in ('M1_LiPo', 'M1_LiAct', 'M2_M1', 'M3_M2', 'M4_M3'):
+            if cut_w == cut_h == 64:
+                idc = 0.1
+            elif cut_w != cut_h:
+                idc = 0.2
+            else:
+                # we do not support 2X square via, as it has large
+                # spacing rule to square/rectangle vias.
+                raise ValueError('Unsupported via w/h: ({},{})'.format(cut_w, cut_h))
+        else:
+            idc = 0.4
+
+        temp = self.get_dc_temp(dc_temp)
+        return factor * self.get_idc_scale_factor(bot_lp[0], bot_lp[1], temp) * idc * 1e-3
diff --git a/src/templates_skywater130/util.py b/src/templates_skywater130/util.py
new file mode 100755
index 0000000..d541e3f
--- /dev/null
+++ b/src/templates_skywater130/util.py
@@ -0,0 +1,108 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2019 Blue Cheetah Analog Design Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from typing import Optional, Tuple
+
+from pybag.core import BBox
+
+from xbase.layout.enum import MOSType
+from xbase.layout.data import LayoutInfoBuilder
+
+
+def add_base(builder: LayoutInfoBuilder, row_type: MOSType, threshold: str, imp_y: Tuple[int, int],
+             rect: BBox, well_x: Optional[Tuple[int, int]] = None) -> None:
+    # draws nwell, n+ implant (ndsm) and p+ implant (pdsm)
+    # for non mos devices (corners, edges, etc)
+
+    pimp_lp = ('psdm', 'drawing')
+    if rect.is_physical():
+        if not row_type.is_pwell:
+            well_lp = ('nwell', 'drawing')
+            if well_x is None:
+                builder.add_rect_arr(well_lp, rect)
+            else:
+                builder.add_rect_arr(well_lp, BBox(well_x[0], rect.yl, well_x[1], rect.yh))
+            
+        thres_lp = _get_thres_lp(row_type, threshold)
+        if thres_lp[0] != '':
+            builder.add_rect_arr(thres_lp, rect)
+    
+def add_base_mos(builder: LayoutInfoBuilder, row_type: MOSType, threshold: str, imp_y: Tuple[int, int],
+             rect: BBox, well_x: Optional[Tuple[int, int]] = None, is_sub: bool = False) -> None:
+    # new func draws nwell, n+ implant (ndsm) and p+ implant (pdsm)
+    
+    pimp_lp = ('psdm', 'drawing')
+
+    if rect.is_physical():
+        # only draw nwells if not a tap cell and pch, or is tap cell and nch
+        if ((not row_type.is_pwell) and (not is_sub)) \
+                or (is_sub and (row_type is MOSType.nch or row_type is MOSType.ntap) ):
+            well_lp = ('nwell', 'drawing')
+            if well_x is None:
+                builder.add_rect_arr(well_lp, rect)
+            else:
+                builder.add_rect_arr(well_lp, BBox(well_x[0], rect.yl, well_x[1], rect.yh))
+            
+        #draw the respective implant called    
+        if (row_type is MOSType.nch):
+            builder.add_rect_arr(('nsdm', 'drawing'),  BBox(rect.xl, imp_y[0], rect.xh, imp_y[1]))
+        elif (row_type is MOSType.pch):
+            builder.add_rect_arr(('psdm', 'drawing'),  BBox(rect.xl, imp_y[0], rect.xh, imp_y[1]))
+        elif (row_type is MOSType.ntap):
+            builder.add_rect_arr(('nsdm', 'drawing'),  BBox(rect.xl, imp_y[0], rect.xh, imp_y[1]))
+        elif (row_type is MOSType.ptap):
+            builder.add_rect_arr(('psdm', 'drawing'),  BBox(rect.xl, imp_y[0], rect.xh, imp_y[1]))
+
+        thres_lp = _get_thres_lp(row_type, threshold)
+        if thres_lp[0] != '':
+            builder.add_rect_arr(thres_lp, rect)
+
+
+def get_arr_edge_dim(arr_dim: int, edge_min_dim: int, blk_pitch: int, edge_pitch: int = 1,
+                     edge_offset: int = 0) -> int:
+    dim_tot = -(-(arr_dim + 2 * edge_min_dim) // blk_pitch) * blk_pitch
+    dim2 = dim_tot - arr_dim
+    if dim2 & 1 == 1:
+        if blk_pitch & 1 == 1:
+            dim2 += blk_pitch
+        else:
+            raise RuntimeError(f'Parity Error: impossible to center ArrayBase with '
+                               f'arr_dim={arr_dim}, blk_pitch={blk_pitch}, '
+                               f'and edge_min_dim={edge_min_dim}.')
+
+    ans = dim2 // 2
+    if (ans - edge_offset) % edge_pitch != 0:
+        # precondition: we know that edge_pitch divides blk_pitch
+        blk_pitch2 = blk_pitch // 2
+        if blk_pitch & 1 != 0 or (ans + blk_pitch2 - edge_offset) % edge_pitch != 0:
+            raise RuntimeError(f'Parity Error: impossible to center ArrayBase with '
+                               f'arr_dim={arr_dim}, blk_pitch={blk_pitch}, '
+                               f'edge_min_dim={edge_min_dim}, edge_pitch={edge_pitch}, '
+                               f'and edge_offset={edge_offset}')
+        ans += blk_pitch2
+
+    return ans
+
+
+def _get_thres_lp(row_type: MOSType, threshold: str) -> Tuple[str, str]:
+    if threshold == 'standard':
+        return '', ''
+    if threshold == 'lvt':
+        return 'lvtn', 'drawing'
+    if threshold == 'hvt':
+        if row_type.is_n_plus:
+            raise ValueError('Threshold hvt not supported for nmos')
+        return 'hvtp', 'drawing'
+    raise ValueError(f'unknown threshold: {threshold}')
diff --git a/tech_config.yaml b/tech_config.yaml
new file mode 100644
index 0000000..1f7b5a2
--- /dev/null
+++ b/tech_config.yaml
@@ -0,0 +1,71 @@
+# Copyright 2019-2021 SkyWater PDK Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# This code is *alternatively* available under a BSD-3-Clause license, see
+# details in the README.md at the top level and the license text at
+# https://github.com/google/skywater-pdk-libs-sky130_bag3_pr/blob/master/LICENSE.alternative
+#
+# SPDX-License-Identifier: BSD-3-Clause OR Apache 2.0
+
+# the Technology class.
+class: "templates_skywater130.tech.TechInfoSkywater130"
+
+# default EM spec calculation settings
+em:
+  # DC current temperature
+  dc_temp: 70
+  # RMS current allowable temperature increase
+  rms_dt: 10
+
+# transistor technology parameters
+mos:
+  # the transistor width minimum resolution.
+  width_resolution: 1.0e-9
+  # the transistor length minimum resolution.
+  length_resolution: 1.0e-9
+
+# routing grid parameters
+routing_grid:
+  1: [y, 52,  34]
+  2: [x, 56,  70]
+  3: [y, 66,  106]
+  4: [x, 66,  60]
+  5: [y, 284, 232]
+
+# MOM cap parameters
+mom_cap:
+  standard:
+    bot_dir: x
+    info:
+      # w, sp, margin, num_ports, port_tr_w
+      1: !!python/tuple [64, 64, 120, 2, 1]
+      2: !!python/tuple [64, 64, 120, 2, 1]
+      3: !!python/tuple [64, 64, 120, 2, 1]
+      4: !!python/tuple [64, 96, 96, 1, 1]
+      5: !!python/tuple [116, 136, 136, 1, 1]
+      6: !!python/tuple [116, 136, 136, 1, 1]
+      7: !!python/tuple [138, 180, 180, 1, 1]
+      8: !!python/tuple [440, 400, 400, 1, 1]
+
+# fill parameters
+fill:
+  # sp_x, sp_y, margin_x, margin_y, density
+  1: !!python/tuple [2000, 2000, 1000, 1000, 0.2]
+  2: !!python/tuple [2000, 2000, 1000, 1000, 0.2]
+  3: !!python/tuple [2000, 2000, 1000, 1000, 0.2]
+  4: !!python/tuple [2000, 2000, 1000, 1000, 0.2]
+  5: !!python/tuple [2000, 2000, 1000, 1000, 0.2]
+  6: !!python/tuple [2000, 2000, 1000, 1000, 0.2]
+  7: !!python/tuple [2000, 2000, 1000, 1000, 0.2]
+  8: !!python/tuple [2000, 2000, 1000, 1000, 0.2]
diff --git a/workspace_setup/.bashrc b/workspace_setup/.bashrc
new file mode 100644
index 0000000..08c470c
--- /dev/null
+++ b/workspace_setup/.bashrc
@@ -0,0 +1,62 @@
+#! /usr/bin/env bash
+export PYTHONPATH=""
+
+### Setup BAG
+source .bashrc_bag
+
+export PDK_HOME=/tools/commercial/skywater/swtech130/skywater-src-nda/s8/V2.0.0
+export SW_PDK_ROOT=/tools/commercial/skywater
+export SW_IP_HOME=${SW_PDK_ROOT}/s8_ip
+export METAL_STACK="s8phirs_10r"
+
+
+# location of various tools
+export MGC_HOME=/tools/mentor/calibre/current
+export CDS_INST_DIR=/tools/cadence/ICADVM/ICADVM181
+export PVS_HOME=/tools/cadence/PVS/PVS151
+export SPECTRE_HOME=/tools/cadence/SPECTRE/SPECTRE181_ISR7
+export QRC_HOME=/tools/cadence/EXT/EXT191_ISR3
+export SRR_HOME=/tools/cadence/SRR/SRR_0618
+export CMAKE_HOME=/tools/B/ayan_biswas/programs/cmake-3.17.0-Linux-x86_64
+
+export CDSHOME=${CDS_INST_DIR}
+export MMSIM_HOME=${SPECTRE_HOME}
+
+# OA settings
+export OA_SRC_ROOT=/tools/B/ayan_biswas/programs/oa_new
+export OA_LINK_DIR=${OA_SRC_ROOT}/lib/linux_rhel70_gcc83x_64/opt
+export OA_INCLUDE_DIR=${OA_SRC_ROOT}/include
+export OA_CDS_ROOT=${CDS_INST_DIR}/oa_v22.60.s007
+export OA_PLUGIN_PATH=${OA_CDS_ROOT}/data/plugins:${OA_PLUGIN_PATH:-}
+export OA_BIT=64
+
+# PATH setup
+export PATH=${MGC_HOME}/bin:${PATH}
+export PATH=${PVS_HOME}/bin:${PATH}
+export PATH=${QRC_HOME}/bin:${PATH}
+export PATH=${CDS_INST_DIR}/tools/plot/bin:${PATH}
+export PATH=${CDS_INST_DIR}/tools/dfII/bin:${PATH}
+export PATH=${CDS_INST_DIR}/tools/bin:${PATH}
+export PATH=${MMSIM_HOME}/bin:${PATH}
+export PATH=${BAG_TOOLS_ROOT}/bin:${PATH}
+export PATH=${CMAKE_HOME}/bin:${PATH}
+export PATH=/tools/B/ayan_biswas/programs/core/bin:${PATH}
+
+# LD_LIBRARY_PATH setup
+export LD_LIBRARY_PATH=${OA_LINK_DIR}:${LD_LIBRARY_PATH}
+export LD_LIBRARY_PATH=${BAG_WORK_DIR}/cadence_libs:${LD_LIBRARY_PATH}
+export LD_LIBRARY_PATH=${SRR_HOME}/tools/lib/64bit:${LD_LIBRARY_PATH:-}
+export LD_LIBRARY_PATH=${BAG_TOOLS_ROOT}/lib:${LD_LIBRARY_PATH}
+export LD_LIBRARY_PATH=$/tools/B/ayan_biswas/programs/core/lib:${LD_LIBRARY_PATH}
+export LD_LIBRARY_PATH=$/tools/B/ayan_biswas/programs/core/lib64:${LD_LIBRARY_PATH}
+
+# Virtuoso options
+export SPECTRE_DEFAULTS=-E
+export CDS_Netlisting_Mode="Analog"
+export CDS_AUTO_64BIT=ALL
+
+# License setup
+source /tools/flexlm/flexlm.sh
+
+# pybag compiler settings
+export CMAKE_PREFIX_PATH=${BAG_TOOLS_ROOT}
diff --git a/workspace_setup/.bashrc_bag b/workspace_setup/.bashrc_bag
new file mode 100644
index 0000000..59108c6
--- /dev/null
+++ b/workspace_setup/.bashrc_bag
@@ -0,0 +1,18 @@
+#! /usr/bin/env bash
+
+export BAG_WORK_DIR=$(pwd)
+export BAG_TOOLS_ROOT=/tools/commercial/bcanalog/bag/bag3d0_rhel60_64
+export BAG_FRAMEWORK=${BAG_WORK_DIR}/BAG_framework
+export BAG_TECH_CONFIG_DIR=${BAG_WORK_DIR}/skywater130
+export BAG_TEMP_DIR=/tools/scratch/${USER}/BAGTMP
+export IPYTHONDIR=${BAG_WORK_DIR}/.ipython
+# disable hash-salting. We need stable hashing across sessions for caching purposes.
+export PYTHONHASHSEED=0
+# set program locations
+export BAG_PYTHON=${BAG_TOOLS_ROOT}/bin/python3
+
+# set location of BAG configuration file
+export BAG_CONFIG_PATH=${BAG_WORK_DIR}/bag_config.yaml
+
+# setup pybag
+export PYBAG_PYTHON=${BAG_PYTHON}
diff --git a/workspace_setup/.cdsenv b/workspace_setup/.cdsenv
new file mode 100644
index 0000000..57a9deb
--- /dev/null
+++ b/workspace_setup/.cdsenv
@@ -0,0 +1,90 @@
+license	VLSL_UseNextLicense	string	"always"
+license	ADEL_UseNextLicense	string	"always"
+license	VLSXL_UseNextLicense	string	"always"
+license	VSEL_UseNextLicense	string	"always"
+
+asimenv.startup	simulator	string	"spectre"
+; Allows you to use multibit buses in stimulus files [#in_bits<0>], [#in_bits<1>], etc
+asimenv         mappingMode     string  "oss"
+
+; have CDF term Order update whenever the symbol is updated
+auCore.misc     updateCDFtermOrder boolean t
+ihdl            maxNetNameLength   int  16000
+
+layout	stopLevel	int	32
+layout	dotsOn	boolean	t
+layout	useTrueBBox	boolean	t
+layout	xSnapSpacing	float	0.001
+layout	ySnapSpacing	float	0.001
+layout	displayPinNames	boolean	t
+
+; enable partial selection by defeault
+layout partialSelect boolean t
+
+; when move/copy/creating rectangles, automatically use the current mouse-over point.
+ui infix boolean t
+
+; set layout property dimension
+layout propEditorWidth int 500
+layout propEditorHeight int 580
+
+; set roman as default label font
+layout   labelFontStyle cyclic "roman"
+
+; disable connectivity reference dialog box
+layoutXL  lxSchematicDefaultApp  cyclic "None"
+
+; turn off via stack selection
+graphic       viaStackSelection       boolean nil
+
+; correct schematic/symbol port order automatically.
+; this makes DARPA cosim demo look good.
+schematic disablePortOrderPopup boolean t
+
+; default waveform display setup
+viva.trace lineStyle string "solid"
+viva.trace lineThickness string "thick"
+viva.rectGraph foreground string "black"
+viva.rectGraph background string "white"
+viva.axis majorGridForeground string "black"
+viva.axis minorGridForeground string "gray"
+viva.axis foreground string "black"
+viva.axis background string "white"
+viva.axis font string "Default,14,-1,5,75,0,0,0,0,0"
+viva.graphLabel font string "Default,14,-1,5,75,0,0,0,0,0"
+; viva.probe font string "Default,14,-1,5,75,0,0,0,0,0"
+; viva.traceLegend font string "Default,14,-1,5,75,0,0,0,0,0"
+
+; LSF setup parameters
+
+; default job name
+; asimenv.distributed userDefinedJobName string  "virtuoso_lsf"
+
+; use .cdsenv variables default and do not bring up job parameter form
+asimenv.distributed autoJobSubmit  boolean  t
+
+; set LSF resource string
+; asimenv.distributed selectLsfResourceString  boolean  t
+; asimenv.distributed lsfResourceString string "[ptile=4]"
+
+; set LSF queue name
+asimenv.distributed queueName  string  "normal"
+
+; use ssh for connection
+asimenv.distributed remoteShell string "ssh"
+
+; block ADE/Ocean until all jobs have finished
+asimenv.distributed block boolean  t
+
+; LSF jobs log directory
+; asimenv.distributed logsDir string "./LSF_logs"
+
+; delete job after it's complete; allows job name recycling
+; asimenv.distributed deleteJob boolean t
+
+; if you submit a job with the same name, delete old data
+; asimenv.distributed removeJobData boolean t
+
+; number of processors to use for LSF
+asimenv.distributed selectLsfNoOfProcessors boolean t
+asimenv.distributed lsfNoOfProcessors string "4"
diff --git a/workspace_setup/.cdsenv.personal b/workspace_setup/.cdsenv.personal
new file mode 100644
index 0000000..96a7d7e
--- /dev/null
+++ b/workspace_setup/.cdsenv.personal
@@ -0,0 +1,4 @@
+; set default window size and location
+; schematic symWindowBBox string "((20 20) (1900 1060))"
+; schematic schWindowBBox string "((20 20) (1900 1060))"
+; layout leWindowBBox string "((20 20) (1900 1060))"
diff --git a/workspace_setup/.cdsinit b/workspace_setup/.cdsinit
new file mode 100644
index 0000000..b1b929b
--- /dev/null
+++ b/workspace_setup/.cdsinit
@@ -0,0 +1,151 @@
+
+printf("STARTING CDSINIT\n")
+
+; load configuration skill scripts.
+let( (configFileList file path saveSkillPath)
+    configFileList = '(
+                    )
+    ; paths of the configuration files.
+    path = strcat(
+              ".  ~  "
+              prependInstallPath("local ")
+             )
+    saveSkillPath=getSkillPath()
+    setSkillPath(path)
+
+    foreach(file configFileList
+       if(isFile(file) then
+          loadi(file)
+         )
+    )
+    setSkillPath(saveSkillPath)
+)
+
+; load key bindings scripts
+let( (bindKeyFileList file path saveSkillPath)
+    bindKeyFileList = '(
+                   "leBindKeys.il"
+                   "schBindKeys.il"
+                    )
+    ; paths of key binding scripts
+    path = strcat(
+              ".  ~  "
+              prependInstallPath("local ")
+              prependInstallPath("samples/local")
+             )
+    saveSkillPath=getSkillPath()
+    setSkillPath(path)
+
+    foreach(file bindKeyFileList
+       if(isFile(file ) then
+          loadi(file)
+         )
+    )
+    setSkillPath(saveSkillPath)
+)
+
+sstatus(writeProtect nil)
+
+let((skillPath)
+   skillPath= strcat(
+    ". ~ "                                          ; Current & home directory
+    prependInstallPath("samples/techfile ")         ; sample source technology files
+   )
+   setSkillPath(skillPath)
+)
+
+;
+; check CALIBRE_HOME
+;
+cal_home=getShellEnvVar("CALIBRE_HOME")
+if( cal_home==nil then
+    cal_home=getShellEnvVar("MGC_HOME")
+    if( cal_home!=nil then
+        printf("// CALIBRE_HOME environment variable not set; setting it to value of MGC_HOME\n");
+    )
+)
+
+if( cal_home!=nil && isDir(cal_home) && isReadable(cal_home) then
+
+    ; Load calibre.skl or calibre.4.3.skl, not both!
+
+    if( getShellEnvVar("MGC_CALIBRE_REALTIME_VIRTUOSO_ENABLED") &&
+        getShellEnvVar("MGC_REALTIME_HOME") && dbGetDatabaseType()=="OpenAccess" then
+      load(strcat(getShellEnvVar("MGC_REALTIME_HOME") "/lib/calibre.skl"))
+    else
+      ; Load calibre.skl for Cadence versions 4.4 and greater
+      load(strcat(cal_home "/lib/calibre.skl"))
+    )
+
+    ;;;;Load calibre.4.3.skl for Cadence version 4.3
+    ;;; load(strcat(cal_home "/lib/calibre.4.3.skl"))
+
+else
+
+    ; CALIBRE_HOME is not set correctly. Report the problem.
+
+    printf("//  Calibre Error: Environment variable ")
+
+    if( cal_home==nil || cal_home=="" then
+        printf("CALIBRE_HOME is not set.");
+    else
+        if( !isDir(cal_home) then
+            printf("CALIBRE_HOME does not point to a directory.");
+        else
+            if( !isReadable(cal_home) then
+                printf("CALIBRE_HOME points to an unreadable directory.");
+            )
+        )
+    )
+    printf(" Calibre Skill Interface not loaded.\n")
+
+    ; Display a dialog box message about load failure.
+
+    hiDisplayAppDBox(
+        ?name           'MGCHOMEErrorDlg
+        ?dboxBanner     "Calibre Error"
+        ?dboxText       "Calibre Skill Interface not loaded."
+        ?dialogType     hicErrorDialog
+        ?dialogStyle    'modal
+       ?buttonLayout   'Close
+    )
+)
+
+printf("END OF STANDARD CONFIG SETTINGS\n")
+
+; set default editor
+editor = "emacs"
+
+envLoadFile( "./.cdsenv" )
+
+if( isFile( ".cdsenv.personal" ) then
+    envLoadFile( ".cdsenv.personal" )
+)
+
+cdlOutKeys = list(nil
+    'incFILE                   "$BAG_TECH_CONFIG_DIR/calibre_setup/source.added"
+)
+
+if( isFile( ".cdsinit.personal" ) then
+    load(".cdsinit.personal")
+)
+
+; open library manager
+ddsOpenLibManager()
+
+
+;; Set Default Model Files.  Note the "#;" de-selects the model call.
+
+setModelFiles=strcat(
+   " " getShellEnvVar("PDK_HOME") "/MODELS/SPECTRE/" getShellEnvVar("METAL_STACK") "/Models/design_wrapper.lib.scs;tt_fet"
+   " " getShellEnvVar("PDK_HOME") "/MODELS/SPECTRE/" getShellEnvVar("METAL_STACK") "/Models/design_wrapper.lib.scs;tt_cell"
+   " " getShellEnvVar("PDK_HOME") "/MODELS/SPECTRE/" getShellEnvVar("METAL_STACK") "/Models/design_wrapper.lib.scs;tt_parRC"
+   " " getShellEnvVar("PDK_HOME") "/MODELS/SPECTRE/" getShellEnvVar("METAL_STACK") "/Models/design_wrapper.lib.scs;tt_rc"
+   " " getShellEnvVar("PDK_HOME") "/MODELS/SPECTRE/" getShellEnvVar("METAL_STACK") "/Models/design_wrapper.lib.scs;npn_t"
+)
+
+envSetVal("spectre.envOpts" "modelFiles" 'string setModelFiles)
+envSetVal("spectre.envOpts" "controlMode" 'string "batch")
+
+
+printf("END OF CUSTOM CONFIG SETTINGS\n")
diff --git a/workspace_setup/.cdsinit.personal b/workspace_setup/.cdsinit.personal
new file mode 100644
index 0000000..a726377
--- /dev/null
+++ b/workspace_setup/.cdsinit.personal
@@ -0,0 +1,5 @@
+; set simulation results to be saved in /tools/scratch
+envSetVal("asimenv.startup" "projectDir" 'string sprintf( nil "%s/simulation" getShellEnvVar( "BAG_WORK_DIR" ) ) )
+
+; resize CIW window
+; hiResizeWindow(window(1) list(540:100 1260:480))
diff --git a/workspace_setup/.gitignore b/workspace_setup/.gitignore
new file mode 100644
index 0000000..b0d68f7
--- /dev/null
+++ b/workspace_setup/.gitignore
@@ -0,0 +1,60 @@
+# python/IDE files
+*.pyc
+__pycache__
+venv
+
+# Pycharm files
+.idea/workspace.xml
+.idea/usage.statistics.xml
+.idea/tasks.xml
+
+# misc edit/log files
+*~
+*.log
+IPOPT.out
+lsyncd.status
+
+# misc BAG files
+bag_sim
+bag_stimuli
+gen_outputs
+BAG_server_port.txt
+BAG_sim_server_port.txt
+pytest_output
+
+
+# misc configuration/history files
+.ipython
+.jupyter
+.ipynb_checkpoints
+
+# generated files/directories
+calibre_run
+gen_libs
+pvs_run
+cds.lib
+BAGTMP
+spectre_run
+cdl_netlist
+netlist
+sim
+gen_output
+
+# cadence files
+.abstract
+.cadence
+*.cdslck
+.calibreviewsetup
+.tmp_*
+libManager.log.*
+abstract*
+
+# calibre files
+.cgidrcdb
+.cgilvsdb
+calibreview.setup
+
+# pvs files
+.QRC.run
+.preRcx.Last.State
+.qrc.Last.state
diff --git a/workspace_setup/.simrc b/workspace_setup/.simrc
new file mode 100644
index 0000000..ccb3f02
--- /dev/null
+++ b/workspace_setup/.simrc
@@ -0,0 +1,2 @@
+auCdlCDFPinCntrl = 't
+auCdlSkipMEGA = 't
diff --git a/workspace_setup/PDK b/workspace_setup/PDK
new file mode 120000
index 0000000..61572bf
--- /dev/null
+++ b/workspace_setup/PDK
@@ -0,0 +1 @@
+/tools/commercial/skywater/swtech130/skywater-src-nda/s8/V2.0.0
\ No newline at end of file
diff --git a/workspace_setup/bag_config.yaml b/workspace_setup/bag_config.yaml
new file mode 100644
index 0000000..7c704a4
--- /dev/null
+++ b/workspace_setup/bag_config.yaml
@@ -0,0 +1,129 @@
+# BAG socket configuration
+socket:
+  # the host running the database.  localhost if on the same machine.
+  host: "localhost"
+  # the port to communicate with.
+  port_file: "BAG_server_port.txt"
+  # the log file for socket communication debugging
+  log_file: "BAG_socket.log"
+  # number of messages allowed in a pipeline
+  pipeline: 100
+
+# CAD database configuration
+# Right now only virtuoso is supported.
+database:
+  # the python class that handles database interaction.
+  class: "bag.interface.oa.OAInterface"
+  # default directory to create generated libraries in.
+  default_lib_path: "${BAG_WORK_DIR}/gen_libs"
+  # If true, then everytime we generate schematic/layout from BAG, all opened cellviews are closed
+  close_all_cellviews: False
+
+  # configurations for schematic import and generation
+  schematic:
+    # technology library to configure new libraries with
+    tech_lib: "s8phirs_10r"
+    # libraries to exclude for schematic import
+    exclude_libraries: ["analogLib", "basic", "s8phirs_10r"]
+    # libraries to exclude for modeling purposes
+    model_exclude_libraries: []
+    # cells to exclude for modeling purposes
+    model_exclude_cells:
+      basic: ['noConn']
+  # configurations for testbench creation
+  testbench:
+    # config view global libraries
+    config_libs: "s8phirs_10r analogLib basic"
+    # config view cellviews
+    config_views: "spectre schematic av_extracted veriloga"
+    # config view stop cellviews
+    config_stops: "spectre veriloga"
+    # default simulation environment name
+    default_env: "tt"
+    # simulation environment file
+    env_file: "${BAG_TECH_CONFIG_DIR}/corners_setup.yaml"
+    # definition files to include
+    def_files: []
+  # configurations used to create a Checker object to run LVS/RCX
+  checker:
+    # the Checker class.
+    checker_cls: 'bag.verification.calibre.Calibre'
+    # program used to run extraction
+    rcx_program: 'qrc'
+    # maximum number of sub-processes BAG can launch.
+    max_workers: 2
+    # source.added location
+    source_added_file: "${BAG_TECH_CONFIG_DIR}/calibre_setup/source.added"
+    # root directories
+    root_dir:
+      drc: '${BAG_WORK_DIR}/calibre_run/drc'
+      lvs: '${BAG_WORK_DIR}/calibre_run/lvs'
+      rcx: '${BAG_WORK_DIR}/calibre_run/rcx'
+    # jinja template control files
+    template:
+      drc: '${BAG_TECH_CONFIG_DIR}/calibre_setup/drc.svrf'
+      lvs: '${BAG_TECH_CONFIG_DIR}/calibre_setup/lvs.svrf'
+      rcx: ''
+    # environment variables
+    env_vars:
+      drc: {}
+      lvs: {}
+      rcx: {}
+    link_files:
+      drc: []
+      lvs: []
+      rcx: []
+    # default parameters
+    params:
+      drc: {}
+      lvs: {}
+      rcx: {}
+
+# Simulation configurations
+simulation:
+  # python class that talks with the simulator
+  class: "bag.simulation.spectre.SpectreInterface"
+  # maximum number of processes BAG can launch.
+  max_workers: 8
+  # when simulation goes long, a reminder message will be printed at this interval
+  update_timeout_ms: 120000
+  # amount of time to wait for process cancellation to succeed.
+  cancel_timeout_ms: 10000
+  # True to show interactive log viewer.
+  show_log_viewer: True
+  # corner configuration file
+  env_file: "${BAG_TECH_CONFIG_DIR}/corners_setup.yaml"
+  # command settings
+  kwargs:
+    # the command to start
+    #command: "bsub -q bora -o $BAG_WORK_DIR/tmp -K spectre"
+    command: spectre
+    # environment variables.  Null for same environment as SkillOceanServer.
+    env: !!null
+    # True to run in 64-bit mode
+    run_64: True
+    # output format
+    format: psfxl
+    # psf version
+    psfversion: '1.1'
+    options: ['++aps', '+lqtimeout', '0', '+mt=8', '+mp=8', '+postlayout', '+rcnet_fmax=25']
+  compress: True
+  rtol: 1.0e-8
+  atol: 1.0e-22
+
+# LEF generation configuration
+lef:
+  class: 'bag.interface.abstract.AbstractInterface'
+  run_dir: 'abstract_run'
+  options_file: '${BAG_TECH_CONFIG_DIR}/abstract_setup/bag_abstract.options'
+
+
+# technology specific configuration are stored in a separate file.
+# this field tells BAG where to look for it.
+tech_config_path: "${BAG_TECH_CONFIG_DIR}/tech_config.yaml"
+
+# BAG design libraries definition file.
+lib_defs: "bag_libs.def"
+
+# place to put new design libraries
+new_lib_path: "BagModules"
diff --git a/workspace_setup/bag_submodules.yaml b/workspace_setup/bag_submodules.yaml
new file mode 100644
index 0000000..2050b80
--- /dev/null
+++ b/workspace_setup/bag_submodules.yaml
@@ -0,0 +1,13 @@
+BAG_framework:
+  url: git@10.8.0.1:bag/BAG_framework.git
+  branch: sim_refactor
+bag3_digital:
+  url: git@10.8.0.1:bag/bag3_digital.git
+  branch: sim_refactor
+bag3_testbenches:
+  url: git@10.8.0.1:bag/bag3_testbenches.git
+  branch: sim_refactor
+xbase_bcad:
+  url: git@10.8.0.1:bag/xbase_bcad.git
+  branch: sim_refactor
+
diff --git a/workspace_setup/cds.lib.core b/workspace_setup/cds.lib.core
new file mode 100644
index 0000000..7ae3529
--- /dev/null
+++ b/workspace_setup/cds.lib.core
@@ -0,0 +1,21 @@
+# cadence base libraries
+DEFINE     analogLib    $CDSHOME/tools/dfII/etc/cdslib/artist/analogLib
+DEFINE     basic        $CDSHOME/tools/dfII/etc/cdslib/basic
+
+# technology base libraries
+DEFINE     s8phirs_10r  $BAG_TECH_CONFIG_DIR/workspace_setup/PDK/VirtuosoOA/libs/s8phirs_10r
+# legacy libraries
+DEFINE	   tech		$BAG_TECH_CONFIG_DIR/workspace_setup/PDK/VirtuosoOA/libs/tech 
+DEFINE	   technology_library		$BAG_TECH_CONFIG_DIR/workspace_setup/PDK/VirtuosoOA/libs/technology_library 
+DEFINE	   s8rf		$BAG_TECH_CONFIG_DIR/workspace_setup/PDK/VirtuosoOA/libs/s8rf 
+DEFINE	   s8rf2	$BAG_TECH_CONFIG_DIR/workspace_setup/PDK/VirtuosoOA/libs/s8rf2 
+DEFINE	   s8rf2_dv	$BAG_TECH_CONFIG_DIR/workspace_setup/PDK/VirtuosoOA/libs/s8rf2_dv
+
+ASSIGN tech DISPLAY Invisible 
+ASSIGN technology_library DISPLAY Invisible 
+#ASSIGN s8rf DISPLAY Invisible 
+#ASSIGN s8rf2 DISPLAY Invisible 
+#ASSIGN s8rf2_dv DISPLAY Invisible 
+
+# BAG Libraries
+INCLUDE $BAG_WORK_DIR/cds.lib.bag
diff --git a/workspace_setup/display.drf b/workspace_setup/display.drf
new file mode 120000
index 0000000..14a5554
--- /dev/null
+++ b/workspace_setup/display.drf
@@ -0,0 +1 @@
+PDK/VirtuosoOA/libs/display.drf
\ No newline at end of file
diff --git a/workspace_setup/ipython_config.py b/workspace_setup/ipython_config.py
new file mode 100644
index 0000000..a4a9cfb
--- /dev/null
+++ b/workspace_setup/ipython_config.py
@@ -0,0 +1,599 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright 2019-2021 SkyWater PDK Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# This code is *alternatively* available under a BSD-3-Clause license, see
+# details in the README.md at the top level and the license text at
+# https://github.com/google/skywater-pdk-libs-sky130_bag3_pr/blob/master/LICENSE.alternative
+#
+# SPDX-License-Identifier: BSD-3-Clause OR Apache 2.0
+
+
+# Configuration file for ipython.
+import os
+c = get_config()
+
+#------------------------------------------------------------------------------
+# InteractiveShellApp(Configurable) configuration
+#------------------------------------------------------------------------------
+
+## A Mixin for applications that start InteractiveShell instances.
+#  
+#  Provides configurables for loading extensions and executing files as part of
+#  configuring a Shell environment.
+#  
+#  The following methods should be called by the :meth:`initialize` method of the
+#  subclass:
+#  
+#    - :meth:`init_path`
+#    - :meth:`init_shell` (to be implemented by the subclass)
+#    - :meth:`init_gui_pylab`
+#    - :meth:`init_extensions`
+#    - :meth:`init_code`
+
+## Execute the given command string.
+#c.InteractiveShellApp.code_to_run = ''
+
+## Run the file referenced by the PYTHONSTARTUP environment variable at IPython
+#  startup.
+#c.InteractiveShellApp.exec_PYTHONSTARTUP = True
+
+## List of files to run at IPython startup.
+c.InteractiveShellApp.exec_files = [
+]
+
+## lines of code to run at IPython startup.
+c.InteractiveShellApp.exec_lines = [
+    'import numpy as np',
+    # enable autoreload
+    '%autoreload 2',
+]
+
+## A list of dotted module names of IPython extensions to load.
+c.InteractiveShellApp.extensions = ['autoreload']
+
+## dotted module name of an IPython extension to load.
+#c.InteractiveShellApp.extra_extension = ''
+
+## A file to be run
+#c.InteractiveShellApp.file_to_run = ''
+
+## Enable GUI event loop integration with any of ('glut', 'gtk', 'gtk2', 'gtk3',
+#  'osx', 'pyglet', 'qt', 'qt4', 'qt5', 'tk', 'wx', 'gtk2', 'qt4').
+# c.InteractiveShellApp.gui = 'qt5'
+
+## Should variables loaded at startup (by startup files, exec_lines, etc.) be
+#  hidden from tools like %who?
+#c.InteractiveShellApp.hide_initial_ns = True
+
+## Configure matplotlib for interactive use with the default matplotlib backend.
+#c.InteractiveShellApp.matplotlib = None
+
+## Run the module as a script.
+#c.InteractiveShellApp.module_to_run = ''
+
+## Pre-load matplotlib and numpy for interactive use, selecting a particular
+#  matplotlib backend and loop integration.
+#c.InteractiveShellApp.pylab = None
+
+## If true, IPython will populate the user namespace with numpy, pylab, etc. and
+#  an ``import *`` is done from numpy and pylab, when using pylab mode.
+#  
+#  When False, pylab mode should not import any names into the user namespace.
+#c.InteractiveShellApp.pylab_import_all = True
+
+## Reraise exceptions encountered loading IPython extensions?
+#c.InteractiveShellApp.reraise_ipython_extension_failures = False
+
+#------------------------------------------------------------------------------
+# Application(SingletonConfigurable) configuration
+#------------------------------------------------------------------------------
+
+## This is an application.
+
+## The date format used by logging formatters for %(asctime)s
+#c.Application.log_datefmt = '%Y-%m-%d %H:%M:%S'
+
+## The Logging format template
+#c.Application.log_format = '[%(name)s]%(highlevel)s %(message)s'
+
+## Set the log level by value or name.
+#c.Application.log_level = 30
+
+#------------------------------------------------------------------------------
+# BaseIPythonApplication(Application) configuration
+#------------------------------------------------------------------------------
+
+## IPython: an enhanced interactive Python shell.
+
+## Whether to create profile dir if it doesn't exist
+#c.BaseIPythonApplication.auto_create = False
+
+## Whether to install the default config files into the profile dir. If a new
+#  profile is being created, and IPython contains config files for that profile,
+#  then they will be staged into the new directory.  Otherwise, default config
+#  files will be automatically generated.
+#c.BaseIPythonApplication.copy_config_files = False
+
+## Path to an extra config file to load.
+#  
+#  If specified, load this config file in addition to any other IPython config.
+#c.BaseIPythonApplication.extra_config_file = u''
+
+## The name of the IPython directory. This directory is used for logging
+#  configuration (through profiles), history storage, etc. The default is usually
+#  $HOME/.ipython. This option can also be specified through the environment
+#  variable IPYTHONDIR.
+#c.BaseIPythonApplication.ipython_dir = u''
+
+## Whether to overwrite existing config files when copying
+#c.BaseIPythonApplication.overwrite = False
+
+## The IPython profile to use.
+#c.BaseIPythonApplication.profile = u'default'
+
+## Create a massive crash report when IPython encounters what may be an internal
+#  error.  The default is to append a short message to the usual traceback
+#c.BaseIPythonApplication.verbose_crash = False
+
+#------------------------------------------------------------------------------
+# TerminalIPythonApp(BaseIPythonApplication,InteractiveShellApp) configuration
+#------------------------------------------------------------------------------
+
+## Whether to display a banner upon starting IPython.
+# c.TerminalIPythonApp.display_banner = True
+
+## If a command or file is given via the command-line, e.g. 'ipython foo.py',
+#  start an interactive shell after executing the file or command.
+#c.TerminalIPythonApp.force_interact = False
+
+## Start IPython quickly by skipping the loading of config files.
+#c.TerminalIPythonApp.quick = False
+
+#------------------------------------------------------------------------------
+# InteractiveShell(SingletonConfigurable) configuration
+#------------------------------------------------------------------------------
+
+## An enhanced, interactive shell for Python.
+
+## 'all', 'last', 'last_expr' or 'none', specifying which nodes should be run
+#  interactively (displaying output from expressions).
+#c.InteractiveShell.ast_node_interactivity = 'last_expr'
+
+## A list of ast.NodeTransformer subclass instances, which will be applied to
+#  user input before code is run.
+#c.InteractiveShell.ast_transformers = []
+
+## Make IPython automatically call any callable object even if you didn't type
+#  explicit parentheses. For example, 'str 43' becomes 'str(43)' automatically.
+#  The value can be '0' to disable the feature, '1' for 'smart' autocall, where
+#  it is not applied if there are no more arguments on the line, and '2' for
+#  'full' autocall, where all callable objects are automatically called (even if
+#  no arguments are present).
+#c.InteractiveShell.autocall = 0
+
+## Autoindent IPython code entered interactively.
+#c.InteractiveShell.autoindent = True
+
+## Enable magic commands to be called without the leading %.
+#c.InteractiveShell.automagic = True
+
+## The part of the banner to be printed before the profile
+#c.InteractiveShell.banner1 = 'Python 2.7.12 |Anaconda custom (64-bit)| (default, Jul  2 2016, 17:42:40) \nType "copyright", "credits" or "license" for more information.\n\nIPython 5.1.0 -- An enhanced Interactive Python.\n?         -> Introduction and overview of IPython\'s features.\n%quickref -> Quick reference.\nhelp      -> Python\'s own help system.\nobject?   -> Details about \'object\', use \'object??\' for extra details.\n'
+
+## The part of the banner to be printed after the profile
+#c.InteractiveShell.banner2 = ''
+
+## Set the size of the output cache.  The default is 1000, you can change it
+#  permanently in your config file.  Setting it to 0 completely disables the
+#  caching system, and the minimum value accepted is 20 (if you provide a value
+#  less than 20, it is reset to 0 and a warning is issued).  This limit is
+#  defined because otherwise you'll spend more time re-flushing a too small cache
+#  than working
+#c.InteractiveShell.cache_size = 1000
+
+## Use colors for displaying information about objects. Because this information
+#  is passed through a pager (like 'less'), and some pagers get confused with
+#  color codes, this capability can be turned off.
+#c.InteractiveShell.color_info = True
+
+## Set the color scheme (NoColor, Neutral, Linux, or LightBG).
+c.InteractiveShell.colors = 'Linux'
+
+## 
+#c.InteractiveShell.debug = False
+
+## **Deprecated**
+#  
+#  Will be removed in IPython 6.0
+#  
+#  Enable deep (recursive) reloading by default. IPython can use the deep_reload
+#  module which reloads changes in modules recursively (it replaces the reload()
+#  function, so you don't need to change anything to use it). `deep_reload`
+#  forces a full reload of modules whose code may have changed, which the default
+#  reload() function does not.  When deep_reload is off, IPython will use the
+#  normal reload(), but deep_reload will still be available as dreload().
+#c.InteractiveShell.deep_reload = False
+
+## Don't call post-execute functions that have failed in the past.
+#c.InteractiveShell.disable_failing_post_execute = False
+
+## If True, anything that would be passed to the pager will be displayed as
+#  regular output instead.
+#c.InteractiveShell.display_page = False
+
+## (Provisional API) enables html representation in mime bundles sent to pagers.
+#c.InteractiveShell.enable_html_pager = False
+
+## Total length of command history
+#c.InteractiveShell.history_length = 10000
+
+## The number of saved history entries to be loaded into the history buffer at
+#  startup.
+#c.InteractiveShell.history_load_length = 1000
+
+## 
+#c.InteractiveShell.ipython_dir = ''
+
+## Start logging to the given file in append mode. Use `logfile` to specify a log
+#  file to **overwrite** logs to.
+#c.InteractiveShell.logappend = ''
+
+## The name of the logfile to use.
+#c.InteractiveShell.logfile = ''
+
+## Start logging to the default log file in overwrite mode. Use `logappend` to
+#  specify a log file to **append** logs to.
+#c.InteractiveShell.logstart = False
+
+## 
+#c.InteractiveShell.object_info_string_level = 0
+
+## Automatically call the pdb debugger after every exception.
+#c.InteractiveShell.pdb = False
+
+## Deprecated since IPython 4.0 and ignored since 5.0, set
+#  TerminalInteractiveShell.prompts object directly.
+#c.InteractiveShell.prompt_in1 = 'In [\\#]: '
+
+## Deprecated since IPython 4.0 and ignored since 5.0, set
+#  TerminalInteractiveShell.prompts object directly.
+#c.InteractiveShell.prompt_in2 = '   .\\D.: '
+
+## Deprecated since IPython 4.0 and ignored since 5.0, set
+#  TerminalInteractiveShell.prompts object directly.
+#c.InteractiveShell.prompt_out = 'Out[\\#]: '
+
+## Deprecated since IPython 4.0 and ignored since 5.0, set
+#  TerminalInteractiveShell.prompts object directly.
+#c.InteractiveShell.prompts_pad_left = True
+
+## 
+#c.InteractiveShell.quiet = False
+
+## 
+#c.InteractiveShell.separate_in = '\n'
+
+## 
+#c.InteractiveShell.separate_out = ''
+
+## 
+#c.InteractiveShell.separate_out2 = ''
+
+## Show rewritten input, e.g. for autocall.
+#c.InteractiveShell.show_rewritten_input = True
+
+## Enables rich html representation of docstrings. (This requires the docrepr
+#  module).
+#c.InteractiveShell.sphinxify_docstring = False
+
+## 
+#c.InteractiveShell.wildcards_case_sensitive = True
+
+## 
+#c.InteractiveShell.xmode = 'Context'
+
+#------------------------------------------------------------------------------
+# TerminalInteractiveShell(InteractiveShell) configuration
+#------------------------------------------------------------------------------
+
+## Set to confirm when you try to exit IPython with an EOF (Control-D in Unix,
+#  Control-Z/Enter in Windows). By typing 'exit' or 'quit', you can force a
+#  direct exit without any confirmation.
+#c.TerminalInteractiveShell.confirm_exit = True
+
+## Options for displaying tab completions, 'column', 'multicolumn', and
+#  'readlinelike'. These options are for `prompt_toolkit`, see `prompt_toolkit`
+#  documentation for more information.
+#c.TerminalInteractiveShell.display_completions = 'multicolumn'
+
+## Shortcut style to use at the prompt. 'vi' or 'emacs'.
+#c.TerminalInteractiveShell.editing_mode = 'emacs'
+
+## Set the editor used by IPython (default to $EDITOR/vi/notepad).
+c.TerminalInteractiveShell.editor = 'gvim'
+
+## Highlight matching brackets .
+#c.TerminalInteractiveShell.highlight_matching_brackets = True
+
+## The name of a Pygments style to use for syntax highlighting:  manni, igor,
+#  lovelace, xcode, vim, autumn, vs, rrt, native, perldoc, borland, tango, emacs,
+#  friendly, monokai, paraiso-dark, colorful, murphy, bw, pastie, algol_nu,
+#  paraiso-light, trac, default, algol, fruity
+c.TerminalInteractiveShell.highlighting_style = 'paraiso-dark'
+
+## Override highlighting format for specific tokens
+#c.TerminalInteractiveShell.highlighting_style_overrides = {}
+
+## Enable mouse support in the prompt
+#c.TerminalInteractiveShell.mouse_support = False
+
+## Class used to generate Prompt token for prompt_toolkit
+#c.TerminalInteractiveShell.prompts_class = 'IPython.terminal.prompts.Prompts'
+
+## Use `raw_input` for the REPL, without completion, multiline input, and prompt
+#  colors.
+#  
+#  Useful when controlling IPython as a subprocess, and piping STDIN/OUT/ERR.
+#  Known usage are: IPython own testing machinery, and emacs inferior-shell
+#  integration through elpy.
+#  
+#  This mode default to `True` if the `IPY_TEST_SIMPLE_PROMPT` environment
+#  variable is set, or the current terminal is not a tty.
+#c.TerminalInteractiveShell.simple_prompt = False
+
+## Number of line at the bottom of the screen to reserve for the completion menu
+#c.TerminalInteractiveShell.space_for_menu = 6
+
+## Automatically set the terminal title
+c.TerminalInteractiveShell.term_title = False
+
+## Use 24bit colors instead of 256 colors in prompt highlighting. If your
+#  terminal supports true color, the following command should print 'TRUECOLOR'
+#  in orange: printf "\x1b[38;2;255;100;0mTRUECOLOR\x1b[0m\n"
+#c.TerminalInteractiveShell.true_color = False
+
+#------------------------------------------------------------------------------
+# HistoryAccessor(HistoryAccessorBase) configuration
+#------------------------------------------------------------------------------
+
+## Access the history database without adding to it.
+#  
+#  This is intended for use by standalone history tools. IPython shells use
+#  HistoryManager, below, which is a subclass of this.
+
+## Options for configuring the SQLite connection
+#  
+#  These options are passed as keyword args to sqlite3.connect when establishing
+#  database conenctions.
+#c.HistoryAccessor.connection_options = {}
+
+## enable the SQLite history
+#  
+#  set enabled=False to disable the SQLite history, in which case there will be
+#  no stored history, no SQLite connection, and no background saving thread.
+#  This may be necessary in some threaded environments where IPython is embedded.
+#c.HistoryAccessor.enabled = True
+
+## Path to file to use for SQLite history database.
+#  
+#  By default, IPython will put the history database in the IPython profile
+#  directory.  If you would rather share one history among profiles, you can set
+#  this value in each, so that they are consistent.
+#  
+#  Due to an issue with fcntl, SQLite is known to misbehave on some NFS mounts.
+#  If you see IPython hanging, try setting this to something on a local disk,
+#  e.g::
+#  
+#      ipython --HistoryManager.hist_file=/tmp/ipython_hist.sqlite
+#  
+#  you can also use the specific value `:memory:` (including the colon at both
+#  end but not the back ticks), to avoid creating an history file.
+#c.HistoryAccessor.hist_file = u''
+
+#------------------------------------------------------------------------------
+# HistoryManager(HistoryAccessor) configuration
+#------------------------------------------------------------------------------
+
+## A class to organize all history-related functionality in one place.
+
+## Write to database every x commands (higher values save disk access & power).
+#  Values of 1 or less effectively disable caching.
+#c.HistoryManager.db_cache_size = 0
+
+## Should the history database include output? (default: no)
+#c.HistoryManager.db_log_output = False
+
+#------------------------------------------------------------------------------
+# ProfileDir(LoggingConfigurable) configuration
+#------------------------------------------------------------------------------
+
+## An object to manage the profile directory and its resources.
+#  
+#  The profile directory is used by all IPython applications, to manage
+#  configuration, logging and security.
+#  
+#  This object knows how to find, create and manage these directories. This
+#  should be used by any code that wants to handle profiles.
+
+## Set the profile location directly. This overrides the logic used by the
+#  `profile` option.
+#c.ProfileDir.location = u''
+
+#------------------------------------------------------------------------------
+# BaseFormatter(Configurable) configuration
+#------------------------------------------------------------------------------
+
+## A base formatter class that is configurable.
+#  
+#  This formatter should usually be used as the base class of all formatters. It
+#  is a traited :class:`Configurable` class and includes an extensible API for
+#  users to determine how their objects are formatted. The following logic is
+#  used to find a function to format an given object.
+#  
+#  1. The object is introspected to see if it has a method with the name
+#     :attr:`print_method`. If is does, that object is passed to that method
+#     for formatting.
+#  2. If no print method is found, three internal dictionaries are consulted
+#     to find print method: :attr:`singleton_printers`, :attr:`type_printers`
+#     and :attr:`deferred_printers`.
+#  
+#  Users should use these dictionaries to register functions that will be used to
+#  compute the format data for their objects (if those objects don't have the
+#  special print methods). The easiest way of using these dictionaries is through
+#  the :meth:`for_type` and :meth:`for_type_by_name` methods.
+#  
+#  If no function/callable is found to compute the format data, ``None`` is
+#  returned and this format type is not used.
+
+## 
+#c.BaseFormatter.deferred_printers = {}
+
+## 
+#c.BaseFormatter.enabled = True
+
+## 
+#c.BaseFormatter.singleton_printers = {}
+
+## 
+#c.BaseFormatter.type_printers = {}
+
+#------------------------------------------------------------------------------
+# PlainTextFormatter(BaseFormatter) configuration
+#------------------------------------------------------------------------------
+
+## The default pretty-printer.
+#  
+#  This uses :mod:`IPython.lib.pretty` to compute the format data of the object.
+#  If the object cannot be pretty printed, :func:`repr` is used. See the
+#  documentation of :mod:`IPython.lib.pretty` for details on how to write pretty
+#  printers.  Here is a simple example::
+#  
+#      def dtype_pprinter(obj, p, cycle):
+#          if cycle:
+#              return p.text('dtype(...)')
+#          if hasattr(obj, 'fields'):
+#              if obj.fields is None:
+#                  p.text(repr(obj))
+#              else:
+#                  p.begin_group(7, 'dtype([')
+#                  for i, field in enumerate(obj.descr):
+#                      if i > 0:
+#                          p.text(',')
+#                          p.breakable()
+#                      p.pretty(field)
+#                  p.end_group(7, '])')
+
+## 
+#c.PlainTextFormatter.float_precision = ''
+
+## Truncate large collections (lists, dicts, tuples, sets) to this size.
+#  
+#  Set to 0 to disable truncation.
+#c.PlainTextFormatter.max_seq_length = 1000
+
+## 
+#c.PlainTextFormatter.max_width = 79
+
+## 
+#c.PlainTextFormatter.newline = '\n'
+
+## 
+#c.PlainTextFormatter.pprint = True
+
+## 
+#c.PlainTextFormatter.verbose = False
+
+#------------------------------------------------------------------------------
+# Completer(Configurable) configuration
+#------------------------------------------------------------------------------
+
+## Activate greedy completion PENDING DEPRECTION. this is now mostly taken care
+#  of with Jedi.
+#  
+#  This will enable completion on elements of lists, results of function calls,
+#  etc., but can be unsafe because the code is actually evaluated on TAB.
+#c.Completer.greedy = False
+
+#------------------------------------------------------------------------------
+# IPCompleter(Completer) configuration
+#------------------------------------------------------------------------------
+
+## Extension of the completer class with IPython-specific features
+
+## DEPRECATED as of version 5.0.
+#  
+#  Instruct the completer to use __all__ for the completion
+#  
+#  Specifically, when completing on ``object.<tab>``.
+#  
+#  When True: only those names in obj.__all__ will be included.
+#  
+#  When False [default]: the __all__ attribute is ignored
+#c.IPCompleter.limit_to__all__ = False
+
+## Whether to merge completion results into a single list
+#  
+#  If False, only the completion results from the first non-empty completer will
+#  be returned.
+#c.IPCompleter.merge_completions = True
+
+## Instruct the completer to omit private method names
+#  
+#  Specifically, when completing on ``object.<tab>``.
+#  
+#  When 2 [default]: all names that start with '_' will be excluded.
+#  
+#  When 1: all 'magic' names (``__foo__``) will be excluded.
+#  
+#  When 0: nothing will be excluded.
+#c.IPCompleter.omit__names = 2
+
+#------------------------------------------------------------------------------
+# ScriptMagics(Magics) configuration
+#------------------------------------------------------------------------------
+
+## Magics for talking to scripts
+#  
+#  This defines a base `%%script` cell magic for running a cell with a program in
+#  a subprocess, and registers a few top-level magics that call %%script with
+#  common interpreters.
+
+## Extra script cell magics to define
+#  
+#  This generates simple wrappers of `%%script foo` as `%%foo`.
+#  
+#  If you want to add script magics that aren't on your path, specify them in
+#  script_paths
+#c.ScriptMagics.script_magics = []
+
+## Dict mapping short 'ruby' names to full paths, such as '/opt/secret/bin/ruby'
+#  
+#  Only necessary for items in script_magics where the default path will not find
+#  the right interpreter.
+#c.ScriptMagics.script_paths = {}
+
+#------------------------------------------------------------------------------
+# StoreMagics(Magics) configuration
+#------------------------------------------------------------------------------
+
+## Lightweight persistence for python variables.
+#  
+#  Provides the %store magic.
+
+## If True, any %store-d variables will be automatically restored when IPython
+#  starts.
+#c.StoreMagics.autorestore = False
diff --git a/workspace_setup/leBindKeys.il b/workspace_setup/leBindKeys.il
new file mode 100644
index 0000000..701d345
--- /dev/null
+++ b/workspace_setup/leBindKeys.il
@@ -0,0 +1,127 @@
+;;-----------------------------------------------------------------------------
+;; Bindkeys for 'Layout'
+;; Inherited by:
+;;             * Dracula Interactive
+;;             * High Capacity Power IR/EM
+;;             * NC-Verilog-MaskLayout
+;;             * Other-Layout
+;;             * Other-MaskLayout
+;;             * Other-Symbolic
+;;             * Pcell
+;;             * Power IR/EM
+;;             * Spectre-Layout
+;;             * Spectre-MaskLayout
+;;             * Spectre-Symbolic
+;;             * UltraSim-Layout
+;;             * UltraSim-MaskLayout
+;;             * UltraSim-Symbolic
+;;             * VLS-GXL
+;;             * Virtuoso CE
+;;             * Virtuoso XL
+;;             * adegxl-maskLayout
+;;             * adexl-maskLayout
+;;             * parasitics-MaskLayout
+;;-----------------------------------------------------------------------------
+
+procedure(enable_sch_layers()
+    leSetLayerVisible( list("wire" "label") t )
+    leSetLayerVisible( list("wire" "drawing") t )
+    leSetLayerVisible( list("pin" "label") t )
+    leSetLayerVisible( list("pin" "drawing") t )
+    leSetLayerVisible( list("device" "drawing") t )
+    leSetLayerVisible( list("device" "drawing1") t )
+    leSetLayerVisible( list("device" "label") t )
+    leSetLayerVisible( list("instance" "label") t )
+    leSetLayerVisible( list("border" "drawing") t )
+
+    leSetLayerVisible( list("instance" "drawing") t )
+    leSetLayerVisible( list("text" "drawing") t )
+    leSetLayerVisible( list("device" "annotate") t )
+)
+
+procedure(show_od_m1()
+    leSetEntryLayer(list("poly" "drawing"))
+    leSetAllLayerVisible(nil)
+    leSetLayerVisible(list("nwell" "drawing") t)
+    leSetLayerVisible(list("nsdm" "drawing") t)
+    leSetLayerVisible(list("psdm" "drawing") t)
+    leSetLayerVisible(list("npc" "drawing") t)
+    leSetLayerVisible(list("diff" "drawing") t)
+    leSetLayerVisible(list("tap" "drawing") t)
+    leSetLayerVisible(list("poly" "drawing") t)
+    leSetLayerVisible(list("lvtn" "drawing") t)
+    leSetLayerVisible(list("hvtp" "drawing") t)
+    leSetLayerVisible(list("li1" "drawing") t)
+    leSetLayerVisible(list("licon1" "drawing") t)
+    leSetLayerVisible(list("mcon" "drawing") t)
+    leSetLayerVisible(list("met1" "drawing") t)
+    leSetLayerVisible(list("met1" "pin") t)
+
+    enable_sch_layers()
+    hiRedraw()
+)
+
+procedure(toggle_od()
+    leSetLayerVisible(list("diff" "drawing") not(leIsLayerVisible(list("diff" "drawing"))))
+    hiRedraw()
+)
+
+procedure( show_adjacent_metals( bot_layer )
+    let( (bot_name top_name via_name bot_dum top_dum)
+        sprintf(bot_name "met%d" bot_layer)
+	    if( bot_layer < 2 then
+            sprintf(via_name "via")
+        else
+            sprintf(via_name "via%d" bot_layer)
+        )
+	    sprintf(top_name "met%d" bot_layer + 1)
+	
+        leSetEntryLayer(list(bot_name "drawing"))
+        leSetAllLayerVisible(nil)
+        leSetLayerVisible(list(bot_name "drawing") t)
+        leSetLayerVisible(list(bot_name "pin") t)
+        leSetLayerVisible(list(top_name "drawing") t)
+        leSetLayerVisible(list(top_name "pin") t)
+        leSetLayerVisible(list(via_name "drawing") t)
+	enable_sch_layers()
+	hiRedraw()
+    )
+)
+
+
+procedure( toggle_metal( layer_id )
+    let( (metal_name draw_layer dum_layer pin_layer exc_layer)
+	sprintf(metal_name "met%d" layer_id)
+	draw_layer = list(metal_name "drawing")
+	pin_layer = list(metal_name "pin")
+	leSetLayerVisible(draw_layer not(leIsLayerVisible(draw_layer)))
+	leSetLayerVisible(pin_layer not(leIsLayerVisible(pin_layer)))
+        hiRedraw()
+    )
+)
+
+
+hiSetBindKeys( "Layout" list(
+    list("Ctrl<Key>q" "leSetAllLayerVisible(t) hiRedraw()")
+    list("<Key>`" "show_od_m1()")
+    list("<Key>1" "show_adjacent_metals(1)")
+    list("<Key>2" "show_adjacent_metals(2)")
+    list("<Key>3" "show_adjacent_metals(3)")
+    list("<Key>4" "show_adjacent_metals(4)")
+    list("<Key>5" "show_adjacent_metals(5)")
+    list("<Key>6" "show_adjacent_metals(6)")
+    list("<Key>7" "show_adjacent_metals(7)")
+    list("<Key>8" "show_adjacent_metals(8)")
+    list("<Key>9" "show_adjacent_metals(9)")
+    list("Ctrl<Key>`" "toggle_od()")
+    list("Ctrl<Key>1" "toggle_metal(1)")
+    list("Ctrl<Key>2" "toggle_metal(2)")
+    list("Ctrl<Key>3" "toggle_metal(3)")
+    list("Ctrl<Key>4" "toggle_metal(4)")
+    list("Ctrl<Key>5" "toggle_metal(5)")
+    list("Ctrl<Key>6" "toggle_metal(6)")
+    list("Ctrl<Key>7" "toggle_metal(7)")
+    list("Ctrl<Key>8" "toggle_metal(8)")
+    list("Ctrl<Key>9" "toggle_metal(9)")
+    list("Ctrl<Key>10" "toggle_metal(10)")
+))
diff --git a/workspace_setup/models b/workspace_setup/models
new file mode 120000
index 0000000..0b4a84d
--- /dev/null
+++ b/workspace_setup/models
@@ -0,0 +1 @@
+PDK/MODELS/SPECTRE/s8phirs_10r/Models
\ No newline at end of file
diff --git a/workspace_setup/start_tutorial.sh b/workspace_setup/start_tutorial.sh
new file mode 100755
index 0000000..c3cb880
--- /dev/null
+++ b/workspace_setup/start_tutorial.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+exec ${BAG_JUPYTER} --browser="firefox" tutorial_files
diff --git a/workspace_setup/tutorial_files/.gitignore b/workspace_setup/tutorial_files/.gitignore
new file mode 100644
index 0000000..5bf6ffc
--- /dev/null
+++ b/workspace_setup/tutorial_files/.gitignore
@@ -0,0 +1,2 @@
+demo_data
+stimuli
diff --git a/workspace_setup/tutorial_files/1_flow_demo.ipynb b/workspace_setup/tutorial_files/1_flow_demo.ipynb
new file mode 100644
index 0000000..16d6a04
--- /dev/null
+++ b/workspace_setup/tutorial_files/1_flow_demo.ipynb
@@ -0,0 +1,246 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Module 1: BAG Workflow Demo\n",
+    "Welcome to the BAG tutorial! In this module, you will test run a simple demo of a common-source amplifier design to get an idea of generator-based design methodology.  This also serves to make sure you setup your workspace properly."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## BAG Workflow\n",
+    "\n",
+    "<img src=\"bootcamp_pics/1_flow_demo/flow_demo_1.PNG\" alt=\"Drawing\" style=\"width: 600px\"/>\n",
+    "\n",
+    "The above flow diagram outlines how circuit design is typically done with BAG.  You will notice that it is largely similar to traditional manual design flow, with two major differences:\n",
+    "\n",
+    "* Designer focus on designing schematic/layout/testbench generators, instead of specific circuit instances.\n",
+    "* Layout is usually done before schematic.\n",
+    "\n",
+    "Discussions about the benefits of designing circuit generators instead of instances are outside of the scope of this tutorial, so I will assume you are already convinced.  So, why do we design layout generators before schematic generators?  There are several reasons:\n",
+    "\n",
+    "* Since BAG can easily automates layout and post-extraction simulations, there is almost no need for schematic only simulations.\n",
+    "* One schematic could correspond to many different layouts (each with a different floorplan strategy), whereas one layout corresponds to exactly one schematic.\n",
+    "* It is impossible to determine schematic details such as dummy transistors before layout is done.\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## BAG Schematic Example\n",
+    "<img src=\"bootcamp_pics/1_flow_demo/flow_demo_2.PNG\" alt=\"Drawing\" style=\"width: 500px\"/>\n",
+    "\n",
+    "The above figure shows the schematic template used for a common-source amplifier schematic generator, you can find this schematic in Virtuoso in library `demo_templates` and cell `amp_cs`.  Note that this is just like any other normal schematics, with the following differences:\n",
+    "\n",
+    "* Transistors are from the `BAG_prim` library.  In this way this schematic can be ported across process by simply changing the `BAG_prim` library.\n",
+    "* Dummy transistors' ports are connected using wire stubs and net labels.  This allows BAG to easy reconnect those ports if necessary.\n",
+    "\n",
+    "When BAG generates a new schematic, it will simply copy this schematic to a new library, then perform a set of modifications described by the schematic generator.  The modifications could include:\n",
+    "\n",
+    "* Delete instances.\n",
+    "* Create new instances.\n",
+    "* Change the master of an instance.\n",
+    "* Reconnect instance terminals.\n",
+    "* Modify instance parameters.\n",
+    "* Add/Remove/Rename pins.\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Testbench Schematic Example\n",
+    "<img src=\"bootcamp_pics/1_flow_demo/flow_demo_3.PNG\" alt=\"Drawing\" style=\"width: 400px\"/>\n",
+    "The above figure shows a schematic template for a DC operating point testbench generator, which can be found in library `bag_testbenches_ec` and cell `amp_tb_dc`.  It is just like the schematic template we seen before, but instead of a symbol view it has an ADEXL view.  To generate a new testbench, BAG will copy and modify both the schematic and the ADEXL view and returns a `Testbench` object that can be used to control simulations from Python."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Testbench ADEXL Setup\n",
+    "<img src=\"bootcamp_pics/1_flow_demo/flow_demo_4.PNG\" alt=\"Drawing\" style=\"width: 500px\"/>\n",
+    "The figure above shows the ADEXL view associated with a testbench template.  ADEXL is used to enable parametric/process corner sweeps."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Running Demo Work Flow\n",
+    "```python\n",
+    "def run_flow(prj, specs, dsn_name, lay_cls, sch_cls=None, run_lvs=True, lvs_only=False):\n",
+    "    # generate layout, get schematic parameters from layout\n",
+    "    dsn_sch_params = gen_layout(prj, specs, dsn_name, lay_cls)\n",
+    "    # generate design/testbench schematics\n",
+    "    gen_schematics(prj, specs, dsn_name, dsn_sch_params, sch_cls=sch_cls, check_lvs=run_lvs, lvs_only=lvs_only)\n",
+    "\n",
+    "    if lvs_only:\n",
+    "        # return if we're only running LVS\n",
+    "        print('LVS flow done')\n",
+    "        return\n",
+    "\n",
+    "    # run simulation and import results\n",
+    "    simulate(prj, specs, dsn_name)\n",
+    "\n",
+    "    # load simulation results from save file\n",
+    "    res_dict = load_sim_data(specs, dsn_name)\n",
+    "    # post-process simulation results\n",
+    "    plot_data(res_dict)\n",
+    "\n",
+    "```\n",
+    "Now that you have an rough idea of how BAG generates new schematics and testbenches, let's try to run the common-source amplifier design flow.  To do so, simple select the code box below and press Ctrl+Enter to evaluate the Python code.  If everything works fine, you should see output messages in the dialog box below the code box, and it should end with DC/AC/Transient simulation plots.  Schematics, layouts, and testbenches should also be generated in the `DEMO_AMP_CS` library in Virtuoso, so you can take a look over there.\n",
+    "\n",
+    "The Python script simply performs the following:\n",
+    "\n",
+    "* Read a specification file to get schematic/layout/testbench/simulation parameters.\n",
+    "* Create a `BagProject` instance to perform various functions.\n",
+    "* Call the `run_flow()` method defined in Python module `xbase_demo.core` to execute the common source amplifier design flow.\n",
+    "\n",
+    "The `xbase_demo.core` module is defined in the file `$BAG_WORK_DIR/BAG_XBase_demo/xbase_demo/core.py`.  You can take a look if you're interested, but the `run_flow()` method definition is reproduced above for your convenience.  You can see it simply calls other methods to generate layout/schematics, run simulations, and post-process simulation results."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "creating BagProject\n",
+      "computing layout\n",
+      "ext_w0 = 1, ext_wend=1, ytop=2592\n",
+      "final: ext_w0 = 1, ext_wend=1, ytop=2592\n",
+      "{'s': WireArray(TrackID(layer=3, track=7, num=9, pitch=2), 1109, 1265, 0.001), 'd': WireArray(TrackID(layer=3, track=8, num=8, pitch=2), 1231, 1387, 0.001), 'g': WireArray(TrackID(layer=3, track=8, num=8, pitch=2), 915, 1071, 0.001)}\n",
+      "WireArray(TrackID(layer=3, track=8, num=8, pitch=2), 915, 1071, 0.001)\n",
+      "6.5\n",
+      "creating layout\n",
+      "layout done\n",
+      "computing AMP_CS schematics\n",
+      "creating AMP_CS schematics\n",
+      "running lvs\n",
+      "Running tasks, Press Ctrl-C to cancel.\n",
+      "lvs passed\n",
+      "lvs log is /users/erichang/projects/bag_gen/BAG2_cds_ff_mpt/pvs_run/lvs_run_dir/DEMO_AMP_CS/AMP_CS/lvsLog_20180906_102350my93d2vr\n",
+      "computing AMP_CS_tb_dc schematics\n",
+      "creating AMP_CS_tb_dc schematics\n",
+      "computing AMP_CS_tb_ac_tran schematics\n",
+      "creating AMP_CS_tb_ac_tran schematics\n",
+      "schematic done\n",
+      "setting up AMP_CS_tb_dc\n",
+      "running simulation\n",
+      "Running tasks, Press Ctrl-C to cancel.\n",
+      "simulation done, load results\n",
+      "setting up AMP_CS_tb_ac_tran\n",
+      "running simulation\n",
+      "Running tasks, Press Ctrl-C to cancel.\n",
+      "simulation done, load results\n",
+      "all simulation done\n",
+      "loading simulation data for AMP_CS_tb_dc\n",
+      "loading simulation data for AMP_CS_tb_ac_tran\n",
+      "finish loading data\n",
+      ", gain=-3.822\n",
+      ", f_3db=3.601e+09, f_unity=9.122e+09, phase_margin=107.7\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 2 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 2 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "%matplotlib inline\n",
+    "\n",
+    "import os\n",
+    "\n",
+    "# import bag package\n",
+    "import bag\n",
+    "from bag.io import read_yaml\n",
+    "\n",
+    "# import BAG demo Python modules\n",
+    "import xbase_demo.core as demo_core\n",
+    "import xbase_demo.demo_layout.core as layout_core\n",
+    "\n",
+    "# load circuit specifications from file\n",
+    "spec_fname = os.path.join(os.environ['BAG_WORK_DIR'], 'specs_demo/demo.yaml')\n",
+    "top_specs = read_yaml(spec_fname)\n",
+    "\n",
+    "# obtain BagProject instance\n",
+    "local_dict = locals()\n",
+    "if 'bprj' in local_dict:\n",
+    "    print('using existing BagProject')\n",
+    "    bprj = local_dict['bprj']\n",
+    "else:\n",
+    "    print('creating BagProject')\n",
+    "    bprj = bag.BagProject()\n",
+    "\n",
+    "demo_core.run_flow(bprj, top_specs, 'amp_cs', layout_core.AmpCS, run_lvs=True)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "   ## Conclusion\n",
+    "   Congratulations!  You successfully walk through a BAG design flow.  In the following modules we will learn how to write simple layout and schematic generators in BAG."
+   ]
+  }
+ ],
+ "metadata": {
+  "anaconda-cloud": {},
+  "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.6.5"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/workspace_setup/tutorial_files/2_xbase_routing.ipynb b/workspace_setup/tutorial_files/2_xbase_routing.ipynb
new file mode 100644
index 0000000..3f13bb1
--- /dev/null
+++ b/workspace_setup/tutorial_files/2_xbase_routing.ipynb
@@ -0,0 +1,285 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Module 2: XBase Routing API\n",
+    "In this module, you will learn the basics about the routing grid system in XBase.  We will go over how tracks are defined, how to create wires, vias and pins, and how to define the size of a layout cell."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## XBase Routing Grid\n",
+    "\n",
+    "```yaml\n",
+    "routing_grid:\n",
+    "    layers: [4, 5, 6, 7]\n",
+    "    spaces: [0.06, 0.1, 0.12, 0.2]\n",
+    "    widths: [0.06, 0.1, 0.12, 0.2]\n",
+    "    bot_dir: 'x'\n",
+    "```\n",
+    "In XBase, all wires and vias have to be drawn on the routing grid, which is usually defined in a specification file, as shown above.  On each layer, all wires must travel in the same direction (horizontal or vertical), and wire direction alternates between each layers.  The routing grid usually starts on an intermediate layer (metal 4 in the above example), and lower layers are reserved for device primitives routing.  As seen above, different layers can define different wire pitch, with the wire pitch generally increasing as you move up the metal stack.\n",
+    "\n",
+    "All layout cell dimensions in XBase must also be quantized to the routing grid, meaning that a layout cell must contain integer number of tracks on all metal layers it uses.  Because of the difference in wire pitch, a layout cell that use more layers generally have coarser quantization compared with a layout cell that use fewer layers."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## XBase Routing Tracks\n",
+    "\n",
+    "<img src=\"bootcamp_pics/2_xbase_routing/xbase_routing_1.PNG\"  alt=\"Drawing\" style=\"width: 300px\"/>\n",
+    "The figure above shows some wires drawn in XBase.  Track pitch is the sum of unit width and space, and track number 0 is defined as the wire that's half-pitch away from left or bottom boundary.  From the figure, you can see spacing between wires follows the formula $S = sp + N \\cdot p$, where $N$ is the number of tracks in between.\n",
+    "\n",
+    "<img src=\"bootcamp_pics/2_xbase_routing/xbase_routing_2.PNG\"  alt=\"Drawing\" style=\"width: 400px\"/>\n",
+    "XBase also supports drawing thicker wires by using multiple adjacent tracks.  Wire width follows the formula $W = w + (N - 1)\\cdot p$, where $N$ is the number of tracks a wire uses.  One issue with this scheme is that even width wires wastes more space compared to odd width wires.  For example, in the above figure, although tracks 1 and 3 are empty, no wire can be drawn there because it will violate minimum spacing rule to the wire centered on track 2.  As a result, the wire on track 2 takes up 3 tracks although it is only 2 tracks wide.\n",
+    "\n",
+    "<img src=\"bootcamp_pics/2_xbase_routing/xbase_routing_3.PNG\"  alt=\"Drawing\" style=\"width: 400px\"/>\n",
+    "To work around this issues, XBase allows you to place wires on half-integer tracks.  In the above figure, the 2 tracks wide wire is moved to track 1.5 from track 2, and thus wires can still be drawn on tracks 0 and 3, making the layout more space efficient.  As an added benefit, track -0.5 is now on top of the left-most/bottom-most boundary, so it is now possible to share a wire with adjacent layout cells, such as supply wires in a custom digital standard cell."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## TrackID and WireArray\n",
+    "```python\n",
+    "class TrackID(object):\n",
+    "    def __init__(self, layer_id, track_idx, width=1, num=1, pitch=0.0):\n",
+    "        #type: (int, Union[float, int], int, int, Union[float, int]) -> None\n",
+    "        \n",
+    "class WireArray(object):\n",
+    "    def __init__(self, track_id, lower, upper):\n",
+    "        #type: (TrackID, float, float) -> None\n",
+    "```\n",
+    "\n",
+    "Routing track locations are represented by the `TrackID` Python object.  It has built-in support for drawing a multi-wire bus by specifying the optional `num` and `pitch` parameters, which defines the number of wires in the bus and the number of track pitches between adjacent wires.  The `layer_id` parameter specifies the routing layer ID, the `track_idx` parameter specifies the track index of the left-most/bottom-most wire, and `width` specifies the number of tracks a single wire uses.\n",
+    "\n",
+    "Physical wires in XBase are represented by the `WireArray` Python object.  It contains a `TrackID` object describes the location of the wires, and `lower` and `upper` attributes describes the starting and ending coordinate of those wires along the track.  For example, a horizontal wire starting at $x = 0.5$ um and ending at $x = 3.0$ um will have `lower = 0.5`, and `upper = 3.0`.\n",
+    "\n",
+    "One last note is that layout pins can only be added on `WireArray` objects.  This guarantees that pins of a layout cell will always be on the routing grid."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## BAG Layout Generation Code\n",
+    "```python\n",
+    "def gen_layout(prj, specs, dsn_name, demo_class):\n",
+    "    # get information from specs\n",
+    "    dsn_specs = specs[dsn_name]\n",
+    "    impl_lib = dsn_specs['impl_lib']\n",
+    "    layout_params = dsn_specs['layout_params']\n",
+    "    gen_cell = dsn_specs['gen_cell']\n",
+    "\n",
+    "    # create layout template database\n",
+    "    tdb = make_tdb(prj, specs, impl_lib)\n",
+    "    # compute layout\n",
+    "    print('computing layout')\n",
+    "    # template = tdb.new_template(params=layout_params, temp_cls=temp_cls)\n",
+    "    template = tdb.new_template(params=layout_params, temp_cls=demo_class)\n",
+    "\n",
+    "    # create layout in OA database\n",
+    "    print('creating layout')\n",
+    "    tdb.batch_layout(prj, [template], [gen_cell])\n",
+    "    # return corresponding schematic parameters\n",
+    "    print('layout done')\n",
+    "    return template.sch_params\n",
+    "```\n",
+    "The above code snippet (taking from `xbase_demo.core` module) shows how layout is generated.  First, user create a layout database object, which keeps track of layout hierarchy.  Then, user uses the layout database object to create new layout instances given layout generator class and parameters.  Finally, layout database uses `BagProject` instance to create the generated layouts in Virtuoso.  The generated layout will also contain the corresponding schematic parameters, which can be passed to schematic generator later."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## BAG TemplateDB Creation Code\n",
+    "```python\n",
+    "def make_tdb(prj, specs, impl_lib):\n",
+    "    grid_specs = specs['routing_grid']\n",
+    "    layers = grid_specs['layers']\n",
+    "    spaces = grid_specs['spaces']\n",
+    "    widths = grid_specs['widths']\n",
+    "    bot_dir = grid_specs['bot_dir']\n",
+    "\n",
+    "    # create RoutingGrid object\n",
+    "    routing_grid = RoutingGrid(prj.tech_info, layers, spaces, widths, bot_dir)\n",
+    "    # create layout template database\n",
+    "    tdb = TemplateDB('template_libs.def', routing_grid, impl_lib, use_cybagoa=True)\n",
+    "    return tdb\n",
+    "```\n",
+    "For reference, the above code snippet shows how the layout database object is created.  A `RoutingGrid` object is created from routing grid parameters specified in the specification file, which is then used to construct the `TemplateDB` layout database object."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Routing Example\n",
+    "\n",
+    "The code box below defines a `RoutingDemo` layout generator class, which is a simply layout containing only wires, vias, and pins.  All layout creation happens in the `draw_layout()` function, the functions/attributes of interests are:\n",
+    "\n",
+    "* `add_wires()`:  Create one or more physical wires, with the given options.\n",
+    "* `connect_to_tracks()`: Connect two `WireArray`s on adjacent layers by extending them to their intersection and adding vias.\n",
+    "* `connnect_wires()`: Connect multiple `WireArrays` on the same layer together.  \n",
+    "* `add_pin()`: Add a pin object on top of a `WireArray` object.\n",
+    "* `self.size`: A 3-tuple describing the size of this layout cell.\n",
+    "* `self.bound_box`: A `BBox` object representing the bounding box of this layout cell, computed from `self.size`.\n",
+    "\n",
+    "To see the layout in action, evaluate the code box below by selecting the cell and pressing Ctrl+Enter.  A `DEMO_ROUTING` library will be created in Virtuoso with a single `ROUTING_DEMO` layout cell in it.  Feel free to play around with the numbers and re-evaluating the cell, and the layout in Virtuoso should update.\n",
+    "\n",
+    "Exercise 1: There are currently 3 wires labeled \"pin3\".  Change that to 4 wires by adding an extra wire with the same pitch on the right.\n",
+    "\n",
+    "Exercise 2: Connect all wires labeled \"pin3\" to the wire labeled \"pin1\".  Hint: use `connect_to_tracks()` and `connect_wires()`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "using existing BagProject\n",
+      "computing layout\n",
+      "WireArray(TrackID(layer=4, track=0), 0.1, 0.3)\n",
+      "0.1 0.2 0.3\n",
+      "TrackID(layer=4, track=0)\n",
+      "WireArray(TrackID(layer=5, track=6, num=3, pitch=2), 0.1, 0.4)\n",
+      "WireArray(TrackID(layer=5, track=3, width=2), 0.042, 0.75)\n",
+      "BBox(0.000, 0.000, 1.980, 0.864)\n",
+      "creating layout\n",
+      "layout done\n"
+     ]
+    }
+   ],
+   "source": [
+    "from bag.layout.routing import TrackID\n",
+    "from bag.layout.template import TemplateBase\n",
+    "\n",
+    "\n",
+    "class RoutingDemo(TemplateBase):\n",
+    "    def __init__(self, temp_db, lib_name, params, used_names, **kwargs):\n",
+    "        super(RoutingDemo, self).__init__(temp_db, lib_name, params, used_names, **kwargs)\n",
+    "\n",
+    "    @classmethod\n",
+    "    def get_params_info(cls):\n",
+    "        return {}\n",
+    "\n",
+    "    def draw_layout(self):\n",
+    "        # Metal 4 is horizontal, Metal 5 is vertical\n",
+    "        hm_layer = 4\n",
+    "        vm_layer = 5\n",
+    "\n",
+    "        # add a horizontal wire on track 0, from X=0.1 to X=0.3\n",
+    "        warr1 = self.add_wires(hm_layer, 0, 0.1, 0.3)\n",
+    "        # print WireArray object\n",
+    "        print(warr1)\n",
+    "        # print lower, middle, and upper coordinate of wire.\n",
+    "        print(warr1.lower, warr1.middle, warr1.upper)\n",
+    "        # print TrackID object associated with WireArray\n",
+    "        print(warr1.track_id)\n",
+    "\n",
+    "        # add a horizontal wire on track 1, from X=0.1 to X=0.3,\n",
+    "        # coordinates specified in resolution units\n",
+    "        warr2 = self.add_wires(hm_layer, 1, 100, 300, unit_mode=True)\n",
+    "\n",
+    "        # add another wire on track 1, from X=0.35 to X=0.45\n",
+    "        warr2_ext = self.add_wires(hm_layer, 1, 350, 450, unit_mode=True)\n",
+    "        # connect wires on the same track, in this case warr2 and warr2_ext\n",
+    "        self.connect_wires([warr2, warr2_ext])\n",
+    "        \n",
+    "        # add a horizontal wire on track 2.5, from X=0.2 to X=0.4\n",
+    "        self.add_wires(hm_layer, 2.5, 200, 400, unit_mode=True)\n",
+    "        # add a horizontal wire on track 4, from X=0.2 to X=0.4, with 2 tracks wide\n",
+    "        warr3 = self.add_wires(hm_layer, 4, 200, 400, width=2, unit_mode=True)\n",
+    "\n",
+    "        # add 3 parallel vertical wires starting on track 6 and use every other track\n",
+    "        warr4 = self.add_wires(vm_layer, 6, 100, 400, num=3, pitch=2, unit_mode=True)\n",
+    "        print(warr4)\n",
+    "        \n",
+    "        # create a TrackID object representing a vertical track\n",
+    "        tid = TrackID(vm_layer, 3, width=2, num=1, pitch=0)\n",
+    "        # connect horizontal wires to the vertical track\n",
+    "        warr5 = self.connect_to_tracks([warr1, warr3], tid)\n",
+    "        print(warr5)\n",
+    "\n",
+    "        # add a pin on a WireArray\n",
+    "        self.add_pin('pin1', warr1)\n",
+    "        # add a pin, but make label different than net name.  Useful for LVS connect\n",
+    "        self.add_pin('pin2', warr2, label='pin2:')\n",
+    "        # add_pin also works for WireArray representing multiple wires\n",
+    "        self.add_pin('pin3', warr4)\n",
+    "        # add a pin (so it is visible in BAG), but do not create the actual layout\n",
+    "        # in OA.  This is useful for hiding pins on lower levels of hierarchy.\n",
+    "        self.add_pin('pin4', warr3, show=False)\n",
+    "\n",
+    "        # set the size of this template\n",
+    "        top_layer = vm_layer\n",
+    "        num_h_tracks = 6\n",
+    "        num_v_tracks = 11\n",
+    "        # size is 3-element tuple of top layer ID, number of top\n",
+    "        # vertical tracks, and number of top horizontal tracks\n",
+    "        self.size = top_layer, num_v_tracks, num_h_tracks\n",
+    "        # print bounding box of this template\n",
+    "        print(self.bound_box)\n",
+    "        # add a M7 rectangle to visualize bounding box in layout\n",
+    "        self.add_rect('M7', self.bound_box)\n",
+    "        \n",
+    "\n",
+    "import os\n",
+    "\n",
+    "# import bag package\n",
+    "import bag\n",
+    "from bag.io import read_yaml\n",
+    "\n",
+    "# import BAG demo Python modules\n",
+    "import xbase_demo.core as demo_core\n",
+    "\n",
+    "# load circuit specifications from file\n",
+    "spec_fname = os.path.join(os.environ['BAG_WORK_DIR'], 'specs_demo/demo.yaml')\n",
+    "top_specs = read_yaml(spec_fname)\n",
+    "\n",
+    "# obtain BagProject instance\n",
+    "local_dict = locals()\n",
+    "if 'bprj' in local_dict:\n",
+    "    print('using existing BagProject')\n",
+    "    bprj = local_dict['bprj']\n",
+    "else:\n",
+    "    print('creating BagProject')\n",
+    "    bprj = bag.BagProject()\n",
+    "\n",
+    "demo_core.routing_demo(bprj, top_specs, RoutingDemo)"
+   ]
+  }
+ ],
+ "metadata": {
+  "anaconda-cloud": {},
+  "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.6.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/workspace_setup/tutorial_files/3_analogbase.ipynb b/workspace_setup/tutorial_files/3_analogbase.ipynb
new file mode 100644
index 0000000..d6c0215
--- /dev/null
+++ b/workspace_setup/tutorial_files/3_analogbase.ipynb
@@ -0,0 +1,662 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# AnalogBase\n",
+    "In this module, you will learn the basics of `AnalogBase`, and how to design a source-follower layout generator using AnalogBase.\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## What is AnalogBase?\n",
+    "<img src=\"bootcamp_pics/3_analogbase/analogbase_1.PNG\" alt=\"Drawing\" style=\"width: 200px;\" />\n",
+    "`AnalogBase` is one of several \"layout floorplan\" classes that allows designers to easily develop process-portable layout generator for various electromigration-constrained circuits.  To do so, `AnalogBase` draws rows of transistors with substrate contacts on the top-most and bottom-most rows, as shown in the figure above.  In this floorplan, the number of current-carrying wires scales naturally with number of fingers, which is optimal for circuits with large bias currents.\n",
+    "\n",
+    "By convention, `AnalogBase` draws $N$ rows of NMOS (labeled as `nch`) and $P$ rows of PMOS (labeled as `pch`), with $N$ and $P$ being nonnegative integers, so you can only draw NMOS rows by setting $P=0$, and so on.  The rows are indexed from bottom to top, so `nch(N-1)` is the top-most NMOS row, and `pch0` is the bottom-most PMOS row.\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Transistor Source/Drain Naming Convention\n",
+    "<img src=\"bootcamp_pics/3_analogbase/analogbase_3.PNG\" alt=\"Drawing\" style=\"width: 600px;\"/>\n",
+    "Before we talk about how `AnalogBase` draws transistor connections, we need to establish a naming convention for source/drain junctions of a transistor, since source and drain are often interchangeable.  In XBase, the left-most source/drain junction of a transistor is always called \"source\", and after that source and drain alternates between each other, as shown in the above figure.  This implies that for even number of fingers, the right-most junction is always \"source\", and for odd number of fingers, the left-most junction is always \"drain\"."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## AnalogMosConn Overview\n",
+    "<img src=\"bootcamp_pics/3_analogbase/analogbase_2.PNG\" alt=\"Drawing\" style=\"width: 600px;\"/>\n",
+    "To connect transistors to the routing grid, `AnalogBase` \"drops\" `AnalogMosConn`, a layout cell consisting only of wires and vias, on top of desired transistors to connect gates, sources, and drains to a vertical routing layer.  For most technologies, `AnalogMosConn` draws gate, drain, and source wires on every other source/drain junction, with drain and source wires interleaving with each other.  By default, the gate wires are drawn below the transistor row, to draw gate wires above the transistor row, flip the row upside down by changing the row orientation from `R0` to `MX` (we will see an example of this later).\n",
+    "\n",
+    "With this layout style, the gate wires can either be drawn in the same tracks as source wires (\"G aligned to S\"), or they can be drawn in the same tracks as drain wires (\"G aligned to D\"). The gate wire location is usually determined by source/drain wire direction.  For example, in the figure above, if the source of a transistor needs to be connected to the row below it, then gate wires cannot be aligned to source, as this will cause a short between gate and source wires when the source wires is extended downwards.  Because of this, when creating a `AnalogMosConn`, designer needs to specify the drain and source wire directions (whether they go \"up\" or \"down\"), and the gate wire locations will be determined automatically to avoid shorts."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Connecting to Horizontal Tracks\n",
+    "<img src=\"bootcamp_pics/3_analogbase/analogbase_4.PNG\" alt=\"Drawing\" style=\"width: 300px;\"/>\n",
+    "In the previous section, we see that `AnalogMosConn` connects the transistor to vertical tracks.  How do we connect those vertical wires to the horizontal tracks above it?  If you recall from the previous module, you would need to use the `connect_to_tracks()` method with the horizontal track index.  The question now becomes: how do I know which track index can be used for gate/drain/source connections?\n",
+    "\n",
+    "To get a better understanding of this problem, consider the layout shown in the figure above.  The PMOS drain wires can be easily connected to track 10 with no issues, but the PMOS gate wires cannot be connected to track 10 without shorting with drain wires.  In fact, the PMOS gate wires can only be connected to tracks 5, 6, and 7 without running into minimum line-end spacing rules with other wires.  How can we determine what the legal track indices are?  Furthermore, if our particular circuit requires more than 3 horizontal tracks for PMOS gate connections, how can we tell `AnalogBase` to space the rows further apart?\n",
+    "\n",
+    "<img src=\"bootcamp_pics/3_analogbase/analogbase_5.PNG\"  alt=\"Drawing\" style=\"width: 300px;\"/>\n",
+    "To address these issues, `AnalogBase` introduces the concept of relative track indices, as shown in the figure above.  `AnalogBase` categorizes each horizontal tracks by the transistor row it belongs to, and by whether it can be connected to the gate/drain/source wires without DRC errors.  \n",
+    "\n",
+    "In each row, `g0` is the horizontal track furthest from the transistor row that can be connected to the gate wires without errors, and the index increases as the wire moves closer to the transistor.  `ds0` is the horizontal track closest to the transistor row (perhaps on top of it) that can be connected to the drain/source wires without errors, and the index increases as the wire moves away from the transistor.\n",
+    "\n",
+    "`AnalogBase` provides two methods to convert relative track indices to absolute track numbers, which can then be passed to `connect_to_tracks()` method to draw the connections.  Using the figure above as an example, `self.get_track_index('pch', 0, 'g', 1)` will returns the track number of the horizontal track at PMOS row 0, gate type, index 1, which is track number 5.  `self.make_track_id('pch', 0, 'g', 1)` will return the corresponding `TrackID` object instead.\n",
+    "\n",
+    "Finally, designer can specify the number of horizontal tracks needed for gate/drain/source connections on each row, and `AnalogBase` will automatically move rows further apart if necessary."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## CS Amplifier Layout Example\n",
+    "<img src=\"bootcamp_pics/3_analogbase/analogbase_6.PNG\" alt=\"Drawing\" style=\"width: 400px;\"/>\n",
+    "Now that you have a general idea of how `AnalogBase` works, lets walk through a common-source amplifier example.  The figure above shows a rough sketch of the layout floorplan (**NOTE: ALWAYS DRAW FLOORPLAN BEFORE CODING!**).  We have one NMOS row on the bottom, one PMOS row on the top, and we put extra dummy transistors on both sides to reduce edge layout effects.  The input connects to NMOS gates from below the NMOS row, the PMOS bias connects to PMOS gates from above the PMOS row, and the output drain/source of NMOS/PMOS are connected to a horizontal track between the two rows.  Finally, the supply drain/source wires are extended and shorted on top of the substrate contacts on both ends.\n",
+    "\n",
+    "The entire common-source amplifier layout generator code is reproduced below.  We will walk through important sections of the code and describe what they do.\n",
+    "\n",
+    "```python\n",
+    "class AmpCS(AnalogBase):\n",
+    "    \"\"\"A common source amplifier.\"\"\"\n",
+    "    def __init__(self, temp_db, lib_name, params, used_names, **kwargs):\n",
+    "        AnalogBase.__init__(self, temp_db, lib_name, params, used_names, **kwargs)\n",
+    "        self._sch_params = None\n",
+    "\n",
+    "    @property\n",
+    "    def sch_params(self):\n",
+    "        return self._sch_params\n",
+    "\n",
+    "    @classmethod\n",
+    "    def get_params_info(cls):\n",
+    "        \"\"\"Returns a dictionary containing parameter descriptions.\n",
+    "\n",
+    "        Override this method to return a dictionary from parameter names to descriptions.\n",
+    "\n",
+    "        Returns\n",
+    "        -------\n",
+    "        param_info : dict[str, str]\n",
+    "            dictionary from parameter name to description.\n",
+    "        \"\"\"\n",
+    "        return dict(\n",
+    "            lch='channel length, in meters.',\n",
+    "            w_dict='width dictionary.',\n",
+    "            intent_dict='intent dictionary.',\n",
+    "            fg_dict='number of fingers dictionary.',\n",
+    "            ndum='number of dummies on each side.',\n",
+    "            ptap_w='NMOS substrate width, in meters/number of fins.',\n",
+    "            ntap_w='PMOS substrate width, in meters/number of fins.',\n",
+    "            show_pins='True to draw pin geometries.',\n",
+    "        )\n",
+    "\n",
+    "    def draw_layout(self):\n",
+    "        \"\"\"Draw the layout of a transistor for characterization.\n",
+    "        \"\"\"\n",
+    "\n",
+    "        lch = self.params['lch']\n",
+    "        w_dict = self.params['w_dict']\n",
+    "        intent_dict = self.params['intent_dict']\n",
+    "        fg_dict = self.params['fg_dict']\n",
+    "        ndum = self.params['ndum']\n",
+    "        ptap_w = self.params['ptap_w']\n",
+    "        ntap_w = self.params['ntap_w']\n",
+    "        show_pins = self.params['show_pins']\n",
+    "\n",
+    "        fg_amp = fg_dict['amp']\n",
+    "        fg_load = fg_dict['load']\n",
+    "\n",
+    "        if fg_load % 2 != 0 or fg_amp % 2 != 0:\n",
+    "            raise ValueError('fg_load=%d and fg_amp=%d must all be even.' % (fg_load, fg_amp))\n",
+    "\n",
+    "        # compute total number of fingers in each row\n",
+    "        fg_half_pmos = fg_load // 2\n",
+    "        fg_half_nmos = fg_amp // 2\n",
+    "        fg_half = max(fg_half_pmos, fg_half_nmos)\n",
+    "        fg_tot = (fg_half + ndum) * 2\n",
+    "\n",
+    "        # specify width/threshold of each row\n",
+    "        nw_list = [w_dict['amp']]\n",
+    "        pw_list = [w_dict['load']]\n",
+    "        nth_list = [intent_dict['amp']]\n",
+    "        pth_list = [intent_dict['load']]\n",
+    "\n",
+    "        # specify number of horizontal tracks for each row\n",
+    "        ng_tracks = [1]  # input track\n",
+    "        nds_tracks = [1]  # one track for space\n",
+    "        pds_tracks = [1]  # output track\n",
+    "        pg_tracks = [1]  # bias track\n",
+    "\n",
+    "        # specify row orientations\n",
+    "        n_orient = ['R0']  # gate connection on bottom\n",
+    "        p_orient = ['MX']  # gate connection on top\n",
+    "\n",
+    "        self.draw_base(lch, fg_tot, ptap_w, ntap_w, nw_list,\n",
+    "                       nth_list, pw_list, pth_list,\n",
+    "                       ng_tracks=ng_tracks, nds_tracks=nds_tracks,\n",
+    "                       pg_tracks=pg_tracks, pds_tracks=pds_tracks,\n",
+    "                       n_orientations=n_orient, p_orientations=p_orient,\n",
+    "                       )\n",
+    "\n",
+    "        # figure out if output connects to drain or source of nmos\n",
+    "        if (fg_amp - fg_load) % 4 == 0:\n",
+    "            s_net, d_net = '', 'vout'\n",
+    "            aout, aoutb, nsdir, nddir = 'd', 's', 0, 2\n",
+    "        else:\n",
+    "            s_net, d_net = 'vout', ''\n",
+    "            aout, aoutb, nsdir, nddir = 's', 'd', 2, 0\n",
+    "\n",
+    "        # create transistor connections\n",
+    "        load_col = ndum + fg_half - fg_half_pmos\n",
+    "        amp_col = ndum + fg_half - fg_half_nmos\n",
+    "        amp_ports = self.draw_mos_conn('nch', 0, amp_col, fg_amp, nsdir, nddir,\n",
+    "                                       s_net=s_net, d_net=d_net)\n",
+    "        load_ports = self.draw_mos_conn('pch', 0, load_col, fg_load, 2, 0,\n",
+    "                                        s_net='', d_net='vout')\n",
+    "        # amp_ports/load_ports are dictionaries of WireArrays representing\n",
+    "        # transistor ports.\n",
+    "        print(amp_ports)\n",
+    "        print(amp_ports['g'])\n",
+    "\n",
+    "        # create TrackID from relative track index\n",
+    "        vin_tid = self.make_track_id('nch', 0, 'g', 0)\n",
+    "        vbias_tid = self.make_track_id('pch', 0, 'g', 0)\n",
+    "        # can also convert from relative to absolute track index\n",
+    "        print(self.get_track_index('nch', 0, 'g', 0))\n",
+    "        # get output track index, put it in the middle\n",
+    "        vout_bot = self.get_track_index('nch', 0, 'ds', 0)\n",
+    "        vout_top = self.get_track_index('pch', 0, 'ds', 0)\n",
+    "        vout_index = self.grid.get_middle_track(vout_bot, vout_top, round_up=True)\n",
+    "        vout_tid = TrackID(self.mos_conn_layer + 1, vout_index)\n",
+    "\n",
+    "        vin_warr = self.connect_to_tracks(amp_ports['g'], vin_tid)\n",
+    "        vout_warr = self.connect_to_tracks([amp_ports[aout], load_ports['d']], vout_tid)\n",
+    "        vbias_warr = self.connect_to_tracks(load_ports['g'], vbias_tid)\n",
+    "        self.connect_to_substrate('ptap', amp_ports[aoutb])\n",
+    "        self.connect_to_substrate('ntap', load_ports['s'])\n",
+    "\n",
+    "        vss_warrs, vdd_warrs = self.fill_dummy()\n",
+    "\n",
+    "        self.add_pin('VSS', vss_warrs, show=show_pins)\n",
+    "        self.add_pin('VDD', vdd_warrs, show=show_pins)\n",
+    "        self.add_pin('vin', vin_warr, show=show_pins)\n",
+    "        self.add_pin('vout', vout_warr, show=show_pins)\n",
+    "        self.add_pin('vbias', vbias_warr, show=show_pins)\n",
+    "\n",
+    "        # compute schematic parameters\n",
+    "        self._sch_params = dict(\n",
+    "            lch=lch,\n",
+    "            w_dict=w_dict,\n",
+    "            intent_dict=intent_dict,\n",
+    "            fg_dict=fg_dict,\n",
+    "            dum_info=self.get_sch_dummy_info(),\n",
+    "        )\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Class Definition\n",
+    "```python\n",
+    "class AmpCS(AnalogBase):\n",
+    "    \"\"\"A common source amplifier.\"\"\"\n",
+    "    def __init__(self, temp_db, lib_name, params, used_names, **kwargs):\n",
+    "        AnalogBase.__init__(self, temp_db, lib_name, params, used_names, **kwargs)\n",
+    "        self._sch_params = None\n",
+    "        \n",
+    "        @property\n",
+    "        def sch_params(self):\n",
+    "            return self._sch_params\n",
+    "```\n",
+    "The layout generator code starts with the Python class definition.  We subclass the `AnalogBase` class to inherit various functions described earlier.  The constructor doesn't do much besides calling the super constructor and initializing a private attribute.  Finally, we declare a read-only property, `sch_params`, which we will compute later.  It contains the schematic parameters for the schematic generator we will see in the next module."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "collapsed": true
+   },
+   "source": [
+    "## Parameter Specifications\n",
+    "```python\n",
+    "@classmethod\n",
+    "def get_params_info(cls):\n",
+    "        \"\"\"Returns a dictionary containing parameter descriptions.\n",
+    "        Override this method to return a dictionary from parameter names to descriptions.\n",
+    "        Returns\n",
+    "        -------\n",
+    "        param_info : dict[str, str]\n",
+    "            dictionary from parameter name to description.\n",
+    "        \"\"\"\n",
+    "        return dict(\n",
+    "            lch='channel length, in meters.',\n",
+    "            w_dict='width dictionary.',\n",
+    "            intent_dict='intent dictionary.',\n",
+    "            fg_dict='number of fingers dictionary.',\n",
+    "            ndum='number of dummies on each side.',\n",
+    "            ptap_w='NMOS substrate width, in meters/number of fins.',\n",
+    "            ntap_w='PMOS substrate width, in meters/number of fins.',\n",
+    "            show_pins='True to draw pin geometries.',\n",
+    "        )\n",
+    "```\n",
+    "Next we have a class method, `get_params_info()`, that simply returns a Python dictionary from layout parameter names to a brief description of the corresponding parameter.  This method should list all layout parameters, and it is used to determine to compute a unique ID to represent the generated instance.  This allows XBase to avoid re-generating existing layouts when constructing a complex layout hierarchy with many duplicate layout instances."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## How many fingers in a row?\n",
+    "Next, in the `draw_layout()` method is where all the layout generation happens.  The beginning is rather straight-forward, then we get to the following section:\n",
+    "```python\n",
+    " # compute total number of fingers in each row\n",
+    "fg_half_pmos = fg_load // 2\n",
+    "fg_half_nmos = fg_amp // 2\n",
+    "fg_half = max(fg_half_pmos, fg_half_nmos)\n",
+    "fg_tot = (fg_half + ndum) * 2\n",
+    "```\n",
+    "This section computes how many fingers we need to draw in each transistor row.  To get a better understanding, consider the two scenarios below:\n",
+    "<img src=\"bootcamp_pics/3_analogbase/analogbase_7.PNG\" alt=\"Drawing\" style=\"width: 600px;\" />\n",
+    "Since `AnalogBase` must draw the same number of fingers for each row, we see that total number of fingers in each row depends on whether the AMP transistor or the LOAD transistor has more fingers.  We resolve this by using the `max()` function to get the larger of the two."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Drawing Transistor Rows\n",
+    "```python\n",
+    "# specify width/threshold of each row\n",
+    "nw_list = [w_dict['amp']]\n",
+    "pw_list = [w_dict['load']]\n",
+    "nth_list = [intent_dict['amp']]\n",
+    "pth_list = [intent_dict['load']]\n",
+    "\n",
+    "# specify number of horizontal tracks for each row\n",
+    "ng_tracks = [1]  # input track\n",
+    "nds_tracks = [1]  # one track for space\n",
+    "pds_tracks = [1]  # output track\n",
+    "pg_tracks = [1]  # bias track\n",
+    "\n",
+    "# specify row orientations\n",
+    "n_orient = ['R0'] # gate connection on bottom\n",
+    "p_orient = ['MX'] # gate connection on top\n",
+    "\n",
+    "self.draw_base(lch, fg_tot, ptap_w, ntap_w, nw_list,\n",
+    "               nth_list, pw_list, pth_list,\n",
+    "               ng_tracks=ng_tracks, nds_tracks=nds_tracks,\n",
+    "               pg_tracks=pg_tracks, pds_tracks=pds_tracks,\n",
+    "               n_orientations=n_orient, p_orientations=p_orient,\n",
+    "               )\n",
+    "```\n",
+    "This section specifies the layout parameters for each row, then calls the `draw_base()` method in `AnalogBase` to draw the transistor and substrate contact rows.  Note that the PMOS row orientation is set to `MX` so that `AnalogMosConn` will draw gate wires on the top of PMOS row."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Is output on source or drain?\n",
+    "```python\n",
+    "# figure out if output connects to drain or source of nmos\n",
+    "if (fg_amp - fg_load) % 4 == 0:\n",
+    "    aout, aoutb, nsdir, nddir = 'd', 's', 0, 2\n",
+    "else:\n",
+    "    aout, aoutb, nsdir, nddir = 's', 'd', 2, 0\n",
+    "```\n",
+    "This section determines if the output should connect to drain or source of the nmos transistor, and as the result what should the nmos source/drain wire directions be.  To see why this is necessary, consider the two cases shown below:\n",
+    "<img src=\"bootcamp_pics/3_analogbase/analogbase_8.PNG\" alt=\"Drawing\" style=\"width: 600px;\" />\n",
+    "In both cases, we have 8 PMOS fingers, and 4 or 6 NMOS fingers, respectively.  To make life simpler, we decide to always connect the output wires to PMOS drain (if you expect PMOS to always be larger, this gives you less parasitic capacitance).  Furthermore, to have better symmetric, we align the center of the PMOS and NMOS transistors.  Then, to minimize interconnect resistance, we should connect output to the NMOS junction that is aligned to PMOS drain.  If we check the above figure, we see that the corresponding NMOS junction is drain when NMOS has 4 fingers, but it is source when NMOS has 6 fingers!  This means that the correct NMOS junction to connect to actually depends on both `fg_amp` and `fg_load`.  By sketching a few example, you should be able to figure out that we need to connect output to NMOS drain if the difference in number of fingers is a multiple of 4, and connect output to NMOS drain otherwise.  This is exactly what this section of code does."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Drawing Transistor Connections\n",
+    "```python\n",
+    "# create transistor connections\n",
+    "load_col = ndum + fg_half - fg_half_pmos\n",
+    "amp_col = ndum + fg_half - fg_half_nmos\n",
+    "amp_ports = self.draw_mos_conn('nch', 0, amp_col, fg_amp, nsdir, nddir,\n",
+    "                               s_net=s_net, d_net=d_net)\n",
+    "load_ports = self.draw_mos_conn('pch', 0, load_col, fg_load, 2, 0,\n",
+    "                                s_net='', d_net='vout')\n",
+    "# amp_ports/load_ports are dictionaries of WireArrays representing\n",
+    "# transistor ports.\n",
+    "print(amp_ports)\n",
+    "print(amp_ports['g'])\n",
+    "```\n",
+    "Now we are ready to draw the actual transistor connections.  To do so, we use the `draw_mos_conn()` function.  As an example, `self.draw_mos_conn('pch', 0, load_col, fg_load, 2, 0)` creates an `AnalogMosConn` object on top of PMOS row 0, starting at transistor index `load_col` (with index 0 being left-most transistor), using `fg_load` fingers to the right, with source going up (code 2) and drain going down (code 0).  Remember that the source/drain directions are used to determine gate wires location.\n",
+    "\n",
+    "The optional parameters `s_net` and `d_net` specify the net names of the source and drain of the transistor drawn, respectively.  By default, if these are not specified (or set to empty strings), AnalogBase assume they connect to VDD for PMOS or VSS for NMOS.  These parameters are used to infer dummy transistor schematic to simplify the process of generating LVS-clean schematics.\n",
+    "\n",
+    "the `draw_mos_conn()` method will return a dictionary from the strings `'g'`, `'d'`, and `'s'` to the `WireArray` objects for the corresponding vertical wires."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Connecting Wires\n",
+    "```python\n",
+    "# create TrackID from relative track index\n",
+    "vin_tid = self.make_track_id('nch', 0, 'g', 0)\n",
+    "vout_tid = self.make_track_id('pch', 0, 'ds', 0)\n",
+    "vbias_tid = self.make_track_id('pch', 0, 'g', 0)\n",
+    "# can also convert from relative to absolute track index\n",
+    "print(self.get_track_index('nch', 0, 'g', 0))\n",
+    "\n",
+    "vin_warr = self.connect_to_tracks(amp_ports['g'], vin_tid)\n",
+    "vout_warr = self.connect_to_tracks([amp_ports[aout], load_ports['d']], vout_tid)\n",
+    "vbias_warr = self.connect_to_tracks(load_ports['g'], vbias_tid)\n",
+    "self.connect_to_substrate('ptap', amp_ports[aoutb])\n",
+    "self.connect_to_substrate('ntap', load_ports['s'])\n",
+    "```\n",
+    "This section used the `make_track_id()` and `get_track_index()` methods described before to get horizontal track indices from relative index.  We then use `connect_to_tracks()` to connect wires to the desired tracks.  `connect_to_substrate()` method is used to connect transistor junctions to the specified substrate contacts."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Dummies and Pins\n",
+    "```python\n",
+    "vss_warrs, vdd_warrs = self.fill_dummy()\n",
+    "\n",
+    "self.add_pin('VSS', vss_warrs, show=show_pins)\n",
+    "self.add_pin('VDD', vdd_warrs, show=show_pins)\n",
+    "self.add_pin('vin', vin_warr, show=show_pins)\n",
+    "self.add_pin('vout', vout_warr, show=show_pins)\n",
+    "self.add_pin('vbias', vbias_warr, show=show_pins)\n",
+    "```\n",
+    "After all connections are made, the `fill_dummy()` method can be used to automatically connect all unconnected transistors to corresponding substrate contacts as dummy transistors.  `add_pin()` function is used to add layout pins, as seem from the routing demo module."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Schematic Parameters\n",
+    "```python\n",
+    "# compute schematic parameters\n",
+    "self._sch_params = dict(\n",
+    "    lch=lch,\n",
+    "    w_dict=w_dict,\n",
+    "    intent_dict=intent_dict,\n",
+    "    fg_dict=fg_dict,\n",
+    "    dum_info=self.get_sch_dummy_info(),\n",
+    ")\n",
+    "```\n",
+    "Finally, we compute the schematic parameter dictionary, which will be used with the schematic generator later to produce LVS clean schematic.  The `get_sch_dummy_info()` method will return a data structure that describes all the dummy transistors in this AnalogBase.  This data structure will be used by the schematic generator to create the corresponding transistors."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## SF Amplifier Exercise\n",
+    "Now that you understand how the common-source amplifier layout generator works, try to complete the following source-follower amplifier class by filling in missing codes.  The floorplan for the source-follower amplifier is drawn for you below:\n",
+    "<img src=\"bootcamp_pics/3_analogbase/analogbase_9.PNG\" alt=\"Drawing\" style=\"width: 400px;\"/>\n",
+    "Notice that:\n",
+    "* we have two rows of NMOS.\n",
+    "* Gate connection is on the top for second row\n",
+    "* To minimize parasitics, we will use leave 1 horizontal track empty between vin and VDD.\n",
+    "\n",
+    "You can evaluate the next cell (Press Ctrl+Enter) to see a preliminary layout of the source follower.  It will also run LVS after generating the layout, which will fail if your layout is not correct."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "creating BagProject\n",
+      "computing layout\n",
+      "ext_w0 = 1, ext_wend=7, ytop=2880\n",
+      "ext_w0 = 2, ext_wend=9, ytop=3024\n",
+      "final: ext_w0 = 1, ext_wend=7, ytop=2880\n",
+      "creating layout\n",
+      "layout done\n",
+      "computing AMP_SF schematics\n"
+     ]
+    },
+    {
+     "ename": "TypeError",
+     "evalue": "design() argument after ** must be a mapping, not NoneType",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[1;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
+      "\u001b[1;32m<ipython-input-1-6182a9967843>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m    178\u001b[0m     \u001b[0mbprj\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mbag\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mBagProject\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    179\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 180\u001b[1;33m \u001b[0mdemo_core\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun_flow\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mbprj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtop_specs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'amp_sf_soln'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mAmpSF\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrun_lvs\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlvs_only\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[1;32m~/projects/bag_gen/BAG2_cds_ff_mpt/BAG_XBase_demo/xbase_demo/core.py\u001b[0m in \u001b[0;36mrun_flow\u001b[1;34m(prj, specs, dsn_name, lay_cls, sch_cls, run_lvs, lvs_only)\u001b[0m\n\u001b[0;32m    376\u001b[0m     \u001b[1;31m# generate design/testbench schematics\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    377\u001b[0m     gen_schematics(prj, specs, dsn_name, dsn_sch_params, sch_cls=sch_cls,\n\u001b[1;32m--> 378\u001b[1;33m                    check_lvs=run_lvs, lvs_only=lvs_only)\n\u001b[0m\u001b[0;32m    379\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    380\u001b[0m     \u001b[1;32mif\u001b[0m \u001b[0mlvs_only\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
+      "\u001b[1;32m~/projects/bag_gen/BAG2_cds_ff_mpt/BAG_XBase_demo/xbase_demo/core.py\u001b[0m in \u001b[0;36mgen_schematics\u001b[1;34m(prj, specs, dsn_name, sch_params, sch_cls, check_lvs, lvs_only)\u001b[0m\n\u001b[0;32m     99\u001b[0m         \u001b[0mdsn\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mprj\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcreate_design_module\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msch_lib\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msch_cell\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    100\u001b[0m         \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'computing %s schematics'\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0mgen_cell\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 101\u001b[1;33m         \u001b[0mdsn\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdesign\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m**\u001b[0m\u001b[0msch_params\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    102\u001b[0m     \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    103\u001b[0m         dsn = prj.new_schematic_instance(lib_name=sch_lib, cell_name=sch_cell,\n",
+      "\u001b[1;31mTypeError\u001b[0m: design() argument after ** must be a mapping, not NoneType"
+     ]
+    }
+   ],
+   "source": [
+    "from abs_templates_ec.analog_core import AnalogBase\n",
+    "\n",
+    "\n",
+    "class AmpSF(AnalogBase):\n",
+    "    \"\"\"A template of a single transistor with dummies.\n",
+    "\n",
+    "    This class is mainly used for transistor characterization or\n",
+    "    design exploration with config views.\n",
+    "\n",
+    "    Parameters\n",
+    "    ----------\n",
+    "    temp_db : :class:`bag.layout.template.TemplateDB`\n",
+    "            the template database.\n",
+    "    lib_name : str\n",
+    "        the layout library name.\n",
+    "    params : dict[str, any]\n",
+    "        the parameter values.\n",
+    "    used_names : set[str]\n",
+    "        a set of already used cell names.\n",
+    "    kwargs : dict[str, any]\n",
+    "        dictionary of optional parameters.  See documentation of\n",
+    "        :class:`bag.layout.template.TemplateBase` for details.\n",
+    "    \"\"\"\n",
+    "\n",
+    "    def __init__(self, temp_db, lib_name, params, used_names, **kwargs):\n",
+    "        AnalogBase.__init__(self, temp_db, lib_name, params, used_names, **kwargs)\n",
+    "        self._sch_params = None\n",
+    "\n",
+    "    @property\n",
+    "    def sch_params(self):\n",
+    "        return self._sch_params\n",
+    "\n",
+    "    @classmethod\n",
+    "    def get_params_info(cls):\n",
+    "        \"\"\"Returns a dictionary containing parameter descriptions.\n",
+    "\n",
+    "        Override this method to return a dictionary from parameter names to descriptions.\n",
+    "\n",
+    "        Returns\n",
+    "        -------\n",
+    "        param_info : dict[str, str]\n",
+    "            dictionary from parameter name to description.\n",
+    "        \"\"\"\n",
+    "        return dict(\n",
+    "            lch='channel length, in meters.',\n",
+    "            w_dict='width dictionary.',\n",
+    "            intent_dict='intent dictionary.',\n",
+    "            fg_dict='number of fingers dictionary.',\n",
+    "            ndum='number of dummies on each side.',\n",
+    "            ptap_w='NMOS substrate width, in meters/number of fins.',\n",
+    "            ntap_w='PMOS substrate width, in meters/number of fins.',\n",
+    "            show_pins='True to draw pin geometries.',\n",
+    "        )\n",
+    "\n",
+    "    def draw_layout(self):\n",
+    "        \"\"\"Draw the layout of a transistor for characterization.\n",
+    "        \"\"\"\n",
+    "\n",
+    "        lch = self.params['lch']\n",
+    "        w_dict = self.params['w_dict']\n",
+    "        intent_dict = self.params['intent_dict']\n",
+    "        fg_dict = self.params['fg_dict']\n",
+    "        ndum = self.params['ndum']\n",
+    "        ptap_w = self.params['ptap_w']\n",
+    "        ntap_w = self.params['ntap_w']\n",
+    "        show_pins = self.params['show_pins']\n",
+    "\n",
+    "        fg_amp = fg_dict['amp']\n",
+    "        fg_bias = fg_dict['bias']\n",
+    "\n",
+    "        if fg_bias % 2 != 0 or fg_amp % 2 != 0:\n",
+    "            raise ValueError('fg_bias=%d and fg_amp=%d must all be even.' % (fg_bias, fg_amp))\n",
+    "\n",
+    "        fg_half_bias = fg_bias // 2\n",
+    "        fg_half_amp = fg_amp // 2\n",
+    "        fg_half = max(fg_half_bias, fg_half_amp)\n",
+    "        fg_tot = (fg_half + ndum) * 2\n",
+    "\n",
+    "        nw_list = [w_dict['bias'], w_dict['amp']]\n",
+    "        nth_list = [intent_dict['bias'], intent_dict['amp']]\n",
+    "        ng_tracks = [1, 3]\n",
+    "        nds_tracks = [1, 1]\n",
+    "\n",
+    "        n_orient = ['R0', 'MX']\n",
+    "\n",
+    "        self.draw_base(lch, fg_tot, ptap_w, ntap_w, nw_list,\n",
+    "                       nth_list, [], [],\n",
+    "                       ng_tracks=ng_tracks, nds_tracks=nds_tracks,\n",
+    "                       pg_tracks=[], pds_tracks=[],\n",
+    "                       n_orientations=n_orient,\n",
+    "                       )\n",
+    "\n",
+    "        if (fg_amp - fg_bias) % 4 == 0:\n",
+    "            s_net, d_net = 'VDD', 'vout'\n",
+    "            aout, aoutb, nsdir, nddir = 'd', 's', 2, 0\n",
+    "        else:\n",
+    "            s_net, d_net = 'vout', 'VDD'\n",
+    "            aout, aoutb, nsdir, nddir = 's', 'd', 0, 2\n",
+    "\n",
+    "        # TODO: compute bias_col and amp_col\n",
+    "        bias_col = amp_col = 0\n",
+    "\n",
+    "        amp_ports = self.draw_mos_conn('nch', 1, amp_col, fg_amp, nsdir, nddir,\n",
+    "                                       s_net=s_net, d_net=d_net)\n",
+    "        bias_ports = self.draw_mos_conn('nch', 0, bias_col, fg_bias, 0, 2,\n",
+    "                                        s_net='', d_net='vout')\n",
+    "\n",
+    "        # TODO: get TrackIDs for horizontal tracks\n",
+    "        # The following are related code copied and pasted from AmpCS\n",
+    "        # for reference\n",
+    "        # vin_tid = self.make_track_id('nch', 0, 'g', 0)\n",
+    "        # vout_tid = self.make_track_id('pch', 0, 'ds', 0)\n",
+    "        # vbias_tid = self.make_track_id('pch', 0, 'g', 0)\n",
+    "        vdd_tid = vin_tid = vout_tid = vbias_tid = None\n",
+    "\n",
+    "        if vdd_tid is None:\n",
+    "            return\n",
+    "\n",
+    "        # uncomment to visualize track location\n",
+    "        # hm_layer = self.mos_conn_layer + 1\n",
+    "        # xl = self.bound_box.left_unit\n",
+    "        # xr = self.bound_box.right_unit\n",
+    "        # self.add_wires(hm_layer, vdd_tid.base_index, xl, xr, unit_mode=True)\n",
+    "        # self.add_wires(hm_layer, vin_tid.base_index, xl, xr, unit_mode=True)\n",
+    "        # self.add_wires(hm_layer, vout_tid.base_index, xl, xr, unit_mode=True)\n",
+    "        # self.add_wires(hm_layer, vbias_tid.base_index, xl, xr, unit_mode=True)\n",
+    "        \n",
+    "        # TODO: connect transistors to horizontal tracks\n",
+    "        # The following are related code copied and pasted from AmpCS\n",
+    "        # for reference\n",
+    "        # vin_warr = self.connect_to_tracks(amp_ports['g'], vin_tid)\n",
+    "        # vout_warr = self.connect_to_tracks([amp_ports[aout], load_ports['d']], vout_tid)\n",
+    "        # vbias_warr = self.connect_to_tracks(load_ports['g'], vbias_tid)\n",
+    "        vin_warr = vout_warr = vbias_warr = vdd_warr = None\n",
+    "\n",
+    "        if vin_warr is None:\n",
+    "            return\n",
+    "\n",
+    "        self.connect_to_substrate('ptap', bias_ports['s'])\n",
+    "\n",
+    "        vss_warrs, _ = self.fill_dummy()\n",
+    "\n",
+    "        self.add_pin('VSS', vss_warrs, show=show_pins)\n",
+    "        # TODO: add pins\n",
+    "\n",
+    "        # set schematic parameters\n",
+    "        self._sch_params = dict(\n",
+    "            lch=lch,\n",
+    "            w_dict=w_dict,\n",
+    "            intent_dict=intent_dict,\n",
+    "            fg_dict=fg_dict,\n",
+    "            dum_info=self.get_sch_dummy_info(),\n",
+    "        )\n",
+    "\n",
+    "        \n",
+    "        \n",
+    "import os\n",
+    "\n",
+    "# import bag package\n",
+    "import bag\n",
+    "from bag.io import read_yaml\n",
+    "\n",
+    "# import BAG demo Python modules\n",
+    "import xbase_demo.core as demo_core\n",
+    "from xbase_demo.demo_layout.core import AmpSFSoln\n",
+    "\n",
+    "# load circuit specifications from file\n",
+    "spec_fname = os.path.join(os.environ['BAG_WORK_DIR'], 'specs_demo/demo.yaml')\n",
+    "top_specs = read_yaml(spec_fname)\n",
+    "\n",
+    "# obtain BagProject instance\n",
+    "local_dict = locals()\n",
+    "if 'bprj' in local_dict:\n",
+    "    print('using existing BagProject')\n",
+    "    bprj = local_dict['bprj']\n",
+    "else:\n",
+    "    print('creating BagProject')\n",
+    "    bprj = bag.BagProject()\n",
+    "\n",
+    "demo_core.run_flow(bprj, top_specs, 'amp_sf_soln', AmpSF, run_lvs=True, lvs_only=True)"
+   ]
+  }
+ ],
+ "metadata": {
+  "anaconda-cloud": {},
+  "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.6.5"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/workspace_setup/tutorial_files/4_schematic_generators.ipynb b/workspace_setup/tutorial_files/4_schematic_generators.ipynb
new file mode 100644
index 0000000..5246a6e
--- /dev/null
+++ b/workspace_setup/tutorial_files/4_schematic_generators.ipynb
@@ -0,0 +1,344 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Schematic Generators\n",
+    "This module covers the basics of writing a schematic generator."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Schematic Generation Flow\n",
+    "The schematic generator design flow is slightly different than the layout generator design flow.  As described in Module 1, BAG copies an existing schematic template in Virtuoso and perform modifications on it in order to generate human-readable schematic instances.  The schematic generation flow follows the steps below:\n",
+    "\n",
+    "1. Create schematic in Virtuoso.\n",
+    "2. Import schematic information from Virtuoso to Python.\n",
+    "3. Implement schematic generator in Python.\n",
+    "4. Use BAG to create new instances of the schematic."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## CS Amplifier Schematic Generator Example\n",
+    "Lets walk through the common-source amplifier schematic generator example, reproduced below:\n",
+    "\n",
+    "```python\n",
+    "yaml_file = pkg_resources.resource_filename(__name__, os.path.join('netlist_info', 'amp_cs.yaml'))\n",
+    "\n",
+    "class demo_templates__amp_cs(Module):\n",
+    "\n",
+    "    def __init__(self, bag_config, parent=None, prj=None, **kwargs):\n",
+    "        Module.__init__(self, bag_config, yaml_file, parent=parent, prj=prj, **kwargs)\n",
+    "\n",
+    "    @classmethod\n",
+    "    def get_params_info(cls):\n",
+    "        return dict(\n",
+    "            lch='channel length in meters.',\n",
+    "            w_dict='Dictionary of transistor widths.',\n",
+    "            intent_dict='Dictionary of transistor threshold flavors.',\n",
+    "            fg_dict='Dictionary of transistor number of fingers.',\n",
+    "            dum_info='Dummy information data structure',\n",
+    "        )\n",
+    "        \n",
+    "    def design(self, lch, w_dict, intent_dict, fg_dict, dum_info):\n",
+    "        # populate self.parameters dictionary\n",
+    "        wp = w_dict['load']\n",
+    "        wn = w_dict['amp']\n",
+    "        intentp = intent_dict['load']\n",
+    "        intentn = intent_dict['amp']\n",
+    "\n",
+    "        fg_amp = fg_dict['amp']\n",
+    "        fg_load = fg_dict['load']\n",
+    "\n",
+    "        # set transistor parameters\n",
+    "        self.instances['XP'].design(w=wp, l=lch, intent=intentp, nf=fg_load)\n",
+    "        self.instances['XN'].design(w=wn, l=lch, intent=intentn, nf=fg_amp)\n",
+    "\n",
+    "        # handle dummy transistors\n",
+    "        self.design_dummy_transistors(dum_info, 'XDUM', 'VDD', 'VSS')\n",
+    "\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Constructor\n",
+    "Consider the section below:\n",
+    "```python\n",
+    "yaml_file = pkg_resources.resource_filename(__name__, os.path.join('netlist_info', 'amp_cs.yaml'))\n",
+    "\n",
+    "class demo_templates__amp_cs(Module):\n",
+    "\n",
+    "    def __init__(self, bag_config, parent=None, prj=None, **kwargs):\n",
+    "        Module.__init__(self, bag_config, yaml_file, parent=parent, prj=prj, **kwargs)\n",
+    "```\n",
+    "First of all, notice the `yaml_file` variable.  This variable stores the path to a netlist file that describes instances and connections in the schematic template.  This netlist file is generated by BAG when schematic templates are imported from Virtuoso to BAG.  This implies that everytime you modify the schematic template, you should re-import the design to BAG in order to update this file.\n",
+    "\n",
+    "Then, notice that this class is a subclass of `Module`.  Similar to `AnalogBase`, `Module` is the base class of all schematic generators, and it provides many useful functions to modify the schematic template."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Parameters information\n",
+    "Next we have the following class method declaration:\n",
+    "\n",
+    "```python\n",
+    "@classmethod\n",
+    "def get_params_info(cls):\n",
+    "    return dict(\n",
+    "        lch='channel length in meters.',\n",
+    "        w_dict='Dictionary of transistor widths.',\n",
+    "        intent_dict='Dictionary of transistor threshold flavors.',\n",
+    "        fg_dict='Dictionary of transistor number of fingers.',\n",
+    "        dum_info='Dummy information data structure',\n",
+    "    )\n",
+    "```\n",
+    "\n",
+    "This method serves the same purpose as the method with the same name in layout generators."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## The Design Method\n",
+    "```python\n",
+    "def design(self, lch, w_dict, intent_dict, fg_dict, dum_info):\n",
+    "```\n",
+    "Next we have the `design()` method.  Similar to `draw_layout()`, this is where all schematic modification happens.  Note that all schematic parameters should be listed as arguments of the `design()` method."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Setting Transistor Parameters\n",
+    "The first several lines of `design()` are quite self-explanatory.  Then we have the following:\n",
+    "\n",
+    "```python\n",
+    "# set transistor parameters\n",
+    "self.instances['XP'].design(w=wp, l=lch, intent=intentp, nf=fg_load)\n",
+    "self.instances['XN'].design(w=wn, l=lch, intent=intentn, nf=fg_amp)\n",
+    "```\n",
+    "All instances in the schematic template will be present in the `self.instances` dictionary, which maps instance names to the corresponding `SchInstance` objects (This is why you should always choose meaningful names for instances in your schematic template).  You can modify these instances by called their `design()` method.  For `BAG_prim` transistors, their `design()` method takes parameters `w`, `l`, `intent`, and `nf`, which stands for width, length, transistor threshold, and number of fingers, respectively.\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Dummy transistors\n",
+    "In the next line we have:\n",
+    "\n",
+    "```python\n",
+    "# handle dummy transistors\n",
+    "self.design_dummy_transistors(dum_info, 'XDUM', 'VDD', 'VSS')\n",
+    "```\n",
+    "Recall that `dum_info` is the dummy transistor data struct computed by AnalogBase.  The `design_dummy_transistors()` method will automatically help you create the corresponding dummy transistors in the schematic, by copying and modifying a transistor instance in the schematic template.  For example, here it'll copy and modfy the \"XDUM\" transistor instance, and use \"VDD\" as the power supply name, \"VSS\" as the ground supply name."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## SF Schematic Exercise\n",
+    "Now let's try to create a source-follower schematic generator.  Before we start writing generator code, we need to create a schematic template for the source-follower:\n",
+    "\n",
+    "1. Open the cellview `demo_templates`/`amp_sf` in Virtuoso.\n",
+    "\n",
+    "2. Instantiate non-dummy transistors from the `BAG_prim` library, and create proper connections.  Use `nmos4_standard` and `pmos4_standard` as the transistors.  Leave the dummy transistor alone.\n",
+    "    * Name the amplifying transistor `XAMP` and the bias transistor `XBIAS`.\n",
+    "\n",
+    "3. If you're stuck or you want to check your answer, see the schematic for `demo_templates`/`amp_sf_soln`.\n",
+    "\n",
+    "4. After completing the schematic, evaluate the following cell, which will update the netlist associated with `amp_sf`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "creating BagProject\n",
+      "importing netlist from virtuoso\n",
+      "netlist import done\n"
+     ]
+    }
+   ],
+   "source": [
+    "import bag\n",
+    "\n",
+    "# obtain BagProject instance\n",
+    "local_dict = locals()\n",
+    "if 'bprj' in local_dict:\n",
+    "    print('using existing BagProject')\n",
+    "    bprj = local_dict['bprj']\n",
+    "else:\n",
+    "    print('creating BagProject')\n",
+    "    bprj = bag.BagProject()\n",
+    "    \n",
+    "print('importing netlist from virtuoso')\n",
+    "bprj.import_design_library('demo_templates')\n",
+    "print('netlist import done')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "collapsed": true
+   },
+   "source": [
+    "## Implement Schematic Generator\n",
+    "Now that you finished the schematic template and imported netlist information into BAG, fill in the missing parts of the following schematic generator.  After you finished, evaluate the cell below to run the source-follower amplifer through the flow.  If everything works properly, LVS should pass, and you should see DC/AC/Transient simulation plots of the source-follower.  If you need to change the schematic template in Virtuoso, remember to re-evaluate the cell above to regenerate the netlist file."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "creating BagProject\n",
+      "computing layout\n",
+      "ext_w0 = 1, ext_wend=9, tot_ntr=20\n",
+      "ext_w0 = 2, ext_wend=8, tot_ntr=20\n",
+      "ext_w0 = 4, ext_wend=9, tot_ntr=21\n",
+      "final: ext_w0 = 2, ext_wend=8, tot_ntr=20\n",
+      "creating layout\n",
+      "layout done\n",
+      "creating AMP_SF schematics\n",
+      "running lvs\n",
+      "Running tasks, Press Ctrl-C to cancel.\n"
+     ]
+    },
+    {
+     "ename": "ValueError",
+     "evalue": "LVS failed.  check log file: /tools/projects/erichang/bag_gen/BAG2_cds_ff_mpt/pvs_run/lvs_run_dir/DEMO_AMP_SF/AMP_SF/lvsLog_20171127_232149rtf5tphj",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[1;31mValueError\u001b[0m                                Traceback (most recent call last)",
+      "\u001b[1;32m<ipython-input-2-f2776ed95ca3>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m     89\u001b[0m     \u001b[0mbprj\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mbag\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mBagProject\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     90\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 91\u001b[1;33m \u001b[0mdemo_core\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun_flow\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mbprj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtop_specs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'amp_sf'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mAmpSFSoln\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msch_cls\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdemo_templates__amp_sf\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrun_lvs\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[1;32m/tools/projects/erichang/bag_gen/BAG2_cds_ff_mpt/BAG_XBase_demo/xbase_demo/core.py\u001b[0m in \u001b[0;36mrun_flow\u001b[1;34m(prj, specs, dsn_name, lay_cls, sch_cls, run_lvs, lvs_only)\u001b[0m\n\u001b[0;32m    375\u001b[0m     \u001b[0mdsn_sch_params\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mgen_layout\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mspecs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdsn_name\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlay_cls\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    376\u001b[0m     \u001b[1;31m# generate design/testbench schematics\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 377\u001b[1;33m     \u001b[0mgen_schematics\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mspecs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdsn_name\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdsn_sch_params\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msch_cls\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0msch_cls\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcheck_lvs\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mrun_lvs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlvs_only\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mlvs_only\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    378\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    379\u001b[0m     \u001b[1;32mif\u001b[0m \u001b[0mlvs_only\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
+      "\u001b[1;32m/tools/projects/erichang/bag_gen/BAG2_cds_ff_mpt/BAG_XBase_demo/xbase_demo/core.py\u001b[0m in \u001b[0;36mgen_schematics\u001b[1;34m(prj, specs, dsn_name, sch_params, sch_cls, check_lvs, lvs_only)\u001b[0m\n\u001b[0;32m    112\u001b[0m         \u001b[0mlvs_passed\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlvs_log\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mprj\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun_lvs\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mimpl_lib\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgen_cell\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    113\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mlvs_passed\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 114\u001b[1;33m             \u001b[1;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'LVS failed.  check log file: %s'\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0mlvs_log\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    115\u001b[0m         \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    116\u001b[0m             \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'lvs passed'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
+      "\u001b[1;31mValueError\u001b[0m: LVS failed.  check log file: /tools/projects/erichang/bag_gen/BAG2_cds_ff_mpt/pvs_run/lvs_run_dir/DEMO_AMP_SF/AMP_SF/lvsLog_20171127_232149rtf5tphj"
+     ]
+    }
+   ],
+   "source": [
+    "%matplotlib inline\n",
+    "\n",
+    "import os\n",
+    "\n",
+    "from bag.design import Module\n",
+    "\n",
+    "\n",
+    "# noinspection PyPep8Naming\n",
+    "class demo_templates__amp_sf(Module):\n",
+    "    \"\"\"Module for library demo_templates cell amp_sf.\n",
+    "\n",
+    "    Fill in high level description here.\n",
+    "    \"\"\"\n",
+    "\n",
+    "    def __init__(self, bag_config, parent=None, prj=None, **kwargs):\n",
+    "        # hard coded netlist flie path to get jupyter notebook working.\n",
+    "        yaml_file = os.path.join(os.environ['BAG_WORK_DIR'], 'BAG_XBase_demo', \n",
+    "                                 'BagModules', 'demo_templates', 'netlist_info', 'amp_sf.yaml') \n",
+    "\n",
+    "        Module.__init__(self, bag_config, yaml_file, parent=parent, prj=prj, **kwargs)\n",
+    "\n",
+    "    @classmethod\n",
+    "    def get_params_info(cls):\n",
+    "        return dict(\n",
+    "            lch='channel length in meters.',\n",
+    "            w_dict='Dictionary of transistor widths.',\n",
+    "            intent_dict='Dictionary of transistor threshold flavors.',\n",
+    "            fg_dict='Dictionary of transistor number of fingers.',\n",
+    "            dum_info='Dummy information data structure',\n",
+    "        )\n",
+    "\n",
+    "    def design(self, lch, w_dict, intent_dict, fg_dict, dum_info):\n",
+    "        w_amp = w_dict['amp']\n",
+    "        w_bias = w_dict['bias']\n",
+    "        intent_amp = intent_dict['amp']\n",
+    "        intent_bias = intent_dict['bias']\n",
+    "        fg_amp = fg_dict['amp']\n",
+    "        fg_bias = fg_dict['bias']\n",
+    "\n",
+    "        # TODO: design XAMP and XBIAS transistors\n",
+    "        # related code from amp_cs schematic generator are copied below\n",
+    "        # for reference\n",
+    "        # self.instances['XP'].design(w=wp, l=lch, intent=intentp, nf=fg_load)\n",
+    "        # self.instances['XN'].design(w=wn, l=lch, intent=intentn, nf=fg_amp)\n",
+    "\n",
+    "        # handle dummy transistors\n",
+    "        self.design_dummy_transistors(dum_info, 'XDUM', 'VDD', 'VSS')\n",
+    "\n",
+    "        \n",
+    "import os\n",
+    "\n",
+    "# import bag package\n",
+    "import bag\n",
+    "from bag.io import read_yaml\n",
+    "\n",
+    "# import BAG demo Python modules\n",
+    "import xbase_demo.core as demo_core\n",
+    "from xbase_demo.demo_layout.core import AmpSFSoln\n",
+    "\n",
+    "# load circuit specifications from file\n",
+    "spec_fname = os.path.join(os.environ['BAG_WORK_DIR'], 'specs_demo/demo.yaml')\n",
+    "top_specs = read_yaml(spec_fname)\n",
+    "\n",
+    "# obtain BagProject instance\n",
+    "local_dict = locals()\n",
+    "if 'bprj' in local_dict:\n",
+    "    print('using existing BagProject')\n",
+    "    bprj = local_dict['bprj']\n",
+    "else:\n",
+    "    print('creating BagProject')\n",
+    "    bprj = bag.BagProject()\n",
+    "\n",
+    "demo_core.run_flow(bprj, top_specs, 'amp_sf', AmpSFSoln, sch_cls=demo_templates__amp_sf, run_lvs=True)"
+   ]
+  }
+ ],
+ "metadata": {
+  "anaconda-cloud": {},
+  "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.6.5"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/workspace_setup/tutorial_files/5_hierarchical_generators.ipynb b/workspace_setup/tutorial_files/5_hierarchical_generators.ipynb
new file mode 100644
index 0000000..5f88586
--- /dev/null
+++ b/workspace_setup/tutorial_files/5_hierarchical_generators.ipynb
@@ -0,0 +1,606 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Module 5: Hierarchical Generators\n",
+    "This module covers writing layout/schematic generators that instantiate other generators.  We will write a two-stage amplifier generator, which instatiates the common-source amplifier followed by the source-follower amplifier."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## AmpChain Layout Example\n",
+    "First, we will write a layout generator for the two-stage amplifier.  The layout floorplan is drawn for you below:\n",
+    "<img src=\"bootcamp_pics/5_hierarchical_generator/hierachical_generator_1.PNG\" alt=\"Drawing\" style=\"width: 400px;\"/>\n",
+    "This floorplan abuts the `AmpCS` instance next to `AmpSF` instance, the `VSS` ports are simply shorted together, and the top `VSS` port of `AmpSF` is ignored (they are connected together internally by dummy connections).  The intermediate node of the two-stage amplifier is connected using a vertical routing track in the middle of the two amplifier blocks.  `VDD` ports are connected to the top-most M6 horizontal track, and other ports are simply exported in-place.\n",
+    "\n",
+    "The layout generator is reproduced below, with some parts missing (which you will fill out later).  We will walk through the important sections of the code.\n",
+    "```python\n",
+    "class AmpChain(TemplateBase):\n",
+    "    def __init__(self, temp_db, lib_name, params, used_names, **kwargs):\n",
+    "        TemplateBase.__init__(self, temp_db, lib_name, params, used_names, **kwargs)\n",
+    "        self._sch_params = None\n",
+    "\n",
+    "    @property\n",
+    "    def sch_params(self):\n",
+    "        return self._sch_params\n",
+    "\n",
+    "    @classmethod\n",
+    "    def get_params_info(cls):\n",
+    "        return dict(\n",
+    "            cs_params='common source amplifier parameters.',\n",
+    "            sf_params='source follower parameters.',\n",
+    "            show_pins='True to draw pin geometries.',\n",
+    "        )\n",
+    "\n",
+    "    def draw_layout(self):\n",
+    "        \"\"\"Draw the layout of a transistor for characterization.\n",
+    "        \"\"\"\n",
+    "\n",
+    "        # make copies of given dictionaries to avoid modifying external data.\n",
+    "        cs_params = self.params['cs_params'].copy()\n",
+    "        sf_params = self.params['sf_params'].copy()\n",
+    "        show_pins = self.params['show_pins']\n",
+    "\n",
+    "        # disable pins in subcells\n",
+    "        cs_params['show_pins'] = False\n",
+    "        sf_params['show_pins'] = False\n",
+    "\n",
+    "        # create layout masters for subcells we will add later\n",
+    "        cs_master = self.new_template(params=cs_params, temp_cls=AmpCS)\n",
+    "        # TODO: create sf_master.  Use AmpSFSoln class\n",
+    "        sf_master = None\n",
+    "\n",
+    "        if sf_master is None:\n",
+    "            return\n",
+    "\n",
+    "        # add subcell instances\n",
+    "        cs_inst = self.add_instance(cs_master, 'XCS')\n",
+    "        # add source follower to the right of common source\n",
+    "        x0 = cs_inst.bound_box.right_unit\n",
+    "        sf_inst = self.add_instance(sf_master, 'XSF', loc=(x0, 0), unit_mode=True)\n",
+    "\n",
+    "        # get VSS wires from AmpCS/AmpSF\n",
+    "        cs_vss_warr = cs_inst.get_all_port_pins('VSS')[0]\n",
+    "        sf_vss_warrs = sf_inst.get_all_port_pins('VSS')\n",
+    "        # only connect bottom VSS wire of source follower\n",
+    "        if sf_vss_warrs[0].track_id.base_index < sf_vss_warrs[1].track_id.base_index:\n",
+    "            sf_vss_warr = sf_vss_warrs[0]\n",
+    "        else:\n",
+    "            sf_vss_warr = sf_vss_warrs[1]\n",
+    "\n",
+    "        # connect VSS of the two blocks together\n",
+    "        vss = self.connect_wires([cs_vss_warr, sf_vss_warr])[0]\n",
+    "\n",
+    "        # get layer IDs from VSS wire\n",
+    "        hm_layer = vss.layer_id\n",
+    "        vm_layer = hm_layer + 1\n",
+    "        top_layer = vm_layer + 1\n",
+    "\n",
+    "        # calculate template size\n",
+    "        tot_box = cs_inst.bound_box.merge(sf_inst.bound_box)\n",
+    "        self.set_size_from_bound_box(top_layer, tot_box, round_up=True)\n",
+    "\n",
+    "        # get subcell ports as WireArrays so we can connect them\n",
+    "        vmid0 = cs_inst.get_all_port_pins('vout')[0]\n",
+    "        vmid1 = sf_inst.get_all_port_pins('vin')[0]\n",
+    "        vdd0 = cs_inst.get_all_port_pins('VDD')[0]\n",
+    "        vdd1 = sf_inst.get_all_port_pins('VDD')[0]\n",
+    "\n",
+    "        # get vertical VDD TrackIDs\n",
+    "        vdd0_tid = TrackID(vm_layer, self.grid.coord_to_nearest_track(vm_layer, vdd0.middle))\n",
+    "        vdd1_tid = TrackID(vm_layer, self.grid.coord_to_nearest_track(vm_layer, vdd1.middle))\n",
+    "\n",
+    "        # connect VDD of each block to vertical M5\n",
+    "        vdd0 = self.connect_to_tracks(vdd0, vdd0_tid)\n",
+    "        vdd1 = self.connect_to_tracks(vdd1, vdd1_tid)\n",
+    "        # connect M5 VDD to top M6 horizontal track\n",
+    "        vdd_tidx = self.grid.get_num_tracks(self.size, top_layer) - 1\n",
+    "        vdd_tid = TrackID(top_layer, vdd_tidx)\n",
+    "        vdd = self.connect_to_tracks([vdd0, vdd1], vdd_tid)\n",
+    "\n",
+    "        # TODO: connect vmid0 and vmid1 to vertical track in the middle of two templates\n",
+    "        # hint: use x0\n",
+    "        vmid = None\n",
+    "\n",
+    "        if vmid is None:\n",
+    "            return\n",
+    "\n",
+    "        # add pins on wires\n",
+    "        self.add_pin('vmid', vmid, show=show_pins)\n",
+    "        self.add_pin('VDD', vdd, show=show_pins)\n",
+    "        self.add_pin('VSS', vss, show=show_pins)\n",
+    "        # re-export pins on subcells.\n",
+    "        self.reexport(cs_inst.get_port('vin'), show=show_pins)\n",
+    "        self.reexport(cs_inst.get_port('vbias'), net_name='vb1', show=show_pins)\n",
+    "        # TODO: reexport vout and vbias of source follower\n",
+    "        # TODO: vbias should be renamed to vb2\n",
+    "\n",
+    "        # compute schematic parameters.\n",
+    "        self._sch_params = dict(\n",
+    "            cs_params=cs_master.sch_params,\n",
+    "            sf_params=sf_master.sch_params,\n",
+    "        )\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## AmpChain Constructor\n",
+    "```python\n",
+    "class AmpChain(TemplateBase):\n",
+    "    def __init__(self, temp_db, lib_name, params, used_names, **kwargs):\n",
+    "        TemplateBase.__init__(self, temp_db, lib_name, params, used_names, **kwargs)\n",
+    "        self._sch_params = None\n",
+    "\n",
+    "    @property\n",
+    "    def sch_params(self):\n",
+    "        return self._sch_params\n",
+    "\n",
+    "    @classmethod\n",
+    "    def get_params_info(cls):\n",
+    "        return dict(\n",
+    "            cs_params='common source amplifier parameters.',\n",
+    "            sf_params='source follower parameters.',\n",
+    "            show_pins='True to draw pin geometries.',\n",
+    "        )\n",
+    "```\n",
+    "First, notice that instead of subclassing `AnalogBase`, the `AmpChain` class subclasses `TemplateBase`.  This is because we are not trying to draw transistor rows inside this layout generator; we just want to place and route multiple layout instances together.  `TemplateBase` is the base class for all layout generators and it provides most placement and routing methods you need.\n",
+    "\n",
+    "Next, notice that the parameters for `AmpChain` are simply parameter dictionaries for the two sub-generators.  The ability to use complex data structures as generator parameters solves the parameter explosion problem when writing generators with many levels of hierarchy."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Creating Layout Master\n",
+    "```python\n",
+    "# create layout masters for subcells we will add later\n",
+    "cs_master = self.new_template(params=cs_params, temp_cls=AmpCS)\n",
+    "# TODO: create sf_master.  Use AmpSFSoln class\n",
+    "sf_master = None\n",
+    "```\n",
+    "Here, the `new_template()` function creates a new layout master, `cs_master`, which represents a generated layout cellview from the `AmpCS` layout generator.  We can later instances of this master in the current layout, which are references to the generated `AmpCS` layout cellview, perhaps shifted and rotated.  The main take away is that the `new_template()` function does not add any layout geometries to the current layout, but rather create a separate layout cellview which we may use later."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Creating Layout Instance\n",
+    "```python\n",
+    "# add subcell instances\n",
+    "cs_inst = self.add_instance(cs_master, 'XCS')\n",
+    "# add source follower to the right of common source\n",
+    "x0 = cs_inst.bound_box.right_unit\n",
+    "sf_inst = self.add_instance(sf_master, 'XSF', loc=(x0, 0), unit_mode=True)\n",
+    "```\n",
+    "\n",
+    "The `add_instance()` method adds an instance of the given layout master to the current cellview.  By default, if no location or orientation is given, it puts the instance at the origin with no rotation.  the `bound_box` attribute can then be used on the instance to get the bounding box of the instance.  Here, the bounding box is used to determine the X coordinate of the source-follower."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Get Instance Ports\n",
+    "```python\n",
+    "# get subcell ports as WireArrays so we can connect them\n",
+    "vmid0 = cs_inst.get_all_port_pins('vout')[0]\n",
+    "vmid1 = sf_inst.get_all_port_pins('vin')[0]\n",
+    "vdd0 = cs_inst.get_all_port_pins('VDD')[0]\n",
+    "vdd1 = sf_inst.get_all_port_pins('VDD')[0]\n",
+    "```\n",
+    "after adding an instance, the `get_all_port_pins()` function can be used to obtain a list of all pins as `WireArray` objects with the given name.  In this case, we know that there's exactly one pin, so we use Python list indexing to obtain first element of the list."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Routing Grid Object\n",
+    "```python\n",
+    "# get vertical VDD TrackIDs\n",
+    "vdd0_tid = TrackID(vm_layer, self.grid.coord_to_nearest_track(vm_layer, vdd0.middle))\n",
+    "vdd1_tid = TrackID(vm_layer, self.grid.coord_to_nearest_track(vm_layer, vdd1.middle))\n",
+    "```\n",
+    "\n",
+    "the `self.grid` attribute of `TemplateBase` is a `RoutingGrid` objects, which provides many useful functions related to the routing grid.  In this particular scenario, `coord_to_nearest_track()` is used to determine the vertical track index closest to the center of the `VDD` ports.  These vertical tracks will be used later to connect the `VDD` ports together."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Re-export Pins on Instances\n",
+    "```python\n",
+    " # re-export pins on subcells.\n",
+    "self.reexport(cs_inst.get_port('vin'), show=show_pins)\n",
+    "self.reexport(cs_inst.get_port('vbias'), net_name='vb1', show=show_pins)\n",
+    "# TODO: reexport vout and vbias of source follower\n",
+    "# TODO: vbias should be renamed to vb2\n",
+    "```\n",
+    "`TemplateBase` also provides a `reexport()` function, which is a convenience function to re-export an instance port in-place.  The `net_name` optional parameter can be used to change the port name.  In this example, the `vbias` port of common-source amplifier is renamed to `vb1`."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Layout Exercises\n",
+    "Now you should know everything you need to finish the two-stage amplifier layout generator.  Fill in the missing pieces to do the following:\n",
+    "\n",
+    "1. Create layout master for `AmpSF` using the `AmpSFSoln` class.\n",
+    "2. Using `RoutingGrid`, determine the vertical track index in the middle of the two amplifier blocks, and connect `vmid` wires together using this track.\n",
+    "    * Hint: variable `x0` is the X coordinate of the boundary between the two blocks.\n",
+    "3. Re-export `vout` and `vbias` of the source-follower. Rename `vbias` to `vb2`.\n",
+    "\n",
+    "Once you're done, evaluate the cell below, which will generate the layout and run LVS.  If everything is done correctly, a layout should be generated inthe `DEMO_AMP_CHAIN` library, and LVS should pass."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "creating BagProject\n",
+      "computing layout\n",
+      "ext_w0 = 1, ext_wend=6, tot_ntr=19\n",
+      "ext_w0 = 2, ext_wend=2, tot_ntr=18\n",
+      "final: ext_w0 = 2, ext_wend=2, tot_ntr=18\n",
+      "{'s': WireArray(TrackID(layer=3, track=7, num=9, pitch=2), 0.981, 1.136), 'd': WireArray(TrackID(layer=3, track=8, num=8, pitch=2), 1.168, 1.323), 'g': WireArray(TrackID(layer=3, track=8, num=8, pitch=2), 0.791, 0.946)}\n",
+      "WireArray(TrackID(layer=3, track=8, num=8, pitch=2), 0.791, 0.946)\n",
+      "5.5\n",
+      "creating layout\n",
+      "layout done\n",
+      "computing AMP_CHAIN schematics\n"
+     ]
+    },
+    {
+     "ename": "TypeError",
+     "evalue": "design() argument after ** must be a mapping, not NoneType",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[1;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
+      "\u001b[1;32m<ipython-input-1-f7e0f1af5c7e>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m    134\u001b[0m     \u001b[0mbprj\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mbag\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mBagProject\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    135\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 136\u001b[1;33m \u001b[0mdemo_core\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun_flow\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mbprj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtop_specs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'amp_chain_soln'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mAmpChain\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrun_lvs\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlvs_only\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[1;32m/tools/projects/erichang/bag_gen/BAG2_cds_ff_mpt/BAG_XBase_demo/xbase_demo/core.py\u001b[0m in \u001b[0;36mrun_flow\u001b[1;34m(prj, specs, dsn_name, lay_cls, sch_cls, run_lvs, lvs_only)\u001b[0m\n\u001b[0;32m    375\u001b[0m     \u001b[0mdsn_sch_params\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mgen_layout\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mspecs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdsn_name\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlay_cls\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    376\u001b[0m     \u001b[1;31m# generate design/testbench schematics\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 377\u001b[1;33m     \u001b[0mgen_schematics\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mspecs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdsn_name\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdsn_sch_params\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msch_cls\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0msch_cls\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcheck_lvs\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mrun_lvs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlvs_only\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mlvs_only\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    378\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    379\u001b[0m     \u001b[1;32mif\u001b[0m \u001b[0mlvs_only\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
+      "\u001b[1;32m/tools/projects/erichang/bag_gen/BAG2_cds_ff_mpt/BAG_XBase_demo/xbase_demo/core.py\u001b[0m in \u001b[0;36mgen_schematics\u001b[1;34m(prj, specs, dsn_name, sch_params, sch_cls, check_lvs, lvs_only)\u001b[0m\n\u001b[0;32m     99\u001b[0m         \u001b[0mdsn\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mprj\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcreate_design_module\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msch_lib\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msch_cell\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    100\u001b[0m         \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'computing %s schematics'\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0mgen_cell\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 101\u001b[1;33m         \u001b[0mdsn\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdesign\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m**\u001b[0m\u001b[0msch_params\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    102\u001b[0m     \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    103\u001b[0m         \u001b[0mdsn\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mprj\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mnew_schematic_instance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlib_name\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0msch_lib\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcell_name\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0msch_cell\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mparams\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0msch_params\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msch_cls\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0msch_cls\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
+      "\u001b[1;31mTypeError\u001b[0m: design() argument after ** must be a mapping, not NoneType"
+     ]
+    }
+   ],
+   "source": [
+    "from bag.layout.routing import TrackID\n",
+    "from bag.layout.template import TemplateBase\n",
+    "\n",
+    "from xbase_demo.demo_layout.core import AmpCS, AmpSFSoln\n",
+    "\n",
+    "\n",
+    "class AmpChain(TemplateBase):\n",
+    "    def __init__(self, temp_db, lib_name, params, used_names, **kwargs):\n",
+    "        TemplateBase.__init__(self, temp_db, lib_name, params, used_names, **kwargs)\n",
+    "        self._sch_params = None\n",
+    "\n",
+    "    @property\n",
+    "    def sch_params(self):\n",
+    "        return self._sch_params\n",
+    "\n",
+    "    @classmethod\n",
+    "    def get_params_info(cls):\n",
+    "        return dict(\n",
+    "            cs_params='common source amplifier parameters.',\n",
+    "            sf_params='source follower parameters.',\n",
+    "            show_pins='True to draw pin geometries.',\n",
+    "        )\n",
+    "\n",
+    "    def draw_layout(self):\n",
+    "        \"\"\"Draw the layout of a transistor for characterization.\n",
+    "        \"\"\"\n",
+    "\n",
+    "        # make copies of given dictionaries to avoid modifying external data.\n",
+    "        cs_params = self.params['cs_params'].copy()\n",
+    "        sf_params = self.params['sf_params'].copy()\n",
+    "        show_pins = self.params['show_pins']\n",
+    "\n",
+    "        # disable pins in subcells\n",
+    "        cs_params['show_pins'] = False\n",
+    "        sf_params['show_pins'] = False\n",
+    "\n",
+    "        # create layout masters for subcells we will add later\n",
+    "        cs_master = self.new_template(params=cs_params, temp_cls=AmpCS)\n",
+    "        # TODO: create sf_master.  Use AmpSFSoln class\n",
+    "        sf_master = None\n",
+    "\n",
+    "        if sf_master is None:\n",
+    "            return\n",
+    "\n",
+    "        # add subcell instances\n",
+    "        cs_inst = self.add_instance(cs_master, 'XCS')\n",
+    "        # add source follower to the right of common source\n",
+    "        x0 = cs_inst.bound_box.right_unit\n",
+    "        sf_inst = self.add_instance(sf_master, 'XSF', loc=(x0, 0), unit_mode=True)\n",
+    "\n",
+    "        # get VSS wires from AmpCS/AmpSF\n",
+    "        cs_vss_warr = cs_inst.get_all_port_pins('VSS')[0]\n",
+    "        sf_vss_warrs = sf_inst.get_all_port_pins('VSS')\n",
+    "        # only connect bottom VSS wire of source follower\n",
+    "        if len(sf_vss_warrs) < 2 or sf_vss_warrs[0].track_id.base_index < sf_vss_warrs[1].track_id.base_index:\n",
+    "            sf_vss_warr = sf_vss_warrs[0]\n",
+    "        else:\n",
+    "            sf_vss_warr = sf_vss_warrs[1]\n",
+    "\n",
+    "        # connect VSS of the two blocks together\n",
+    "        vss = self.connect_wires([cs_vss_warr, sf_vss_warr])[0]\n",
+    "\n",
+    "        # get layer IDs from VSS wire\n",
+    "        hm_layer = vss.layer_id\n",
+    "        vm_layer = hm_layer + 1\n",
+    "        top_layer = vm_layer + 1\n",
+    "\n",
+    "        # calculate template size\n",
+    "        tot_box = cs_inst.bound_box.merge(sf_inst.bound_box)\n",
+    "        self.set_size_from_bound_box(top_layer, tot_box, round_up=True)\n",
+    "\n",
+    "        # get subcell ports as WireArrays so we can connect them\n",
+    "        vmid0 = cs_inst.get_all_port_pins('vout')[0]\n",
+    "        vmid1 = sf_inst.get_all_port_pins('vin')[0]\n",
+    "        vdd0 = cs_inst.get_all_port_pins('VDD')[0]\n",
+    "        vdd1 = sf_inst.get_all_port_pins('VDD')[0]\n",
+    "\n",
+    "        # get vertical VDD TrackIDs\n",
+    "        vdd0_tid = TrackID(vm_layer, self.grid.coord_to_nearest_track(vm_layer, vdd0.middle))\n",
+    "        vdd1_tid = TrackID(vm_layer, self.grid.coord_to_nearest_track(vm_layer, vdd1.middle))\n",
+    "\n",
+    "        # connect VDD of each block to vertical M5\n",
+    "        vdd0 = self.connect_to_tracks(vdd0, vdd0_tid)\n",
+    "        vdd1 = self.connect_to_tracks(vdd1, vdd1_tid)\n",
+    "        # connect M5 VDD to top M6 horizontal track\n",
+    "        vdd_tidx = self.grid.get_num_tracks(self.size, top_layer) - 1\n",
+    "        vdd_tid = TrackID(top_layer, vdd_tidx)\n",
+    "        vdd = self.connect_to_tracks([vdd0, vdd1], vdd_tid)\n",
+    "\n",
+    "        # TODO: connect vmid0 and vmid1 to vertical track in the middle of two templates\n",
+    "        # hint: use x0\n",
+    "        vmid = None\n",
+    "\n",
+    "        if vmid is None:\n",
+    "            return\n",
+    "\n",
+    "        # add pins on wires\n",
+    "        self.add_pin('vmid', vmid, show=show_pins)\n",
+    "        self.add_pin('VDD', vdd, show=show_pins)\n",
+    "        self.add_pin('VSS', vss, show=show_pins)\n",
+    "        # re-export pins on subcells.\n",
+    "        self.reexport(cs_inst.get_port('vin'), show=show_pins)\n",
+    "        self.reexport(cs_inst.get_port('vbias'), net_name='vb1', show=show_pins)\n",
+    "        # TODO: reexport vout and vbias of source follower\n",
+    "        # TODO: vbias should be renamed to vb2\n",
+    "\n",
+    "        # compute schematic parameters.\n",
+    "        self._sch_params = dict(\n",
+    "            cs_params=cs_master.sch_params,\n",
+    "            sf_params=sf_master.sch_params,\n",
+    "        )\n",
+    "\n",
+    "\n",
+    "import os\n",
+    "\n",
+    "# import bag package\n",
+    "import bag\n",
+    "from bag.io import read_yaml\n",
+    "\n",
+    "# import BAG demo Python modules\n",
+    "import xbase_demo.core as demo_core\n",
+    "\n",
+    "# load circuit specifications from file\n",
+    "spec_fname = os.path.join(os.environ['BAG_WORK_DIR'], 'specs_demo/demo.yaml')\n",
+    "top_specs = read_yaml(spec_fname)\n",
+    "\n",
+    "# obtain BagProject instance\n",
+    "local_dict = locals()\n",
+    "if 'bprj' in local_dict:\n",
+    "    print('using existing BagProject')\n",
+    "    bprj = local_dict['bprj']\n",
+    "else:\n",
+    "    print('creating BagProject')\n",
+    "    bprj = bag.BagProject()\n",
+    "\n",
+    "demo_core.run_flow(bprj, top_specs, 'amp_chain_soln', AmpChain, run_lvs=True, lvs_only=True)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## AmpChain Schematic Template\n",
+    "Now let's move on to schematic generator.  As before, we need to create the schematic template first.  A half-complete schematic template is provided for you in library `demo_templates`, cell `amp_chain`, shown below:\n",
+    "<img src=\"bootcamp_pics/5_hierarchical_generator/hierachical_generator_2.PNG\" alt=\"Drawing\" style=\"width: 400px;\"/>\n",
+    "\n",
+    "The schematic template for a hierarchical generator is very simple; you simply need to instantiate the schematic templates of the sub-blocks (***Not the generated schematic!***).  For the exercise, instantiate the `amp_sf` schematic template from the `demo_templates` library, named it `XSF`, connect it, then evaluate the following cell to import the `amp_chain` netlist to Python.\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "using existing BagProject\n",
+      "importing netlist from virtuoso\n",
+      "netlist import done\n"
+     ]
+    }
+   ],
+   "source": [
+    "import bag\n",
+    "\n",
+    "# obtain BagProject instance\n",
+    "local_dict = locals()\n",
+    "if 'bprj' in local_dict:\n",
+    "    print('using existing BagProject')\n",
+    "    bprj = local_dict['bprj']\n",
+    "else:\n",
+    "    print('creating BagProject')\n",
+    "    bprj = bag.BagProject()\n",
+    "    \n",
+    "print('importing netlist from virtuoso')\n",
+    "bprj.import_design_library('demo_templates')\n",
+    "print('netlist import done')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## AmpChain Schematic Generator\n",
+    "With schematic template done, you are ready to write the schematic generator.  It is also very simple, you just need to call the `design()` method, which you implemented previously, on each instance in the schematic.  Complete the following schematic generator, then evaluate the cell to push it through the design flow."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "using existing BagProject\n",
+      "computing layout\n",
+      "ext_w0 = 1, ext_wend=6, tot_ntr=19\n",
+      "ext_w0 = 2, ext_wend=2, tot_ntr=18\n",
+      "final: ext_w0 = 2, ext_wend=2, tot_ntr=18\n",
+      "{'s': WireArray(TrackID(layer=3, track=7, num=9, pitch=2), 0.981, 1.136), 'd': WireArray(TrackID(layer=3, track=8, num=8, pitch=2), 1.168, 1.323), 'g': WireArray(TrackID(layer=3, track=8, num=8, pitch=2), 0.791, 0.946)}\n",
+      "WireArray(TrackID(layer=3, track=8, num=8, pitch=2), 0.791, 0.946)\n",
+      "5.5\n",
+      "ext_w0 = 1, ext_wend=9, tot_ntr=20\n",
+      "ext_w0 = 2, ext_wend=8, tot_ntr=20\n",
+      "ext_w0 = 4, ext_wend=9, tot_ntr=21\n",
+      "final: ext_w0 = 2, ext_wend=8, tot_ntr=20\n",
+      "creating layout\n",
+      "layout done\n",
+      "creating AMP_CHAIN schematics\n",
+      "running lvs\n",
+      "Running tasks, Press Ctrl-C to cancel.\n"
+     ]
+    },
+    {
+     "ename": "ValueError",
+     "evalue": "LVS failed.  check log file: /tools/projects/erichang/bag_gen/BAG2_cds_ff_mpt/pvs_run/lvs_run_dir/DEMO_AMP_CHAIN/AMP_CHAIN/lvsLog_20171128_0009272slvfabd",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[1;31mValueError\u001b[0m                                Traceback (most recent call last)",
+      "\u001b[1;32m<ipython-input-2-84e11b8fc0cb>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m     61\u001b[0m     \u001b[0mbprj\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mbag\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mBagProject\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     62\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 63\u001b[1;33m \u001b[0mdemo_core\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun_flow\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mbprj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtop_specs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'amp_chain'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mAmpChainSoln\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msch_cls\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdemo_templates__amp_chain\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrun_lvs\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[1;32m/tools/projects/erichang/bag_gen/BAG2_cds_ff_mpt/BAG_XBase_demo/xbase_demo/core.py\u001b[0m in \u001b[0;36mrun_flow\u001b[1;34m(prj, specs, dsn_name, lay_cls, sch_cls, run_lvs, lvs_only)\u001b[0m\n\u001b[0;32m    375\u001b[0m     \u001b[0mdsn_sch_params\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mgen_layout\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mspecs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdsn_name\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlay_cls\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    376\u001b[0m     \u001b[1;31m# generate design/testbench schematics\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 377\u001b[1;33m     \u001b[0mgen_schematics\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mspecs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdsn_name\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdsn_sch_params\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msch_cls\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0msch_cls\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcheck_lvs\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mrun_lvs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlvs_only\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mlvs_only\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    378\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    379\u001b[0m     \u001b[1;32mif\u001b[0m \u001b[0mlvs_only\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
+      "\u001b[1;32m/tools/projects/erichang/bag_gen/BAG2_cds_ff_mpt/BAG_XBase_demo/xbase_demo/core.py\u001b[0m in \u001b[0;36mgen_schematics\u001b[1;34m(prj, specs, dsn_name, sch_params, sch_cls, check_lvs, lvs_only)\u001b[0m\n\u001b[0;32m    112\u001b[0m         \u001b[0mlvs_passed\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlvs_log\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mprj\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun_lvs\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mimpl_lib\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgen_cell\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    113\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mlvs_passed\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 114\u001b[1;33m             \u001b[1;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'LVS failed.  check log file: %s'\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0mlvs_log\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    115\u001b[0m         \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    116\u001b[0m             \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'lvs passed'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
+      "\u001b[1;31mValueError\u001b[0m: LVS failed.  check log file: /tools/projects/erichang/bag_gen/BAG2_cds_ff_mpt/pvs_run/lvs_run_dir/DEMO_AMP_CHAIN/AMP_CHAIN/lvsLog_20171128_0009272slvfabd"
+     ]
+    }
+   ],
+   "source": [
+    "%matplotlib inline\n",
+    "\n",
+    "import os\n",
+    "\n",
+    "from bag.design import Module\n",
+    "\n",
+    "\n",
+    "# noinspection PyPep8Naming\n",
+    "class demo_templates__amp_chain(Module):\n",
+    "    \"\"\"Module for library demo_templates cell amp_chain.\n",
+    "\n",
+    "    Fill in high level description here.\n",
+    "    \"\"\"\n",
+    "\n",
+    "    # hard coded netlist flie path to get jupyter notebook working.\n",
+    "    yaml_file = os.path.join(os.environ['BAG_WORK_DIR'], 'BAG_XBase_demo', \n",
+    "                             'BagModules', 'demo_templates', 'netlist_info', 'amp_chain.yaml') \n",
+    "\n",
+    "    def __init__(self, bag_config, parent=None, prj=None, **kwargs):\n",
+    "        Module.__init__(self, bag_config, self.yaml_file, parent=parent, prj=prj, **kwargs)\n",
+    "\n",
+    "    @classmethod\n",
+    "    def get_params_info(cls):\n",
+    "        # type: () -> Dict[str, str]\n",
+    "        \"\"\"Returns a dictionary from parameter names to descriptions.\n",
+    "\n",
+    "        Returns\n",
+    "        -------\n",
+    "        param_info : Optional[Dict[str, str]]\n",
+    "            dictionary from parameter names to descriptions.\n",
+    "        \"\"\"\n",
+    "        return dict(\n",
+    "            cs_params='common-source amplifier parameters dictionary.',\n",
+    "            sf_params='source-follwer amplifier parameters dictionary.',\n",
+    "        )\n",
+    "        \n",
+    "    def design(self, cs_params=None, sf_params=None):\n",
+    "        self.instances['XCS'].design(**cs_params)\n",
+    "        # TODO: design XSF\n",
+    "\n",
+    "        \n",
+    "import os\n",
+    "\n",
+    "# import bag package\n",
+    "import bag\n",
+    "from bag.io import read_yaml\n",
+    "\n",
+    "# import BAG demo Python modules\n",
+    "import xbase_demo.core as demo_core\n",
+    "from xbase_demo.demo_layout.core import AmpChainSoln\n",
+    "\n",
+    "# load circuit specifications from file\n",
+    "spec_fname = os.path.join(os.environ['BAG_WORK_DIR'], 'specs_demo/demo.yaml')\n",
+    "top_specs = read_yaml(spec_fname)\n",
+    "\n",
+    "# obtain BagProject instance\n",
+    "local_dict = locals()\n",
+    "if 'bprj' in local_dict:\n",
+    "    print('using existing BagProject')\n",
+    "    bprj = local_dict['bprj']\n",
+    "else:\n",
+    "    print('creating BagProject')\n",
+    "    bprj = bag.BagProject()\n",
+    "\n",
+    "demo_core.run_flow(bprj, top_specs, 'amp_chain', AmpChainSoln, sch_cls=demo_templates__amp_chain, run_lvs=True)"
+   ]
+  }
+ ],
+ "metadata": {
+  "anaconda-cloud": {},
+  "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.6.5"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/workspace_setup/tutorial_files/6_MOSDBDiscrete.ipynb b/workspace_setup/tutorial_files/6_MOSDBDiscrete.ipynb
new file mode 100644
index 0000000..e270106
--- /dev/null
+++ b/workspace_setup/tutorial_files/6_MOSDBDiscrete.ipynb
@@ -0,0 +1,251 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# MOSDBDiscrete\n",
+    "In this module, we will have a brief overview of the `MOSDBDiscrete` class, which manages a transistor characterization database and provide methods for designers to query transistor small signal parameters."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## MOSDBDiscrete example\n",
+    "To use the transistor characterization database, evaluate the following cell, which defines two methods, `query()` and `plot_data()`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%matplotlib inline\n",
+    "\n",
+    "import os\n",
+    "import pprint\n",
+    "\n",
+    "import numpy as np\n",
+    "import matplotlib.pyplot as plt\n",
+    "# noinspection PyUnresolvedReferences\n",
+    "from mpl_toolkits.mplot3d import Axes3D\n",
+    "from matplotlib import cm\n",
+    "from matplotlib import ticker\n",
+    "\n",
+    "from verification_ec.mos.query import MOSDBDiscrete\n",
+    "\n",
+    "interp_method = 'spline'\n",
+    "spec_file = os.path.join(os.environ['BAG_WORK_DIR'], 'demo_data', 'mos_char_nch', 'specs.yaml')\n",
+    "env_default = 'tt'\n",
+    "intent = 'standard'\n",
+    "\n",
+    "\n",
+    "def query(vgs=None, vds=None, vbs=0.0, vstar=None, env_list=None):\n",
+    "    \"\"\"Get interpolation function and plot/query.\"\"\"\n",
+    "\n",
+    "    spec_list = [spec_file]\n",
+    "    if env_list is None:\n",
+    "        env_list = [env_default]\n",
+    "\n",
+    "    # initialize transistor database from simulation data\n",
+    "    nch_db = MOSDBDiscrete(spec_list, interp_method=interp_method)\n",
+    "    # set process corners\n",
+    "    nch_db.env_list = env_list\n",
+    "    # set layout parameters\n",
+    "    nch_db.set_dsn_params(intent=intent)\n",
+    "    # returns a dictionary of smal-signal parameters\n",
+    "    return nch_db.query(vbs=vbs, vds=vds, vgs=vgs, vstar=vstar)\n",
+    "\n",
+    "\n",
+    "def plot_data(name='ibias', bounds=None, unit_val=None, unit_label=None):\n",
+    "    \"\"\"Get interpolation function and plot/query.\"\"\"\n",
+    "    env_list = [env_default]\n",
+    "    vbs = 0.0\n",
+    "    nvds = 41\n",
+    "    nvgs = 81\n",
+    "    spec_list = [spec_file]\n",
+    "\n",
+    "    print('create transistor database')\n",
+    "    nch_db = MOSDBDiscrete(spec_list, interp_method=interp_method)\n",
+    "    nch_db.env_list = env_list\n",
+    "    nch_db.set_dsn_params(intent=intent)\n",
+    "\n",
+    "    f = nch_db.get_function(name)\n",
+    "    vds_min, vds_max = f.get_input_range(1)\n",
+    "    vgs_min, vgs_max = f.get_input_range(2)\n",
+    "    if bounds is not None:\n",
+    "        if 'vgs' in bounds:\n",
+    "            v0, v1 = bounds['vgs']\n",
+    "            if v0 is not None:\n",
+    "                vgs_min = max(vgs_min, v0)\n",
+    "            if v1 is not None:\n",
+    "                vgs_max = min(vgs_max, v1)\n",
+    "        if 'vds' in bounds:\n",
+    "            v0, v1 = bounds['vds']\n",
+    "            if v0 is not None:\n",
+    "                vds_min = max(vds_min, v0)\n",
+    "            if v1 is not None:\n",
+    "                vds_max = min(vds_max, v1)\n",
+    "\n",
+    "    # query values.\n",
+    "    vds_test = (vds_min + vds_max) / 2\n",
+    "    vgs_test = (vgs_min + vgs_max) / 2\n",
+    "    pprint.pprint(nch_db.query(vbs=vbs, vds=vds_test, vgs=vgs_test))\n",
+    "\n",
+    "    vbs_vec = [vbs]\n",
+    "    vds_vec = np.linspace(vds_min, vds_max, nvds, endpoint=True)\n",
+    "    vgs_vec = np.linspace(vgs_min, vgs_max, nvgs, endpoint=True)\n",
+    "    vbs_mat, vds_mat, vgs_mat = np.meshgrid(vbs_vec, vds_vec, vgs_vec, indexing='ij', copy=False)\n",
+    "    arg = np.stack((vbs_mat, vds_mat, vgs_mat), axis=-1)\n",
+    "    ans = f(arg)\n",
+    "\n",
+    "    vds_mat = vds_mat.reshape((nvds, nvgs))\n",
+    "    vgs_mat = vgs_mat.reshape((nvds, nvgs))\n",
+    "    ans = ans.reshape((nvds, nvgs, len(env_list)))\n",
+    "\n",
+    "    formatter = ticker.ScalarFormatter(useMathText=True)\n",
+    "    formatter.set_scientific(True)\n",
+    "    formatter.set_powerlimits((-2, 3))\n",
+    "    if unit_label is not None:\n",
+    "        zlabel = '%s (%s)' % (name, unit_label)\n",
+    "    else:\n",
+    "        zlabel = name\n",
+    "    for idx, env in enumerate(env_list):\n",
+    "        fig = plt.figure(idx + 1)\n",
+    "        ax = fig.add_subplot(111, projection='3d')\n",
+    "        cur_val = ans[..., idx]\n",
+    "        if unit_val is not None:\n",
+    "            cur_val = cur_val / unit_val\n",
+    "        ax.plot_surface(vds_mat, vgs_mat, cur_val, rstride=1, cstride=1, linewidth=0, cmap=cm.cubehelix)\n",
+    "        ax.set_title('%s (corner=%s)' % (name, env))\n",
+    "        ax.set_xlabel('Vds (V)')\n",
+    "        ax.set_ylabel('Vgs (V)')\n",
+    "        ax.set_zlabel(zlabel)\n",
+    "        ax.w_zaxis.set_major_formatter(formatter)\n",
+    "\n",
+    "    plt.show()\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Querying Small-Signal Parameters\n",
+    "To lookup transistor small signal parameters given a bias point, use the `query()` method by evaluating the following cell.  Feel free to play around with the numbers."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'cdb': 6.248976739750922e-17,\n",
+       " 'cdd': 2.0328230225209543e-16,\n",
+       " 'cds': -2.4163000626635453e-17,\n",
+       " 'cgb': 9.966702597590937e-19,\n",
+       " 'cgd': 1.6495553548122168e-16,\n",
+       " 'cgg': 3.6228642234598553e-16,\n",
+       " 'cgs': 1.9633421660500474e-16,\n",
+       " 'csb': 1.1021134465725374e-16,\n",
+       " 'css': 2.82382560635623e-16,\n",
+       " 'gb': 1.983603067386341e-05,\n",
+       " 'gds': 4.719944723025589e-06,\n",
+       " 'gm': 9.49214016617884e-05,\n",
+       " 'ibias': 1.2299113540770929e-05,\n",
+       " 'vstar': 0.25914310841286414,\n",
+       " 'vgs': 0.4,\n",
+       " 'vds': 0.5,\n",
+       " 'vbs': 0.0}"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "query(vgs=0.4, vds=0.5, vbs=0.0)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Plotting Small-Signal Parameters\n",
+    "`MOSDBDiscrete` stores each small signal parameter as a continuous function interpolated from simulation data.  This makes it easy to manipulate those functions directly (such as using an optimization solver).  For a simple example, the `plot_data()` method simply plots the functions versus $V_{gs}$ and $V_{ds}$.  Evaluate the following cell to see plots of various different small signal parameters."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "create transistor database\n",
+      "{'cdb': 6.40259557187212e-17,\n",
+      " 'cdd': 2.0379145885397679e-16,\n",
+      " 'cds': -3.5466715265482257e-17,\n",
+      " 'cgb': 1.5429673845401091e-18,\n",
+      " 'cgd': 1.7523221840073783e-16,\n",
+      " 'cgg': 3.827084324971782e-16,\n",
+      " 'cgs': 2.0593324671190025e-16,\n",
+      " 'csb': 1.0744529426477165e-16,\n",
+      " 'css': 2.7791182571118964e-16,\n",
+      " 'gb': 3.648119000000001e-05,\n",
+      " 'gds': 7.598960000000004e-06,\n",
+      " 'gm': 0.00016568942500000004,\n",
+      " 'ibias': 3.931712000000002e-05,\n",
+      " 'vbs': 0.0,\n",
+      " 'vds': 0.5025,\n",
+      " 'vgs': 0.6040000000000001,\n",
+      " 'vstar': 0.4745881639700302}\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "%matplotlib inline\n",
+    "\n",
+    "plot_data(name='ibias')"
+   ]
+  }
+ ],
+ "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.6.5"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_1.PNG b/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_1.PNG
new file mode 100644
index 0000000..16b9fc2
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_1.PNG
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_1.png b/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_1.png
new file mode 100644
index 0000000..16b9fc2
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_1.png
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_2.PNG b/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_2.PNG
new file mode 100644
index 0000000..8463792
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_2.PNG
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_2.png b/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_2.png
new file mode 100644
index 0000000..8463792
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_2.png
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_3.PNG b/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_3.PNG
new file mode 100644
index 0000000..dcc3e72
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_3.PNG
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_3.png b/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_3.png
new file mode 100644
index 0000000..dcc3e72
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_3.png
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_4.PNG b/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_4.PNG
new file mode 100644
index 0000000..18bff8b
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_4.PNG
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_4.png b/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_4.png
new file mode 100644
index 0000000..18bff8b
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/1_flow_demo/flow_demo_4.png
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/2_xbase_routing/xbase_routing_1.PNG b/workspace_setup/tutorial_files/bootcamp_pics/2_xbase_routing/xbase_routing_1.PNG
new file mode 100644
index 0000000..96f98a9
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/2_xbase_routing/xbase_routing_1.PNG
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/2_xbase_routing/xbase_routing_1.png b/workspace_setup/tutorial_files/bootcamp_pics/2_xbase_routing/xbase_routing_1.png
new file mode 100644
index 0000000..96f98a9
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/2_xbase_routing/xbase_routing_1.png
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/2_xbase_routing/xbase_routing_2.PNG b/workspace_setup/tutorial_files/bootcamp_pics/2_xbase_routing/xbase_routing_2.PNG
new file mode 100644
index 0000000..a3d7aa4
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/2_xbase_routing/xbase_routing_2.PNG
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/2_xbase_routing/xbase_routing_2.png b/workspace_setup/tutorial_files/bootcamp_pics/2_xbase_routing/xbase_routing_2.png
new file mode 100644
index 0000000..a3d7aa4
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/2_xbase_routing/xbase_routing_2.png
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/2_xbase_routing/xbase_routing_3.PNG b/workspace_setup/tutorial_files/bootcamp_pics/2_xbase_routing/xbase_routing_3.PNG
new file mode 100644
index 0000000..9b7ab1e
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/2_xbase_routing/xbase_routing_3.PNG
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/2_xbase_routing/xbase_routing_3.png b/workspace_setup/tutorial_files/bootcamp_pics/2_xbase_routing/xbase_routing_3.png
new file mode 100644
index 0000000..9b7ab1e
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/2_xbase_routing/xbase_routing_3.png
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_1.PNG b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_1.PNG
new file mode 100644
index 0000000..97129cc
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_1.PNG
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_1.png b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_1.png
new file mode 100644
index 0000000..97129cc
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_1.png
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_2.PNG b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_2.PNG
new file mode 100644
index 0000000..dc55bab
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_2.PNG
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_2.png b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_2.png
new file mode 100644
index 0000000..dc55bab
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_2.png
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_3.PNG b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_3.PNG
new file mode 100644
index 0000000..3dfec20
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_3.PNG
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_3.png b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_3.png
new file mode 100644
index 0000000..3dfec20
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_3.png
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_4.PNG b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_4.PNG
new file mode 100644
index 0000000..0cc6b6b
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_4.PNG
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_4.png b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_4.png
new file mode 100644
index 0000000..0cc6b6b
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_4.png
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_5.PNG b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_5.PNG
new file mode 100644
index 0000000..db7654d
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_5.PNG
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_5.png b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_5.png
new file mode 100644
index 0000000..db7654d
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_5.png
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_6.PNG b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_6.PNG
new file mode 100644
index 0000000..eeecb60
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_6.PNG
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_6.png b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_6.png
new file mode 100644
index 0000000..eeecb60
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_6.png
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_7.PNG b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_7.PNG
new file mode 100644
index 0000000..2d1dbb3
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_7.PNG
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_7.png b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_7.png
new file mode 100644
index 0000000..2d1dbb3
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_7.png
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_8.PNG b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_8.PNG
new file mode 100644
index 0000000..30713eb
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_8.PNG
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_8.png b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_8.png
new file mode 100644
index 0000000..30713eb
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_8.png
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_9.PNG b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_9.PNG
new file mode 100644
index 0000000..a2d5642
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_9.PNG
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_9.png b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_9.png
new file mode 100644
index 0000000..a2d5642
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/3_analogbase/analogbase_9.png
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/5_hierarchical_generator/hierachical_generator_1.PNG b/workspace_setup/tutorial_files/bootcamp_pics/5_hierarchical_generator/hierachical_generator_1.PNG
new file mode 100644
index 0000000..187ab66
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/5_hierarchical_generator/hierachical_generator_1.PNG
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/5_hierarchical_generator/hierachical_generator_1.png b/workspace_setup/tutorial_files/bootcamp_pics/5_hierarchical_generator/hierachical_generator_1.png
new file mode 100644
index 0000000..187ab66
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/5_hierarchical_generator/hierachical_generator_1.png
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/5_hierarchical_generator/hierachical_generator_2.PNG b/workspace_setup/tutorial_files/bootcamp_pics/5_hierarchical_generator/hierachical_generator_2.PNG
new file mode 100644
index 0000000..4cde866
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/5_hierarchical_generator/hierachical_generator_2.PNG
Binary files differ
diff --git a/workspace_setup/tutorial_files/bootcamp_pics/5_hierarchical_generator/hierachical_generator_2.png b/workspace_setup/tutorial_files/bootcamp_pics/5_hierarchical_generator/hierachical_generator_2.png
new file mode 100644
index 0000000..4cde866
--- /dev/null
+++ b/workspace_setup/tutorial_files/bootcamp_pics/5_hierarchical_generator/hierachical_generator_2.png
Binary files differ
diff --git a/workspace_setup/tutorial_files/solutions/3_analogbase.ipynb b/workspace_setup/tutorial_files/solutions/3_analogbase.ipynb
new file mode 100644
index 0000000..0aa465d
--- /dev/null
+++ b/workspace_setup/tutorial_files/solutions/3_analogbase.ipynb
@@ -0,0 +1,224 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## SF Amplifier Solution\n",
+    "\n",
+    "The following cell contains the source-follwer amplifier layout solution.  If you evaluate the following cell LVS should pass."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "using existing BagProject\n",
+      "computing layout\n",
+      "ext_w0 = 1, ext_wend=7, ytop=2880\n",
+      "ext_w0 = 2, ext_wend=9, ytop=3024\n",
+      "final: ext_w0 = 1, ext_wend=7, ytop=2880\n",
+      "creating layout\n",
+      "layout done\n",
+      "computing AMP_SF schematics\n",
+      "creating AMP_SF schematics\n",
+      "running lvs\n",
+      "Running tasks, Press Ctrl-C to cancel.\n",
+      "lvs passed\n",
+      "lvs log is /users/erichang/projects/bag_gen/BAG2_cds_ff_mpt/pvs_run/lvs_run_dir/DEMO_AMP_SF/AMP_SF/lvsLog_20180906_110128hvrv5244\n",
+      "LVS flow done\n"
+     ]
+    }
+   ],
+   "source": [
+    "from abs_templates_ec.analog_core import AnalogBase\n",
+    "\n",
+    "\n",
+    "\n",
+    "class AmpSF(AnalogBase):\n",
+    "    \"\"\"A template of a single transistor with dummies.\n",
+    "\n",
+    "    This class is mainly used for transistor characterization or\n",
+    "    design exploration with config views.\n",
+    "\n",
+    "    Parameters\n",
+    "    ----------\n",
+    "    temp_db : :class:`bag.layout.template.TemplateDB`\n",
+    "            the template database.\n",
+    "    lib_name : str\n",
+    "        the layout library name.\n",
+    "    params : dict[str, any]\n",
+    "        the parameter values.\n",
+    "    used_names : set[str]\n",
+    "        a set of already used cell names.\n",
+    "    kwargs : dict[str, any]\n",
+    "        dictionary of optional parameters.  See documentation of\n",
+    "        :class:`bag.layout.template.TemplateBase` for details.\n",
+    "    \"\"\"\n",
+    "\n",
+    "    def __init__(self, temp_db, lib_name, params, used_names, **kwargs):\n",
+    "        AnalogBase.__init__(self, temp_db, lib_name, params, used_names, **kwargs)\n",
+    "        self._sch_params = None\n",
+    "\n",
+    "    @property\n",
+    "    def sch_params(self):\n",
+    "        return self._sch_params\n",
+    "\n",
+    "    @classmethod\n",
+    "    def get_params_info(cls):\n",
+    "        \"\"\"Returns a dictionary containing parameter descriptions.\n",
+    "\n",
+    "        Override this method to return a dictionary from parameter names to descriptions.\n",
+    "\n",
+    "        Returns\n",
+    "        -------\n",
+    "        param_info : dict[str, str]\n",
+    "            dictionary from parameter name to description.\n",
+    "        \"\"\"\n",
+    "        return dict(\n",
+    "            lch='channel length, in meters.',\n",
+    "            w_dict='width dictionary.',\n",
+    "            intent_dict='intent dictionary.',\n",
+    "            fg_dict='number of fingers dictionary.',\n",
+    "            ndum='number of dummies on each side.',\n",
+    "            ptap_w='NMOS substrate width, in meters/number of fins.',\n",
+    "            ntap_w='PMOS substrate width, in meters/number of fins.',\n",
+    "            show_pins='True to draw pin geometries.',\n",
+    "        )\n",
+    "\n",
+    "    def draw_layout(self):\n",
+    "        \"\"\"Draw the layout of a transistor for characterization.\n",
+    "        \"\"\"\n",
+    "\n",
+    "        lch = self.params['lch']\n",
+    "        w_dict = self.params['w_dict']\n",
+    "        intent_dict = self.params['intent_dict']\n",
+    "        fg_dict = self.params['fg_dict']\n",
+    "        ndum = self.params['ndum']\n",
+    "        ptap_w = self.params['ptap_w']\n",
+    "        ntap_w = self.params['ntap_w']\n",
+    "        show_pins = self.params['show_pins']\n",
+    "\n",
+    "        fg_amp = fg_dict['amp']\n",
+    "        fg_bias = fg_dict['bias']\n",
+    "\n",
+    "        if fg_bias % 2 != 0 or fg_amp % 2 != 0:\n",
+    "            raise ValueError('fg_bias=%d and fg_amp=%d must all be even.' % (fg_bias, fg_amp))\n",
+    "\n",
+    "        fg_half_bias = fg_bias // 2\n",
+    "        fg_half_amp = fg_amp // 2\n",
+    "        fg_half = max(fg_half_bias, fg_half_amp)\n",
+    "        fg_tot = (fg_half + ndum) * 2\n",
+    "\n",
+    "        nw_list = [w_dict['bias'], w_dict['amp']]\n",
+    "        nth_list = [intent_dict['bias'], intent_dict['amp']]\n",
+    "\n",
+    "        ng_tracks = [1, 3]\n",
+    "        nds_tracks = [1, 1]\n",
+    "\n",
+    "        n_orient = ['R0', 'MX']\n",
+    "\n",
+    "        self.draw_base(lch, fg_tot, ptap_w, ntap_w, nw_list,\n",
+    "                       nth_list, [], [],\n",
+    "                       ng_tracks=ng_tracks, nds_tracks=nds_tracks,\n",
+    "                       pg_tracks=[], pds_tracks=[],\n",
+    "                       n_orientations=n_orient,\n",
+    "                       )\n",
+    "\n",
+    "        if (fg_amp - fg_bias) % 4 == 0:\n",
+    "            s_net, d_net = 'VDD', 'vout'\n",
+    "            aout, aoutb, nsdir, nddir = 'd', 's', 2, 0\n",
+    "        else:\n",
+    "            s_net, d_net = 'vout', 'VDD'\n",
+    "            aout, aoutb, nsdir, nddir = 's', 'd', 0, 2\n",
+    "\n",
+    "        bias_col = ndum + fg_half - fg_half_bias\n",
+    "        amp_col = ndum + fg_half - fg_half_amp\n",
+    "        amp_ports = self.draw_mos_conn('nch', 1, amp_col, fg_amp, nsdir, nddir,\n",
+    "                                       s_net=s_net, d_net=d_net)\n",
+    "        bias_ports = self.draw_mos_conn('nch', 0, bias_col, fg_bias, 0, 2,\n",
+    "                                        s_net='', d_net='vout')\n",
+    "\n",
+    "        vdd_tid = self.make_track_id('nch', 1, 'g', 0)\n",
+    "        vin_tid = self.make_track_id('nch', 1, 'g', 2)\n",
+    "        vout_tid = self.make_track_id('nch', 0, 'ds', 0)\n",
+    "        vbias_tid = self.make_track_id('nch', 0, 'g', 0)\n",
+    "\n",
+    "        vin_warr = self.connect_to_tracks(amp_ports['g'], vin_tid)\n",
+    "        vout_warr = self.connect_to_tracks([amp_ports[aout], bias_ports['d']], vout_tid)\n",
+    "        vbias_warr = self.connect_to_tracks(bias_ports['g'], vbias_tid)\n",
+    "        vdd_warr = self.connect_to_tracks(amp_ports[aoutb], vdd_tid)\n",
+    "        self.connect_to_substrate('ptap', bias_ports['s'])\n",
+    "\n",
+    "        vss_warrs, _ = self.fill_dummy()\n",
+    "\n",
+    "        self.add_pin('VSS', vss_warrs, show=show_pins)\n",
+    "        self.add_pin('VDD', vdd_warr, show=show_pins)\n",
+    "        self.add_pin('vin', vin_warr, show=show_pins)\n",
+    "        self.add_pin('vout', vout_warr, show=show_pins)\n",
+    "        self.add_pin('vbias', vbias_warr, show=show_pins)\n",
+    "\n",
+    "        self._sch_params = dict(\n",
+    "            lch=lch,\n",
+    "            w_dict=w_dict,\n",
+    "            intent_dict=intent_dict,\n",
+    "            fg_dict=fg_dict,\n",
+    "            dum_info=self.get_sch_dummy_info(),\n",
+    "        )\n",
+    "\n",
+    "\n",
+    "import os\n",
+    "\n",
+    "# import bag package\n",
+    "import bag\n",
+    "from bag.io import read_yaml\n",
+    "\n",
+    "# import BAG demo Python modules\n",
+    "import xbase_demo.core as demo_core\n",
+    "from xbase_demo.demo_layout.core import AmpSFSoln\n",
+    "\n",
+    "# load circuit specifications from file\n",
+    "spec_fname = os.path.join(os.environ['BAG_WORK_DIR'], 'specs_demo/demo.yaml')\n",
+    "top_specs = read_yaml(spec_fname)\n",
+    "\n",
+    "# obtain BagProject instance\n",
+    "local_dict = locals()\n",
+    "if 'bprj' in local_dict:\n",
+    "    print('using existing BagProject')\n",
+    "    bprj = local_dict['bprj']\n",
+    "else:\n",
+    "    print('creating BagProject')\n",
+    "    bprj = bag.BagProject()\n",
+    "\n",
+    "demo_core.run_flow(bprj, top_specs, 'amp_sf_soln', AmpSF, run_lvs=True, lvs_only=True)"
+   ]
+  }
+ ],
+ "metadata": {
+  "anaconda-cloud": {},
+  "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.6.5"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/workspace_setup/tutorial_files/solutions/4_schematic.ipynb b/workspace_setup/tutorial_files/solutions/4_schematic.ipynb
new file mode 100644
index 0000000..f850568
--- /dev/null
+++ b/workspace_setup/tutorial_files/solutions/4_schematic.ipynb
@@ -0,0 +1,180 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "collapsed": true
+   },
+   "source": [
+    "## AmpSF schematic generator solution\n",
+    "The follow cell contains the solution for AmpSF schematic generator.  you should be able to evaluate it and run the flow.  Note that it uses `amp_sf_soln` schematic template instead of the `amp_sf` schematic template you meant to fill out.  If you wish to debug your schematic template, you can change `amp_sf_soln` to `amp_sf` in the `yaml_file` class variable."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "using existing BagProject\n",
+      "computing layout\n",
+      "ext_w0 = 1, ext_wend=7, ytop=2880\n",
+      "ext_w0 = 2, ext_wend=9, ytop=3024\n",
+      "final: ext_w0 = 1, ext_wend=7, ytop=2880\n",
+      "creating layout\n",
+      "layout done\n",
+      "creating AMP_SF schematics\n",
+      "running lvs\n",
+      "Running tasks, Press Ctrl-C to cancel.\n",
+      "lvs passed\n",
+      "lvs log is /users/erichang/projects/bag_gen/BAG2_cds_ff_mpt/pvs_run/lvs_run_dir/DEMO_AMP_SF/AMP_SF/lvsLog_20180906_111315b1mh7xr5\n",
+      "computing AMP_SF_tb_dc schematics\n",
+      "creating AMP_SF_tb_dc schematics\n",
+      "computing AMP_SF_tb_ac_tran schematics\n",
+      "creating AMP_SF_tb_ac_tran schematics\n",
+      "schematic done\n",
+      "setting up AMP_SF_tb_dc\n",
+      "running simulation\n",
+      "Running tasks, Press Ctrl-C to cancel.\n",
+      "simulation done, load results\n",
+      "setting up AMP_SF_tb_ac_tran\n",
+      "running simulation\n",
+      "Running tasks, Press Ctrl-C to cancel.\n",
+      "simulation done, load results\n",
+      "all simulation done\n",
+      "loading simulation data for AMP_SF_tb_dc\n",
+      "loading simulation data for AMP_SF_tb_ac_tran\n",
+      "finish loading data\n",
+      ", gain=0.05005\n",
+      ", f_3db=1.124e+10, f_unity=-1, phase_margin=360\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 2 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEaCAYAAAAPGBBTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xd4HNX1//H3Z9Vty3IvcpONjW1wwxaYUEMgQOgt9BpCSYCEkEAIkC+QQMIvhSSEDqEHjIEECL0kmA6WwQ0bjLuNe2+y6vn9MSO8FtJqJe1qVc7reQZNn3PXQmfvnZl7ZWY455xztYmkOgDnnHPNmycK55xzMXmicM45F5MnCuecczF5onDOOReTJwrnnHMxeaJwLZ6kzyR9O4HnWyjpkESdz7mWzhOFa5Twj2qppG7V1k+VZJIKkh2Dme1uZm+F171B0mPJvmYyhZ9psaQtUVN+quNybZcnCpcIC4DTqhYkjQRyUhdOq3C0mXWImpZV30FSeioCc22PJwqXCI8CZ0ctnwM8Er2DpCMlfSppk6Qlkm6otv1sSYskrZX06+jmn7CWMFHSI5I2h01NhVHHLpR0iKTDgWuAU8Jv4dOit0ftv1OtQ9JZUde+tlpcEUlXS5oXbp8oqUtNH4Kk2ZKOilpOl7RG0lhJ2ZIeC8+xQdJkST3j/YDD8xWEtbTzJS0G/huu31vS++F5p0U3w0kaKGlS+Lm9Lun2qrJL+rakpdWuEf2511r2qFjOkbQ4LOe1UedJk3RNeOxmSVMk9ZN0h6Q/V7vmfyRdXp/PwjUtTxQuET4EOkoaLikNOAWo3vyzlSCZdAKOBH4k6TgASbsBdwJnAL2BPKBPteOPASaExz8P3F49CDN7Bfgd8GT4LXx0XYGH174LOAvIB7oCfaN2+QlwHHBguH09cEctp3uCqJoVcBiwxsw+IUieeUC/8BoXA8V1xVeLA4HhwGGS+gAvAjcBXYBfAM9I6h7u+zgwBegG/DaMI17xlH0/YChwMPB/koaH668g+CyOADoCPwC2AQ8Dp0mKAIRNlgcTfHaumfJE4RKlqlbxXeBz4KvojWb2lpnNMLNKM5tO8IfhwHDzScB/zOxdMysF/g+o3gnZu2b2kplVhNeqMwnE6STgBTN728xKgF8DlVHbLwKuNbOl4fYbgJNqafZ5HDhGUrtw+fRwHUAZQYIYbGYVZjbFzDbFiOvZsIawQdKz1bbdYGZbzawYOBN4KfxsKs3sdaAIOEJSf2BP4NdmVmJmbwP/ie9jibvsN5pZsZlNA6ax49/lh8B1ZvaFBaaZ2Voz+xjYSJAcAE4F3jKzlfWIyzUxb+N0ifIo8DYwkGrNTgCSxgO3ACOATCALeCrcnA8sqdrXzLZJWlvtFCui5rcB2ZLSzay8kXFXv/bWatceAPxbUnTyqAB68s1kOFfSbOBoSf8hqAXtEW5+lKA2MUFSJ4Ia17VmVlZLXMeZ2Ru1bFsSNT8A+L6ko6PWZQD/C8u23sy2Rm1bFMYRj1hlr1L936VDON8PmFfLeR8mSHCvhz//Fmc8LkW8RuESwswWEdzUPgL4Vw27PE7QZNTPzPKAuwGF25YT1dwjKYfg23eDQqlh3VagXdRyr6j55UT94QxrA9HXXgJ8z8w6RU3ZZrZTkohS1fx0LDDLzOYCmFmZmd1oZrsB+wBHsfN9nfqILuMS4NFq8bU3s1vCsnWW1D5q//5R8zt9LmGzYfeo7fUte7QlwC61bHsMOFbSaIImtOo1JtfMeKJwiXQ+8J1q32Cr5ALrzGy7pL0ImmWqPE3wLXwfSZnAjexIIvW1EiioagMPTQVOlZQR3gQ/qdq1j5K0X3jt37Dz/xd3AzdLGgAgqbukY2NcfwJwKPAjdjQ7IekgSSPDP8abCJqiKhpYxmiPEXx2h4U3kLPDm9R9w+RdBNwoKVPSfkB0zWMOQc3sSEkZwHUENb0q9S17tPuB30oaosAoSV0BzGwpMJmglvVM2ITmmjFPFC5hzGyemRXVsvnHwG8kbSa4BzEx6rjPgMsI/sguBzYDq4CSBoRR1Zy1VtIn4fyvCb7dridIQl//AQ+vfUm4bnm4T/STQH8jqAm9Fsb+ITC+toub2XLgA4Jaw5NRm3oRJKVNwGxgEt+84V9vZraEoPZyDbCa4Jv8lez4f/v0MN51wPVENQua2UaCf5f7CZrRttKIsldzK8G/8WsEZf4HOz8y/TAwkiBZuGZOPnCRa24kdQA2AEPMbEGq42lNFDyWPNjMzkxxHAcQJMoCM6usa3+XWl6jcM2CpKMltQvb0/8EzAAWpjYqlwxhM9dPgfs9SbQMnihcc3EssCychgCnmld3W53wPYsNBO/L/DXF4bg4edOTc865mLxG4ZxzLiZPFM4552JqFW9md+vWzQoKClIdhnPOtShTpkxZY2bd69qvVSSKgoICiopqe3zfOedcTSQtimc/b3pyzjkXU6uoUTTU/NVbuPnF2akOo01RQzvmSIm6g62tPKplH4VbpB3rhb4+QICk8GfUsoL9IuFxEQkpWI5IpEVEJFxOSxNpEukRkRaJkJ4WbE8Pp4z0CBlpETLTImSmR8hKj5CVnkZWRoScjDSyMyLkZKbTPjONdpnpZKb798m2rk0nivJKY+Xm7akOo81oSU9ixxNrbbvU9sh51WrDouZ37G/hf6rWWXiMYVRW7jh3pUHl19uNispgMoOKqOXyysR84JlpEXKz0+mYk0HH7HTy2mXSuV0Gndtl0j036+spPy+H/E7Z5GZnJOS6rvlo04li1565vHDZ/qkOw7mkqQwTRnllZfCzwiirqKS0vDL4Gc6XlFeyvayC7WWVFJdVUFxaztaSCraWlLOltJzN28vZVFzGpu3lbNhWyoI1W1i/tYwtJd/s5T03O50BXdtR0LU9A7u1Z0jPXIb3ymVgt/akp3ntpCVq04nCudYuEhGZEZGZpNuRxaUVrNlSwspN21m+cTvLNhTz1YZiFq7dxoyvNvLyzBVUhDWbzLQIw/M7ske/TuzRvxPjB3alV152UuJyieWJwjnXYDmZafTr0o5+XdrVuL2kvIL5q7fy+YpNzFq2iWlLNzJh8mIeen8hAIN7dGC/wd04aFgPvjWoq98PaaZaRRcehYWF5o/HOtcylFVU8vnyzXwwfw3vzl3LxwvWsr2sko7Z6RwyvCdHj8nngCHdSYu0qCcfWiRJU8yssM79PFE451Jpe1kF7365hlc+W8Hrs1aysbiM3nnZnDSuL6fu1Z8+nXLqPolrkBabKML+8i8gGIQF4BozeynWMZ4onGsdSssreWP2Sp6cvIS3v1xNROKoUb258IBB7J6fl+rwWp14E0VzvUfxFzP7U6qDcM41rcz0CEeM7M0RI3vz1YZiHnx3AU98vJjnpi7jO8N6cNXhQxnWq2Oqw2xz6qxRSOoB7AvkA8XATKAoWQOOhDWKLfVJFF6jcK712ritjMc+WsTdk+axpaScE8f25Yrv7kq+N0k1WqObniQdBFwNdAE+JRjDOBvYlWD84aeBP5vZpkQFHV73BuBcgnF2i4Cfm9n6Gva7ELgQoH///uMWLYqryxLnXAu1YVspd741j4feX0h6RPz80KGcu0+B3/RuhEQkij8CfzezxTVsSweOAtLM7JkGBPcGwWDz1V1LMID7GoIXVH8L9DazH8Q6n9conGs7lqzbxv89N5P/fbGakX3yuOXEkX7/ooFa7M3saJIKgBfMbESs/TxRONe2mBkvzljODc/PYmNxKVcdNozz9xtIxGsX9RJvooj5doukAyWNCudPlnS7pJ9JykpUoDVcs3fU4vEE90Scc+5rkjhqVD6v/+wADhrag5tfms05D37MKu+7LSliNT3dAYwCsoA5QAfgFWAfgianM5ISkPQoMIag6WkhcJGZLY91jNconGu7zIx/frSY374wi7ycDO45axx79O+c6rBahETco5hlZrtJyga+AnqYWYUkAdPNbGRiQ244TxTOuc9XbOKCR4pYuamEW04YyQlj+6Y6pGYvEU1P2wHMbDuwyMwqwmUDyhISpXPOJciwXh15/pL9GNe/M1dMnMbvX55NZYK6Wm/rYr1w10PSFQRjp1TNEy7XOcaqc841tc7tM3nk/L244fnPuGfSfNZsLuWWE0eS4d2bN0qsRHEfkFvDPMD9SYvIOecaISMtwk3HjaBnx2xufX0OG7aVcscZY8nOSEt1aC1WrYnCzG5sykCccy5RJPGTg4fQuX0m//fcTM5+4GMePHdP2mc1116LmrdaPzVJt8U60Mx+kvhwnHMucc7aewCdcjK4/MmpnPfQZB46b0/aZXqyqK9YDXdTwikbGAt8GU5jgIrkh+acc4139Oh8/nLKGIoWruP8h4ooLvU/X/UVq+npYQBJ5wIHmVlZuHw38FqTROeccwlwzOh8KiuNKyZO5YJHivjHuYVkpfs9i3jF8yhAPjvfyO4QrnPOuRbjuD368IeTRvPu3DVc8eS0r8fydnWLp7HuFuBTSf8Llw8EbkhaRM45lyQnjevL+q2l3PzSbLp2yOTGY3YneIfYxVJnojCzByW9DIwPV11tZiuSG5ZzziXHBQcMYvWWEu59ez7dO2Rx2cFDUh1SsxfrqacCM1sIECaG56ptF9DHzJYmNULnnEuwqw8fxprNJfz59Tn079qOY8f0SXVIzVqsGsUfJUUIEsQUgjGss4HBwEHAwcD1gCcK51yLEomIW04cxdINxVz59HT6dm7HuAHekWBtar2ZbWbfB34NDAXuAN4hSBo/BL4AvmNmrzdFkM45l2iZ6RHuOXMcvfOyuejRIpas25bqkJqtZj1wUby891jnXEPNXbWF4+98j/y8HP71433a1NvbCRm4yDnnWrvBPTpw5xlj+XLVZq58ehqt4ctzonmicM61efsP6c4vDx/GSzNWcPek+akOp9nxROGcc8CFBwziyFG9+eOrn/P2nNWpDqdZqTNRKHCmpP8Ll/tL2iv5oTnnXNORxB9OHMWQHrn8ZMKnLF3vN7erxFOjuBP4FnBauLyZ4CmoBpP0fUmfSaqUVFht268kzZX0haTDGnMd55yrj/ZZ6dxz1jjKK4xLH/+U0vLKVIfULMSTKMab2SXsGBp1PZDZyOvOBE4A3o5eKWk34FRgd+Bw4E5J3nOXc67JFHRrzx9OGsXUJRu45eXPUx1OsxBPoigL/1gbgKTuQKPSrJnNNrMvath0LDDBzErMbAEwF/BmLudckzpiZG/O3aeAB95bwCszvceieBLFbcC/CcbNvhl4F/hdkuLpAyyJWl4arvsGSRdKKpJUtHq133hyziXWr44Yxui+eVz59LQ2/zJenYnCzP4JXAX8HlgOHGdmT9V1nKQ3JM2sYTo21mE1hVBLXPeaWaGZFXbv3r2ucJxzrl6y0tO4/fSxAPxkwqeUVbTd+xWxOgXsErW4CngiepuZrYt1YjM7pAHxLAX6RS33BZY14DzOOddo/bq04/cnjOTSxz/lr2/M4crDhqU6pJSoayjUInZ0CDiHYCjU1eG6ZHgeOFVSlqSBwBDg4yRdyznn6nTUqHxO3bMfd741j/fnrkl1OCkRq1PAgWY2CHgVONrMuplZV+Ao4F+Nuaik4yUtJXjs9kVJr4bX/AyYCMwCXgEuMTMf4NY5l1L/d/RuDOrWnsufnMraLSWpDqfJxXMze08ze6lqwcxeJhjlrsHM7N9m1tfMssysp5kdFrXtZjPbxcyGhtdyzrmUapeZzt9PG8uGbWVc/a8Zba4/qHgSxRpJ10kqkDRA0rXA2mQH5pxzzclu+R256vChvD5rJRMmL6n7gFYknkRxGtCd4BHZZ4Ee7HhL2znn2owf7DuQ/QZ34zf/mcX81VtSHU6Tiefx2HVm9lMz2yOcflrXE0/OOdcaRSLiT98fTVZGhMufnNpmHpmNp1PA/0n6b/WpKYJzzrnmpldeNrecMJLpSzfy9ze/THU4TSKeoZx+ETWfDZwIlCcnHOeca/4OH9GbE8f25fb/zeXbw3owtn/rHm87nqanKVHTe2Z2BTC+CWJzzrlm6/pjdqN3Xg5XPDmVrSWt+7tzPE1PXaKmbmHX372aIDbnnGu2OmZn8OeTR7No3TZufml2qsNJqnianqYQ9LckgianBcD5yQzKOedagr0HdeWC/Qdx79vz+e7wnhw0rEeqQ0qKeB6PHW5mg8I3tYeY2aHA5GQH5pxzLcHPD92VoT1zueqZ6azfWprqcJIinkTxfg3rPkh0IM451xJlpadx6ymj2bCtlOuendkq39quNVFI6iVpHJAjaQ9JY8Pp20C7JovQOeeaud3z87j8kF15ccZynp/W+jq8jnWP4jDgXIKuvm+NWr8ZuCaJMTnnXItz0QGDeHP2Sn797Ez2GtiF3nk5qQ4pYWL1HvuwmR0EnGtmB0VNx5hZo3qPdc651iY9LcKtJ4+hrMK46unpraoJKlbT05nhbIGkK6pPTRSfc861GAXd2nPNkcN558s1PPbR4lSHkzCxbma3D392AHJrmJxzzlVz5vj+HLBrd3734mwWrtma6nASQq2helRYWGhFRUWpDsM55wBYsXE7h/5lEoN7dOCpi/chLaJUh1QjSVPMrLCu/eJ5M7u7pGsk3SvpgaopMWE651zr0ysvm98eN4JPFm/g7knzUh1Oo8XzZvZzwDvAG4APS+qcc3E4ZnQ+r322kr++MYdvD+3O7vl5qQ6pweJ54a6dmf3SzCaa2TNVU2MuKun7kj6TVCmpMGp9gaRiSVPD6e7GXMc551JFEjcdN4LO7TL52ZNT2V7Wcr9nx5MoXpB0RIKvOxM4AXi7hm3zzGxMOF2c4Os651yT6dw+k/930ijmrNzCn1/7ItXhNFg8ieKnBMmiWNImSZslbWrMRc1stpm13E/NOefidNDQHpwxvj/3v7uAD+atTXU4DRLPeBS5ZhYxsxwz6xgud0xiTAMlfSppkqT9a9tJ0oWSiiQVrV69OonhOOdc41xzxHAGdGnHL56axsbislSHU2/xPPU0toZpF0kxb4RLekPSzBqmY2Mcthzob2Z7AFcAj0uqMSmZ2b1mVmhmhd27d6+rGM45lzLts9L5yyljWLFpO9c/NzPV4dRbPE893QmMBWaEyyOBaUBXSReb2Ws1HWRmh9Q3GDMrAUrC+SmS5gG7Av6ShHOuRdujf2cu+85g/vrGlxw8vCdHj85PdUhxi+cexUJgDzMbZ2bjgDEEN6MPAf6QyGDCdzbSwvlBwBBgfiKv4ZxzqXLpQYMZ068T1/57Bss2FKc6nLjFkyiGmdlnVQtmNosgcTT4D7ik4yUtBb4FvCjp1XDTAcB0SdOAp4GLzWxdQ6/jnHPNSXpahL+eMobySuOKiVOpqGwZPWPEkyi+kHSXpAPD6U5gjqQsoEF3Zczs32bW18yyzKynmR0Wrn/GzHY3s9FmNtbM/tOQ8zvnXHNV0K09Nx6zOx/OX9di3tqOJ1GcC8wFLgd+RtAUdC5BkjgoWYE551xrddK4vhw5qjd/eX0OU5dsSHU4dfJOAZ1zLgU2bivjiNveIT1NvPiT/emQFc+zRYmVyE4Bh0h6WtIsSfOrpsSE6ZxzbVNeuwz+euoYlqzbxnX/ntGsBzqKp+npQeAuoJygqekR4NFkBuWcc23BngVd+OnBu/Ls1GU8NWVpqsOpVTyJIsfM3iRoplpkZjcA30luWM451zZc+p3B7LNLV/7vuZl8uXJzqsOpUTyJYrukCPClpEslHQ/0SHJczjnXJqRFxF9PGUOHrHQuefwTikubXy+z8SSKy4F2wE+AccBZwDnJDMo559qSHh2z+cspY/hy1RZ+/dzMZne/os7b7GY2OZzdApyX3HCcc65t2n9Idy77zhBue/NLxg3ozGl79U91SF+rNVFIej7WgWZ2TOLDcc65tuunBw9h6pINXP/cZ+ye35FRfTulOiQgxnsUklYDS4AngI+AnUYHN7NJSY8uTv4ehXOutVi3tZSj//4uAC9cth+d22cm7VqJeI+iF3ANMAL4G/BdYI2ZTWpOScI551qTLu0zufOMsazeXMJlT3xKeUVlqkOqPVGYWYWZvWJm5wB7E3Tj8Zaky5osOueca4NG9+vETceN4N25a7j5pdmpDif2zeyw478jgdOAAuA24F/JD8s559q2k/fsx+crNvPAewsY3qsjJ+/ZL2WxxLqZ/TBBs9PLwI1m1vKGZXLOuRbsmiOG8eWqzVz77AwGdW9PYUGXlMQR6x7FWQSjy/0UeF/SpnDaLGlT04TnnHNtV3pahNtPG0vfzu244JEiFqzZmpI4Yt2jiJhZbjh1jJpyzazGcaydc84lVl67DB48d08kce6DH7N2S0mTxxDPm9nOOedSqKBbe+4/p5AVG7dz/sNFTd7NR0oShaQ/Svpc0nRJ/5bUKWrbryTNlfSFpMNSEZ9zzjU3Y/t35m+n7sG0pRu49PFPKGvCx2ZTVaN4HRhhZqOAOcCvACTtBpwK7A4cDtwpKS1FMTrnXLNy+Ihe/PbYEbz5+SqumDitycbcbvohlQAzey1q8UPgpHD+WGCCmZUACyTNBfYCPmjiEJ1zrlk6c+8BbC0p5/cvf077zDR+f8JIJNV9YCOkJFFU8wPgyXC+D0HiqLI0XOeccy500YG7sKWknL//dy7ts9L59VG7JfV6SUsUkt4g6AakumvN7Llwn2sJRs77Z9VhNexfY91K0oXAhQD9+zefXhadc64pXPHdXSkurWDXnrlJv1bSEoWZHRJru6RzgKOAg21Hz4RLgejXD/sCy2o5/73AvRB0CtjogJ1zrgWRxHVJrklUSdVTT4cDvwSOMbNtUZueB06VlCVpIDAE+DgVMTrnnAuk6h7F7UAW8Hp4E+ZDM7vYzD6TNBGYRdAkdYmZNb9xAZ1zrg2pdTyKliQcO2MRkAdsjNoUazl6vhuwJgGhVL9eQ/etbVtN6xtS5kSVt7aYGrJfospc27a2Uubm/Hsda7uXOTV/vwaYWfc69zKzVjMB98a7XG2+KBnXb+i+tW2raX1Dypyo8tanzHXtl6gy17atrZS5Of9ee5njL189y5+w3+3aptbWhcd/6rFcfVsyrt/QfWvbVtP6llLmuvZLVJnr+jwSoTmXuTn/Xsfa7mVO/f/LtWoVTU+NJanI4hgOsLVoa+UFL3Nb4WVOjtZWo2ioe1MdQBNra+UFL3Nb4WVOAq9RuGZH0lvAY2Z2f6pjcc55jcKliKSFkoolbZG0UtKDkjqkOq5EkvSQpNKwjFXTKamOy7n68kThUuloM+sAjAX2BK5LcTzJ8Acz6xA1PVl9B0nNoc8152rlicKlnJl9RTA2+4io1QMkvRcOvfuapG5VGyQ9JWmFpI2S3pa0e9S2IyTNCo/7StIvorYdJWmqpA2S3pc0qqZ4JN0t6U/V1j0n6Ypw/pfhuTeH46YcXN8yhzWqX0qaDmyVlC4pX9IzklZLWiDpJ1H754Q1lPVh+a6UtDRqu0kaHLX8kKSb4il7GMsvwvFhNkp6UlJ21PZjw2M3SZon6XBJ35c0pVqZfi7p2fp+Fq7580ThUk5SP+AI4NOo1acD5wE9gEzgF1HbXibo3qUH8Ak7OpUE+AdwkZnlEiSe/4bXGAs8AFwEdAXuAZ6XlFVDSI8DpyjsNkBSZ+BQYIKkocClwJ7hNQ4DFjaw6KcBRwKdgEqCRx6nEfSYfDBwedTgXdcDu4TTYcA58V4kzrKfTDAGzEBgFHBueOxewCPAlWGcBxCU93lgoKThUec4E3g03rhcy+GJwqXSs5I2AO8Ck4DfRW170MzmmFkxMBEYU7XBzB4ws80WjFtyAzBaUl64uQzYTVJHM1tvZp+E6y8A7jGzj8yswsweBkqAvWuI6x2CXov3D5dPAj4ws2VABUH3M7tJyjCzhWY2L0YZfxF+i98gqfrbs7eZ2ZKwjHsC3c3sN2ZWambzgfsIBvKC4A/5zWa2zsyWALfFuGZ18ZT9NjNbZmbrCBJW1ed9PvCAmb1uZpVm9pWZfR5+9k8SJAfCWl0B8EI94nIthCcKl0rHmVknMxtgZj8O/2BWWRE1vw3oACApTdItYRPIJnZ8m69qmjqRoHaySNIkSd8K1w8Afh71R3sDQU/F+dWDsuBRwAkE3/ghqN38M9w2F7icIEGtkjRB0jfOEeVPYRk7mVm3atuWRM0PAPKrxXcN0DPcnl9t/0UxrlldPGWv8fMO96stET4MnB7WvM4CJoYJxLUynihcS3M6wUiIhxD0d1MQrheAmU02s2MJmqWeJaiNQPBH9uaoP9qdzKydmT1Ry3WeAE6SNAAYDzxTtcHMHjez/Qj+ABvw/xpYluhn05cAC6rFl2tmR4Tbl7NzF/zVB2HZBrSLWo4eC6a+ZY+2hKC565vBm30IlBLUvE7Hm51aLU8UrqXJJWg2WUvwh/Hr5ipJmZLOkJRnZmXAJoKmIgiacS6WNF6B9pKOlFTjqC9m9imwGrgfeNXMNoTXGCrpO2H7/nagOOoajfExsCm8wZ0T1pxGSNoz3D4R+JWkzpL6ApdVO34qwbf7NAXd+B8Yta1eZa/mH8B5kg6WFJHUR9KwqO2PEPQGXW5m7zak4K7580ThWppHCJpdviLojv7DatvPAhaGzVIXE7ahm1kRQVv97cB6YC7hDdsYniCouTwetS4LuIWgt84VBDWXaxpcmpAF3ekfTXBvYEF4/vsJak0ANxKUewHwGt/89v7T8PgNwBkEtamqczek7FXHfkzwUMFfCHornURQk6ryKMFDA16baMX8zWznWiBJ3yZ4e71viuPIAVYBY83sy1TG4pLHaxTOucb4ETDZk0Tr5m+EOucaRNJCgocIjktxKC7JvOnJOedcTN705JxzLqZW0fTUrVs3KygoSHUYzjnXokyZMmWNxTFmdrNNFOGz4H8D0oD7zeyW2vYtKCigqKioyWJzzrnWQFJcb/g3y6YnSWnAHcD3gN2A0yTtltqonHOubWquNYq9gLlhx2hImkDQbcOsRF6krKKS9dtK49pXQQ8RsfepZZfajlS1A7TTtlqurdr22XG+6uepOl6qfX3V8aparq0wzrk2p7kmij7s3AHaUoL+dhJq1rJNHHvHe4k+basSnUQiVclFfD0fCZOKBJGon1XrI18v77wtIhF8cEPHAAAcMUlEQVSJiLSqnxF2zEf9TE8TaRGRHqn6Gfl6XUYkQlqayIiIjLQI6WkRMtOC+Yz0CBlpETLTg3VZ6WlkpkfISo+QlZ5GVkaE7PBnTsaOnzkZaaSnNcuKtnMp01wTRU1fZ3d6jlfShcCFAP37V+8fLT59Oudw03Ej6twvrgeIa3nMuLZjq+8e/Ziy1bLfzut3PkHVokXtZbbjmGDevnlOs6/3q9rn6+PMvrG+suo8BpW2Y11leNJKs53XVxqGRc0H+1RU2tc/KyprWmeUV1ayvdyorDTKK43yimBdRaVRVrFjn7IKo7wi+FlaUVnLJx6/zLQIOZlptM9Mo11WOu0z0+iQnU77zHQ6ZKfTMTuD3Ox0crPTycvJIC8ng445GXTKyaRz+ww6t8skOyOt0XE411w010SxlJ17yuwLLIvewczuBe4FKCwsbNDLIN06ZHHm3gPq3tG1GBYmmrIKo7S8kpKKCkrLK4OpopKSskpKyispKa9ge1kl28sqgqm8kuLScraXVbKttILi0nK2llawrbScLSUVbC0pZ+2WbWzeXs7m7WVsKSmnMsZvXbvMNLp2yKRL+yy6d8iie24w9eyYRa+O2fTsmE1+pxw6t8vwZj7X7DXXRDEZGCJpIEHnb6cSdGPsXEwKm6vS0yAnMw3ISMp1zIwtJeVs2l7Oxm1lbCguZeO2MtZtK2XDtjLWbill3dYS1m4tZen6bUxdsp61W0u/UZPMzoiQ3ymHvp3b0b9LDv27tGNA1/YM6tae/l3bkZXuNROXes0yUZhZuaRLgVcJHo99wMw+S3FYzn1NErnZGeRmZ9CnU05cx5RXVLJmSykrNm1nxcbtLN9YzLINxXy1oZgl64qZtmQDG4vLvt4/IujXpR1DeuQypGcHhvXKZXjvjgzq1t7vo7gm1SwTBYCZvQS8lOo4nEuU9LQIvfKy6ZWXvXPDapSNxWUsWruVBWu2Mm/1Vuat2sKXqzYzac4qyiqC6khWeoRhvTsyum8eo/t2Ykz/Tgzq1t6bsFzStIq+ngoLC81fuHOtWVlFJfNXb2XW8o189tUmZny1kZlfbWRraTBmUtf2mRQWdGbPgi7sO7gbQ3vmEol44nCxSZpiZoV17RezRhGOpHUqwVCH+QSjec0EXgReNrPGP2LinKtTRlqEob1yGdorl+P3CNZVVBrzVm/hk0XrmbxwPUWL1vHqZyuBIHHsO7gbBw3rzoG79qBL+8wURu9aulprFJIeJHif4QWgiGBwkmxgV+AgYBxwtZm93TSh1s5rFM4Flm8s5r25a3lv7hre+XI1a7aUEhGM7d+Z743szfdG9CI/znsqrvWLt0YRK1GMMLOZMS6QCfQ3s7kNDzMxPFE4902Vlcb0rzby389X8dpnK/h8xWYAxvbvxPFj+3L0qN50auc1jbas0YmilpN2BvqZ2fTGBJdoniicq9v81Vt4eeYKnp+6jC9WbiYzLcLBw3twxvgB7LNLV7+n0QYlLFFIegs4huB+xlRgNTDJzK5IQJwJ4YnCufiZGbOWb+KZKV/x70+Xsn5bGQO7teeM8f05Zc9+5GYn590T1/wkMlF8amZ7SPohQW3ieknTzWxUooJtLE8UzjXM9rIKXp65nMc+XMyURevJzUrnjL0HcN6+BfTsmJ3q8FySJeSpp6p9JPUGTgaubXRkzrlmIzsjjeP36Mvxe/Rl+tIN3PP2fO59ex4PvLuA0/bqxyUHDaaHJ4w2L55E8RuCN6TfM7PJkgYBXyY3LOdcUxvVtxN3nD6WRWu3ctdb83jso8VMmLyEs781gEsOGuw3vtswf+HOOVejRWu38rc3v+TZT7+iY04GPztkV04f358M7z6k1Yi36anOf3FJu0p6U9LMcHmUpOsSEaRzrvka0LU9t548hhd/sj+753fk+uc/43t/e4cP569NdWiuicXz1eA+4FdAGUD4aOypyQzKOdd8DO/dkcfOH899ZxdSUl7Bqfd+yC+fns6GOEeHdC1fPIminZl9XG1deTKCcc41T5L47m49ee3yA7nowEE8/clSDrl1Eq99tiLVobkmEE+iWCNpF8JBzySdBCxPalTOuWYpJzONX31vOM9fui89crO58NEpXP3MdLaW+HfH1iyeRHEJcA8wTNJXwOXAj5IalXOuWds9P49nL9mXiw/chSeLlnDEbe8w86uNqQ7LJUmdicLM5pvZIUB3YJiZ7WdmC5MemXOuWctMj3D194Yx4YK9KS2v5IS73ufJyYtTHZZLgnieeuop6R/A02a2WdJuks5vgticcy3A+EFdeeGy/diroAu/fGYGVz09je1lFakOyyVQPE1PDxG8cJcfLs8haH5yzjkAunbI4uEf7MVl3xnMxKKlnH7fh6zdUpLqsFyCxJMoupnZRKASgvGsAf+64JzbSVpE/PzQodx1xlg+W7aJ4+58j7mrNqc6LJcA8SSKrZK6suOpp70Bv2vlnKvR90b25smLvkVxaSXH3/m+v6DXCsSTKK4Angd2kfQe8AhwWVKjcs61aGP6deLZS/ahZ8dsznngY96cvTLVIblGiJkoJEUIhj89ENgHuAjYvbkNXOSca376dm7HxIu+xdBeuVz06BSem/pVqkNyDRQzUZhZJfBnMys3s8/MbKaZlTVRbM65Fq5L+0z++cPxjBvQmcufnOqPz7ZQ8TQ9vSbpREkJGydR0h8lfS5puqR/S+oUte1XkuZK+kLSYYm6pnMuNXKzM3j4B3txwJDuXP2vGTw9ZWmqQ3L1FO89iqeAEkmbJG2WtKmR130dGBGOkjeHoNNBJO1G0OHg7sDhwJ2S0hp5LedcimVnpHHPWePYd5duXPn0NJ791JuhWpJ43szONbOImWWaWcdwuWNjLmpmr4WP2QJ8CPQN548FJphZiZktAOYCezXmWs655iE7I437zi5k74FduWLiVF6a4V3GtRTxvJk9toZpF0nxjI4Xjx8AL4fzfYAlUduWhutqiutCSUWSilavXp2gUJxzyZSTmcY/zi1kbP/OXD5hKu/PW5PqkFwc4ml6upPgW/994fQhMAGYI+nQ2g6S9IakmTVMx0btcy1Bl+X/rFpVw6lqHILPzO41s0IzK+zevXscxXDONQftMtP5xzl7UtCtHRc+MsU7E2wB4kkUC4E9zGycmY0DxgAzgUOAP9R2kJkdYmYjapieA5B0DnAUcIbtGI91KdAv6jR9gWX1LpVzrlnLaxfc4O6Ync65D05m8dptqQ7JxRBPohhmZp9VLZjZLILEMb+hF5V0OPBL4Bgzi/4NeR44VVKWpIHAEKD6oEnOuVagd14Oj5y/F+WVlZz30MdsLPYn75ureBLFF5LuknRgON1J0OyURTg8agPcDuQCr0uaKulugDAhTQRmAa8Al5iZ9yvlXCs1uEcud585jsXrtnHp459QVlGZ6pBcDbSj1aeWHaQc4MfAfgT3EN4luG+xnWCY1C3JDrIuhYWFVlRUlOownHMNNLFoCVc9PZ0zxvfnpuNGkMDXtlwMkqaYWWFd+9X55JKZFYe1iBfM7Itqm1OeJJxzLd/Jhf2Yt3oL90yaz5AeHTh334GpDslFiefx2GOAqQRNQUgaI+n5ZAfmnGtbfnnYMA4Z3oObXpzNR97jbLMSzz2K6wleetsAYGZTgYIkxuSca4MiEXHrKWPo36Udlzz+CSs2bk91SC4UT6IoNzN/0Nk5l3QdszO456xxbCut4OLHplBS7s+yNAfxJIqZkk4H0iQNkfR34P0kx+Wca6OG9MzlT98fzdQlG/jtC7NSHY4jvkRxGUEnfSXAE8AmfMxs51wSHTGyNxceMIjHPlzMf6b5O7epFs9TT9uAa8PJOeeaxJWHDWXKovVc/cx0RvTJY2C39qkOqc2qa4S7cyR9ImlrOBVJOrupgnPOtV0ZaRH+ftoeZKZH+PE/P2F7md+vSJVaE0WYEC4Hfg7kE/TiehXwU08WzrmmkN8ph1tPGcPs5Zv4jd+vSJlYNYofA8eb2f/MbKOZbTCz/wInhtuccy7pDhrag4sOHMTjHy3mlZk+hkUqxEoUHc1sYfWV4bpGDVzknHP18fPvDmVU3zx++cwMlm0oTnU4bU6sRBHrX8P/pZxzTSYzPcLfTt2DsopKfvbkVCoqY/dR5xIrVqIYLml6DdMMYFhTBeiccwADu7XnN8eO4KMF67jzf3NTHU6bEuvx2OFNFoVzzsXhxLF9eHvOav765pfsv2t3xvTrlOqQ2oRYNYrFZraotglA3hewc64JSeK3x42gZ24Wl0/4lK0l5akOqU2IlSj+J+kySf2jV0rKlPQdSQ8D5yQ3POec21leTgZ/PnkMi9Zt46YXZ6c6nDYhVqI4HKgAnpC0TNIsSfOBL4HTgL+Y2UNNEKNzzu3kW7t05cIDBvHEx4t5fdbKVIfT6tV6j8LMthOMZHenpAygG1BsZhuaKjjnnKvNFd/dlXfmrOHqZ6Yzpt8BdM/NSnVIrVY8nQJiZmVmttyThHOuuchKT+Ovp45hc0k5Vz8znbqGdXYNF1eicM655mjXnrlcffgw3vx8FRMmL0l1OK2WJwrnXIt27j4F7Du4K799YRYL12xNdTitUlyJQtIASYeE8zmScpMblnPOxScSEX/6/mjSI+JnE6dSXlGZ6pBanToThaQLgKeBe8JVfYFnkxmUc87VR++8HG46fiSfLt7AHf+bl+pwWp14ahSXAPsSjGyHmX0J9EhUAJJ+IckkdQuXJek2SXPDLkPGJupazrnW65jR+Rw3Jp/b/vslU5f4czeJFE+iKDGz0qoFSelAQh4vkNQP+C6wOGr194Ah4XQhcFciruWca/1uPHYEvTpm+1vbCRZPopgk6RogR9J3gaeA/yTo+n8hGAwpOvEcCzxigQ+BTpJ6J+h6zrlWLHhre3T41rYPdJQo8SSKq4HVwAzgIuAl4LrGXljSMcBXZjat2qY+QPRzbkvDddWPvzAcmrVo9erVjQ3HOddK7D2o6q3tJbwyc0Wqw2kVYvUeC4CZVQL3AfdJ6gL0tTjfbJH0BtCrhk3XAtcAh9Z0WE1h1BDXvcC9AIWFhf6mjXPuaz//7lA+mLeWq/81ndH98uidl5PqkFq0eJ56ektSxzBJTAUelHRrPCc3s0PMbET1CZgPDASmSVpI8CTVJ5J6EdQg+kWdpi+wrH7Fcs61ZVUDHZWW+0BHiRBP01OemW0CTgAeNLNxwCGNuaiZzTCzHmZWYGYFBMlhrJmtAJ4Hzg6fftob2GhmPlCuc65eBnZrz43H7M6H89dx9yR/ZLYx4kkU6eHN5JOBF5IcDwT3QOYDcwmavH7cBNd0zrVCJ43ry9Gj87n19TlMXrgu1eG0WPEkit8ArwJzzWyypEEEXY0nTFizWBPOm5ldYma7mNlIMytK5LWcc22HJH53/Aj6dc7h0sc/Ye2WklSH1CLVmSjM7CkzG2VmPw6X55vZickPzTnnGi83O4M7zhjL+m1l/GziNCr9fkW9xXMzO1vSJZLulPRA1dQUwTnnXCLsnp/H9UfvxttzVnPnW3NTHU6LE0/T06MEj7geBkwieAppczKDcs65RDt9r/4cOyafP78+h7e+WJXqcBrNzLju2Rk88sHCpF8rnkQx2Mx+DWw1s4eBI4GRyQ3LOecSSxK/P2EkQ3vm8pMnPm3xXZLfNWkej324mJWbtif9WvEkirLw5wZJI4A8oCBpETnnXJK0y0znvrMLSYuICx4pYksL7Q/q+WnL+MMrX3DsmHx+cejQpF8vnkRxr6TOwK8J3nGYBfwhqVE551yS9OvSjttPH8v8NVtb5Mt4Hy9Yxy8mTmOvgi784aRRSDV1ZpFY8Tz1dL+ZrTezSWY2KHxR7u6kR+acc0my7+BuXHfkcF6ftZKbXpzVYsbbnr18Exc8UkTfLjnce/Y4stLTmuS6dfb1JCkLOJGguenr/c3sN8kLyznnkuu8fQeyZF0xD7y3gD6dcvjh/oNSHVJMC9ds5ax/fExORhoPn7cXndplNtm160wUwHPARmAK4G+rOOdajeuOHM7KTdu56cXZ9OyYzdGj81MdUo2WbSjmjPs/otKMx344nn5d2jXp9eNJFH3N7PCkR+Kcc00sEhF/Pnk0qzeXcMXEqbTLTOPg4T1THdZOVmzczpn3f8Sm4jKeuHBvBvfIbfIY4rmZ/b4kfxzWOdcqZWekcd85hezWuyMXPzaFN2evTHVIX1uybhvfv+d9Vm0u4cHz9mREn7yUxFFropA0Q9J0YD+CLsC/CMewrlrvnHOtQl5OBo+cP57hzShZzF21he/f/QGbisv55w/HU1jQJWWxxGp6OqrJonDOuRTLy8ng0fPHc9Y/PuKiR6fwuxNGcnJhv7oPTILJC9dx0aNTiAgmXLg3w3t3TEkcVWI1Pa0EjgeuBA4nGLZ0UdXUJNE551wTysvJ4LEfjmfvQV256unp/OGVz5u8E8EnJy/m9Ps+JC8ng4kXfSvlSQJiJ4qHgUKCsbK/B/y5SSJyzrkU6pidwYPn7clpe/XjzrfmcekTn7B5e1ndBzZSSXkFNzz/Gb98ZgZ7D+rKsz/el0HdOyT9uvGI1fS0m5mNBJD0D+DjpgnJOedSKyMtwu+OH8mgbh34/cuzmbZkI7eePJrxg7om5Xozv9rIzydO44uVmzlv3wKuPWI46WnxPGvUNGJF8nUKNbOW2SGKc841kCQuOGAQT128Dxlp4tT7PuR3L81OaP9QxaUV/PWNORx3x3us31bKg+fuyfVH796skgSAant1XVIFUNW9ooAcYFs4b2aW+oazUGFhoRUV+UB4zrnk2FpSzs0vzebxjxbTpX0mlxw0mDPG9yc7o2FdaJSWVzJh8mL+/t+5rN5cwrFj8rnxmN2b9G1rAElTzKywzv1aSh8nsXiicM41hWlLNvDHV7/g3blr6NUxmxPH9eG4MX0Y0jO+l+C+XLmZ56Yu41+fLGXZxu3sVdCFKw8fyp4pevTVE4VzziXJ+3PXcPfb83n3y9VUGgztmcuYfp0Y2iuXwT06kJkewQxKKyqZt2oLs5dvYtrSDcxZuYWIgk4Jf7j/IA4Y0q1Jen+tjScK55xLstWbS3hpxnJen7WS2cs3sXZraY37dW2fyfDeHTl4eA+OGpVP99ysJo60ZvEminj6enLOOVeD7rlZnLNPAefsUwAEiWPBmq2UV1YCkB6JMLBb+2aTGBrKE4VzziVI99ysFp8UatK8nsFyzjnX7HiicM45F1OruJktaTWwCMgjGGSpSqzl6PluwJoEhFL9eg3dt7ZtNa1vSJkTVd7aYmrIfokqc23b2kqZm/PvdaztXubU/P0aYGbd69zLzFrNBNwb73K1+aJkXL+h+9a2rab1DSlzospbnzLXtV+iylzbtrZS5ub8e+1ljr989Sx/wn63a5taW9PTf+qxXH1bMq7f0H1r21bT+pZS5rr2S1SZ6/o8EqE5l7k5/17H2u5lTv3/y7VqFU1PjSWpyOJ4lri1aGvlBS9zW+FlTo7WVqNoqHtTHUATa2vlBS9zW+FlTgKvUTjnnIvJaxTOOedi8kThnHMuJk8UzjnnYvK+nqqRFAF+C3QkeD754RSHlHSS9gfOIPh92M3M9klxSEknqT9wO8GLSnPM7JYUh5R0knYDbgDWAm+a2dOpjSg5JA0CrgXyzOykcF174E6gFHjLzP6ZwhATrpYyf2NdQ7WJGoWkByStkjSz2vrDJX0haa6kq8PVxwJ9CIaCXdrUsSZKfcpsZu+Y2cXAC0CLTYz1/HfeFXjRzH4A7NbkwSZIPcv8PeDvZvYj4OwmD7YR6vn7PN/Mzq92ihOAp83sAuCYJgq7URpb5lo+hwZpE4kCeAg4PHqFpDTgDoL/eXYDTgu/cQ0FPjCzK4AfNXGcifQQ8Ze5yunAE00VYBI8RPxl/hQ4VdJ/gf81cZyJ9BDxl/lRgjL/EejaxHE21kPU//c5Wl9gSThfkaQYE+0hGlfmhGkTicLM3gbWVVu9FzA3zLqlwASC2sRSYH24T0v5hfqGepa5qilmo5ltatpIE6eeZT4PuN7MvgMc2bSRJk59ymxmq8zsEuBqEtfvVZOo7+9zDZYSJAtoIX/3ElDmhGkRH1iS9GHHNwwIfpH6AP8CDpP0d+DtVASWRLWVGeB84MEmjyj5aivzK8BPJN0NLExBXMlUY5klFUi6F3gE+GNKIkus2srZNfx33UPSr8Jt/wJOlHQXTdz9RYLFXeZaPocGacs3s2saqNbMbBvBH83WqMYyA5jZ9U0cS1Op7d95JtCoG3zNWG1lXghc2MSxJFNt5VwLXFxt5VaCWmRLV58yf2NdQ7XlGsVSoF/Ucl9gWYpiaSpeZi9za9JWyhktJWVuy4liMjBE0kBJmcCpwPMpjinZvMxe5takrZQzWkrK3CYShaQngA+AoZKWSjrfzMqBS4FXgdnARDP7LJVxJpKX2ctMKypzWylntOZUZu8U0DnnXExtokbhnHOu4TxROOeci8kThXPOuZg8UTjnnIvJE4VzzrmYPFE455yLyROFa1UkVUiaGjUVpDqmRJK0h6T7w/lzJd1ebftbkgpjHD9B0pBkx+lal7bc15NrnYrNbExtGyWlhy8ttVTXADc14vi7gKuACxITjmsLvEbhWr3wm/dTkv4DvBauu1LSZEnTJd0Yte+14aAwb0h6QtIvwvVff1OX1E3SwnA+TdIfo851Ubj+2+ExT0v6XNI/JSnctqek9yVNk/SxpFxJ70gaExXHe5JGVStHLjDKzKbFUeZjompVX0haEG56BzhEkn9JdHHzXxbX2uRImhrOLzCz48P5bxH8kV0n6VBgCEHf/gKel3QAsJWg75w9CP7f+ASYUsf1zicYx2NPSVnAe5JeC7ftAexO0Gnbe8C+kj4GngROMbPJkjoCxcD9wLnA5ZJ2BbLMbHq1axUCM6utO0XSflHLgwHM7HnCPoAkTQQmhesrJc0FRsdRNucATxSu9amt6el1M6saBObQcPo0XO5AkDhygX+HXc0jKZ7O1g4FRkmq6rI8LzxXKfCxmS0NzzUVKAA2AsvNbDJA1UBRkp4Cfi3pSuAHBKObVdcbWF1t3ZNmdmnVgqS3ojdKuorgM7kjavUqIB9PFC5OnihcW7E1al7A783snugdJF1OOD5HDcrZ0VSbXe1cl5nZq9XO9W2gJGpVBcH/b6rpGma2TdLrBKOVnUxQe6iuuNq1Y5J0MPB94IBqm7LDczkXF79H4dqiV4EfSOoAIKmPpB4EIxoeLyknvB9wdNQxC4Fx4fxJ1c71I0kZ4bl2ldQ+xrU/B/Il7Rnunxt1v+B+4DZgclTtJ9pswqalukgaANwJnGxm1ZPCrkCr6WXVJZ/XKFybY2avSRoOfBDeX94CnGlmn0h6EpgKLCK48VvlT8BESWcB/41afz9Bk9In4c3q1cBxMa5dKukU4O+Scgi+2R8CbDGzKZI2UcuQtGb2uaQ8SblmtrmOYp4LdAX+HZZxmZkdIaknQVPU8jqOd+5r3s24c7WQdAPBH/A/NdH18oG3gGFmVlnLPj8DNpvZ/Q28xs+ATWb2jwYH6tocb3pyrhmQdDbwEXBtbUkidBc73/uorw3Aw4043rVBXqNwzjkXk9conHPOxeSJwjnnXEyeKJxzzsXkicI551xMniicc87F5InCOedcTP8fm4mS4TehxEkAAAAASUVORK5CYII=\n",
+      "text/plain": [
+       "<Figure size 432x288 with 2 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAEWCAYAAABMoxE0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3X2cXGV99/HPd2dndpNsgJCsCITwIFgaeyPRBZW7itQooG2wDwpUFNtY1BZ7t/QJS1/Y0tveKm2tVVrBSisV5Ump1IaARVpRDBIEAoECMYiEgIkkgYRkn2Z/9x/nzDKsu9nZ7J6ZMNf3/XrtK3POuc6Z35zdXL+5ruuc6ygiMDMz21MdrQ7AzMxe3JxIzMxsWpxIzMxsWpxIzMxsWpxIzMxsWpxIzMxsWpxIzNqApHdJurnVcVianEis7Um6SdJF46w/TdJTkjqnefz/kvS+6RyjgfdYK2lH/lOV1F+3/KcRcWVEvKXIGMwm4kRiKfgX4N2SNGb9u4ErI2K4+SFNTUS8IiJ6IqIHuA04t7YcEX/V6vgsbU4kloJ/A/YHXl9bIWke8IvAFfnyvpKukLRZ0mOS/kxSR77tzyV9sW7fwySFpE5JH82P+5m8dfCZsW8uaaWkc8esu1fSryjzSUmbJD0jaY2kn5vqB5T0XknfrlsOSb8t6RFJ2yX9paSXSfqupGclXSOpUlf+FyXdI2mbpNslHTPVGCxdTiTW9iJiF3AN8J661e8E/ici7s2XPw3sCxwBnJiX/Y0Gjn0BL2whnDtOsS8BZ9YWJC0GDgX+A3gL8Abg5cB+wOnA01P5fLtxCvBq4LXAHwOXAe8CDgF+rhaTpFcBlwPvB+YDlwI3SOqaoTiszTmRWCq+ALxD0qx8+T35OiSVyCrwD0fE9oj4IfA3ZF1fM+F64FhJh+bL7wK+GhEDwBAwFzgaUEQ8GBFPztD7fjwino2ItcD9wM0RsT4ingFuBJbk5X4LuDQi7oiIakR8ARggS0Bmk3IisSRExLeBzcBpko4AjiNrKQAsACrAY3W7PAYcPEPvvZ2s9XFGvuoM4Mp82zeBzwCXAD+WdJmkfWbifYEf173eNc5yT/76UOAP8m6tbZK2kbVaDpqhOKzNOZFYSq4ga4m8m+zbea1i/QlZy+DQurKLgCfy188Bs+u2vXTMcRuZQvvLwJmSXgfMAm4d3Tni7yPi1cAryLq4/qihTzNzHgc+GhH71f3MjogvNzkOe5FyIrGUXAEsJevK+UJtZURUycZQPippbt4FdR5QG2C/B3iDpEWS9gU+POa4PyYbW9mdFWSJ6iLg6ogYAZB0nKTXSCqTJax+oDqNz7gnPgd8II9DkuZIepukuU2Ow16knEgsGfnYx+3AHOCGMZs/RFaRrwe+TdbtdXm+3zeAq4E1wF3A18fs+yng1yRtlfT3E7z3APBVskT2pbpN+5BV5FvJutOeBv56jz7gHoqI1WTJ9TN5HOuA9zYzBntxkx9sZWZm0+EWiZmZTYsTiZmZTYsTiZmZTUuhiUTSKZIekrRO0vnjbD9P0gP5tBC31G7YknRsPpXD2nzb6XX7XJkf835Jl+dXu5iZWYsUNtie3y38MPBmYANwJ3BmRDxQV+Yk4I6I2Cnpg8AbI+J0SS8HIiIekXQQ2ZUyPxsR2yS9leyuXMiufvlWRPzj7mJZsGBBHHbYYTP9Ec3M2tpdd931k4jonazctKbPnsTxwLqIWA8g6SrgNGA0kUTErXXlVwFn5esfriuzUdImoBfYFhEratskfQ9YOFkghx12GKtXr57epzEzS4ykxyYvVWzX1sFkd8zWbGD3U04s5/mWxihJx5NNX/GDMevLZHcor5x2pGZmtseKbJGMffYDTDCVhKSzgD6yWVfr1x8I/Ctwdu1O4Dr/QNatddsExzwHOAdg0aJFU4vczMwaVmSLZAPZxG81C4GNYwtJWgpcACzL7/6trd+HbKK7P4uIVWP2+QhZV9d5E715RFwWEX0R0dfbO2kXn5mZ7aEiE8mdwFGSDs8foHMGY6alkLSE7NkHyyJiU936CtnU21dExLVj9nkfcDLZwP3YVoqZmTVZYYkkf3zpucBNwIPANRGxVtJFkpblxS4mm8r62vzpbLVE806yh/28N19/j6Rj822fBQ4Avpuvv7Coz2BmZpNLYq6tvr6+8FVbZmZTI+muiOibrJzvbDczs2kp8qot20MRwY+fHeCxp59j0/YBdg4O89xAlcHqCCMRRGRlIrLL4OrXWWu99oj5nHDkglaHYdZUTiR7kce37OTz336Um9c+xcZn+vfoGBrvomtrighYufYpbv79EycvbNZGnEj2El+5awMX/Nt9VEeCNx19AO8/cT6HL5jDS/ftZk5XJ3MqJSqdHXRISCCyfzskRJZA5CzSUh/52v1cf/cTkxc0azNOJHuBr6/ZyB9edy+vPXw+f3v6Kzlw31mtDsn2wEv26ebZ/mF2DVaZVSm1OhyzpvFge4v9+Nl+PvyV+3jVonn8828c5yTyItbb0wXAT3YMTFLSrL04kbTYp7/5CAPDI/zNO15Jd9nfYl/M5nZnDfznBodbHIlZczmRtNDW5wa57q4NvH3JQRy2YE6rw7Fp6skTyY5+JxJLixNJC9209in6h0Z4z+sOa3UoNgPmdGWJZPuAE4mlxYmkhVaufYpF+8/mFQft0+pQbAbM7XKLxNLkRNIi/UNVbl/3NG9ZfIAv220To11bbpFYYpxIWuS+J55hsDrCa46Y3+pQbIb0uEViiXIiaZHVP9wKwKsW7dfiSGymzKl4jMTS5ETSIt//0VYOXzCH+fm9B/bi19Eh5lRKbpFYcpxIWuThH29nsQfZ286sSoldQ9VWh2HWVE4kLdA/VOVHW3ZyZG9Pq0OxGdbVWWLAicQS40TSAus3P0cEHPkSJ5J2013uoH/YicTS4kTSAus27wDgqAOcSNpNd7lE/9BIq8MwayonkhZYv3kHEhw239OitJsskbhFYmlxImmBjdt20dvT5Uka21B3ucOJxJJTaCKRdIqkhyStk3T+ONvPk/SApDWSbpF0aL7+WEnflbQ233Z63T6HS7pD0iOSrpZUKfIzFOHJZ/o5aD9PF9+OZrlryxJUWCKRVAIuAU4FFgNnSlo8ptjdQF9EHANcB3wiX78TeE9EvAI4Bfg7SbU79z4OfDIijgK2AsuL+gxFeWLbLg7ar7vVYVgBusolD7ZbcopskRwPrIuI9RExCFwFnFZfICJujYid+eIqYGG+/uGIeCR/vRHYBPQqm5TqF8iSDsAXgLcX+BlmXETw5LZ+P8CqTXV3lhhwi8QSU2QiORh4vG55Q75uIsuBG8eulHQ8UAF+AMwHtkVE7dbhCY8p6RxJqyWt3rx58x6EX4xndg2xa6jKgfu6RdKOPEZiKSoykYw3pW2MW1A6C+gDLh6z/kDgX4HfiIiRqRwzIi6LiL6I6Ovt7Z1S4EV6YtsuAA72GElb6i6XGBh2i8TS0lngsTcAh9QtLwQ2ji0kaSlwAXBiRAzUrd8H+A/gzyJiVb76J8B+kjrzVsm4x9ybbdqefcSX7OMWSTtyi8RSVGSL5E7gqPwqqwpwBnBDfQFJS4BLgWURsalufQW4HrgiIq6trY+IAG4Ffi1fdTbwtQI/w4zbsmMQgPlzXnQXm1kDujtLDI8Ew1W3SiwdhSWSvMVwLnAT8CBwTUSslXSRpGV5sYuBHuBaSfdIqiWadwJvAN6br79H0rH5tj8BzpO0jmzM5PNFfYYibHkuSyT79ziRtKPavUH97t6yhBTZtUVErABWjFl3Yd3rpRPs90XgixNsW092RdiL0padg5RLGn0sq7WX7nL23ax/qDr6oCuzduc725tsy45B5s2u+PG6baqr1iLxOIklxImkyZ5+bpD9PT7Stka7tnwviSXEiaTJtu4cZL7HR9pWV2f2X2rAd7dbQpxImmzLc1nXlrWnSin7LzVUHff2JrO25ETSZE/vGPClv22skrdIBn3VliXEiaSJhqsjPNs/zDwnkrblRGIpciJpoh0D2RRh+3SXWxyJFaU82rXlRGLpcCJpou39WSKZ2+37C9pVbYzE821ZSpxImsiJpP2Ndm25RWIJcSJpou39QwDMdddW26q1SDxGYilxImkit0jaX61F4jESS4kTSRPVBts9B1P78lVbliInkiZy11b7K5eyOdScSCwlTiRN9Ky7ttqeB9stRU4kTbRjYJhySaPzMVn78WC7pcg1WhNt7x9ibnfZU8i3MUlUSh1ukVhSnEiaaHv/sLu1ElAuyS0SS4oTSRPtcCJJQqWzw5f/WlKcSJpoe/+wL/1NQKWzwy0SS0qhiUTSKZIekrRO0vnjbD9P0gOS1ki6RdKhddtWStom6etj9nmTpO9LukfStyUdWeRnmEk7h4aZU3EiaXflkhOJpaWwRCKpBFwCnAosBs6UtHhMsbuBvog4BrgO+ETdtouBd49z6H8E3hURxwJfAv5spmMvys7BKrMqpVaHYQWrdHYw4K4tS0iRLZLjgXURsT4iBoGrgNPqC0TErRGxM19cBSys23YLsH2c4wawT/56X2DjTAdelP7BKrPKTiTtrlLqYMgtEktIkf0sBwOP1y1vAF6zm/LLgRsbOO77gBWSdgHPAq8dr5Ckc4BzABYtWtRIvIXbNeQWSQoqnb7819JSZItkvJslxn2QtaSzgD6y7qzJ/D7w1ohYCPwz8LfjFYqIyyKiLyL6ent7Gwy5WO7aSkPFYySWmCJbJBuAQ+qWFzJON5SkpcAFwIkRMbC7A0rqBV4ZEXfkq64GVs5MuMUaGQkGhkfctZUAX7VlqSmyRXIncJSkwyVVgDOAG+oLSFoCXAosi4hNDRxzK7CvpJfny28GHpzBmAuza6gK4ESSgHLJ95FYWgprkUTEsKRzgZuAEnB5RKyVdBGwOiJuIOvK6gGuzacN+VFELAOQdBtwNNAjaQOwPCJukvRbwFckjZAllt8s6jPMpFoime2urbZX6ezwo3YtKYXe1BARK4AVY9ZdWPd66W72ff0E668Hrp+pGJtl12CWSLrdIml7Hmy31PjO9iYZ7dpyi6TtdblryxLjRNIktRaJx0jan+9st9Q4kTSJWyTp8FVblhonkiZxiyQd2ey/494yZdaWnEiaxC2SdJT9YCtLjBNJk9RaJLPLnv233VVKYqg6QoRbJZYGJ5Im2Zm3SLorPuXtrlzqIAKGR5xILA2u1Zqk32MkySh3Zv+tfAmwpcKJpEl2OpEko1LKE8mwWySWBieSJtk1VKVcEp0ln/J2V2uReMDdUuFarUmGqiN0dbo1koJKKXuCgru2LBVOJE0yVB2hXBrvES3Wbsp5q9M3JVoqnEiaZHB4ZLSCsfZW+z27RWKpcM3WJINVJ5JUVDxGYolxzdYkQ9Wgq9OnOwWjV215mhRLhGu2Jhly11Yy3LVlqXHN1iRD1RHKnR5sT0HtogoPtlsqnEiaxGMk6fB9JJYa12xN4qu20vH8ne1OJJaGQms2SadIekjSOknnj7P9PEkPSFoj6RZJh9ZtWylpm6Svj9lHkj4q6WFJD0r63SI/w0wZqo6MVjDW3iqdHmy3tBRWs0kqAZcApwKLgTMlLR5T7G6gLyKOAa4DPlG37WLg3eMc+r3AIcDREfGzwFUzHHohhqoxWsFYe/Ngu6WmyJrteGBdRKyPiEGyCv+0+gIRcWtE7MwXVwEL67bdAmwf57gfBC6KiJG83KYigp9pvrM9HR5st9QUmUgOBh6vW96Qr5vIcuDGBo77MuB0Sasl3SjpqPEKSTonL7N68+bNDQddFA+2p6PWhenBdktFkTXbeF+/x+00lnQW0EfWnTWZLqA/IvqAzwGXj1coIi6LiL6I6Ovt7W0w5OIMDnuMJBUVP4/EElNkzbaBbCyjZiGwcWwhSUuBC4BlETHQ4HG/kr++HjhmmnE2xZBbJMnwGImlZko1m6Q5+SB6I+4EjpJ0uKQKcAZww5jjLQEuJUsijY51/BvwC/nrE4GHG9yvpYaq4RsSE1H2FCmWmM7dbZTUQZYA3gUcBwwAXZI2AyuAyyLikfH2jYhhSecCNwEl4PKIWCvpImB1RNxA1pXVA1wrCeBHEbEsf+/bgKOBHkkbgOURcRPwMeBKSb8P7ADeN60z0CRDwyNUSn4eSQpqg+0DHmy3ROw2kQC3Av8JfBi4v3allKT9gZOAj0m6PiK+ON7OEbGCLOHUr7uw7vXSid44Il4/wfptwNsmiXuvM+gpUpIhiXJJ7tqyZEyWSJZGxNDYlRGxhWyc4iuSyoVE1mZ8Q2JaKqUO39luyZisZrte0q9LmjNRgfESjb3QcHWEkcCD7Qkpd3a4RWLJmKxm+xzwS8Cjkq6W9PZ84NymoDbo6kSSjnKpg0EPtlsidluzRcTXIuJM4FDgq8DZwI8kXS7pzc0IsB3Ubkzzne3pqJQ6fGe7JaOhr8gRsSsiro6IXwbeAiwBVhYaWRupdXH4CYnp8GC7paShmk3SAZI+JOk7ZPdx3Ay8utDI2sjQaIvEiSQVFY+RWEImu4/kt4AzgZ8h69r644j4TjMCaydDwx4jSU255ERi6Zjs8t8TyG4A/M/aPSQ2dYPVKvD8k/Os/Xmw3VIyWSL5i4j44UQbld2OfnBEbJjRqNrMYN4iqXiwPRnZYHu11WGYNcVkieTifJqUrwF3AZuBbuBIsjvb3wR8hGwiRZuAx0jSU+4U/UNuxFsadptIIuId+VMN3wX8JnAgsBN4kGzqk49GRH/hUb7I1RKJn5CYjkqpg+39w60Ow6wpJmuREBEPkE3zbnto0C2S5JR9H4klxDVbE/jO9vR4ihRLiWu2Jqh9M/WkjemolDr8qF1Lhmu2JhgdbPc08skolzR6/5BZu2v0zvZbGlln4/NVW+nxne2WksnubO8GZgMLJM0Dal+p9wEOKji2tuGurfSU3bVlCZnsqq33A79HljS+X7f+WeCSooJqN7XBdl/+m46Kp0ixhEx2H8mngE9J+lBEfLpJMbUdd22lx5f/WkoardmekfSesT+T7STpFEkPSVon6fxxtp8n6QFJayTdIunQum0rJW2T9PUJjv1pSTsajL+lahWKn0eSjnKpg5GA6ogH3K39TXpDYu64utfdZFOjfB+4YqIdJJXIur/eTDaFyp2SbshvcKy5G+iLiJ2SPgh8Ajg933Yx2fjM+8c5dh+wX4Oxt5xvSExPrRtzqDpCqaPU4mjMitVQIomID9UvS9oX+NdJdjseWBcR6/N9rgJOA0YTSUTcWld+FXBW3bZbJL1x7EHzBHUx8OvALzcSf6uNTpHiRJKMWutzsDpCd9mJxNrbntZsO4GjJilzMPB43fKGfN1ElgM3NvDe5wI3RMSTDZTdKwxVR+jsEB0d7tpKxWiLxOMkloCGWiSS/h2odfaWgJ8Frplst3HWjdthLOksoA84cZI4DgLeAbxxkvdG0jnAOQCLFi2arHihhqrhbq3E1H7fvgTYUtDoGMlf170eBh5r4BkkG4BD6pYXAhvHFpK0lGxSyBMjYmCSYy4hm8J+XfYoFGZLWhcRR44tGBGXAZcB9PX1tXTEc3B4xAPtiaklEt/dbilodIzkvyUdwPOD7o80sNudwFGSDgeeAM4gG9cYJWkJcClwSkRsaiCO/wBeWrf/jvGSyN5msDrie0gSU/t9u0ViKWh0ipR3At8j61Z6J3CHpF/b3T4RMUw2nnET2fNLromItZIukrQsL3Yx0ANcK+keSTfUvedtwLXAmyRtkHTyFD/bXmNoeMRdW4mpPQ3TNyVaChrt2roAOK7WapDUC/wncN3udoqIFWQPwKpfd2Hd66W72ff1kwUVET2TldkbDFWdSFIzOkbiwXZLQKO1W8eYrqenp7Bv8oaq4a6txIyOkbhFYglotEWyUtJNwJfz5dMZ09KwiQ26RZIcX7VlKWl0sP2PJP0K8PNkl/VeFhHXFxpZGxmqjoz2mVsanr+z3VdtWfubbBr5zwBfiojbI+KrwFebE1Z7GfRge3IqJd+QaOmYrHZ7BPgbST+U9HFJxzYjqHbjwfb01J6G6a4tS8Fua7eI+FREvI7sjvMtwD9LelDShZJe3pQI28CgB9uT48F2S0lDtVtEPBYRH4+IJTw/WeKDhUbWRnwfSXoqvvzXEtLoDYllSb8k6UqyiRUfBn610MjayFB1hEqnB9tT4sF2S8lkg+1vBs4E3kZ2Z/tVwDkR8VwTYmsbHiNJj7u2LCWTXf77p8CXgD+MiC1NiKct+aqt9Iw+j8RdW5aAyZ7ZflKzAmlng55GPjm+IdFS4tqtCYaqI3T5qq2kVNy1ZQlx7dYE2RiJB9tT0tEhOjvkRGJJcCJpAg+2p6lc6vBVW5YE124Fiwg/ajdR5ZI82G5JcO1WsNpgq+9sT0+ls8OD7ZYE124Fq3VteIwkPeVShydttCQ4kRSsVpFU3LWVnEpnhwfbLQmu3QpWq0jK7tpKjgfbLRWu3QpW6yP3YHt6yqUOBty1ZQkotHaTdIqkhyStk3T+ONvPk/SApDWSbpF0aN22lZK2Sfr6mH2uzI95v6TLJZWL/AzTVftG6q6t9FRKvo/E0lBY7SapBFwCnAosBs6UtHhMsbuBvog4BrgO+ETdtouBd49z6CuBo4H/BcwC3jfDoc+o2uWfbpGkJ+vaciKx9ldk7XY8sC4i1kfEINnMwafVF4iIWyNiZ764ClhYt+0WYPvYg0bEisiRzUi8cGyZvcnoGImv2kpOV9ldW5aGIhPJwcDjdcsb8nUTWU72rJOG5F1a7wZWTrD9HEmrJa3evHlzo4edcb6PJF2zyiX6h6qtDsOscEXWbuN9BR/3EhZJZwF9ZN1ZjfoH4FsRcdt4GyPisojoi4i+3t7eKRx2Zvny33R1l0vsGnQisfY32fNIpmMDcEjd8kJg49hCkpYCFwAnRsRAIweW9BGgF3j/DMRZqNEbEt0iSc6scoldbpFYAoqs3e4EjpJ0uKQKcAZwQ30BSUuAS4FlEbGpkYNKeh9wMnBmROz1HdBDvvw3WbMrTiSWhsJqt4gYBs4FbgIeBK6JiLWSLpK0LC92MdADXCvpHkmjiUbSbcC1wJskbZB0cr7ps8ABwHfzfS4s6jPMhIFhD7anqrviri1LQ5FdW0TECmDFmHUX1r1eupt9Xz/B+kJjnmm1FonHSNIzq1xiYHiE6khQ6vAXCWtfrt0K5q6tdM0qlwB85Za1PdduBavdkOjLf9Mzu5IlEo+TWLtz7VYw30eSru68ReJxEmt3rt0K5hZJumZV3LVlaXDtVrBBD7YnqzZGstMtEmtzrt0KNug725M1y2MklgjXbgUbqo7Q2SE6fPlncmotEicSa3dOJAUbHB7xpb+JGh0jcdeWtTnXcAUbHB7xQHui3CKxVLiGK9hg1YkkVbUWiQfbrd25hivY4HB4oD1RvrPdUuEarmBukaTLNyRaKlzDFWxwuOoWSaLKpQ4qpQ6ecyKxNucarmBD1XCLJGFzuzvZMTDU6jDMCuUarmDZ5b++hyRVPd2dbO8fbnUYZoVyIimYL/9N29zuTnY4kVibcw1XsGywvdTqMKxFerrcIrH250RSsMHhEQ+2J6ynq8z2AScSa2+u4QqWtUg8RpKqfbo72d7vwXZrb4UmEkmnSHpI0jpJ54+z/TxJD0haI+kWSYfWbVspaZukr4/Z53BJd0h6RNLVkipFfobpGqq6RZKynu5OdrhFYm2usBpOUgm4BDgVWAycKWnxmGJ3A30RcQxwHfCJum0XA+8e59AfBz4ZEUcBW4HlMx37TPJge9rm5ldtRUSrQzErTJE13PHAuohYHxGDwFXAafUFIuLWiNiZL64CFtZtuwXYXl9ekoBfIEs6AF8A3l5M+DPDiSRtPV1lqiNB/9BIq0MxK0yRNdzBwON1yxvydRNZDtw4yTHnA9siotZXMOExJZ0jabWk1Zs3b24w5JnnaeTTNre7E8DjJNbWiqzhxhthHrd9L+ksoI+sO2tGjhkRl0VEX0T09fb2TnLY4niurbSNJhKPk1gb6yzw2BuAQ+qWFwIbxxaStBS4ADgxIgYmOeZPgP0kdeatknGPubeICAarI3S5RZKs51skTiTWvoqs4e4EjsqvsqoAZwA31BeQtAS4FFgWEZsmO2BkI5a3Ar+Wrzob+NqMRj2DhkeCCNy1lbCerjLgri1rb4XVcHmL4VzgJuBB4JqIWCvpIknL8mIXAz3AtZLukTSaaCTdBlwLvEnSBkkn55v+BDhP0jqyMZPPF/UZpmuomg2wumsrXfNmZ4lk604nEmtfRXZtERErgBVj1l1Y93rpbvZ9/QTr15NdEbbXGxx2Iknd/nOy25y2PjfY4kjMiuMarkBOJLbf7AoSPO1EYm3MNVyBBvJE4jGSdJU6xH6zym6RWFtzDVeggeHsyXi1R65amubNqbDFicTamBNJgWp3M3e7aytp851IrM25hitQ/5BbJAbzZjuRWHtzIinQaIvEiSRp83sqbNnpRGLty4mkQM+3SHyaUzZvdoWtzw16BmBrW67hCtTvwXYDFvR0MTwSbPNNidamnEgK9PxguxNJyg7ctxuAjc/sanEkZsVwIimQu7YM4MD9ZgHw5Lb+FkdiVgzXcAWqJZIud20l7aC8RfKkWyTWppxIClS7s90tkrQt6OmiXBIbn3GLxNqTa7gC9Q9VkaDiKVKS1tEhXrpvN09uc4vE2pNruALtGqzS3Vkie9S8pezAfWex0WMk1qacSArUP1x1t5YBsGj/2Tz69HOtDsOsEK7lCtQ/NOJ7SAyAI1/Sw+btAzyzy/eSWPtxIilQ/1DVicQAOLK3B4B1m3a0OBKzmedEUqD+oRG6PPOvAUcdkCWSHziRWBtyLVeggWG3SCyzcN5sujo7eOjH21sditmMKzSRSDpF0kOS1kk6f5zt50l6QNIaSbdIOrRu29mSHsl/zq5bf6ak+/J9VkpaUORnmI4dA8PM7e5sdRi2Fyh1iJ87eF/u/tHWVodiNuMKSySSSsAlwKnAYuBMSYvHFLsb6IuIY4DrgE/k++4PfAR4DXA88BFJ8yR1Ap8CTsr3WQOcW9RnmK4d/cP0dDmRWKbv0Hnc/8SzozMemLWLIlskxwPrImJ9RAwCVwGn1RdkJUuqAAALlklEQVSIiFsjYme+uApYmL8+GfhGRGyJiK3AN4BTAOU/c5TdnLEPsLHAzzAtOwacSOx5rzp0HoPVEe574plWh2I2o4pMJAcDj9ctb8jXTWQ5cOPu9o2IIeCDwH1kCWQx8PnxDibpHEmrJa3evHnznn2CadrRP0yPu7Ys95rD96fUIb75P5taHYrZjCoykYx3O/e4T/aRdBbQB1y8u30llckSyRLgILKurQ+Pd8yIuCwi+iKir7e3d6qxT9vISLBjcJi5bpFYbr/ZFV53xHxW3v+UH3JlbaXIRLIBOKRueSHjdENJWgpcACyLiIFJ9j0WICJ+ENn/xGuAE2Y+9OnbOVQlArdI7AXedsyBPPqT57jzhx50t/ZRZCK5EzhK0uGSKsAZwA31BSQtAS4lSyL17f2bgLfkA+zzgLfk654AFkuqNTHeDDxY4GfYYzv6hwHo6Sq3OBLbm7z92IOZN7vMP/zXulaHYjZjCkskETFMdkXVTWSV/TURsVbSRZKW5cUuBnqAayXdI+mGfN8twF+SJaM7gYvygfeNwF8A35K0hqyF8ldFfYbp2DGQTYXhFonVm1Up8YETX8Z/PbSZf793r71OxGxKCq3lImIFsGLMugvrXi/dzb6XA5ePs/6zwGdnMMxCPL1jEIB5s90isRda/vOHs3LtU/zBtfdSLolTfu7AVodkNi2+s70gTz2bTRn+0n26WxyJ7W06Sx1cfvZxHP3SuXzgi9/n1z+3iivveIy1G59h285BD8Tbi477XXbjguvv43uPbtmjfbfls7wesK8Tif20eXMqXPeBE/iX2x/lC7c/xgXX3z+6rVwS3eUS3eUSXZ0ddOTPs6k91qZ2SWPtOTejlzjWbf+pbZasz599HIvmzy70PZxIduOg/WaNTra3Jw5fMMeX/9qEKp0dnPOGl/Fbrz+Cx57eyf0bn+GpZ/r5yY5B+oeqDAxXGRgaIWC0lVJrq9QaLc8v120f3eaWjWV/Z0VzLbcbv3PSka0OwRIgicMWzOGwBXNaHYrZHvEYiZmZTYsTiZmZTYsTiZmZTYsTiZmZTYsTiZmZTYsTiZmZTYsTiZmZTYsTiZmZTYtSmNdH0mbgsT3cfQHwkxkMZ6Y4rqlxXFPjuKamXeM6NCImfTJgEolkOiStjoi+VscxluOaGsc1NY5ralKPy11bZmY2LU4kZmY2LU4kk7us1QFMwHFNjeOaGsc1NUnH5TESMzObFrdIzMxsWpxIzMxsWpJOJJJOkfSQpHWSzh9ne5ekq/Ptd0g6rG7bh/P1D0k6uclxnSfpAUlrJN0i6dC6bVVJ9+Q/NzQ5rvdK2lz3/u+r23a2pEfyn7ObHNcn62J6WNK2um2FnC9Jl0vaJOn+CbZL0t/nMa+R9Kq6bUWeq8nielcezxpJt0t6Zd22H0q6Lz9Xq5sc1xslPVP3u7qwbttuf/8Fx/VHdTHdn/897Z9vK/J8HSLpVkkPSlor6f+MU6Z5f2MRkeQPUAJ+ABwBVIB7gcVjyvw28Nn89RnA1fnrxXn5LuDw/DilJsZ1EjA7f/3BWlz58o4Wnq/3Ap8ZZ9/9gfX5v/Py1/OaFdeY8h8CLm/C+XoD8Crg/gm2vxW4keyx6q8F7ij6XDUY1wm19wNOrcWVL/8QWNCi8/VG4OvT/f3PdFxjyv4S8M0mna8DgVflr+cCD4/z/7Fpf2Mpt0iOB9ZFxPqIGASuAk4bU+Y04Av56+uAN0lSvv6qiBiIiEeBdfnxmhJXRNwaETvzxVXAwhl672nFtRsnA9+IiC0RsRX4BnBKi+I6E/jyDL33hCLiW8CW3RQ5DbgiMquA/SQdSLHnatK4IuL2/H2heX9bjZyviUzn73Km42rK3xZARDwZEd/PX28HHgQOHlOsaX9jKSeSg4HH65Y38NO/iNEyETEMPAPMb3DfIuOqt5zsW0dNt6TVklZJevsMxTSVuH41b0ZfJ+mQKe5bZFzkXYCHA9+sW13U+ZrMRHEXea6mauzfVgA3S7pL0jktiOd1ku6VdKOkV+Tr9orzJWk2WWX8lbrVTTlfyrrclwB3jNnUtL+xzuns/CKncdaNvRZ6ojKN7LunGj62pLOAPuDEutWLImKjpCOAb0q6LyJ+0KS4/h34ckQMSPoAWWvuFxrct8i4as4ArouIat26os7XZFrxt9UwSSeRJZKfr1v9v/Nz9RLgG5L+J//G3gzfJ5v3aYektwL/BhzFXnK+yLq1vhMR9a2Xws+XpB6y5PV7EfHs2M3j7FLI31jKLZINwCF1ywuBjROVkdQJ7EvWzG1k3yLjQtJS4AJgWUQM1NZHxMb83/XAf5F9U2lKXBHxdF0snwNe3ei+RcZV5wzGdD0UeL4mM1HcRZ6rhkg6Bvgn4LSIeLq2vu5cbQKuZ+a6cycVEc9GxI789QqgLGkBe8H5yu3ub6uQ8yWpTJZEroyIr45TpHl/Y0UMBL0YfshaY+vJujpqg3SvGFPmd3jhYPs1+etX8MLB9vXM3GB7I3EtIRtgPGrM+nlAV/56AfAIMzTw2GBcB9a9/mVgVf56f+DRPL55+ev9mxVXXu5nyAY/1YzzlR/zMCYePH4bLxwI/V7R56rBuBaRjfmdMGb9HGBu3evbgVOaGNdLa787sgr5R/m5a+j3X1Rc+fbaF8w5zTpf+We/Avi73ZRp2t/YjJ3sF+MP2VUND5NVyhfk6y4i+5YP0A1cm//H+h5wRN2+F+T7PQSc2uS4/hP4MXBP/nNDvv4E4L78P9N9wPImx/X/gLX5+98KHF2372/m53Ed8BvNjCtf/nPgY2P2K+x8kX07fRIYIvsGuBz4APCBfLuAS/KY7wP6mnSuJovrn4CtdX9bq/P1R+Tn6d78d3xBk+M6t+5vaxV1iW6833+z4srLvJfs4pv6/Yo+Xz9P1h21pu539dZW/Y15ihQzM5uWlMdIzMxsBjiRmJnZtDiRmJnZtDiRmJnZtDiRmJm9yEw2meQeHO/j+aST90s6far7O5GYTYGk+XWzvT4l6Ym65dsLes8lkv5pN9t7Ja0s4r1tr/UvzNAcbJLeRjYx5bHAa4A/krTPVI7hRGI2BZHdvX9sRBwLfBb4ZG05Ik4o6G3/FPj0bmLaDDwp6X8X9P62l4lxJpOU9DJJK/O5vW6TdHSDh1sM/HdEDEfEc2T3vkwpSTmRmM0QSTvyf98o6b8lXaPs+Scfy5/z8b38+RQvy8v1SvqKpDvzn59KBJLmAsdExL358ol1LaC78+2QzT31riZ9VNs7XQZ8KCJeDfwh8A8N7ncvcKqk2fm0MyfxwilUJpXypI1mRXol8LNk3xrXA/8UEcfnDyD6EPB7wKfIWjTflrQIuCnfp14fUN8P/ofA70TEd/IJ+/rz9auB/1vYp7G9Wv63cAJwbfakCyCbwglJv0I208NYT0TEyRFxs6TjyKZx2Qx8Fxieyvs7kZgV486IeBJA0g+Am/P195F94wNYCiyu+4+/j6S5kT1fouZAsv/cNd8B/lbSlcBXI2JDvn4TcNDMfwx7kegAtuVdri8Q2YSO403qWF/mo8BHASR9iWzeuSm9uZnNvIG61yN1yyM8/wWuA3hd3RjLwWOSCMAusjnfAIiIjwHvA2YBq+r6wbvzspagyKaQf1TSO2D0MbuvnGQ38rIlSfPz18cAx/D8F5+GOJGYtc7NZJMRAiDpp75Nkj357si6Mi+LiPsi4uNk3Vm1RPJyXtgFZm1M0pfJuqB+RtIGScvJxsiWS6pNFNnokyLLwG2SHiAbZzkrsgf5NcxdW2at87vAJZLWkP1f/BbZ7K2jIuJ/JO1b1+X1e/lDp6rAAzz/BMOTgP9oXujWShFx5gSbpnxJcET0k125tcc8+6/ZXk7S7wPbI2J395J8i+xBVFsnKmNWFHdtme39/pEXjrm8gKRe4G+dRKxV3CIxM7NpcYvEzMymxYnEzMymxYnEzMymxYnEzMymxYnEzMym5f8DflW5v5HqZj0AAAAASUVORK5CYII=\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "%matplotlib inline\n",
+    "\n",
+    "import os\n",
+    "\n",
+    "from bag.design import Module\n",
+    "\n",
+    "\n",
+    "# noinspection PyPep8Naming\n",
+    "class demo_templates__amp_sf(Module):\n",
+    "    \"\"\"Schematic generator for a source follower.\n",
+    "    \"\"\"\n",
+    "\n",
+    "    # hard coded netlist flie path to get jupyter notebook working.\n",
+    "    yaml_file = os.path.join(os.environ['BAG_WORK_DIR'], 'BAG_XBase_demo', \n",
+    "                             'BagModules', 'demo_templates', 'netlist_info', 'amp_sf_soln.yaml') \n",
+    "\n",
+    "    def __init__(self, bag_config, parent=None, prj=None, **kwargs):\n",
+    "        Module.__init__(self, bag_config, self.yaml_file, parent=parent, prj=prj, **kwargs)\n",
+    "\n",
+    "    @classmethod\n",
+    "    def get_params_info(cls):\n",
+    "        return dict(\n",
+    "            lch='channel length in meters.',\n",
+    "            w_dict='Dictionary of transistor widths.',\n",
+    "            intent_dict='Dictionary of transistor threshold flavors.',\n",
+    "            fg_dict='Dictionary of transistor number of fingers.',\n",
+    "            dum_info='Dummy information data structure',\n",
+    "        )\n",
+    "\n",
+    "    def design(self, lch, w_dict, intent_dict, fg_dict, dum_info):\n",
+    "        w_amp = w_dict['amp']\n",
+    "        w_bias = w_dict['bias']\n",
+    "        intent_amp = intent_dict['amp']\n",
+    "        intent_bias = intent_dict['bias']\n",
+    "        fg_amp = fg_dict['amp']\n",
+    "        fg_bias = fg_dict['bias']\n",
+    "\n",
+    "        self.instances['XAMP'].design(w=w_amp, l=lch, intent=intent_amp, nf=fg_amp)\n",
+    "        self.instances['XBIAS'].design(w=w_bias, l=lch, intent=intent_bias, nf=fg_bias)\n",
+    "\n",
+    "        # handle dummy transistors\n",
+    "        self.design_dummy_transistors(dum_info, 'XDUM', 'VDD', 'VSS')\n",
+    "\n",
+    "        \n",
+    "import os\n",
+    "\n",
+    "# import bag package\n",
+    "import bag\n",
+    "from bag.io import read_yaml\n",
+    "\n",
+    "# import BAG demo Python modules\n",
+    "import xbase_demo.core as demo_core\n",
+    "from xbase_demo.demo_layout.core import AmpSFSoln\n",
+    "\n",
+    "# load circuit specifications from file\n",
+    "spec_fname = os.path.join(os.environ['BAG_WORK_DIR'], 'specs_demo/demo.yaml')\n",
+    "top_specs = read_yaml(spec_fname)\n",
+    "\n",
+    "# obtain BagProject instance\n",
+    "local_dict = locals()\n",
+    "if 'bprj' in local_dict:\n",
+    "    print('using existing BagProject')\n",
+    "    bprj = local_dict['bprj']\n",
+    "else:\n",
+    "    print('creating BagProject')\n",
+    "    bprj = bag.BagProject()\n",
+    "\n",
+    "demo_core.run_flow(bprj, top_specs, 'amp_sf', AmpSFSoln, sch_cls=demo_templates__amp_sf, run_lvs=True)"
+   ]
+  }
+ ],
+ "metadata": {
+  "anaconda-cloud": {},
+  "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.6.5"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/workspace_setup/tutorial_files/solutions/5_hierarchical_generators.ipynb b/workspace_setup/tutorial_files/solutions/5_hierarchical_generators.ipynb
new file mode 100644
index 0000000..1635373
--- /dev/null
+++ b/workspace_setup/tutorial_files/solutions/5_hierarchical_generators.ipynb
@@ -0,0 +1,349 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Layout Solution\n",
+    "The following cell contains the layout solution  for the two-stage amplifier.  LVS should pass when you evaluate it."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "creating BagProject\n",
+      "computing layout\n",
+      "ext_w0 = 1, ext_wend=1, ytop=2592\n",
+      "final: ext_w0 = 1, ext_wend=1, ytop=2592\n",
+      "{'s': WireArray(TrackID(layer=3, track=7, num=9, pitch=2), 1109, 1265, 0.001), 'd': WireArray(TrackID(layer=3, track=8, num=8, pitch=2), 1231, 1387, 0.001), 'g': WireArray(TrackID(layer=3, track=8, num=8, pitch=2), 915, 1071, 0.001)}\n",
+      "WireArray(TrackID(layer=3, track=8, num=8, pitch=2), 915, 1071, 0.001)\n",
+      "6.5\n",
+      "ext_w0 = 1, ext_wend=7, ytop=2880\n",
+      "ext_w0 = 2, ext_wend=9, ytop=3024\n",
+      "final: ext_w0 = 1, ext_wend=7, ytop=2880\n",
+      "creating layout\n",
+      "layout done\n",
+      "computing AMP_CHAIN schematics\n",
+      "creating AMP_CHAIN schematics\n",
+      "running lvs\n",
+      "Running tasks, Press Ctrl-C to cancel.\n",
+      "lvs passed\n",
+      "lvs log is /users/erichang/projects/bag_gen/BAG2_cds_ff_mpt/pvs_run/lvs_run_dir/DEMO_AMP_CHAIN/AMP_CHAIN/lvsLog_20180906_112850xbhqztn3\n",
+      "LVS flow done\n"
+     ]
+    }
+   ],
+   "source": [
+    "from bag.layout.routing import TrackID\n",
+    "from bag.layout.template import TemplateBase\n",
+    "\n",
+    "from xbase_demo.demo_layout.core import AmpCS, AmpSFSoln\n",
+    "\n",
+    "\n",
+    "class AmpChain(TemplateBase):\n",
+    "    def __init__(self, temp_db, lib_name, params, used_names, **kwargs):\n",
+    "        TemplateBase.__init__(self, temp_db, lib_name, params, used_names, **kwargs)\n",
+    "        self._sch_params = None\n",
+    "\n",
+    "    @property\n",
+    "    def sch_params(self):\n",
+    "        return self._sch_params\n",
+    "\n",
+    "    @classmethod\n",
+    "    def get_params_info(cls):\n",
+    "        return dict(\n",
+    "            cs_params='common source amplifier parameters.',\n",
+    "            sf_params='source follower parameters.',\n",
+    "            show_pins='True to draw pin geometries.',\n",
+    "        )\n",
+    "\n",
+    "    def draw_layout(self):\n",
+    "        \"\"\"Draw the layout of a transistor for characterization.\n",
+    "        \"\"\"\n",
+    "\n",
+    "        cs_params = self.params['cs_params'].copy()\n",
+    "        sf_params = self.params['sf_params'].copy()\n",
+    "        show_pins = self.params['show_pins']\n",
+    "\n",
+    "        cs_params['show_pins'] = False\n",
+    "        sf_params['show_pins'] = False\n",
+    "\n",
+    "        # create layout masters for subcells we will add later\n",
+    "        cs_master = self.new_template(params=cs_params, temp_cls=AmpCS)\n",
+    "        sf_master = self.new_template(params=sf_params, temp_cls=AmpSFSoln)\n",
+    "\n",
+    "        # add subcell instances\n",
+    "        cs_inst = self.add_instance(cs_master, 'XCS')\n",
+    "        # add source follower to the right of common source\n",
+    "        x0 = cs_inst.bound_box.right_unit\n",
+    "        sf_inst = self.add_instance(sf_master, 'XSF', loc=(x0, 0), unit_mode=True)\n",
+    "\n",
+    "        # get VSS wires from AmpCS/AmpSF\n",
+    "        cs_vss_warr = cs_inst.get_all_port_pins('VSS')[0]\n",
+    "        sf_vss_warrs = sf_inst.get_all_port_pins('VSS')\n",
+    "        # only connect bottom VSS wire of source follower\n",
+    "        if len(sf_vss_warrs) < 2 or sf_vss_warrs[0].track_id.base_index < sf_vss_warrs[1].track_id.base_index:\n",
+    "            sf_vss_warr = sf_vss_warrs[0]\n",
+    "        else:\n",
+    "            sf_vss_warr = sf_vss_warrs[1]\n",
+    "\n",
+    "        # connect VSS of the two blocks together\n",
+    "        vss = self.connect_wires([cs_vss_warr, sf_vss_warr])[0]\n",
+    "\n",
+    "        # get layer IDs from VSS wire\n",
+    "        hm_layer = vss.layer_id\n",
+    "        vm_layer = hm_layer + 1\n",
+    "        top_layer = vm_layer + 1\n",
+    "\n",
+    "        # calculate template size\n",
+    "        tot_box = cs_inst.bound_box.merge(sf_inst.bound_box)\n",
+    "        self.set_size_from_bound_box(top_layer, tot_box, round_up=True)\n",
+    "\n",
+    "        # get subcell ports as WireArrays so we can connect them\n",
+    "        vmid0 = cs_inst.get_all_port_pins('vout')[0]\n",
+    "        vmid1 = sf_inst.get_all_port_pins('vin')[0]\n",
+    "        vdd0 = cs_inst.get_all_port_pins('VDD')[0]\n",
+    "        vdd1 = sf_inst.get_all_port_pins('VDD')[0]\n",
+    "\n",
+    "        # get vertical VDD TrackIDs\n",
+    "        vdd0_tid = TrackID(vm_layer, self.grid.coord_to_nearest_track(vm_layer, vdd0.middle))\n",
+    "        vdd1_tid = TrackID(vm_layer, self.grid.coord_to_nearest_track(vm_layer, vdd1.middle))\n",
+    "\n",
+    "        # connect VDD of each block to vertical M5\n",
+    "        vdd0 = self.connect_to_tracks(vdd0, vdd0_tid)\n",
+    "        vdd1 = self.connect_to_tracks(vdd1, vdd1_tid)\n",
+    "        # connect M5 VDD to top M6 horizontal track\n",
+    "        vdd_tidx = self.grid.get_num_tracks(self.size, top_layer) - 1\n",
+    "        vdd_tid = TrackID(top_layer, vdd_tidx)\n",
+    "        vdd = self.connect_to_tracks([vdd0, vdd1], vdd_tid)\n",
+    "\n",
+    "        # connect vmid using vertical track in the middle of the two templates\n",
+    "        mid_tid = TrackID(vm_layer, self.grid.coord_to_nearest_track(vm_layer, x0, unit_mode=True))\n",
+    "        vmid = self.connect_to_tracks([vmid0, vmid1], mid_tid)\n",
+    "\n",
+    "        # add pins on wires\n",
+    "        self.add_pin('vmid', vmid, show=show_pins)\n",
+    "        self.add_pin('VDD', vdd, show=show_pins)\n",
+    "        self.add_pin('VSS', vss, show=show_pins)\n",
+    "        # re-export pins on subcells.\n",
+    "        self.reexport(cs_inst.get_port('vin'), show=show_pins)\n",
+    "        self.reexport(cs_inst.get_port('vbias'), net_name='vb1', show=show_pins)\n",
+    "        self.reexport(sf_inst.get_port('vout'), show=show_pins)\n",
+    "        self.reexport(sf_inst.get_port('vbias'), net_name='vb2', show=show_pins)\n",
+    "\n",
+    "        # compute schematic parameters.\n",
+    "        self._sch_params = dict(\n",
+    "            cs_params=cs_master.sch_params,\n",
+    "            sf_params=sf_master.sch_params,\n",
+    "        )\n",
+    "\n",
+    "\n",
+    "import os\n",
+    "\n",
+    "# import bag package\n",
+    "import bag\n",
+    "from bag.io import read_yaml\n",
+    "\n",
+    "# import BAG demo Python modules\n",
+    "import xbase_demo.core as demo_core\n",
+    "\n",
+    "# load circuit specifications from file\n",
+    "spec_fname = os.path.join(os.environ['BAG_WORK_DIR'], 'specs_demo/demo.yaml')\n",
+    "top_specs = read_yaml(spec_fname)\n",
+    "\n",
+    "# obtain BagProject instance\n",
+    "local_dict = locals()\n",
+    "if 'bprj' in local_dict:\n",
+    "    print('using existing BagProject')\n",
+    "    bprj = local_dict['bprj']\n",
+    "else:\n",
+    "    print('creating BagProject')\n",
+    "    bprj = bag.BagProject()\n",
+    "\n",
+    "demo_core.run_flow(bprj, top_specs, 'amp_chain_soln', AmpChain, run_lvs=True, lvs_only=True)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## AmpChain Schematic Generator Solution\n",
+    "The AmpChain schematic generation solution is shown below, evaluate it to run through the flow.  Note that it uses the `amp_chain_soln` schematic template instead of the `amp_chain` schematic template you are supposed to fill out.  Change `amp_chain_soln` to `amp_chain` in the `yaml_file` class variable if you wish to debug your schematic template."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "using existing BagProject\n",
+      "computing layout\n",
+      "ext_w0 = 1, ext_wend=1, ytop=2592\n",
+      "final: ext_w0 = 1, ext_wend=1, ytop=2592\n",
+      "{'s': WireArray(TrackID(layer=3, track=7, num=9, pitch=2), 1109, 1265, 0.001), 'd': WireArray(TrackID(layer=3, track=8, num=8, pitch=2), 1231, 1387, 0.001), 'g': WireArray(TrackID(layer=3, track=8, num=8, pitch=2), 915, 1071, 0.001)}\n",
+      "WireArray(TrackID(layer=3, track=8, num=8, pitch=2), 915, 1071, 0.001)\n",
+      "6.5\n",
+      "ext_w0 = 1, ext_wend=7, ytop=2880\n",
+      "ext_w0 = 2, ext_wend=9, ytop=3024\n",
+      "final: ext_w0 = 1, ext_wend=7, ytop=2880\n",
+      "creating layout\n",
+      "layout done\n",
+      "creating AMP_CHAIN schematics\n",
+      "running lvs\n",
+      "Running tasks, Press Ctrl-C to cancel.\n",
+      "lvs passed\n",
+      "lvs log is /users/erichang/projects/bag_gen/BAG2_cds_ff_mpt/pvs_run/lvs_run_dir/DEMO_AMP_CHAIN/AMP_CHAIN/lvsLog_20180906_112931rlh5cdgf\n",
+      "computing AMP_CHAIN_tb_dc schematics\n",
+      "creating AMP_CHAIN_tb_dc schematics\n",
+      "computing AMP_CHAIN_tb_ac_tran schematics\n",
+      "creating AMP_CHAIN_tb_ac_tran schematics\n",
+      "schematic done\n",
+      "setting up AMP_CHAIN_tb_dc\n",
+      "running simulation\n",
+      "Running tasks, Press Ctrl-C to cancel.\n",
+      "simulation done, load results\n",
+      "setting up AMP_CHAIN_tb_ac_tran\n",
+      "running simulation\n",
+      "Running tasks, Press Ctrl-C to cancel.\n",
+      "simulation done, load results\n",
+      "all simulation done\n",
+      "loading simulation data for AMP_CHAIN_tb_dc\n",
+      "loading simulation data for AMP_CHAIN_tb_ac_tran\n",
+      "finish loading data\n",
+      ", gain=-0.4063\n",
+      ", f_3db=9.153e+09, f_unity=1.345e+10, phase_margin=85.89\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 2 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 2 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "%matplotlib inline\n",
+    "\n",
+    "import os\n",
+    "\n",
+    "from bag.design import Module\n",
+    "\n",
+    "\n",
+    "# noinspection PyPep8Naming\n",
+    "class demo_templates__amp_chain(Module):\n",
+    "    \"\"\"Module for library demo_templates cell amp_chain.\n",
+    "\n",
+    "    Fill in high level description here.\n",
+    "    \"\"\"\n",
+    "\n",
+    "    # hard coded netlist flie path to get jupyter notebook working.\n",
+    "    yaml_file = os.path.join(os.environ['BAG_WORK_DIR'], 'BAG_XBase_demo', \n",
+    "                             'BagModules', 'demo_templates', 'netlist_info', 'amp_chain_soln.yaml') \n",
+    "\n",
+    "    def __init__(self, bag_config, parent=None, prj=None, **kwargs):\n",
+    "        Module.__init__(self, bag_config, self.yaml_file, parent=parent, prj=prj, **kwargs)\n",
+    "\n",
+    "    @classmethod\n",
+    "    def get_params_info(cls):\n",
+    "        # type: () -> Dict[str, str]\n",
+    "        \"\"\"Returns a dictionary from parameter names to descriptions.\n",
+    "\n",
+    "        Returns\n",
+    "        -------\n",
+    "        param_info : Optional[Dict[str, str]]\n",
+    "            dictionary from parameter names to descriptions.\n",
+    "        \"\"\"\n",
+    "        return dict(\n",
+    "            cs_params='common-source amplifier parameters dictionary.',\n",
+    "            sf_params='source-follwer amplifier parameters dictionary.',\n",
+    "        )\n",
+    "\n",
+    "    def design(self, cs_params=None, sf_params=None):\n",
+    "        self.instances['XCS'].design(**cs_params)\n",
+    "        self.instances['XSF'].design(**sf_params)\n",
+    "\n",
+    "\n",
+    "import os\n",
+    "\n",
+    "# import bag package\n",
+    "import bag\n",
+    "from bag.io import read_yaml\n",
+    "\n",
+    "# import BAG demo Python modules\n",
+    "import xbase_demo.core as demo_core\n",
+    "from xbase_demo.demo_layout.core import AmpChainSoln\n",
+    "\n",
+    "# load circuit specifications from file\n",
+    "spec_fname = os.path.join(os.environ['BAG_WORK_DIR'], 'specs_demo/demo.yaml')\n",
+    "top_specs = read_yaml(spec_fname)\n",
+    "\n",
+    "# obtain BagProject instance\n",
+    "local_dict = locals()\n",
+    "if 'bprj' in local_dict:\n",
+    "    print('using existing BagProject')\n",
+    "    bprj = local_dict['bprj']\n",
+    "else:\n",
+    "    print('creating BagProject')\n",
+    "    bprj = bag.BagProject()\n",
+    "\n",
+    "demo_core.run_flow(bprj, top_specs, 'amp_chain', AmpChainSoln, sch_cls=demo_templates__amp_chain, run_lvs=True)"
+   ]
+  }
+ ],
+ "metadata": {
+  "anaconda-cloud": {},
+  "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.6.5"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}