Modified the configure script to allow 3rd party libraries to be either installed
by default (requiring --disable) or ignored by default (requiring --enable).
Moved the SRAM library to the "ignored by default" list because it takes so long
to build. Added all of the OSU standard cell libraries (hs/ms/ls each for
12T, 15T, and 18T). Added a straight-through analog pad for high-speed I/O,
especially for the "caravan" analog variant of the "caravel" harness chip.
diff --git a/Makefile.in b/Makefile.in
index a98af99..cb4286b 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -83,11 +83,16 @@
CPP = common/preproc.py
common_install:
- mkdir -p @prefix@/pdk/bin/
- cp common/cleanup_unref.py @prefix@/pdk/bin/
- cp common/soc_floorplanner.py @prefix@/pdk/bin/
- ${CPP} -DPREFIX=@prefix@ common/create_project.py \
- @prefix@/pdk/bin/create_project.py
+ @if test -w @prefix@ ; then \
+ mkdir -p @prefix@/pdk/bin/ ;\
+ cp common/cleanup_unref.py @prefix@/pdk/bin/ ;\
+ cp common/soc_floorplanner.py @prefix@/pdk/bin/ ;\
+ ${CPP} -DPREFIX=@prefix@ common/create_project.py \
+ @prefix@/pdk/bin/create_project.py ;\
+ echo "Common install: Done." ;\
+ else \
+ echo "Common install: @prefix@ is not writeable (ignoring)." ;\
+ fi
#---------------------------------------------------
diff --git a/README.md b/README.md
index 310dc7d..80a0b60 100644
--- a/README.md
+++ b/README.md
@@ -52,13 +52,13 @@
At a minimum you will want to pass a configure option to declare the location
of the PDK vendor source distribution (which can be obtained separately),
- ./configure --with-[PDK_name]-source=[path]
+ ./configure --enable-[PDK_name]-pdk=[path]
The open_pdks version of the PDK can be built locally within open_pdks without
the need to declare an install target or run "make install". However, it is
recommended to declare a target location and install there, using
- ./configure --with-[PDK_name]-source=[path] --with-[PDK_name]-local-path=[path]
+ ./configure --enable-[PDK_name]-pdk=[path] --with-[PDK_name]-local-path=[path]
followed by "make" and "make install".
diff --git a/scripts/configure b/scripts/configure
index 824d296..b0e3e58 100755
--- a/scripts/configure
+++ b/scripts/configure
@@ -588,9 +588,13 @@
ac_subst_vars='LTLIBOBJS
LIBOBJS
EF_STYLE
+SKY130_OSU_T18_PATH
+SKY130_OSU_T15_PATH
+SKY130_OSU_T12_PATH
+SKY130_OSU_PATH
+SKY130_SRAM_MACROS_PATH
XSCHEM_SKY130_PATH
SKY130_ML_XX_HD_PATH
-SKY130_SRAM_MACROS_PATH
PATCH
MAGIC
XSCHEM_DISABLED
@@ -666,9 +670,13 @@
enable_openlane
enable_qflow
enable_xschem
-enable_sram_sky130
enable_alpha_sky130
enable_xschem_sky130
+enable_sram_sky130
+enable_osu_sky130
+enable_osu_t12_sky130
+enable_osu_t15_sky130
+enable_osu_t18_sky130
with_ef_style
'
ac_precious_vars='build_alias
@@ -1327,15 +1335,27 @@
Enable or disable xschem setup [default=enabled]
- --enable-sram-sky130[=path]
- Install sky130_sram_macros. If path is omitted, it'll be
- downloaded. [default=enabled]
--enable-alpha-sky130[=path]
- Install sky130_ml_xx_hd. If path is omitted, it'll be
- downloaded. [default=enabled]
+ Install sky130_ml_xx_hd. If path is omitted, the repository
+ will be downloaded. [default=enabled]
--enable-xschem-sky130[=path]
- Install xschem_sky130. If path is omitted, it'll be
- downloaded. [default=enabled]
+ Install xschem_sky130. If path is omitted, the repository
+ will be downloaded. [default=enabled]
+ --enable-sram-sky130[=path]
+ Install sky130_sram_macros. If path is omitted, the repository
+ will be downloaded. [default=enabled]
+ --enable-osu-sky130[=path]
+ Install sky130_osu. If path is omitted, the repository
+ will be downloaded. [default=enabled]
+ --enable-osu-t12-sky130[=path]
+ Install sky130_osu_t12. If path is omitted, the repository
+ will be downloaded. [default=enabled]
+ --enable-osu-t15-sky130[=path]
+ Install sky130_osu_t15. If path is omitted, the repository
+ will be downloaded. [default=enabled]
+ --enable-osu-t18-sky130[=path]
+ Install sky130_osu_t18. If path is omitted, the repository
+ will be downloaded. [default=enabled]
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
@@ -2441,46 +2461,7 @@
# Other installations (libraries or tools if applicable)
-
-
-
-
-
-
- # echo target targetvar flag location
-
- SKY130_SRAM_MACROS_PATH=""
-
- # Check whether --enable-sram-sky130 was given.
-if test "${enable_sram_sky130+set}" = set; then :
- enableval=$enable_sram_sky130;
- if test "$enableval" == "yes" -o "$enableval" == "YES"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: Package 'sky130_sram_macros' will be installed automatically during make." >&5
-$as_echo "$as_me: Package 'sky130_sram_macros' will be installed automatically during make." >&6;}
- export SKY130_SRAM_MACROS_PATH=../sources/sky130_sram_macros
- elif test "$enableval" == "no" -o "$enableval" == "NO"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling package 'sky130_sram_macros'" >&5
-$as_echo "$as_me: Disabling package 'sky130_sram_macros'" >&6;}
- export SKY130_SRAM_MACROS_PATH=""
- else
- SKY130_SRAM_MACROS_PATH=$enableval
- { $as_echo "$as_me:${as_lineno-$LINENO}: Enabling package 'sky130_sram_macros' at $SKY130_SRAM_MACROS_PATH" >&5
-$as_echo "$as_me: Enabling package 'sky130_sram_macros' at $SKY130_SRAM_MACROS_PATH" >&6;}
- fi
- SKY130_SRAM_MACROS_PATH=`realpath $SKY130_SRAM_MACROS_PATH`
-
-else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: Package 'sky130_sram_macros' will be installed automatically during make." >&5
-$as_echo "$as_me: Package 'sky130_sram_macros' will be installed automatically during make." >&6;}
- SKY130_SRAM_MACROS_PATH=../sources/sky130_sram_macros
-
-
-fi
-
-
-
-
+# Optional installations (like the above, but disabled by default)
@@ -2570,6 +2551,212 @@
+
+
+
+
+ # echo target targetvar flag location
+
+ SKY130_SRAM_MACROS_PATH=""
+
+ # Check whether --enable-sram-sky130 was given.
+if test "${enable_sram_sky130+set}" = set; then :
+ enableval=$enable_sram_sky130;
+ if test "$enableval" == "yes" -o "$enableval" == "YES"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Package 'sky130_sram_macros' will be installed automatically during make." >&5
+$as_echo "$as_me: Package 'sky130_sram_macros' will be installed automatically during make." >&6;}
+ export SKY130_SRAM_MACROS_PATH=../sources/sky130_sram_macros
+ elif test "$enableval" == "no" -o "$enableval" == "NO"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling package 'sky130_sram_macros'" >&5
+$as_echo "$as_me: Disabling package 'sky130_sram_macros'" >&6;}
+ export SKY130_SRAM_MACROS_PATH=""
+ else
+ SKY130_SRAM_MACROS_PATH=$enableval
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Enabling package 'sky130_sram_macros' at $SKY130_SRAM_MACROS_PATH" >&5
+$as_echo "$as_me: Enabling package 'sky130_sram_macros' at $SKY130_SRAM_MACROS_PATH" >&6;}
+ fi
+ SKY130_SRAM_MACROS_PATH=`realpath $SKY130_SRAM_MACROS_PATH`
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Package 'sky130_sram_macros' will not be installed." >&5
+$as_echo "$as_me: Package 'sky130_sram_macros' will not be installed." >&6;}
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+ # echo target targetvar flag location
+
+ SKY130_OSU_PATH=""
+
+ # Check whether --enable-osu-sky130 was given.
+if test "${enable_osu_sky130+set}" = set; then :
+ enableval=$enable_osu_sky130;
+ if test "$enableval" == "yes" -o "$enableval" == "YES"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Package 'sky130_osu' will be installed automatically during make." >&5
+$as_echo "$as_me: Package 'sky130_osu' will be installed automatically during make." >&6;}
+ export SKY130_OSU_PATH=../sources/sky130_osu
+ elif test "$enableval" == "no" -o "$enableval" == "NO"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling package 'sky130_osu'" >&5
+$as_echo "$as_me: Disabling package 'sky130_osu'" >&6;}
+ export SKY130_OSU_PATH=""
+ else
+ SKY130_OSU_PATH=$enableval
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Enabling package 'sky130_osu' at $SKY130_OSU_PATH" >&5
+$as_echo "$as_me: Enabling package 'sky130_osu' at $SKY130_OSU_PATH" >&6;}
+ fi
+ SKY130_OSU_PATH=`realpath $SKY130_OSU_PATH`
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Package 'sky130_osu' will not be installed." >&5
+$as_echo "$as_me: Package 'sky130_osu' will not be installed." >&6;}
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+ # echo target targetvar flag location
+
+ SKY130_OSU_T12_PATH=""
+
+ # Check whether --enable-osu-t12-sky130 was given.
+if test "${enable_osu_t12_sky130+set}" = set; then :
+ enableval=$enable_osu_t12_sky130;
+ if test "$enableval" == "yes" -o "$enableval" == "YES"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Package 'sky130_osu_t12' will be installed automatically during make." >&5
+$as_echo "$as_me: Package 'sky130_osu_t12' will be installed automatically during make." >&6;}
+ export SKY130_OSU_T12_PATH=../sources/sky130_osu_t12
+ elif test "$enableval" == "no" -o "$enableval" == "NO"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling package 'sky130_osu_t12'" >&5
+$as_echo "$as_me: Disabling package 'sky130_osu_t12'" >&6;}
+ export SKY130_OSU_T12_PATH=""
+ else
+ SKY130_OSU_T12_PATH=$enableval
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Enabling package 'sky130_osu_t12' at $SKY130_OSU_T12_PATH" >&5
+$as_echo "$as_me: Enabling package 'sky130_osu_t12' at $SKY130_OSU_T12_PATH" >&6;}
+ fi
+ SKY130_OSU_T12_PATH=`realpath $SKY130_OSU_T12_PATH`
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Package 'sky130_osu_t12' will not be installed." >&5
+$as_echo "$as_me: Package 'sky130_osu_t12' will not be installed." >&6;}
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+ # echo target targetvar flag location
+
+ SKY130_OSU_T15_PATH=""
+
+ # Check whether --enable-osu-t15-sky130 was given.
+if test "${enable_osu_t15_sky130+set}" = set; then :
+ enableval=$enable_osu_t15_sky130;
+ if test "$enableval" == "yes" -o "$enableval" == "YES"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Package 'sky130_osu_t15' will be installed automatically during make." >&5
+$as_echo "$as_me: Package 'sky130_osu_t15' will be installed automatically during make." >&6;}
+ export SKY130_OSU_T15_PATH=../sources/sky130_osu_t15
+ elif test "$enableval" == "no" -o "$enableval" == "NO"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling package 'sky130_osu_t15'" >&5
+$as_echo "$as_me: Disabling package 'sky130_osu_t15'" >&6;}
+ export SKY130_OSU_T15_PATH=""
+ else
+ SKY130_OSU_T15_PATH=$enableval
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Enabling package 'sky130_osu_t15' at $SKY130_OSU_T15_PATH" >&5
+$as_echo "$as_me: Enabling package 'sky130_osu_t15' at $SKY130_OSU_T15_PATH" >&6;}
+ fi
+ SKY130_OSU_T15_PATH=`realpath $SKY130_OSU_T15_PATH`
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Package 'sky130_osu_t15' will not be installed." >&5
+$as_echo "$as_me: Package 'sky130_osu_t15' will not be installed." >&6;}
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+ # echo target targetvar flag location
+
+ SKY130_OSU_T18_PATH=""
+
+ # Check whether --enable-osu-t18-sky130 was given.
+if test "${enable_osu_t18_sky130+set}" = set; then :
+ enableval=$enable_osu_t18_sky130;
+ if test "$enableval" == "yes" -o "$enableval" == "YES"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Package 'sky130_osu_t18' will be installed automatically during make." >&5
+$as_echo "$as_me: Package 'sky130_osu_t18' will be installed automatically during make." >&6;}
+ export SKY130_OSU_T18_PATH=../sources/sky130_osu_t18
+ elif test "$enableval" == "no" -o "$enableval" == "NO"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling package 'sky130_osu_t18'" >&5
+$as_echo "$as_me: Disabling package 'sky130_osu_t18'" >&6;}
+ export SKY130_OSU_T18_PATH=""
+ else
+ SKY130_OSU_T18_PATH=$enableval
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Enabling package 'sky130_osu_t18' at $SKY130_OSU_T18_PATH" >&5
+$as_echo "$as_me: Enabling package 'sky130_osu_t18' at $SKY130_OSU_T18_PATH" >&6;}
+ fi
+ SKY130_OSU_T18_PATH=`realpath $SKY130_OSU_T18_PATH`
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Package 'sky130_osu_t18' will not be installed." >&5
+$as_echo "$as_me: Package 'sky130_osu_t18' will not be installed." >&6;}
+
+
+fi
+
+
+
+
+
+
+
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: Tools enabled for PDK setup installation: klayout magic netgen irsim openlane qflow xschem" >&5
$as_echo "$as_me: Tools enabled for PDK setup installation: klayout magic netgen irsim openlane qflow xschem" >&6;}
diff --git a/scripts/configure.ac b/scripts/configure.ac
index be17018..63de958 100755
--- a/scripts/configure.ac
+++ b/scripts/configure.ac
@@ -168,7 +168,7 @@
flag,
AS_HELP_STRING(
[--enable-flag@<:@=path@:>@],
- [Install target. If path is omitted, it'll be downloaded. @<:@default=enabled@:>@]
+ [Install target. If path is omitted, the repository will be downloaded. @<:@default=enabled@:>@]
), [
if test "$enableval" == "yes" -o "$enableval" == "YES"; then
AC_MSG_NOTICE([Package 'target' will be installed automatically during make.])
@@ -192,10 +192,53 @@
AC_SUBST(targetvar[]_PATH)
])
-M4_GEN_INSTALLATION(sky130_sram_macros, sram-sky130, ../sources)
+# Optional installations (like the above, but disabled by default)
+AC_DEFUN([M4_OPT_INSTALLATION], [
+ m4_define([target], $1)
+ m4_define([targetvar], [m4_normalize(m4_esyscmd(echo target | tr "a-z-" "A-Z_"))])
+ m4_define([flag], $2)
+ m4_define([location], $3)
+
+ # echo target targetvar flag location
+
+ targetvar[]_PATH=""
+
+ AC_ARG_ENABLE(
+ flag,
+ AS_HELP_STRING(
+ [--enable-flag@<:@=path@:>@],
+ [Install target. If path is omitted, the repository will be downloaded. @<:@default=enabled@:>@]
+ ), [
+ if test "$enableval" == "yes" -o "$enableval" == "YES"; then
+ AC_MSG_NOTICE([Package 'target' will be installed automatically during make.])
+ export targetvar[]_PATH=location/target
+ elif test "$enableval" == "no" -o "$enableval" == "NO"; then
+ AC_MSG_NOTICE([Disabling package 'target'])
+ export targetvar[]_PATH=""
+ else
+ targetvar[]_PATH=$enableval
+ AC_MSG_NOTICE([Enabling package 'target' at $[]targetvar[]_PATH])
+ fi
+ targetvar[]_PATH=`realpath $[]targetvar[]_PATH`
+ ],[
+ AC_MSG_NOTICE([Package 'target' will not be installed.])
+ ]
+ )
+
+ $4
+
+ AC_SUBST(targetvar[]_PATH)
+])
+
M4_GEN_INSTALLATION(sky130_ml_xx_hd, alpha-sky130, ../sources)
M4_GEN_INSTALLATION(xschem_sky130, xschem-sky130, ../sources)
+M4_OPT_INSTALLATION(sky130_sram_macros, sram-sky130, ../sources)
+M4_OPT_INSTALLATION(sky130_osu, osu-sky130, ../sources)
+M4_OPT_INSTALLATION(sky130_osu_t12, osu-t12-sky130, ../sources)
+M4_OPT_INSTALLATION(sky130_osu_t15, osu-t15-sky130, ../sources)
+M4_OPT_INSTALLATION(sky130_osu_t18, osu-t18-sky130, ../sources)
+
AC_DEFUN([M4_GEN_WITH_TOOLS], [
m4_foreach_w(tool, $1, [
m4_define([toolvar], [m4_normalize(m4_esyscmd(echo tool | tr "a-z-" "A-Z_"))])
diff --git a/scripts/download.sh b/scripts/download.sh
index 1bfadc1..a4188d9 100755
--- a/scripts/download.sh
+++ b/scripts/download.sh
@@ -1,10 +1,10 @@
-#!/bin/sh
+#!/bin/bash
#
# download.sh --
# Download a tarball from the specified URL to the specified target
# directory, untar it, and remove the tarball file.
#
-# Usage: download.sh <url> <target_dir>
+# Usage: download.sh <url> <target_dir> [<strip>]
#
# where:
#
@@ -13,6 +13,8 @@
# tarball will be downloaded to the directory above this,
# untarred while renaming to <target_dir>, and then the tarball
# file will be deleted.
+# <strip> is the number of directory levels to strip off the front of the
+# tarball contents. Defaults to 1 if not specified.
#
# Neither curl or wget are guaranteed to be included in all *nix systems,
@@ -39,7 +41,14 @@
echo "Downloading $1 to $2"
$DL_CMD $2.tar.gz $1
+if [ $# -gt 2 ]; then
+ snum=$3
+else
+ snum=1
+fi
+
mkdir -p $2
-tar -xf $2.tar.gz --strip-components 1 -C $2
+echo "Untarring and removing $2.tar.gz"
+tar -xf $2.tar.gz --strip-components $snum -C $2
rm $2.tar.gz
exit 0
diff --git a/sky130/Makefile.in b/sky130/Makefile.in
index 3e10159..5afc129 100644
--- a/sky130/Makefile.in
+++ b/sky130/Makefile.in
@@ -78,25 +78,52 @@
# External (third-party) libraries and tool setups are the following (enabled
# by default):
#
-# --enable-alpha-lib[=<path>]
+# --enable-alpha-sky130[=<path>]
# If enabled, install the sky130_ml_xx_hd font library from
# Paul Schulz on github. If <path> is not specified, then the
# font library will be cloned from the git repository and
# installed.
#
-# --enable-xschem[=<path>]
+# --enable-xschem-sky130[=<path>]
# If enabled, install the Sky130 setup for the xschem schematic
# editor. If <path> is specified, then the xschem setup is
# expected to be found rooted at the given path. If not
# specified, then the xschem setup will be cloned from the
# repository and installed.
#
-# --enable-sram-lib[=<path>]
+# External (third-party) libraries and tool setups are the following (disabled
+# by default):
+#
+# --enable-sram-sky130[=<path>]
# If enabled, install the sky130_sram_macros library from
# efabless on github. If <path> is not specified, then
# the SRAM library will be cloned from the repository and
# installed.
#
+# --enable-osu-sky130[=<path>]
+# If enabled, install the sky130_osu_sc library from
+# foss-eda-tools on googlesource. If <path> is not
+# specified, then the OSU standard cell library will be
+# clones from the repository and installed.
+#
+# --enable-osu-t12-sky130[=<path>]
+# If enabled, install the sky130_osu_sc_t12 libraries from
+# foss-eda-tools on googlesource. If <path> is not
+# specified, then the OSU standard cell library will be
+# clones from the repository and installed.
+#
+# --enable-osu-t15-sky130[=<path>]
+# If enabled, install the sky130_osu_sc_t15 libraries from
+# foss-eda-tools on googlesource. If <path> is not
+# specified, then the OSU standard cell library will be
+# clones from the repository and installed.
+#
+# --enable-osu-t18-sky130[=<path>]
+# If enabled, install the sky130_osu_sc_t18 libraries from
+# foss-eda-tools on googlesource. If <path> is not
+# specified, then the OSU standard cell library will be
+# clones from the repository and installed.
+#
# The variables below are substituted from the configuration options:
#
# SKYWATER_PATH: points to vendor sources
@@ -177,11 +204,19 @@
ALPHA_PATH = @SKY130_ML_XX_HD_PATH@
XSCHEM_PATH = @XSCHEM_SKY130_PATH@
SRAM_PATH = @SKY130_SRAM_MACROS_PATH@
+OSU_PATH = @SKY130_OSU_PATH@
+OSU_T12_PATH = @SKY130_OSU_T12_PATH@
+OSU_T15_PATH = @SKY130_OSU_T15_PATH@
+OSU_T18_PATH = @SKY130_OSU_T18_PATH@
PDK_URL = https://github.com/google/skywater-pdk
ALPHA_URL = https://github.com/PaulSchulz/sky130_pschulz_xx_hd/archive/master.tar.gz
XSCHEM_URL = https://github.com/StefanSchippers/xschem_sky130/archive/main.tar.gz
SRAM_URL = https://github.com/efabless/sky130_sram_macros/archive/main.tar.gz
+OSU_URL = https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc/+archive/refs/heads/master.tar.gz
+OSU_T12_URL = https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t12/+archive/refs/heads/master.tar.gz
+OSU_T15_URL = https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t15/+archive/refs/heads/master.tar.gz
+OSU_T18_URL = https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t18/+archive/refs/heads/master.tar.gz
# NOTE: Install destination is the git repository of the technology platform.
# Once updated in git, the git project can be distributed to all hosts.
@@ -345,7 +380,7 @@
all: all-a
# Handle prerequisites (fetch and install the PDK and requested libraries)
-prerequisites: pdk-repo alpha-repo xschem-repo sram-repo
+prerequisites: pdk-repo alpha-repo xschem-repo sram-repo osu-repo osu-t12-repo osu-t15-repo osu-t18-repo
pdk-repo:
if test "x${SKYWATER_PATH}" != "x" ; then \
@@ -370,9 +405,9 @@
sram-repo:
if test "x${SRAM_PATH}" != "x" ; then \
if test -d "${SRAM_PATH}" ; then \
- echo "Using existing installation of alphanumeric library from ${SRAM_PATH}" ; \
+ echo "Using existing installation of SRAM macro library from ${SRAM_PATH}" ; \
else \
- echo "Downloading alphanumeric library from ${SRAM_URL}" ; \
+ echo "Downloading SRAM macro library from ${SRAM_URL}" ; \
../scripts/download.sh ${SRAM_URL} ${SRAM_PATH} ; \
fi ; \
fi
@@ -387,6 +422,46 @@
fi ; \
fi
+osu-repo:
+ if test "x${OSU_PATH}" != "x" ; then \
+ if test -d "${OSU_PATH}" ; then \
+ echo "Using existing installation of OSU standard cell library from ${OSU_PATH}" ; \
+ else \
+ echo "Downloading OSU standard cell library from ${OSU_URL}" ; \
+ ../scripts/download.sh ${OSU_URL} ${OSU_PATH} 0 ; \
+ fi ; \
+ fi
+
+osu-t12-repo:
+ if test "x${OSU_T12_PATH}" != "x" ; then \
+ if test -d "${OSU_T12_PATH}" ; then \
+ echo "Using existing installation of OSU T12 standard cell library from ${OSU_T12_PATH}" ; \
+ else \
+ echo "Downloading OSU standard T12 cell library from ${OSU_T12_URL}" ; \
+ ../scripts/download.sh ${OSU_T12_URL} ${OSU_T12_PATH} 0 ; \
+ fi ; \
+ fi
+
+osu-t15-repo:
+ if test "x${OSU_T15_PATH}" != "x" ; then \
+ if test -d "${OSU_T15_PATH}" ; then \
+ echo "Using existing installation of OSU T15 standard cell library from ${OSU_T15_PATH}" ; \
+ else \
+ echo "Downloading OSU standard T15 cell library from ${OSU_T15_URL}" ; \
+ ../scripts/download.sh ${OSU_T15_URL} ${OSU_T15_PATH} 0 ; \
+ fi ; \
+ fi
+
+osu-t18-repo:
+ if test "x${OSU_T18_PATH}" != "x" ; then \
+ if test -d "${OSU_T18_PATH}" ; then \
+ echo "Using existing installation of OSU T18 standard cell library from ${OSU_T18_PATH}" ; \
+ else \
+ echo "Downloading OSU standard T18 cell library from ${OSU_T18_URL}" ; \
+ ../scripts/download.sh ${OSU_T18_URL} ${OSU_T18_PATH} 0 ; \
+ fi ; \
+ fi
+
all-a: prerequisites
echo "Starting sky130A PDK staging on "`date` > ${SKY130A}_make.log
${MAKE} general-a
@@ -591,8 +666,9 @@
${CPP} -quiet ${SKY130A_DEFS} openlane/sky130_osu_sc_t18/tracks.info \
${OPENLANE_STAGING_A}/sky130_osu_sc_t18/tracks.info
-vendor-a:
- # Modify the LEF files to update hs and ms libraries
+vendor-a: primitive-a io-a digital-a alpha-a sram-a osu-base-a osu-t12-a osu-t15-a osu-t18-a
+
+primitive-a:
# Install device subcircuits from vendor files
${STAGE} -source ${SKYWATER_LIBS_PATH} -target ${STAGING_PATH}/${SKY130A} \
-ngspice sky130_fd_pr/latest/models/* \
@@ -622,10 +698,12 @@
cat ./custom/models/spinit >> \
${STAGING_PATH}/${SKY130A}/libs.tech/ngspice/spinit
+io-a:
# Install custom additions to I/O pad library
${STAGE} -source ./custom -target ${STAGING_PATH}/${SKY130A} \
-verilog %l/verilog/*.v \
-cdl %l/cdl/*.cdl \
+ -spice %l/spice/*.spice \
-gds %l/gds/*.gds options=custom/scripts/gds_import_setup.tcl \
-lef %l/lef/*.lef compile-only rename=sky130_ef_io \
-library general sky130_fd_io 2>&1 | tee -a ${SKY130A}_make.log
@@ -660,6 +738,8 @@
# when writing HVI to GDS during hierarchical adjustments.
${ADDPROP} ${STAGING_PATH}/${SKY130A} sky130_fd_io sky130_fd_io__top_gpiov2 \
"MASKHINTS_HVI 1346 17198 5828 19224 13700 1890 15920 2360 24 17522 1778 20612" -mag
+
+digital-a:
# Install all SkyWater digital standard cells.
${STAGE} -source ${SKYWATER_LIBS_PATH} -target ${STAGING_PATH}/${SKY130A} \
-techlef %l/latest/tech/*.tlef \
@@ -710,10 +790,18 @@
patch -p1 -f -d ${STAGING_PATH}/${SKY130A}/libs.ref/sky130_fd_sc_hdll/techlef \
< custom/patches/hdll_minenclosed.squeaky.patch \
2>&1 | tee -a ${SKY130A}_make.log || true
+
+alpha-a:
# Install alphanumeric library.
${STAGE} -source ${ALPHA_PATH}/.. -target ${STAGING_PATH}/${SKY130A} \
-mag %l/mag/*.mag filter=custom/scripts/text2m5.py \
-library general sky130_ml_xx_hd 2>&1 | tee -a ${SKY130A}_make.log
+ # Install text2mag.py script for alphanumeric library
+ mkdir -p ${STAGING_PATH}/${SKY130A}/libs.ref/sky130_ml_xx_hd/scripts
+ cp custom/scripts/text2mag.py \
+ ${STAGING_PATH}/${SKY130A}/libs.ref/sky130_ml_xx_hd/scripts
+
+sram-a:
# Install SRAM library.
${STAGE} -source ${SRAM_PATH}/.. -target ${STAGING_PATH}/${SKY130A} \
-lef %l/*/*.lef \
@@ -729,19 +817,104 @@
rename=sram_1rw1r_32_256_8_sky130.spice \
-verilog %l/*/*.v \
-library general sky130_sram_macros 2>&1 | tee -a ${SKY130A}_make.log
- # Install text2mag.py script for alphanumeric library
- mkdir -p ${STAGING_PATH}/${SKY130A}/libs.ref/sky130_ml_xx_hd/scripts
- cp custom/scripts/text2mag.py \
- ${STAGING_PATH}/${SKY130A}/libs.ref/sky130_ml_xx_hd/scripts
+
+osu-base-a:
# Install OSU digital standard cells.
- ${STAGE} -source ${SKYWATER_LIBS_PATH} -target ${STAGING_PATH}/${SKY130A} \
- -techlef %l/latest/lef/sky130_osu_sc.tlef rename=sky130_osu_sc_t18.tlef \
+ ${STAGE} -source ${OSU_PATH} -target ${STAGING_PATH}/${SKY130A} \
+ -techlef %l/tech/sky130_osu_sc.lef rename=sky130_osu_sc.tlef \
-cdl %l/latest/cdl/*.cdl ignore=topography compile-only \
-lef %l/latest/lef/*.lef compile-only \
-lib %l/latest/lib/*.lib \
-gds %l/latest/gds/*.gds compile-only \
options=custom/scripts/gds_import_setup.tcl \
- -library digital sky130_osu_sc_t18 2>&1 | tee -a ${SKY130A}_make.log
+ -library digital sky130_osu_sc 2>&1 | tee -a ${SKY130A}_make.log
+
+osu-t12-a:
+ # Install OSU T12 hs digital standard cells.
+ ${STAGE} -source ${OSU_T12_PATH} -target ${STAGING_PATH}/${SKY130A} \
+ -techlef sky130_osu_sc_12T.tlef rename=sky130_osc_sc_12t_hs.tlef \
+ -spice 12T_hs/cdl/*.spice compile-only exclude=*.*.spice \
+ -lef 12T_hs/lef/*.lef \
+ -lib 12T_hs/lib/*.lib \
+ -gds 12T_hs/gds/*.gds compile-only \
+ options=custom/scripts/gds_import_setup.tcl \
+ -library digital sky130_osu_sc_12t_hs 2>&1 | tee -a ${SKY130A}_make.log
+ # Install OSU T12 ms digital standard cells.
+ ${STAGE} -source ${OSU_T12_PATH} -target ${STAGING_PATH}/${SKY130A} \
+ -techlef sky130_osu_sc_12T.tlef rename=sky130_osc_sc_12t_ms.tlef \
+ -spice 12T_ms/cdl/*.spice compile-only exclude=*.*.spice \
+ -lef 12T_ms/lef/*.lef \
+ -lib 12T_ms/lib/*.lib \
+ -gds 12T_ms/gds/*.gds compile-only \
+ options=custom/scripts/gds_import_setup.tcl \
+ -library digital sky130_osu_sc_12t_ms 2>&1 | tee -a ${SKY130A}_make.log
+ # Install OSU T12 ls digital standard cells.
+ ${STAGE} -source ${OSU_T12_PATH} -target ${STAGING_PATH}/${SKY130A} \
+ -techlef sky130_osu_sc_12T.tlef rename=sky130_osc_sc_12t_ls.tlef \
+ -spice 12T_ls/cdl/*.spice compile-only exclude=*.*.spice \
+ -lef 12T_ls/lef/*.lef \
+ -lib 12T_ls/lib/*.lib \
+ -gds 12T_ls/gds/*.gds compile-only \
+ options=custom/scripts/gds_import_setup.tcl \
+ -library digital sky130_osu_sc_12t_ls 2>&1 | tee -a ${SKY130A}_make.log
+
+osu-t15-a:
+ # Install OSU T15 hs digital standard cells.
+ ${STAGE} -source ${OSU_T15_PATH} -target ${STAGING_PATH}/${SKY130A} \
+ -techlef sky130_osu_sc_15T.tlef rename=sky130_osc_sc_15t_hs.tlef \
+ -spice 15T_hs/cdl/*.spice compile-only exclude=*.*.spice \
+ -lef 15T_hs/lef/*.lef \
+ -lib 15T_hs/lib/*.lib \
+ -gds 15T_hs/gds/*.gds compile-only \
+ options=custom/scripts/gds_import_setup.tcl \
+ -library digital sky130_osu_sc_15t_hs 2>&1 | tee -a ${SKY130A}_make.log
+ # Install OSU T15 ms digital standard cells.
+ ${STAGE} -source ${OSU_T15_PATH} -target ${STAGING_PATH}/${SKY130A} \
+ -techlef sky130_osu_sc_15T.tlef rename=sky130_osc_sc_15t_ms.tlef \
+ -spice 15T_ms/cdl/*.spice compile-only exclude=*.*.spice \
+ -lef 15T_ms/lef/*.lef \
+ -lib 15T_ms/lib/*.lib \
+ -gds 15T_ms/gds/*.gds compile-only \
+ options=custom/scripts/gds_import_setup.tcl \
+ -library digital sky130_osu_sc_15t_ms 2>&1 | tee -a ${SKY130A}_make.log
+ # Install OSU T15 ls digital standard cells.
+ ${STAGE} -source ${OSU_T15_PATH} -target ${STAGING_PATH}/${SKY130A} \
+ -techlef sky130_osu_sc_15T.tlef rename=sky130_osc_sc_15t_ls.tlef \
+ -spice 15T_ls/cdl/*.spice compile-only exclude=*.*.spice \
+ -lef 15T_ls/lef/*.lef \
+ -lib 15T_ls/lib/*.lib \
+ -gds 15T_ls/gds/*.gds compile-only \
+ options=custom/scripts/gds_import_setup.tcl \
+ -library digital sky130_osu_sc_15t_ls 2>&1 | tee -a ${SKY130A}_make.log
+
+osu-t18-a:
+ # Install OSU T18 hs digital standard cells.
+ ${STAGE} -source ${OSU_T18_PATH} -target ${STAGING_PATH}/${SKY130A} \
+ -techlef sky130_osu_sc_18T.tlef rename=sky130_osc_sc_18t_hs.tlef \
+ -spice 18T_hs/cdl/*.spice compile-only exclude=*.*.spice \
+ -lef 18T_hs/lef/*.lef \
+ -lib 18T_hs/lib/*.lib \
+ -gds 18T_hs/gds/*.gds compile-only \
+ options=custom/scripts/gds_import_setup.tcl \
+ -library digital sky130_osu_sc_18t_hs 2>&1 | tee -a ${SKY130A}_make.log
+ # Install OSU T18 ms digital standard cells.
+ ${STAGE} -source ${OSU_T18_PATH} -target ${STAGING_PATH}/${SKY130A} \
+ -techlef sky130_osu_sc_18T.tlef rename=sky130_osc_sc_18t_ms.tlef \
+ -spice 18T_ms/cdl/*.spice compile-only exclude=*.*.spice \
+ -lef 18T_ms/lef/*.lef \
+ -lib 18T_ms/lib/*.lib \
+ -gds 18T_ms/gds/*.gds compile-only \
+ options=custom/scripts/gds_import_setup.tcl \
+ -library digital sky130_osu_sc_18t_ms 2>&1 | tee -a ${SKY130A}_make.log
+ # Install OSU T18 ls digital standard cells.
+ ${STAGE} -source ${OSU_T18_PATH} -target ${STAGING_PATH}/${SKY130A} \
+ -techlef sky130_osu_sc_18T.tlef rename=sky130_osc_sc_18t_ls.tlef \
+ -spice 18T_ls/cdl/*.spice compile-only exclude=*.*.spice \
+ -lef 18T_ls/lef/*.lef \
+ -lib 18T_ls/lib/*.lib \
+ -gds 18T_ls/gds/*.gds compile-only \
+ options=custom/scripts/gds_import_setup.tcl \
+ -library digital sky130_osu_sc_18t_ls 2>&1 | tee -a ${SKY130A}_make.log
install:
if test "x${DIST_PATH}" == "x" ; then \
diff --git a/sky130/custom/sky130_fd_io/gds/sky130_ef_io__analog.gds b/sky130/custom/sky130_fd_io/gds/sky130_ef_io__analog.gds
new file mode 100644
index 0000000..1a0bfc8
--- /dev/null
+++ b/sky130/custom/sky130_fd_io/gds/sky130_ef_io__analog.gds
Binary files differ
diff --git a/sky130/custom/sky130_fd_io/lef/sky130_ef_io__analog_pad.lef b/sky130/custom/sky130_fd_io/lef/sky130_ef_io__analog_pad.lef
new file mode 100644
index 0000000..a7dd292
--- /dev/null
+++ b/sky130/custom/sky130_fd_io/lef/sky130_ef_io__analog_pad.lef
@@ -0,0 +1,345 @@
+VERSION 5.7 ;
+ NOWIREEXTENSIONATPIN ON ;
+ DIVIDERCHAR "/" ;
+ BUSBITCHARS "[]" ;
+MACRO sky130_fd_ef__analog_pad
+ CLASS BLOCK ;
+ FOREIGN sky130_ef_io__analog_pad ;
+ ORIGIN 0.000 0.000 ;
+ SIZE 75.000 BY 200.000 ;
+ PIN P_CORE
+ PORT
+ LAYER met3 ;
+ RECT 24.720 0.000 49.720 82.350 ;
+ END
+ END P_CORE
+ PIN VSSA
+ PORT
+ LAYER met4 ;
+ RECT 0.000 36.735 1.270 40.185 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 0.000 56.405 75.000 56.735 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 0.000 47.735 75.000 48.065 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 0.000 51.645 1.270 52.825 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 73.730 36.735 75.000 40.185 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 73.730 56.405 75.000 56.735 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 73.730 47.735 75.000 48.065 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 73.730 51.645 75.000 52.825 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 73.730 36.840 75.000 40.085 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 0.000 47.735 1.270 56.735 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 0.000 36.840 1.270 40.085 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 73.730 47.735 75.000 56.735 ;
+ END
+ END VSSA
+ PIN VSSD
+ PORT
+ LAYER met4 ;
+ RECT 0.000 41.585 1.270 46.235 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 73.730 41.585 75.000 46.235 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 0.000 41.685 1.270 46.135 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 73.730 41.685 75.000 46.135 ;
+ END
+ END VSSD
+ PIN AMUXBUS_B
+ PORT
+ LAYER met4 ;
+ RECT 0.000 48.365 75.000 51.345 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 73.730 48.365 75.000 51.345 ;
+ END
+ END AMUXBUS_B
+ PIN AMUXBUS_A
+ PORT
+ LAYER met4 ;
+ RECT 0.000 53.125 75.000 56.105 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 73.730 53.125 75.000 56.105 ;
+ END
+ END AMUXBUS_A
+ PIN VDDIO_Q
+ PORT
+ LAYER met4 ;
+ RECT 0.000 64.085 1.270 68.535 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 73.730 64.085 75.000 68.535 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 73.730 64.185 75.000 68.435 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 0.000 64.185 1.270 68.435 ;
+ END
+ END VDDIO_Q
+ PIN VDDIO
+ PORT
+ LAYER met4 ;
+ RECT 0.000 70.035 1.270 95.000 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 0.000 19.785 1.270 24.435 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 73.730 70.035 75.000 95.000 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 73.730 19.785 75.000 24.435 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 0.000 19.885 1.270 24.335 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 0.000 70.035 1.270 94.985 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 73.730 19.885 75.000 24.335 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 73.730 70.035 75.000 94.985 ;
+ END
+ END VDDIO
+ PIN VSWITCH
+ PORT
+ LAYER met4 ;
+ RECT 0.000 31.885 1.270 35.335 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 73.730 31.885 75.000 35.335 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 73.730 31.985 75.000 35.235 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 0.000 31.985 1.270 35.235 ;
+ END
+ END VSWITCH
+ PIN VSSIO
+ PORT
+ LAYER met4 ;
+ RECT 0.000 25.835 1.270 30.485 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 73.730 25.835 75.000 30.485 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 0.000 175.785 1.270 200.000 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 0.630 191.600 0.640 191.610 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 73.730 175.785 75.000 200.000 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 74.360 191.600 74.370 191.610 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 73.730 25.935 75.000 30.385 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 73.730 175.785 75.000 200.000 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 0.000 175.785 1.270 200.000 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 0.000 25.935 1.270 30.385 ;
+ END
+ END VSSIO
+ PIN VDDA
+ PORT
+ LAYER met4 ;
+ RECT 0.000 14.935 0.965 18.385 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 74.035 14.935 75.000 18.385 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 0.000 15.035 0.965 18.285 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 74.035 15.035 75.000 18.285 ;
+ END
+ END VDDA
+ PIN VCCD
+ PORT
+ LAYER met4 ;
+ RECT 0.000 8.885 1.270 13.535 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 73.730 8.885 75.000 13.535 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 0.000 8.985 1.270 13.435 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 73.730 8.985 75.000 13.435 ;
+ END
+ END VCCD
+ PIN VCCHIB
+ PORT
+ LAYER met4 ;
+ RECT 0.000 2.035 1.270 7.485 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 73.730 2.035 75.000 7.485 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 0.000 2.135 1.270 7.385 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 73.730 2.135 75.000 7.385 ;
+ END
+ END VCCHIB
+ PIN VSSIO_Q
+ PORT
+ LAYER met4 ;
+ RECT 0.000 58.235 1.270 62.685 ;
+ END
+ PORT
+ LAYER met4 ;
+ RECT 73.730 58.235 75.000 62.685 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 73.730 58.335 75.000 62.585 ;
+ END
+ PORT
+ LAYER met5 ;
+ RECT 0.000 58.335 1.270 62.585 ;
+ END
+ END VSSIO_Q
+ PIN P_PAD
+ PORT
+ LAYER met5 ;
+ RECT 7.050 105.120 67.890 165.945 ;
+ END
+ END P_PAD
+ OBS
+ LAYER li1 ;
+ RECT 2.905 48.265 72.045 181.100 ;
+ LAYER met1 ;
+ RECT 4.250 46.255 70.440 48.855 ;
+ LAYER met2 ;
+ RECT 4.250 46.255 70.440 48.855 ;
+ LAYER met3 ;
+ RECT 0.455 82.750 74.250 173.315 ;
+ RECT 0.455 14.905 24.320 82.750 ;
+ RECT 50.120 14.905 74.250 82.750 ;
+ LAYER met4 ;
+ RECT 1.670 175.385 73.330 200.000 ;
+ RECT 0.965 95.400 74.035 175.385 ;
+ RECT 1.670 69.635 73.330 95.400 ;
+ RECT 0.965 68.935 74.035 69.635 ;
+ RECT 1.670 63.685 73.330 68.935 ;
+ RECT 0.965 63.085 74.035 63.685 ;
+ RECT 1.670 57.835 73.330 63.085 ;
+ RECT 0.965 57.135 74.035 57.835 ;
+ RECT 1.670 51.745 73.330 52.725 ;
+ RECT 0.965 46.635 74.035 47.335 ;
+ RECT 1.670 41.185 73.330 46.635 ;
+ RECT 0.965 40.585 74.035 41.185 ;
+ RECT 1.670 36.335 73.330 40.585 ;
+ RECT 0.965 35.735 74.035 36.335 ;
+ RECT 1.670 31.485 73.330 35.735 ;
+ RECT 0.965 30.885 74.035 31.485 ;
+ RECT 1.670 25.435 73.330 30.885 ;
+ RECT 0.965 24.835 74.035 25.435 ;
+ RECT 1.670 19.385 73.330 24.835 ;
+ RECT 0.965 18.785 74.035 19.385 ;
+ RECT 1.365 14.535 73.635 18.785 ;
+ RECT 0.965 13.935 74.035 14.535 ;
+ RECT 1.670 8.485 73.330 13.935 ;
+ RECT 0.965 7.885 74.035 8.485 ;
+ RECT 1.670 2.035 73.330 7.885 ;
+ LAYER met5 ;
+ RECT 2.870 174.185 72.130 200.000 ;
+ RECT 0.000 167.545 75.000 174.185 ;
+ RECT 0.000 103.520 5.450 167.545 ;
+ RECT 69.490 103.520 75.000 167.545 ;
+ RECT 0.000 96.585 75.000 103.520 ;
+ RECT 2.870 36.840 72.130 96.585 ;
+ RECT 0.000 36.835 75.000 36.840 ;
+ RECT 2.870 18.285 72.130 36.835 ;
+ RECT 2.565 15.035 72.435 18.285 ;
+ RECT 2.870 2.135 72.130 15.035 ;
+ END
+END sky130_fd_io__analog_pad
+END LIBRARY
+
diff --git a/sky130/custom/sky130_fd_io/spice/sky130_ef_io__analog_pad.spice b/sky130/custom/sky130_fd_io/spice/sky130_ef_io__analog_pad.spice
new file mode 100644
index 0000000..ee7b06b
--- /dev/null
+++ b/sky130/custom/sky130_fd_io/spice/sky130_ef_io__analog_pad.spice
@@ -0,0 +1,40 @@
+* NGSPICE file created from sky130_ef_io__analog_pad.ext - technology: sky130A
+
+.subckt sky130_fd_io__pad_esd VSUBS m4_960_20297# m5_1354_20528#
+R0 m4_960_20297# m5_1354_20528# sky130_fd_pr__res_generic_m5 w=2.5284e+08u l=100000u
+.ends
+
+.subckt sky130_fd_io__com_busses_esd VSUBS sky130_fd_io__com_bus_hookup_0/VCCD sky130_fd_io__com_bus_hookup_0/VSWITCH
++ sky130_fd_io__com_bus_hookup_0/AMUXBUS_A sky130_fd_io__com_bus_hookup_0/VSSIO sky130_fd_io__com_bus_hookup_0/AMUXBUS_B
++ sky130_fd_io__com_bus_hookup_0/VDDA sky130_fd_io__com_bus_hookup_0/VDDIO sky130_fd_io__com_bus_hookup_0/VSSIO_Q
++ sky130_fd_io__pad_esd_0/m5_1354_20528# sky130_fd_io__pad_esd_0/m4_960_20297# sky130_fd_io__com_bus_hookup_0/VDDIO_Q
++ sky130_fd_io__com_bus_hookup_0/VSSA sky130_fd_io__com_bus_hookup_0/VSSD sky130_fd_io__com_bus_hookup_0/VCCHIB
+Xsky130_fd_io__pad_esd_0 VSUBS sky130_fd_io__pad_esd_0/m4_960_20297# sky130_fd_io__pad_esd_0/m5_1354_20528#
++ sky130_fd_io__pad_esd
+.ends
+
+.subckt sky130_fd_io__simple_pad_and_busses VSUBS sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VSWITCH
++ sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VDDA sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VSSIO
++ sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VCCHIB sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VDDIO
++ m3_99_16575# sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VSSIO_Q
++ sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/AMUXBUS_A sky130_fd_io__com_busses_esd_0/sky130_fd_io__pad_esd_0/m5_1354_20528#
++ sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/AMUXBUS_B sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VSSA
++ sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VDDIO_Q sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VSSD
++ w_818_9944# sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VCCD
+Xsky130_fd_io__com_busses_esd_0 VSUBS sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VCCD
++ sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VSWITCH sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/AMUXBUS_A
++ sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VSSIO sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/AMUXBUS_B
++ sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VDDA sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VDDIO
++ sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VSSIO_Q sky130_fd_io__com_busses_esd_0/sky130_fd_io__pad_esd_0/m5_1354_20528#
++ m3_99_16575# sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VDDIO_Q
++ sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VSSA sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VSSD
++ sky130_fd_io__com_busses_esd_0/sky130_fd_io__com_bus_hookup_0/VCCHIB sky130_fd_io__com_busses_esd
+.ends
+
+.subckt sky130_ef_io__analog_pad P_CORE VSSA VSSD AMUXBUS_B AMUXBUS_A VDDIO_Q VDDIO
++ VSWITCH VSSIO VDDA VCCD VCCHIB VSSIO_Q P_PAD
+Xsky130_fd_io__simple_pad_and_busses_0 sky130_fd_io__simple_pad_and_busses_0/VSUBS
++ VSWITCH VDDA VSSIO VCCHIB VDDIO P_CORE VSSIO_Q AMUXBUS_A P_PAD AMUXBUS_B VSSA VDDIO_Q
++ VSSD sky130_fd_io__simple_pad_and_busses_0/VSUBS VCCD sky130_fd_io__simple_pad_and_busses
+.ends
+
diff --git a/sky130/custom/sky130_fd_io/verilog/sky130_ef_io__analog_pad.v b/sky130/custom/sky130_fd_io/verilog/sky130_ef_io__analog_pad.v
new file mode 100644
index 0000000..f172cd5
--- /dev/null
+++ b/sky130/custom/sky130_fd_io/verilog/sky130_ef_io__analog_pad.v
@@ -0,0 +1,210 @@
+/**
+ * Copyright 2020 The 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+`ifndef SKY130_EF_IO__ANALOG_PAD_V
+`define SKY130_EF_IO__ANALOG_PAD_V
+
+/**
+ * analog_pad: Analog PAD.
+ *
+ * Verilog top module.
+ *
+ * WARNING: This file is autogenerated, do not modify directly!
+ */
+
+`timescale 1ns / 1ps
+`default_nettype none
+
+`ifdef USE_POWER_PINS
+
+`ifdef FUNCTIONAL
+
+/*
+ * Copyright 2020 The 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+*/
+
+module sky130_ef_io__analog_pad (AMUXBUS_A, AMUXBUS_B, P_PAD, P_CORE
+ ,VCCD, VCCHIB, VDDA, VDDIO, VDDIO_Q, VSSA, VSSD, VSSIO, VSSIO_Q, VSWITCH
+ );
+inout AMUXBUS_A;
+inout AMUXBUS_B;
+inout P_PAD;
+inout P_CORE;
+inout VCCD;
+inout VCCHIB;
+inout VDDA;
+inout VDDIO;
+inout VDDIO_Q;
+inout VSSA;
+inout VSSD;
+inout VSSIO;
+inout VSSIO_Q;
+inout VSWITCH;
+wire pwr_good = VDDIO===1 && VSSIO===0;
+wire pad_sw = pwr_good===1 ? 1'b1 : 1'bx;
+tranif1 x_pad (P_PAD, P_CORE, pad_sw);
+endmodule
+
+`else // FUNCTIONAL
+
+/*
+ * Copyright 2020 The 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+*/
+
+module sky130_ef_io__analog_pad (AMUXBUS_A, AMUXBUS_B, P_PAD, P_CORE
+ ,VCCD, VCCHIB, VDDA, VDDIO, VDDIO_Q, VSSA, VSSD, VSSIO, VSSIO_Q, VSWITCH
+ );
+inout AMUXBUS_A;
+inout AMUXBUS_B;
+inout P_PAD;
+inout P_CORE;
+inout VCCD;
+inout VCCHIB;
+inout VDDA;
+inout VDDIO;
+inout VDDIO_Q;
+inout VSSA;
+inout VSSD;
+inout VSSIO;
+inout VSSIO_Q;
+inout VSWITCH;
+wire pwr_good = VDDIO===1 && VSSIO===0;
+wire pad_sw = pwr_good===1 ? 1'b1 : 1'bx;
+tranif1 x_pad (P_PAD, P_CORE, pad_sw);
+endmodule
+
+`endif // FUNCTIONAL
+
+`else // USE_POWER_PINS
+
+`ifdef FUNCTIONAL
+
+/*
+ * Copyright 2020 The 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+*/
+
+module sky130_ef_io__analog_pad (AMUXBUS_A, AMUXBUS_B, P_PAD, P_CORE
+ );
+inout AMUXBUS_A;
+inout AMUXBUS_B;
+inout P_PAD;
+inout P_CORE;
+supply1 VCCD;
+supply1 VCCHIB;
+supply1 VDDA;
+supply1 VDDIO;
+supply1 VDDIO_Q;
+supply0 VSSA;
+supply0 VSSD;
+supply0 VSSIO;
+supply0 VSSIO_Q;
+supply1 VSWITCH;
+wire pwr_good = 1;
+wire pad_sw = pwr_good===1 ? 1'b1 : 1'bx;
+tranif1 x_pad (P_PAD, P_CORE, pad_sw);
+endmodule
+
+`else // FUNCTIONAL
+
+/*
+ * Copyright 2020 The 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+*/
+
+module sky130_ef_io__analog_pad (AMUXBUS_A, AMUXBUS_B, P_PAD, P_CORE
+ );
+inout AMUXBUS_A;
+inout AMUXBUS_B;
+inout P_PAD;
+inout P_CORE;
+supply1 VCCD;
+supply1 VCCHIB;
+supply1 VDDA;
+supply1 VDDIO;
+supply1 VDDIO_Q;
+supply0 VSSA;
+supply0 VSSD;
+supply0 VSSIO;
+supply0 VSSIO_Q;
+supply1 VSWITCH;
+wire pwr_good = 1;
+wire pad_sw = pwr_good===1 ? 1'b1 : 1'bx;
+tranif1 x_pad (P_PAD, P_CORE, pad_sw);
+endmodule
+
+`endif // FUNCTIONAL
+
+`endif // USE_POWER_PINS
+
+`default_nettype wire
+`endif // SKY130_EF_IO__ANALOG_PAD_V