divert(-1) liblog.m4 gpic and dpic circuit macros, usage: m4 liblog.m4 diag.m4 | gpic [-t] > diag.tex, or m4 [pstricks.m4|mfpic.m4] liblog.m4 diag.m4 | dpic [-p] [-t] [-m] > diag.tex define(`HOMELIB_',`/u/aplevich/lib') Default processor: gpic ifdef(`gpic_',, `ifdef(`pstricks_',,`ifdef(`mfpic_',,`include(HOMELIB_/gpic.m4)')')')dnl divert(-1) ifdef(`right_',,`include(HOMELIB_/libgen.m4)')dnl divert(-1) Note: each gate except BUFFER and NOT has an optional integer argument N that sets the number of input locations, which then have labels In1 to InN. BUFFER and NOT gates have only In1, unless there is a first argument, in which case the argument is a line specification and the gate is drawn along the line as for a two-terminal element. Only up, down, left, right directions are valid. Grid mesh size define(`L_unit',`linewid/10') Dimensions in L_units, also for external use define(`G_hht',3) gate half-height define(`AND_ht',`2*G_hht') gate heights and widths ... define(`AND_wd',7) define(`BUF_ht',4) define(`BUF_wd',3.5) define(`N_diam',3/2) not-circle diameter Grid coordinates, scaled (x,y) define(`grid_',`(vscal_(L_unit,`$1',`$2'))') Grid coords, (x,y) scaled and rotated define(`svec_',`vec_(vscal_(L_unit,`$1',`$2'))') More basic gate dimensions, in L-units define(`m4X_off',1) define(`m4OR_rad',7) Input locations, flat face define(`m4A_defs',`ifelse( eval(`$1'<=`$2'),1,dnl `In`$1': svec_(0,G_hht+(0.5-`$1')*AND_ht/`$2' ) m4A_defs(incr(`$1'),`$2')' )') Input locations, curved face define(`m4O_defs',`ifelse( eval(`$1'<=`$2'),1,dnl `m4tmp = G_hht+(0.5-`$1')*AND_ht/`$2' In`$1': svec_(-sqrt(m4OR_rad^2-G_hht^2)+sqrt(m4OR_rad^2-m4tmp^2),m4tmp) m4O_defs(incr(`$1'),`$2')' )') Basic and-gate `AND_gate(n)' define(`AND_gate',`dnl [ line from svec_(AND_wd-G_hht,-G_hht) to svec_(0,-G_hht) \ then to svec_(0,G_hht) then to svec_(AND_wd-G_hht,G_hht) arc cw from svec_(AND_wd-G_hht,G_hht) to svec_(AND_wd-G_hht,-G_hht) \ with .c at svec_(AND_wd-G_hht,0) m4A_defs(1,ifelse(`$1',,2,`$1')) Out: svec_(AND_wd,0) ] ') Basic or-gate `OR_gate(n)' define(`OR_gate',`dnl [ line from svec_(AND_wd/3, G_hht) to svec_(0, G_hht) arc cw from svec_(0,G_hht) to svec_(0,-G_hht) \ with .c at svec_(-sqrt(m4OR_rad^2-G_hht^2),0) line from svec_(0,-G_hht) to svec_(AND_wd/3,-G_hht) arc cw from svec_(AND_wd/3, G_hht) to svec_(AND_wd,0) \ with .c at svec_(AND_wd/3,-((AND_wd*2/3)^2-G_hht^2)/2/G_hht) # with .c at svec_(2.41712,-1.9993) arc ccw from svec_(AND_wd/3,-G_hht) to svec_(AND_wd,0) \ with .c at svec_(AND_wd/3, ((AND_wd*2/3)^2-G_hht^2)/2/G_hht) # with .c at svec_(2.41712,1.9993) m4O_defs(1,ifelse(`$1',,2,`$1')) Out: svec_(AND_wd,0) ]') Basic buffer `BUFFER_gate(linespec)' define(`BUFFER_gate',`ifelse(`$1',, `[ line from svec_(BUF_wd,0) to svec_(0,-BUF_ht/2) then to svec_(0,BUF_ht/2) \ then to svec_(BUF_wd,0) m4A_defs(1,1) Out: svec_(BUF_wd,0) ]', `eleminit_(`$1') {line to last line.c-svec_(BUF_wd/2,0) [line from svec_(BUF_wd,0) to svec_(0,-BUF_ht/2) then to svec_(0,BUF_ht/2) \ then to svec_(BUF_wd,0)] at svec_(BUF_wd/2,0)} {line from rvec_(rp_len/2,0)+svec_(BUF_wd/2,0) to rvec_(rp_len,0)} line invis to rvec_(rp_len,0)' )') `NOT_gate(linespec)' define(`NOT_gate',`ifelse(`$1',, `[ BUFFER_gate with .Out at svec_(BUF_wd,0) circle diam L_unit*N_diam at svec_(BUF_wd+N_diam/2,0) Out: svec_(BUF_wd+N_diam,0) m4A_defs(1,1) ]', `eleminit_(`$1') {BUFFER_gate at last line.c circle diam L_unit*N_diam at last [].Out+svec_(N_diam/2,0)} {line to last [].In1} {line from last [].Out+svec_(N_diam,0) to rvec_(rp_len,0)} line invis to rvec_(rp_len,0) ' )') `NAND_gate(n)' define(`NAND_gate',`dnl [ AND_gate(0) with .Out at svec_(AND_wd,0) circle diam L_unit*N_diam at svec_(AND_wd+N_diam/2,0) Out: svec_(AND_wd+N_diam,0) m4A_defs(1,ifelse(`$1',,2,`$1')) ]') `NOR_gate(n)' define(`NOR_gate',`dnl [ OR_gate(0) with .Out at svec_(AND_wd,0) circle diam L_unit*N_diam at svec_(AND_wd+N_diam/2,0) Out: svec_(AND_wd+N_diam,0) m4O_defs(1,ifelse(`$1',,2,`$1')) ]') `XOR_gate(n)' define(`XOR_gate',`dnl [ OR_gate(0) with .Out at svec_(m4X_off+AND_wd,0) arc cw from svec_(0,G_hht) to svec_(0,-G_hht) \ with .c at svec_(-sqrt(m4OR_rad^2-G_hht^2),0) Out: svec_(m4X_off+AND_wd,0) m4O_defs(1,ifelse(`$1',,2,`$1')) ]') `NXOR_gate(n)' define(`NXOR_gate',`dnl [ OR_gate(0) with .Out at svec_(m4X_off+AND_wd,0) arc cw from svec_(0,G_hht) to svec_(0,-G_hht) \ with .c at svec_(-sqrt(m4OR_rad^2-G_hht^2),0) circle diam L_unit*N_diam at svec_(m4X_off+AND_wd+N_diam/2,0) Out: svec_(m4X_off+AND_wd+N_diam,0) m4O_defs(1,ifelse(`$1',,2,`$1')) ]') define(`log_init',`dnl gen_init ') divert(0)dnl