prologues := 3; GNL = 20; GAL = 46; % ========= 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 - 5; GOe = (gos+wt, goy+5); draw (gox, goy)--(gox+il-.3, goy); draw (gox, goy+10)--(gox+il-.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; % ========= AND GATE =========== def gate_and(expr gax, gay) = numeric GAh, GAl, GAs; GAh := 20; GAl := 10; GAe := gax+36; GAs := gax+GAl; draw (GAs, gay-5)--(GAs, gay+GAh-5); draw (GAs, gay+GAh-5)--(gax+25,gay+GAh-5)..(GAe-1,gay+9)..(GAe,gay+5)..(GAe-6,gay-4).. (gax+25,gay-5)--(gax+GAl, gay-5); draw (gax,gay)--(GAs,gay); draw (gax,gay+10)--(GAs,gay+10); draw (GAe, gay+5)--(GAe+GAl, gay+5); GAe := GAe + GAl; enddef; % ========= NOT GATE =========== def gate_not(expr gnx, gny) = numeric il, sz, wd, gns, GNe; save il, gns; il = 10; sz = 5; 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 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(0); 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 := "ld6b.eps"; beginfig(1) 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; end