% digital % $Log: digital.mp,v $ % Revision 1.1 1996/11/30 01:05:08 tjchol01 % Initial revision %%-------------------------------------------------- buf_ht := 1.5u; buf_lt := buf_ht * (sqrt 3)/2; def Ebuf_ = (0,0) = 0.5[z1,z2]; z2-z1=(buf_lt,0); z1=.5[z3,z4]; z3-z4=(0,buf_ht); pickup normalpen; draw z3--z2--z4--cycle; addpin.a (z1)(lft); enddef; defelem(Buf, Ebuf_; addpin.o (z2)(rt)); defelem(Not, Ebuf_; addnegpin.o (z2)(rt)); %%-------------------------------------------------- and_ht := 2u; and_lt := 2u; and_spc := and_ht/4; def Eand_ (expr n) = (0,0) = 0.5[z1,z2]; z2-z1=(and_lt,0); z1=.5[z3,z4]; z3-z4=(0,and_ht); z7=.5[z5,z6]; z5-z3=z6-z4=(and_lt-and_ht/2,0); pickup normalpen; draw halfcircle rotated -90 scaled and_ht shifted z7; pickup normalpen; draw z6--z4--z3--z5; if n=2: addpin.a (.5[z1,z3])(lft); addpin.b (.5[z1,z4])(lft); else: for i = 0 upto n - 1: addpin.stk (char (ASCII "a" + i)) (z1 + (0, (i - (n-1)/2)*and_spc))(lft); endfor; if n*and_spc >= and_ht: % input edge extension draw z1-(0,n/2*and_spc) -- z4; draw z3 -- z1+(0,n/2*and_spc); fi; fi; enddef; defromanelem(And, Eand_)(addpin.o (z2)(rt)); defromanelem(Nand, Eand_)(addnegpin.o (z2)(rt)); %%-------------------------------------------------- or_ht := 2u; or_lt := 2.5u; or_wd:=0.8u; or_spc := or_ht/4; or_dent := .5u; xor_spc := .2u; def Eor_ (expr isxor, n) = (0,0) = 0.5[z1,z2]; z2-z1=(or_lt,0); z1=.5[z3,z4]; z3-z4=(0,or_ht); z9 = (if isxor: xor_spc else: 0 fi, 0); z10 = (or_wd, 0); pickup normalpen; draw z3+z9--z3+z9+z10{right}..z2; draw z4+z9--z4+z9+z10{right}..z2; draw z3..z1+(or_dent,0)..z4; if isxor: draw (z3..z1+(or_dent,0)..z4) shifted z9; fi; def curvepin__(expr a) = (z4..z1+(or_dent,0)..z3) intersectionpoint ((-infinity,a)--(infinity,a)) enddef; if n=2: addpin.a (curvepin__(ypart .5[z1,z3]))(lft); addpin.b (curvepin__(ypart .5[z1,z4]))(lft); else: for i = 0 upto n - 1: h_ := (i - (n-1)/2) * or_spc; addpin.stk (char (ASCII "a" + i)) ( if abs h_ >= or_ht/2: z1 + (0,h_) else: curvepin__ (ypart z1 + h_) fi;)(lft) endfor; if n*or_spc >= or_ht: % input edge extension draw z1-(0,n/2*or_spc) -- z4; draw z3 -- z1+(0,n/2*or_spc); fi; fi; enddef; defromanelem(Or, Eor_(false))(addpin.o (z2)(rt)); defromanelem(Nor, Eor_(false))(addnegpin.o (z2)(rt)); defromanelem(Xor, Eor_(true))(addpin.o (z2)(rt)); defromanelem(Nxor, Eor_(true))(addnegpin.o (z2)(rt)); %%-------------------------------------------------- % Local Variables: % compile-command: "mp '\\nonstopmode; input /usr1/tjchol01/src/mpcirc/digitaltest'" % End: