Initial primitives for BAG3 for SkyWater's S8 process node.

Signed-off-by: Tim 'mithro' Ansell <tansell@google.com>
Signed-off-by: Krishna Settaluri <krishna@bcanalog.com>
Signed-off-by: Kevin Kelley <Kevin.Kelley@skywatertechnology.com>
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..707d445
--- /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>
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..b44661b
--- /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>
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..d593e71
--- /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>
diff --git a/.idea/skywater130.iml b/.idea/skywater130.iml
new file mode 100644
index 0000000..c646a1f
--- /dev/null
+++ b/.idea/skywater130.iml
@@ -0,0 +1,33 @@
+<?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
+-->
+<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/OA/BAG_prim/.oalib b/OA/BAG_prim/.oalib
new file mode 100644
index 0000000..0859910
--- /dev/null
+++ b/OA/BAG_prim/.oalib
@@ -0,0 +1,26 @@
+<?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
+-->
+<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..4b46185
--- /dev/null
+++ b/OA/BAG_prim/cdsinfo.tag
@@ -0,0 +1,51 @@
+# 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
+#
+# 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..601157b
--- /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..8cb67e4
--- /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..591c6b8
--- /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..8cb67e4
--- /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..ee192cb
--- /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..8cb67e4
--- /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..ee192cb
--- /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..8cb67e4
--- /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..ee192cb
--- /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..8cb67e4
--- /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..c04b5b1
--- /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..2a160dc
--- /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..2058778
--- /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..2a160dc
--- /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..60476ed
--- /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..2a160dc
--- /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..f4f08ae
--- /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..2a160dc
--- /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..4cb36e1
--- /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..2a160dc
--- /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..4cb36e1
--- /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..2a160dc
--- /dev/null
+++ b/OA/BAG_prim/pmos4_svt/symbol/thumbnail_128x128.png
Binary files differ
diff --git a/README.md b/README.md
index 82a8cd3..3aa33d4 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,13 @@
 # BAG (BAG AMS Generator) Primitives Library for [SKY130](https://github.com/google/skywater-pdk)
 
-This repository contains the required primitives to use BAG3 framework with
-[the Google skywater-pdk, a fully open source, manufacturable PDK for
-SkyWater's 130nm (SKY13) process node](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
@@ -16,7 +21,6 @@
 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
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..6762b6d
--- /dev/null
+++ b/calibre_setup/.cgilvsdb
@@ -0,0 +1 @@
+lvs.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..05f6f1b
--- /dev/null
+++ b/calibre_setup/drc.runset
@@ -0,0 +1,47 @@
+// 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
+*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..ec12374
--- /dev/null
+++ b/calibre_setup/drc.svrf
@@ -0,0 +1,38 @@
+// 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
+
+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..aa56bfd
--- /dev/null
+++ b/calibre_setup/lvs.runset
@@ -0,0 +1,58 @@
+// 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
+*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..a10001c
--- /dev/null
+++ b/calibre_setup/lvs.svrf
@@ -0,0 +1,67 @@
+// 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
+
+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/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/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..3ea4972
--- /dev/null
+++ b/netlist_setup/bag_prim.scs
@@ -0,0 +1,79 @@
+// 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
+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..8bcb34c
--- /dev/null
+++ b/netlist_setup/spectre_prim.scs
@@ -0,0 +1,25 @@
+// 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
+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..03b40c9
--- /dev/null
+++ b/pcell_setup/gen_skill.py
@@ -0,0 +1,90 @@
+#!/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..b6714db
--- /dev/null
+++ b/pcell_setup/prim_pcell.il
@@ -0,0 +1,449 @@
+;; 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
+
+;; 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")
+    ((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_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..306db76
--- /dev/null
+++ b/pcell_setup/prim_pcell_jinja2.il
@@ -0,0 +1,163 @@
+;; 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
+
+;; 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..7e4a026
--- /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
diff --git a/src/BAG_prim/schematic/__init__.py b/src/BAG_prim/schematic/__init__.py
new file mode 100644
index 0000000..7e4a026
--- /dev/null
+++ b/src/BAG_prim/schematic/__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
diff --git a/src/BAG_prim/schematic/nmos4_hv.py b/src/BAG_prim/schematic/nmos4_hv.py
new file mode 100644
index 0000000..75227ca
--- /dev/null
+++ b/src/BAG_prim/schematic/nmos4_hv.py
@@ -0,0 +1,39 @@
+#!/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 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..bbc9f14
--- /dev/null
+++ b/src/BAG_prim/schematic/nmos4_hvesd.py
@@ -0,0 +1,39 @@
+#!/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 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..bedee15
--- /dev/null
+++ b/src/BAG_prim/schematic/nmos4_lvt.py
@@ -0,0 +1,39 @@
+#!/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 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..3ed932b
--- /dev/null
+++ b/src/BAG_prim/schematic/nmos4_standard.py
@@ -0,0 +1,39 @@
+#!/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 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..e174e82
--- /dev/null
+++ b/src/BAG_prim/schematic/nmos4_svt.py
@@ -0,0 +1,39 @@
+#!/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 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..437df1a
--- /dev/null
+++ b/src/BAG_prim/schematic/pmos4_hv.py
@@ -0,0 +1,39 @@
+#!/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 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..9a7da7b
--- /dev/null
+++ b/src/BAG_prim/schematic/pmos4_hvesd.py
@@ -0,0 +1,39 @@
+#!/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 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..c7e32a0
--- /dev/null
+++ b/src/BAG_prim/schematic/pmos4_hvt.py
@@ -0,0 +1,39 @@
+#!/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 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..73519c8
--- /dev/null
+++ b/src/BAG_prim/schematic/pmos4_lvt.py
@@ -0,0 +1,39 @@
+#!/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 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..5432df4
--- /dev/null
+++ b/src/BAG_prim/schematic/pmos4_standard.py
@@ -0,0 +1,39 @@
+#!/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 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..c1ee848
--- /dev/null
+++ b/src/BAG_prim/schematic/pmos4_svt.py
@@ -0,0 +1,39 @@
+#!/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 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..09d7340
--- /dev/null
+++ b/src/templates_skywater130/__init__.py
@@ -0,0 +1,32 @@
+#!/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
+
+
+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 100644
index 0000000..8bbfd51
--- /dev/null
+++ b/src/templates_skywater130/data/tech_params.yaml
@@ -0,0 +1,865 @@
+# 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
+
+# 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 ['m1res', 'drawing']]
+#  2: [!!python/tuple ['m2res', 'drawing']]
+#  3: [!!python/tuple ['m3res', 'drawing']]
+#  4: [!!python/tuple ['m4res', 'drawing']]
+#  5: [!!python/tuple ['m5res', 'drawing']]
+
+# 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']]
+
+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:
+    - [[320, .inf]]
+    - [[320, .inf]]
+
+# 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.
+sp_min:
+  [met1, drawing]: &sp_min_1x
+    - [.inf, 28]
+  [met2, drawing]: *sp_min_1x
+  [met3, drawing]: &sp_min_2x
+    - [.inf, 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, 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: []
+
+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, 16, 16]
+      - [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
+  od_po_extx: 56
+
+  # 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
+
+  grid_info:
+    - [1, 52, 1]
+    - [3, 66, 2]
+
+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 100644
index 0000000..7e4a026
--- /dev/null
+++ b/src/templates_skywater130/mos/__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
diff --git a/src/templates_skywater130/mos/tech.py b/src/templates_skywater130/mos/tech.py
new file mode 100644
index 0000000..837dded
--- /dev/null
+++ b/src/templates_skywater130/mos/tech.py
@@ -0,0 +1,808 @@
+#!/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 typing import Tuple, FrozenSet, List
+
+
+from dataclasses import dataclass
+
+from pybag.enum import Orient2D
+from pybag.core import BBox
+
+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, get_arr_edge_dim
+
+
+@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, mos_entry_name: str = 'mos') -> None:
+        MOSTech.__init__(self, tech_info, lch, mos_entry_name)
+
+    @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'])
+
+    @property
+    def sub_sep_col(self) -> int:
+        return self._get_od_sep_col(max(self.mos_config['od_spx'],
+                                        2 * self.mos_config['imp_od_encx']))
+
+    @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']
+        return -(self.sd_pitch - self.lch) // 2 + self.od_po_extx + 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, num_g, g_pitch)
+
+        # 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
+
+        # draw base
+        bbox = BBox(0, 0, fg * sd_pitch, height)
+        add_base(builder, row_type, threshold, imp_y, bbox)
+
+        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], num_g: int, conn_pitch: int) -> None:
+        lch = self.lch
+        sd_pitch = self.sd_pitch
+
+        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
+        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)
+        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 // 2 + g0_info.via_top_enc
+            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'
+
+        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:
+            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()
+        od_y = self._add_mos_active(builder, row_info, 0, seg, w, is_sub=True)
+
+        # 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,
+                           0, seg + 1, sd_pitch)
+
+        # draw base
+        bbox = BBox(0, 0, seg * sd_pitch, height)
+        add_base(builder, sub_type, threshold, imp_y, bbox)
+
+        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))
+
+        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 100644
index 0000000..14a7c9a
--- /dev/null
+++ b/src/templates_skywater130/tech.py
@@ -0,0 +1,172 @@
+#!/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 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 100644
index 0000000..e19eb02
--- /dev/null
+++ b/src/templates_skywater130/util.py
@@ -0,0 +1,96 @@
+#!/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 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:
+    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))
+
+        if row_type.is_n_plus:
+            builder.add_rect_arr(('nsdm', 'drawing'), rect)
+        else:
+            pimp_lp = ('psdm', 'drawing')
+            nimp_lp = ('nsdm', 'drawing')
+            if rect.yl < imp_y[0]:
+                builder.add_rect_arr(nimp_lp, BBox(rect.xl, rect.yl, rect.xh, imp_y[0]))
+            if imp_y[1] < rect.yh:
+                builder.add_rect_arr(nimp_lp, BBox(rect.xl, imp_y[1], rect.xh, rect.yh))
+            if imp_y[0] < imp_y[1]:
+                builder.add_rect_arr(pimp_lp, 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..7a214e8
--- /dev/null
+++ b/workspace_setup/.bashrc
@@ -0,0 +1,75 @@
+#! /usr/bin/env bash
+
+### Setup BAG
+export BAG_TOOLS_ROOT=/tools/bag3/core
+source .bashrc_bag
+
+# PDK specific stuff
+export SW_PDK_ROOT=${BAG_TECH_CONFIG_DIR}/workspace_setup/PDK_root
+export PDK_HOME=${BAG_TECH_CONFIG_DIR}/workspace_setup/PDK
+export METAL_STACK=s8phirs_10r
+
+# calibre setup
+export MGLS_LICENSE_FILE=5282@login1.bcanalog.com
+export MGC_HOME=/tools/mentor/aoi_cal_2018.1_27.18
+export MGLS_HOME=/tools/mentor/mgls
+export CALIBRE_HOME=$MGC_HOME
+
+# location of various tools
+export CDS_INST_DIR=/tools/cadence/IC618
+export PEGASUS_HOME=/tools/cadence/PEGASUS184
+export SRR_HOME=/tools/cadence/SRR
+# export CDS_INST_DIR=/tools/cadence/IC618
+export SPECTRE_HOME=/tools/cadence/SPECTRE181
+export QRC_HOME=/tools/cadence/EXT191
+export INNOVUSHOME=/tools/cadence/installs/INNOVUS181
+export CDSLIB_HOME=/tools/bag3/programs/cdsLibPlugin
+export LATEX_BIN=/tools/texlive/2019/bin/x86_64-linux
+
+export CDSHOME=$CDS_INST_DIR
+export CDSLIB_TOOL=${CDSLIB_HOME}/tools.lnx86
+export MMSIM_HOME=${SPECTRE_HOME}
+
+# OA settings
+export OA_SRC_ROOT=/tools/bag3/programs/oa_22d6
+export OA_LINK_DIR=${OA_SRC_ROOT}/lib/linux_rhel60_64/opt
+# export OA_LINK_DIR=${OA_SRC_ROOT}/lib/linux_rhel50_gcc48x_64/opt
+export OA_CDS_ROOT=${CDS_INST_DIR}/oa_v22.60.007
+export OA_INCLUDE_DIR=${OA_SRC_ROOT}/include
+export OA_PLUGIN_PATH=${CDSLIB_HOME}/share/oaPlugIns:${OA_CDS_ROOT}/data/plugins:${OA_PLUGIN_PATH:-}
+export OA_BIT=64
+
+# PATH setup
+export PATH=${MGLS_HOME}/bin:${PATH}
+export PATH=${CALIBRE_HOME}/bin:${PATH}
+export PATH=${CDSLIB_TOOL}/bin:${PATH}
+export PATH=${PEGASUS_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=${QRC_HOME}/bin:${PATH}
+export PATH=${LATEX_BIN}:${PATH}
+export PATH=${BAG_TOOLS_ROOT}/bin:${PATH}
+
+# LD_LIBRARY_PATH setup
+export LD_LIBRARY_PATH=${CDSLIB_TOOL}/lib/64bit:${LD_LIBRARY_PATH:-}
+export LD_LIBRARY_PATH=${OA_LINK_DIR}:${LD_LIBRARY_PATH}
+export LD_LIBRARY_PATH=${BAG_TOOLS_ROOT}/lib64:${LD_LIBRARY_PATH}
+export LD_LIBRARY_PATH=${BAG_TOOLS_ROOT}/lib:${LD_LIBRARY_PATH}
+export LD_LIBRARY_PATH=${SRR_HOME}/tools/lib/64bit:${LD_LIBRARY_PATH}
+
+# Virtuoso options
+export SPECTRE_DEFAULTS=-E
+export CDS_Netlisting_Mode="Analog"
+export CDS_AUTO_64BIT=ALL
+export CDS_LIC_FILE=5280@login1.bcanalog.com
+
+# pybag compiler settings
+export CMAKE_PREFIX_PATH=${BAG_TOOLS_ROOT}
+export HDF5_PLUGIN_PATH=${BAG_TOOLS_ROOT}/lib/hdf5/plugin
+
+# clear out PYTHONPATH
+export PYTHONPATH=""
+export PYTHONPATH_CUSTOM=${SRR_HOME}/tools/srrpython
+
diff --git a/workspace_setup/.bashrc_bag b/workspace_setup/.bashrc_bag
new file mode 100644
index 0000000..01a90fc
--- /dev/null
+++ b/workspace_setup/.bashrc_bag
@@ -0,0 +1,23 @@
+#! /usr/bin/env bash
+
+# set directory variables
+export BAG_WORK_DIR=$(pwd)
+export BAG_FRAMEWORK=${BAG_WORK_DIR}/BAG_framework
+export BAG_TECH_CONFIG_DIR=${BAG_WORK_DIR}/skywater130
+export BAG_TEMP_DIR=${BAG_WORK_DIR}/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
+export BAG_JUPYTER=${BAG_TOOLS_ROOT}/bin/jupyter-notebook
+
+# set location of BAG configuration file
+export BAG_CONFIG_PATH=${BAG_WORK_DIR}/bag_config.yaml
+
+# change pycharm config file location
+export PYCHARM_PROPERTIES=/scratch/projects/${USER}/pycharm_setup/idea.properties
+
+# 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..26d34a2
--- /dev/null
+++ b/workspace_setup/.cdsinit
@@ -0,0 +1,150 @@
+
+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..8c2529c
--- /dev/null
+++ b/workspace_setup/PDK
@@ -0,0 +1 @@
+PDK_root/V1.3.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..4b24bce
--- /dev/null
+++ b/workspace_setup/bag_config.yaml
@@ -0,0 +1,146 @@
+# 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
+
+# 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: 6
+  # 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
+  # corner configuration file
+  env_file: "${BAG_TECH_CONFIG_DIR}/corners_setup.yaml"
+  # command settings
+  kwargs:
+    # the command to start
+    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=1', '+mp=1', '+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..4251600
--- /dev/null
+++ b/workspace_setup/bag_submodules.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
+
+BAG_framework:
+  url: https://github.com/bluecheetah/bag.git
+  branch: master
+bag3_digital:
+  url: https://github.com/bluecheetah/bag3_digital.git
+  branch: master
+bag3_testbenches:
+  url: https://github.com/bluecheetah/bag3_testbenches.git
+  branch: master
+xbase_bcad:
+  url: https://github.com/bluecheetah/xbase.git
+  branch: master
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..810c641
--- /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..7e513d6
--- /dev/null
+++ b/workspace_setup/leBindKeys.il
@@ -0,0 +1,147 @@
+;; 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
+
+;;-----------------------------------------------------------------------------
+;; 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..df42035
--- /dev/null
+++ b/workspace_setup/start_tutorial.sh
@@ -0,0 +1,22 @@
+#!/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
+
+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..141301d
--- /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..60d7b07
--- /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..67d0ad8
--- /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..5241aec
--- /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..93a806c
--- /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..a81d9ee
--- /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..a86bc69
--- /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..2189ce8
--- /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..ba44bdf
--- /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..e631931
--- /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..70915f1
--- /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..5d6a72c
--- /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..e123f96
--- /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..6d836b1
--- /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..4336251
--- /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..1c28411
--- /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..f288f64
--- /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..23ff221
--- /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": "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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_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
+}