.subckt res a b
.ends

.subckt inv in out vdd vss
Mp out in vss vss nmos
Mn out in vdd vdd pmos
.ends

.subckt nand a b y vdd vss
Mn1 y a n1 vss nmos
Mn2 n1 b vss vss nmos
Mp1 y a vdd vdd pmos
Mp2 y b vdd vdd pmos
.ends

.subckt nor a b y vdd vss
Mn1 y a vss vss nmos
Mn2 y b vss vss nmos
Mp1 y a n1 vdd pmos
Mp2 n1 b vdd vdd pmos
.ends

.subckt ro en out vdd vss
X1 en out net1 vdd vss nand
X2 net1 net2 vdd vss inv
X3 net2 net3 vdd vss inv
X4 net3 net4 vdd vss inv
X5 net4 out vdd vss inv
.ends

.subckt xor a b y vdd vss
Xa a a_bar vdd vss inv
Xb b b_bar vdd vss inv
Mp1 n1 a vdd vdd pmos
Mp2 y b_bar n1 vdd pmos
Mp3 n2 a_bar vdd vdd pmos
Mp4 y b n2 vdd pmos
Mn1 y a n3 vss nmos
Mn2 n3 a_bar vss vss nmos
Mn3 y b_bar n3 vss nmos
Mn4 n3 b vss vss nmos
.ends

.subckt ha a b s c vdd vss
Xs a b s vdd vss xor
Xcbar a b c_bar vdd vss nand
Xc c_bar c vdd vss inv
.ends

.subckt fa a b cin s cout vdd vss
Xcarry cin b n1 vdd vss xor
Xha a n1 s cout vdd vss ha
.ends