divert(-1) libcct.m4 gpic and dpic circuit macros, usage: m4 libcct.m4 diag.m4 | gpic -t > diag.tex , or m4 [pstricks.m4|mfpic.m4] libcct.m4 diag.m4 | dpic [-p] [-m] [-t] > diag.tex Installation-dependent: define(`HOMELIB_',`/u/aplevich/lib') Default pic 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: the arguments of every circuit element are optional; if omitted, the current location, default length and direction are used. `resistor( linespec,cycles )' define(`resistor',`eleminit_(`$1') define(`m4n',`ifelse(`$2',,6,`eval(2*$2)')')dnl define(`m4v',`dimen_/12')define(`m4h',`dimen_/24')dnl {move to last line.c; line from last line.start to rvec_(prod_(m4n,-m4h),0) \ m4_resist(0)dnl then to rvec_(prod_(m4n,m4h), 0) then to last line.end } {[box invis ht_ 2*m4v wid_ prod_(m4n,2*m4h)] with .c at 2nd last line.c } line from 2nd last line.start to 2nd last line.end invis ') define(`m4_resist',`ifelse(eval(`$1' ifelse(`$2',R,,`c')cw \ from rvec_(Rect_(dimen_/4,ifelse(`$2',R,,-)10))\ to rvec_(Rect_(dimen_/4,ifelse(`$2',R,-)75)) \ with .c at rvec_(rect_(-dimen_/4,ifelse(`$2',R,-)(75-10)/2*dtor_)) }') arrowht = m4t1 ; arrowwid = m4t2; [box invis ht_ dimen_/4+m4cs wid_ dimen_/4] \ with .c at rvec_(dimen_/8,ifelse(`$2',R,-)(m4v-(m4cs))/2)} {line from rvec_(rp_len/2+dimen_/6,0) to rvec_(rp_len,0)} line to rvec_(rp_len,0) invis') `amp( linespec )' Amplifiers define(`amp',`eleminit_(`$1') { line to rvec_(dimen_/4,0)}; gamp(`$1') ') `integrator( linespec )' define(`integrator',`eleminit_(`$1') {line from rvec_(dimen_/4,-dimen_/2) to rvec_(0,-dimen_/2)\ then to rvec_(0, dimen_/2) then to rvec_(dimen_/4, dimen_/2)} gamp(`$1') ') `gamp( linespec )' Amplifier, `dimen_ by dimen_' triangle in a [] Requires `elen_' to be at least `dimen_'*5/4 : define(`gamp',`eleminit_(`$1') {line from rvec_(dimen_*5/4,0) to rvec_(dimen_/4,-dimen_/2)\ then to rvec_(dimen_/4, dimen_/2) then to rvec_(dimen_*5/4,0) \ then to rvec_(rp_len,0)} {[box invis ht_ dimen_ wid_ dimen_] with .c at rvec_(dimen_*3/4,0)} line invis to rvec_(rp_len,0) ') `opamp( linespec, -, + )' define(`opamp',`[gamp(`$1') In1: last line.start+vec_(dimen_/4,dimen_/4) {ifelse(`$2',,"sp_{\small$-$}sp_",`$2') at In1 ljust_ } In2: last line.start+vec_(dimen_/4,-dimen_/4) {ifelse(`$3',,"sp_{\small$+$}sp_",`$3') at In2 ljust_ } Out: Here] ') `diode( linespec ,Z | BD)' define(`diode',`eleminit_(`$1')dnl ifelse(`$2',,`m4plain_d',`$2',Z,`m4plain_d(Z)',`$2',BD,`m4bidirect_di') {[box invis ht_ 2*m4v wid_ m4h] with .c at rvec_(rp_len/2,0) } line to rvec_(rp_len,0) invis ') define(`m4plain_d',`define(`m4v',`dimen_/10')define(`m4h',`sqrt(3)*m4v')dnl { line to rvec_(rp_len/2-m4h/2,0) m4arrowhd(Here,rvec_(m4h,0),m4h,m4v*2,rvec_(0,-m4v),rvec_(0,m4v)) { line from ifelse(`$1',,`rvec_(0,-m4v) to rvec_(0,m4v)', `rvec_(-m4v/2,-m4v) to rvec_(0,-m4v) then to rvec_(0,m4v) \ then to rvec_(m4v/2,m4v)') } line to rvec_(rp_len/2-m4h/2,0) } ') define(`m4bidirect_di', `define(`m4v',`dimen_/10')define(`m4h',`sqrt(3)*m4v*2')dnl { line to rvec_(rp_len/2-m4h/2,0) m4arrowhd(Here,rvec_(m4h/2,0),m4h/2,m4v*2,rvec_(0,-m4v),rvec_(0,m4v)) {m4arrowhd(rvec_(m4h/2,0),Here,m4h/2,m4v*2, rvec_(m4h/2,m4v),rvec_(m4h/2,-m4v)) } { line from rvec_(-m4v/2,-m4v) to rvec_(0,-m4v) then to rvec_(0,m4v) \ then to rvec_(m4v/2,m4v) } line from rvec_(m4h/2,0) to rvec_(rp_len/2,0) } ') define(`m4arrowhd', `ifdef(`gpic_',`arrow from `$1' to `$2' wid `$3' ht `$4'', `ifdef(`pstricks_',`arrow from `$1' to `$2' wid `$3' ht `$4'', `line from `$2' to `$5' then to `$6' then to `$2'')')') define(`bi_tr',`dnl Bipolar transistor `bi_tr(linespec, L|R, P, E)' [ define(`m4_U',dimen_/10) ifelse(`$1',,,`eleminit_($1)') E: Here ifelse(`$1',,,`line to rvec_( rp_len/2-3*m4_U,0)') line to rvec_(m4_U*1.8,ifelse(`$2',R,-)4*m4_U) {arrow from last line.ifelse(`$3',P,`start to 3',`end to 1')/4 \ wid m4_U*10/9 ht m4_U*10/6} Bulk: line from rvec_(-m4_U*.8,0) to rvec_(m4_U*3.2,0) line from rvec_(-m4_U*.8,0) to rvec_(m4_U,ifelse(`$2',R,,-)4*m4_U) ifelse(`$1',,,`line to rvec_( (rp_len/2-3*m4_U),0)') C: Here B: Bulk.c+vec_(0,ifelse(`$2',R,-)2.5*m4_U) line from B to Bulk.c ifelse(`$4',E,dnl `circle rad 4*m4_U with .c at Bulk.c+vec_(0,ifelse(`$2',R,,-)1.5*m4_U)') manhattan]') define(`j_fet',`dnl JFET `j_fet(linespec, L|R, P, E )' [ define(`m4_U',dimen_/10) ifelse(`$1',,,`eleminit_($1)') S: Here ifelse(`$1',,,`line to rvec_(rp_len/2-m4_U*2,0)') line to rvec_(0,ifelse(`$2',R,-)3.5*m4_U) Bulk: line from rvec_(-m4_U*.5,0) to rvec_(m4_U*4.5,0) line from Bulk.end+vec_(-m4_U/2,0) \ to Bulk.end+vec_(-m4_U/2,ifelse(`$2',R,,-)3.5*m4_U) \ ifelse(`$1',,,`then to Bulk.c+vec_(rp_len/2,ifelse(`$2',R,,-)3.5*m4_U)') D: Here G: Bulk.start+vec_(m4_U/2,ifelse(`$2',R,-)3.5*m4_U) line from G to Bulk.start+vec_(m4_U/2,0) {arrow from last line.ifelse(`$3',P,`end to 1',`start to 7')/8 \ wid m4_U*10/9 ht m4_U*10/6} ifelse(`$4',E,dnl `circle rad 4*m4_U with .c at Bulk.c') manhattan] ') Enhancement-mode FET e_ fet(linespec, L|R, P, E) define(`e_fet',`m4_gfet(`$1',`$2',`$3',`$4',E)') Depletion-mode FET d_ fet(linespec, L|R, P, E) define(`d_fet',`m4_gfet(`$1',`$2',`$3',`$4',D)') define(`m4_gfet',`dnl Kernel for d_fet and e_fet [ define(`m4_U',dimen_/10) ifelse(`$1',,,`eleminit_($1)') S: Here ifelse(`$1',,,`line to rvec_(rp_len/2-m4_U*2,0)') {line to rvec_(m4_U*2,0); line to rvec_(0,ifelse(`$2',R,-)m4_U*3.5) arrow from last line.ifelse(`$3',P,`end to 1',`start to 4')/5 \ wid m4_U*10/9 ht m4_U*10/6} line to rvec_(0,ifelse(`$2',R,-)3.5*m4_U); move to rvec_(-m4_U/2,0) ifelse(`$5',E,`{Bulk: line invis to rvec_(m4_U*5,0)} line to rvec_(m4_U*3/2,0); move to rvec_(m4_U/2,0) line to rvec_(m4_U,0); move to rvec_(m4_U/2,0) line to rvec_(m4_U*3/2,0)', `$5',D,`Bulk: line to rvec_(5*m4_U,0)') line from Bulk.end+vec_(-m4_U/2,0) to \ Bulk.end+vec_(-m4_U/2,ifelse(`$2',R,,-)3.5*m4_U) ifelse(`$1',,,`line to rvec_(rp_len/2-2*m4_U,0)') D: Here G: Bulk.start+vec_(m4_U/2,ifelse(`$2',R,-)3.5*m4_U) line from G to Bulk.start+vec_(m4_U/2,ifelse(`$2',R,-)m4_U) \ then to Bulk.start+vec_(m4_U*9/2,ifelse(`$2',R,-)m4_U) ifelse(`$4',E,dnl `circle rad 4*m4_U with .c at Bulk.c') manhattan] ') define(`m4m_core',`dnl {line from `$1'+vec_(-(`$2')/2,`$3'+`$4') \ to `$1'+vec_( (`$2')/2,`$3'+`$4') line from last line.start+vec_(0,`$5') \ to last line.end +vec_(0,`$5')}') 2-winding `transformer( linespec, L|R, n_P )' define(`transformer',` [ P1: Here inductor( ifelse(`$1',,`to rvec_(dimen_*2/3,0)',`$1'),`$3') P2: Here m4m_core(rvec_(-(rp_len/2),0),m4h,m4v,dimen_/12,dimen_/8) S2: last line.c+vec_( rp_len/2,m4v+dimen_/12) inductor(from S2 to S2+vec_(-rp_len,0),`$3') S1: Here ; dnl Requires symmetry: ifelse(`$2',R,`X_:S1;S1:P1;P1:X_;X_:S2;S2:P2;P2:X_') manhattan ]') `delay( linespec )' define(`delay',`eleminit_(`$1') {line to rvec_((rp_len-delay_rad_*5/3)/2,0) line from rvec_(delay_rad_*2/3,-delay_rad_) to rvec_(0,-delay_rad_)\ then to rvec_(0,delay_rad_) then to rvec_(delay_rad_*2/3,delay_rad_) {arc cw from Here to rvec_(0,-2*delay_rad_) with .c at rvec_(0,-delay_rad_)} move to rvec_(delay_rad_,-delay_rad_) line to rvec_((rp_len-delay_rad_*5/3)/2,0)} {[box invis ht_ delay_rad_*2 wid_ delay_rad_*5/3 ] \ with .c at rvec_(rp_len/2,0)} line invis to rvec_(rp_len,0)') element labels to the left, right, centre of the current direction define(`rlabel',`m4label(`$1',`$2',`$3',.s_,below_)') define(`llabel',`m4label(`$1',`$2',`$3',.n_,above_)') define(`clabel',`m4label(`$1',`$2',`$3',,)') labels at centre and both ends of an element `dimen_' long define(`m4label',`dnl ifelse(`$1',,,`{"sp_$`$1'$sp_" at last [].w_+vec_(-dimen_/8,0) $5};')dnl ifelse(`$2',,,`{"sp_$`$2'$sp_" at last []$4 $5};')dnl ifelse(`$3',,,`{"sp_$`$3'$sp_" at last [].e_+vec_( dimen_/8,0) $5};') ') oblique element label `dlabel(long,lateral,label,label,label)' define(`dlabel',`dnl ifelse(`$3',,,`{"$`$3'$" at last [].c+vec_(-(`$1'),`$2')};')dnl ifelse(`$4',,,`{"$`$4'$" at last [].c+vec_(0,`$2')};')dnl ifelse(`$5',,,`{"$`$5'$" at last [].c+vec_(`$1',`$2')};') ') `eleminit_( linespec )' compute element direction and length define(`eleminit_',`rpoint_(ifelse(`$1',,`to rvec_(elen_,0)',`$1')) ') `par_( top element, bottom element, height )' Top & bottem elements must have the same length define(`par_',`[Start: Here line from Start + vec_(0,$3/2) to Start + vec_(0,-($3/2)) move to Start + vec_(0,$3/2); $1 move to Start + vec_(0,-($3/2)); $2 line to rvec_(0,$3) End: last line.c] with .Start at Here move to last [].End') Conductor Cross-over, diverting left or right `hop( L|R, location)' define(`hoprad_',`dimen_/12') define(`hop',`{arc ifelse(`$1',R,c)cw from Here to rvec_(2*hoprad_,0)\ with .c ifelse(`$2',,`at rvec_(hoprad_,0)',`$2')} move to last arc.c + vec_(hoprad_,0)') Size parameter define(`dimen_',`linewid') Source element radius define(`sourcerad_',`0.25*dimen_') Controlled Source width/2 define(`csdim_',`(dimen_*0.3)') Element length: define(`elen_',`dimen_*3/2') Delay elements: define(`delay_rad_',`0.35*dimen_') right_ Sets global variables. define(`cct_init',`dnl gen_init ') Define `x_' etc for horiz and vert lines divert(0)dnl psset_(arrowsize=1.2pt 4`,'arrowlength=1.64`,'arrowinset=0)dnl