Logic Gates

Logic gate definitions are in the schemdraw.logic module. Here it was imported with

from schemdraw import logic

Half Adder

Notice the half and full adders set the drawing unit to 0.5 so the lines aren’t quite as long and look better with logic gates.

../_images/logicgate_1_0.svg
d = schemdraw.Drawing(unit=.5)
S = d.add(logic.Xor(rgtlabel='$S$'))
A = d.add(logic.Dot(xy=S.in1))
d.add(logic.Line('left', l=d.unit*2, lftlabel='$A$'))
d.add(logic.Line('left', xy=S.in2))
B = d.add(logic.Dot)
d.add(logic.Line('left', lftlabel='$B$'))

d.add(logic.Line('down', xy=A.start, l=d.unit*3))
C = d.add(logic.And('right', anchor='in1', rgtlabel='$C$'))
d.add(logic.Line('down', xy=B.start, toy=C.in2))
d.add(logic.Line(to=C.in2))
d.draw()

Full Adder

../_images/logicgate_2_0.svg
d = schemdraw.Drawing(unit=.5)
X1 = d.add(logic.Xor)
d.add(logic.Dot)
A = d.add(logic.Dot(xy=X1.in1))
Ain = d.add(logic.Line('left', l=d.unit*2, lftlabel='$A$'))
d.add(logic.Line('left', xy=X1.in2))
B = d.add(logic.Dot)
d.add(logic.Line('left', lftlabel='$B$'))

d.add(logic.Line('right', xy=X1.out, l=d.unit))
X2 = d.add(logic.Xor(anchor='in1'))
C = d.add(logic.Line('down', xy=X2.in2, l=d.unit*2))
d.push()
d.add(logic.Dot(xy=C.center))
d.add(logic.Line('left', tox=Ain.end, lftlabel='$C_{in}$'))
d.pop()

A1 = d.add(logic.And('right', anchor='in1'))
d.add(logic.Line('left', xy=A1.in2, tox=X1.out))
d.add(logic.Line('up', toy=X1.out))
A2 = d.add(logic.And('right', anchor='in1', xy=[A1.in1[0],A1.in2[1]-d.unit*2]))
d.add(logic.Line('left', xy=A2.in1, tox=A.start))
d.add(logic.Line('up', toy=A.start))
d.add(logic.Line('left', xy=A2.in2, tox=B.start))
d.add(logic.Line('up', toy=B.start))

O1 = d.add(logic.Or('right', xy=[A1.out[0],(A1.out[1]+A2.out[1])/2], rgtlabel='$C_{out}$'))
d.add(logic.Line('down', xy=A1.out, toy=O1.in1))
d.add(logic.Line('up', xy=A2.out, toy=O1.in2))
d.add(logic.Line('right', xy=X2.out, tox=O1.out, rgtlabel='$S$'))
d.draw()

J-K Flip Flop

Note the use of the LaTeX command overline{Q} in the label to draw a bar over the inverting output label.

../_images/logicgate_3_0.svg
d = schemdraw.Drawing()
# Two front gates (SR latch)
G1 = d.add(logic.Nand(anchor='in1'))
d.add(logic.Line(l=d.unit/6))
Q1 = d.add(logic.Dot)
d.add(logic.Line(l=d.unit/6))
Q2 = d.add(logic.Dot)
d.add(logic.Line(l=d.unit/3, rgtlabel='$Q$'))
G2 = d.add(logic.Nand(anchor='in1', xy=[G1.in1[0],G1.in1[1]-2.5]))
d.add(logic.Line(l=d.unit/6))
Qb = d.add(logic.Dot)
d.add(logic.Line(l=d.unit/3))
Qb2 = d.add(logic.Dot)
d.add(logic.Line(l=d.unit/6, rgtlabel='$\overline{Q}$'))
S1 = d.add(logic.Line(xy=G2.in1, d='up', l=d.unit/6))
d.add(logic.Line('down', xy=Q1.start, l=d.unit/6))
d.add(logic.Line(to=S1.end))
R1 = d.add(logic.Line('down', xy=G1.in2, l=d.unit/6))
d.add(logic.Line('up', xy=Qb.start, l=d.unit/6))
d.add(logic.Line(to=R1.end))

# Two back gates
d.add(logic.Line('left', xy=G1.in1, l=d.unit/6))
J = d.add(logic.Nand(inputs=3, anchor='out', reverse=True))
d.add(logic.Line('up', xy=J.in3, l=d.unit/6))
d.add(logic.Line('right', tox=Qb2.start))
d.add(logic.Line('down', toy=Qb2.start))
d.add(logic.Line('left', xy=J.in2, l=d.unit/4, lftlabel='$J$'))
d.add(logic.Line('left', xy=G2.in2, l=d.unit/6))
K = d.add(logic.Nand(inputs=3, anchor='out', reverse=True))
d.add(logic.Line('down', xy=K.in1, l=d.unit/6))
d.add(logic.Line('right', tox=Q2.start))
d.add(logic.Line('up', toy=Q2.start))
d.add(logic.Line('left', xy=K.in2, l=d.unit/4, lftlabel='$K$'))
C = d.add(logic.Line('down', xy=J.in1, toy=K.in3))
d.add(logic.Dot(xy=C.center))
d.add(logic.Line('left', xy=C.center, l=d.unit/4, lftlabel='$CLK$'))
d.draw()

S-R Latch (Gates)

../_images/logicgate_4_0.svg
d = schemdraw.Drawing()
d.add(logic.Line(l=d.unit/4, lftlabel='$R$'))
G1 = d.add(logic.Nor(anchor='in1'))
d.add(logic.Line(l=d.unit/4))
Q = d.add(logic.Dot)
d.add(logic.Line(l=d.unit/4, rgtlabel='$Q$'))

G2 = d.add(logic.Nor(anchor='in1', xy=[G1.in1[0],G1.in1[1]-2.5]))
d.add(logic.Line(l=d.unit/4))
Qb = d.add(logic.Dot)
d.add(logic.Line(l=d.unit/4, rgtlabel='$\overline{Q}$'))
S1 = d.add(logic.Line('up', xy=G2.in1, l=d.unit/6))
d.add(logic.Line('down', xy=Q.start, l=d.unit/6))
d.add(logic.Line(to=S1.end))
R1 = d.add(logic.Line('down', xy=G1.in2, l=d.unit/6))
d.add(logic.Line('up', xy=Qb.start, l=d.unit/6))
d.add(logic.Line(to=R1.end))
d.add(logic.Line('left', xy=G2.in2, l=d.unit/4, lftlabel='$S$'))
d.draw()