prologues := 3; GNL = 20; GAL = 46; GH = 20; GTH = 30; SP = 10; % ========= OR GATE =========== def gate_or(expr gox, goy) = pair GOe; numeric gos, wt, ht, il; save gos, wt, ht, il; wt = 25; ht = 15; il = 10; gos = gox + il; GOe = (gos+wt, goy+5); draw (gox, goy)--(gox+il+5-.3, goy); draw (gox, goy+10)--(gox+il+5-.3, goy+10); draw (gos, goy-5)..(gos + 6, ypart GOe)..(gos, goy+ht); draw (gos, goy-5)--(gos + 10, goy-5)..(gos + 11, goy-5)..GOe; draw (gos, goy+ht)--(gos + 10, goy+ht)..(gos + 11, goy+ht)..GOe; draw GOe--(xpart GOe + il, ypart GOe); GOe := (gos+wt+il, goy+5); enddef; % ========= XOR GATE ========== def gate_xor(expr gx, gy) = numeric GXORe, gos, wt, ht, il, ym; save gos, wt, ht, il; wt = 25; ht = 15; il = 10; gos = gx + il; GXORe = gos + wt; ym = gy + 5; draw (gx, gy)--(gx + il + 4-.2, gy); draw (gx, gy + 10)--(gx + il + 4-.2, gy + 10); draw (gos - 3, gy - 5)..(gos + 2, ym)..(gos - 3, gy + ht); draw (gos, gy - 5)..(gos + 5, ym)..(gos, gy + ht); draw (gos, gy - 5)--(gos + 10, gy - 5)..(gos + 11, gy - 5)..(GXORe, ym); draw (gos, gy + ht)--(gos + 10, gy + ht)..(gos + 11, gy + ht)..(GXORe, ym); draw (GXORe, ym)--(GXORe + il, ym); GXORe := GXORe + il; enddef; % ========= AND GATE =========== def gate_and(expr gax, gay) = numeric il, ht, wt, gs, gr, gy, gh, md, GAe; ht = 20; il = 10; gs = gax + il; gr = 15; wt = gr + 10; gy = gay - 5; gh = gy + ht; md = gy + ht/2; draw (gax, gay)-- (gs, gay); draw (gax, gay + 10)--(gs, gay + 10); draw (gs, gy)--(gs, gh); draw (gs, gy)--(gs + gr, gy)..(gs + wt, md-1).. (gs + gr, gh)--(gs, gh); gs := gs + wt; draw (gs, md)--(gs + il, md); GAe = gs + il; enddef; % ========= NOT GATE =========== def gate_not(expr gnx, gny) = numeric il, sz, wd, gns, GNe; save il, gns; il = 10; sz = 6; wd = 10; gns = gnx; draw (gns, gny)--(gns+il, gny); gns := gns + il; GNe = gns + wd; draw (gns, gny-sz)--(gns, gny+sz)--(GNe, gny)--(gns, gny-sz); draw (GNe, gny)..(GNe+3, gny)..(GNe, gny); il := il - 3; draw (GNe+3, gny)--(GNe+il, gny); GNe := GNe + il; enddef; % ======== TRIPLE AND ========= def gate_tand(expr gx, gy) = numeric il, ht, wt, gs, gr, gh, md, GTAe; ht = 30; il = 10; gs = gx + il; gr = 20; wt = gr + 15; gh = gy + ht; md = gy + ht/2; draw (gx, gy+5)-- (gs, gy+5); draw (gx, gy+15)--(gs, gy+15); draw (gx, gy+25)--(gs, gy+25); draw (gs, gy)--(gs, gh); draw (gs, gy)--(gs + gr, gy)..(gs + wt, md-1).. (gs + gr, gh)--(gs, gh); gs := gs + wt; draw (gs, md)--(gs + il, md); GTAe = gs + il; enddef; % ======== TRIPLE OR ========= def gate_tor(expr gox, goy) = numeric gx, gy, wt, ht, il, gs, gr, gc, gh, md, GTOe; gx = gox; gy = goy - 5; ht = 30; il = 10; gs = gx + il; gc = 7; gr = 10; wt = gr + 25; gh = gy + ht; md = gy + ht/2; draw (gx, gy + 5)-- (gs + 4, gy + 5); draw (gx, gy + 15)--(gs + 7, gy + 15); draw (gx, gy + 25)--(gs + 4, gy + 25); draw (gs, gy)..(gs + gc, md)..(gs, gh); draw (gs, gy)--(gs + gr, gy)..(gs + gr + 2, gy)..(gs + wt, md); draw (gs, gh)--(gs + gr, gh)..(gs + gr + 2, gh)..(gs + wt, md); gs := gs + wt; draw (gs, md)--(gs + il, md); GTOe = gs + il; enddef; % ============================== % ============================== % ======== TRIPLE INPUT ======== outputtemplate := "nora.eps"; beginfig(5) numeric wt, ht, il, gs, gr, gc; ht = 30; il = 15; gs = il; gc = 7; gr = 10; wt = gr + 25; label.lft(btex $z$ etex, (0, 5)); label.lft(btex $y$ etex, (0, 15)); label.lft(btex $x$ etex, (0, 25)); draw (0, 5)--(il+4, 5); draw (0, 15)--(il+7, 15); draw (0, 25)--(il+4, 25); draw (gs, 0)..(gs + gc, ht/2)..(gs, ht); draw (gs, 0)--(gs + gr, 0)..(gs + gr + 2, 0)..(gs + wt, ht/2); draw (gs, ht)--(gs + gr, ht)..(gs + gr + 2, ht)..(gs + wt, ht/2); gs := gs + wt; draw (gs, ht/2)..(gs + 3, ht/2)..(gs, ht/2); il := il - 3; gs := gs + 3; draw (gs, ht/2)--(gs + il, ht/2); label.rt(btex $(x+y+z)'$ etex, (gs + il, ht/2)); endfig; % ================= outputtemplate := "norb.eps"; beginfig(6) numeric wt, ht, il, gs, gr; ht = 30; il = 12; gs = 15; gr = 20; wt = gr + 15; label.lft(btex $z$ etex, (0, 0)); label.lft(btex $y$ etex, (0, 10)); label.lft(btex $x$ etex, (0, 20)); draw (0, 0)--(il, 0); draw (il, 0)..(il+3, 0)..(il, 0); draw (0, 10)--(il, 10); draw (il, 10)..(il+3, 10)..(il, 10); draw (0, 20)--(il, 20); draw (il, 20)..(il+3, 20)..(il, 20); draw (gs, -5)--(gs, ht-5); draw (gs, -5)--(gs + gr, -5)..(gs + gr + 1, -5)..(gs + wt, 10); draw (gs, 25)--(gs + gr, 25)..(gs + gr + 1, 25)..(gs + wt, 10); gs := gs + wt; il := il + 3; draw (gs, ht/2-5)--(gs + il, ht/2-5); label.rt(btex $x'y'z'=(x+y+z)'$ etex, (gs+il, ht/2-5)); endfig; % ================= outputtemplate := "nanda.eps"; beginfig(7); numeric il, ht, wt, gs, gr; ht = 30; il = 15; gs = il; gr = 20; wt = gr + 15; label.lft(btex $z$ etex, (0, 5)); label.lft(btex $y$ etex, (0, 15)); label.lft(btex $x$ etex, (0, 25)); draw (0, 5)--(il, 5); draw (0, 15)--(il, 15); draw (0, 25)--(il, 25); draw (gs, 0)--(gs, ht); draw (gs, 0)--(gs + gr, 0)..(gs + wt, ht/2-1).. (gs + gr, ht)--(gs, ht); gs := gs + wt; draw (gs, ht/2)..(gs + 3, ht/2)..(gs, ht/2); gs := gs + 3; il := il - 3; draw (gs, ht/2)--(gs + il, ht/2); label.rt(btex $(xyz)'$ etex, (gs + il, ht/2)); endfig; % ================= outputtemplate := "nandb.eps"; beginfig(8) numeric wt, ht, il, gs, gr, gc; ht = 30; il = 12; gs = il; gc = 7; gr = 10; wt = gr + 25; label.lft(btex $z$ etex, (0, 5)); label.lft(btex $y$ etex, (0, 15)); label.lft(btex $x$ etex, (0, 25)); draw (0, 5)--(il+4, 5)..(il+4 + 3, 5)..(il+4, 5); draw (0, 15)--(il+7, 15)..(il+7 + 3, 15)..(il+7, 15); draw (0, 25)--(il+4, 25)..(il+4 + 3, 25)..(il+4, 25); gs := gs + 3; draw (gs, 0)..(gs + gc, ht/2)..(gs, ht); draw (gs, 0)--(gs + gr, 0)..(gs + gr + 2, 0)..(gs + wt, ht/2); draw (gs, ht)--(gs + gr, ht)..(gs + gr + 2, ht)..(gs + wt, ht/2); gs := gs + wt; il := il + 3; draw (gs, ht/2)--(gs + il, ht/2); label.rt(btex $x'+y'+z' = (xyz)'$ etex, (gs + il, ht/2)); endfig; % ================================ % LOGIC DIAGRAMS % ================================ outputtemplate := "ld3.eps"; beginfig(4); pair FX, FY, FZ; numeric hs; hs := 5; FZ := (0, 0); FY := (0, hs*3); FX := (0, ypart FY*2); draw FY--(5, ypart FY); gate_not(5, ypart FY); draw (GNe, ypart FY)--(GNe+10, ypart FY); draw FZ--(GNe+5, 0)--(GNe+5, hs)--(GNe+10, hs); gate_and(GNe+10, hs); draw (GAe, hs+5)--(GAe+10, hs*2); draw FX--(GAe, ypart FX)--(GAe, ypart FX-10)--(GAe+10, ypart FX-10); gate_or(GAe+10, hs*2); label.lft(btex $z$ etex, FZ); label.lft(btex $y$ etex, FY); label.lft(btex $x$ etex, FX); label.lft(btex $F$ etex, (xpart GOe + 12, ypart GOe)); endfig; % =============== outputtemplate := "ld6a.eps"; beginfig(9) numeric a, b, c, t, ga, gb, lb; c = 85; b = c + 10; a = b + 10; gb = 40; lb = 75; label.lft(btex $A$ etex, (0, a)); label.lft(btex $B$ etex, (0, b)); label.lft(btex $C$ etex, (0, c)); draw (0, c)--(lb, c); draw (0, b)--(lb, b); draw (0, a)--(lb, a); gate_tand(lb, c - 5); t := 20; drawdot (t, c) withpen pencircle scaled 3pt; draw (t, c)--(t, 5); drawdot (t, gb) withpen pencircle scaled 3pt; draw (t, gb)--(t + 10, gb); gate_not(t + 10, gb); drawdot (lb - 5, a) withpen pencircle scaled 3pt; draw (lb - 5, a)--(lb - 5, gb + 20)--(lb, gb + 20); drawdot (lb - 15, b) withpen pencircle scaled 3pt; draw (lb - 15, b)--(lb - 15, gb + 10)--(lb, gb + 10); draw (GNe, gb)--(lb, gb); gate_tand(lb, gb - 5); drawdot (t + 10, a) withpen pencircle scaled 3pt; draw (t + 10, a)--(t + 10, GH - 5); gate_not(t + 10, GH - 5); draw (GNe, GH - 5)--(lb, GH - 5); draw (t, 5)--(lb, 5); gate_and(lb, 5); draw (GTAe, b)--(GTAe, gb + 20)--(GTAe + 5, gb + 20); draw (GTAe, gb + 10)--(GTAe + 5, gb + 10); draw (GAe, 10)--(GAe + 10, 10)--(GAe + 10, gb)--(GAe + 15, gb); gate_tor(GTAe + 5, gb); label.rt(btex $F$ etex, (GTOe, gb + 10)); endfig; % =============== outputtemplate := "ld6b.eps"; beginfig(10) numeric FA, FB, FC, tmp; FC = 0; FB = 40; FA = FB + 10; label.lft(btex $C$ etex, (0, FC)); label.lft(btex $B$ etex, (0, FB)); label.lft(btex $A$ etex, (0, FA)); tmp := 30; draw (0, FA)--(tmp, FA); draw (0, FB)--(tmp, FB); drawdot (10, FA) withpen pencircle scaled 3pt; draw (10, FA)--(10, 10)--(15, 10); gate_not(15, 10); draw (0, FC)--(GNe, 0); gate_and(GNe, 0); draw (tmp, FA)--(GNe, FA); draw (tmp, FB)--(GNe, FB); gate_and(GNe, FB); draw (GAe, FB + 5)--(GAe, FB - 10)--(GAe + 5, FB - 10); draw (GAe, 5)--(GAe, 20)--(GAe + 5, 20); gate_or(GAe + 5, 20); label.rt(btex $F$ etex, GOe); endfig; % =============== outputtemplate := "half-adder.eps"; beginfig(11) numeric px, py, ln, ht; py = 2*GH; px = py + 10; ln = 50; ht = 40; label.lft(btex $y$ etex, (0, py)); label.lft(btex $x$ etex, (0, px)); draw (0, py)--(ln, py); draw (0, px)--(ln, px); gate_xor(ln, py); drawdot(20, py) withpen pencircle scaled 2pt; drawdot(30, px) withpen pencircle scaled 2pt; draw (20, py)--(20, 0)--(ln, 0); draw (30, px)--(30, 10)--(ln, 10); gate_and(ln, 0); label.rt(btex $S$ etex, (GAe, py + 5)); label.rt(btex $C$ etex, (GAe, 5)); endfig; outputtemplate := "full-adder.eps"; beginfig(11) numeric pz, py, ln, tp; pz = GH + SP; py = pz + GH; ln = 30; label.lft(btex $z$ etex, (0, pz)); label.lft(btex $y$ etex, (0, py)); label.lft(btex $x$ etex, (0, py + 10)); draw(0, py)--(ln, py); draw(0, py + 10)--(ln, py + 10); gate_xor(ln, py); tp := GXORe + 10; draw(GXORe, py + 5)--(tp, py + 5); draw(0, pz)--(tp, pz); drawdot(tp, pz) withpen pencircle scaled 2pt; draw(tp, pz)--(tp, py - 5); gate_xor(tp, py - 5); drawdot(tp - 10, py + 5) withpen pencircle scaled 2pt; draw(tp - 10, py + 5)--(tp - 10, pz - 10)--(tp, pz - 10); gate_and(tp, pz - 10); draw(GAe, pz - 5)--(GAe, 15); drawdot(15, py) withpen pencircle scaled 2pt; drawdot(25, py + 10) withpen pencircle scaled 2pt; draw(15, py)--(15, 0)--(ln, 0); draw(25, py + 10)--(25, 10)--(ln, 10); gate_and(ln, 0); draw(GAe, 5)--(GXORe, 5); gate_or(GXORe, 5); endfig; end