diff options
-rw-r--r-- | ld.mp | 107 |
1 files changed, 104 insertions, 3 deletions
@@ -4,6 +4,7 @@ GNL = 20; GAL = 46; GH = 20; GTH = 30; +SP = 10; % ========= OR GATE =========== def gate_or(expr gox, goy) = @@ -15,11 +16,11 @@ save gos, wt, ht, il; wt = 25; ht = 15; il = 10; -gos = gox + il - 5; +gos = gox + il; GOe = (gos+wt, goy+5); -draw (gox, goy)--(gox+il-.3, goy); -draw (gox, goy+10)--(gox+il-.3, goy+10); +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; @@ -31,6 +32,33 @@ 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) = @@ -413,4 +441,77 @@ beginfig(10) 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 |