* Circuit_macros Version 5.86, copyright (c) 2006 J. D. Aplevich, under *
* the LaTeX Project Public License. The files of this distribution may be *
* redistributed or modified, provided that this copyright notice is *
* included, and provided that modifications are clearly marked to *
* distinguish them from this distribution. There is no warranty *
* whatsoever for these files. *
Installation directory. You can set this to
the null string if you use an environment
variable to tell m4 where to search:
ifdef(`HOMELIB_',,
`define(`HOMELIB_',`./circuit/')')
#`define(`HOMELIB_',`C:\Dwight\lib\')')
Default pic processor: gpic. To make dpic -p
the default, change gpic to pstricks here:
ifdef(`m4picprocessor',,`include(HOMELIB_`'gpic.m4)divert(-1)')
`Notes: ==================================================================
Gates other than BUFFER and NOT have an optional integer argument N
that sets the number of input locations, which then have labels In1
to InN.
BUFFER and NOT gates have In1 only. If there is a first argument, it
is a line specification and the gate is drawn along the line as for a
two-terminal element.
NEGATED inputs are obtained if the second argument is N (uppercase n).
========================================================================='
define(`L_unit',`linewid/10') `Grid mesh size'
`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(`OR_rad',7) `OR input radius'
define(`XOR_off',1) `XOR and NXOR parameter'
define(`N_diam',3/2) `not-circle diameter'
define(`N_rad',N_diam/2) `not-circle radius'
define(`NOT_rad',N_rad*L_unit) `scaled not-circle radius eg line chop NOT_rad'
define(`H_ht',2) `Hysteresis symbol dimen'
define(`Mx_pins',6) `max number of gate input pins without extensions
Possibly 4 is better for negated inputs'
define(`FF_wid',12) `Bistable'
define(`FF_ht',18)
define(`Mux_wid',8) `Multiplexer'
define(`Mux_ht',18)
define(`lg_plen',4) `Logic pin'
define(`lg_pintxt',ifxfig(`"$1"',`"sp_{\scriptsize `$1'}sp_"'))
define(`lg_bartxt',ifxfig(`$1',`$\overline{\hbox{`$1'}}$'))
`Scale grid coordinates to world coordinates'
define(`grid_',`(vscal_(L_unit,`$1',`$2'))')
`Scale and rotate grid coords to world coords'
define(`svec_',`vec_(vscal_(L_unit,`$1',`$2'))')
`Relative svec_'
define(`rsvec_',`Here+svec_(`$1',`$2')')
`NOT_circle
convenience for drawing NOT circles'
define(`NOT_circle',`circle diam N_diam*L_unit')
`LH_symbol(U|D|L|R|degrees)
logical hysteresis symbol'
define(`LH_symbol',`[ m4tmp_ang = rp_ang; direction_(`$1')
line from svec_(-H_ht*0.7,-H_ht/2) to svec_(H_ht*0.35,-H_ht/2) \
then to svec_(H_ht*0.35,H_ht/2)
line from svec_(H_ht*0.7,H_ht/2) to svec_(-H_ht*0.35,H_ht/2) \
then to svec_(-H_ht*0.35,-H_ht/2)
point_(m4tmp_ang) ] ')
`LT_symbol(U|D|L|R|degrees)
triangle_symbol'
define(`LT_symbol', `[ m4tmp_ang = rp_ang; direction_(`$1')
line to svec_(0,H_ht*5/8) then to svec_(H_ht,0) \
then to svec_(0,-H_ht*5/8) then to Here
point_(m4tmp_ang) ] ')
`BOX_gate(inputs,output,swid,sht,label)
drawn in the current direction
inputs=[P|N]* output=P|N'
define(`BOX_gate',`dnl
define(`m4m',`ifelse(`$1',,2,len(`$1'))')define(`m4a',`$1')dnl
define(`m4h',`ifelse(`$3',,AND_wd,`$3')')dnl
define(`m4v',`ifelse(`$4',,AND_wd,`$4')')dnl
[ {[line to svec_(0,m4v/2) then to svec_(m4h,m4v/2) then to svec_(m4h,-m4v/2) \
then to svec_(0,-m4v/2) then to (0,0)]}
ifelse(`$5',,,`{ move to last [].n+(0,-5pt__)
m4lstring($5,"{\scriptsize$ $5 $}") }')
IOdefs(from svec_(0,m4v/2) to svec_(0,-m4v/2),In,`$1',R)
Out: svec_(m4h,0) ifelse(`$2',N,`+svec_(N_diam,0)
N_Out: NOT_circle at Out-svec_(N_rad,0)') ]')
`AND_gate(n,[N][B],wid,ht)
drawn in the current direction
0 <= n <= 16; N=negated inputs, B=box shape'
define(`AND_gate',`ifelse(index(`$2',B),-1,
`AND_gen(ifelse(`$1',,2,`$1'),ifelse(`$2',N,N)IBAONESEC,`$3',`$4')',
`m4_m4t(`$1',`$2') BOX_gate(m4t,P,`$3',`$4',\&)')')
`AND_gen(n,chars,[wid,[ht]])
0 <= n <= 16;
B=base and straight sides; A=Arc;
[N]NE,[N]SE,[N]I,[N]N,[N]S=inputs or circles;
[N]O=output; C=center location '
define(`AND_gen',
`define(`m4h',`ifelse(`$3',,AND_wd,`($3)/(L_unit)')')dnl
define(`m4v',`ifelse(`$4',,ifelse(`$3',,AND_ht,AND_ht/(AND_wd)*m4h),
`($4)/(L_unit)')')define(`dna_',`$2')dnl
[ sc_draw(`dna_',B,dnl
`line from svec_(m4h-m4v/2,-m4v/2) to svec_(0,-m4v/2) then to svec_(0,m4v/2)\
then to svec_(m4h-m4v/2,m4v/2)')
sc_draw(`dna_',A, `Arc: arc cw rad m4v/2 to rsvec_(0,-m4v) \
with .c at rsvec_(0,-m4v/2)')
sc_draw(`dna_',NNE,
`NNE: svec_(m4h-m4v/2,0)+svec_(Rect_(m4v/2+N_diam,45))
N_NNE: NOT_circle at svec_(m4h-m4v/2,0)+svec_(Rect_(m4v/2+N_rad,45))')
sc_draw(`dna_',NSE,
`NSE: svec_(m4h-m4v/2,0)+svec_(Rect_(m4v/2+N_diam,-45))
N_NSE: NOT_circle at svec_(m4h-m4v/2,0)+svec_(Rect_(m4v/2+N_rad,-45))')
sc_draw(`dna_',NE, `NE: svec_(m4h-m4v/2,0)+svec_(Rect_(m4v/2,45))')
sc_draw(`dna_',NI, `m4A_defs(ifelse(`$1',,2,`$1'),N)')
sc_draw(`dna_',SE, `SE: svec_(m4h-m4v/2,0)+svec_(Rect_(m4v/2,-45))')
sc_draw(`dna_',NN, `N_NN: NOT_circle at svec_((m4h-m4v/2)/2,m4v/2+N_rad)
NN: svec_((m4h-m4v/2)/2,m4v/2+N_diam)')
sc_draw(`dna_',NS, `N_NS: NOT_circle at svec_((m4h-m4v/2)/2,-m4v/2-N_rad)
NS: NOT_circle at svec_((m4h-m4v/2)/2,-m4v/2-N_diam)')
sc_draw(`dna_',NO, `N_Out: NOT_circle at svec_(m4h+N_rad,0)
Out: svec_(m4h+N_diam,0)')
sc_draw(`dna_',O, `Out: svec_(m4h,0)')
sc_draw(`dna_',N, `N: svec_(0,m4v/2)')
sc_draw(`dna_',I, `m4A_defs(ifelse(`$1',,2,`$1'))')
sc_draw(`dna_',S, `S: svec_(0,-m4v/2)')
sc_draw(`dna_',C, `C: svec_(m4h/2,0)')
]')
`m4A_defs(n,[N]) Input locations, flat face'
define(`m4A_defs',
`define(`m4m',`m4v/2/min(`$1',Mx_pins-1)*min(`$1',3*(Mx_pins-1))')dnl
ifelse(eval(`$1'>Mx_pins),1,
`line from svec_(0, m4m) to svec_(0,m4v/2)
line from svec_(0,-m4m) to svec_(0,-m4v/2)')
for_(1,`$1',1,`ifelse(`$2',N,
`N_In`'m4x: NOT_circle at \
svec_(-N_rad,m4v/min(`$1',Mx_pins-1)*((`$1'+1)/2-m4x))
In`'m4x: svec_(-N_diam,m4v/min(`$1',Mx_pins-1)*((`$1'+1)/2-m4x)) ',
`In`'m4x: svec_(0,m4v/min(`$1',Mx_pins-1)*((`$1'+1)/2-m4x))') ') ')
`OR_gate(n,[N][B],wid,ht)
drawn in the current direction
0 <= n <= 16; N=negated inputs, B=box shape'
define(`OR_gate',`ifelse(index(`$2',B),-1,
`OR_gen(ifelse(`$1',,2,`$1'),ifelse(`$2',N,N)IBAONESEC,`$3',`$4')',
`m4_m4t(`$1',`$2') BOX_gate(m4t,P,`$3',`$4',\geq 1)')')
`OR_gen(n,chars,[wid,[ht]])
0 <= n <= 16;
B=base and straight sides; A=Arcs;
[N]NE,[N]SE,[N]I,[N]N,[N]S=inputs or circles;
[N]P=XOR arc; [N]O=output; C=center '
define(`OR_gen',
`define(`m4h',`ifelse(`$3',,AND_wd,`($3)/(L_unit)')')define(`m4o',0)dnl
define(`m4v',`ifelse(`$4',,ifelse(`$3',,AND_ht,AND_ht/(AND_wd)*m4h),
`($4)/(L_unit)')')define(`dna_',`$2')dnl
[sc_draw(`dna_',P,`define(`m4o',XOR_off*m4v/(AND_ht))dnl
arc cw from svec_(0,m4v/2) to svec_(0,-m4v/2) \
with .c at svec_(-sqrt((OR_rad*m4v/(AND_ht))^2-(m4v/2)^2),0)')
sc_draw(`dna_',B,dnl
`line from svec_(m4o+m4h/3,m4v/2) to svec_(m4o,m4v/2)
arc cw to svec_(m4o,-m4v/2) \
with .c at svec_(m4o-sqrt((OR_rad*m4v/(AND_ht))^2-(m4v/2)^2),0)
line to svec_(m4o+m4h/3,-m4v/2)')
sc_draw(`dna_',A,`define(`m4m',`((m4h*2/3)^2-(m4v/2)^2)/(m4v)')dnl
ArcN: arc cw from svec_(m4o+m4h/3, m4v/2) to svec_(m4o+m4h,0) \
with .c at svec_(m4o+m4h/3,-m4m)
ArcS: arc ccw from svec_(m4o+m4h/3,-m4v/2) to svec_(m4o+m4h,0) \
with .c at svec_(m4o+m4h/3,m4m)')
sc_draw(`dna_',NNE,
`N_NNE: NOT_circle at svec_(m4o+m4h/3,-m4m)+svec_(Rect_(m4v/2+m4m+N_rad,60))
NNE: svec_(m4o+m4h/3,-m4m)+svec_(Rect_(m4v/2+m4m+N_diam,60))')
sc_draw(`dna_',NSE,
`N_NSE: NOT_circle at svec(m4o+m4h/3,m4m)+svec_(Rect_(m4v/2+m4m+N_rad,-60))
NSE: svec(m4o+m4h/3,m4m)+svec_(Rect_(m4v/2+m4m+N_diam,-60))')
sc_draw(`dna_',NE, `NE: svec_(m4o+m4h/3,-m4m)+svec_(Rect_(m4v/2+m4m,60))')
sc_draw(`dna_',SE, `SE: svec_(m4o+m4h/3,m4m)+svec_(Rect_(m4v/2+m4m,-60))')
sc_draw(`dna_',NI, `m4O_defs(ifelse(`$1',,2,`$1'),N)')
sc_draw(`dna_',NN, `N_NN: NOT_circle at svec_(m4o+m4h/6,m4v/2+N_rad)
NN: svec_(m4o+m4h/6,m4v/2+N_diam)')
sc_draw(`dna_',NS, `N_NS: NOT_circle at svec_(m4o+m4h/6,-m4v/2-N_rad)
NS: svec_(m4o+m4h/6,-m4v/2-N_diam)')
sc_draw(`dna_',NO, `N_Out: NOT_circle at svec_(m4o+m4h+N_rad,0)
Out: svec_(m4o+m4h+N_diam,0)')
sc_draw(`dna_',O, `Out: svec_(m4o+m4h,0)')
sc_draw(`dna_',N, `N: svec_(m4o+m4h/6,m4v/2)')
sc_draw(`dna_',I, `m4O_defs(ifelse(`$1',,2,`$1'))')
sc_draw(`dna_',S, `S: svec_(m4o+m4h/6,-m4v/2)')
sc_draw(`dna_',C, `C: svec_(m4o+m4h/2,0)')
]')
`m4O_defs(n,[N]) Input locations, curved face'
define(`m4O_defs',
`define(`m4om',`m4v/2/min(`$1',Mx_pins-1)*min(`$1',3*(Mx_pins-1))')dnl
ifelse(eval(`$1'>Mx_pins),1,
`arc ccw from svec_(0,m4v/2) to svec_(0,m4v) + OR_apos(m4om-m4v) \
with .c at svec_(-OR_dst,m4v)
arc cw from svec_(0,-m4v/2) to svec_(0,-m4v) +OR_apos(-(m4om-m4v))\
with .c at svec_(-OR_dst,-m4v) ')
define(`m4on',`eval((`$1'-Mx_pins+1)/2)')
for_(1,`$1',1,
`define(`m4oq',`m4v/2/min(`$1',Mx_pins-1)*(`$1'+1-2*m4x)')
In`'m4x: ifelse(eval(m4x<=m4on),1,`svec_(0, m4v)+OR_apos(m4oq-m4v)',
eval(m4x>(`$1'-m4on)),1, `svec_(0,-m4v)+OR_apos(m4oq+m4v)',
`OR_apos(m4oq)')
ifelse(`$2',N,
`N_In`'m4x: NOT_circle at In`'m4x+svec_(-N_rad,0)
In`'m4x: In`'m4x+svec_(-N_diam,0)')
')
')
define(`OR_dst',`sqrt((OR_rad*m4v/(AND_ht))^2-(m4v/2)^2)')
define(`OR_apos',`svec_(-OR_dst+sqrt((OR_rad*m4v/(AND_ht))^2-(`$1')^2),`$1')')
`IOdefs(linespec,label,[P|N]*,L|R)
Distribute named locations with optional NOT
circles along a line
eg IOdefs(up 1,Z,PNN,R) defines Z1 at 1/6
along the line, NOT circles N_Z2 and N_Z3 to
the right at 1/2 and 5/6 along the line with
Z2 and Z3 labeled at their right edges'
define(`IOdefs',`define(`m4dm',`ifelse(`$3',,1,len(`$3'))')m4IOtmp = rp_ang
eleminit_(`$1')define(`m4da',`$3')define(`m4dv',`ifelse(`$2',,In,`$2')')
for_(1,m4dm,1,
`m4dv`'m4x: last line.start+vec_((m4x-1/2)*rp_len/m4dm,0)dnl
ifelse(substr(m4da,0,1),N,`+svec_(0,ifelse(`$4',R,-)N_diam)
{N_`'m4dv`'m4x: NOT_circle at m4dv`'m4x+svec_(0,ifelse(`$4',R,,-)N_rad)}')
define(`m4da',substr(m4da,1))') rp_ang = m4IOtmp')
`BUFFER_gate(linespec,[N|B],wid,ht)
When linespec is blank then the element is
composite and In1, Out, C, NE, and SE are
defined; otherwise the element is drawn as
two-terminal'
define(`BUFFER_gate',`ifelse(index(`$2',B),-1,
`ifelse(`$1',,
`BUFFER_gen(ifelse(`$2',N,N)ITOCNESE,`$3',`$4')',
`eleminit_(`$1')
{ BUFFER_gen(ifelse(`$2',N,N)ITOC,`$3',`$4') with .C at last line.c }
{ line to last [].In1; line from last [].Out to 2nd last line.end }
line to rvec_(rp_len,0) invis')',
`BOX_gate(ifelse(index(`$2',N),-1,P,N),P,`$3',`$4',1)')')
`NOT_gate(linespec,[N|B],wid,ht)
When linespec is blank then the element is
composite and In1, Out, C, NE, and SE are
defined; otherwise the element is drawn as
two-terminal'
define(`NOT_gate',`ifelse(index(`$2',B),-1,
`ifelse(`$1',,
`BUFFER_gen(ifelse(`$2',N,N)ITNOCNESE,`$3',`$4')',
`eleminit_(`$1')
{ BUFFER_gen(ifelse(`$2',N,N)ITNOC,`$3',`$4') with .C at last line.c }
{ line to last [].In1; line from last [].Out to 2nd last line.end }
line to rvec_(rp_len,0) invis')',
`BOX_gate(ifelse(index(`$2',N),-1,P,N),N,`$3',`$4',1)')')
`BUFFER_gen(chars,wd,ht,[N|P]*,[N|P]*,[N|P]*)
chars: T=triangle, [N]O=output location Out
(NO draws circle N_Out);
[N]I,[N]N,[N]S,[N]NE,[N]SE input locations
C=centre location. Args 4-6 define In, NE,
and SE argument sequences'
define(`BUFFER_gen',
`define(`m4h',`ifelse(`$2',,BUF_wd,`($2)/(L_unit)')')define(`m4y',m4h)dnl
define(`m4v',`ifelse(`$3',,BUF_ht,`($3)/(L_unit)')')dnl
define(`dna_',`$1')define(`m4z',`N_rad/vlength(m4h,m4v/2)')dnl
[sc_draw(`dna_',T,
`line from svec_(m4h,0) to svec_(0,-m4v/2) then to svec_(0,m4v/2) \
then to svec_(m4h,0)')
sc_draw(`dna_',NNE,
`N_NNE: NOT_circle at svec_(m4h/2,m4v/4)+svec_(m4v/2*m4z,m4h*m4z)
NNE: svec_(m4h/2,m4v/4)+svec_(m4v*m4z,m4h*2*m4z)')
sc_draw(`dna_',NSE,
`N_NSE: NOT_circle at svec_(m4h/2,-m4v/4)-svec_(-m4v/2*m4z,m4h*m4z)
NSE: svec_(m4h/2,-m4v/4)-svec_(-m4v*m4z,m4h*2*m4z)')
sc_draw(`dna_',NI,`define(`m4y',m4y+N_diam) In1: svec_(-N_diam,0)
N_In1: NOT_circle at svec_(-N_rad,0)')
sc_draw(`dna_',NE, `NE: svec_(m4h/2,m4v/4)')
sc_draw(`dna_',SE, `SE: svec_(m4h/2,-m4v/4)')
sc_draw(`dna_',NN, `N_NN: NOT_circle at svec_(0,m4v/2+N_rad)
NN: svec_(0,m4v/2+N_diam)')
sc_draw(`dna_',NS, `N_NS: NOT_circle at svec_(0,-m4v/2-N_rad)
NS: svec_(0,-m4v/2-N_diam)')
sc_draw(`dna_',NO,`define(`m4y',m4y+N_diam) Out: svec_(m4h+N_diam,0)
N_Out: NOT_circle at svec_(m4h+N_rad,0)')
sc_draw(`dna_',N, `N: svec_(0,m4v/2)')
sc_draw(`dna_',S, `S: svec_(0,-m4v/2)')
sc_draw(`dna_',O, `Out: svec_(m4h,0)')
sc_draw(`dna_',I, `In1: (0,0)')
sc_draw(`dna_',C, `C: svec_(m4h/2,0)')
ifelse(`$4',,,`IOdefs(from svec_(0,m4v/2) to svec_(0,-m4v/2),In,`$4',R)')
ifelse(`$5',,,`IOdefs(from svec_(0,m4v/2) to svec_(m4h,0),NE,`$5')')
ifelse(`$6',,,`IOdefs(from svec_(0,-m4v/2) to svec_(m4h,0),SE,`$6',R)')]')
`The comprehensive logic pin:
lg_pin(location, logicalname, Pinlabel, n|e|s|w[N|L|M][E], pinno, optlen)
n|e|s|w=orientation;
N=negated; L=active low out; M=active low in; E=edge trigger'
define(`lg_pin',`ifelse(`$1',,,`move to $1')
define(`dna_',`substr(`$4',1)')define(`m4lE',)define(`m4lN',)dnl
define(`m4ld',`ifelse(`$4',,e,`substr(`$4',0,1)')')dnl
define(`m4lph',`ifelse(m4ld,n,0,m4ld,w,-1,m4ld,s,0,1)')dnl
define(`m4lpv',`ifelse(m4ld,n,1,m4ld,w,0,m4ld,s,-1,0)')dnl
define(`m4lpl',`ifelse(`$6',,`lg_plen',`$6')')dnl
sc_draw(`dna_',E,`define(`m4lE',1)dnl
{ line from rsvec_(lp_xy(0,N_rad)) \
to rsvec_(lp_xy(-N_diam*sqrt(3)/2,0)) then to rsvec_(lp_xy(0,-N_rad)) }')
ifelse(`$2',,,
`{ lg_pintxt(`$2') ifelse(m4ld,w,`ljust_', m4ld,n,`below_',
m4ld,s,`above_',`rjust_') at Here dnl
ifxfig(`+(lp_xy(-0.72bp__,0))') dnl
ifelse(m4lE,1,`+svec_(lp_xy(-N_diam*sqrt(3)/2,0))') }')
sc_draw(`dna_',N,`define(`m4lN',N)
{ NOT_circle at rsvec_(lp_xy(N_rad,0)) }')
sc_draw(`dna_',L,`define(`m4lN',M)
{line from rsvec_(lp_xy(0,
ifelse(m4ld,w,-,m4ld,s,-)N_rad*3/2)) to rsvec_(lp_xy(N_rad*2.5,0)) }')
sc_draw(`dna_',M,`define(`m4lN',M)
{ line to rsvec_(lp_xy(N_rad*2.5,
ifelse(m4ld,w,-,m4ld,s,-)N_rad*3/2)) then to rsvec_(lp_xy(N_rad*2.5,0))}')
{ifelse(`$3',,,`$3':) line to rsvec_(lp_xy(m4lpl,0))dnl
ifelse(m4lN,N,`chop N_diam*L_unit chop 0')
ifelse(`$5',,,`lg_pintxt(`$5') dnl
at rsvec_(lp_xy(vscal_(1/(L_unit),2pt__,0))) dnl
ifgpic(
`ifelse(m4ld,n,`+svec_(lp_xy(4pt__/(L_unit),0)) rjust_ below_',
m4ld,w,`+svec_(lp_xy(vscal_(1/(L_unit),1pt__,3pt__))) \
ljust_ above_',
m4ld,s,`+svec_(lp_xy(2pt__/(L_unit),0)) rjust_ above_',
`+svec_(lp_xy(0,-3pt__/(L_unit))) rjust_ above_') ',
`ifelse(m4ld,n,`rjust_ below_', m4ld,w,`ljust_ above_',
`rjust_ above_')')') dnl
} ')
define(`lp_xy',`vrot_(`$1',`$2',m4lph,m4lpv)')
`Mux(inputs, label, [L][T])
Binary multiplexer: L reverses pin numbering,
T puts Sel at the top'
define(`Mux',`[
Chip: [line from svec_(-Mux_wid/2, 0) to svec_(-Mux_wid/2, Mux_ht/2) \
then to svec_(Mux_wid/2, (Mux_ht/2)-2) \
then to svec_(Mux_wid/2, -(Mux_ht/2)+2) \
then to svec_(-Mux_wid/2, -Mux_ht/2) then to svec_(-Mux_wid/2, 0) ]
ifelse(`$2',,,`"\scriptsize $2" at Chip.c')
lg_pin(Chip.e_,,Out,e)
ifelse(index(`$3',T),-1,
`lg_pin(Chip.s_+svec_(0,1),$\;$Sel,Sel,s)',
`lg_pin(Chip.n_+svec_(0,-1),$\;$Sel,Sel,n)')
for_(1,ifelse(`$1',,2,`$1'),1,
`lg_pin(Chip.w_+svec_(0,
ifelse(index(`$3',L),-1,,-)Mux_ht*(0.5+(0.5-m4x)/ifelse(`$1',,2,`$1'))),
decr(m4x),In`'decr(m4x),w)')
]')
`FlipFlop( D|T|RS|JK, label, boxspec )'
define(`FlipFlop',
`ifelse(`$1',D,`FlipFlop6(`$2',DCKQNQ,`$3')',
`$1',T,`FlipFlop6(`$2',TCKQNQ,`$3')',
`$1',RS,`FlipFlop6(`$2',RSQNQ,`$3')',
`$1',JK,`FlipFlopJK(`$2',JnCKKnCLRnPRQNQ,`$3')',
`FlipFlop6(`$2',.QNQ,`$3')')dnl
')
`FlipFlop6( label, spec, boxspec )
Customizable 6-pin flipflop:
The spec string contains NQ, Q, CK, S, PR,
CLR to include these pins. Preceding any of
these with n negates the pin. Any other
substring applies to the top left pin, with
. equating to a blank'
define(`FlipFlop6',`[ dnl
Chip: box ifelse(`$3',,`wid_ FF_wid*L_unit ht_ FF_ht*L_unit',`$3')
ifelse(`$1',,,`"\scriptsize $1" at Chip.c')
define(`M4_spec',`ifelse(`$2',,.QnNQ,$2)')dnl
M4_ffs(`M4_spec',NQ)ifelse(m4h,-1,,
`lg_pin(Chip.se_+svec_(0,int(FF_ht/4)),lg_bartxt(Q),PinNQ,e`'m4N)')
M4_ffs(`M4_spec',Q)ifelse(m4h,-1,,
`lg_pin(Chip.ne_-svec_(0,int(FF_ht/4)),Q,PinQ,e`'m4N)')
M4_ffs(`M4_spec',CK)ifelse(m4h,-1,,
`lg_pin(Chip.sw_+svec_(0,int(FF_ht/4)),CK,PinCK,wE`'m4N)')
M4_ffs(`M4_spec',S)ifelse(m4h,-1,,
`lg_pin(Chip.sw_+svec_(0,int(FF_ht/4)),S,PinS,w`'m4N)')
M4_ffs(`M4_spec',PR)ifelse(m4h,-1,, dnl thanks to Louis Dupont
`lg_pin(Chip.s_,PR,PinPR,s`'m4N)')
M4_ffs(`M4_spec',CLR)ifelse(m4h,-1,,
`lg_pin(Chip.n_,CLR,PinCLR,n`'m4N)')
ifelse(M4_spec,,,
`define(`m4N',ifelse(substr(M4_spec,0,1),n,
`define(`M4_spec',substr(M4_spec,1))'N,))dnl
ifelse(M4_spec,.,`define(`M4_spec',)')dnl
lg_pin(Chip.nw_-svec_(0,int(FF_ht/4)),M4_spec,Pin`'M4_spec,w`'m4N) ')
]')