summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld.mp107
1 files changed, 104 insertions, 3 deletions
diff --git a/ld.mp b/ld.mp
index 1b92f35..79e7e8f 100644
--- a/ld.mp
+++ b/ld.mp
@@ -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