Added preliminary (and unfinished) xcircuit integration.
diff --git a/VERSION b/VERSION
index d10644b..cfc7214 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.0.122
+1.0.123
diff --git a/sky130/Makefile.in b/sky130/Makefile.in
index f9685d5..01aa7dd 100644
--- a/sky130/Makefile.in
+++ b/sky130/Makefile.in
@@ -218,6 +218,7 @@
 KLAYOUTTOP = libs.tech/klayout
 OPENLANETOP = libs.tech/openlane
 XSCHEMTOP = libs.tech/xschem
+XCIRCUITTOP = libs.tech/xcircuit
 
 ifeq (${EF_STYLE}, 1)
     MAGICPATH = ${MAGICTOP}/${REVISION}
@@ -232,6 +233,7 @@
 KLAYOUTPATH = ${KLAYOUTTOP}
 OPENLANEPATH = ${OPENLANETOP}
 XSCHEMPATH = ${XSCHEMTOP}
+XCIRCUITPATH = ${XCIRCUITTOP}
 
 MAGICTOP_STAGING_A = ${STAGING_PATH}/${SKY130A}/${MAGICTOP}
 NETGENTOP_STAGING_A = ${STAGING_PATH}/${SKY130A}/${NETGENTOP}
@@ -240,6 +242,7 @@
 KLAYOUTTOP_STAGING_A = ${STAGING_PATH}/${SKY130A}/${KLAYOUTTOP}
 OPENLANETOP_STAGING_A = ${STAGING_PATH}/${SKY130A}/${OPENLANETOP}
 XSCHEMTOP_STAGING_A = ${STAGING_PATH}/${SKY130A}/${XSCHEMTOP}
+XCIRCUITTOP_STAGING_A = ${STAGING_PATH}/${SKY130A}/${XCIRCUITTOP}
 
 MAGIC_STAGING_A = ${STAGING_PATH}/${SKY130A}/${MAGICPATH}
 NETGEN_STAGING_A = ${STAGING_PATH}/${SKY130A}/${NETGENPATH}
@@ -248,6 +251,7 @@
 KLAYOUT_STAGING_A = ${STAGING_PATH}/${SKY130A}/${KLAYOUTPATH}
 OPENLANE_STAGING_A = ${STAGING_PATH}/${SKY130A}/${OPENLANEPATH}
 XSCHEM_STAGING_A = ${STAGING_PATH}/${SKY130A}/${XSCHEMPATH}
+XCIRCUIT_STAGING_A = ${STAGING_PATH}/${SKY130A}/${XCIRCUITPATH}
 
 SKY130A_DEFS += -DMAGIC_CURRENT=${MAGICTOP}/current
 
@@ -314,6 +318,12 @@
         TOOLS += xschem
 endif
 
+# XCIRCUIT_DISABLED = 0 | 1
+XCIRCUIT_DISABLED = @XCIRCUIT_DISABLED@
+ifneq (${XCIRCUIT_DISABLED}, 1)
+        TOOLS += xcircuit
+endif
+
 all: all-a
 
 # Handle prerequisites (fetch and install the PDK and requested libraries)
@@ -452,6 +462,18 @@
 	cp klayout/${TECH}.lydrc ${KLAYOUT_STAGING_A}/${SKY130A}.lydrc
 	./custom/scripts/gen_run_drc.py -l ${KLAYOUT_STAGING_A}/${SKY130A}.lydrc -o ${KLAYOUT_STAGING_A}/${SKY130A}.drc
 
+xcircuit-a: xcircuit/${TECH}.xcircuitrc
+	rm -rf ${XCIRCUIT_STAGING_A}
+	mkdir -p ${XCIRCUITTOP_STAGING_A}
+	mkdir -p ${XCIRCUIT_STAGING_A}
+	rm -f ${XCIRCUIT_STAGING_A}/*.lps
+	rm -f ${XCIRCUIT_STAGING_A}/${SKY130A}.xcircuitrc
+	${CPP} xcircuit/sky130_fd_pr.lps > ${XCIRCUIT_STAGING_A}/sky130_fd_pr.lps
+	${CPP} xcircuit/sky130_fd_sc_hd.lps > ${XCIRCUIT_STAGING_A}/sky130_fd_sc_hd.lps
+	${CPP} xcircuit/ngspice.lps > ${XCIRCUIT_STAGING_A}/ngspice.lps
+	cp xcircuit/${TECH}_*.lps ${XCIRCUIT_STAGING_A}/
+	${CPP} ${SKY130A_DEFS} xcircuit/${TECH}.xcircuitrc > ${XCIRCUIT_STAGING_A}/${SKY130A}.xcircuitrc
+
 xschem-a: ${XSCHEM_PATH}
 	rm -rf ${XSCHEM_STAGING_A}
 	mkdir -p ${XSCHEMTOP_STAGING_A}
diff --git a/sky130/xcircuit/ngspice.lps b/sky130/xcircuit/ngspice.lps
new file mode 100644
index 0000000..ff58f6b
--- /dev/null
+++ b/sky130/xcircuit/ngspice.lps
@@ -0,0 +1,227 @@
+%! PostScript set of library objects for XCircuit
+%  Version: 3.9
+%  Library name is: ngspice
+%  Author:  <tim@stravinsky>
+%
+
+% Depend ngspice::Vsource analog::source
+% Depend ngspice::ACsource analog::source generic::sinusoid
+% Depend ngspice::Vpwl analog::source
+% Depend ngspice::Switch generic::circle generic::arrowhead
+% Depend ngspice::Vpulse analog::source
+
+% XCircuitLib library objects
+/generic::arrowhead {
+% nonetwork
+begingate
+8 -28 beginpath
+3 -18 3 -15 0 0 curveto
+-3 -15 -3 -18 -8 -28 curveto
+-2 -26 2 -26 8 -28 curveto
+249 
+1.000 endpath
+endgate
+} def
+
+/analog::source {
+% hidden
+begingate
+1 1.000 0 0 32 0.000 360.000 xcarc
+1 1.000 0 32 0 64 2 polygon
+1 1.000 0 -32 0 -64 2 polygon
+endgate
+} def
+
+/ngspice::Vsource {
+<</p_yps 16 /p_xps 48 /p_rot 0 /@class (V) /@index (?) /@value (5) /p_jst 20 >> begingate
+1.000 360.000 0 0 analog::source
+(+) {/Symbol cf} 2 5 p_rot 1.000 0 14 label
+(-) {/Symbol cf} 2 5 p_rot 1.000 0 -22 label
+1.000 0.000 0.000 scb
+(v.p) {/Times-Roman cf} 2 9 0.000 1.000 0 64 pinlabel
+(v.m) {/Times-Roman cf} 2 13 0.000 1.000 0 -64 pinlabel
+0.180 0.545 0.341 scb
+mark @value ( %pv.p %pv.m ) @index @class (spice:) {/Times-Roman cf} ctmk 20 
+360.000 1.000 -96 -160 infolabel
+0.647 0.165 0.165 scb
+mark (V) {hS} @value {/Times-Roman cf} ctmk p_jst p_rot 0.700 48 -16 label
+0.000 0.000 1.000 scb
+mark @index @class {/Times-Roman cf} ctmk 20 p_rot 0.700 p_xps p_yps label
+endgate
+} def
+
+1.000 270.000 <</p_xps -48 /p_yps -16 /p_rot 270 >> /ngspice::Vsource libinst
+
+/generic::sinusoid {
+% hidden
+begingate
+1 0.800 0 -48 0 48 -16 0 16 0 spline
+endgate
+} def
+
+/ngspice::ACsource {
+<</p_yps1 -24 /p_xps1 48 /p_yps 32 /p_xps 48 /p_rot 0 /@index (?) /@value (5) /@offset 
+(0) /@freq (1) /@units (k) /p_jst 20 >> begingate
+1.000 0.000 0 0 analog::source
+1.000 0.000 0.000 scb
+(s.p) {/Times-Roman cf} 2 9 0.000 1.000 0 64 pinlabel
+(s.m) {/Times-Roman cf} 2 13 0.000 1.000 0 -64 pinlabel
+0.180 0.545 0.341 scb
+mark (\)) @units @freq ( ) @value ( ) @offset ( %ps.p %ps.m SIN\() @index 
+(spice:V) {/Times-Roman cf} ctmk 20 0.000 1.000 -336 -160 infolabel
+0.647 0.165 0.165 scb
+mark (Hz) @units {hS} @freq {CR} (offset) {ss} (V) {hS} @offset {CR} (p-p) {ss} 
+(V) {hS} @value {/Times-Roman cf} ctmk p_jst p_rot 0.750 p_xps1 p_yps1 label
+sce
+1.000 p_rot 0 0 generic::sinusoid
+0.000 0.000 1.000 scb
+mark @index (V) {/Times-RomanISO cf} ctmk 16 p_rot 0.700 p_xps p_yps label
+endgate
+} def
+
+1.000 90.000 <</p_xps -48 /p_yps -16 /p_xps1 80 /p_yps1 -40 /p_rot 270 >> /ngspice::ACsource libinst
+
+/ngspice::Vpwl {
+<</p_yps1 -16 /p_xps1 48 /@pwl (0 0 1u 5 2u 5 3u 0) /p_jst 20 /@index (?) /@class 
+(V) /p_rot 0 /p_xps 48 /p_yps 16 >> begingate
+1.000 360.000 0 0 analog::source
+(+) {/Symbol cf} 2 5 p_rot 1.000 0 14 label
+(-) {/Symbol cf} 2 5 p_rot 1.000 0 -22 label
+1.000 0.000 0.000 scb
+(1) {/Times-Roman cf} 2 9 0.000 1.000 0 64 pinlabel
+(2) {/Times-Roman cf} 2 13 0.000 1.000 0 -64 pinlabel
+0.000 0.000 1.000 scb
+mark @index @class {/Times-Roman cf} ctmk p_jst p_rot 0.700 p_xps p_yps label
+0.180 0.545 0.341 scb
+mark (\)) @pwl ( %p1 %p2 PWL\() @index @class (spice:) {/Times-Roman cf} ctmk 
+16 0.000 1.000 -304 -176 infolabel
+0.647 0.165 0.165 scb
+mark @pwl {/Times-Roman cf} ctmk p_jst p_rot 0.700 p_xps1 p_yps1 label
+endgate
+} def
+
+1.000 270.000 <</p_yps1 -112 /p_rot 270 /p_xps -56 /p_yps -16 /p_xps1 56 >> /ngspice::Vpwl libinst
+
+/nsgpice::Capacitor {
+<</p_yps1 16 /p_xps1 48 /p_yps -16 /p_xps 48 /@class (C) /@value (1.0) /@units 
+(p) /@index (?) /p_jst 20 /p_rot 0 >> begingate
+1 1.000 0 -64 0 -6 2 polygon
+1 1.000 0 64 0 6 2 polygon
+1 1.000 -32 6 32 6 2 polygon
+1.000 0.000 0.000 scb
+(1) {/Times-Roman cf} 2 9 0.000 1.000 0 64 pinlabel
+(2) {/Times-Roman cf} 2 13 0.000 1.000 0 -64 pinlabel
+0.180 0.545 0.341 scb
+mark @units @value ( %p1 %p2 ) @index @class (spice:) {/Times-Roman cf} ctmk 4 
+0.000 1.000 -208 -160 infolabel
+(sim:e %p1 %p2) {/Times-Roman cf} 2 4 0.000 1.000 -208 -208 infolabel
+0.647 0.165 0.165 scb
+mark (F) @units {hS} @value {/Times-Roman cf} ctmk p_jst p_rot 0.700 p_xps 
+p_yps label
+0.180 0.545 0.341 scb
+mark @index @class (pcb:) {/Times-Roman cf} ctmk 20 0.000 1.000 -208 -256 
+infolabel
+0.000 0.000 1.000 scb
+mark @index @class {/Times-Roman cf} ctmk 20 p_rot 0.700 p_xps1 p_yps1 label
+sce
+1 1.000 -32 -6 32 -6 2 polygon
+endgate
+} def
+
+1.000 90.000 <</p_xps 56 /p_yps1 -16 /p_xps1 -56 /p_yps -32 /p_rot 270 >> /ngspice::Capacitor libinst
+
+/ngspice::Resistor {
+<</@class (R) /@value (1.0) /@units (k) /@index (?) /p_jst 20 /p_rot 0 /p_xps 
+32 /p_yps -16 /p_xps1 32 /p_yps1 16 >> begingate
+1 1.000 0 64 0 36 2 polygon
+1 1.000 0 -64 0 -36 2 polygon
+1 1.000 0 -36 14 -30 -14 -18 14 -6 -14 6 14 18 -14 30 0 36 8 polygon
+1.000 0.000 0.000 scb
+(1) {/Times-Roman cf} 2 9 0.000 1.000 0 64 pinlabel
+(2) {/Times-Roman cf} 2 13 0.000 1.000 0 -64 pinlabel
+0.180 0.545 0.341 scb
+mark @units @value ( %p1 %p2 ) @index @class (spice:) {/Times-Roman cf} ctmk 4 
+0.000 1.000 -208 -160 infolabel
+mark @index @class (pcb:) {/Times-Roman cf} ctmk 20 0.000 1.000 -208 -256 
+infolabel
+(sim:r %p1 %p2) {/Times-Roman cf} 2 4 0.000 1.000 -208 -208 infolabel
+0.647 0.165 0.165 scb
+mark (W) {/Symbol cf} @units {hS} @value {/Times-Roman cf} ctmk p_jst p_rot 
+0.700 p_xps p_yps label
+0.000 0.000 1.000 scb
+mark @index @class {/Times-Roman cf} ctmk p_jst p_rot 0.700 p_xps1 p_yps1 label
+endgate
+} def
+
+1.000 90.000 <</p_yps1 -16 /p_xps1 -32 /p_yps -32 /p_rot 270 >> /ngspice::Resistor libinst
+
+/generic::circle {
+% trivial
+begingate
+1 1.000 16 0 6 0.000 360.000 xcarc
+1 1.000 0 0 10 0 2 polygon
+1.000 0.000 0.000 scb
+(out) {/Times-Roman cf} 2 4 -0.000 1.000 16 0 pinlabel
+(out) {/Times-Roman cf} 2 7 -0.000 1.000 0 0 pinlabel
+endgate
+} def
+
+/ngspice::Switch {
+<</@model (switch) /@class (S) /@index (?) >> begingate
+1 1.300 32 32 2 -43 2 polygon
+1 0.600 8 -24 57 49.000 90.000 xcarc
+-1.000 /sv 90.000 0 -64 generic::circle
+1.000 90.000 0 48 generic::circle
+1.000 0.000 0.000 scb
+(1) {/Times-Roman cf} 2 9 0.000 1.000 0 48 pinlabel
+(2) {/Times-Roman cf} 2 13 0.000 1.000 0 -64 pinlabel
+sce
+1 1.000 32 -16 96 -16 2 polygon
+-1.000 /sv 270.000 16 -16 generic::arrowhead
+1.000 0.000 0.000 scb
+(3) {/Times-Roman cf} 2 20 0.000 1.000 96 -16 pinlabel
+(4) {/Times-Roman cf} 2 20 0.000 1.000 96 -48 pinlabel
+0.180 0.545 0.341 scb
+mark @model ( %p1 %p2 %p3 %p4 ) @index @class (spice1:) {/Times-Roman cf} ctmk 
+16 0.000 0.700 -128 -192 infolabel
+sce
+(+) {/Symbol cf} 2 17 0.000 0.700 96 -8 label
+(-) {/Symbol cf} 2 17 0.000 0.700 96 -40 label
+1 1.000 96 -48 72 -48 72 -64 3 polygon
+1 1.000 54 -64 90 -64 2 polygon
+1 1.000 62 -72 82 -72 2 polygon
+1 1.000 70 -80 74 -80 2 polygon
+0.180 0.545 0.341 scb
+mark ( sw) @model (spice@1:.model ) {/Times-Roman cf} ctmk 16 0.000 0.700 -128 
+-160 infolabel
+endgate
+} def
+
+/ngspice::Vpulse {
+<</@period (10.0u) /@pwidth (1.0u) /@t_fall (1.0u) /@t_rise (1.0u) /@t_delay 
+(0.0) /@vpulse (3.3) /@vinit (0.0) /p_jst 20 /@index (?) /@class (V) /p_rot 0 /p_xps 
+48 /p_yps 16 >> begingate
+1.000 360.000 0 0 analog::source
+1.000 0.000 0.000 scb
+(v.p) {/Times-Roman cf} 2 9 0.000 1.000 0 64 pinlabel
+(v.m) {/Times-Roman cf} 2 13 0.000 1.000 0 -64 pinlabel
+0.180 0.545 0.341 scb
+mark (\)) @period ( ) @pwidth ( ) @t_fall ( ) @t_rise ( ) @t_delay ( ) @vpulse 
+( ) @vinit ( PULSE\() @vpulse ( %pv.p %pv.m DC=) @index @class (spice:) 
+{/Times-Roman cf} ctmk 20 360.000 1.000 -96 -160 infolabel
+0.647 0.165 0.165 scb
+mark (V) {hS} @vpulse (\261) @vinit {/Times-Roman cf} ctmk p_jst p_rot 0.700 48 
+-16 label
+0.000 0.000 1.000 scb
+mark @index @class {/Times-Roman cf} ctmk 20 p_rot 0.700 p_xps p_yps label
+sce
+1 1.000 -24 -12 -16 -12 -16 12 -8 12 -8 -12 0 -12 0 12 8 12 8 -12 16 -12 16 12 
+24 12 12 polygon
+mark (s) @period (T=) {0.647 0.165 0.165 scb} {/Times-Roman cf} ctmk 16 0.000 
+0.700 48 -52 label
+(+) {/Times-Roman cf} 2 21 0.000 0.600 0 22 label
+endgate
+} def
+
+
+% EndLib
diff --git a/sky130/xcircuit/sky130.xcircuitrc b/sky130/xcircuit/sky130.xcircuitrc
new file mode 100644
index 0000000..5cd2f80
--- /dev/null
+++ b/sky130/xcircuit/sky130.xcircuitrc
@@ -0,0 +1,8 @@
+set XCOps(liboverride) 1
+config search libraries .:STAGING_PATH/TECHNAME/libs.tech/xcircuit:$XCIRCUIT_LIB_DIR
+library make Generic
+library 1 load generic.lps
+library make TECHNAME_analog
+library 2 load sky130_fd_pr
+library make TECHNAME_digital
+library 3 load sky130_fd_sc_hd
diff --git a/sky130/xcircuit/sky130_fd_pr.lps b/sky130/xcircuit/sky130_fd_pr.lps
new file mode 100644
index 0000000..7881478
--- /dev/null
+++ b/sky130/xcircuit/sky130_fd_pr.lps
@@ -0,0 +1,289 @@
+%! PostScript set of library objects for XCircuit
+%  Version: 3.9
+%  Library name is: sky130_fd_pr
+%  Author:  <tim@stravinsky>
+%
+
+% Depend sky130_fd_pr::NPNModel generic::arrowhead
+% Depend ngspice::Vsource analog::source
+% Depend ngspice::ACsource analog::source generic::sinusoid
+% Depend ngspice::Vpwl analog::source
+% Depend ngspice::Switch generic::circle generic::arrowhead
+% Depend ngspice::Vpulse analog::source
+
+% XCircuitLib library objects
+/sky130_fd_pr::pMOS {
+<</@subs (avdd) /p_yps2 48 /p_xps2 16 /p_yps1 -8 /p_xps1 16 /p_yps 16 /p_xps 16 /p_rot 
+0 /@fingers (1) /@class (M) /@width (1u) /@length (0.18u) /@model (pfet) /@index 
+(?) /p_jst 28 >> begingate
+1 1.000 -44 -28 -44 28 2 polygon
+1 1.000 -60 0 -64 0 2 polygon
+1 1.000 0 -64 0 -28 -32 -28 -32 28 0 28 0 64 6 polygon
+1 1.000 -52 0 8 0.000 360.000 xcarc
+1.000 0.000 0.000 scb
+(S) {/Times-Roman cf} 2 9 0.000 1.000 0 64 pinlabel
+(D) {/Times-Roman cf} 2 13 0.000 1.000 0 -64 pinlabel
+(G) {/Times-Roman cf} 2 7 0.000 1.000 -64 0 pinlabel
+0.180 0.545 0.341 scb
+mark @fingers ( M=) @length ( L=) @width ( W=) @model ( ) @subs ( %pD %pG %pS ) 
+@index @class (spice:) {/Times-Roman cf} ctmk 4 0.000 1.000 -196 -139 infolabel
+mark ( %x %y) @width ( ) @length (sim:p %pG %pD %pS ) {/Times-Roman cf} ctmk 4 
+0.000 1.000 -196 -187 infolabel
+0.647 0.165 0.165 scb
+mark @fingers {hS} (=) {hS} (M) {CR} @length (=) {Tf} (L) {hS} {CR} @width (=) 
+{Ts} (W) {/Times-Roman cf} ctmk p_jst p_rot 0.700 p_xps1 p_yps1 label
+0.000 0.000 1.000 scb
+mark @index @class {/Times-Roman cf} ctmk 16 p_rot 0.700 p_xps2 p_yps2 label
+sce
+mark @model {/Times-RomanISO cf} ctmk 16 p_rot 0.700 p_xps p_yps label
+endgate
+} def
+
+1.000 90.000 <</p_yps -32 /p_xps1 32 /p_yps1 -40 /p_rot 270 /p_xps2 -32 >> /sky130_fd_pr::pMOS libinst
+<</@model (hvpfet) /@length (0.36u) /@subs (dvdd3) >> /sky130_fd_pr::pMOS libinst
+1.000 90.000 <</p_yps -32 /p_xps1 32 /p_yps1 -40 /p_rot 270 /p_xps2 -32 /@model (hvpfet) 
+/@length (0.36u) /@subs (dvdd3) >> /sky130_fd_pr::pMOS libinst
+
+/sky130_fd_pr::pMOS1finger {
+<</p_yps2 -16 /p_xps2 16 /p_yps1 8 /p_xps1 16 /p_yps 40 /p_xps 16 /p_rot 0 /@subs 
+(avdd) /@class (M) /@width (1u) /@length (0.18u) /@model (pfet) /@index 
+(?) /p_jst 28 >> begingate
+1 1.000 -44 -28 -44 28 2 polygon
+1 1.000 -60 0 -64 0 2 polygon
+1 1.000 0 -64 0 -28 -32 -28 -32 28 0 28 0 64 6 polygon
+1 1.000 -52 0 8 0.000 360.000 xcarc
+1.000 0.000 0.000 scb
+(S) {/Times-Roman cf} 2 9 0.000 1.000 0 64 pinlabel
+(D) {/Times-Roman cf} 2 13 0.000 1.000 0 -64 pinlabel
+(G) {/Times-Roman cf} 2 7 0.000 1.000 -64 0 pinlabel
+0.180 0.545 0.341 scb
+mark @length ( L=) @width ( W=) @model ( ) @subs ( %pD %pG %pS ) @index @class 
+(spice:) {/Times-Roman cf} ctmk 4 0.000 1.000 -196 -139 infolabel
+mark ( %x %y) @width ( ) @length (sim:p %pG %pD %pS ) {/Times-Roman cf} ctmk 4 
+0.000 1.000 -196 -187 infolabel
+0.647 0.165 0.165 scb
+mark @length (=) {Tf} (L) {hS} {CR} @width (=) {Ts} (W) {/Times-Roman cf} ctmk 
+p_jst p_rot 0.700 p_xps2 p_yps2 label
+0.000 0.000 1.000 scb
+mark @index @class {/Times-Roman cf} ctmk 16 p_rot 0.700 p_xps p_yps label
+sce
+mark @model {/Times-RomanISO cf} ctmk 16 p_rot 0.700 p_xps1 p_yps1 label
+endgate
+} def
+
+1.000 90.000 <</p_yps2 -32 /p_yps1 -24 /p_xps2 32 /p_rot 270 /p_xps -16 >> /sky130_fd_pr::pMOS1finger libinst
+<</@model (hvpfet) /@length (0.36u) /@subs (dvdd3) >> /sky130_fd_pr::pMOS1finger libinst
+1.000 90.000 <</p_yps2 -32 /p_yps1 -24 /p_xps2 32 /p_rot 270 /p_xps -16 /@model (hvpfet) 
+/@length (0.36u) /@subs (dvdd3) >> /sky130_fd_pr::pMOS1finger libinst
+
+/sky130_fd_pr::nMOS {
+<</@subs (agnd) /p_yps2 -16 /p_xps2 16 /p_yps1 8 /p_xps1 16 /p_yps 40 /p_xps 16 /p_rot 
+0 /@fingers (1) /@class (M) /@width (1u) /@length (0.18u) /@model (nfet) /@index 
+(?) /p_jst 28 >> begingate
+1 1.000 0 -64 0 -28 -32 -28 -32 28 0 28 0 64 6 polygon
+1 1.000 -44 -28 -44 28 2 polygon
+1 1.000 -44 0 -64 0 2 polygon
+1.000 0.000 0.000 scb
+(G) {/Times-Roman cf} 2 7 0.000 1.000 -64 0 pinlabel
+(S) {/Times-Roman cf} 2 13 0.000 1.000 0 -64 pinlabel
+(D) {/Times-Roman cf} 2 9 0.000 1.000 0 64 pinlabel
+0.180 0.545 0.341 scb
+mark @fingers ( m=) @length ( l=) @width ( w=) @model ( ) @subs ( %pD %pG %pS ) 
+@index @class (spice:) {/Times-Roman cf} ctmk 4 0.000 1.000 -244 -139 infolabel
+mark ( %x %y) @width ( ) @length (sim:n %pG %pD %pS ) {/Times-Roman cf} ctmk 4 
+0.000 1.000 -244 -187 infolabel
+0.647 0.165 0.165 scb
+mark @fingers (=) {Tf} {Tf} (M) {CR} @length (=) {Tf} (L) {hS} {CR} @width (=) 
+{Ts} (W) {/Times-Roman cf} ctmk p_jst p_rot 0.700 p_xps2 p_yps2 label
+0.000 0.000 1.000 scb
+mark @index @class {/Times-Roman cf} ctmk 20 p_rot 0.700 p_xps p_yps label
+sce
+mark @model {/Times-RomanISO cf} ctmk 20 p_rot 0.700 p_xps1 p_yps1 label
+endgate
+} def
+
+1.000 90.000 <</p_yps1 -24 /p_xps2 32 /p_yps2 -32 /p_rot 270 /p_xps -32 >> /sky130_fd_pr::nMOS libinst
+<</p_jst 28 /p_xps2 16 /p_yps2 -16 /@model (hvnfet) /@length (0.36u) /@subs 
+(dgnd) >> /sky130_fd_pr::nMOS libinst
+1.000 90.000 <</p_yps2 -32 /p_yps1 -24 /p_xps2 32 /p_rot 270 /p_xps -32 /@model (hvnfet) 
+/@length (0.36u) /@subs (dgnd) >> /sky130_fd_pr::nMOS libinst
+
+/sky130_fd_pr::nMOS1finger {
+<</@subs (agnd) /p_yps2 -16 /p_xps2 16 /p_yps1 8 /p_xps1 16 /p_yps 40 /p_xps 16 /p_rot 
+0 /@class (M) /@width (1u) /@length (0.18u) /@model (nfet) /@index (?) /p_jst 
+28 >> begingate
+1 1.000 0 -64 0 -28 -32 -28 -32 28 0 28 0 64 6 polygon
+1 1.000 -44 -28 -44 28 2 polygon
+1 1.000 -44 0 -64 0 2 polygon
+1.000 0.000 0.000 scb
+(G) {/Times-Roman cf} 2 7 0.000 1.000 -64 0 pinlabel
+(S) {/Times-Roman cf} 2 13 0.000 1.000 0 -64 pinlabel
+(D) {/Times-Roman cf} 2 9 0.000 1.000 0 64 pinlabel
+0.180 0.545 0.341 scb
+mark @length ( l=) @width ( w=) @model ( ) @subs ( %pD %pG %pS ) @index @class 
+(spice:) {/Times-Roman cf} ctmk 4 360.000 1.000 -244 -139 infolabel
+mark ( %x %y) @width ( ) @length (sim:n %pG %pD %pS ) {/Times-Roman cf} ctmk 4 
+0.000 1.000 -244 -187 infolabel
+0.647 0.165 0.165 scb
+mark @length (=) {Tf} (L) {hS} {CR} @width (=) {Ts} (W) {/Times-Roman cf} ctmk 
+p_jst p_rot 0.700 p_xps2 p_yps2 label
+0.000 0.000 1.000 scb
+mark @index @class {/Times-Roman cf} ctmk 20 p_rot 0.700 p_xps p_yps label
+sce
+mark @model {/Times-RomanISO cf} ctmk 20 p_rot 0.700 p_xps1 p_yps1 label
+endgate
+} def
+
+1.000 90.000 <</p_yps2 -32 /p_yps1 -24 /p_xps2 32 /p_rot 270 /p_xps -32 >> /sky130_fd_pr::nMOS1finger libinst
+<</@model (hvnfet) /@length (0.36u) /@subs (dgnd) >> /sky130_fd_pr::nMOS1finger libinst
+1.000 90.000 <</p_yps2 -32 /p_yps1 -24 /p_xps2 32 /p_rot 270 /p_xps -32 /@model (hvnfet) 
+/@length (0.36u) /@subs (dgnd) >> /sky130_fd_pr::nMOS1finger libinst
+
+/generic::arrowhead {
+% nonetwork
+begingate
+8 -28 beginpath
+3 -18 3 -15 0 0 curveto
+-3 -15 -3 -18 -8 -28 curveto
+-2 -26 2 -26 8 -28 curveto
+249 
+1.000 endpath
+endgate
+} def
+
+/sky130_fd_pr::NPNModel {
+<</@subs (agnd) /p_yps2 56 /p_xps2 16 /p_yps1 0 /p_xps1 16 /p_yps 24 /p_xps 16 /p_rot 
+0 /@length (10.16u) /@width (0.2u) /@m (1) /@model (bipolar) /@index (?) /@class 
+(Q) >> begingate
+1 1.000 -48 0 -64 0 2 polygon
+1 1.000 -48 48 -48 -48 2 polygon
+1 1.000 0 48 -48 22 2 polygon
+1 1.000 0 48 0 64 2 polygon
+1 1.000 0 -48 -48 -22 2 polygon
+1 1.000 0 -48 0 -64 2 polygon
+1.000 120.000 0 -48 generic::arrowhead
+1.000 0.000 0.000 scb
+(C) {/Times-Roman cf} 2 9 0.000 1.000 0 64 pinlabel
+(B) {/Times-Roman cf} 2 7 0.000 1.000 -64 0 pinlabel
+(E) {/Times-Roman cf} 2 13 0.000 1.000 0 -64 pinlabel
+0.180 0.545 0.341 scb
+mark @m ( M=) @length ( L=) @width ( W=) @model ( ) @subs ( %pC %pB %pE ) 
+@index @class (spice:) {/Times-Roman cf} ctmk 4 0.000 1.000 -244 -139 infolabel
+(sim:b %pB %pE %pC) {/Times-Roman cf} 2 4 0.000 1.000 -244 -187 infolabel
+0.000 0.000 1.000 scb
+mark @index @class {/Times-Roman cf} ctmk 16 p_rot 0.700 p_xps2 p_yps2 label
+sce
+mark @model {/Times-RomanISO cf} ctmk 16 p_rot 0.700 p_xps p_yps label
+0.647 0.165 0.165 scb
+mark @m {Tf} (=) {Tf} (M) {CR} @length {Tf} (=) {Tf} (L) {CR} @width {Ts} {hS} 
+(=) {Ts} {hS} (W) {/Times-Roman cf} ctmk 28 p_rot 0.700 p_xps1 p_yps1 label
+endgate
+} def
+
+1.000 90.000 <</p_yps -40 /p_xps2 -32 /p_xps 32 /p_xps1 48 /p_yps1 -32 /p_rot 270 >> /sky130_fd_pr::NPNModel libinst
+
+/sky130_fd_pr::ResModel {
+<</@substype (sub) (lindex {sub well} 0) pop /@subs (avdd) /@width (1u) /@length 
+(1u) /p_yps2 -48 /p_xps2 32 /@model (resistor) /p_yps1 0 /p_xps1 32 /p_yps 
+32 /p_xps 32 /p_rot 0 /@class (R) /@value (1.0) /@units (k) /@index (?) /p_jst 
+20 >> begingate
+1 1.000 0 64 0 36 2 polygon
+1 1.000 0 -64 0 -36 2 polygon
+1 1.000 0 -36 14 -30 -14 -18 14 -6 -14 6 14 18 -14 30 0 36 8 polygon
+1.000 0.000 0.000 scb
+(1) {/Times-Roman cf} 2 9 0.000 1.000 0 64 pinlabel
+(2) {/Times-Roman cf} 2 13 0.000 1.000 0 -64 pinlabel
+0.180 0.545 0.341 scb
+mark @subs (=) @substype ( ) @width ( W=) @length ( L=) @units @value ( R=) 
+@model ( %p1 %p2 ) @index @class (spice:) {/Times-Roman cf} ctmk 4 0.000 1.000 
+-208 -160 infolabel
+(sim:r %p1 %p2) {/Times-Roman cf} 2 4 0.000 1.000 -208 -208 infolabel
+0.647 0.165 0.165 scb
+mark (W) {/Symbol cf} @units {hS} @value {/Times-Roman cf} ctmk p_jst p_rot 
+0.700 p_xps1 p_yps1 label
+0.180 0.545 0.341 scb
+mark @index @class (pcb:) {/Times-Roman cf} ctmk 20 0.000 1.000 -208 -256 
+infolabel
+0.000 0.000 1.000 scb
+mark @index @class {/Times-Roman cf} ctmk 20 p_rot 0.700 p_xps p_yps label
+0.647 0.165 0.165 scb
+mark @model {/Times-RomanISO cf} ctmk 16 p_rot 0.700 p_xps2 p_yps2 label
+endgate
+} def
+
+1.000 90.000 <</@substype (sub) /p_xps -32 /p_yps1 -32 /p_yps -16 /p_xps2 80 /p_yps2 -32 
+/p_rot 270 >> /sky130_fd_pr::ResModel libinst
+
+/sky130_fd_pr::MiMCap {
+<</@substype (sub) (lindex {sub well} 0) pop /@subs (agnd) /@fingers (1) /@length 
+(1u) /@width (1u) /p_yps2 -8 /p_xps2 48 /p_yps1 24 /p_xps1 48 /p_yps 
+56 /p_xps 48 /p_rot 0 /@class (C) /@value (1.0) /@units (p) /@index (?) /p_jst 
+20 >> begingate
+1 1.000 0 -64 0 -6 2 polygon
+1 1.000 0 64 0 6 2 polygon
+1 1.000 -32 6 32 6 2 polygon
+1.000 0.000 0.000 scb
+(1) {/Times-Roman cf} 2 9 0.000 1.000 0 64 pinlabel
+(2) {/Times-Roman cf} 2 13 0.000 1.000 0 -64 pinlabel
+0.180 0.545 0.341 scb
+mark @subs (=) @substype ( ) @fingers ( M=) @width ( W=) @length ( L=) @units 
+@value ( %p1 %p2 MIM C=) @index (spice:C) {/Times-Roman cf} ctmk 4 0.000 1.000 
+-208 -160 infolabel
+(sim:c %p1 %p2) {/Times-Roman cf} 2 4 0.000 1.000 -208 -208 infolabel
+0.647 0.165 0.165 scb
+mark (F) @units {hS} @value {/Times-Roman cf} ctmk p_jst p_rot 0.700 p_xps1 
+p_yps1 label
+0.180 0.545 0.341 scb
+mark @index (pcb:C) {/Times-Roman cf} ctmk 20 0.000 1.000 -208 -256 infolabel
+0.000 0.000 1.000 scb
+mark @index @class {/Times-Roman cf} ctmk 20 p_rot 0.700 p_xps p_yps label
+0.647 0.165 0.165 scb
+mark @fingers {Tf} (=) {Tf} (M) {CR} @length {Tf} (=) {Tf} (L) {CR} @width {Ts} 
+{hS} (=) {Ts} {hS} (W) {/Times-RomanISO cf} ctmk 28 p_rot 0.700 p_xps2 p_yps2 
+label
+sce
+1 1.000 0 -80 74 66.000 114.000 xcarc
+endgate
+} def
+
+1.000 90.000 <</@substype (sub) /p_xps -48 /p_yps 24 /p_yps1 -24 /p_xps2 80 /p_yps2 -24 
+/p_rot 270 >> /sky130_fd_pr::MiMCap libinst
+
+/sky130_fd_pr::IndModel {
+<</@size (175u) /@width (2.5u) /@sep (2.5u) /@turns (6.5) /@substype (sub) 
+(lindex {sub well} 0) pop /@subs (agnd) /p_yps2 -48 /p_xps2 32 /@model 
+(inductor) /p_yps1 -16 /p_xps1 32 /p_yps 16 /p_xps 32 /@value (10) /@units (n) /@index 
+(?) /p_jst 20 /p_rot 0 >> begingate
+1 1.000 20 -22 20 -38 0 -42 0 -18 spline
+1 1.000 -20 -14 -20 -26 0 -22 0 -18 spline
+1 1.000 20 38 20 22 0 18 0 42 spline
+1 1.000 20 18 20 2 0 -2 0 22 spline
+1 1.000 20 -2 20 -18 0 -22 0 2 spline
+1 1.000 -20 26 -20 14 0 18 0 22 spline
+1 1.000 -20 6 -20 -6 0 -2 0 2 spline
+1 1.000 0 -42 0 -64 2 polygon
+1 1.000 0 42 0 64 2 polygon
+1.000 0.000 0.000 scb
+(1) {/Times-Roman cf} 2 9 0.000 1.000 0 64 pinlabel
+(2) {/Times-Roman cf} 2 13 0.000 1.000 0 -64 pinlabel
+0.180 0.545 0.341 scb
+mark @turns ( turns=) @sep ( sep=) @width ( width=) @size ( size=) @subs (=) 
+@substype ( ) @units @value ( ind=) @model ( %p1 %p2 ) @index (spice:L) 
+{/Times-Roman cf} ctmk 132 360.000 1.000 -208 -160 infolabel
+(sim:l %p1 %p2) {/Times-Roman cf} 2 4 0.000 1.000 -208 -208 infolabel
+0.647 0.165 0.165 scb
+mark (H) @units {hS} @value {/Times-Roman cf} ctmk p_jst p_rot 0.700 p_xps1 
+p_yps1 label
+0.180 0.545 0.341 scb
+mark @index (pcb:L) {/Times-Roman cf} ctmk 20 0.000 1.000 -208 -256 infolabel
+0.000 0.000 1.000 scb
+mark @index (L) {/Times-Roman cf} ctmk 20 p_rot 0.700 p_xps p_yps label
+0.647 0.165 0.165 scb
+mark @model {/Times-Roman cf} ctmk 20 p_rot 0.700 p_xps2 p_yps2 label
+endgate
+} def
+
+1.000 90.000 <</@substype (sub) /p_rot 270 /p_yps1 -48 /p_xps1 48 /p_yps -16 /p_xps -48 
+/p_xps2 80 >> /sky130_fd_pr::IndModel libinst
+
+% EndLib
diff --git a/sky130/xcircuit/sky130_fd_sc_hd.lps b/sky130/xcircuit/sky130_fd_sc_hd.lps
new file mode 100644
index 0000000..939039f
--- /dev/null
+++ b/sky130/xcircuit/sky130_fd_sc_hd.lps
@@ -0,0 +1,352 @@
+%! PostScript set of library objects for XCircuit
+%  Version: 3.6
+%  Library name is: sky130_fd_sc_hd.lps
+%  Author: R. Timothy Edwards <tim.edwards@multigig.com>
+%
+
+% XCircuitLib library objects
+/sky130_fd_sc_hd::inv {
+<</gnd (dgnd) /vdd (dvdd) /@index (?) /voltage () /strength (1) >> begingate
+0 1.00 -32 -40 -32 40 40 0 3 polygon
+1 1.00 48 0 8 0.00 360.00 xcarc
+1 1.00 -32 0 -48 0 2 polygon
+1 1.00 56 0 64 0 2 polygon
+1.000 0.000 0.000 scb
+(Y) {/Times-Roman cf} 2 4 0 1.00 64 0 pinlabel
+(A) {/Times-Roman cf} 2 7 0 1.00 -48 0 pinlabel
+0.180 0.545 0.341 scb
+mark voltage strength ( %pA %pY invX) gnd ( ) vdd ( ) @index (spice:X) 
+{/Times-Roman cf} ctmk 16 360 0.70 -32 -136 infolabel
+mark (.cir) voltage (spice@1:%F$XCIRCUIT_LIB_DIR/standard_cells) {/Times-Roman cf} 
+ctmk 16 0 0.70 -32 -96 infolabel
+0.647 0.165 0.165 scb
+mark voltage {/Times-Roman cf} ctmk 21 0 0.60 -8 0 label
+mark strength {qS} (\327) {/Times-RomanISO cf} ctmk 16 0 0.60 0 24 label
+0.000 0.000 1.000 scb
+mark @index (U) {/Times-RomanISO cf} ctmk 28 0 0.70 8 -24 label
+endgate
+} def
+
+<</strength (2) >> /sky130_fd_sc_hd::inv libinst
+<</strength (4) >> /sky130_fd_sc_hd::inv libinst
+<</voltage (_3V) /vdd (dvdd3) >> /sky130_fd_sc_hd::inv libinst
+<</voltage (_3V) /strength (2) /vdd (dvdd3) >> /sky130_fd_sc_hd::inv libinst
+<</voltage (_3V) /strength (4) /vdd (dvdd3) >> /sky130_fd_sc_hd::inv libinst
+
+/sky130_fd_sc_hd::buf {
+<</gnd (dgnd) /vdd (dvdd) /@index (?) /voltage () /strength (2) >> begingate
+0 1.00 -32 -40 -32 40 40 0 3 polygon
+1 1.00 -32 0 -48 0 2 polygon
+1 1.00 40 0 64 0 2 polygon
+1.000 0.000 0.000 scb
+(Y) {/Times-Roman cf} 2 4 0 1.00 64 0 pinlabel
+(A) {/Times-Roman cf} 2 7 0 1.00 -48 0 pinlabel
+0.180 0.545 0.341 scb
+mark voltage strength ( %pA %pY bufX) gnd ( ) vdd ( ) @index (spice:X) 
+{/Times-Roman cf} ctmk 16 360 0.70 -32 -112 infolabel
+mark (.cir) voltage (spice@1:%F$XCIRCUIT_LIB_DIR/standard_cells) {/Times-Roman cf} 
+ctmk 16 0 0.70 -32 -80 infolabel
+0.647 0.165 0.165 scb
+mark voltage {/Times-RomanISO cf} ctmk 21 0 0.50 -8 0 label
+mark strength {qS} (\327) {/Times-RomanISO cf} ctmk 16 0 0.50 8 24 label
+0.000 0.000 1.000 scb
+mark @index (U) {/Times-RomanISO cf} ctmk 16 0 0.60 24 -32 label
+endgate
+} def
+
+<</strength (4) >> /sky130_fd_sc_hd::buf libinst
+<</voltage (_3V) /vdd (dvdd3) >> /sky130_fd_sc_hd::buf libinst
+<</voltage (_3V) /strength (4) /vdd (dvdd3) >> /sky130_fd_sc_hd::buf libinst
+
+/sky130_fd_sc_hd::nand2 {
+<</gnd (dgnd) /vdd (dvdd) /voltage () /@index (?) >> begingate
+1 1.00 0 -48 -64 -48 -64 48 0 48 4 polygon
+1 1.00 56 0 8 0.00 360.00 xcarc
+1 1.00 0 0 48 -90.00 90.00 xcarc
+1.000 0.000 0.000 scb
+(Y) {/Times-Roman cf} 2 4 0 1.00 64 0 pinlabel
+(A) {/Times-Roman cf} 2 7 0 1.00 -64 32 pinlabel
+(B) {/Times-Roman cf} 2 7 0 1.00 -64 -32 pinlabel
+sce
+1 1.00 -64 -48 -64 48 2 polygon
+0.180 0.545 0.341 scb
+mark voltage ( %pA %pB %pY nand2X1) gnd ( ) vdd ( ) @index (spice:X) 
+{/Times-Roman cf} ctmk 16 360 0.70 -64 -128 infolabel
+0.647 0.165 0.165 scb
+mark voltage {/Times-Roman cf} ctmk 21 0 0.70 -16 16 label
+0.000 0.000 1.000 scb
+mark @index (U) {/Times-RomanISO cf} ctmk 28 0 0.70 -40 -8 label
+0.180 0.545 0.341 scb
+mark (.cir) voltage (spice@1:%F$XCIRCUIT_LIB_DIR/standard_cells) {/Times-Roman cf} 
+ctmk 16 0 0.70 -64 -96 infolabel
+endgate
+} def
+
+<</voltage (_3V) /vdd (dvdd3) >> /sky130_fd_sc_hd::nand2 libinst
+
+/sky130_fd_sc_hd::nand3 {
+<</gnd (dgnd) /vdd (dvdd) /@index (?) /voltage () >> begingate
+1 1.00 0 -48 -64 -48 -64 48 0 48 4 polygon
+1 1.00 56 0 8 0.00 360.00 xcarc
+1 1.00 0 0 48 -90.00 90.00 xcarc
+1.000 0.000 0.000 scb
+(Y) {/Times-Roman cf} 2 4 0 1.00 64 0 pinlabel
+(A) {/Times-Roman cf} 2 7 0 1.00 -64 32 pinlabel
+(B) {/Times-Roman cf} 2 7 0 1.00 -64 0 pinlabel
+(C) {/Times-Roman cf} 2 7 0 1.00 -64 -32 pinlabel
+sce
+1 1.00 -64 -64 -64 64 2 polygon
+0.180 0.545 0.341 scb
+mark voltage ( %pA %pB %pC %pY nand3X1) gnd ( ) vdd ( ) @index (spice:X) 
+{/Times-Roman cf} ctmk 16 360 0.70 -64 -128 infolabel
+mark (.cir) voltage (spice@1:%F$XCIRCUIT_LIB_DIR/standard_cells) {/Times-Roman cf} 
+ctmk 16 0 0.70 -64 -96 infolabel
+0.647 0.165 0.165 scb
+mark voltage {/Times-Roman cf} ctmk 21 0 0.70 -16 16 label
+0.000 0.000 1.000 scb
+mark @index (U) {/Times-RomanISO cf} ctmk 28 0 0.70 -40 -8 label
+endgate
+} def
+
+<</voltage (_3V) /vdd (dvdd3) >> /sky130_fd_sc_hd::nand3 libinst
+
+/sky130_fd_sc_hd::nand4 {
+<</gnd (dgnd) /vdd (dvdd) /voltage () /@index (?) >> begingate
+1 1.00 0 -64 -64 -64 -64 64 0 64 4 polygon
+1 1.00 56 0 8 0.00 360.00 xcarc
+1 1.00 0 0 48 64 -90.00 90.00 ellipse
+1.000 0.000 0.000 scb
+(Y) {/Times-Roman cf} 2 4 0 1.00 64 0 pinlabel
+(A) {/Times-Roman cf} 2 7 0 1.00 -64 48 pinlabel
+(B) {/Times-Roman cf} 2 7 0 1.00 -64 16 pinlabel
+(C) {/Times-Roman cf} 2 7 0 1.00 -64 -16 pinlabel
+(D) {/Times-Roman cf} 2 7 0 1.00 -64 -48 pinlabel
+sce
+1 1.00 -64 -80 -64 80 2 polygon
+0.180 0.545 0.341 scb
+mark voltage ( %pA %pB %pC %pD %pY nand4X1) gnd ( ) vdd ( ) @index (spice:X) 
+{/Times-Roman cf} ctmk 16 360 0.70 -64 -144 infolabel
+mark (.cir) voltage (spice@1:%F$XCIRCUIT_LIB_DIR/standard_cells) {/Times-Roman cf} 
+ctmk 16 0 0.70 -64 -112 infolabel
+0.647 0.165 0.165 scb
+mark voltage {/Times-Roman cf} ctmk 21 0 0.70 -16 16 label
+0.000 0.000 1.000 scb
+mark @index (U) {/Times-RomanISO cf} ctmk 28 0 0.70 -40 -8 label
+endgate
+} def
+
+<</voltage (_3V) /vdd (dvdd3) >> /sky130_fd_sc_hd::nand4 libinst
+
+/sky130_fd_sc_hd::nor2 {
+<</gnd (dgnd) /vdd (dvdd) /@index (?) /voltage () >> begingate
+1 1.00 56 0 8 0.00 360.00 xcarc
+1.000 0.000 0.000 scb
+(Y) {/Times-Roman cf} 2 4 0 1.00 64 0 pinlabel
+(A) {/Times-Roman cf} 2 7 0 1.00 -64 32 pinlabel
+(B) {/Times-Roman cf} 2 7 0 1.00 -64 -32 pinlabel
+0.180 0.545 0.341 scb
+mark voltage ( %pA %pB %pY nor2X1) gnd ( ) vdd ( ) @index (spice:X) 
+{/Times-Roman cf} ctmk 16 360 0.70 -64 -128 infolabel
+0.647 0.165 0.165 scb
+mark voltage {/Times-Roman cf} ctmk 21 0 0.70 -16 16 label
+0.000 0.000 1.000 scb
+mark @index (U) {/Times-RomanISO cf} ctmk 28 0 0.70 -40 -8 label
+sce
+1 1.00 -35 48 96 270.00 330.00 xcarc
+1 1.00 -64 -48 -35 -48 2 polygon
+1 1.00 -128 0 80 -37.00 37.00 xcarc
+1 1.00 -35 -48 96 30.00 90.00 xcarc
+1 1.00 -64 48 -35 48 2 polygon
+1 1.00 -64 32 -56 32 2 polygon
+1 1.00 -64 -32 -56 -32 2 polygon
+0.180 0.545 0.341 scb
+mark (.cir) voltage (spice@1:%F$XCIRCUIT_LIB_DIR/standard_cells) {/Times-Roman cf} 
+ctmk 16 0 0.70 -64 -96 infolabel
+endgate
+} def
+
+<</voltage (_3V) /vdd (dvdd3) >> /sky130_fd_sc_hd::nor2 libinst
+
+/sky130_fd_sc_hd::nor3 {
+<</voltage () /@index (?) /vdd (dvdd) /gnd (dgnd) >> begingate
+1 1.00 56 0 8 0.00 360.00 xcarc
+1.000 0.000 0.000 scb
+(Y) {/Times-Roman cf} 2 4 0 1.00 64 0 pinlabel
+(A) {/Times-Roman cf} 2 7 0 1.00 -64 32 pinlabel
+(B) {/Times-Roman cf} 2 7 0 1.00 -64 0 pinlabel
+0.180 0.545 0.341 scb
+mark voltage ( %pA %pB %pC %pY nor3X1) gnd ( ) vdd ( ) @index (spice:X) 
+{/Times-Roman cf} ctmk 16 360 0.70 -64 -128 infolabel
+mark (.cir) voltage (spice@1:%F$XCIRCUIT_LIB_DIR/standard_cells) {/Times-Roman cf} 
+ctmk 16 0 0.70 -64 -96 infolabel
+0.647 0.165 0.165 scb
+mark voltage {/Times-Roman cf} ctmk 21 0 0.70 -16 16 label
+0.000 0.000 1.000 scb
+mark @index (U) {/Times-RomanISO cf} ctmk 28 0 0.70 -40 -8 label
+sce
+1 1.00 -35 48 96 270.00 330.00 xcarc
+1 1.00 -64 -48 -35 -48 2 polygon
+1 1.00 -128 0 80 -36.87 36.87 xcarc
+1 1.00 -35 -48 96 30.00 90.00 xcarc
+1 1.00 -64 48 -35 48 2 polygon
+1 1.00 -64 32 -56 32 2 polygon
+1 1.00 -64 -32 -56 -32 2 polygon
+1 1.00 -48 0 -64 0 2 polygon
+1.000 0.000 0.000 scb
+(C) {/Times-Roman cf} 2 7 0 1.00 -64 -32 pinlabel
+sce
+1 1.00 -64 48 -64 64 2 polygon
+1 1.00 -64 -48 -64 -64 2 polygon
+endgate
+} def
+
+<</voltage (_3V) /vdd (dvdd3) >> /sky130_fd_sc_hd::nor3 libinst
+
+/sky130_fd_sc_hd::nor4 {
+<</gnd (dgnd) /vdd (dvdd) /@index (?) /voltage () >> begingate
+1 1.00 56 0 8 0.00 360.00 xcarc
+1.000 0.000 0.000 scb
+(Y) {/Times-Roman cf} 2 4 0 1.00 64 0 pinlabel
+(A) {/Times-Roman cf} 2 7 0 1.00 -64 48 pinlabel
+(B) {/Times-Roman cf} 2 7 0 1.00 -64 16 pinlabel
+0.180 0.545 0.341 scb
+mark voltage ( %pA %pB %pC %pD %pY nor4X1) gnd ( ) vdd ( ) @index (spice:X) 
+{/Times-Roman cf} ctmk 16 360 0.70 -64 -128 infolabel
+mark (.cir) voltage (spice@1:%F$XCIRCUIT_LIB_DIR/standard_cells) {/Times-Roman cf} 
+ctmk 16 0 0.70 -64 -96 infolabel
+0.647 0.165 0.165 scb
+mark voltage {/Times-Roman cf} ctmk 21 0 0.70 -16 16 label
+0.000 0.000 1.000 scb
+mark @index (U) {/Times-RomanISO cf} ctmk 21 0 0.70 -8 -16 label
+sce
+1 1.00 -64 48 -58 48 2 polygon
+1 1.00 -64 -16 -48 -16 2 polygon
+1 1.00 -48 16 -64 16 2 polygon
+1.000 0.000 0.000 scb
+(C) {/Times-Roman cf} 2 7 0 1.00 -64 -16 pinlabel
+sce
+1 1.00 32 32 0 56 -40 56 48 0 spline
+1 1.00 32 -32 0 -56 -40 -56 48 0 spline
+1 1.00 -40 32 -40 -24 -64 -56 -64 56 spline
+1 1.00 -64 56 -40 56 2 polygon
+1 1.00 -64 -56 -40 -56 2 polygon
+1.000 0.000 0.000 scb
+(D) {/Times-Roman cf} 2 7 0 1.00 -64 -48 pinlabel
+sce
+1 1.00 -64 -48 -60 -48 2 polygon
+endgate
+} def
+
+<</voltage (_3V) /vdd (dvdd3) >> /sky130_fd_sc_hd::nor4 libinst
+
+/sky130_fd_sc_hd::or2 {
+<</voltage () /@index (?) /vdd (dvdd) /gnd (dgnd) >> begingate
+1.000 0.000 0.000 scb
+(Y) {/Times-Roman cf} 2 4 0 1.00 64 0 pinlabel
+(A) {/Times-Roman cf} 2 7 0 1.00 -64 32 pinlabel
+(B) {/Times-Roman cf} 2 7 0 1.00 -64 -32 pinlabel
+0.180 0.545 0.341 scb
+mark voltage ( %pA %pB %pY or2X1) gnd ( ) vdd ( ) @index (spice:X) 
+{/Times-Roman cf} ctmk 16 360 0.70 -64 -128 infolabel
+mark (.cir) voltage (spice@1:%F$XCIRCUIT_LIB_DIR/standard_cells) {/Times-Roman cf} 
+ctmk 16 0 0.70 -64 -96 infolabel
+0.647 0.165 0.165 scb
+mark voltage {/Times-Roman cf} ctmk 21 0 0.70 -16 16 label
+0.000 0.000 1.000 scb
+mark @index (U) {/Times-RomanISO cf} ctmk 28 0 0.70 -40 -8 label
+sce
+1 1.00 -35 48 96 270.00 330.00 xcarc
+1 1.00 -64 -48 -35 -48 2 polygon
+1 1.00 -128 0 80 -37.00 37.00 xcarc
+1 1.00 -35 -48 96 30.00 90.00 xcarc
+1 1.00 -64 48 -35 48 2 polygon
+1 1.00 -64 32 -56 32 2 polygon
+1 1.00 -64 -32 -56 -32 2 polygon
+1 1.00 48 0 64 0 2 polygon
+endgate
+} def
+
+/sky130_fd_sc_hd::ebufn {
+<</strength (2) /voltage () /@index (?) /vdd (dvdd) /gnd (dgnd) >> begingate
+0 1.00 -32 -40 -32 40 40 0 3 polygon
+1 1.00 -32 0 -48 0 2 polygon
+1 1.00 40 0 64 0 2 polygon
+1.000 0.000 0.000 scb
+(Y) {/Times-Roman cf} 2 4 0 1.00 64 0 pinlabel
+(A) {/Times-Roman cf} 2 7 0 1.00 -48 0 pinlabel
+0.180 0.545 0.341 scb
+mark voltage strength ( %pA %pY %pEn ebufnX) gnd ( ) vdd ( ) @index (spice:X) 
+{/Times-Roman cf} ctmk 16 360 0.70 -176 -112 infolabel
+mark (.cir) voltage (spice@1:%F$XCIRCUIT_LIB_DIR/standard_cells) {/Times-Roman cf} 
+ctmk 16 0 0.70 -176 -80 infolabel
+0.647 0.165 0.165 scb
+mark voltage {/Times-RomanISO cf} ctmk 21 0 0.50 -8 0 label
+mark strength {qS} (\327) {/Times-RomanISO cf} ctmk 16 0 0.50 8 24 label
+0.000 0.000 1.000 scb
+mark @index (U) {/Times-RomanISO cf} ctmk 16 0 0.60 24 -32 label
+sce
+1 1.00 0 24 0 48 2 polygon
+1.000 0.000 0.000 scb
+(En) {/Times-Roman cf} 2 17 0 1.00 0 48 pinlabel
+endgate
+} def
+
+<</voltage (_3V) /vdd (dvdd3) >> /sky130_fd_sc_hd::ebufn libinst
+
+/sky130_fd_sc_hd::mux2 {
+<</gnd (dgnd) /vdd (dvdd) /@index (?) /voltage () >> begingate
+1 1.00 -16 16 -32 16 2 polygon
+1 1.00 48 -16 64 -16 2 polygon
+1.000 0.000 0.000 scb
+(Y) {/Times-Roman cf} 2 4 0 1.00 64 -16 pinlabel
+(A) {/Times-Roman cf} 2 7 0 1.00 -32 16 pinlabel
+0.180 0.545 0.341 scb
+mark voltage ( %pA %pB %pY %pS mux2X1) gnd ( ) vdd ( ) @index (spice:X) 
+{/Times-Roman cf} ctmk 16 360 0.70 -128 -176 infolabel
+mark (.cir) voltage (spice@1:%F$XCIRCUIT_LIB_DIR/standard_cells) {/Times-Roman cf} 
+ctmk 16 0 0.70 -128 -144 infolabel
+0.647 0.165 0.165 scb
+mark voltage {/Times-RomanISO cf} ctmk 21 0 0.50 16 -16 label
+0.000 0.000 1.000 scb
+mark @index (U) {/Times-RomanISO cf} ctmk 28 0 0.60 24 -80 label
+sce
+1 1.00 16 32 16 64 2 polygon
+1.000 0.000 0.000 scb
+(S) {/Times-Roman cf} 2 17 0 1.00 16 64 pinlabel
+(B) {/Times-Roman cf} 2 7 0 1.00 -32 -48 pinlabel
+sce
+1 1.00 -32 -48 -16 -48 2 polygon
+1 1.00 -16 48 48 16 48 -48 -16 -80 -16 48 5 polygon
+endgate
+} def
+
+<</voltage (_3V) /vdd (dvdd3) >> /sky130_fd_sc_hd::mux2 libinst
+
+/sky130_fd_sc_hd::dlrbn {
+<</@index (?) /voltage () /vdd (dvdd) /gnd (dgnd) >> begingate
+1.000 0.000 0.000 scb
+(Q) {/Times-Roman cf} 2 4 0 1.00 32 32 pinlabel
+(D) {/Times-Roman cf} 2 7 0 1.00 -64 32 pinlabel
+(CLK) {/Times-Roman cf} 2 13 0 1.00 -16 -48 pinlabel
+0.180 0.545 0.341 scb
+mark voltage ( %pCLK %pD %pQ dlrbn) gnd ( ) vdd ( ) @index (spice:X) 
+{/Times-Roman cf} ctmk 16 360 0.70 -192 -160 infolabel
+mark (.cir) voltage (spice@1:%F$XCIRCUIT_LIB_DIR/standard_cells) {/Times-Roman cf} 
+ctmk 16 0 0.70 -192 -128 infolabel
+0.647 0.165 0.165 scb
+mark voltage {/Times-Roman cf} ctmk 21 0 0.70 -16 64 label
+0.000 0.000 1.000 scb
+mark @index (U) {/Times-RomanISO cf} ctmk 17 0 0.70 -16 128 label
+sce
+0 1.00 -64 -48 -64 112 32 112 32 -48 4 polygon
+1 1.00 -32 -48 -16 -32 0 -48 3 polygon
+(D) {/Times-Roman cf} 2 21 0 0.70 -48 32 label
+(Q) {/Times-Roman cf} 2 21 0 0.70 16 32 label
+0.000 0.000 1.000 scb
+(dlrbn) {/Times-Roman cf} 2 29 0 0.70 -16 96 label
+endgate
+} def
+
+<</voltage (_3V) /vdd (dvdd3) >> /sky130_fd_sc_hd::dlrbn libinst
+
+% EndLib