Tapeout candidate
diff --git a/amsat_txrx_ic b/amsat_txrx_ic
index c8a7cef..0ea37f8 160000
--- a/amsat_txrx_ic
+++ b/amsat_txrx_ic
@@ -1 +1 @@
-Subproject commit c8a7cefdd3930346ca9f74f1b72cdfaf730fc17b
+Subproject commit 0ea37f8e9c91c4e9a5ae424d4d9962ad8846958b
diff --git a/gds/user_analog_project_wrapper.gds b/gds/user_analog_project_wrapper.gds
index a62c6e5..3cc77a2 100644
--- a/gds/user_analog_project_wrapper.gds
+++ b/gds/user_analog_project_wrapper.gds
Binary files differ
diff --git a/xschem/dac_curr_mult/dac_curr_mult.sch b/xschem/dac_curr_mult/dac_curr_mult.sch
new file mode 100644
index 0000000..435cbc3
--- /dev/null
+++ b/xschem/dac_curr_mult/dac_curr_mult.sch
@@ -0,0 +1,155 @@
+v {xschem version=2.9.9 file_version=1.2 }
+G {}
+K {}
+V {}
+S {}
+E {}
+N 710 -140 710 0 { lab=vss}
+N 690 -110 690 0 { lab=vss}
+N 690 -140 710 -140 { lab=vss}
+N 1070 -160 1070 0 { lab=vss}
+N 1050 -130 1050 0 { lab=vss}
+N 1050 -160 1070 -160 { lab=vss}
+N 580 -140 650 -140 { lab=in_p}
+N 250 -140 270 -140 { lab=vss}
+N 250 -140 250 0 { lab=vss}
+N 270 -110 270 0 { lab=vss}
+N 270 -200 270 -170 { lab=in_p}
+N 270 -200 370 -200 { lab=in_p}
+N 370 -200 370 -140 { lab=in_p}
+N 210 -240 930 -240 { lab=in_n}
+N 930 -240 930 -160 { lab=in_n}
+N 930 -160 1010 -160 { lab=in_n}
+N 110 -300 110 -270 { lab=in_n}
+N 110 -300 210 -300 { lab=in_n}
+N 210 -300 210 -240 { lab=in_n}
+N 110 -210 110 0 { lab=vss}
+N 90 -240 110 -240 { lab=vss}
+N 90 -240 90 0 { lab=vss}
+N 1050 0 1070 0 { lab=vss}
+N 690 0 710 0 { lab=vss}
+N 600 0 690 0 { lab=vss}
+N 950 0 1050 0 { lab=vss}
+N 110 0 250 0 { lab=vss}
+N 250 0 270 0 { lab=vss}
+N 310 -140 370 -140 { lab=in_p}
+N 150 -240 210 -240 { lab=in_n}
+N 90 0 110 0 { lab=vss}
+N 270 -400 270 -200 { lab=in_p}
+N 110 -360 110 -300 { lab=in_n}
+N 0 -360 110 -360 { lab=in_n}
+N 0 -400 270 -400 { lab=in_p}
+N 1050 -320 1120 -320 { lab=out_n}
+N 580 -30 580 0 { lab=vss}
+N 580 -60 600 -60 { lab=vss}
+N 600 -60 600 0 { lab=vss}
+N 930 -30 930 0 { lab=vss}
+N 930 -60 950 -60 { lab=vss}
+N 950 -60 950 0 { lab=vss}
+N 580 -140 580 -90 { lab=in_p}
+N 930 -160 930 -90 { lab=in_n}
+N -0 0 90 0 { lab=vss}
+N 0 -500 20 -500 { lab=en}
+N 270 0 580 0 { lab=vss}
+N 580 0 600 0 { lab=vss}
+N 710 0 930 0 { lab=vss}
+N 930 0 950 0 { lab=vss}
+N 370 -140 580 -140 { lab=in_p}
+N 1050 -320 1050 -190 { lab=out_n}
+N 690 -340 690 -170 { lab=out_p}
+N 690 -340 1120 -340 { lab=out_p}
+C {sky130_fd_pr/nfet_01v8_lvt.sym} 670 -140 0 0 {name=Mcurr_p
+L=1.00
+W=10
+nf=2
+mult=9
+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_01v8_lvt
+spiceprefix=X
+}
+C {sky130_fd_pr/nfet_01v8_lvt.sym} 1030 -160 0 0 {name=Mcurr_n
+L=1.00
+W=10
+nf=2
+mult=9
+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_01v8_lvt
+spiceprefix=X
+}
+C {sky130_fd_pr/nfet_01v8_lvt.sym} 130 -240 0 1 {name=Mmirror_n
+L=1.00
+W=10
+nf=2
+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_01v8_lvt
+spiceprefix=X
+}
+C {sky130_fd_pr/nfet_01v8_lvt.sym} 290 -140 0 1 {name=Mmirror_p
+L=1.00
+W=10
+nf=2
+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_01v8_lvt
+spiceprefix=X
+}
+C {ipin.sym} 0 -360 0 0 {name=p1 lab=in_n}
+C {ipin.sym} 0 -400 0 0 {name=p2 lab=in_p}
+C {sky130_fd_pr/nfet_01v8.sym} 560 -60 0 0 {name=Men_b
+L=0.15
+W=0.42
+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_01v8
+spiceprefix=X
+}
+C {lab_pin.sym} 540 -60 0 0 {name=l8 sig_type=std_logic lab=en_n}
+C {sky130_fd_pr/nfet_01v8.sym} 910 -60 0 0 {name=Men_c
+L=0.15
+W=0.42
+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_01v8
+spiceprefix=X
+}
+C {lab_pin.sym} 890 -60 0 0 {name=l9 sig_type=std_logic lab=en_n}
+C {iopin.sym} 0 0 0 1 {name=p4 lab=vss}
+C {iopin.sym} -10 -600 0 1 {name=p5 lab=vdd}
+C {opin.sym} 1120 -340 0 0 {name=p6 lab=out_p}
+C {opin.sym} 1120 -320 0 0 {name=p7 lab=out_n}
+C {sky130_stdcells/inv_1.sym} 60 -500 0 0 {name=x2 VGND=vss VNB=vss VPB=vdd VPWR=vdd prefix=sky130_fd_sc_hs__ }
+C {lab_wire.sym} 100 -500 0 1 {name=l13 sig_type=std_logic lab=en_n}
+C {ipin.sym} 0 -500 0 0 {name=p8 lab=en}
diff --git a/xschem/dac_curr_mult/dac_curr_mult.sym b/xschem/dac_curr_mult/dac_curr_mult.sym
new file mode 100644
index 0000000..c70397b
--- /dev/null
+++ b/xschem/dac_curr_mult/dac_curr_mult.sym
@@ -0,0 +1,36 @@
+v {xschem version=2.9.9 file_version=1.2 }
+G {}
+K {type=subcircuit
+format="@name @pinlist @symname"
+template="name=x1"
+}
+V {}
+S {}
+E {}
+L 4 -80 -60 80 -60 {}
+L 4 -80 60 80 60 {}
+L 4 -80 -60 -80 60 {}
+L 4 80 -60 80 60 {}
+L 4 -100 -40 -80 -40 {}
+L 4 -100 -10 -80 -10 {}
+L 4 -100 10 -80 10 {}
+L 4 80 -10 100 -10 {}
+L 4 80 10 100 10 {}
+L 7 0 -80 0 -60 {}
+L 7 0 60 0 80 {}
+B 5 -2.5 -82.5 2.5 -77.5 {name=vdd dir=inout }
+B 5 -102.5 -42.5 -97.5 -37.5 {name=en dir=in }
+B 5 -102.5 -12.5 -97.5 -7.5 {name=in_p dir=in }
+B 5 -102.5 7.5 -97.5 12.5 {name=in_n dir=in }
+B 5 97.5 -12.5 102.5 -7.5 {name=out_p dir=out }
+B 5 97.5 7.5 102.5 12.5 {name=out_n dir=out }
+B 5 -2.5 77.5 2.5 82.5 {name=vss dir=inout }
+T {@symname} 19 84 0 0 0.3 0.3 {}
+T {@name} 25 68 0 0 0.2 0.2 {}
+T {vdd} 6 -55 0 1 0.2 0.2 {}
+T {en} -75 -44 0 0 0.2 0.2 {}
+T {in_p} -75 -14 0 0 0.2 0.2 {}
+T {in_n} -75 6 0 0 0.2 0.2 {}
+T {out_p} 75 -14 0 1 0.2 0.2 {}
+T {out_n} 75 6 0 1 0.2 0.2 {}
+T {vss} -6 55 2 1 0.2 0.2 {}
diff --git a/xschem/user_analog_project_wrapper.sch b/xschem/user_analog_project_wrapper.sch
index ada70a0..b6d4bfc 100644
--- a/xschem/user_analog_project_wrapper.sch
+++ b/xschem/user_analog_project_wrapper.sch
@@ -4,33 +4,50 @@
V {}
S {}
E {}
-N 0 -0 840 0 { lab=vssd2}
-N 840 -130 840 0 { lab=vssa1}
+N 490 0 940 0 { lab=vssa1}
+N 940 -130 940 0 { lab=vssa1}
N 490 -470 490 0 { lab=vssa1}
N -0 -20 40 -20 { lab=vssd1}
N 40 -20 40 0 { lab=vssa1}
-N 40 -80 40 -20 { lab=vssa1}
+N 40 -60 40 -20 { lab=vssa1}
N -0 -80 40 -80 { lab=vssa1}
N -0 -60 40 -60 { lab=vssa2}
-N 470 -800 470 -630 { lab=vdda2}
-N 0 -800 470 -800 { lab=vdda2}
-N 820 -800 820 -290 { lab=vdda2}
-N 470 -800 820 -800 { lab=vdda2}
-N 860 -840 860 -290 { lab=vdda1}
-N 860 -860 860 -840 { lab=vdda1}
-N 0 -860 860 -860 { lab=vccd1}
N 0 -840 40 -840 { lab=vccd2}
-N 40 -860 40 -840 { lab=vdda1}
-N 0 -820 40 -820 { lab=vdda1}
-N 40 -840 40 -820 { lab=vdda1}
-N 510 -860 510 -630 { lab=vdda1}
-N 980 -230 1140 -230 { lab=#net1}
-N 980 -190 1140 -190 { lab=#net2}
-N 1290 -860 1290 -270 { lab=vdda1}
-N 860 -860 1290 -860 { lab=vdda1}
-N 1290 -50 1290 0 { lab=vssa1}
-N 840 0 1290 0 { lab=vssa1}
-N 260 -860 260 -760 { lab=vdda1}
+N 40 -860 40 -840 { lab=vccd1}
+N 510 -860 510 -630 { lab=vccd1}
+N 1580 -860 1580 -270 { lab=vccd1}
+N 1260 -860 1580 -860 { lab=vccd1}
+N 1580 -50 1580 0 { lab=vssa1}
+N 1260 0 1580 0 { lab=vssa1}
+N 630 -570 1130 -570 { lab=bias[10]}
+N 1130 -570 1130 -560 { lab=bias[10]}
+N 1130 -560 1160 -560 { lab=bias[10]}
+N 630 -530 1130 -530 { lab=bias[11]}
+N 1130 -540 1130 -530 { lab=bias[11]}
+N 1130 -540 1160 -540 { lab=bias[11]}
+N 1260 -860 1260 -630 { lab=vccd1}
+N 1360 -540 1660 -540 { lab=io_analog[0]}
+N 1360 -560 1660 -560 { lab=io_analog[1]}
+N 1260 -470 1260 0 { lab=vssa1}
+N 470 -860 470 -630 { lab=vccd1}
+N 40 0 490 0 { lab=vssa1}
+N 0 -0 40 0 { lab=vssd2}
+N 40 -80 40 -60 { lab=vssa1}
+N 0 -860 40 -860 { lab=vccd1}
+N 470 -860 510 -860 { lab=vccd1}
+N 40 -860 260 -860 { lab=vccd1}
+N 960 -860 1260 -860 { lab=vccd1}
+N 940 0 1260 0 { lab=vssa1}
+N 720 -860 920 -860 { lab=vccd1}
+N 260 -860 470 -860 { lab=vccd1}
+N 720 -860 720 -790 { lab=vccd1}
+N 260 -860 260 -790 { lab=vccd1}
+N 1080 -230 1430 -230 { lab=#net1}
+N 960 -860 960 -290 { lab=vccd1}
+N 920 -860 920 -290 { lab=vccd1}
+N 1080 -190 1430 -190 { lab=#net2}
+N 510 -860 720 -860 { lab=vccd1}
+N 920 -860 960 -860 { lab=vccd1}
C {devices/iopin.sym} 0 -820 0 1 {name=p1 lab=vdda1}
C {devices/iopin.sym} 0 -800 0 1 {name=p2 lab=vdda2}
C {devices/iopin.sym} 0 -80 0 1 {name=p3 lab=vssa1}
@@ -47,40 +64,53 @@
C {devices/ipin.sym} 0 -490 0 0 {name=p14 lab=wbs_sel_i[3:0]}
C {devices/ipin.sym} 0 -460 0 0 {name=p15 lab=wbs_dat_i[31:0]}
C {devices/ipin.sym} 0 -430 0 0 {name=p16 lab=wbs_adr_i[31:0]}
-C {devices/opin.sym} 1720 -420 0 0 {name=p17 lab=wbs_ack_o}
-C {devices/opin.sym} 1720 -400 0 0 {name=p18 lab=wbs_dat_o[31:0]}
+C {devices/opin.sym} 1960 -520 0 0 {name=p17 lab=wbs_ack_o}
+C {devices/opin.sym} 1960 -500 0 0 {name=p18 lab=wbs_dat_o[31:0]}
C {devices/ipin.sym} 0 -320 0 0 {name=p19 lab=la_data_in[127:0]}
-C {devices/opin.sym} 1720 -380 0 0 {name=p20 lab=la_data_out[127:0]}
+C {devices/opin.sym} 1960 -480 0 0 {name=p20 lab=la_data_out[127:0]}
C {devices/ipin.sym} 0 -200 0 0 {name=p21 lab=io_in[26:0]}
C {devices/ipin.sym} 0 -180 0 0 {name=p22 lab=io_in_3v3[26:0]}
C {devices/ipin.sym} 0 -340 0 0 {name=p23 lab=user_clock2}
-C {devices/opin.sym} 1720 -360 0 0 {name=p24 lab=io_out[26:0]}
-C {devices/opin.sym} 1720 -340 0 0 {name=p25 lab=io_oeb[26:0]}
-C {devices/iopin.sym} 1720 -280 0 0 {name=p26 lab=gpio_analog[17:0]}
-C {devices/iopin.sym} 1720 -260 0 0 {name=p27 lab=gpio_noesd[17:0]}
-C {devices/iopin.sym} 1720 -240 0 0 {name=p29 lab=io_analog[10:0]}
-C {devices/iopin.sym} 1720 -220 0 0 {name=p30 lab=io_clamp_high[2:0]}
-C {devices/iopin.sym} 1720 -200 0 0 {name=p31 lab=io_clamp_low[2:0]}
-C {devices/opin.sym} 1720 -160 0 0 {name=p32 lab=user_irq[2:0]}
+C {devices/opin.sym} 1960 -460 0 0 {name=p24 lab=io_out[26:0]}
+C {devices/opin.sym} 1960 -440 0 0 {name=p25 lab=io_oeb[26:0]}
+C {devices/iopin.sym} 1960 -380 0 0 {name=p26 lab=gpio_analog[17:0]}
+C {devices/iopin.sym} 1960 -360 0 0 {name=p27 lab=gpio_noesd[17:0]}
+C {devices/iopin.sym} 1960 -340 0 0 {name=p29 lab=io_analog[10:0]}
+C {devices/iopin.sym} 1960 -320 0 0 {name=p30 lab=io_clamp_high[2:0]}
+C {devices/iopin.sym} 1960 -300 0 0 {name=p31 lab=io_clamp_low[2:0]}
+C {devices/opin.sym} 1960 -260 0 0 {name=p32 lab=user_irq[2:0]}
C {devices/ipin.sym} 0 -300 0 0 {name=p28 lab=la_oenb[127:0]}
-C {dac/dac.sym} 840 -210 0 0 {name=x3}
-C {lab_pin.sym} 690 -240 0 0 {name=l2 sig_type=std_logic lab=io_in[0]}
-C {lab_pin.sym} 690 -160 0 0 {name=l3 sig_type=std_logic lab=io_in[10:1]}
-C {lab_pin.sym} 690 -220 0 0 {name=l4 sig_type=std_logic lab=la_data_in[3]}
-C {lab_pin.sym} 690 -200 0 0 {name=l5 sig_type=std_logic lab=la_data_in[4]}
-C {lab_pin.sym} 690 -180 0 0 {name=l6 sig_type=std_logic lab=la_data_in[5]}
+C {dac/dac.sym} 940 -210 0 0 {name=x3}
+C {lab_pin.sym} 790 -240 0 0 {name=l2 sig_type=std_logic lab=io_in[12]}
+C {lab_pin.sym} 790 -160 0 0 {name=l3 sig_type=std_logic lab=io_in[11:2]}
+C {lab_pin.sym} 790 -220 0 0 {name=l4 sig_type=std_logic lab=la_data_in[3]}
+C {lab_pin.sym} 790 -200 0 0 {name=l5 sig_type=std_logic lab=la_data_in[4]}
+C {lab_pin.sym} 790 -180 0 0 {name=l6 sig_type=std_logic lab=la_data_in[5]}
C {dac/dac.sym} 490 -550 0 0 {name=x1}
-C {lab_pin.sym} 340 -580 0 0 {name=l8 sig_type=std_logic lab=io_in[0]}
-C {lab_pin.sym} 340 -500 0 0 {name=l9 sig_type=std_logic lab=io_in[10:1]}
+C {lab_pin.sym} 340 -580 0 0 {name=l8 sig_type=std_logic lab=io_in[12]}
+C {lab_pin.sym} 340 -500 0 0 {name=l9 sig_type=std_logic lab=io_in[11:2]}
C {lab_pin.sym} 340 -560 0 0 {name=l10 sig_type=std_logic lab=la_data_in[0]}
C {lab_pin.sym} 340 -540 0 0 {name=l11 sig_type=std_logic lab=la_data_in[1]}
C {lab_pin.sym} 340 -520 0 0 {name=l12 sig_type=std_logic lab=la_data_in[2]}
-C {rf_section/rf_section.sym} 1290 -170 0 0 {name=x2}
-C {test_bias/test_bias.sym} 260 -720 0 0 {name=x4[9:0]}
-C {lab_pin.sym} 340 -720 0 1 {name=l13 sig_type=std_logic lab=bias[9:0]}
+C {rf_section/rf_section.sym} 1580 -170 0 0 {name=x2}
+C {test_bias/test_bias.sym} 260 -750 0 0 {name=x4[9:0]}
+C {lab_pin.sym} 340 -750 0 1 {name=l13 sig_type=std_logic lab=bias[9:0]}
C {lab_pin.sym} 340 -600 0 0 {name=l1 sig_type=std_logic lab=bias[9]}
-C {lab_pin.sym} 690 -260 0 0 {name=l7 sig_type=std_logic lab=bias[8]}
-C {lab_pin.sym} 180 -720 0 0 {name=l14 sig_type=std_logic lab=gpio_analog[17:8]}
-C {lab_pin.sym} 1140 -110 0 0 {name=l15 sig_type=std_logic lab=bias[7:0]}
-C {lab_pin.sym} 1140 -150 0 0 {name=l16 sig_type=std_logic lab=gpio_analog[7]}
-C {lab_pin.sym} 1140 -90 0 0 {name=l17 sig_type=std_logic lab=la_data_in[7:6]}
+C {lab_pin.sym} 790 -260 0 0 {name=l7 sig_type=std_logic lab=bias[8]}
+C {lab_pin.sym} 180 -750 0 0 {name=l14 sig_type=std_logic lab=gpio_noesd[17:8]}
+C {lab_pin.sym} 1430 -110 0 0 {name=l15 sig_type=std_logic lab=bias[7:0]}
+C {lab_pin.sym} 1430 -150 0 0 {name=l16 sig_type=std_logic lab=gpio_analog[6]}
+C {lab_pin.sym} 1430 -90 0 0 {name=l17 sig_type=std_logic lab=la_data_in[7:6]}
+C {dac_curr_mult/dac_curr_mult.sym} 1260 -550 0 0 {name=x4}
+C {lab_pin.sym} 1160 -590 0 0 {name=l18 sig_type=std_logic lab=la_data_in[2]}
+C {lab_pin.sym} 1730 -190 0 1 {name=l19 sig_type=std_logic lab=io_analog[2]}
+C {lab_pin.sym} 1730 -210 0 1 {name=l20 sig_type=std_logic lab=io_analog[3]}
+C {lab_pin.sym} 1730 -110 0 1 {name=l21 sig_type=std_logic lab=io_analog[7]}
+C {lab_pin.sym} 1730 -130 0 1 {name=l22 sig_type=std_logic lab=io_analog[8]}
+C {lab_pin.sym} 1660 -540 0 1 {name=l23 sig_type=std_logic lab=io_analog[0]}
+C {lab_pin.sym} 1660 -560 0 1 {name=l24 sig_type=std_logic lab=io_analog[1]}
+C {test_bias/test_bias.sym} 720 -750 0 0 {name=x1[1:0]}
+C {lab_pin.sym} 800 -750 0 1 {name=l25 sig_type=std_logic lab=bias[11:10]}
+C {lab_pin.sym} 640 -750 0 0 {name=l26 sig_type=std_logic lab=gpio_noesd[7]}
+C {lab_wire.sym} 630 -570 0 1 {name=l27 sig_type=std_logic lab=bias[10]}
+C {lab_wire.sym} 630 -530 0 1 {name=l28 sig_type=std_logic lab=bias[11]}