this "works" but uses 5000x vpp caps. Will try varactor caps and more step down current mirrors...
diff --git a/mag/sawgen-fet-sky130.mag b/mag/sawgen-fet-sky130.mag
new file mode 100644
index 0000000..7958e59
--- /dev/null
+++ b/mag/sawgen-fet-sky130.mag
@@ -0,0 +1,24 @@
+magic
+tech sky130A
+magscale 1 2
+timestamp 1623383988
+<< error_s >>
+rect -351 -146 -293 -140
+rect -351 -180 -339 -146
+rect -351 -186 -293 -180
+rect -351 -456 -293 -450
+rect -351 -490 -339 -456
+rect -351 -496 -293 -490
+use sky130_fd_pr__cap_var_lvt_QRK88N sky130_fd_pr__cap_var_lvt_QRK88N_0
+timestamp 1623383988
+transform 1 0 -322 0 1 -318
+box -261 -301 261 301
+use sky130_fd_pr__nfet_g5v0d10v5_CEXLE5 sky130_fd_pr__nfet_g5v0d10v5_CEXLE5_0
+timestamp 1621480638
+transform 1 0 2504 0 1 306
+box -138 -288 138 288
+use sky130_fd_pr__cap_vpp_11p5x11p7_m1m2m3m4_shieldl1m5 sky130_fd_pr__cap_vpp_11p5x11p7_m1m2m3m4_shieldl1m5_0 $PDKPATH/libs.ref/sky130_fd_pr/mag
+timestamp 1620527770
+transform 1 0 -12 0 1 -12
+box 0 0 2282 2338
+<< end >>
diff --git a/xschem/sawgen-fet-sky130.sch b/xschem/sawgen-fet-sky130.sch
new file mode 100644
index 0000000..4a2dffd
--- /dev/null
+++ b/xschem/sawgen-fet-sky130.sch
@@ -0,0 +1,193 @@
+v {xschem version=2.9.9 file_version=1.2 }
+G {}
+K {}
+V {}
+S {}
+E {}
+T {9084ohm} 460 -650 0 0 0.4 0.4 {}
+N 150 -760 150 -740 { lab=VDD}
+N 150 -680 150 -660 { lab=GND}
+N 110 -680 110 -640 { lab=GND}
+N 110 -680 150 -680 { lab=GND}
+N 400 -670 420 -670 { lab=GND}
+N 440 -860 440 -810 { lab=VDD}
+N 440 -840 440 -810 { lab=VDD}
+N 480 -780 490 -780 { lab=cur}
+N 480 -780 490 -780 { lab=cur}
+N 490 -780 560 -780 { lab=cur}
+N 600 -860 600 -810 { lab=VDD}
+N 600 -640 600 -620 { lab=GND}
+N 510 -780 510 -730 { lab=cur}
+N 440 -730 510 -730 { lab=cur}
+N 600 -730 730 -730 { lab=saw}
+N 730 -730 730 -710 { lab=saw}
+N 770 -680 970 -680 { lab=#net1}
+N 840 -680 840 -650 { lab=#net1}
+N 730 -620 800 -620 { lab=#net2}
+N 730 -650 730 -620 { lab=#net2}
+N 730 -620 730 -600 { lab=#net2}
+N 780 -620 780 -570 { lab=#net2}
+N 770 -570 780 -570 { lab=#net2}
+N 840 -590 840 -520 { lab=GND}
+N 730 -540 730 -520 { lab=GND}
+N 930 -730 950 -730 { lab=GND}
+N 930 -600 950 -600 { lab=GND}
+N 970 -860 970 -760 { lab=VDD}
+N 970 -700 970 -680 { lab=#net1}
+N 970 -680 970 -630 { lab=#net1}
+N 970 -570 970 -520 { lab=GND}
+N 440 -750 440 -720 { lab=cur}
+N 440 -720 440 -700 { lab=cur}
+N 440 -640 440 -620 { lab=GND}
+N 600 -750 600 -700 { lab=saw}
+N 580 -630 600 -630 { lab=GND}
+N 580 -660 580 -630 { lab=GND}
+N 580 -700 580 -680 { lab=saw}
+N 580 -700 600 -700 { lab=saw}
+C {devices/code_shown.sym} -880 -90 0 0 {name=s1 only_toplevel=false value="
+.model BSS84 VDMOS(pchan Rg=3 Vto=-2.1 Rd=2.4 Rs=1.8 Rb=3 Kp=.2 Cgdmax=.04n Cgdmin=.001n Cgs=.02n Cjo=.01n Is=2p mfg=Philips Vds=-50 Ron=6000m Qg=1n)
+.model 2N7002 VDMOS(Rg=3 Vto=1.6 Rd=0 Rs=.75 Rb=.14 Kp=.17 mtriode=1.25 Cgdmax=80p Cgdmin=12p Cgs=50p Cjo=50p Is=.04p mfg=Fairchild Vds=60 Ron=2 Qg=1.5n)
+
+
+.model 2N3904 NPN(IS=1E-14 VAF=100
++ Bf=300 IKF=0.4 XTB=1.5 BR=4
++ CJC=4E-12 CJE=8E-12 RB=20 RC=0.1 RE=0.1
++ TR=250E-9 TF=350E-12 ITF=1 VTF=2 XTF=3 Vceo=40 Icrating=200m mfg=Philips)
+
+.model 2N3906 PNP(IS=1E-14 VAF=100
++ BF=200 IKF=0.4 XTB=1.5 BR=4
++ CJC=4.5E-12 CJE=10E-12 RB=20 RC=0.1 RE=0.1
++ TR=250E-9 TF=350E-12 ITF=1 VTF=2 XTF=3 Vceo=40 Icrating=200m mfg=Philips)
+
+//.include /usr/share/pdk/sky130A/libs.ref/sky130_fd_pr/spice/sky130_fd_pr__nfet_g5v0d10v5.pm3.spice
+//.include /usr/share/pdk/sky130A/libs.ref/sky130_fd_pr/spice/sky130_fd_pr__res_high_po_0p35.model.spice
+
+.lib /usr/share/pdk/sky130A/libs.tech/ngspice/sky130.lib.spice tt
+.include /usr/share/pdk/sky130A/libs.ref/sky130_fd_sc_hvl/spice/sky130_fd_sc_hvl.spice"
+//.include /usr/share/pdk/sky130A/libs.ref/sky130_fd_sc_hvl/spice/sky130_fd_sc_hvl.spice"
+}
+C {devices/code_shown.sym} -10 -470 0 0 {name=s2 only_toplevel=false value=".ic V(saw)=0
+.control
+tran 10n 200u
+plot V(saw) V(cur)
+//V(Vt) V(vd)
+//plot V(vd)
+//plot I(Vb)
+.endc"}
+C {devices/vdd.sym} 150 -760 0 0 {name=l3 lab=VDD}
+C {devices/gnd.sym} 150 -660 0 0 {name=l4 lab=GND}
+C {devices/vsource.sym} 150 -710 0 0 {name=V1 value=10}
+C {devices/lab_pin.sym} 600 -720 0 0 {name=l12 sig_type=std_logic lab=saw}
+C {devices/vsource.sym} 110 -610 0 0 {name=V2 value=10}
+C {devices/vdd.sym} 110 -580 2 0 {name=l2 lab=VEE}
+C {sky130_fd_pr/pfet3_g5v0d10v5.sym} 460 -780 0 1 {name=M5
+L=0.8
+W=16
+body=VDD
+nf=1
+mult=1
+ad="'int((nf+1)/2) * W/nf * 0.29'"
+pd="'2*int((nf+1)/2) * (W/nf + 0.29)'"
+as="'int((nf+2)/2) * W/nf * 0.29'"
+ps="'2*int((nf+2)/2) * (W/nf + 0.29)'"
+nrd="'0.29 / W'" nrs="'0.29 / W'"
+sa=0 sb=0 sd=0
+model=pfet_g5v0d10v5
+spiceprefix=X
+}
+C {sky130_fd_pr/pfet3_g5v0d10v5.sym} 580 -780 0 0 {name=M6
+L=0.8
+W=2
+body=VDD
+nf=1
+mult=1
+ad="'int((nf+1)/2) * W/nf * 0.29'"
+pd="'2*int((nf+1)/2) * (W/nf + 0.29)'"
+as="'int((nf+2)/2) * W/nf * 0.29'"
+ps="'2*int((nf+2)/2) * (W/nf + 0.29)'"
+nrd="'0.29 / W'" nrs="'0.29 / W'"
+sa=0 sb=0 sd=0
+model=pfet_g5v0d10v5
+spiceprefix=X
+}
+C {sky130_fd_pr/res_high_po_0p35.sym} 440 -670 0 0 {name=R8
+W=0.35
+L=20
+model=res_high_po_0p35
+spiceprefix=X
+mult=1}
+C {devices/gnd.sym} 400 -670 0 0 {name=l15 lab=GND}
+C {devices/gnd.sym} 440 -620 0 0 {name=l18 lab=GND}
+C {devices/vdd.sym} 440 -860 0 0 {name=l19 lab=VDD}
+C {devices/vdd.sym} 600 -860 0 0 {name=l20 lab=VDD}
+C {devices/gnd.sym} 600 -620 0 0 {name=l21 lab=GND}
+C {devices/lab_pin.sym} 440 -720 0 0 {name=l5 sig_type=std_logic lab=cur}
+C {sky130_fd_pr/pfet3_g5v0d10v5.sym} 750 -680 0 1 {name=M1
+L=0.8
+W=2
+body=VDD
+nf=1
+mult=1
+ad="'int((nf+1)/2) * W/nf * 0.29'"
+pd="'2*int((nf+1)/2) * (W/nf + 0.29)'"
+as="'int((nf+2)/2) * W/nf * 0.29'"
+ps="'2*int((nf+2)/2) * (W/nf + 0.29)'"
+nrd="'0.29 / W'" nrs="'0.29 / W'"
+sa=0 sb=0 sd=0
+model=pfet_g5v0d10v5
+spiceprefix=X
+}
+C {sky130_fd_pr/nfet3_g5v0d10v5.sym} 750 -570 0 1 {name=M2
+L=0.8
+W=2
+body=GND
+nf=1
+mult=1
+ad="'int((nf+1)/2) * W/nf * 0.29'"
+pd="'2*int((nf+1)/2) * (W/nf + 0.29)'"
+as="'int((nf+2)/2) * W/nf * 0.29'"
+ps="'2*int((nf+2)/2) * (W/nf + 0.29)'"
+nrd="'0.29 / W'" nrs="'0.29 / W'"
+sa=0 sb=0 sd=0
+model=nfet_g5v0d10v5
+spiceprefix=X
+}
+C {sky130_fd_pr/nfet3_g5v0d10v5.sym} 820 -620 0 0 {name=M4
+L=0.8
+W=2
+body=GND
+nf=1
+mult=1
+ad="'int((nf+1)/2) * W/nf * 0.29'"
+pd="'2*int((nf+1)/2) * (W/nf + 0.29)'"
+as="'int((nf+2)/2) * W/nf * 0.29'"
+ps="'2*int((nf+2)/2) * (W/nf + 0.29)'"
+nrd="'0.29 / W'" nrs="'0.29 / W'"
+sa=0 sb=0 sd=0
+model=nfet_g5v0d10v5
+spiceprefix=X
+}
+C {devices/gnd.sym} 730 -520 0 0 {name=l7 lab=GND}
+C {devices/gnd.sym} 840 -520 0 0 {name=l8 lab=GND}
+C {sky130_fd_pr/res_high_po_0p35.sym} 970 -730 0 0 {name=R3
+W=0.35
+L=20
+model=res_high_po_0p35
+spiceprefix=X
+mult=1}
+C {devices/gnd.sym} 930 -730 0 0 {name=l9 lab=GND}
+C {sky130_fd_pr/res_high_po_0p35.sym} 970 -600 0 0 {name=R4
+W=0.35
+L=20
+model=res_high_po_0p35
+spiceprefix=X
+mult=1}
+C {devices/gnd.sym} 930 -600 0 0 {name=l10 lab=GND}
+C {devices/gnd.sym} 970 -520 0 0 {name=l11 lab=GND}
+C {devices/vdd.sym} 970 -860 0 0 {name=l13 lab=VDD}
+C {sky130_fd_pr/vpp_cap.sym} 600 -670 0 0 {name=C1
+model=cap_vpp_11p5x11p7_l1m1m2m3m4_shieldm5
+W=1
+L=1
+mult=5000
+spiceprefix=X}
diff --git a/xschem/sawgen-fet-sky130.spice b/xschem/sawgen-fet-sky130.spice
new file mode 100644
index 0000000..98b6357
--- /dev/null
+++ b/xschem/sawgen-fet-sky130.spice
@@ -0,0 +1,60 @@
+**.subckt sawgen-fet-sky130
+V1 VDD GND 10
+V2 GND VEE 10
+XM5 cur cur VDD VDD sky130_fd_pr__pfet_g5v0d10v5 L=0.8 W=16 nf=1 ad='int((nf+1)/2) * W/nf * 0.29' as='int((nf+2)/2) * W/nf * 0.29'
++ pd='2*int((nf+1)/2) * (W/nf + 0.29)' ps='2*int((nf+2)/2) * (W/nf + 0.29)' nrd='0.29 / W' nrs='0.29 / W'
++ sa=0 sb=0 sd=0 mult=1 m=1
+XM6 saw cur VDD VDD sky130_fd_pr__pfet_g5v0d10v5 L=0.8 W=2 nf=1 ad='int((nf+1)/2) * W/nf * 0.29' as='int((nf+2)/2) * W/nf * 0.29'
++ pd='2*int((nf+1)/2) * (W/nf + 0.29)' ps='2*int((nf+2)/2) * (W/nf + 0.29)' nrd='0.29 / W' nrs='0.29 / W'
++ sa=0 sb=0 sd=0 mult=1 m=1
+XR8 GND cur GND sky130_fd_pr__res_high_po_0p35 W=0.35 L=20 mult=1 m=1
+XM1 net2 net1 saw VDD sky130_fd_pr__pfet_g5v0d10v5 L=0.8 W=2 nf=1 ad='int((nf+1)/2) * W/nf * 0.29' as='int((nf+2)/2) * W/nf * 0.29'
++ pd='2*int((nf+1)/2) * (W/nf + 0.29)' ps='2*int((nf+2)/2) * (W/nf + 0.29)' nrd='0.29 / W' nrs='0.29 / W'
++ sa=0 sb=0 sd=0 mult=1 m=1
+XM2 net2 net2 GND GND sky130_fd_pr__nfet_g5v0d10v5 L=0.8 W=2 nf=1 ad='int((nf+1)/2) * W/nf * 0.29' as='int((nf+2)/2) * W/nf * 0.29'
++ pd='2*int((nf+1)/2) * (W/nf + 0.29)' ps='2*int((nf+2)/2) * (W/nf + 0.29)' nrd='0.29 / W' nrs='0.29 / W'
++ sa=0 sb=0 sd=0 mult=1 m=1
+XM4 net1 net2 GND GND sky130_fd_pr__nfet_g5v0d10v5 L=0.8 W=2 nf=1 ad='int((nf+1)/2) * W/nf * 0.29' as='int((nf+2)/2) * W/nf * 0.29'
++ pd='2*int((nf+1)/2) * (W/nf + 0.29)' ps='2*int((nf+2)/2) * (W/nf + 0.29)' nrd='0.29 / W' nrs='0.29 / W'
++ sa=0 sb=0 sd=0 mult=1 m=1
+XR3 net1 VDD GND sky130_fd_pr__res_high_po_0p35 W=0.35 L=20 mult=1 m=1
+XR4 GND net1 GND sky130_fd_pr__res_high_po_0p35 W=0.35 L=20 mult=1 m=1
+XC2 saw GND GND sky130_fd_pr__cap_var_lvt W=0.5 L=0.5 VM=1
+**** begin user architecture code
+
+
+.model BSS84 VDMOS(pchan Rg=3 Vto=-2.1 Rd=2.4 Rs=1.8 Rb=3 Kp=.2 Cgdmax=.04n Cgdmin=.001n Cgs=.02n
++ Cjo=.01n Is=2p mfg=Philips Vds=-50 Ron=6000m Qg=1n)
+.model 2N7002 VDMOS(Rg=3 Vto=1.6 Rd=0 Rs=.75 Rb=.14 Kp=.17 mtriode=1.25 Cgdmax=80p Cgdmin=12p
++ Cgs=50p Cjo=50p Is=.04p mfg=Fairchild Vds=60 Ron=2 Qg=1.5n)
+
+
+.model 2N3904 NPN(IS=1E-14 VAF=100 Bf=300 IKF=0.4 XTB=1.5 BR=4 CJC=4E-12 CJE=8E-12 RB=20 RC=0.1
++ RE=0.1 TR=250E-9 TF=350E-12 ITF=1 VTF=2 XTF=3 Vceo=40 Icrating=200m mfg=Philips)
+
+.model 2N3906 PNP(IS=1E-14 VAF=100 BF=200 IKF=0.4 XTB=1.5 BR=4 CJC=4.5E-12 CJE=10E-12 RB=20
++ RC=0.1 RE=0.1 TR=250E-9 TF=350E-12 ITF=1 VTF=2 XTF=3 Vceo=40 Icrating=200m mfg=Philips)
+
+//.include /usr/share/pdk/sky130A/libs.ref/sky130_fd_pr/spice/sky130_fd_pr__nfet_g5v0d10v5.pm3.spice
+//.include /usr/share/pdk/sky130A/libs.ref/sky130_fd_pr/spice/sky130_fd_pr__res_high_po_0p35.model.spice
+
+.lib /usr/share/pdk/sky130A/libs.tech/ngspice/sky130.lib.spice tt
+.include /usr/share/pdk/sky130A/libs.ref/sky130_fd_sc_hvl/spice/sky130_fd_sc_hvl.spice
+
+
+.ic V(saw)=0
+.control
+tran 10n 200u
+plot V(saw) V(cur)
+//V(Vt) V(vd)
+//plot V(vd)
+//plot I(Vb)
+.endc
+
+**** end user architecture code
+**.ends
+.GLOBAL VDD
+.GLOBAL GND
+.GLOBAL VEE
+** flattened .save nodes
+.end