% Copyright 2018-2021 by Romano Giannetti % Copyright 2015-2021 by Stefan Lindner % Copyright 2013-2021 by Stefan Erhardt % Copyright 2007-2021 by Massimo Redaelli % % This file may be distributed and/or modified % % 1. under the LaTeX Project Public License and/or % 2. under the GNU Public License. % % See the files gpl-3.0_license.txt and lppl-1-3c_license.txt for more details. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Tripoles %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Logic Ports %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Settings for Logic ports%<<<1 %% beware that the third option is in IEEE ports in pgfcircmultipoles.tex % switches for logic gates % \pgfkeys{/tikz/number inputs/.initial=0} \pgfkeys{/tikz/number inputs/.default=0} \newif\ifpgf@circuit@europeanlogicport \ctikzset{logic ports/.is choice} \ctikzset{logic ports/european/.code= {\pgf@circuit@europeanlogicporttrue \tikzset{and port/.style={shape=european and port}}% \tikzset{or port/.style={shape=european or port}}% \tikzset{xor port/.style={shape=european xor port}}% \tikzset{buffer port/.style={shape=european buffer port}}% \tikzset{not port/.style={shape=european not port}}% \tikzset{nand port/.style={shape=european nand port}}% \tikzset{nor port/.style={shape=european nor port}}% \tikzset{xnor port/.style={shape=european xnor port}}% % there is no Schmitt ports in european style (yet) \tikzset{schmitt port/.style={shape=schmitt}}% \tikzset{invschmitt port/.style={shape=invschmitt}}% }} \ctikzset{logic ports/american/.code= {\pgf@circuit@europeanlogicportfalse \tikzset{and port/.style={shape=american and port}}% \tikzset{or port/.style={shape=american or port}}% \tikzset{xor port/.style={shape=american xor port}}% \tikzset{buffer port/.style={shape=american buffer port}}% \tikzset{not port/.style={shape=american not port}}% \tikzset{nand port/.style={shape=american nand port}}% \tikzset{nor port/.style={shape=american nor port}}% \tikzset{xnor port/.style={shape=american xnor port}}% \tikzset{schmitt port/.style={shape=schmitt}}% \tikzset{invschmitt port/.style={shape=invschmitt}}% }} \ctikzset{logic ports origin/.is choice} \ctikzset{logic ports origin/legacy/.code={ \ctikzset{tripoles/american and port/origin/.initial=0.8}% \ctikzset{tripoles/american nand port/origin/.initial=0.8}% \ctikzset{tripoles/american nor port/origin/.initial=0.8}% \ctikzset{tripoles/american or port/origin/.initial=0.8}% \ctikzset{tripoles/american xor port/origin/.initial=0.8}% \ctikzset{tripoles/american xnor port/origin/.initial=0.8}% \ctikzset{tripoles/european and port/origin/.initial=0.8}% \ctikzset{tripoles/european nand port/origin/.initial=0.8}% \ctikzset{tripoles/european or port/origin/.initial=0.8}% \ctikzset{tripoles/european nor port/origin/.initial=0.8}% \ctikzset{tripoles/european xor port/origin/.initial=0.8}% \ctikzset{tripoles/european xnor port/origin/.initial=0.8}% \ctikzset{tripoles/european buffer port/origin/.initial=0.8}% \ctikzset{tripoles/european not port/origin/.initial=0.8}% }% } \ctikzset{logic ports origin/center/.code={% \ctikzset{tripoles/american and port/origin/.initial=0}% \ctikzset{tripoles/american nand port/origin/.initial=0}% \ctikzset{tripoles/american nor port/origin/.initial=0}% \ctikzset{tripoles/american or port/origin/.initial=0}% \ctikzset{tripoles/american xor port/origin/.initial=0}% \ctikzset{tripoles/american xnor port/origin/.initial=0}% \ctikzset{tripoles/european and port/origin/.initial=0}% \ctikzset{tripoles/european nand port/origin/.initial=0}% \ctikzset{tripoles/european or port/origin/.initial=0}% \ctikzset{tripoles/european nor port/origin/.initial=0}% \ctikzset{tripoles/european xor port/origin/.initial=0}% \ctikzset{tripoles/european xnor port/origin/.initial=0}% \ctikzset{tripoles/european buffer port/origin/.initial=0}% \ctikzset{tripoles/european not port/origin/.initial=0}% }% } \newif\ifpgfcirc@roundy@or@shapes\pgfcirc@roundy@or@shapesfalse \ctikzset{american or shape/.is choice} \ctikzset{american or shape/roundy/.code={\pgfcirc@roundy@or@shapestrue}} \ctikzset{american or shape/pointy/.code={\pgfcirc@roundy@or@shapesfalse}} \newif\ifpgfcirc@draw@input@leads\pgfcirc@draw@input@leadstrue \ctikzset{logic ports draw input leads/.is choice} \ctikzset{logic ports draw input leads/true/.code={\pgfcirc@draw@input@leadstrue}} \ctikzset{logic ports draw input leads/false/.code={\pgfcirc@draw@input@leadsfalse}} \tikzset{input leads/.code={\pgfcirc@draw@input@leadstrue}} \tikzset{no input leads/.code={\pgfcirc@draw@input@leadsfalse}} \newif\ifpgfcirc@draw@output@leads\pgfcirc@draw@output@leadstrue \ctikzset{logic ports draw output leads/.is choice} \ctikzset{logic ports draw output leads/true/.code={\pgfcirc@draw@output@leadstrue}} \ctikzset{logic ports draw output leads/false/.code={\pgfcirc@draw@output@leadsfalse}} \tikzset{output leads/.code={\pgfcirc@draw@output@leadstrue}} \tikzset{no output leads/.code={\pgfcirc@draw@output@leadsfalse}} \ctikzset{logic ports draw leads/.is choice} \ctikzset{logic ports draw leads/true/.code={\pgfcirc@draw@output@leadstrue\pgfcirc@draw@input@leadstrue}} \ctikzset{logic ports draw leads/false/.code={\pgfcirc@draw@output@leadsfalse\pgfcirc@draw@input@leadsfalse}} \tikzset{all leads/.code={\pgfcirc@draw@output@leadstrue\pgfcirc@draw@input@leadstrue}} \tikzset{no leads/.code={\pgfcirc@draw@output@leadsfalse\pgfcirc@draw@input@leadsfalse}} % adding a different style of xnor port % see https://github.com/circuitikz/circuitikz/issues/467 \ctikzset{european xnor style/.is choice} \ctikzset{european xnor style/default/.code={% \pgfcircdeclareeurologicport{xnor}{$=1$}{\pgf@circ@res@count}{not}}% } \ctikzset{european xnor style/direct/.code={% \pgfcircdeclareeurologicport{xnor}{$=$}{\pgf@circ@res@count}{}}% } % old, legacy keys that should be killed over \ctikzset{bipoles/buffer/height/.initial=1} \ctikzset{bipoles/buffer/width/.initial=1} \ctikzset{bipoles/not port/width/.initial=1} \ctikzset{bipoles/not port/height/.initial=.8} \ctikzset{bipoles/not port/circle width/.initial=.15} \ctikzset{tripoles/american and port/width/.initial=1.1} \ctikzset{tripoles/american and port/height/.initial=.8} \ctikzset{tripoles/american and port/port width/.initial=.7} \ctikzset{tripoles/american and port/input height/.initial=.5} \ctikzset{tripoles/american nand port/width/.initial=1.1} \ctikzset{tripoles/american nand port/height/.initial=.8} \ctikzset{tripoles/american nand port/port width/.initial=.7} \ctikzset{tripoles/american nand port/circle width/.initial=.15} \ctikzset{tripoles/american nand port/input height/.initial=.5} \ctikzset{tripoles/american or port/width/.initial=1.1} \ctikzset{tripoles/american or port/height/.initial=.8} \ctikzset{tripoles/american or port/port width/.initial=.7} \ctikzset{tripoles/american or port/input height/.initial=.5} \ctikzset{tripoles/american or port/input skip/.initial=.25} \ctikzset{tripoles/american or port/aaa/.initial=.6} \ctikzset{tripoles/american or port/bbb/.initial=.4} \ctikzset{tripoles/american or port/ccc/.initial=.5} \ctikzset{tripoles/american or port/ddd/.initial=.0} \ctikzset{tripoles/american nor port/width/.initial=1.1} \ctikzset{tripoles/american nor port/height/.initial=.8} \ctikzset{tripoles/american nor port/port width/.initial=.7} \ctikzset{tripoles/american nor port/input height/.initial=.5} \ctikzset{tripoles/american nor port/input skip/.initial=.25} \ctikzset{tripoles/american nor port/circle width/.initial=.15} \ctikzset{tripoles/american nor port/aaa/.initial=.6} \ctikzset{tripoles/american nor port/bbb/.initial=.4} \ctikzset{tripoles/american nor port/ccc/.initial=.5} \ctikzset{tripoles/american nor port/ddd/.initial=.0} \ctikzset{tripoles/american xor port/width/.initial=1.1} \ctikzset{tripoles/american xor port/height/.initial=.8} \ctikzset{tripoles/american xor port/port width/.initial=.7} \ctikzset{tripoles/american xor port/input height/.initial=.5} \ctikzset{tripoles/american xor port/input skip/.initial=.15} \ctikzset{tripoles/american xor port/distance/.initial=.1} \ctikzset{tripoles/american xnor port/width/.initial=1.1} \ctikzset{tripoles/american xnor port/height/.initial=.8} \ctikzset{tripoles/american xnor port/port width/.initial=.7} \ctikzset{tripoles/american xnor port/input height/.initial=.5} \ctikzset{tripoles/american xnor port/input skip/.initial=.15} \ctikzset{tripoles/american xnor port/distance/.initial=.1} \ctikzset{tripoles/american xnor port/circle width/.initial=.15} \ctikzset{tripoles/american and port/origin/.initial=0.8} \ctikzset{tripoles/american and port/inputs/.initial=2} % variable number of inputs \ctikzset{tripoles/american nand port/origin/.initial=0.8} \ctikzset{tripoles/american nand port/inputs/.initial=2} \ctikzset{tripoles/american nor port/origin/.initial=0.8} \ctikzset{tripoles/american nor port/inputs/.initial=2} \ctikzset{tripoles/american nor port/angle/.initial=70} \ctikzset{tripoles/american nor port/inner/.initial=0.3} \ctikzset{tripoles/american or port/origin/.initial=0.8} \ctikzset{tripoles/american or port/inputs/.initial=2} \ctikzset{tripoles/american or port/angle/.initial=70} \ctikzset{tripoles/american or port/inner/.initial=0.3} \ctikzset{tripoles/american xor port/origin/.initial=0.8} \ctikzset{tripoles/american xor port/inputs/.initial=2} \ctikzset{tripoles/american xor port/angle/.initial=70} \ctikzset{tripoles/american xor port/inner/.initial=0.3} \ctikzset{tripoles/american xnor port/origin/.initial=0.8} \ctikzset{tripoles/american xnor port/inputs/.initial=2} \ctikzset{tripoles/american xnor port/angle/.initial=70} \ctikzset{tripoles/american xnor port/inner/.initial=0.3} \ctikzset{tripoles/european and port/width/.initial=1.4} \ctikzset{tripoles/european and port/height/.initial=.65} \ctikzset{tripoles/european and port/reserved/.initial=.6} \ctikzset{tripoles/european and port/input height/.initial=.6} \ctikzset{tripoles/european or port/width/.initial=1.4} \ctikzset{tripoles/european or port/height/.initial=.65} \ctikzset{tripoles/european or port/reserved/.initial=.6} \ctikzset{tripoles/european or port/input height/.initial=.6} \ctikzset{tripoles/european xor port/width/.initial=1.4} \ctikzset{tripoles/european xor port/height/.initial=.65} \ctikzset{tripoles/european xor port/reserved/.initial=.6} \ctikzset{tripoles/european xor port/input height/.initial=.6} \ctikzset{tripoles/european nand port/width/.initial=1.4} \ctikzset{tripoles/european nand port/not height/.initial=.3} \ctikzset{tripoles/european nand port/not width/.initial=.8} \ctikzset{tripoles/european nand port/height/.initial=.65} \ctikzset{tripoles/european nand port/reserved/.initial=.6} \ctikzset{tripoles/european nand port/input height/.initial=.6} \ctikzset{tripoles/european buffer port/width/.initial=1.4} \ctikzset{tripoles/european buffer port/not height/.initial=.3} \ctikzset{tripoles/european buffer port/not width/.initial=.8} \ctikzset{tripoles/european buffer port/height/.initial=.65} \ctikzset{tripoles/european buffer port/reserved/.initial=.6} \ctikzset{tripoles/european buffer port/input height/.initial=0} \ctikzset{tripoles/european not port/width/.initial=1.4} \ctikzset{tripoles/european not port/not height/.initial=.3} \ctikzset{tripoles/european not port/not width/.initial=.8} \ctikzset{tripoles/european not port/height/.initial=.65} \ctikzset{tripoles/european not port/reserved/.initial=.6} \ctikzset{tripoles/european not port/input height/.initial=0} \ctikzset{tripoles/european xnor port/width/.initial=1.4} \ctikzset{tripoles/european xnor port/not height/.initial=.3} \ctikzset{tripoles/european xnor port/not width/.initial=.8} \ctikzset{tripoles/european xnor port/height/.initial=.65} \ctikzset{tripoles/european xnor port/reserved/.initial=.6} \ctikzset{tripoles/european xnor port/input height/.initial=.6} \ctikzset{tripoles/european nor port/width/.initial=1.4} \ctikzset{tripoles/european nor port/not height/.initial=.3} \ctikzset{tripoles/european nor port/not width/.initial=.8} \ctikzset{tripoles/european nor port/height/.initial=.65} \ctikzset{tripoles/european nor port/reserved/.initial=.6} \ctikzset{tripoles/european nor port/input height/.initial=.6} % variable number of inputs \ctikzset{tripoles/european and port/origin/.initial=0.8} \ctikzset{tripoles/european and port/inputs/.initial=2} \ctikzset{tripoles/european nand port/origin/.initial=0.8} \ctikzset{tripoles/european nand port/inputs/.initial=2} \ctikzset{tripoles/european or port/origin/.initial=0.8} \ctikzset{tripoles/european or port/inputs/.initial=2} \ctikzset{tripoles/european nor port/origin/.initial=0.8} \ctikzset{tripoles/european nor port/inputs/.initial=2} \ctikzset{tripoles/european xor port/origin/.initial=0.8} \ctikzset{tripoles/european xor port/inputs/.initial=2} \ctikzset{tripoles/european xnor port/origin/.initial=0.8} \ctikzset{tripoles/european xnor port/inputs/.initial=2} \ctikzset{tripoles/european buffer port/origin/.initial=0.8} \ctikzset{tripoles/european buffer port/inputs/.initial=1}% \ctikzset{tripoles/european not port/origin/.initial=0.8} \ctikzset{tripoles/european not port/inputs/.initial=1}% %%% parameters that are not used anymore after multi-input %%% gates --- left for compatibility of source code. \ctikzset{tripoles/american xor port/aaa/.initial=.6} \ctikzset{tripoles/american xor port/bbb/.initial=.4} \ctikzset{tripoles/american xor port/ccc/.initial=.5} \ctikzset{tripoles/american xor port/ddd/.initial=.0} \ctikzset{tripoles/american xnor port/aaa/.initial=.6} \ctikzset{tripoles/american xnor port/bbb/.initial=.4} \ctikzset{tripoles/american xnor port/ccc/.initial=.5} \ctikzset{tripoles/american xnor port/ddd/.initial=.0} %%>>> %% Node shapes for Logic ports%<<< %% %% Code from John Kormylo at tex.stackexchange.com %% See https://tex.stackexchange.com/questions/372993/is-it-possible-to-implement-multiple-input-logic-ports-with-circuitikz %% Integration and fixes from Romano Giannetti and TheTeXnician <38565529+TheTeXnician@users.noreply.github.com> %% \newcount\pgf@circ@res@count% reserve global register \def\pgf@circ@logicport@input#1% #1 = \pgfmathcounter {% \pgfextracty{\pgf@circ@res@up}{\northeast}% \step \pgf@circ@res@step=\dimexpr 2\pgf@y -2\pgf@circ@res@up\relax \advance\pgf@y by -#1\pgf@circ@res@step\relax }% % #1 = \pgfmathcounter #2=type #3 specificic port % type is 1 for and,nand; 2 for or,nor; 3 for xor,xnor, 4 for european. \def\pgf@circ@logicport@baseinput#1#2#3% {% % and and nand \ifnum #2=1\relax \pgfextracty{\pgf@circ@res@up}{\northeast}% \pgfextractx{\pgf@circ@res@left}{\southwest}% \step \pgf@circ@res@step=\dimexpr 2\pgf@y -2\pgf@circ@res@up\relax \advance\pgf@y by -#1\pgf@circ@res@step\relax \pgf@x=\ctikzvalof{tripoles/american #3 port/port width}\pgf@circ@res@left \fi % or and nor \ifnum #2=2\relax \pgfextracty{\pgf@circ@res@up}{\northeast}% \pgfextractx{\pgf@circ@res@left}{\southwest}% \pgfextractx{\pgf@circ@res@right}{\northeast}% \step \pgf@circ@res@step=\dimexpr 2\pgf@y -2\pgf@circ@res@up\relax \advance\pgf@y by -#1\pgf@circ@res@step\relax \edef\pgf@circ@math@angle{\ctikzvalof{tripoles/american #3 port/angle}}% \pgf@circ@res@other=\ctikzvalof{tripoles/american #3 port/inner}\pgf@circ@res@right \pgfmathsetlengthmacro{\pgf@circ@math@xradius}{\pgf@circ@res@other /(1 - cos(\pgf@circ@math@angle)}% \pgfmathsetlengthmacro{\pgf@circ@math@yradius}{\pgf@circ@res@up /sin(\pgf@circ@math@angle)}% \pgf@circ@res@other=\ctikzvalof{tripoles/american #3 port/port width}\pgf@circ@res@right \pgfmathsetlengthmacro{\pgf@circ@math@xorigin}{\pgf@circ@res@other + \pgf@circ@math@xradius*cos(\pgf@circ@math@angle)}% \pgf@circ@res@temp=\pgf@y \pgfmathsetmacro{\pgf@circ@math@angle}{asin(\pgf@circ@res@temp/\pgf@circ@math@yradius)}% \pgfmathsetlength{\pgf@circ@res@other}{\pgf@circ@math@xradius*cos(\pgf@circ@math@angle)-\pgf@circ@math@xorigin}% \pgf@x=\pgf@circ@res@other \fi % xor and xnor \ifnum #2=3\relax \pgfextracty{\pgf@circ@res@up}{\northeast}% \pgfextractx{\pgf@circ@res@left}{\southwest}% \pgfextractx{\pgf@circ@res@right}{\northeast}% \pgfkeysgetvalue{/tikz/circuitikz/tripoles/american #3 port/angle}{\pgf@circ@math@angle}% \pgf@circ@res@other=\ctikzvalof{tripoles/american #3 port/inner}\pgf@circ@res@right \pgfmathsetlengthmacro{\pgf@circ@math@xradius}{\pgf@circ@res@other /(1 - cos(\pgf@circ@math@angle)}% \pgfmathsetlengthmacro{\pgf@circ@math@yradius}{\pgf@circ@res@up / sin(\pgf@circ@math@angle))}% \pgf@circ@res@other=\ctikzvalof{tripoles/american #3 port/port width}\pgf@circ@res@right \pgfmathsetlengthmacro{\pgf@circ@math@xorigin}{\pgf@circ@res@other + \pgf@circ@math@xradius*cos(\pgf@circ@math@angle)}% \pgf@circ@res@temp=\ctikzvalof{tripoles/american #3 port/distance}\pgf@circ@res@right \pgfmathsetlengthmacro{\pgf@circ@math@distance}{\pgf@circ@res@temp} % this compensates for the effect of the line width on the gap between the arcs \pgfmathsetlengthmacro{\pgf@circ@math@yradiusA}{\pgf@circ@math@yradius -2\pgflinewidth}% \pgfmathsetlengthmacro{\pgf@circ@math@xradiusA}{\pgf@circ@math@xradius -2\pgflinewidth}% \step \pgf@circ@res@step=\dimexpr 2\pgf@y -2\pgf@circ@res@up\relax \advance\pgf@y by -#1\pgf@circ@res@step\relax \pgf@circ@res@temp=\pgf@y \pgfmathsetmacro{\pgf@circ@math@angle}{asin(\pgf@circ@res@temp / \pgf@circ@math@yradiusA)}% \pgfmathsetlength{\pgf@circ@res@other}{\pgf@circ@math@xradiusA*cos(\pgf@circ@math@angle)-\pgf@circ@math@xorigin}% \advance\pgf@circ@res@other by -\pgf@circ@math@distance \pgf@x=\pgf@circ@res@other \fi % european \ifnum #2=4\relax \pgfextracty{\pgf@circ@res@up}{\northeast}% \pgfextractx{\pgf@circ@res@other}{\left}% \step \pgf@circ@res@step=\dimexpr 2\pgf@y -2\pgf@circ@res@up\relax \advance\pgf@y by -#1\pgf@circ@res@step\relax \pgf@x=\pgf@circ@res@other \fi }% %%% american \long\def\pgfcircdeclarelogicport#1#2#3{% \pgfdeclareshape{american #1 port}% {% \savedmacro{\ctikzclass}{\edef\ctikzclass{logic ports}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \savedmacro\resize{% automatic \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@circ@res@up = \ctikzvalof{tripoles/american #1 port/height}\pgf@circ@scaled@Rlen \pgf@circ@res@up = .5\pgf@circ@res@up \pgf@circ@res@down = -\pgf@circ@res@up \pgf@circ@res@right = \ctikzvalof{tripoles/american #1 port/width}\pgf@circ@scaled@Rlen \pgf@circ@res@right = .5\pgf@circ@res@right \pgf@circ@res@left = -\pgf@circ@res@right }% \savedmacro\inputs{% get number of inputs \pgf@circ@res@count=\pgfkeysvalueof{/tikz/number inputs}\relax% \ifnum\pgf@circ@res@count=0 \pgf@circ@res@count=\ctikzvalof{tripoles/american #1 port/inputs}\relax% \fi \ifnum\pgf@circ@res@count<2 \pgf@circ@res@count=2\fi \ifnum\pgf@circ@res@count>16 \pgf@circ@res@count=16\fi \def\inputs{\the\pgf@circ@res@count}% }% \savedanchor\step{% 1/2 gap at edges \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@circ@res@step = \ctikzvalof{tripoles/american #1 port/height}\pgf@circ@scaled@Rlen \divide\pgf@circ@res@step by \pgf@circ@res@count \pgfpoint{\pgf@circ@res@left}{\dimexpr\pgf@circ@res@up+0.5\pgf@circ@res@step}% }% \savedanchor\northeast{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up}} \savedanchor\southwest{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@down}} \savedanchor\left{\pgfpoint{\ctikzvalof{tripoles/american #1 port/port width}\pgf@circ@res@left}{0pt}} \savedanchor\right{\pgfpoint{\ctikzvalof{tripoles/american #1 port/port width}\pgf@circ@res@right}{0pt}} \savedanchor\origin{\pgfpoint{\ctikzvalof{tripoles/american #1 port/origin}\pgf@circ@res@right}{0pt}} \anchor{center}{\origin}% for backwards compatibility \anchor{text}{\pgfpoint{-.5\wd\pgfnodeparttextbox}{\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox}} % create input anchors \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@american #1 port\endcsname{% \pgfmathloop% \ifnum\pgfmathcounter>\pgf@circ@res@count% \else% %\pgfutil@ifundefined{pgf@anchor@american #1 port@in \pgfmathcounter}{% \expandafter\xdef\csname pgf@anchor@american #1 port@in \pgfmathcounter\endcsname{% \noexpand\pgf@circ@logicport@input{\pgfmathcounter}% defined above }% \expandafter\xdef\csname pgf@anchor@american #1 port@bin \pgfmathcounter\endcsname{% \noexpand\pgf@circ@logicport@baseinput{\pgfmathcounter}{#2}{#1}% defined above }% %}{}% \repeatpgfmathloop% } \anchor{out}{\northeast\pgf@y=0pt} \anchor{bout}{\right\pgf@y=0pt} \anchor{left}{\left}% edges of component minus leads \anchor{right}{\right} \anchor{north east}{\northeast}% see \Compass macro \anchor{south west}{\southwest} \anchor{north}{\pgfextracty{\pgf@circ@res@up}{\northeast}% \pgfpoint{0cm}{\pgf@circ@res@up}} \anchor{north west}{\pgfextracty{\pgf@circ@res@up}{\northeast}% \pgfextractx{\pgf@circ@res@left}{\southwest}% \pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@up}} \anchor{west}{\pgfextractx{\pgf@circ@res@left}{\southwest}% \pgfpoint{\pgf@circ@res@left}{0cm}} \anchor{south}{\pgfextracty{\pgf@circ@res@down}{\southwest}% \pgfpoint{0cm}{\pgf@circ@res@down}} \anchor{south east}{\pgfextracty{\pgf@circ@res@down}{\southwest}% \pgfextractx{\pgf@circ@res@right}{\northeast}% \pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down}} \anchor{east}{\pgfextractx{\pgf@circ@res@right}{\northeast}% \pgfpoint{\pgf@circ@res@right}{0cm}} \backgroundpath{ \pgfsetcolor{\ctikzvalof{color}} #3 } } } %%% american and %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pgfcircdeclarelogicport{and}{1}{ \pgfextracty{\pgf@circ@res@temp}{\step}% \pgf@circ@res@step = \dimexpr 2\pgf@circ@res@temp -2\pgf@circ@res@up\relax \pgf@circ@res@count = \inputs\relax \ifpgfcirc@draw@input@leads %input leads \loop\ifnum\pgf@circ@res@count>0 \advance\pgf@circ@res@temp by -\pgf@circ@res@step \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@temp}}% \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/american and port/port width}\pgf@circ@res@left} {\pgf@circ@res@temp}} \advance\pgf@circ@res@count by -1 \repeat \fi % output lead \ifpgfcirc@draw@output@leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/american and port/port width}\pgf@circ@res@right} {0pt}} \pgfusepath{draw} \fi \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgf@circ@res@other=\ctikzvalof{tripoles/american and port/port width}\pgf@circ@res@left \pgfpathmoveto{\pgfpoint{\pgf@circ@res@other}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{\pgf@circ@res@down}} \pgfpatharc{-90}{90}{-2\pgf@circ@res@other and \pgf@circ@res@up} \pgfpathclose \pgf@circ@draworfill } %%% american nand %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pgfcircdeclarelogicport{nand}{1}{ \pgfextracty{\pgf@circ@res@temp}{\step}% \pgf@circ@res@step = \dimexpr 2\pgf@circ@res@temp -2\pgf@circ@res@up\relax \pgf@circ@res@count = \inputs\relax \ifpgfcirc@draw@input@leads %input leads \loop\ifnum\pgf@circ@res@count>0 \advance\pgf@circ@res@temp by -\pgf@circ@res@step \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@temp}}% \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/american nand port/port width}\pgf@circ@res@left} {\pgf@circ@res@temp}} \advance\pgf@circ@res@count by -1 \repeat \fi \ifpgfcirc@draw@output@leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/american nand port/port width}\pgf@circ@res@right} {0pt}} \pgfusepath{draw} \fi \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgf@circ@res@step = \ctikzvalof{tripoles/american nand port/circle width}\pgf@circ@res@right \pgf@circ@res@other = \ctikzvalof{tripoles/american nand port/port width}\pgf@circ@res@right \pgf@circ@res@temp = \dimexpr 2\pgf@circ@res@other - \pgf@circ@res@step\relax \pgfpathmoveto{\pgfpoint{-\pgf@circ@res@other}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{-\pgf@circ@res@other}{\pgf@circ@res@down}} \pgfpatharc{-90}{90}{\pgf@circ@res@temp and \pgf@circ@res@up} \pgfpathclose \pgfpathellipse {\pgfpoint{\pgf@circ@res@other-.5\pgf@circ@res@step}{0pt}} {\pgfpoint{.5\pgf@circ@res@step}{0pt}} {\pgfpoint{0pt}{.5\pgf@circ@res@step}} \pgf@circ@draworfill } %%% american nor %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pgfcircdeclarelogicport{nor}{2}{ \edef\pgf@circ@math@angle{\ctikzvalof{tripoles/american nor port/angle}}% \pgf@circ@res@other=\ctikzvalof{tripoles/american nor port/inner}\pgf@circ@res@right \pgfmathsetlengthmacro{\pgf@circ@math@xradius}{\pgf@circ@res@other /(1 - cos(\pgf@circ@math@angle)}% \pgfmathsetlengthmacro{\pgf@circ@math@yradius}{\pgf@circ@res@up /sin(\pgf@circ@math@angle)}% \pgf@circ@res@other=\ctikzvalof{tripoles/american nor port/port width}\pgf@circ@res@right \pgfmathsetlengthmacro{\pgf@circ@math@xorigin}{\pgf@circ@res@other + \pgf@circ@math@xradius*cos(\pgf@circ@math@angle)}% \pgfextracty{\pgf@circ@res@temp}{\step}% \pgf@circ@res@step = \dimexpr 2\pgf@circ@res@temp -2\pgf@circ@res@up\relax \pgf@circ@res@count = \inputs\relax \ifpgfcirc@draw@input@leads %input leads \loop\ifnum\pgf@circ@res@count>0 \advance\pgf@circ@res@temp by -\pgf@circ@res@step \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@temp}}% \pgfmathsetmacro{\pgf@circ@math@angle}{asin(\pgf@circ@res@temp/\pgf@circ@math@yradius)}% \pgfmathsetlength{\pgf@circ@res@other}{\pgf@circ@math@xradius*cos(\pgf@circ@math@angle)-\pgf@circ@math@xorigin}% \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{\pgf@circ@res@temp}}% \advance\pgf@circ@res@count by -1 \repeat \fi \pgf@circ@res@other=\ctikzvalof{tripoles/american nor port/port width}\pgf@circ@res@right \ifpgfcirc@draw@output@leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{0pt}} \pgfusepath{draw} \fi \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \edef\pgf@circ@math@angle{\ctikzvalof{tripoles/american nor port/angle}}% \pgf@circ@res@step = \ctikzvalof{tripoles/american nor port/circle width}\pgf@circ@res@right \pgf@circ@res@temp = \dimexpr 2\pgf@circ@res@other - \pgf@circ@res@step\relax \advance\pgf@circ@res@other by -\pgf@circ@res@step % main shape \ifpgfcirc@roundy@or@shapes \pgfpathmoveto{\pgfpoint{\pgf@circ@res@other}{0pt}}% for symmetry \pgfpatharc{0}{90}{\pgf@circ@res@temp and \pgf@circ@res@up}% \pgfpatharc{\pgf@circ@math@angle}{-\pgf@circ@math@angle}{\pgf@circ@math@xradius and \pgf@circ@math@yradius}% \pgfpatharc{-90}{0}{\pgf@circ@res@temp and \pgf@circ@res@up}% \pgfpathclose \else \pgfmathsetlength{\pgf@circ@res@temp}{\pgf@circ@math@xradius*cos(\pgf@circ@math@angle)-\pgf@circ@math@xorigin}% \pgfpathmoveto{\pgfpoint{\pgf@circ@res@temp}{\pgf@circ@res@up}} \pgfpatharc{\pgf@circ@math@angle}{-\pgf@circ@math@angle}{\pgf@circ@math@xradius and \pgf@circ@math@yradius}% \pgfpathcurveto{\pgfpoint{0.3\pgf@circ@res@right}{\pgf@circ@res@down}}{\pgfpoint{0.3\pgf@circ@res@right}{0.5\pgf@circ@res@down}}{\pgfpoint{\pgf@circ@res@other}{0pt}} \pgfpathcurveto{\pgfpoint{0.3\pgf@circ@res@right}{0.5\pgf@circ@res@up}}{\pgfpoint{0.3\pgf@circ@res@right}{\pgf@circ@res@up}}{\pgfpoint{\pgf@circ@res@temp}{\pgf@circ@res@up}} \pgfpathclose \fi % not dot \pgfpathellipse {\pgfpoint{\pgf@circ@res@other+.5\pgf@circ@res@step}{0pt}} {\pgfpoint{.5\pgf@circ@res@step}{0pt}} {\pgfpoint{0pt}{.5\pgf@circ@res@step}} \pgf@circ@draworfill } %%% american or %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pgfcircdeclarelogicport{or}{2}{ \edef\pgf@circ@math@angle{\ctikzvalof{tripoles/american or port/angle}}% \pgf@circ@res@other=\ctikzvalof{tripoles/american or port/inner}\pgf@circ@res@right \pgfmathsetlengthmacro{\pgf@circ@math@xradius}{\pgf@circ@res@other /(1 - cos(\pgf@circ@math@angle)}% \pgfmathsetlengthmacro{\pgf@circ@math@yradius}{\pgf@circ@res@up /sin(\pgf@circ@math@angle)}% \pgf@circ@res@other=\ctikzvalof{tripoles/american or port/port width}\pgf@circ@res@right \pgfmathsetlengthmacro{\pgf@circ@math@xorigin}{\pgf@circ@res@other + \pgf@circ@math@xradius*cos(\pgf@circ@math@angle)}% \pgfextracty{\pgf@circ@res@temp}{\step}% \pgf@circ@res@step = \dimexpr 2\pgf@circ@res@temp -2\pgf@circ@res@up\relax \pgf@circ@res@count = \inputs\relax \ifpgfcirc@draw@input@leads %input leads \loop\ifnum\pgf@circ@res@count>0 \advance\pgf@circ@res@temp by -\pgf@circ@res@step \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@temp}}% \pgfmathsetmacro{\pgf@circ@math@angle}{asin(\pgf@circ@res@temp/\pgf@circ@math@yradius)}% \pgfmathsetlength{\pgf@circ@res@other}{\pgf@circ@math@xradius*cos(\pgf@circ@math@angle)-\pgf@circ@math@xorigin}% \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{\pgf@circ@res@temp}}% \advance\pgf@circ@res@count by -1 \repeat \fi \pgf@circ@res@other=\ctikzvalof{tripoles/american or port/port width}\pgf@circ@res@right \ifpgfcirc@draw@output@leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{0pt}} \pgfusepath{draw} \fi \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \edef\pgf@circ@math@angle{\ctikzvalof{tripoles/american or port/angle}}% % main shape \ifpgfcirc@roundy@or@shapes \pgfpathmoveto{\pgfpoint{\pgf@circ@res@other}{0pt}}% for symmetry \pgfpatharc{0}{90}{2\pgf@circ@res@other and \pgf@circ@res@up}% \pgfpatharc{\pgf@circ@math@angle}{-\pgf@circ@math@angle}{\pgf@circ@math@xradius and \pgf@circ@math@yradius}% \pgfpatharc{-90}{0}{2\pgf@circ@res@other and \pgf@circ@res@up}% \pgfpathclose \else \pgfmathsetlength{\pgf@circ@res@temp}{\pgf@circ@math@xradius*cos(\pgf@circ@math@angle)-\pgf@circ@math@xorigin}% \pgfpathmoveto{\pgfpoint{\pgf@circ@res@temp}{\pgf@circ@res@up}} \pgfpatharc{\pgf@circ@math@angle}{-\pgf@circ@math@angle}{\pgf@circ@math@xradius and \pgf@circ@math@yradius}% \pgfpathcurveto{\pgfpoint{0.3\pgf@circ@res@right}{\pgf@circ@res@down}}{\pgfpoint{0.3\pgf@circ@res@right}{0.5\pgf@circ@res@down}}{\pgfpoint{\pgf@circ@res@other}{0pt}} \pgfpathcurveto{\pgfpoint{0.3\pgf@circ@res@right}{0.5\pgf@circ@res@up}}{\pgfpoint{0.3\pgf@circ@res@right}{\pgf@circ@res@up}}{\pgfpoint{\pgf@circ@res@temp}{\pgf@circ@res@up}} \pgfpathclose \fi \pgf@circ@draworfill } %%% american xor %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pgfcircdeclarelogicport{xor}{3}{ \pgfkeysgetvalue{/tikz/circuitikz/tripoles/american xor port/angle}{\pgf@circ@math@angle}% \pgf@circ@res@other=\ctikzvalof{tripoles/american xor port/inner}\pgf@circ@res@right \pgfmathsetlengthmacro{\pgf@circ@math@xradius}{\pgf@circ@res@other /(1 - cos(\pgf@circ@math@angle)}% \pgfmathsetlengthmacro{\pgf@circ@math@yradius}{\pgf@circ@res@up / sin(\pgf@circ@math@angle))}% \pgf@circ@res@other=\ctikzvalof{tripoles/american xor port/port width}\pgf@circ@res@right \pgfmathsetlengthmacro{\pgf@circ@math@xorigin}{\pgf@circ@res@other + \pgf@circ@math@xradius*cos(\pgf@circ@math@angle)}% \pgf@circ@res@temp=\ctikzvalof{tripoles/american xor port/distance}\pgf@circ@res@right \pgfmathsetlengthmacro{\pgf@circ@math@distance}{\pgf@circ@res@temp} % this compensates for the effect of the line width on the gap between the arcs \pgfmathsetlengthmacro{\pgf@circ@math@yradiusA}{\pgf@circ@math@yradius -2\pgflinewidth}% \pgfmathsetlengthmacro{\pgf@circ@math@xradiusA}{\pgf@circ@math@xradius -2\pgflinewidth}% \pgfextracty{\pgf@circ@res@temp}{\step}% \pgf@circ@res@step = \dimexpr 2\pgf@circ@res@temp -2\pgf@circ@res@up\relax \pgf@circ@res@count = \inputs\relax \ifpgfcirc@draw@input@leads %input leads \loop\ifnum\pgf@circ@res@count>0 \advance\pgf@circ@res@temp by -\pgf@circ@res@step \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@temp}}% \pgfmathsetmacro{\pgf@circ@math@angle}{asin(\pgf@circ@res@temp / \pgf@circ@math@yradiusA)}% \pgfmathsetlength{\pgf@circ@res@other}{\pgf@circ@math@xradiusA*cos(\pgf@circ@math@angle)-\pgf@circ@math@xorigin}% \advance\pgf@circ@res@other by -\pgf@circ@math@distance \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{\pgf@circ@res@temp}}% \advance\pgf@circ@res@count by -1 \repeat \fi \pgf@circ@res@other=\ctikzvalof{tripoles/american xor port/port width}\pgf@circ@res@right \ifpgfcirc@draw@output@leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{0pt}} \pgfusepath{draw} \fi \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \edef\pgf@circ@math@angle{\ctikzvalof{tripoles/american xor port/angle}}% % main shape \ifpgfcirc@roundy@or@shapes \pgfpathmoveto{\pgfpoint{\pgf@circ@res@other}{0pt}}% for symmetry \pgfpatharc{0}{90}{2\pgf@circ@res@other and \pgf@circ@res@up}% \pgfpatharc{\pgf@circ@math@angle}{-\pgf@circ@math@angle}{\pgf@circ@math@xradius and \pgf@circ@math@yradius}% \pgfpatharc{-90}{0}{2\pgf@circ@res@other and \pgf@circ@res@up}% \pgfpathclose \else \pgfmathsetlength{\pgf@circ@res@temp}{\pgf@circ@math@xradius*cos(\pgf@circ@math@angle)-\pgf@circ@math@xorigin}% \pgfpathmoveto{\pgfpoint{\pgf@circ@res@temp}{\pgf@circ@res@up}} \pgfpatharc{\pgf@circ@math@angle}{-\pgf@circ@math@angle}{\pgf@circ@math@xradius and \pgf@circ@math@yradius}% \pgfpathcurveto{\pgfpoint{0.3\pgf@circ@res@right}{\pgf@circ@res@down}}{\pgfpoint{0.3\pgf@circ@res@right}{0.5\pgf@circ@res@down}}{\pgfpoint{\pgf@circ@res@other}{0pt}} \pgfpathcurveto{\pgfpoint{0.3\pgf@circ@res@right}{0.5\pgf@circ@res@up}}{\pgfpoint{0.3\pgf@circ@res@right}{\pgf@circ@res@up}}{\pgfpoint{\pgf@circ@res@temp}{\pgf@circ@res@up}} \pgfpathclose \fi \pgf@circ@draworfill \pgfmathsetlength{\pgf@circ@res@temp}{(\pgf@circ@math@yradiusA)*sin(\pgf@circ@math@angle)}% \pgfpathmoveto{\pgfpoint{-\pgf@circ@res@other-\pgf@circ@math@distance}{\pgf@circ@res@temp}}% first arc \pgfpatharc{\pgf@circ@math@angle}{-\pgf@circ@math@angle}{\pgf@circ@math@xradiusA and \pgf@circ@math@yradiusA}% \pgfusepath{draw} } %%% american xnor %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pgfcircdeclarelogicport{xnor}{3}{ \pgfkeysgetvalue{/tikz/circuitikz/tripoles/american xnor port/angle}{\pgf@circ@math@angle}% \pgf@circ@res@other=\ctikzvalof{tripoles/american xnor port/inner}\pgf@circ@res@right \pgfmathsetlengthmacro{\pgf@circ@math@xradius}{\pgf@circ@res@other /(1 - cos(\pgf@circ@math@angle)}% \pgfmathsetlengthmacro{\pgf@circ@math@yradius}{\pgf@circ@res@up / sin(\pgf@circ@math@angle))}% \pgf@circ@res@other=\ctikzvalof{tripoles/american xnor port/port width}\pgf@circ@res@right \pgfmathsetlengthmacro{\pgf@circ@math@xorigin}{\pgf@circ@res@other + \pgf@circ@math@xradius*cos(\pgf@circ@math@angle)}% \pgf@circ@res@temp=\ctikzvalof{tripoles/american xor port/distance}\pgf@circ@res@right \pgfmathsetlengthmacro{\pgf@circ@math@distance}{\pgf@circ@res@temp} % this compensates for the effect of the line width on the gap between the arcs \pgfmathsetlengthmacro{\pgf@circ@math@yradiusA}{\pgf@circ@math@yradius -2\pgflinewidth}% \pgfmathsetlengthmacro{\pgf@circ@math@xradiusA}{\pgf@circ@math@xradius -2\pgflinewidth}% \pgfextracty{\pgf@circ@res@temp}{\step}% \pgf@circ@res@step = \dimexpr 2\pgf@circ@res@temp -2\pgf@circ@res@up\relax \pgf@circ@res@count = \inputs\relax \ifpgfcirc@draw@input@leads %input leads \loop\ifnum\pgf@circ@res@count>0 \advance\pgf@circ@res@temp by -\pgf@circ@res@step \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@temp}}% \pgfmathsetmacro{\pgf@circ@math@angle}{asin(\pgf@circ@res@temp / \pgf@circ@math@yradiusA)}% \pgfmathsetlength{\pgf@circ@res@other}{\pgf@circ@math@xradiusA*cos(\pgf@circ@math@angle)-\pgf@circ@math@xorigin}% \advance\pgf@circ@res@other by -\pgf@circ@math@distance \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{\pgf@circ@res@temp}}% \advance\pgf@circ@res@count by -1 \repeat \fi \pgf@circ@res@other=\ctikzvalof{tripoles/american xnor port/port width}\pgf@circ@res@right \ifpgfcirc@draw@output@leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{0pt}} \pgfusepath{draw} \fi \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \edef\pgf@circ@math@angle{\ctikzvalof{tripoles/american xnor port/angle}}% \pgf@circ@res@step = \ctikzvalof{tripoles/american xnor port/circle width}\pgf@circ@res@right \pgf@circ@res@temp = \dimexpr 2\pgf@circ@res@other - \pgf@circ@res@step\relax \advance\pgf@circ@res@other by -\pgf@circ@res@step % main shape \ifpgfcirc@roundy@or@shapes \pgfpathmoveto{\pgfpoint{\pgf@circ@res@other}{0pt}}% for symmetry \pgfpatharc{0}{90}{\pgf@circ@res@temp and \pgf@circ@res@up}% \pgfpatharc{\pgf@circ@math@angle}{-\pgf@circ@math@angle}{\pgf@circ@math@xradius and \pgf@circ@math@yradius}% \pgfpatharc{-90}{0}{\pgf@circ@res@temp and \pgf@circ@res@up}% \pgfpathclose \else \pgfmathsetlength{\pgf@circ@res@temp}{\pgf@circ@math@xradius*cos(\pgf@circ@math@angle)-\pgf@circ@math@xorigin}% \pgfpathmoveto{\pgfpoint{\pgf@circ@res@temp}{\pgf@circ@res@up}} \pgfpatharc{\pgf@circ@math@angle}{-\pgf@circ@math@angle}{\pgf@circ@math@xradius and \pgf@circ@math@yradius}% \pgfpathcurveto{\pgfpoint{0.3\pgf@circ@res@right}{\pgf@circ@res@down}}{\pgfpoint{0.3\pgf@circ@res@right}{0.5\pgf@circ@res@down}}{\pgfpoint{\pgf@circ@res@other}{0pt}} \pgfpathcurveto{\pgfpoint{0.3\pgf@circ@res@right}{0.5\pgf@circ@res@up}}{\pgfpoint{0.3\pgf@circ@res@right}{\pgf@circ@res@up}}{\pgfpoint{\pgf@circ@res@temp}{\pgf@circ@res@up}} \pgfpathclose \fi \pgfpathellipse {\pgfpoint{\pgf@circ@res@other+.5\pgf@circ@res@step}{0pt}} {\pgfpoint{.5\pgf@circ@res@step}{0pt}} {\pgfpoint{0pt}{.5\pgf@circ@res@step}} \pgf@circ@draworfill \pgf@circ@res@other=\ctikzvalof{tripoles/american xnor port/port width}\pgf@circ@res@left \pgfmathsetlength{\pgf@circ@res@temp}{(\pgf@circ@math@yradiusA)*sin(\pgf@circ@math@angle)}% \pgfpathmoveto{\pgfpoint{\pgf@circ@res@other-\pgf@circ@math@distance}{\pgf@circ@res@temp}}% first arc \pgfpatharc{\pgf@circ@math@angle}{-\pgf@circ@math@angle}{\pgf@circ@math@xradiusA and \pgf@circ@math@yradiusA}% \pgfusepath{draw} } %%% Original one-input ports \pgfdeclareshape{american not port}{ \savedmacro{\ctikzclass}{\edef\ctikzclass{logic ports}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \anchor{center}{\pgfpointorigin} \savedanchor\northwest{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{bipoles/not port/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{bipoles/not port/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{in}{ \northwest \pgf@y=0pt } \anchor{in 1}{ \northwest \pgf@y=0pt } \anchor{left}{ \northwest \pgf@x=0.7\pgf@x \pgf@y=0pt } \anchor{bin}{ \northwest \pgf@x=0.7\pgf@x \pgf@y=0pt } \anchor{bin 1}{ \northwest \pgf@y=0pt \pgf@x=0.7\pgf@x } \anchor{out}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } \anchor{right}{ \northwest \pgf@y=0pt \pgf@x=-0.7\pgf@x } \anchor{bout}{ \northwest \pgf@y=0pt \pgf@x=-0.7\pgf@x } \anchor{center}{ \pgfpointorigin } \anchor{east}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } \anchor{west}{ \northwest \pgf@y=0pt } \anchor{south}{ \northwest \pgf@x=0pt \pgf@y=-\pgf@y } \anchor{north}{ \northwest \pgf@x=0pt } \anchor{south west}{ \northwest \pgf@y=-\pgf@y } \anchor{north east}{ \northwest \pgf@x=-\pgf@x } \anchor{north west}{ \northwest } \anchor{south east}{ \northwest \pgf@x=-\pgf@x \pgf@y=-\pgf@y } \anchorborder{% this is used when the node is used as a path element \pgf@xa=\pgf@x \pgf@ya=\pgf@y \pgfextracty{\pgf@circ@res@up}{\northwest} \pgfextractx{\pgf@circ@res@left}{\northwest} \pgfpointborderrectangle{\pgfpoint{\pgf@xa}{\pgf@ya}} {\pgfpoint{-\pgf@circ@res@left}{\pgf@circ@res@up}} } \anchor{text}{% % centered and a bit to the left (it's a triangle)! \pgf@x=\dimexpr -.6\wd\pgfnodeparttextbox\relax \pgf@y=\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox\relax } \backgroundpath{ \pgfsetcolor{\ctikzvalof{color}} \northwest \pgf@circ@res@up = \pgf@y \pgf@circ@res@down = -\pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgf@circ@res@other = \ctikzvalof{bipoles/not port/circle width}\pgf@circ@res@right \pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgftransformxshift{.7\pgf@circ@res@left} \pgf@circ@res@step=\pgf@circ@res@right \advance\pgf@circ@res@step by -\pgf@circ@res@left \pgf@circ@res@step=.7\pgf@circ@res@step \pgfpathmoveto{\pgfpoint{\pgf@circ@res@step-\pgf@circ@res@other}{0pt}} \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@step-\pgf@circ@res@other}{0pt}} \pgf@circ@draworfill \pgfpathellipse {\pgfpoint{\pgf@circ@res@step-.5\pgf@circ@res@other}{0pt}} {\pgfpoint{.5\pgf@circ@res@other}{0pt}} {\pgfpoint{0pt}{.5\pgf@circ@res@other}} \pgf@circ@draworfill \endpgfscope \ifpgfcirc@draw@input@leads %input leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}} \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@left}{0pt}} \fi \ifpgfcirc@draw@output@leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@right}{0pt}} \fi \pgfusepath{draw} } } \pgfdeclareshape{american buffer port}{ \savedmacro{\ctikzclass}{\edef\ctikzclass{logic ports}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \anchor{center}{\pgfpointorigin} \savedanchor\northwest{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{bipoles/not port/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{bipoles/not port/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{in}{ \northwest \pgf@y=0pt } \anchor{in 1}{ \northwest \pgf@y=0pt } \anchor{left}{ \northwest \pgf@x=0.7\pgf@x \pgf@y=0pt } \anchor{bin}{ \northwest \pgf@x=0.7\pgf@x \pgf@y=0pt } \anchor{bin 1}{ \northwest \pgf@y=0pt \pgf@x=0.7\pgf@x } \anchor{out}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } \anchor{right}{ \northwest \pgf@y=0pt \pgf@x=-0.7\pgf@x } \anchor{bout}{ \northwest \pgf@y=0pt \pgf@x=-0.7\pgf@x } \anchor{center}{ \pgfpointorigin } \anchor{east}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } \anchor{west}{ \northwest \pgf@y=0pt } \anchor{south}{ \northwest \pgf@x=0pt \pgf@y=-\pgf@y } \anchor{north}{ \northwest \pgf@x=0pt } \anchor{south west}{ \northwest \pgf@y=-\pgf@y } \anchor{north east}{ \northwest \pgf@x=-\pgf@x } \anchor{north west}{ \northwest } \anchor{south east}{ \northwest \pgf@x=-\pgf@x \pgf@y=-\pgf@y } \anchorborder{% this is used when the node is used as a path element \pgf@xa=\pgf@x \pgf@ya=\pgf@y \pgfextracty{\pgf@circ@res@up}{\northwest} \pgfextractx{\pgf@circ@res@left}{\northwest} \pgfpointborderrectangle{\pgfpoint{\pgf@xa}{\pgf@ya}} {\pgfpoint{-\pgf@circ@res@left}{\pgf@circ@res@up}} } \anchor{text}{% % centered and a bit to the left (it's a triangle)! \pgf@x=\dimexpr -.6\wd\pgfnodeparttextbox\relax \pgf@y=\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox\relax } \backgroundpath{ \pgfsetcolor{\ctikzvalof{color}} \northwest \pgf@circ@res@up = \pgf@y \pgf@circ@res@down = -\pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgftransformxshift{.7\pgf@circ@res@left} \pgf@circ@res@step=\pgf@circ@res@right \advance\pgf@circ@res@step by -\pgf@circ@res@left \pgf@circ@res@step=.7\pgf@circ@res@step \pgfpathmoveto{\pgfpoint{\pgf@circ@res@step}{0pt}} \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@step}{0pt}} \pgf@circ@draworfill \endpgfscope \ifpgfcirc@draw@input@leads %input leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}} \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@left}{0pt}} \fi \ifpgfcirc@draw@output@leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@right}{0pt}} \fi \pgfusepath{draw} } } \pgfdeclareshape{invschmitt}{ \savedmacro{\ctikzclass}{\edef\ctikzclass{logic ports}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \anchor{center}{\pgfpointorigin} \savedanchor\northwest{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{bipoles/not port/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{bipoles/not port/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{in}{ \northwest \pgf@y=0pt } \anchor{in 1}{ \northwest \pgf@y=0pt } \anchor{left}{ \northwest \pgf@y=0pt \pgf@x=0.7\pgf@x } \anchor{bin}{ \northwest \pgf@y=0pt \pgf@x=0.7\pgf@x } \anchor{bin 1}{ \northwest \pgf@y=0pt \pgf@x=0.7\pgf@x } \anchor{out}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } \anchor{right}{ \northwest \pgf@y=0pt \pgf@x=-0.7\pgf@x } \anchor{bout}{ \northwest \pgf@y=0pt \pgf@x=-0.7\pgf@x } \anchor{center}{ \pgfpointorigin } \anchor{east}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } \anchor{west}{ \northwest \pgf@y=0pt } \anchor{south}{ \northwest \pgf@x=0pt \pgf@y=-\pgf@y } \anchor{north}{ \northwest \pgf@x=0pt } \anchor{south west}{ \northwest \pgf@y=-\pgf@y } \anchor{north east}{ \northwest \pgf@x=-\pgf@x } \anchor{north west}{ \northwest } \anchor{south east}{ \northwest \pgf@x=-\pgf@x \pgf@y=-\pgf@y } \anchorborder{% this is used when the node is used as a path element \pgf@xa=\pgf@x \pgf@ya=\pgf@y \pgfextracty{\pgf@circ@res@up}{\northwest} \pgfextractx{\pgf@circ@res@left}{\northwest} \pgfpointborderrectangle{\pgfpoint{\pgf@xa}{\pgf@ya}} {\pgfpoint{-\pgf@circ@res@left}{\pgf@circ@res@up}} } \anchor{text}{% % centered and a bit to the left (it's a triangle)! \pgf@x=\dimexpr -.6\wd\pgfnodeparttextbox\relax \pgf@y=\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox\relax } \backgroundpath{ \pgfsetcolor{\ctikzvalof{color}} \northwest \pgf@circ@res@up = \pgf@y \pgf@circ@res@down = -\pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgf@circ@res@other = \ctikzvalof{bipoles/not port/circle width}\pgf@circ@res@right \pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgftransformxshift{.7\pgf@circ@res@left} \pgf@circ@res@step=\pgf@circ@res@right \advance\pgf@circ@res@step by -\pgf@circ@res@left \pgf@circ@res@step=.7\pgf@circ@res@step \pgfpathmoveto{\pgfpoint{\pgf@circ@res@step-\pgf@circ@res@other}{0pt}} \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@down}} \pgfpathclose \pgf@circ@draworfill \pgfpathellipse {\pgfpoint{\pgf@circ@res@step-.5\pgf@circ@res@other}{0pt}} {\pgfpoint{.5\pgf@circ@res@other}{0pt}} {\pgfpoint{0pt}{.5\pgf@circ@res@other}} \pgf@circ@draworfill \endpgfscope \ifpgfcirc@draw@input@leads %input leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}} \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@left}{0pt}} \fi \ifpgfcirc@draw@output@leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@right}{0pt}} \fi \pgfusepath{draw} %draw inner shape \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfpathmoveto{\pgfpoint{.6\pgf@circ@res@left}{.3\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{.4\pgf@circ@res@left}{.3\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{.4\pgf@circ@res@left}{.3\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{.05\pgf@circ@res@left}{.3\pgf@circ@res@up}} \pgfpathmoveto{\pgfpoint{.4\pgf@circ@res@left}{.3\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{.25\pgf@circ@res@left}{.3\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{.25\pgf@circ@res@left}{.3\pgf@circ@res@up}} \pgfusepath{draw} } } \pgfdeclareshape{schmitt}{ \savedmacro{\ctikzclass}{\edef\ctikzclass{logic ports}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \anchor{center}{\pgfpointorigin} \savedanchor\northwest{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{bipoles/not port/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{bipoles/not port/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{in}{ \northwest \pgf@y=0pt } \anchor{in 1}{ \northwest \pgf@y=0pt } \anchor{left}{ \northwest \pgf@y=0pt \pgf@x=0.7\pgf@x } \anchor{bin}{ \northwest \pgf@y=0pt \pgf@x=0.7\pgf@x } \anchor{bin 1}{ \northwest \pgf@y=0pt \pgf@x=0.7\pgf@x } \anchor{out}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } \anchor{right}{ \northwest \pgf@y=0pt \pgf@x=-.7\pgf@x } \anchor{bout}{ \northwest \pgf@y=0pt \pgf@x=-.7\pgf@x } \anchor{center}{ \pgfpointorigin } \anchor{east}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } \anchor{west}{ \northwest \pgf@y=0pt } \anchor{south}{ \northwest \pgf@x=0pt \pgf@y=-\pgf@y } \anchor{north}{ \northwest \pgf@x=0pt } \anchor{south west}{ \northwest \pgf@y=-\pgf@y } \anchor{north east}{ \northwest \pgf@x=-\pgf@x } \anchor{north west}{ \northwest } \anchor{south east}{ \northwest \pgf@x=-\pgf@x \pgf@y=-\pgf@y } \anchorborder{% this is used when the node is used as a path element \pgf@xa=\pgf@x \pgf@ya=\pgf@y \pgfextracty{\pgf@circ@res@up}{\northwest} \pgfextractx{\pgf@circ@res@left}{\northwest} \pgfpointborderrectangle{\pgfpoint{\pgf@xa}{\pgf@ya}} {\pgfpoint{-\pgf@circ@res@left}{\pgf@circ@res@up}} } \anchor{text}{% % centered and a bit to the left (it's a triangle)! \pgf@x=\dimexpr -.6\wd\pgfnodeparttextbox\relax \pgf@y=\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox\relax } \backgroundpath{ \pgfsetcolor{\ctikzvalof{color}} \northwest \pgf@circ@res@up = \pgf@y \pgf@circ@res@down = -\pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgftransformxshift{.7\pgf@circ@res@left} \pgf@circ@res@step=\pgf@circ@res@right \advance\pgf@circ@res@step by -\pgf@circ@res@left \pgf@circ@res@step=.7\pgf@circ@res@step \pgfpathmoveto{\pgfpoint{\pgf@circ@res@step}{0pt}} \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@down}} \pgfpathclose \pgf@circ@draworfill \endpgfscope \ifpgfcirc@draw@input@leads %input leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}} \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@left}{0pt}} \fi \ifpgfcirc@draw@output@leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@right-\pgf@circ@res@other}{0pt}} \fi \pgfusepath{draw} %draw inner shape \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfpathmoveto{\pgfpoint{.6\pgf@circ@res@left}{.3\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{.4\pgf@circ@res@left}{.3\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{.4\pgf@circ@res@left}{.3\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{.05\pgf@circ@res@left}{.3\pgf@circ@res@up}} \pgfpathmoveto{\pgfpoint{.4\pgf@circ@res@left}{.3\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{.25\pgf@circ@res@left}{.3\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{.25\pgf@circ@res@left}{.3\pgf@circ@res@up}} \pgfusepath{draw} } } %%% start european logic ports, from John Kormylo %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% % #1 - name % #2 - text inside % #3 - number of inputs % #4 = is it a not? % % option to add a circle for not-output, see % https://github.com/circuitikz/circuitikz/issues/385 % \newif\ifpgf@circ@european@port@circle\pgf@circ@european@port@circlefalse \newif\ifpgf@circ@european@port@circle@ieee\pgf@circ@european@port@circle@ieeefalse \ctikzset{tripoles/european not shape/.initial=ocirc} \ctikzset{tripoles/european not symbol/.is choice} \ctikzset{tripoles/european not symbol/triangle/.code={\pgf@circ@european@port@circlefalse}} \ctikzset{tripoles/european not symbol/circle/.code={% \pgf@circ@european@port@circletrue\pgf@circ@european@port@circle@ieeefalse\ctikzset{tripoles/european not shape=ocirc}}} \ctikzset{tripoles/european not symbol/ieee circle/.code={% \pgf@circ@european@port@circletrue\pgf@circ@european@port@circle@ieeetrue\ctikzset{tripoles/european not shape=notcirc}}} \long\def\pgfcircdeclareeurologicport#1#2#3#4{ \pgfdeclareshape{european #1 port} { \savedmacro{\ctikzclass}{\edef\ctikzclass{logic ports}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \saveddimen{\boutshift}{% \edef\pgf@temp{not} \edef\pgf@circ@temp{#4} \ifx\pgf@temp\pgf@circ@temp % is a not \ifpgf@circ@european@port@circle \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \edef\pgf@temp{ocirc} \edef\pgf@circ@temp{\ctikzvalof{tripoles/european not shape}} \ifx\pgf@temp\pgf@circ@temp % it's ocirc \pgfmathsetlength{\pgf@x}{2*\ctikzvalof{nodes width}*\pgf@circ@Rlen} \else % it's ieee not circ \pgf@circ@notradius % defined together with ieeestd ports \pgf@x=2\pgf@circ@res@temp \fi \else \pgf@x=0pt \fi \else \pgf@x=0pt \fi } \savedmacro\resize{% automatic \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@circ@res@up = \ctikzvalof{tripoles/european #1 port/height}\pgf@circ@scaled@Rlen \pgf@circ@res@up = .5\pgf@circ@res@up \pgf@circ@res@down = -\pgf@circ@res@up \pgf@circ@res@right = \ctikzvalof{tripoles/european #1 port/width}\pgf@circ@scaled@Rlen \pgf@circ@res@right = .5\pgf@circ@res@right \pgf@circ@res@left = -\pgf@circ@res@right }% \savedmacro\inputs{% get number of inputs \pgf@circ@res@count=\pgfkeysvalueof{/tikz/number inputs}\relax% \ifnum\pgf@circ@res@count=0 \pgf@circ@res@count=\ctikzvalof{tripoles/european #1 port/inputs}\relax% \fi \ifnum\pgf@circ@res@count<2 \pgf@circ@res@count=2\fi \ifnum\pgf@circ@res@count>16 \pgf@circ@res@count=16\fi \def\inputs{\the\pgf@circ@res@count}% }% \savedanchor\step{% 1/2 gap at edges \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@circ@res@step = \ctikzvalof{tripoles/european #1 port/height}\pgf@circ@scaled@Rlen \divide\pgf@circ@res@step by #3 \pgfpoint{\pgf@circ@res@left}{\dimexpr\pgf@circ@res@up+0.5\pgf@circ@res@step}% }% \savedanchor\northeast{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up}}% \savedanchor\southwest{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@down}}% \savedanchor\left{\pgfpoint{\ctikzvalof{tripoles/european #1 port/reserved}\pgf@circ@res@left}{0pt}}% \savedanchor\right{\pgfpoint{\ctikzvalof{tripoles/european #1 port/reserved}\pgf@circ@res@right}{0pt}}% \savedanchor\origin{\pgfpoint{\ctikzvalof{tripoles/european #1 port/origin}\pgf@circ@res@right}{0pt}}% \anchor{center}{\origin}% for backwards compatibility % the text anchor overlaps the logic symbol \anchor{text}{\pgfpoint{-.5\wd\pgfnodeparttextbox}{\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox}}% % create input anchors \ifnum#3=1\relax \anchor{in}{\southwest\pgfpoint{\pgf@x}{0pt}}% or \step \anchor{in 1}{\southwest\pgfpoint{\pgf@x}{0pt}}% or \step \anchor{bin}{\left\pgfpoint{\pgf@x}{0pt}}% or \step \anchor{bin 1}{\left\pgfpoint{\pgf@x}{0pt}}% or \step \else \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@european #1 port\endcsname{% \pgfmathloop% \ifnum\pgfmathcounter>#3% \else% %\pgfutil@ifundefined{pgf@anchor@european #1 port@in \pgfmathcounter}{% redundant \expandafter\xdef\csname pgf@anchor@european #1 port@in \pgfmathcounter\endcsname{% \noexpand\pgf@circ@logicport@input{\pgfmathcounter}% defined above }% \expandafter\xdef\csname pgf@anchor@european #1 port@bin \pgfmathcounter\endcsname{% \noexpand\pgf@circ@logicport@baseinput{\pgfmathcounter}{4}{#1}% defined above }% %}{}% \repeatpgfmathloop% } \fi \anchor{out}{\northeast\pgf@y=0pt} \anchor{bout}{\right\advance\pgf@x by \boutshift\pgf@y=0pt} \anchor{left}{\left}% edges of component minus leads \anchor{right}{\right\advance\pgf@x by \boutshift\pgf@y=0pt} \anchor{north east}{\northeast}% see \Compass macro \anchor{south west}{\southwest} \anchor{north}{\pgfextracty{\pgf@circ@res@up}{\northeast}% \pgfpoint{0cm}{\pgf@circ@res@up}} \anchor{north west}{\pgfextracty{\pgf@circ@res@up}{\northeast}% \pgfextractx{\pgf@circ@res@left}{\southwest}% \pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@up}} \anchor{west}{\pgfextractx{\pgf@circ@res@left}{\southwest}% \pgfpoint{\pgf@circ@res@left}{0cm}} \anchor{south}{\pgfextracty{\pgf@circ@res@down}{\southwest}% \pgfpoint{0cm}{\pgf@circ@res@down}} \anchor{south east}{\pgfextracty{\pgf@circ@res@down}{\southwest}% \pgfextractx{\pgf@circ@res@right}{\northeast}% \pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down}} \anchor{east}{\pgfextractx{\pgf@circ@res@right}{\northeast}% \pgfpoint{\pgf@circ@res@right}{0cm}} \anchorborder{% this is used when the node is used as a path element \pgf@xa=\pgf@x \pgf@ya=\pgf@y \pgfextracty{\pgf@circ@res@up}{\northeast} \pgfextractx{\pgf@circ@res@right}{\northeast} \pgfpointborderrectangle{\pgfpoint{\pgf@xa}{\pgf@ya}} {\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up}} } \backgroundpath{ \pgfsetcolor{\ctikzvalof{color}} \pgfstartlinewidth=\pgflinewidth \pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfpathrectanglecorners {\pgfpoint{\ctikzvalof{tripoles/european #1 port/reserved}\pgf@circ@res@left}{\pgf@circ@res@up}} {\pgfpoint{\ctikzvalof{tripoles/european #1 port/reserved}\pgf@circ@res@right}{\pgf@circ@res@down}} \pgf@circ@draworfill \endpgfscope \ifpgfcirc@draw@input@leads %input leads \ifnum#3=1\relax \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}}% \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/european #1 port/reserved}\pgf@circ@res@left}{0pt}}% \else \pgfextracty{\pgf@circ@res@temp}{\step}% \pgf@circ@res@step = \dimexpr 2\pgf@circ@res@temp -2\pgf@circ@res@up\relax %\pgf@circ@res@count = #3\relax% redundant \loop\ifnum\pgf@circ@res@count>0 \advance\pgf@circ@res@temp by -\pgf@circ@res@step \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@temp}}% \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/european #1 port/reserved}\pgf@circ@res@left} {\pgf@circ@res@temp}} \advance\pgf@circ@res@count by -1 \repeat \fi \pgfusepath{draw} \fi % \ifpgfcirc@draw@output@leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{ \pgfpoint{\ctikzvalof{tripoles/european #1 port/reserved}\pgf@circ@res@right}{0pt}} \pgfusepath{draw} \fi % \edef\pgf@temp{not} \edef\pgf@circ@temp{#4} \ifx\pgf@temp\pgf@circ@temp % is a not \ifpgf@circ@european@port@circle \pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgftransformxshift{\ctikzvalof{tripoles/european #1 port/reserved}\pgf@circ@res@right} % reset linewidth for IEEE ports, otherwise they will multiply... \ifpgf@circ@european@port@circle@ieee\pgfsetlinewidth{\pgfstartlinewidth}\fi \pgfnode{\ctikzvalof{tripoles/european not shape}}{west}{}{NOT}{\pgfusepath{stroke}} \endpgfscope \else \pgfpathmoveto{\pgfpoint{\ctikzvalof{tripoles/european #1 port/not width}\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/european #1 port/reserved}\pgf@circ@res@right}% {\ctikzvalof{tripoles/european #1 port/not height}\pgf@circ@res@up}} \pgfusepath{draw} \fi \fi % \pgfpathmoveto{\pgfpointorigin} \pgftext{#2} } } } \pgfcircdeclareeurologicport{and}{\&}{\pgf@circ@res@count}{} \pgfcircdeclareeurologicport{or}{$\ge 1$}{\pgf@circ@res@count}{} \pgfcircdeclareeurologicport{xor}{$=1$}{\pgf@circ@res@count}{} \pgfcircdeclareeurologicport{not}{$1$}{1}{not} \pgfcircdeclareeurologicport{buffer}{$1$}{1}{} \pgfcircdeclareeurologicport{nand}{\&}{\pgf@circ@res@count}{not} \pgfcircdeclareeurologicport{nor}{$\ge 1$}{\pgf@circ@res@count}{not} \pgfcircdeclareeurologicport{xnor}{$=1$}{\pgf@circ@res@count}{not} %% end european logic ports % %>>> %% IEEE standard logic ports module%<<< %% %% Original multi-input code from John Kormylo at tex.stackexchange.com %% Help by TheTeXnician <38565529+TheTeXnician@users.noreply.github.com> %% Suggested idea and example code by Jason Sachs %% Please see https://github.com/circuitikz/circuitikz/issues/383 for a lot of details %% Most of the code, all errors and bugs by Romano Giannetti %% Everything is in the same place here --- more or less; first step to move towards %% a module interface for circutikz %% % base settings for ieeestd ports. \ctikzset{ieeestd ports/.is family} % baselen is relative to pgfcirc@Rlen as ever; scaled if the class says so. % the value of 0.4 is the standard pin distance for a port with height=num pins % and matches the chip distance \ctikzset{ieeestd ports/baselen/.initial=0.4} % these are in term of baselen; width depends on height (fixed proportions) \ctikzset{ieeestd ports/height/.initial=2} \ctikzset{ieeestd ports/pin length/.initial=0.7} % the standard "not" circle should be 1/6.5 of height (diameter); % so radius/baselen=1/3.25/2 --- using 0.1 and no scaling is as a pole \ctikzset{ieeestd ports/not radius/.initial=0.154} \ctikzset{ieeestd ports/not radius fill/.initial=1}% change ony if you know why % the suggested xnor distance is is 1.24, so 1.25/3.25/2 % xor/xnor leads go full in in IEEE; let this be optional \ctikzset{ieeestd ports/xor bar distance/.initial=0.192}% \ctikzset{ieeestd ports/xor leads in/.initial=1}% % % base size of a small external schmitt symbol % \ctikzset{ieeestd ports/schmitt symbol size/.initial=0.3}% % % input management % we are using the same /tikz/number inputs than the legacy ports % \tikzset{/tikz/inner inputs/.initial=0} % using 0 means that all inputs are inner % % integrate with the other logic ports % % \newif\ifpgf@circuit@ieeelogicport\pgf@circuit@ieeelogicportfalse \ctikzset{logic ports/ieee/.code= {% \pgf@circuit@ieeelogicporttrue \pgf@circuit@europeanlogicportfalse \tikzset{and port/.style={shape=ieeestd and port}}% \tikzset{or port/.style={shape=ieeestd or port}}% \tikzset{xor port/.style={shape=ieeestd xor port}}% \tikzset{buffer port/.style={shape=ieeestd buffer port}}% \tikzset{not port/.style={shape=ieeestd not port}}% \tikzset{nand port/.style={shape=ieeestd nand port}}% \tikzset{nor port/.style={shape=ieeestd nor port}}% \tikzset{xnor port/.style={shape=ieeestd xnor port}}% \tikzset{schmitt port/.style={shape=ieeestd schmitt port}}% \tikzset{invschmitt port/.style={shape=ieeestd invschmitt port}}% }} % add code to be compatible with the other ports \ctikzset{logic ports/european/.add code={\pgf@circuit@ieeelogicportfalse}} \ctikzset{logic ports/american/.add code={\pgf@circuit@ieeelogicportfalse}} \tikzset{ieee ports/.style = {\circuitikzbasekey/logic ports = ieee}} % % the base angle for the or port. See the drawings. This will not change with height % \pgfmathsetmacro{\pgf@circ@orangle}{atan(3.25/6.5)} % \typeout{ANGLE-IS\space\pgf@circ@orangle} \def\pgf@circ@ieeeport@input#1% #1 = \pgfmathcounter {% \ifnum#1>\inputs \PackageError{circuitikz}{% You requested input pin #1 for logic port shape \thisshape\space \MessageBreak which has been defined with \inputs\space pins% }{Please check the manual about logic ports; if you press return I'll try to continue} \fi \pgfmathsetlength{\pgf@circ@res@up}{(\inputs/2)*\pind+0.5*\pind}% pin "0", above the rack/port \pgfextractx{\pgf@circ@res@left}{\bodyleft} \pgf@circ@res@step=\pind \pgf@y=\pgf@circ@res@up\advance\pgf@y by -#1\pgf@circ@res@step\relax \pgf@x=\pgf@circ@res@left\advance\pgf@x by -\pinlen }% % #1 = \pgfmathcounter #2=type % type is 1 for and,nand; 2 for or,nor; 3 for xor,xnor \def\pgf@circ@ieeeport@baseinput#1#2% {% \ifnum#1>\inputs \PackageError{circuitikz}{% You requested border input pin #1 for logic port shape \thisshape\space \MessageBreak which has been defined with \inputs\space pins% }{Please check the manual about logic ports; if you press return I'll try to continue} \fi % Find the vertical position (this is the same for any port) \pgfmathsetlength{\pgf@circ@res@up}{(\inputs/2)*\pind+0.5*\pind}% pin "0", above the rack/port \pgf@circ@res@step=\pind\advance\pgf@circ@res@up by -#1\pgf@circ@res@step\relax % rack (extended) pins; they are the same for all the ports % call K = (inputs-inner)/2, rounded up; pins on the rack are: % above: 1..K (included) % below: inputs-K..inputs % Find the pins on the rack; they are 1... \pgf@circ@count@a=\numexpr (\inputs - \inners)/2\relax % =K; numexpr rounds up! \pgf@circ@count@b=\numexpr \inputs - \pgf@circ@count@a +1 \relax % =inputs - K +1 % border anchors for rack should be ok \pgfextractx{\pgf@circ@res@left}{\topleft} \pgfextractx{\pgf@circ@res@right}{\bodyleft} \pgf@y=\pgf@circ@res@up\pgf@x=\pgf@circ@res@left % we have finished if we are in the rack \ifnum #1 > \pgf@circ@count@a \ifnum #1 < \pgf@circ@count@b % we are on the inner ports; we have to do the hard work here % and and nand \ifnum #2=1 \relax % It's an and/nand, all border ports are on the rack line \fi % or and nor \ifnum #2=2 \pgfmathsetlength{\pgf@x}{\pgf@circ@res@right-2*\stdH*(1-cos(atan(\pgf@circ@res@up/(2*\stdH))))} \fi % xor and xnor \ifnum #2=3\relax \pgfmathsetlength{\pgf@x}{\pgf@circ@res@right-\xorbar-2*\stdH*(1-cos(atan(\pgf@circ@res@up/(2*\stdH))))} \fi \fi\fi }% % inner base ports for xor types port % #1 = \pgfmathcounter #2=type % type is 1 for and,nand; 2 for or,nor; 3 for xor,xnor \def\pgf@circ@ieeeport@innerbaseinput#1% {% \ifnum#1>\inputs \PackageError{circuitikz}{% You requested border input pin #1 for logic port shape \thisshape\space \MessageBreak which has been defined with \inputs\space pins% }{Please check the manual about logic ports; if you press return I'll try to continue} \fi % Find the vertical position (this is the same for any port) \pgfmathsetlength{\pgf@circ@res@up}{(\inputs/2)*\pind+0.5*\pind}% pin "0", above the rack/port \pgf@circ@res@step=\pind\advance\pgf@circ@res@up by -#1\pgf@circ@res@step\relax % rack (extended) pins; they are the same for all the ports % call K = (inputs-inner)/2, rounded up; pins on the rack are: % above: 1..K (included) % below: inputs-K..inputs % Find the pins on the rack; they are 1... \pgf@circ@count@a=\numexpr (\inputs - \inners)/2\relax % =K; numexpr rounds up! \pgf@circ@count@b=\numexpr \inputs - \pgf@circ@count@a +1 \relax % =inputs - K +1 % border anchors for rack should be ok \pgfextractx{\pgf@circ@res@left}{\topleft} \pgfextractx{\pgf@circ@res@right}{\bodyleft} \pgf@y=\pgf@circ@res@up\pgf@x=\pgf@circ@res@left % we have finished if we are in the rack \ifnum #1 > \pgf@circ@count@a \ifnum #1 < \pgf@circ@count@b % we are on the inner ports; we have to do the hard work here \pgfmathsetlength{\pgf@x}{\pgf@circ@res@right-2*\stdH*(1-cos(atan(\pgf@circ@res@up/(2*\stdH))))} \fi\fi }% %%% macro to find basic lenghts --- they leave it in \pgf@circ@res@temp \def\pgf@circ@ieeestd@baselen{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}*\pgf@circ@Rlen} \pgfmathsetlength{\pgf@circ@res@temp}{\ctikzvalof{ieeestd ports/baselen}*\pgf@circ@scaled@Rlen} } \def\pgf@circ@ieeestd@stdH{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}*\pgf@circ@Rlen} \pgfmathsetlength{\pgf@circ@res@temp}{0.5*\ctikzvalof{ieeestd ports/baselen}* \ctikzvalof{ieeestd ports/height}*\pgf@circ@scaled@Rlen} } \def\pgf@circ@ieeestd@pinlen{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}*\pgf@circ@Rlen} \pgfmathsetlength{\pgf@circ@res@temp}{\ctikzvalof{ieeestd ports/baselen}* \ctikzvalof{ieeestd ports/pin length}*\pgf@circ@scaled@Rlen} } \def\pgf@circ@ieeestd@xorbar{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}*\pgf@circ@Rlen} \pgfmathsetlength{\pgf@circ@res@temp}{\ctikzvalof{ieeestd ports/baselen}* \ctikzvalof{ieeestd ports/xor bar distance}*\pgf@circ@scaled@Rlen} } %% Not circle \def\pgf@circ@notradius{ \pgf@circ@ieeestd@stdH % got the standard length. Notice that his is 3.25H for IEEE \pgfmathsetlength{\pgf@circ@res@temp}{\ctikzvalof{ieeestd ports/not radius}*\pgf@circ@res@temp} % \typeout{NOTRADIUS\space\the\pgf@circ@res@temp} } %% Find (in ...@other) the height of the rack \def\pgf@circ@findrackH{% \pgf@circ@count@a=\pgfkeysvalueof{/tikz/number inputs}\relax% \pgf@circ@count@b=\pgfkeysvalueof{/tikz/inner inputs}\relax% \ifnum\pgf@circ@count@a=0 \pgf@circ@count@a=2\fi % default pins \ifnum\pgf@circ@count@a<2 \pgf@circ@count@a=2\fi % \ifnum\pgf@circ@count@b=0 \pgf@circ@count@b=\pgf@circ@count@a\fi% \pgf@circ@ieeestd@stdH \multiply\pgf@circ@res@temp by 2\relax% full height \divide\pgf@circ@res@temp by \pgf@circ@count@b % the pin spacing \pgfmathsetlength{\pgf@circ@res@other}{(\pgf@circ@count@a/2)*\pgf@circ@res@temp} %top of the rack/port % \typeout{RACK-\thisshape\space\the\pgf@circ@res@other} } %% \def\pgf@circ@find@ieeeport@up{% leave it in up % Normal port limits \pgf@circ@ieeestd@stdH \pgfmathsetlength{\pgf@circ@res@up}{\pgf@circ@res@temp} % rack top size \pgf@circ@findrackH \ifdim\pgf@circ@res@other > \pgf@circ@res@up \pgf@circ@res@up=\pgf@circ@res@other \else \fi } \def\pgf@circ@find@ieeeport@left#1{% leave it in left; #1 is type % Normal port limits \pgf@circ@ieeestd@stdH \pgfmathsetlength{\pgf@circ@res@left}{8*\pgf@circ@res@temp/6.5} \pgf@circ@res@right=\pgf@circ@res@left % save the border value \pgf@circ@res@step=\pgf@circ@res@temp % save the stdH value \pgf@circ@ieeestd@pinlen\advance\pgf@circ@res@left by \pgf@circ@res@temp % \typeout{LEFT1-\thisshape\space L\space\the\pgf@circ@res@left\space R\space\the\pgf@circ@res@right} % this is the normal left border % For the or or xor port, the limit can be the pointy thing (in case the % pinlen is zero or too small) % add to the body margin the or/nor peak: \ifnum #1 > 1\relax% "or", "nor", "xor", "xnor" gates. \pgfmathsetlength{\pgf@circ@res@other}{2*\pgf@circ@res@step*(1-cos(\pgf@circ@orangle))} \advance\pgf@circ@res@right by \pgf@circ@res@other % \typeout{LEFT2-\thisshape\space L\space\the\pgf@circ@res@left\space R\space\the\pgf@circ@res@right} \fi % add to the body margin the xor/xnor distance \ifnum #1 = 3\relax% "xor" or "xnor" gates. \pgf@circ@ieeestd@xorbar \advance\pgf@circ@res@right by \pgf@circ@res@temp % \typeout{LEFT3-\thisshape\space L\space\the\pgf@circ@res@left\space R\space\the\pgf@circ@res@right} \fi % and if this exceeds the normal margin, this is it % \typeout{LEFT4-\thisshape\space L\space\the\pgf@circ@res@left\space R\space\the\pgf@circ@res@right} \ifdim \pgf@circ@res@right > \pgf@circ@res@left \pgf@circ@res@left=\pgf@circ@res@right \fi % \typeout{LEFT5-\thisshape\space L\space\the\pgf@circ@res@left\space R\space\the\pgf@circ@res@right} \pgf@circ@res@left=-\pgf@circ@res@left } \def\pgf@circ@find@ieeeport@right#1{% leave it in right; #1 is plain or negated % Normal port limits \pgf@circ@ieeestd@stdH \pgfmathsetlength{\pgf@circ@res@right}{8*\pgf@circ@res@temp/6.5} \pgf@circ@notradius \pgfmathsetlength{\pgf@circ@res@other}{\pgf@circ@res@right+2*#1*\pgf@circ@res@temp} \pgf@circ@ieeestd@pinlen\advance\pgf@circ@res@right by \pgf@circ@res@temp \ifdim\pgf@circ@res@other > \pgf@circ@res@right \pgf@circ@res@right=\pgf@circ@res@other \fi } \def\pgf@circ@find@ieeeport@not@right#1{% leave it in right; #1 is plain or negated % Normal port limits \pgf@circ@ieeestd@stdH % notice 0.8660254 is cos(30) \pgfmathsetlength{\pgf@circ@res@right}{0.8660254*\pgf@circ@res@temp} \pgf@circ@notradius \pgfmathsetlength{\pgf@circ@res@other}{\pgf@circ@res@right+2*#1*\pgf@circ@res@temp} \pgf@circ@ieeestd@pinlen\advance\pgf@circ@res@right by \pgf@circ@res@temp \ifdim\pgf@circ@res@other > \pgf@circ@res@right \pgf@circ@res@right=\pgf@circ@res@other \fi } %%% ieeestd multi-input ports %%% #1: name %%% #2: type: 1 for and,nand; 2 for or,nor; 3 for xor,xnor %%% #3: polarity: 0 for direct, 1 for inverted (not at the output) %%% #4: drawing for the port \long\def\pgfcircdeclareieeeport#1#2#3#4{% \pgfdeclareshape{ieeestd #1 port}% {% \savedmacro{\ctikzclass}{\edef\ctikzclass{logic ports}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \savedmacro{\thisshape}{\def\thisshape{\tikz@fig@name}} \saveddimen{\baselen}{% \pgf@circ@ieeestd@baselen\pgf@x=\pgf@circ@res@temp } \saveddimen{\stdH}{% This is HALF the height of the inner port \pgf@circ@ieeestd@stdH\pgf@x=\pgf@circ@res@temp } \saveddimen{\notdiameter}{ \pgf@circ@notradius\pgf@x=2\pgf@circ@res@temp } \saveddimen{\pind}{% pin distance; \pgf@circ@count@a=\pgfkeysvalueof{/tikz/number inputs}\relax% \pgf@circ@count@b=\pgfkeysvalueof{/tikz/inner inputs}\relax% \ifnum\pgf@circ@count@a=0 \pgf@circ@count@a=2\fi % default pins \ifnum\pgf@circ@count@a<2 \pgf@circ@count@a=2\fi % \ifnum\pgf@circ@count@b=0 \pgf@circ@count@b=\pgf@circ@count@a\fi% \pgf@circ@ieeestd@stdH\pgf@x=2\pgf@circ@res@temp % full height \divide\pgf@x by \pgf@circ@count@b } \saveddimen{\pinlen}{% \pgf@circ@ieeestd@pinlen\pgf@x=\pgf@circ@res@temp } \saveddimen{\xorbar}{% \pgf@circ@ieeestd@xorbar\pgf@x=\pgf@circ@res@temp } % anchors for the body (no pins included here) \savedanchor{\bodyleft}{% This DOES NOT take into account the pointy or/xor thing \pgf@circ@ieeestd@stdH \pgfmathsetlength{\pgf@x}{-8*\pgf@circ@res@temp/6.5} \pgfmathsetlength{\pgf@y}{\pgf@circ@res@temp} } \savedanchor{\topleft}{% \pgf@circ@ieeestd@xorbar\pgf@circ@res@right=\pgf@circ@res@temp % save \xorbar \pgf@circ@ieeestd@stdH \pgf@circ@res@other=0pt\relax \ifnum #2 = 2\relax% "or" or "nor" gates. \pgfmathsetlength{\pgf@circ@res@other}{2*\pgf@circ@res@temp*(1-cos(\pgf@circ@orangle))} \fi \ifnum #2 = 3\relax% "xor" or "xnor" gates. \pgfmathsetlength{\pgf@circ@res@other}{2*\pgf@circ@res@temp*(1-cos(\pgf@circ@orangle)) +\pgf@circ@res@right} \fi \pgfmathsetlength{\pgf@x}{-8*\pgf@circ@res@temp/6.5-\pgf@circ@res@other} \pgfmathsetlength{\pgf@y}{\pgf@circ@res@temp} } \savedanchor{\bodyright}{% This DOES NOT take into account the "NOT" circle \pgf@circ@ieeestd@stdH \pgfmathsetlength{\pgf@x}{8*\pgf@circ@res@temp/6.5} \pgfmathsetlength{\pgf@y}{-\pgf@circ@res@temp} } \savedanchor{\bottomright}{% This DOES take into account the "NOT" circle \pgf@circ@notradius\pgf@circ@res@other=\pgf@circ@res@temp \pgf@circ@ieeestd@stdH % #3 is =1 if the port is a negated output one \pgfmathsetlength{\pgf@x}{8*\pgf@circ@res@temp/6.5+#3*2*\pgf@circ@res@other} \pgfmathsetlength{\pgf@y}{-\pgf@circ@res@temp} } % geographical anchors --- must be rectangulars! \savedanchor{\northwest}{% \pgf@circ@find@ieeeport@up \pgf@circ@find@ieeeport@left{#2} % \typeout{ANCH5-\thisshape\space L\space\the\pgf@circ@res@left\space U\space\the\pgf@circ@res@up} \pgf@x=\pgf@circ@res@left \pgf@y=\pgf@circ@res@up } \savedanchor{\southwest}{% \pgf@circ@find@ieeeport@up \pgf@circ@find@ieeeport@left{#2} \pgf@x=\pgf@circ@res@left \pgf@y=-\pgf@circ@res@up } \savedanchor{\southeast}{% \pgf@circ@find@ieeeport@up \pgf@circ@find@ieeeport@right{#3} \pgf@x=\pgf@circ@res@right \pgf@y=-\pgf@circ@res@up } \savedanchor{\northeast}{% \pgf@circ@find@ieeeport@up \pgf@circ@find@ieeeport@right{#3} \pgf@x=\pgf@circ@res@right \pgf@y=\pgf@circ@res@up } \savedmacro\inputs{% get number of inputs \pgf@circ@count@a=\pgfkeysvalueof{/tikz/number inputs}\relax \ifnum\pgf@circ@count@a=0\pgf@circ@count@a=2\fi % default \ifnum\pgf@circ@count@a<2 \pgf@circ@count@a=2\fi % minimum pins % \ifnum\pgf@circ@count@a>16 \pgf@circ@count@a=16\fi \def\inputs{\the\pgf@circ@count@a}% }% \savedmacro\inners{% get number of "inner" inputs (for racks) \pgf@circ@count@a=\pgfkeysvalueof{/tikz/number inputs}\relax \pgf@circ@count@b=\pgfkeysvalueof{/tikz/inner inputs}\relax \ifnum\pgf@circ@count@a=0 \pgf@circ@count@a=2\fi % default pins \ifnum\pgf@circ@count@a<2 \pgf@circ@count@a=2\fi % minimum pins \ifnum\pgf@circ@count@b=0 \pgf@circ@count@b=\pgf@circ@count@a\fi % \typeout{INNER is \the\pgf@circ@count@b}% % \ifnum\pgf@circ@count@a>16 \pgf@circ@count@a=16\fi \def\inners{\the\pgf@circ@count@b}% }% \anchor{center}{\pgfpointorigin} \anchor{text}{ \ifpgf@circ@center@text \pgfpoint{-.5\wd\pgfnodeparttextbox}{\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox} \else \pgf@circ@ieeestd@stdH \pgfmathsetlength{\pgf@circ@res@left}{-8*\pgf@circ@res@temp/6.5} % left border \pgfpoint{\pgf@circ@res@left + \ctikzvalof{left text distance}}{\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox} \fi } % create input anchors \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@ieeestd #1 port\endcsname{% \pgf@circ@count@a=\inputs \pgfmathloop% \ifnum\pgfmathcounter>\pgf@circ@count@a% \else% %\pgfutil@ifundefined{pgf@anchor@american #1 port@in \pgfmathcounter}{% \expandafter\xdef\csname pgf@anchor@ieeestd #1 port@in \pgfmathcounter\endcsname{% \noexpand\pgf@circ@ieeeport@input{\pgfmathcounter}% defined above }% \expandafter\xdef\csname pgf@anchor@ieeestd #1 port@bin \pgfmathcounter\endcsname{% \noexpand\pgf@circ@ieeeport@baseinput{\pgfmathcounter}{#2}% defined above }% \ifnum #2 = 3\relax % xor/xnor inner border pins \expandafter\xdef\csname pgf@anchor@ieeestd #1 port@ibin \pgfmathcounter\endcsname{% \noexpand\pgf@circ@ieeeport@innerbaseinput{\pgfmathcounter}% defined above }% \fi %}{}% \repeatpgfmathloop% } % output anchor \anchor{out}{% \pgfextractx{\pgf@circ@res@other}{\bodyright} %body border, without not ball \advance\pgf@circ@res@other by\pinlen \pgfextractx{\pgf@circ@res@temp}{\bottomright} %body + ball border \ifdim \pgf@circ@res@temp > \pgf@circ@res@other \pgf@circ@res@other = \pgf@circ@res@temp % do not enter in the ball... \fi \pgf@x=\pgf@circ@res@other\pgf@y=0pt } \anchor{bout}{\bottomright\pgf@y=0pt} \anchor{body right}{\bodyright\pgf@y=0pt} \anchor{right}{\bottomright\pgf@y=0pt} \anchor{body left}{\bodyleft\pgf@y=0pt}% central edge of the body \anchor{left}{% central edge of the component \bodyleft\pgf@y=0pt \ifnum #2=3\relax \advance\pgf@x by -\xorbar \fi } \anchor{up}{% \bodyleft \ifnum #2 > 1 % pointy shapes \pgf@circ@ieeestd@stdH % horizontal coordinate where the right semicircle starts \pgfmathsetlength{\pgf@circ@res@other}{-8*\pgf@circ@res@temp/6.5+2*\pgf@circ@res@temp*cos(\pgf@circ@orangle)} % vertical drop of the circle at the above coordinate \pgfmathsetlength{\pgf@circ@res@step}{2*\pgf@circ@res@temp*(1-cos(atan(\pgf@circ@res@other/(2*\pgf@circ@res@temp))))} \advance \pgf@y by -\pgf@circ@res@step \fi \pgf@x=0pt } \anchor{down}{% \bodyleft \ifnum #2 > 1 % pointy shapes \pgf@circ@ieeestd@stdH % horizontal coordinate where the right semicircle starts \pgfmathsetlength{\pgf@circ@res@other}{-8*\pgf@circ@res@temp/6.5+2*\pgf@circ@res@temp*cos(\pgf@circ@orangle)} % vertical drop of the circle at the above coordinate \pgfmathsetlength{\pgf@circ@res@step}{2*\pgf@circ@res@temp*(1-cos(atan(\pgf@circ@res@other/(2*\pgf@circ@res@temp))))} \advance \pgf@y by -\pgf@circ@res@step \fi \pgf@y=-\pgf@y\pgf@x=0pt } % geographical anchors \anchor{nw}{\northwest} \anchor{ne}{\northeast} \anchor{se}{\southeast} \anchor{sw}{\southwest} \anchor{north west}{\northwest} \anchor{north east}{\northeast} \anchor{south east}{\southeast} \anchor{south west}{\southwest} % over 0,0 even if asymmetric % will break if the geocoords are not rectangular \anchor{n}{\northwest\pgf@x=0pt\relax} \anchor{e}{\northeast\pgf@y=0pt\relax} \anchor{s}{\southwest\pgf@x=0pt\relax} \anchor{w}{\northwest\pgf@y=0pt\relax} \anchor{north}{\northwest\pgf@x=0pt\relax} \anchor{east}{\northeast\pgf@y=0pt\relax} \anchor{south}{\southwest\pgf@x=0pt\relax} \anchor{west}{\northwest\pgf@y=0pt\relax} \backgroundpath{ \pgfscope \pgfsetcolor{\ctikzvalof{color}} #4 \endpgfscope % output lead: \pgfextractx{\pgf@circ@res@right}{\bottomright} %body+ball border \pgfextractx{\pgf@circ@res@other}{\bodyright} %body border, without "not" ball \advance\pgf@circ@res@other by \pinlen\relax \ifdim \pgf@circ@res@other > \pgf@circ@res@right \ifpgfcirc@draw@output@leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{0pt}} \pgfusepath{draw} \fi \fi \ifnum #3=1\relax\pgfscope \pgftransformshift{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfnode{notcirc}{east}{}{\thisshape-not}{\pgfusepath{stroke}} \endpgfscope\fi } } } %%% #1 direct name #2 negated name #3 type #4 drawing (without output) \long\def\pgfcircdeclareieeeportpair#1#2#3#4{% \pgfcircdeclareieeeport{#1}{#3}{0}{#4}% direct \pgfcircdeclareieeeport{#2}{#3}{1}{#4}% negated } % % ieeestd "and" and "nand" % \pgfcircdeclareieeeportpair{and}{nand}{1}{% \pgf@circ@count@a = \inputs\relax \pgfmathsetlength{\pgf@circ@res@up}{(\inputs/2)*\pind} %top of the rack/port \pgfmathsetlength{\pgf@circ@res@temp}{\pgf@circ@res@up+0.5*\pind} \pgfextractx{\pgf@circ@res@left}{\bodyleft} \pgfextracty{\pgf@circ@res@down}{\bodyleft} \ifpgfcirc@draw@input@leads %input leads --- all the same for AND ports \loop\ifnum\pgf@circ@count@a>0 \advance\pgf@circ@res@temp by -\pind \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@temp}}% \pgfpathlineto{\pgfpoint{\pgf@circ@res@left-\pinlen}{\pgf@circ@res@temp}}% \advance\pgf@circ@count@a by -1 \repeat \fi \pgfusepath{draw} %% Body. let's start from the top left \pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfpathmoveto{\pgfpoint{-8*\stdH/6.5}{\stdH}} \pgfpathlineto{\pgfpoint{1.5*\stdH/6.5}{\stdH}} \pgfpatharc{90}{-90}{\stdH} \pgfpathlineto{\pgfpoint{-8*\stdH/6.5}{-\stdH}} \pgfpathclose \pgf@circ@draworfill % rack now; skip if not needed. % \typeout{WHAT\space \inputs\space \inners} \ifnum\inputs>\inners \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@down}} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{-\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left}{-\pgf@circ@res@up}} \pgfusepath{draw} \fi \endpgfscope } % % or/nor and xor/xnor are practically the same. Let factor out everything % the argument #1 is put just before the drawing of the inner pins % the argument #2 is put after the drawing of the body % \long\def\pgf@circ@ieeeport@orxor#1#2{% \pgf@circ@count@a = \inputs\relax \pgfmathsetlength{\pgf@circ@res@up}{(\inputs/2)*\pind} %top of the rack/port \pgfmathsetlength{\pgf@circ@res@temp}{\pgf@circ@res@up+0.5*\pind} \pgfextractx{\pgf@circ@res@left}{\bodyleft} \pgfextracty{\pgf@circ@res@down}{\bodyleft} % rack (extended) pins; they are the same for all the ports % call K = (inputs-inner)/2, rounded up; pins on the rack are: % above: 1..K (included) % below: inputs-K..inputs % Find the pins on the rack; they are 1... \pgf@circ@count@b=\numexpr (\inputs - \inners)/2\relax % =K; numexpr rounds up! \pgf@circ@count@c=\numexpr \inputs - \pgf@circ@count@b +1 \relax % =inputs - K +1 \ifpgfcirc@draw@input@leads %input leads --- for or ports \loop\ifnum\pgf@circ@count@a>0 \pgfextractx{\pgf@circ@res@right}{\topleft} \advance\pgf@circ@res@temp by -\pind % this is the height; let's find the "right" position \ifnum \pgf@circ@count@a > \pgf@circ@count@b \ifnum \pgf@circ@count@a < \pgf@circ@count@c % inner pins % \typeout{INNER\space\pgf@circ@count@a} \pgfmathsetlength{\pgf@circ@res@right}{\pgf@circ@res@left-2*\stdH*(1-cos(atan(\pgf@circ@res@temp/(2*\stdH))))} % hook for xor/xnor #1 \fi\fi \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@temp}}% \pgfpathlineto{\pgfpoint{\pgf@circ@res@left-\pinlen}{\pgf@circ@res@temp}}% \pgfusepath{draw} \advance\pgf@circ@count@a by -1 \repeat \fi %% Body. let's start from the top left \pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} % it should start here, but with this trick the close comes out better. % \pgfpathmoveto{\pgfpoint{-8*\stdH/6.5-2*\stdH*(1-cos(\pgf@circ@orangle))}{\stdH}} \pgfpathmoveto{\pgfpoint{-8*\stdH/6.5}{\stdH}} \pgfpathlineto{\pgfpoint{8*\stdH/6.5-2*\stdH*cos(\pgf@circ@orangle)}{\stdH}} % \pgfpatharcto{2*\stdH}{2*\stdH}{0}{0}{0}{\pgfpoint{8*\stdH/6.5}{0pt}} \pgfpatharcto{2*\stdH}{2*\stdH}{0}{0}{0}{\pgfpoint{8*\stdH/6.5-2*\stdH*cos(\pgf@circ@orangle)}{-\stdH}} \pgfpathlineto{\pgfpoint{-8*\stdH/6.5-2*\stdH*(1-cos(\pgf@circ@orangle))}{-\stdH}} %% this should be 2 and 2; but the round part is not a perfect circle that way %% so the 2.15 is ajusted "by taste" to touch the anchors exactly. \pgfpatharcto{2*\stdH}{2.2*\stdH}{0}{0}{1}{\pgfpoint{-8*\stdH/6.5-2*\stdH*(1-cos(\pgf@circ@orangle))}{\stdH}} \pgfpathclose \pgf@circ@draworfill % hook for xor/xnor #2 % rack now; skip if not needed. % \typeout{WHAT\space \inputs\space \inners} \ifnum\inputs>\inners \pgfextractx{\pgf@circ@res@left}{\topleft} \pgfextracty{\pgf@circ@res@down}{\topleft} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@down}} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{-\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left}{-\pgf@circ@res@up}} \pgfusepath{draw} \fi \endpgfscope } % % ieeestd "or" and "nor" % \pgfcircdeclareieeeportpair{or}{nor}{2}{% \pgf@circ@ieeeport@orxor{}{} } \pgfcircdeclareieeeportpair{xor}{xnor}{3}{% \pgf@circ@ieeeport@orxor{ \edef\@@tmp{\ctikzvalof{ieeestd ports/xor leads in}} \ifnum\@@tmp=0\relax % move pin start to the left to leave the xor gap free (not standard) \advance\pgf@circ@res@right by -\xorbar \fi }{% % add the xor/xnor bar \pgfpathmoveto{\pgfpoint{-\xorbar-8*\stdH/6.5-2*\stdH*(1-cos(\pgf@circ@orangle))}{-\stdH}} % see the comment on the main body about the 2.2 \pgfpatharcto{2*\stdH}{2.2*\stdH}{0}{0}{1}{\pgfpoint{-\xorbar -8*\stdH/6.5-2*\stdH*(1-cos(\pgf@circ@orangle))}{\stdH}} \pgfusepath{draw} } } % % Buffer and inverters % % #1: name % #2: polarity % #3: content \long\def\pgfcircdeclareieeebufferport#1#2#3{% \pgfdeclareshape{ieeestd #1 port}% {% \savedmacro{\ctikzclass}{\edef\ctikzclass{logic ports}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \savedmacro{\thisshape}{\def\thisshape{\tikz@fig@name}} \saveddimen{\baselen}{% \pgf@circ@ieeestd@baselen\pgf@x=\pgf@circ@res@temp } \saveddimen{\stdH}{% This is HALF the height of the inner port \pgf@circ@ieeestd@stdH\pgf@x=\pgf@circ@res@temp } \saveddimen{\notdiameter}{ \pgf@circ@notradius\pgf@x=2\pgf@circ@res@temp } \saveddimen{\pinlen}{% \pgf@circ@ieeestd@pinlen\pgf@x=\pgf@circ@res@temp } % anchors for the body (no pins included here) % Notice that 0.8660254 is cos(30) \savedanchor{\bodyleft}{% This DOES NOT take into account the pointy or/xor thing \pgf@circ@ieeestd@stdH \pgfmathsetlength{\pgf@x}{-0.8660254*\pgf@circ@res@temp} \pgfmathsetlength{\pgf@y}{\pgf@circ@res@temp} } \savedanchor{\topleft}{% \pgf@circ@ieeestd@stdH \pgfmathsetlength{\pgf@x}{-0.8660254*\pgf@circ@res@temp} \pgfmathsetlength{\pgf@y}{\pgf@circ@res@temp} } \savedanchor{\bodyright}{% This DOES NOT take into account the "NOT" circle \pgf@circ@ieeestd@stdH \pgfmathsetlength{\pgf@x}{0.8660254*\pgf@circ@res@temp} \pgfmathsetlength{\pgf@y}{\pgf@circ@res@temp} } \savedanchor{\bottomright}{% This DOES take into account the "NOT" circle \pgf@circ@notradius\pgf@circ@res@other=\pgf@circ@res@temp \pgf@circ@ieeestd@stdH % #2 is =1 if the port is a negated output one \pgfmathsetlength{\pgf@x}{0.8660254*\pgf@circ@res@temp+#2*2*\pgf@circ@res@other} \pgfmathsetlength{\pgf@y}{-\pgf@circ@res@temp} } % geographical anchors --- must be rectangulars! \savedanchor{\northwest}{% \pgf@circ@ieeestd@stdH \pgfmathsetlength{\pgf@x}{-0.8660254*\pgf@circ@res@temp} \pgfmathsetlength{\pgf@y}{\pgf@circ@res@temp} } \savedanchor{\southwest}{% \pgf@circ@ieeestd@stdH \pgfmathsetlength{\pgf@x}{-0.8660254*\pgf@circ@res@temp} \pgfmathsetlength{\pgf@y}{-\pgf@circ@res@temp} } \savedanchor{\southeast}{% \pgf@circ@ieeestd@stdH \pgf@circ@res@up=\pgf@circ@res@temp \pgf@circ@find@ieeeport@not@right{#2} \pgf@x=\pgf@circ@res@right \pgf@y=-\pgf@circ@res@up } \savedanchor{\northeast}{% \pgf@circ@ieeestd@stdH \pgf@circ@res@up=\pgf@circ@res@temp \pgf@circ@find@ieeeport@not@right{#2} \pgf@x=\pgf@circ@res@right \pgf@y=\pgf@circ@res@up } \anchor{center}{\pgfpointorigin} \anchor{text}{ \ifpgf@circ@center@text \pgfpoint{-.5\wd\pgfnodeparttextbox}{\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox} \else \pgf@circ@ieeestd@stdH \pgfpoint{-0.8660254*\pgf@circ@res@temp + \ctikzvalof{left text distance}}{\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox} \fi } % input anchors \anchor{in}{\bodyleft\pgf@y=0pt\advance\pgf@x by-\pinlen} \anchor{in 1}{\bodyleft\pgf@y=0pt\advance\pgf@x by-\pinlen} \anchor{bin}{\bodyleft\pgf@y=0pt\relax} \anchor{bin 1}{\bodyleft\pgf@y=0pt\relax} % output anchors \anchor{out}{% \pgfextractx{\pgf@circ@res@other}{\bodyright} %body border, without not ball \advance\pgf@circ@res@other by\pinlen \pgfextractx{\pgf@circ@res@temp}{\bottomright} %body + ball border \ifdim \pgf@circ@res@temp > \pgf@circ@res@other \pgf@circ@res@other = \pgf@circ@res@temp % do not enter in the ball... \fi \pgf@x=\pgf@circ@res@other\pgf@y=0pt } \anchor{bout}{\bottomright\pgf@y=0pt} \anchor{body right}{\bodyright\pgf@y=0pt} \anchor{right}{\bottomright\pgf@y=0pt} \anchor{body left}{\bodyleft\pgf@y=0pt}% central edge of the body \anchor{left}{\bodyleft\pgf@y=0pt} \anchor{up}{% \bodyleft \pgf@y=+0.5\pgf@y\pgf@x=0pt } \anchor{down}{% \bodyleft \pgf@y=-0.5\pgf@y\pgf@x=0pt } % this is for when it's used as a bipole % we use the enclosing rectangle (see below) \anchorborder{% %% This (commented out) is the correct border anchor. But if we use the correct %% border anchor there is no horizontal space for the label ;-) because %% the triangle is too steep. So we will use a simple square border %% %% find the border anchor of a triangle (like a not port or an %% amplifier) --- %% %% -----^ up %% I --- | %% I -|-- %%left I | --- right %% ----I-----|-------I----- %% %% %\pgf@xa=\pgf@x %% it's simmetrical w/ vertical side, use only positive y %\pgfmathsetmacro{\@@switchy}{ifthenelse(\pgf@y>0,1,-1)} %\pgfmathsetlength{\pgf@ya}{abs(\pgf@y)} %\pgfextracty{\pgf@circ@res@up}{\bodyleft} %\pgfextractx{\pgf@circ@res@left}{\bodyleft} %\pgfextractx{\pgf@circ@res@right}{\bodyright} %% limit angle for the left (vertical) side %\pgfmathsetmacro{\@@phimax}{atan2(\pgf@circ@res@up,\pgf@circ@res@left)} %\pgfmathsetmacro{\@@phi}{atan2(\pgf@ya,\pgf@xa)} %\pgfmathsetmacro{\@@leftside}{ifthenelse(\@@phi>\@@phimax,1,0)} %% find the border %\ifnum\@@leftside>0 % % vertical side % \pgfpointborderrectangle{\pgfpoint{\pgf@xa}{\pgf@ya}} % {\pgfpoint{-\pgf@circ@res@left}{\pgf@circ@res@up}} %\else % % triangle upper line % \pgfpointintersectionoflines % {\pgfpointorigin}{\pgfqpoint{\pgf@xa}{\pgf@ya}} % {\pgfqpoint{\pgf@circ@res@left}{\pgf@circ@res@up}}{\pgfqpoint{\pgf@circ@res@right}{0pt}} %\fi %% readjust y sign %\pgf@y=\@@switchy\pgf@y % % this is the square border to position the path label with a bit of horizontal space % \pgf@xa=\pgf@x \pgf@ya=\pgf@y \pgfextracty{\pgf@circ@res@up}{\bodyleft} \pgfextractx{\pgf@circ@res@left}{\bodyleft} \pgfpointborderrectangle{\pgfpoint{\pgf@xa}{\pgf@ya}} {\pgfpoint{-\pgf@circ@res@left}{\pgf@circ@res@up}} } % geographical anchors \anchor{nw}{\northwest} \anchor{ne}{\northeast} \anchor{se}{\southeast} \anchor{sw}{\southwest} \anchor{north west}{\northwest} \anchor{north east}{\northeast} \anchor{south east}{\southeast} \anchor{south west}{\southwest} % over 0,0 even if asymmetric % will break if the geocoords are not rectangular \anchor{n}{\northwest\pgf@x=0pt\relax} \anchor{e}{\northeast\pgf@y=0pt\relax} \anchor{s}{\southwest\pgf@x=0pt\relax} \anchor{w}{\northwest\pgf@y=0pt\relax} \anchor{north}{\northwest\pgf@x=0pt\relax} \anchor{east}{\northeast\pgf@y=0pt\relax} \anchor{south}{\southwest\pgf@x=0pt\relax} \anchor{west}{\northwest\pgf@y=0pt\relax} \backgroundpath{ \pgfscope \pgfsetcolor{\ctikzvalof{color}} #3 \endpgfscope % output lead: \pgfextractx{\pgf@circ@res@right}{\bottomright} %body+ball border \pgfextractx{\pgf@circ@res@other}{\bodyright} %body border, without "not" ball \advance\pgf@circ@res@other by \pinlen\relax \ifdim \pgf@circ@res@other > \pgf@circ@res@right \ifpgfcirc@draw@output@leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{0pt}} \pgfusepath{draw} \fi \fi \ifnum #2=1\relax\pgfscope \pgftransformshift{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfnode{notcirc}{east}{}{\thisshape-not}{\pgfusepath{stroke}} \endpgfscope\fi } } } %%% #1 direct name #2 negated name #3 drawing (without output) \long\def\pgfcircdeclareieeebufferportpair#1#2#3{% \pgfcircdeclareieeebufferport{#1}{0}{#3}% direct \pgfcircdeclareieeebufferport{#2}{1}{#3}% negated } \pgfcircdeclareieeebufferportpair{buffer}{not}{% \pgfextractx{\pgf@circ@res@left}{\bodyleft} \pgfextracty{\pgf@circ@res@up}{\bodyleft} \pgfextractx{\pgf@circ@res@right}{\bodyright} % \draw input pin \ifpgfcirc@draw@input@leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left-\pinlen}{0pt}} \pgfusepath{draw} \fi \pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left}{-\pgf@circ@res@up}} \pgfpathclose \pgf@circ@draworfill \endpgfscope } \pgfcircdeclareieeebufferportpair{schmitt}{invschmitt}{% \pgfextractx{\pgf@circ@res@left}{\bodyleft} \pgfextracty{\pgf@circ@res@up}{\bodyleft} \pgfextractx{\pgf@circ@res@right}{\bodyright} % \draw input pin \ifpgfcirc@draw@input@leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left-\pinlen}{0pt}} \pgfusepath{draw} \fi \pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left}{-\pgf@circ@res@up}} \pgfpathclose \pgf@circ@draworfill \endpgfscope % draw schmitt symbol in normal line thickness \pgfpathmoveto{\pgfpoint{0.75*\pgf@circ@res@left}{-0.25*\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0.50*\pgf@circ@res@left}{-0.25*\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0.50*\pgf@circ@res@left}{0.25*\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0.00*\pgf@circ@res@left}{0.25*\pgf@circ@res@up}} \pgfpathmoveto{\pgfpoint{0.25*\pgf@circ@res@left}{0.25*\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0.25*\pgf@circ@res@left}{-0.25*\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0.5*\pgf@circ@res@left}{-0.25*\pgf@circ@res@up}} \pgfusepath{draw} } \pgfdeclareshape{schmitt symbol}{ \savedmacro{\ctikzclass}{\edef\ctikzclass{logic ports}} \anchor{center}{\pgfpointorigin} \savedanchor\northwest{% \pgf@circ@ieeestd@stdH \pgf@y=\ctikzvalof{ieeestd ports/schmitt symbol size}\pgf@circ@res@temp \pgf@x=-1.5\pgf@y } \anchor{center}{\pgf@y=0pt \pgf@x=0pt} \anchor{east}{\northwest\pgf@y=0pt\pgf@x=-\pgf@x} \anchor{e}{\northwest\pgf@y=0pt \pgf@x=-\pgf@x} \anchor{west}{\northwest\pgf@y=0pt} \anchor{w}{\northwest \pgf@y=0pt} \anchor{south}{\northwest \pgf@x=0pt\pgf@y=-\pgf@y} \anchor{s}{\northwest\pgf@x=0pt\pgf@y=-\pgf@y} \anchor{north}{\northwest\pgf@x=0pt} \anchor{n}{\northwest\pgf@x=0pt} \anchor{south west}{\northwest\pgf@y=-\pgf@y} \anchor{north east}{\northwest\pgf@x=-\pgf@x} \anchor{north west}{\northwest} \anchor{south east}{\northwest\pgf@x=-\pgf@x\pgf@y=-\pgf@y} \backgroundpath{ \pgfscope \pgfsetcolor{\ctikzvalof{color}} \pgfextractx{\pgf@circ@res@left}{\northwest} \pgfextracty{\pgf@circ@res@up}{\northwest} \pgf@circ@res@left=0.7\pgf@circ@res@left \pgf@circ@res@up=0.7\pgf@circ@res@up \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{-\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left/3}{-\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left/3}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{-\pgf@circ@res@left}{\pgf@circ@res@up}} \pgfpathmoveto{\pgfpoint{-\pgf@circ@res@left/3}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{-\pgf@circ@res@left/3}{-\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left}{-\pgf@circ@res@up}} \pgfusepath{draw} \endpgfscope } } \pgfdeclareshape{notcirc}{ \savedmacro{\ctikzclass}{\edef\ctikzclass{logic ports}} \anchor{center}{\pgfpointorigin} \savedanchor\northwest{% \pgf@circ@notradius \pgf@y=\pgf@circ@res@temp \pgf@x=-\pgf@y } \anchor{center}{\pgf@y=0pt \pgf@x=0pt} \anchor{right}{\northwest\pgf@y=0pt\pgf@x=-\pgf@x} \anchor{east}{\northwest\pgf@y=0pt\pgf@x=-\pgf@x} \anchor{e}{\northwest\pgf@y=0pt \pgf@x=-\pgf@x} \anchor{left}{\northwest\pgf@y=0pt} \anchor{west}{\northwest\pgf@y=0pt} \anchor{w}{\northwest \pgf@y=0pt} \anchor{south}{\northwest \pgf@x=0pt\pgf@y=-\pgf@y} \anchor{s}{\northwest\pgf@x=0pt\pgf@y=-\pgf@y} \anchor{north}{\northwest\pgf@x=0pt} \anchor{n}{\northwest\pgf@x=0pt} \anchor{south west}{\northwest\pgf@y=-\pgf@y} \anchor{north east}{\northwest\pgf@x=-\pgf@x} \anchor{north west}{\northwest} \anchor{south east}{\northwest\pgf@x=-\pgf@x\pgf@y=-\pgf@y} \anchorborder{ \pgf@circ@res@left=\pgf@x \pgf@circ@res@up=\pgf@y \northwest\pgf@circ@res@temp=\pgf@y \pgfpointborderellipse{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@up}}% {\pgfpoint{\pgf@circ@res@temp}{\pgf@circ@res@temp}} } \behindforegroundpath{ \pgfscope \northwest\pgf@circ@res@temp=\pgf@y \pgfsetcolor{\ctikzvalof{color}} \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfpathcircle{\pgfpointorigin}{\pgf@circ@res@temp} \ifx\tikz@fillcolor\pgfutil@empty % set the default fill color to white \pgfsetfillcolor{white} % ...but override it if the class is defined! \pgf@circ@setifdefinedfill{draw, fill}{draw, fill} \else \pgfsetfillcolor{\tikz@fillcolor} \fi \pgfsetfillopacity{\ctikzvalof{ieeestd ports/not radius fill}}% normally 1.0 \pgfusepath{draw,fill} \endpgfscope } } %%%% Transmission gates % tgates are only ieee style for now \tikzset{% tgate/.style ={shape=ieee tgate}, double tgate/.style ={shape=ieee double tgate}, } \ctikzset{tgate scale/.initial=0.7} % Buffer and inverters % % #1: name % #2: 1: one-not, 2:double-not % #3: content \long\def\pgfcircdeclareieeetgate#1#2#3{% \pgfdeclareshape{ieee #1}% {% \savedmacro{\ctikzclass}{\edef\ctikzclass{logic ports}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \savedmacro{\thisshape}{\def\thisshape{\tikz@fig@name}} \saveddimen{\baselen}{% \pgf@circ@ieeestd@baselen\pgf@x=\pgf@circ@res@temp } \saveddimen{\stdH}{% This is HALF the height of the inner port \pgf@circ@ieeestd@stdH\pgf@x=\pgf@circ@res@temp } \saveddimen{\notdiameter}{ \pgf@circ@notradius\pgf@x=2\pgf@circ@res@temp } \saveddimen{\notradius}{ \pgf@circ@notradius\pgf@x=\pgf@circ@res@temp } \saveddimen{\pinlen}{% \pgf@circ@ieeestd@pinlen\pgf@x=\pgf@circ@res@temp } % anchors for the body (no pins included here) % Notice that 0.8660254 is cos(30) \savedanchor{\bodyleft}{% This DOES NOT take into account the pointy or/xor thing \pgf@circ@ieeestd@stdH \pgfmathsetlength{\pgf@x}{-2*0.8660254*\pgf@circ@res@temp*\ctikzvalof{tgate scale}} \pgfmathsetlength{\pgf@y}{#2*\pgf@circ@res@temp*\ctikzvalof{tgate scale}} } \savedanchor{\topleft}{% \pgf@circ@ieeestd@stdH \pgfmathsetlength{\pgf@x}{-2*0.8660254*\pgf@circ@res@temp*\ctikzvalof{tgate scale}} \pgfmathsetlength{\pgf@y}{#2*\pgf@circ@res@temp*\ctikzvalof{tgate scale}} } \savedanchor{\bodyright}{% \pgf@circ@ieeestd@stdH \pgfmathsetlength{\pgf@x}{2*0.8660254*\pgf@circ@res@temp*\ctikzvalof{tgate scale}} \pgfmathsetlength{\pgf@y}{#2*\pgf@circ@res@temp*\ctikzvalof{tgate scale}} } \savedanchor{\bottomright}{% Here it is the same as \bodyright \pgf@circ@ieeestd@stdH \pgfmathsetlength{\pgf@x}{2*0.8660254*\pgf@circ@res@temp*\ctikzvalof{tgate scale}} \pgfmathsetlength{\pgf@y}{#2*\pgf@circ@res@temp*\ctikzvalof{tgate scale}} } % geographical anchors --- must be rectangulars! \savedanchor{\northwest}{% \pgf@circ@ieeestd@stdH \pgfmathsetlength{\pgf@x}{-2*0.8660254*\pgf@circ@res@temp*\ctikzvalof{tgate scale}} \pgfmathsetlength{\pgf@y}{#2*\pgf@circ@res@temp*\ctikzvalof{tgate scale}} } \savedanchor{\southwest}{% \pgf@circ@ieeestd@stdH \pgfmathsetlength{\pgf@x}{-2*0.8660254*\pgf@circ@res@temp*\ctikzvalof{tgate scale}} \pgfmathsetlength{\pgf@y}{-#2*\pgf@circ@res@temp*\ctikzvalof{tgate scale}} } \savedanchor{\southeast}{% \pgf@circ@ieeestd@stdH \pgfmathsetlength{\pgf@x}{2*0.8660254*\pgf@circ@res@temp*\ctikzvalof{tgate scale}} \pgfmathsetlength{\pgf@y}{-#2*\pgf@circ@res@temp*\ctikzvalof{tgate scale}} } \savedanchor{\northeast}{% \pgf@circ@ieeestd@stdH \pgfmathsetlength{\pgf@x}{2*0.8660254*\pgf@circ@res@temp*\ctikzvalof{tgate scale}} \pgfmathsetlength{\pgf@y}{#2*\pgf@circ@res@temp*\ctikzvalof{tgate scale}} } \anchor{center}{\pgfpointorigin} \anchor{text}{ \ifpgf@circ@center@text \pgfpoint{-.5\wd\pgfnodeparttextbox}{\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox} \else \pgf@circ@ieeestd@stdH \pgfpoint{-0.8660254*\pgf@circ@res@temp + \ctikzvalof{left text distance}}{\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox} \fi } % input anchors \anchor{in}{\bodyleft\pgf@y=0pt\advance\pgf@x by-\pinlen} \anchor{in 1}{\bodyleft\pgf@y=0pt\advance\pgf@x by-\pinlen} \anchor{bin}{\bodyleft\pgf@y=0pt\relax} \anchor{bin 1}{\bodyleft\pgf@y=0pt\relax} % gates \anchor{gate}{\bodyleft\pgf@circ@res@up=\pgf@y \pgf@x=0pt\pgfmathsetlength{\pgf@y}{-(#2-1)*0.5*\pgf@circ@res@up-\pinlen}} \anchor{bgate}{\bodyleft\pgf@circ@res@up=\pgf@y \pgf@x=0pt\pgfmathsetlength{\pgf@y}{-(#2-1)*0.5*\pgf@circ@res@up}} % gate (up) (2.1547 = 1+1/cos(30) \anchor{notgate}{\bodyleft\pgf@circ@res@up=\pgf@y \pgf@x=0pt\relax \pgfmathsetlength{\pgf@circ@res@temp}{2.1547*\notradius} \ifdim\pinlen>\pgf@circ@res@temp \pgfmathsetlength{\pgf@y}{(#2-1)*0.5*\pgf@circ@res@up+\pinlen} \else \pgf@y=\pgf@circ@res@temp \fi } \anchor{bnotgate}{\bodyleft\pgf@circ@res@up=\pgf@y \pgf@x=0pt\pgfmathsetlength{\pgf@y}{(#2-1)*0.5*\pgf@circ@res@up+2.1547*\notradius}} % output anchors \anchor{out}{% \pgfextractx{\pgf@circ@res@other}{\bodyright} %body border, without not ball \advance\pgf@circ@res@other by\pinlen \pgfextractx{\pgf@circ@res@temp}{\bottomright} %body + ball border \ifdim \pgf@circ@res@temp > \pgf@circ@res@other \pgf@circ@res@other = \pgf@circ@res@temp % do not enter in the ball... \fi \pgf@x=\pgf@circ@res@other\pgf@y=0pt } \anchor{bout}{\bottomright\pgf@y=0pt} \anchor{body right}{\bodyright\pgf@y=0pt} \anchor{right}{\bottomright\pgf@y=0pt} \anchor{body left}{\bodyleft\pgf@y=0pt}% central edge of the body \anchor{left}{\bodyleft\pgf@y=0pt} \anchor{up}{% \bodyleft \pgf@x=0pt \ifnum#2=1\relax \pgf@y=0pt \else \pgf@y=.5\pgf@y \fi \advance\pgf@y by \notdiameter } \anchor{down}{% \bodyleft \pgf@x=0pt \ifnum#2=1\relax \pgf@y=0pt \else \pgf@y=-.5\pgf@y \fi } % this is for when it's used as a bipole % we use the enclosing rectangle (see below) \anchorborder{% % % this is the square border to position the path label with a bit of horizontal space % \pgf@xa=\pgf@x \pgf@ya=\pgf@y \pgfextracty{\pgf@circ@res@up}{\bodyleft} \pgfextractx{\pgf@circ@res@left}{\bodyleft} \pgfpointborderrectangle{\pgfpoint{\pgf@xa}{\pgf@ya}} {\pgfpoint{-\pgf@circ@res@left}{\pgf@circ@res@up}} } % geographical anchors \anchor{nw}{\northwest} \anchor{ne}{\northeast} \anchor{se}{\southeast} \anchor{sw}{\southwest} \anchor{north west}{\northwest} \anchor{north east}{\northeast} \anchor{south east}{\southeast} \anchor{south west}{\southwest} % over 0,0 even if asymmetric % will break if the geocoords are not rectangular \anchor{n}{\northwest\pgf@x=0pt\relax} \anchor{e}{\northeast\pgf@y=0pt\relax} \anchor{s}{\southwest\pgf@x=0pt\relax} \anchor{w}{\northwest\pgf@y=0pt\relax} \anchor{north}{\northwest\pgf@x=0pt\relax} \anchor{east}{\northeast\pgf@y=0pt\relax} \anchor{south}{\southwest\pgf@x=0pt\relax} \anchor{west}{\northwest\pgf@y=0pt\relax} \backgroundpath{ \pgfscope \pgfsetcolor{\ctikzvalof{color}} \pgfextractx{\pgf@circ@res@left}{\bodyleft} \pgfextracty{\pgf@circ@res@up}{\bodyleft} \pgfextractx{\pgf@circ@res@right}{\bodyright} % \draw input pins \ifpgfcirc@draw@input@leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left-\pinlen}{0pt}} % gate (down) \pgfpathmoveto{\pgfpoint{0pt}{-(#2-1)*0.5*\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0pt}{-(#2-1)*0.5*\pgf@circ@res@up-\pinlen}} % gate (up) (2.1547 = 1+1/cos(30) \pgfmathsetlength{\pgf@circ@res@temp}{2.1547*\notradius} \ifdim\pinlen>\pgf@circ@res@temp \pgfpathmoveto{\pgfpoint{0pt}{(#2-1)*0.5*\pgf@circ@res@up+\pgf@circ@res@temp}} \pgfpathlineto{\pgfpoint{0pt}{(#2-1)*0.5*\pgf@circ@res@up+\pinlen}} \fi \pgfusepath{draw} \fi #3 \endpgfscope % output lead: \pgfextractx{\pgf@circ@res@right}{\bottomright} %body+ball border \pgfextractx{\pgf@circ@res@other}{\bodyright} %body border, without "not" ball \advance\pgf@circ@res@other by \pinlen\relax \ifdim \pgf@circ@res@other > \pgf@circ@res@right \ifpgfcirc@draw@output@leads \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{0pt}} \pgfusepath{draw} \fi \fi } } } \pgfcircdeclareieeetgate{tgate}{1}{% \pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0pt}{0pt}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left}{-\pgf@circ@res@up}} \pgfpathclose \pgf@circ@draworfill \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0pt}{0pt}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{-\pgf@circ@res@up}} \pgfpathclose \pgf@circ@draworfill \endpgfscope \pgfscope % 1.1547 is 1/cos(30) \pgftransformshift{\pgfpoint{0pt}{1.1547*\notradius}} \pgfnode{notcirc}{center}{}{\thisshape-not}{\pgfusepath{stroke}} \endpgfscope } \pgfcircdeclareieeetgate{double tgate}{2}{% \pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0pt}{.5\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left}{0pt}} \pgfpathclose \pgf@circ@draworfill \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0pt}{.5\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathclose \pgf@circ@draworfill % bottom triangles \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{-\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0pt}{-.5\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left}{0pt}} \pgfpathclose \pgf@circ@draworfill \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{-\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0pt}{-.5\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathclose \pgf@circ@draworfill \endpgfscope \pgfscope % 1.1547 is 1/cos(30) \pgftransformshift{\pgfpoint{0pt}{.5*\pgf@circ@res@up+1.1547*\notradius}} \pgfnode{notcirc}{center}{}{\thisshape-not}{\pgfusepath{stroke}} \endpgfscope }% %>>> %% Path-style definitions for logical ports%<<< % % create path-style element for one input --- one output logical ports % \def\pgfcirc@port@node@to@path#1#2{% % % add a logic port path style component --- we need to suppress leads % and use the correct center % \pgfcirc@node@to@path{#1}{#2}{/tikz/no leads, \circuitikzbasekey/logic ports origin=center}% } \pgfcirc@port@node@to@path{not port}{inline not} \pgfcirc@port@node@to@path{buffer port}{inline buffer} \pgfcirc@port@node@to@path{schmitt port}{inline schmitt} \pgfcirc@port@node@to@path{invschmitt port}{inline invschmitt} \pgfcirc@port@node@to@path{tgate}{inline tgate} \pgfcirc@port@node@to@path{double tgate}{inline double tgate} % %>>> %%%%%%%%%%%%%%%%%%%%%%%% %% Transistors %%%%%%%%%%%%%%%%%%%%%%%% % Settings for Transistors %<<<1 \newif\ifpgf@circuit@trans@depletiontype \pgf@circuit@trans@depletiontypefalse \newif\ifpgf@circuit@mos@arrows \ctikzset{tripoles/mos style/.is choice} \ctikzset{tripoles/mos style/no arrows/.code={\pgf@circuit@mos@arrowsfalse}} \ctikzset{tripoles/mos style/arrows/.code={\pgf@circuit@mos@arrowstrue}} \pgfkeys{/tikz/arrowmos/.add code={}{\pgf@circuit@mos@arrowstrue}} \pgfkeys{/tikz/noarrowmos/.add code={}{\pgf@circuit@mos@arrowsfalse}} % Fixed label positions \newif\ifpgf@circuit@transisors@fixlabels \pgf@circuit@transisors@fixlabelstrue \pgfkeys{/tikz/center transistors text/.add code={}{\pgf@circuit@transisors@fixlabelstrue}} \ctikzset{fix transistors text/.add code={}{\pgf@circuit@transisors@fixlabelstrue}} \pgfkeys{/tikz/legacy transistors text/.add code={}{\pgf@circuit@transisors@fixlabelsfalse}} \ctikzset{legacy transistors text/.add code={}{\pgf@circuit@transisors@fixlabelsfalse}} % Option solderdot for fet \newif\ifpgf@circuit@fet@solderdot \pgfkeys{/tikz/solderdot/.add code={}{\pgf@circuit@fet@solderdottrue}} \ctikzset{solderdot/.add code={}{\pgf@circuit@fet@solderdottrue}} \pgfkeys{/tikz/nosolderdot/.add code={}{\pgf@circuit@fet@solderdotfalse}} \ctikzset{nosolderdot/.add code={}{\pgf@circuit@fet@solderdotfalse}} % Option bodydiode for fet \newif\ifpgf@circuit@fet@bodydiode \pgfkeys{/tikz/bodydiode/.add code={}{\pgf@circuit@fet@bodydiodetrue}} \ctikzset{bodydiode/.add code={}{\pgf@circuit@fet@bodydiodetrue}} \pgfkeys{/tikz/nobodydiode/.add code={}{\pgf@circuit@fet@bodydiodefalse}} \ctikzset{nobodydiode/.add code={}{\pgf@circuit@fet@bodydiodefalse}} % Option draw fet without gate connection \newif\ifpgf@circuit@bpt@drawgate \pgf@circuit@bpt@drawgatetrue \pgfkeys{/tikz/nogate/.add code={}{\pgf@circuit@bpt@drawgatefalse}} \ctikzset{nogate/.add code={}{\pgf@circuit@bpt@drawgatefalse}} \pgfkeys{/tikz/nobase/.add code={}{\pgf@circuit@bpt@drawgatefalse}} \ctikzset{nobase/.add code={}{\pgf@circuit@bpt@drawgatefalse}} % Option draw bpt with schottky base \newif\ifpgf@circuit@bpt@schottky \pgf@circuit@bpt@schottkyfalse \pgfkeys{/tikz/schottky base/.add code={}{\pgf@circuit@bpt@schottkytrue}} \ctikzset{schottky base/.add code={}{\pgf@circuit@bpt@schottkytrue}} \pgfkeys{/tikz/no schottky base/.add code={}{\pgf@circuit@bpt@schottkyfalse}} \ctikzset{no schottky base/.add code={}{\pgf@circuit@bpt@schottkyfalse}} \ctikzset{tripoles/schottky base size/.initial=0.05} % Option to add ferroelectric symbol \newif\ifpgf@circuit@tr@ferroel \pgf@circuit@tr@ferroelfalse \pgfkeys{/tikz/ferroel gate/.add code={}{\pgf@circuit@tr@ferroeltrue}} \ctikzset{ferroel gate/.add code={}{\pgf@circuit@tr@ferroeltrue}} \pgfkeys{/tikz/no ferroel gate/.add code={}{\pgf@circuit@tr@ferroelfalse}} \ctikzset{no ferroel gate/.add code={}{\pgf@circuit@tr@ferroelfalse}} % Option draw bpt without base connection \newif\ifpgf@circuit@bpt@drawbase \pgf@circuit@bpt@drawbasetrue \pgfkeys{/tikz/nobase/.add code={}{\pgf@circuit@bpt@drawbasefalse}} \ctikzset{nobase/.add code={}{\pgf@circuit@bpt@drawbasefalse}} \pgfkeys{/tikz/nogate/.add code={}{\pgf@circuit@bpt@drawbasefalse}} \ctikzset{nogate/.add code={}{\pgf@circuit@bpt@drawbasefalse}} % Option draw bpt with optical input \newif\ifpgf@circuit@bpt@drawphoto \pgf@circuit@bpt@drawphotofalse \pgfkeys{/tikz/photo/.add code={}{\pgf@circuit@bpt@drawphototrue}} \ctikzset{photo/.add code={}{\pgf@circuit@bpt@drawphototrue}} \pgfkeys{/tikz/photo/.add code={}{\pgf@circuit@bpt@drawphototrue}} \ctikzset{photo/.add code={}{\pgf@circuit@bpt@drawphototrue}} % Option draw fet without bulk connection -- Added by Burak Kelleci \newif\ifpgf@circuit@bpt@drawbulk \pgfkeys{/tikz/bulk/.add code={}{\pgf@circuit@bpt@drawbulktrue}} \ctikzset{bulk/.add code={}{\pgf@circuit@bpt@drawbulktrue}} \pgfkeys{/tikz/nobulk/.add code={}{\pgf@circuit@bpt@drawbulkfalse}} \ctikzset{nobulk/.add code={}{\pgf@circuit@bpt@drawbulkfalse}} % Option draw pmos with empty circle \newif\ifpgf@circuit@pmos@emptycircle \pgf@circuit@pmos@emptycirclefalse \ctikzset{tripoles/pmos style/.is choice} \pgfkeys{/tikz/emptycircle/.add code={}{\pgf@circuit@pmos@emptycircletrue}} \ctikzset{tripoles/pmos style/emptycircle/.add code={}{\pgf@circuit@pmos@emptycircletrue}} % Option draw pmos with no circle \newif\ifpgf@circuit@pmos@nocircle \pgf@circuit@pmos@nocirclefalse \pgfkeys{/tikz/nocircle/.add code={}{\pgf@circuit@pmos@nocircletrue}} \ctikzset{tripoles/pmos style/nocircle/.add code={}{\pgf@circuit@pmos@nocircletrue}} % back to normal \pgfkeys{/tikz/fullcircle/.add code={}{\pgf@circuit@pmos@emptycirclefalse\pgf@circuit@pmos@nocirclefalse}} \ctikzset{tripoles/pmos style/fullcircle/.add code={}{\pgf@circuit@pmos@emptycirclefalse\pgf@circuit@pmos@nocirclefalse}} % arrows at the end, the correct way \newif\ifpgf@circuit@trans@arrowatend \pgf@circuit@trans@arrowatendfalse \ctikzset{transistors/arrow pos/.is choice} \ctikzset{transistors/arrow pos/legacy/.code={\pgf@circuit@trans@arrowatendfalse}} \ctikzset{transistors/arrow pos/end/.code={\pgf@circuit@trans@arrowatendtrue}} \newif\ifpgf@circuit@trans@ntype \pgf@circuit@trans@ntypetrue %default true %\newif\ifpgf@circuit@trans@ptype %\ctikzset{tripoles/nmos/.add code={\pgf@circuit@trans@ntypetrue}} \ctikzset{tripoles/nmos/width/.initial=.7} \ctikzset{tripoles/nmos/gate height/.initial=.35} \ctikzset{tripoles/nmos/base height/.initial=.5} \ctikzset{tripoles/nmos/conn height/.initial=0} \ctikzset{tripoles/nmos/height/.initial=1.1} \ctikzset{tripoles/nmos/base width/.initial=.5} \ctikzset{tripoles/nmos/gate width/.initial=.62} \ctikzset{tripoles/nmos/arrow pos/.initial=.6} \ctikzset{tripoles/nmos/bodydiode scale/.initial=.3} \ctikzset{tripoles/nmos/bodydiode distance/.initial=.3} \ctikzset{tripoles/nmos/bodydiode conn/.initial=.6} \ctikzset{tripoles/nmos/curr direction/.initial=1} \ctikzset{tripoles/pmos/width/.initial=.7} \ctikzset{tripoles/pmos/gate height/.initial=.35} \ctikzset{tripoles/pmos/base height/.initial=.5} \ctikzset{tripoles/pmos/conn height/.initial=0} \ctikzset{tripoles/pmos/height/.initial=1.1} \ctikzset{tripoles/pmos/base width/.initial=.5} \ctikzset{tripoles/pmos/gate width/.initial=.62} \ctikzset{tripoles/pmos/arrow pos/.initial=.4} \ctikzset{tripoles/pmos/bodydiode scale/.initial=.3} \ctikzset{tripoles/pmos/bodydiode distance/.initial=.3} \ctikzset{tripoles/pmos/bodydiode conn/.initial=.6} \ctikzset{tripoles/pmos/curr direction/.initial=-1} \ctikzset{tripoles/nmosd/width/.initial=.7} \ctikzset{tripoles/nmosd/gate height/.initial=.35} \ctikzset{tripoles/nmosd/base height/.initial=.5} \ctikzset{tripoles/nmosd/conn height/.initial=0} \ctikzset{tripoles/nmosd/height/.initial=1.1} \ctikzset{tripoles/nmosd/base width/.initial=.5} \ctikzset{tripoles/nmosd/gate width/.initial=.62} \ctikzset{tripoles/nmosd/arrow pos/.initial=.6} \ctikzset{tripoles/nmosd/bodydiode scale/.initial=.3} \ctikzset{tripoles/nmosd/bodydiode distance/.initial=.3} \ctikzset{tripoles/nmosd/bodydiode conn/.initial=.6} \ctikzset{tripoles/nmosd/curr direction/.initial=1} \ctikzset{tripoles/nmosd/depletion width/.initial=.1} \ctikzset{tripoles/nmosd/depletion color/.initial=default} \ctikzset{tripoles/pmosd/width/.initial=.7} \ctikzset{tripoles/pmosd/gate height/.initial=.35} \ctikzset{tripoles/pmosd/base height/.initial=.5} \ctikzset{tripoles/pmosd/conn height/.initial=0} \ctikzset{tripoles/pmosd/height/.initial=1.1} \ctikzset{tripoles/pmosd/base width/.initial=.5} \ctikzset{tripoles/pmosd/gate width/.initial=.62} \ctikzset{tripoles/pmosd/arrow pos/.initial=.4} \ctikzset{tripoles/pmosd/bodydiode scale/.initial=.3} \ctikzset{tripoles/pmosd/bodydiode distance/.initial=.3} \ctikzset{tripoles/pmosd/bodydiode conn/.initial=.6} \ctikzset{tripoles/pmosd/curr direction/.initial=-1} \ctikzset{tripoles/pmosd/depletion width/.initial=.1} \ctikzset{tripoles/pmosd/depletion color/.initial=default} \ctikzset{tripoles/hemt/width/.initial=.7} \ctikzset{tripoles/hemt/gate height/.initial=.35} \ctikzset{tripoles/hemt/base height/.initial=.5} \ctikzset{tripoles/hemt/conn height/.initial=0} \ctikzset{tripoles/hemt/height/.initial=1.1} \ctikzset{tripoles/hemt/base width/.initial=.5} \ctikzset{tripoles/hemt/gate width/.initial=.5}% the horizontal position is the same \ctikzset{tripoles/hemt/bodydiode scale/.initial=.3} \ctikzset{tripoles/hemt/bodydiode distance/.initial=.3} \ctikzset{tripoles/hemt/bodydiode conn/.initial=.6} \ctikzset{tripoles/hemt/curr direction/.initial=1} \ctikzset{tripoles/nfet/width/.initial=.7} \ctikzset{tripoles/nfet/gate height/.initial=.35} \ctikzset{tripoles/nfet/base height/.initial=.5} \ctikzset{tripoles/nfet/conn height/.initial=0} \ctikzset{tripoles/nfet/height/.initial=1.1} \ctikzset{tripoles/nfet/base width/.initial=.5} \ctikzset{tripoles/nfet/gate width/.initial=.62} \ctikzset{tripoles/nfet/bodydiode scale/.initial=.3} \ctikzset{tripoles/nfet/bodydiode distance/.initial=.3} \ctikzset{tripoles/nfet/bodydiode conn/.initial=.6} \ctikzset{tripoles/nfet/curr direction/.initial=1} \ctikzset{tripoles/pfet/width/.initial=.7} \ctikzset{tripoles/pfet/gate height/.initial=.35} \ctikzset{tripoles/pfet/base height/.initial=.5} \ctikzset{tripoles/pfet/conn height/.initial=0} \ctikzset{tripoles/pfet/height/.initial=1.1} \ctikzset{tripoles/pfet/base width/.initial=.5} \ctikzset{tripoles/pfet/gate width/.initial=.62} \ctikzset{tripoles/pfet/bodydiode scale/.initial=.3} \ctikzset{tripoles/pfet/bodydiode distance/.initial=.3} \ctikzset{tripoles/pfet/bodydiode conn/.initial=.6} \ctikzset{tripoles/pfet/curr direction/.initial=-1} \ctikzset{tripoles/nfetd/width/.initial=.7} \ctikzset{tripoles/nfetd/gate height/.initial=.35} \ctikzset{tripoles/nfetd/base height/.initial=.5} \ctikzset{tripoles/nfetd/conn height/.initial=0} \ctikzset{tripoles/nfetd/height/.initial=1.1} \ctikzset{tripoles/nfetd/base width/.initial=.5} \ctikzset{tripoles/nfetd/gate width/.initial=.62} \ctikzset{tripoles/nfetd/bodydiode scale/.initial=.3} \ctikzset{tripoles/nfetd/bodydiode distance/.initial=.3} \ctikzset{tripoles/nfetd/bodydiode conn/.initial=.6} \ctikzset{tripoles/nfetd/curr direction/.initial=1} \ctikzset{tripoles/pfetd/width/.initial=.7} \ctikzset{tripoles/pfetd/gate height/.initial=.35} \ctikzset{tripoles/pfetd/base height/.initial=.5} \ctikzset{tripoles/pfetd/conn height/.initial=0} \ctikzset{tripoles/pfetd/height/.initial=1.1} \ctikzset{tripoles/pfetd/base width/.initial=.5} \ctikzset{tripoles/pfetd/gate width/.initial=.62} \ctikzset{tripoles/pfetd/bodydiode scale/.initial=.3} \ctikzset{tripoles/pfetd/bodydiode distance/.initial=.3} \ctikzset{tripoles/pfetd/bodydiode conn/.initial=.6} \ctikzset{tripoles/pfetd/curr direction/.initial=-1} \ctikzset{tripoles/nigfete/width/.initial=.7} \ctikzset{tripoles/nigfete/gate height/.initial=.35} \ctikzset{tripoles/nigfete/base height/.initial=.5} \ctikzset{tripoles/nigfete/conn height/.initial=.35} \ctikzset{tripoles/nigfete/height/.initial=1.1} \ctikzset{tripoles/nigfete/base width/.initial=.5} \ctikzset{tripoles/nigfete/gate width/.initial=.62} \ctikzset{tripoles/nigfete/bodydiode scale/.initial=.3} \ctikzset{tripoles/nigfete/bodydiode distance/.initial=.3} \ctikzset{tripoles/nigfete/bodydiode conn/.initial=.6} \ctikzset{tripoles/nigfete/curr direction/.initial=1} \ctikzset{tripoles/nigfetd/width/.initial=.7} \ctikzset{tripoles/nigfetd/gate height/.initial=.35} \ctikzset{tripoles/nigfetd/base height/.initial=.5} \ctikzset{tripoles/nigfetd/conn height/.initial=.35} \ctikzset{tripoles/nigfetd/height/.initial=1.1} \ctikzset{tripoles/nigfetd/base width/.initial=.5} \ctikzset{tripoles/nigfetd/gate width/.initial=.62} \ctikzset{tripoles/nigfetd/bodydiode scale/.initial=.3} \ctikzset{tripoles/nigfetd/bodydiode distance/.initial=.3} \ctikzset{tripoles/nigfetd/bodydiode conn/.initial=.6} \ctikzset{tripoles/nigfetd/curr direction/.initial=1} \ctikzset{tripoles/nigfetebulk/width/.initial=.7} \ctikzset{tripoles/nigfetebulk/gate height/.initial=.35} \ctikzset{tripoles/nigfetebulk/base height/.initial=.5} \ctikzset{tripoles/nigfetebulk/conn height/.initial=.35} \ctikzset{tripoles/nigfetebulk/height/.initial=1.1} \ctikzset{tripoles/nigfetebulk/base width/.initial=.5} \ctikzset{tripoles/nigfetebulk/gate width/.initial=.62} \ctikzset{tripoles/nigfetebulk/bodydiode scale/.initial=.3} \ctikzset{tripoles/nigfetebulk/bodydiode distance/.initial=.3} \ctikzset{tripoles/nigfetebulk/bodydiode conn/.initial=.6} \ctikzset{tripoles/nigfetebulk/curr direction/.initial=1} \ctikzset{tripoles/pigfete/width/.initial=.7} \ctikzset{tripoles/pigfete/gate height/.initial=.35} \ctikzset{tripoles/pigfete/base height/.initial=.5} \ctikzset{tripoles/pigfete/conn height/.initial=.35} \ctikzset{tripoles/pigfete/height/.initial=1.1} \ctikzset{tripoles/pigfete/base width/.initial=.5} \ctikzset{tripoles/pigfete/gate width/.initial=.62} \ctikzset{tripoles/pigfete/bodydiode scale/.initial=.3} \ctikzset{tripoles/pigfete/bodydiode distance/.initial=.3} \ctikzset{tripoles/pigfete/bodydiode conn/.initial=.6} \ctikzset{tripoles/pigfete/curr direction/.initial=-1} \ctikzset{tripoles/pigfetd/width/.initial=.7} \ctikzset{tripoles/pigfetd/gate height/.initial=.35} \ctikzset{tripoles/pigfetd/base height/.initial=.5} \ctikzset{tripoles/pigfetd/conn height/.initial=.35} \ctikzset{tripoles/pigfetd/height/.initial=1.1} \ctikzset{tripoles/pigfetd/base width/.initial=.5} \ctikzset{tripoles/pigfetd/gate width/.initial=.62} \ctikzset{tripoles/pigfetd/bodydiode scale/.initial=.3} \ctikzset{tripoles/pigfetd/bodydiode distance/.initial=.3} \ctikzset{tripoles/pigfetd/bodydiode conn/.initial=.6} \ctikzset{tripoles/pigfetd/curr direction/.initial=-1} \ctikzset{tripoles/pigfetebulk/width/.initial=.7} \ctikzset{tripoles/pigfetebulk/gate height/.initial=.35} \ctikzset{tripoles/pigfetebulk/conn height/.initial=.35} \ctikzset{tripoles/pigfetebulk/base height/.initial=.5} \ctikzset{tripoles/pigfetebulk/height/.initial=1.1} \ctikzset{tripoles/pigfetebulk/base width/.initial=.5} \ctikzset{tripoles/pigfetebulk/gate width/.initial=.62} \ctikzset{tripoles/pigfetebulk/bodydiode scale/.initial=.3} \ctikzset{tripoles/pigfetebulk/bodydiode distance/.initial=.3} \ctikzset{tripoles/pigfetebulk/bodydiode conn/.initial=.6} \ctikzset{tripoles/pigfetebulk/curr direction/.initial=-1} \ctikzset{tripoles/npn/width/.initial=.6} \ctikzset{tripoles/npn/base height/.initial=.45} \ctikzset{tripoles/npn/base height 2/.initial=.15} \ctikzset{tripoles/npn/base height/.initial=.4} \ctikzset{tripoles/npn/conn height/.initial=0} \ctikzset{tripoles/npn/height/.initial=1.1} \ctikzset{tripoles/npn/base width/.initial=.5} \ctikzset{tripoles/npn/arrow pos/.initial=.5} \ctikzset{tripoles/npn/bodydiode scale/.initial=.3} \ctikzset{tripoles/npn/bodydiode distance/.initial=.3} \ctikzset{tripoles/npn/bodydiode conn/.initial=.6} \ctikzset{tripoles/npn/curr direction/.initial=1} \ctikzset{tripoles/pnp/width/.initial=.6} \ctikzset{tripoles/pnp/base height/.initial=.45} \ctikzset{tripoles/pnp/base height 2/.initial=.15} \ctikzset{tripoles/pnp/base height/.initial=.4} \ctikzset{tripoles/pnp/conn height/.initial=0} \ctikzset{tripoles/pnp/height/.initial=1.1} \ctikzset{tripoles/pnp/base width/.initial=.5} \ctikzset{tripoles/pnp/arrow pos/.initial=.5} \ctikzset{tripoles/pnp/bodydiode scale/.initial=.3} \ctikzset{tripoles/pnp/bodydiode distance/.initial=.3} \ctikzset{tripoles/pnp/bodydiode conn/.initial=.6} \ctikzset{tripoles/pnp/curr direction/.initial=-1} \ctikzset{tripoles/pigbt/width/.initial=.6} \ctikzset{tripoles/pigbt/gate height/.initial=.45} \ctikzset{tripoles/pigbt/gate height 2/.initial=.15} \ctikzset{tripoles/pigbt/base height/.initial=.4} \ctikzset{tripoles/pigbt/outer base height/.initial=.4} \ctikzset{tripoles/pigbt/outer base thickness/.initial=1} \ctikzset{tripoles/pigbt/conn height/.initial=0} \ctikzset{tripoles/pigbt/height/.initial=1.1} \ctikzset{tripoles/pigbt/gate width/.initial=.62} \ctikzset{tripoles/pigbt/base width/.initial=.5} \ctikzset{tripoles/pigbt/bodydiode scale/.initial=.3} \ctikzset{tripoles/pigbt/bodydiode distance/.initial=.3} \ctikzset{tripoles/pigbt/bodydiode conn/.initial=.6} \ctikzset{tripoles/pigbt/curr direction/.initial=-1} \ctikzset{tripoles/nigbt/width/.initial=.6} \ctikzset{tripoles/nigbt/gate height/.initial=.45} \ctikzset{tripoles/nigbt/gate height 2/.initial=.15} \ctikzset{tripoles/nigbt/base height/.initial=.4} \ctikzset{tripoles/nigbt/outer base height/.initial=.4} \ctikzset{tripoles/nigbt/outer base thickness/.initial=1} \ctikzset{tripoles/nigbt/conn height/.initial=0} \ctikzset{tripoles/nigbt/height/.initial=1.1} \ctikzset{tripoles/nigbt/gate width/.initial=.62} \ctikzset{tripoles/nigbt/base width/.initial=.5} \ctikzset{tripoles/nigbt/bodydiode scale/.initial=.3} \ctikzset{tripoles/nigbt/bodydiode distance/.initial=.3} \ctikzset{tripoles/nigbt/bodydiode conn/.initial=.6} \ctikzset{tripoles/nigbt/curr direction/.initial=1} \ctikzset{tripoles/Lpigbt/width/.initial=.6} \ctikzset{tripoles/Lpigbt/gate height/.initial=.45} \ctikzset{tripoles/Lpigbt/gate height 2/.initial=.15} \ctikzset{tripoles/Lpigbt/base height/.initial=.4} \ctikzset{tripoles/Lpigbt/outer base height/.initial=.4} \ctikzset{tripoles/Lpigbt/outer base thickness/.initial=1} \ctikzset{tripoles/Lpigbt/conn height/.initial=.4} \ctikzset{tripoles/Lpigbt/height/.initial=1.1} \ctikzset{tripoles/Lpigbt/gate width/.initial=.62} \ctikzset{tripoles/Lpigbt/base width/.initial=.5} \ctikzset{tripoles/Lpigbt/bodydiode scale/.initial=.3} \ctikzset{tripoles/Lpigbt/bodydiode distance/.initial=.3} \ctikzset{tripoles/Lpigbt/bodydiode conn/.initial=.6} \ctikzset{tripoles/Lpigbt/curr direction/.initial=-1} \ctikzset{tripoles/Lnigbt/width/.initial=.6} \ctikzset{tripoles/Lnigbt/gate height/.initial=.45} \ctikzset{tripoles/Lnigbt/gate height 2/.initial=.15} \ctikzset{tripoles/Lnigbt/base height/.initial=.4} \ctikzset{tripoles/Lnigbt/outer base height/.initial=.4} \ctikzset{tripoles/Lnigbt/outer base thickness/.initial=1} \ctikzset{tripoles/Lnigbt/conn height/.initial=.4} \ctikzset{tripoles/Lnigbt/height/.initial=1.1} \ctikzset{tripoles/Lnigbt/gate width/.initial=.62} \ctikzset{tripoles/Lnigbt/base width/.initial=.5} \ctikzset{tripoles/Lnigbt/bodydiode scale/.initial=.3} \ctikzset{tripoles/Lnigbt/bodydiode distance/.initial=.3} \ctikzset{tripoles/Lnigbt/bodydiode conn/.initial=.6} \ctikzset{tripoles/Lnigbt/curr direction/.initial=1} \ctikzset{tripoles/igbt/outer base height/.code={ \ctikzset{tripoles/nigbt/outer base height/.initial=#1} \ctikzset{tripoles/pigbt/outer base height/.initial=#1} \ctikzset{tripoles/Lnigbt/outer base height/.initial=#1} \ctikzset{tripoles/Lpigbt/outer base height/.initial=#1} \ctikzset{tripoles/Lnigbt/conn height/.initial=#1} \ctikzset{tripoles/Lpigbt/conn height/.initial=#1} }} \ctikzset{tripoles/igbt/outer base thickness/.code={ \ctikzset{tripoles/nigbt/outer base thickness=#1} \ctikzset{tripoles/pigbt/outer base thickness=#1} \ctikzset{tripoles/Lnigbt/outer base thickness=#1} \ctikzset{tripoles/Lpigbt/outer base thickness=#1} }} \ctikzset{tripoles/njfet/width/.initial=.7} \ctikzset{tripoles/njfet/gate height/.initial=.5} \ctikzset{tripoles/njfet/gate height 2/.initial=.35} \ctikzset{tripoles/njfet/gate width/.initial=.5} \ctikzset{tripoles/njfet/base width/.initial=.5} \ctikzset{tripoles/njfet/conn height/.initial=.35}% at the exterior \ctikzset{tripoles/njfet/union height/.initial=.35}% at the gate \ctikzset{tripoles/njfet/conn kink/.initial=1}% 1=no kink \ctikzset{tripoles/njfet/height/.initial=1.1} \ctikzset{tripoles/njfet/bodydiode scale/.initial=.3} \ctikzset{tripoles/njfet/bodydiode distance/.initial=.3} \ctikzset{tripoles/njfet/bodydiode conn/.initial=.6} \ctikzset{tripoles/njfet/curr direction/.initial=1} \ctikzset{tripoles/pjfet/width/.initial=.7} \ctikzset{tripoles/pjfet/gate height/.initial=.5} \ctikzset{tripoles/pjfet/gate height 2/.initial=.35} \ctikzset{tripoles/pjfet/gate width/.initial=.5} \ctikzset{tripoles/pjfet/base width/.initial=.5} \ctikzset{tripoles/pjfet/conn height/.initial=.35} \ctikzset{tripoles/pjfet/union height/.initial=.35}% at the gate \ctikzset{tripoles/pjfet/conn kink/.initial=1}% 1=no kink \ctikzset{tripoles/pjfet/height/.initial=1.1} \ctikzset{tripoles/pjfet/bodydiode scale/.initial=.3} \ctikzset{tripoles/pjfet/bodydiode distance/.initial=.3} \ctikzset{tripoles/pjfet/bodydiode conn/.initial=.6} \ctikzset{tripoles/pjfet/curr direction/.initial=-1} \ctikzset{tripoles/nujt/width/.initial=.7} \ctikzset{tripoles/nujt/gate height/.initial=.5} \ctikzset{tripoles/nujt/gate height 2/.initial=.35} \ctikzset{tripoles/nujt/gate width/.initial=.5} \ctikzset{tripoles/nujt/base width/.initial=.5} \ctikzset{tripoles/nujt/conn height/.initial=.35} \ctikzset{tripoles/nujt/union height/.initial=0}% at the gate \ctikzset{tripoles/nujt/conn kink/.initial=.82}% to match the circle position \ctikzset{tripoles/nujt/height/.initial=1.1} \ctikzset{tripoles/nujt/bodydiode scale/.initial=.3} \ctikzset{tripoles/nujt/bodydiode distance/.initial=.3} \ctikzset{tripoles/nujt/bodydiode conn/.initial=.6} \ctikzset{tripoles/nujt/curr direction/.initial=1} \ctikzset{tripoles/pujt/width/.initial=.7} \ctikzset{tripoles/pujt/gate height/.initial=.5} \ctikzset{tripoles/pujt/gate height 2/.initial=.35} \ctikzset{tripoles/pujt/gate width/.initial=.5} \ctikzset{tripoles/pujt/base width/.initial=.5} \ctikzset{tripoles/pujt/conn height/.initial=.35} \ctikzset{tripoles/pujt/union height/.initial=0}% at the gate \ctikzset{tripoles/pujt/conn kink/.initial=.82}% to match the circle position \ctikzset{tripoles/pujt/height/.initial=1.1} \ctikzset{tripoles/pujt/bodydiode scale/.initial=.3} \ctikzset{tripoles/pujt/bodydiode distance/.initial=.3} \ctikzset{tripoles/pujt/bodydiode conn/.initial=.6} \ctikzset{tripoles/pujt/curr direction/.initial=-1} \ctikzset{tripoles/isfet/width/.initial=1} \ctikzset{tripoles/isfet/gate height/.initial=.35} \ctikzset{tripoles/isfet/base height/.initial=.5} \ctikzset{tripoles/isfet/height/.initial=1.1} \ctikzset{tripoles/isfet/base width/.initial=.3} \ctikzset{tripoles/isfet/gate width/.initial=.5} \ctikzset{tripoles/isfet/conn height/.initial=0} \ctikzset{tripoles/isfet/wave width/.initial=.16} \ctikzset{tripoles/isfet/wave amp/.initial=.06} \ctikzset{tripoles/isfet/waves y sep/.initial=.22} \ctikzset{tripoles/isfet/waves x sep/.initial=.8} \ctikzset{tripoles/isfet/bodydiode scale/.initial=.3} \ctikzset{tripoles/isfet/bodydiode distance/.initial=.3} \ctikzset{tripoles/isfet/bodydiode conn/.initial=.6} \ctikzset{tripoles/isfet/curr direction/.initial=1} % % graphene FET % \ctikzset{tripoles/pgfet/width/.initial=.6} \ctikzset{tripoles/pgfet/gate height/.initial=.5} \ctikzset{tripoles/pgfet/gate height 2/.initial=0.25} % must be "gate height"/2 \ctikzset{tripoles/pgfet/base height/.initial=.5} % must be "gate height" \ctikzset{tripoles/pgfet/outer base height/.initial=.25} % must be "gate height 2" \ctikzset{tripoles/pgfet/outer base thickness/.initial=1} \ctikzset{tripoles/pgfet/conn height/.initial=0} \ctikzset{tripoles/pgfet/height/.initial=1.1} \ctikzset{tripoles/pgfet/gate width/.initial=.5} \ctikzset{tripoles/pgfet/base width/.initial=0.36084} % must be "gate height"*cos(60)/(2*width) \ctikzset{tripoles/pgfet/bodydiode scale/.initial=.3} \ctikzset{tripoles/pgfet/bodydiode distance/.initial=.6} \ctikzset{tripoles/pgfet/bodydiode conn/.initial=.6} \ctikzset{tripoles/pgfet/curr direction/.initial=-1} \ctikzset{tripoles/ngfet/width/.initial=.6} \ctikzset{tripoles/ngfet/gate height/.initial=.5} \ctikzset{tripoles/ngfet/gate height 2/.initial=0.25} % must be "gate height"/2 \ctikzset{tripoles/ngfet/base height/.initial=.5} % must be "gate height" \ctikzset{tripoles/ngfet/outer base height/.initial=.25} % must be "gate height 2" \ctikzset{tripoles/ngfet/outer base thickness/.initial=1} \ctikzset{tripoles/ngfet/conn height/.initial=0} \ctikzset{tripoles/ngfet/height/.initial=1.1} \ctikzset{tripoles/ngfet/gate width/.initial=.5} \ctikzset{tripoles/ngfet/base width/.initial=0.36084} % must be "gate height"*cos(60)/(2*width) \ctikzset{tripoles/ngfet/bodydiode scale/.initial=.3} \ctikzset{tripoles/ngfet/bodydiode distance/.initial=.6} \ctikzset{tripoles/ngfet/bodydiode conn/.initial=.6} \ctikzset{tripoles/ngfet/curr direction/.initial=1} % % multi-emitter and multi-collector BJTs by Romano Giannetti % \ctikzset{tripoles/bjt/emitters/.initial=1} \ctikzset{tripoles/bjt/collectors/.initial=1} \pgfkeys{/tikz/emitters/.add code={}{\ctikzset{tripoles/bjt/emitters=#1}}} \pgfkeys{/tikz/collectors/.add code={}{\ctikzset{tripoles/bjt/collectors=#1}}} \ctikzset{tripoles/bjt/pins width/.initial=0.3} \pgfkeys{/tikz/bjt pins width/.add code={}{\ctikzset{tripoles/bjt/pins width=#1}}} \ctikzset{tripoles/bjt/multi height/.initial=.5} \pgfkeys{/tikz/bjt multi height/.add code={}{\ctikzset{tripoles/bjt/multi height/.initial=#1}}} % \ctikzset{tripoles/bjt/width/.initial=.3} \ctikzset{tripoles/bjt/base height 2/.initial=.4} \ctikzset{tripoles/bjt/base height/.initial=1.1} \ctikzset{tripoles/bjt/height/.initial=.4} \ctikzset{tripoles/bjt/base width/.initial=1} \ctikzset{tripoles/bjt/arrow pos/.initial=.5} % do NOT touch these two! \ctikzset{tripoles/bjt/npn/curr direction/.initial=1} \ctikzset{tripoles/bjt/pnp/curr direction/.initial=-1} % % definitions for transistor circles % \ctikzset{transistor circle/.is family} \ctikzset{transistor circle/relative thickness/.initial=1} \ctikzset{transistor circle/color/.initial=default} \ctikzset{transistor circle/dash/.initial=none} \ctikzset{transistor circle/scale circle radius/.initial=1} \ctikzset{transistor circle/default base in/.initial=0.9} \ctikzset{transistor circle/njfet base in/.initial=1.05} \ctikzset{transistor circle/pjfet base in/.initial=1.05} \ctikzset{transistor circle/isfet base in/.initial=0.65} \newif\ifpgf@circ@trcircle\pgf@circ@trcirclefalse \ctikzset{tr circle/.is if=pgf@circ@trcircle} \tikzset{tr circle/.is if=pgf@circ@trcircle} %%>>> %% definitions of transistor shapes%<<< % % add a circle to the transistor: % \def\pgfcirc@transistorcircle{ \ifpgf@circ@trcircle \pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfsetlinewidth{\ctikzvalof{transistor circle/relative thickness}\pgflinewidth} \edef\@@none{none}\edef\@@default{default} \edef\@@tmp{\ctikzvalof{transistor circle/color}} \ifx\@@tmp\@@default\else \pgfsetcolor{\@@tmp} \fi \edef\@@tmp{\ctikzvalof{transistor circle/dash}} \ifx\@@tmp\@@none\else \expandafter\pgfsetdash\expandafter{\@@tmp}{0cm} \fi % radius of the circle % \pgfmathsetlength{\pgf@circ@res@temp}{((#2+\extrabodydiodelen)-(#1)+(#3)*(#3)/((#2+\extrabodydiodelen)-(#1)))/2} % \pgfpathcircle{\pgfpoint{#1+\pgf@circ@res@temp}{0pt}}{\pgf@circ@res@temp} \pgfpathcircle{\pgfpoint{\circleleft+\circleradius}{0pt}}{\circleradius} \pgf@circ@draworfill \endpgfscope \fi } % add a ferroelectric squish to transistors \def\pgfcirc@ferroelectric#1#2{% #1 -> transistor type, #2 horizontal enlargment (prop to ...@left), \ifpgf@circuit@tr@ferroel\pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgf@circ@set@relative@thickness{modifier thickness} % base-gate center and width of the sigmoid \pgfmathsetlength{\pgf@circ@res@other} {0.5*(\ctikzvalof{tripoles/#1/gate width}+\ctikzvalof{tripoles/#1/base width}-(#2))*\pgf@circ@res@left} \pgfmathsetlength{\pgf@circ@res@temp} {1.2*abs(\ctikzvalof{tripoles/#1/gate width}-\ctikzvalof{tripoles/#1/base width}+0.5*(#2))*\pgf@circ@res@left} \pgfsetcornersarced{\pgfpoint{-0.2\pgf@circ@res@temp}{-0.2\pgf@circ@res@temp}} \pgfpathmoveto{\pgfpoint {\pgf@circ@res@other+\pgf@circ@res@temp} {1.1*\ctikzvalof{tripoles/#1/base height}*\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\pgf@circ@res@other+\pgf@circ@res@temp} {0.5*\ctikzvalof{tripoles/#1/base height}*\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\pgf@circ@res@other-\pgf@circ@res@temp} {0.5*\ctikzvalof{tripoles/#1/base height}*\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint {\pgf@circ@res@other-\pgf@circ@res@temp} {1.1*\ctikzvalof{tripoles/#1/base height}*\pgf@circ@res@down}} \pgfusepath{draw} \endpgfscope\fi } \ctikzset{tr gap fill/.initial=none} \tikzset{tr gap fill/.style={\circuitikzbasekey/tr gap fill={#1}}} % fill the gap in relevant transistors \def\pgfcirc@fillgategap#1{% #1 transistor type \edef\@@@none{none}\edef\@@@color{\ctikzvalof{tr gap fill}}% always exists \ifx\@@@none\@@@color\relax\else \begingroup % save the value of @res: other, step, temp \edef\@@@doit{1}% draw it, set to zero if we give up % ok, we have the color here. we have to get center position, with and height % normally is gate height; but in igbt is outer base height (grrrr) \pgfkeysifdefined{\circuitikzbasekey/tripoles/#1/outer base height}{ % yes, it's an IGBT \pgfmathsetlength{\pgf@circ@res@other}{\ctikzvalof{tripoles/#1/outer base height}*\pgf@circ@res@up} }{ %no. Let's try with gate height \pgfkeysifdefined{\circuitikzbasekey/tripoles/#1/gate height}{ % yes, go for it \pgfmathsetlength{\pgf@circ@res@other}{\ctikzvalof{tripoles/#1/gate height}*\pgf@circ@res@up} }{ %no, give up, let value to 0 \edef\@@@doit{0} } } % now we have to find x1 and x2: these are base width and gate width % if do not have one of that, bail out. \pgfkeysifdefined{\circuitikzbasekey/tripoles/#1/gate width}{ \pgfmathsetlength{\pgf@circ@res@temp}{\ctikzvalof{tripoles/#1/gate width}*\pgf@circ@res@left} }{ \edef\@@@doit{0} } \pgfkeysifdefined{\circuitikzbasekey/tripoles/#1/base width}{ \pgfmathsetlength{\pgf@circ@res@step}{\ctikzvalof{tripoles/#1/base width}*\pgf@circ@res@left} }{ \edef\@@@doit{0} } % if found, draw it. \ifnum\@@@doit>0\relax \pgfscope \pgfsetfillcolor{\@@@color} \pgfsetcolor{\@@@color} \pgfpathrectanglecorners{\pgfpoint{\pgf@circ@res@temp}{\pgf@circ@res@other}}{\pgfpoint{\pgf@circ@res@step}{-\pgf@circ@res@other}} \pgfusepath{fill, draw} \endpgfscope \fi \endgroup \fi } \long\def\pgfcircdeclaretransistor#1#2#3{ \pgfdeclareshape{#1} { \savedmacro{\ctikzclass}{\edef\ctikzclass{transistors}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \savedmacro{\circlebase}{ \pgfkeysifdefined{\circuitikzbasekey/transistor circle/#1 base in}% {% yes, we have it \edef\circlebase{\ctikzvalof{transistor circle/#1 base in}}% }{% no, use default \edef\circlebase{\ctikzvalof{transistor circle/default base in}} }} % \savedmacro{\thistypeoftr}{\edef\thistypeoftr{#1}} \saveddimen{\extrabodydiodelen}{ \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \ifpgf@circuit@fet@bodydiode % try to put the text to the right of the flyback diode \pgfmathsetlength{\pgf@x}{( \ctikzvalof{tripoles/#1/bodydiode distance}* \ctikzvalof{tripoles/#1/width} + \ctikzvalof{tripoles/#1/bodydiode scale}* \ctikzvalof{bipoles/diode/height}/2 )*\pgf@circ@scaled@Rlen} \else \pgf@x=0pt\relax \fi } \savedmacro{\scalecircleradius}{ \edef\scalecircleradius{\ctikzvalof{transistor circle/scale circle radius}} } \saveddimen{\circleradius}{ \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} % repeat the extrabodydiodelen (grrr) \ifpgf@circuit@fet@bodydiode % try to put the text to the right of the flyback diode \pgfmathsetlength{\pgf@circ@res@other}{( \ctikzvalof{tripoles/#1/bodydiode distance}* \ctikzvalof{tripoles/#1/width} + \ctikzvalof{tripoles/#1/bodydiode scale}* \ctikzvalof{bipoles/diode/height}/2 )*\pgf@circ@scaled@Rlen} \else \pgf@circ@res@other=0pt\relax \fi % left \pgf@xa=-\ctikzvalof{tripoles/#1/width}\pgf@circ@scaled@Rlen \pgf@xa=\circlebase\pgf@xa % this is the base point of the circle % northeast \pgf@yb=\ctikzvalof{tripoles/#1/height}\pgf@circ@scaled@Rlen % y of the left point of circle \pgf@yb=.5\pgf@yb \pgf@xb=\pgf@circ@res@other % this is the x of the right points of the circle % \pgf@yb=\ctikzvalof{tripoles/#1/bodydiode conn}\pgf@yb %this is #3 of the circle % find the radius of the circle \pgfmathsetlength{\pgf@x}{((\pgf@xb)-(\pgf@xa)+(\pgf@yb)*(\pgf@yb)/((\pgf@xb)-(\pgf@xa)))/2*\scalecircleradius} } \saveddimen{\circleleft}{ \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@xa=-\ctikzvalof{tripoles/#1/width}\pgf@circ@scaled@Rlen \pgf@x=\circlebase\pgf@xa } \anchor{circle center}{ \pgf@y=0pt\pgf@x=\circleleft\advance\pgf@x by\circleradius } \savedanchor{\centergap}{% this is the center position between gate and base % get "left" \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@xa=-\ctikzvalof{tripoles/#1/width}\pgf@circ@scaled@Rlen \pgfkeysifdefined{\circuitikzbasekey/tripoles/#1/gate width}{ % yes, we have a separated gate \pgfmathsetlength{\pgf@x} {0.5*(\ctikzvalof{tripoles/#1/gate width}+\ctikzvalof{tripoles/#1/base width})*\pgf@xa} }{ % no, use just the base \pgfmathsetlength{\pgf@x} {\ctikzvalof{tripoles/#1/base width}*\pgf@xa} } \pgf@y=0pt\relax } \anchor{centergap}{\centergap} \anchor{center}{ \pgfpointorigin } \savedanchor\northeast{% upper right \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/#1/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=0pt } \savedanchor\left{%center left \pgf@y=0pt \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@x=-\ctikzvalof{tripoles/#1/width}\pgf@circ@scaled@Rlen } \savedanchor\right{ \pgf@x=0pt\pgf@y=0pt \ifpgf@circ@trcircle % repeat the \circleradius computation (GRRRR) \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} % repeat the extrabodydiodelen (grrr) \ifpgf@circuit@fet@bodydiode % try to put the text to the right of the flyback diode \pgfmathsetlength{\pgf@circ@res@other}{( \ctikzvalof{tripoles/#1/bodydiode distance}* \ctikzvalof{tripoles/#1/width} + \ctikzvalof{tripoles/#1/bodydiode scale}* \ctikzvalof{bipoles/diode/height}/2 )*\pgf@circ@scaled@Rlen} \else \pgf@circ@res@other=0pt\relax \fi % left \pgf@xa=-\ctikzvalof{tripoles/#1/width}\pgf@circ@scaled@Rlen \pgf@xa=\circlebase\pgf@xa % this is the base point of the circle % northeast \pgf@yb=\ctikzvalof{tripoles/#1/height}\pgf@circ@scaled@Rlen % y of the left point of circle \pgf@yb=.5\pgf@yb \pgf@xb=\pgf@circ@res@other % this is the x of the right points of the circle % \pgf@yb=\ctikzvalof{tripoles/#1/bodydiode conn}\pgf@yb %this is #3 of the circle % find the radius of the circle \pgfmathsetlength{\pgf@circ@res@other}{((\pgf@xb)-(\pgf@xa)+(\pgf@yb)*(\pgf@yb)/((\pgf@xb)-(\pgf@xa)))/2*\scalecircleradius} % repeat the circleleft computation \pgf@xa=-\ctikzvalof{tripoles/#1/width}\pgf@circ@scaled@Rlen \pgf@xb=\circlebase\pgf@xa \pgfmathsetlength{\pgf@x}{\pgf@xb+2*\pgf@circ@res@other} \fi } \anchor{text}{ \northeast \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \ifpgf@circuit@transisors@fixlabels \ifpgf@circuit@fet@bodydiode \advance \pgf@x by \extrabodydiodelen \fi \ifpgf@circ@trcircle \left\pgf@xa=\pgf@x \pgfmathsetlength{\pgf@x}{\circleleft+2*\circleradius} % \advance \pgf@x by \circleradius \fi % add a bit of space to avoid central (substrate) terminal if drawn \advance\pgf@x by 0.05\pgf@circ@scaled@Rlen\relax \pgf@y=\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox\relax \else \pgf@y=.7\pgf@y \pgf@x= \pgf@circ@scaled@Rlen \pgf@x=0.1\pgf@x \fi } \anchor{pathstart}{ % south \northeast \pgf@y=-\pgf@y } \anchor{pathend}{ \northeast } \anchor{north}{ \northeast \pgf@circ@res@step=\pgf@y \left \pgf@y=\pgf@circ@res@step \pgf@x=.5\pgf@x } \anchor{west}{ \left } \anchor{left}{ \left } \anchor{east}{ \northeast \pgf@y=0pt } \anchor{right}{ \right } \anchor{south}{ \northeast \pgf@circ@res@step=\pgf@y \left \pgf@y=-\pgf@circ@res@step \pgf@x=.5\pgf@x } \anchor{south west}{ \northeast \pgf@circ@res@step=\pgf@y \left \pgf@y=-\pgf@circ@res@step } \anchor{north east}{ \northeast } \anchor{north west}{ \northeast \pgf@circ@res@step=\pgf@y \left \pgf@y=\pgf@circ@res@step } \anchor{south east}{ \northeast \pgf@y=-\pgf@y } \anchor{B}{ \northeast \pgf@circ@res@step=\ctikzvalof{tripoles/#1/conn height}\pgf@y \left \pgf@y=-\ctikzvalof{tripoles/#1/curr direction}\pgf@circ@res@step } \anchor{base}{ \northeast \pgf@circ@res@step=\ctikzvalof{tripoles/#1/conn height}\pgf@y \left \pgf@y=-\ctikzvalof{tripoles/#1/curr direction}\pgf@circ@res@step } \anchor{bulk}{ %added by Burak Kelleci \northeast \pgf@circ@res@step=\ctikzvalof{tripoles/#1/conn height}\pgf@y \right \pgf@y=-\ctikzvalof{tripoles/#1/curr direction}\pgf@circ@res@step } \anchor{nobulk}{ %added by Burak Kelleci \left \pgf@x=\ctikzvalof{tripoles/#1/base width}\pgf@x } \anchor{G}{ \northeast \pgf@circ@res@step=\ctikzvalof{tripoles/#1/conn height}\pgf@y \left \pgf@y=-\ctikzvalof{tripoles/#1/curr direction}\pgf@circ@res@step } \anchor{gate}{ \northeast \pgf@circ@res@step=\ctikzvalof{tripoles/#1/conn height}\pgf@y \left \pgf@y=-\ctikzvalof{tripoles/#1/curr direction}\pgf@circ@res@step } \anchor{nobase}{ \left \pgf@x=\ctikzvalof{tripoles/#1/base width}\pgf@x } \anchor{circle base}{ \left \pgf@x=\circlebase\pgf@x } \anchor{nogate}{ \left \pgf@x=\ctikzvalof{tripoles/#1/gate width}\pgf@x } \anchor{E}{ \northeast \pgf@y=-\ctikzvalof{tripoles/#1/curr direction}\pgf@y } \anchor{emitter}{ \northeast \pgf@y=-\ctikzvalof{tripoles/#1/curr direction}\pgf@y } \anchor{C}{ \northeast \pgf@y=\ctikzvalof{tripoles/#1/curr direction}\pgf@y } \anchor{collector}{ \northeast \pgf@y=\ctikzvalof{tripoles/#1/curr direction}\pgf@y } \anchor{S}{ \northeast \pgf@y=-\ctikzvalof{tripoles/#1/curr direction}\pgf@y } \anchor{source}{ \northeast \pgf@y=-\ctikzvalof{tripoles/#1/curr direction}\pgf@y } \anchor{D}{ \northeast \pgf@y=\ctikzvalof{tripoles/#1/curr direction}\pgf@y } \anchor{drain}{ \northeast \pgf@y=\ctikzvalof{tripoles/#1/curr direction}\pgf@y } \anchor{body C in}{ \northeast \pgf@y=\ctikzvalof{tripoles/#1/curr direction}\pgf@y \pgf@y=\ctikzvalof{tripoles/#1/bodydiode conn}\pgf@y } \anchor{circle C}{ \left \pgf@xa=\circlebase\pgf@x % this is #1 of the circle \northeast \pgf@xb=\pgf@x %this is #2 of the circle \pgf@yb=\ctikzvalof{tripoles/#1/bodydiode conn}\pgf@y %this is #3 of the circle % the base of the triangle is x_2 - x_1 - r \pgfmathsetlength{\pgf@circ@res@other}{\pgf@xb-\pgf@xa-\circleradius} % so let's go with the height \pgfmathsetlength{\pgf@ya}{sqrt(abs(\circleradius*\circleradius-\pgf@circ@res@other*\pgf@circ@res@other))} % finally, direction \pgf@y=\ctikzvalof{tripoles/#1/curr direction}\pgf@ya } \anchor{circle E}{ \left \pgf@xa=\circlebase\pgf@x % this is #1 of the circle \northeast \pgf@xb=\pgf@x %this is #2 of the circle \pgf@yb=\ctikzvalof{tripoles/#1/bodydiode conn}\pgf@y %this is #3 of the circle % the base of the triangle is x_2 - x_1 - r \pgfmathsetlength{\pgf@circ@res@other}{\pgf@xb-\pgf@xa-\circleradius} % so let's go with the height \pgfmathsetlength{\pgf@ya}{sqrt(abs(\circleradius*\circleradius-\pgf@circ@res@other*\pgf@circ@res@other))} % finally, direction % finally, direction \pgf@y=-\ctikzvalof{tripoles/#1/curr direction}\pgf@ya } \anchor{body E in}{ \northeast \pgf@y=-\ctikzvalof{tripoles/#1/curr direction}\pgf@y \pgf@y=\ctikzvalof{tripoles/#1/bodydiode conn}\pgf@y } \anchor{body C out}{ \northeast \pgf@ya=\ctikzvalof{tripoles/#1/curr direction}\pgf@y \pgf@ya=\ctikzvalof{tripoles/#1/bodydiode conn}\pgf@ya \pgf@y=\pgf@ya \left \pgf@x=-\ctikzvalof{tripoles/#1/bodydiode distance}\pgf@x \pgf@y=\pgf@ya } \anchor{body E out}{ \northeast \pgf@ya=-\ctikzvalof{tripoles/#1/curr direction}\pgf@y \pgf@ya=\ctikzvalof{tripoles/#1/bodydiode conn}\pgf@ya \pgf@y=\pgf@ya \left \pgf@x=-\ctikzvalof{tripoles/#1/bodydiode distance}\pgf@x \pgf@y=\pgf@ya } #2 \backgroundpath{ \pgftransformationadjustments \pgfsetcolor{\ctikzvalof{color}} % \ifnum \ctikzvalof{tripoles/#1/curr direction} > 0 \pgf@circuit@trans@ntypetrue \else \pgf@circuit@trans@ntypefalse \fi \northeast \pgf@circ@res@up = \pgf@y \pgf@circ@res@down = -\pgf@y \pgf@circ@res@right = \pgf@x \left \pgf@circ@res@left = \pgf@x \pgf@circ@scaled@Rlen=\scaledRlen % #3 % BODY DIODE \ifpgf@circuit@fet@bodydiode \drawbodydiode{#1} \fi % } } } \long\def\drawbodydiode#1{ \pgfscope \pgftransformshift{\pgfpoint{-\ctikzvalof{tripoles/#1/bodydiode distance}\pgf@circ@res@left}{\pgf@circ@res@up+\pgf@circ@res@down}} \pgftransformrotate{90} % diode scale and bodydiode scale interacts. We want the size of the diode % proportional to the transistor, so we will: % 1) undo diode scale 2) apply transistor scale (using the current class) 3) apply bodydiode scale \pgfmathsetmacro{\@@BDscale}{\ctikzvalof{tripoles/#1/bodydiode scale}* \ctikzvalof{\ctikzclass/scale}/\ctikzvalof{diodes/scale}} \pgftransformscale{\@@BDscale} \ifpgf@circuit@fulldiode \pgfnode{fulldiodeshape}{center}{}{pgf@bodydiode}{\pgfusepath{fill}} \else \pgfnode{emptydiodeshape}{center}{}{pgf@bodydiode}{\pgfusepath{fill}} \fi \endpgfscope % Draw stroke line \ifpgf@circuit@strokediode \pgfpathmoveto{\pgfpointanchor{pgf@bodydiode}{west}} \pgfpathlineto{\pgfpointanchor{pgf@bodydiode}{east}} \pgfusepath{stroke} \fi %Draw upper connection to body diode \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/#1/bodydiode conn}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{-\ctikzvalof{tripoles/#1/bodydiode distance}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/bodydiode conn}\pgf@circ@res@up}} \pgfpathlineto{\pgfpointanchor{pgf@bodydiode}{east}} \pgfusepath{draw} \pgfscope \pgftransformshift{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/#1/bodydiode conn}\pgf@circ@res@up}} \pgftransformscale{0.5} \pgfnode{circ}{center}{}{}{\pgfusepath{fill}} \endpgfscope{} %Draw lower connection to body diode \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/#1/bodydiode conn}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{-\ctikzvalof{tripoles/#1/bodydiode distance}\pgf@circ@res@left}{\ctikzvalof{tripoles/#1/bodydiode conn}\pgf@circ@res@down}} \pgfpathlineto{\pgfpointanchor{pgf@bodydiode}{west}} \pgfusepath{draw} \pgfscope \pgftransformshift{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/#1/bodydiode conn}\pgf@circ@res@down}} \pgftransformscale{0.5} \pgfnode{circ}{center}{}{}{\pgfusepath{fill}} \endpgfscope } \long\def\declarebpt#1{ \pgfcircdeclaretransistor{#1}{ \anchor{inner up}{ \northeast \pgf@y=\ctikzvalof{tripoles/#1/base height}\pgf@y } \anchor{inner down}{ \northeast \pgf@y=-\ctikzvalof{tripoles/#1/base height}\pgf@y } }{ % add the circle if requested (before everything else, so we can fill it) \pgfcirc@transistorcircle \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/base height 2}\pgf@circ@res@up}} \pgfusepath{draw} % drawing base \pgfscope \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@down}} \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \ifpgf@circuit@bpt@schottky % upper \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@up+ \ctikzvalof{tripoles/schottky base size}\pgf@circ@scaled@Rlen}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left+ \ctikzvalof{tripoles/schottky base size}\pgf@circ@scaled@Rlen} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@up+ \ctikzvalof{tripoles/schottky base size}\pgf@circ@scaled@Rlen}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left+ \ctikzvalof{tripoles/schottky base size}\pgf@circ@scaled@Rlen} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@up}} % % lower \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@down- \ctikzvalof{tripoles/schottky base size}\pgf@circ@scaled@Rlen}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left- \ctikzvalof{tripoles/schottky base size}\pgf@circ@scaled@Rlen} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@down- \ctikzvalof{tripoles/schottky base size}\pgf@circ@scaled@Rlen}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left- \ctikzvalof{tripoles/schottky base size}\pgf@circ@scaled@Rlen} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@down}} \fi \pgfusepath{draw} \endpgfscope \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/base height 2}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down-\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfusepath{draw} %draw arrow depending on type of transistor \pgfscope \pgfslopedattimetrue \pgfallowupsidedownattimetrue \pgfresetnontranslationattimefalse \edef\@@anchor{center} \ifpgf@circuit@trans@ntype \ifpgf@circuit@trans@arrowatend \edef\@@anchor{btip} \pgftransformlineattime{1.0}{% \pgfpoint% {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left}% {\ctikzvalof{tripoles/#1/base height 2}\pgf@circ@res@down}% }{% \pgfpoint{\pgf@circ@res@right}% {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@down}% } \else \pgftransformlineattime{\ctikzvalof{tripoles/#1/arrow pos}}{% \pgfpoint% {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left}% {\ctikzvalof{tripoles/#1/base height 2}\pgf@circ@res@down}% }{% \pgfpoint{\pgf@circ@res@right}% {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@down}% } \fi \else % p-type \ifpgf@circuit@trans@arrowatend \edef\@@anchor{tip} \pgftransformlineattime{1.0}{% \pgfpoint{\pgf@circ@res@right}% {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@up}% }{% \pgfpoint{\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left}% {\ctikzvalof{tripoles/#1/base height 2}\pgf@circ@res@up}% } \else \pgftransformlineattime{\ctikzvalof{tripoles/#1/arrow pos}}{% \pgfpoint{\pgf@circ@res@right}% {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@up}% }{% \pgfpoint{\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left}% {\ctikzvalof{tripoles/#1/base height 2}\pgf@circ@res@up}% } \fi \fi \pgfnode{trarrow}{\@@anchor}{}{}{\pgfusepath{stroke}} \endpgfscope \ifpgf@circuit@bpt@drawphoto \pgfscope \pgfsetarrowsstart{latexslim} \pgfpathmoveto{\pgfpointadd{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\pgf@circ@res@up+\pgf@circ@res@down}} {\pgfpoint{0.05\pgf@circ@res@left}{0.1\pgf@circ@res@up}}} \pgfpathlineto{\pgfpointadd{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\pgf@circ@res@up+\pgf@circ@res@down}} {\pgfpoint{0.5\pgf@circ@res@left}{0.3\pgf@circ@res@up}}} \pgfusepath{draw} \pgfpathmoveto{\pgfpointadd{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\pgf@circ@res@up+\pgf@circ@res@down}} {\pgfpoint{0.05\pgf@circ@res@left}{-0.1\pgf@circ@res@up}}} \pgfpathlineto{\pgfpointadd{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\pgf@circ@res@up+\pgf@circ@res@down}} {\pgfpoint{0.5\pgf@circ@res@left}{0.1\pgf@circ@res@up}}} \pgfusepath{draw} \endpgfscope \else \ifpgf@circuit@bpt@drawbase \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\pgf@circ@res@up+\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left-\pgfhorizontaltransformationadjustment*.5*\pgflinewidth}{\pgf@circ@res@up+\pgf@circ@res@down}} \pgfusepath{draw} \fi \fi } } \declarebpt{npn} \declarebpt{pnp} % % multi-emitter and multi-collector BJTs by Romano Giannetti % \def\pgf@circ@bjt@C@anchor#1{% #1: collector number \pgfextractx{\pgf@circ@res@temp}{\basedimension} \pgfextracty{\pgf@circ@res@other}{\basedimension} \ifnum\cdir>0 % NPN, above \pgfpoint{\pgf@circ@res@temp}{% \pgf@circ@res@other+\pgfverticaltransformationadjustment*.5*\pgflinewidth+(#1-1)*\multistep} \else % PNP, below \pgfpoint{\pgf@circ@res@temp}{% -\pgf@circ@res@other-\pgfverticaltransformationadjustment*.5*\pgflinewidth-(#1-1)*\multistep} \fi } \def\pgf@circ@bjt@E@anchor#1{% #1: collector number \pgfextractx{\pgf@circ@res@temp}{\basedimension} \pgfextracty{\pgf@circ@res@other}{\basedimension} \ifnum\cdir<0 % PNP, above \pgfpoint{\pgf@circ@res@temp}{% \pgf@circ@res@other+\pgfverticaltransformationadjustment*.5*\pgflinewidth+(#1-1)*\multistep} \else % PNP, below \pgfpoint{\pgf@circ@res@temp}{% -\pgf@circ@res@other-\pgfverticaltransformationadjustment*.5*\pgflinewidth-(#1-1)*\multistep} \fi } \long\def\declarebjt#1{ \pgfdeclareshape{bjt#1}{ \savedmacro{\ctikzclass}{\edef\ctikzclass{transistors}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} % \cdir is 1 for npn, -1 for pnp \savedmacro{\cdir}{\edef\cdir{\ctikzvalof{tripoles/bjt/#1/curr direction}}} \savedmacro{\numE}{\edef\numE{\ctikzvalof{tripoles/bjt/emitters}}} \savedmacro{\numC}{\edef\numC{\ctikzvalof{tripoles/bjt/collectors}}} % step up or down for the additional C/Es \saveddimen{\multistep}{\pgfmathsetlength{\pgf@x}{% \ctikzvalof{tripoles/bjt/height}*\ctikzvalof{tripoles/bjt/multi height}* \ctikzvalof{\ctikzclass/scale}*\pgf@circ@Rlen}} \saveddimen{\external}{\pgfmathsetlength{\pgf@x}{% \ctikzvalof{tripoles/bjt/pins width}*\ctikzvalof{\ctikzclass/scale}*\pgf@circ@Rlen}} \savedanchor\basedimension{% these are the dimensions if nC=1 y nE=1 \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/bjt/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=\ctikzvalof{tripoles/bjt/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \savedanchor\northeast{% upper right \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgfmathsetlength{\pgf@circ@res@step}{% \ctikzvalof{tripoles/bjt/height}*\ctikzvalof{tripoles/bjt/multi height}* \ctikzvalof{\ctikzclass/scale}*\pgf@circ@Rlen} \ifnum\cdir> 0 \edef\numup{\numC}\edef\numdown{\numE} \else \edef\numup{\numE}\edef\numdown{\numC} \fi \pgfmathsetlength{\pgf@y}{0.5*\ctikzvalof{tripoles/bjt/height}\pgf@circ@scaled@Rlen + (\numup-1)*\pgf@circ@res@step+\pgfverticaltransformationadjustment*.5*\pgflinewidth + \ctikzvalof{tripoles/bjt/pins width}*\ctikzvalof{\ctikzclass/scale}*\pgf@circ@Rlen} \pgf@x=\ctikzvalof{tripoles/bjt/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \savedanchor\southeast{% lower right \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgfmathsetlength{\pgf@circ@res@step}{% \ctikzvalof{tripoles/bjt/height}*\ctikzvalof{tripoles/bjt/multi height}* \ctikzvalof{\ctikzclass/scale}*\pgf@circ@Rlen} \ifnum\cdir> 0 \edef\numup{\numC}\edef\numdown{\numE} \else \edef\numup{\numE}\edef\numdown{\numC} \fi \pgfmathsetlength{\pgf@y}{-0.5*\ctikzvalof{tripoles/bjt/height}\pgf@circ@scaled@Rlen - (\numdown-1)*\pgf@circ@res@step-\pgfverticaltransformationadjustment*.5*\pgflinewidth - \ctikzvalof{tripoles/bjt/pins width}*\ctikzvalof{\ctikzclass/scale}*\pgf@circ@Rlen} \pgf@x=\ctikzvalof{tripoles/bjt/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \savedanchor\southwest{% lower left \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgfmathsetlength{\pgf@circ@res@step}{% \ctikzvalof{tripoles/bjt/height}*\ctikzvalof{tripoles/bjt/multi height}* \ctikzvalof{\ctikzclass/scale}*\pgf@circ@Rlen} \ifnum\cdir> 0 \edef\numup{\numC}\edef\numdown{\numE} \else \edef\numup{\numE}\edef\numdown{\numC} \fi \pgfmathsetlength{\pgf@y}{-0.5*\ctikzvalof{tripoles/bjt/height}\pgf@circ@scaled@Rlen - (\numdown-1)*\pgf@circ@res@step-\pgfverticaltransformationadjustment*.5*\pgflinewidth - \ctikzvalof{tripoles/bjt/pins width}*\ctikzvalof{\ctikzclass/scale}*\pgf@circ@Rlen} \pgfmathsetlength{\pgf@x}{-0.5*\ctikzvalof{tripoles/bjt/width}*\pgf@circ@scaled@Rlen - \ctikzvalof{tripoles/bjt/pins width}*\ctikzvalof{\ctikzclass/scale}*\pgf@circ@Rlen} } \anchor{center}{\pgfpointorigin} \anchor{north}{\northeast\pgf@x=0cm\relax} \anchor{east}{\northeast\pgf@y=0cm\relax} \anchor{south}{\southwest\pgf@x=0cm\relax} \anchor{west}{\southwest\pgf@y=0cm} \anchor{north east}{\northeast} \anchor{north west}{\northeast\pgf@ya=\pgf@y\southwest\pgf@y=\pgf@ya} \anchor{south west}{\southwest} \anchor{south east}{\southeast} \anchor{text}{\northeast\pgf@y=\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox\relax} \anchor{B}{\northeast\pgf@y=0cm\pgf@x=-\pgf@x\advance\pgf@x by -\external} \anchor{base}{\basedimension\pgf@y=0cm\pgf@x=-\pgf@x\advance\pgf@x by -\external} \anchor{nobase}{\basedimension\pgf@y=0cm\pgf@x=-\pgf@x} % center of the base "bar" \anchor{cbase}{\basedimension\pgf@x=-\pgf@x \pgfmathsetlength{\pgf@y}{\cdir*(\numC-\numE)*\multistep/2}% } % geometrical centers \anchor{vcenter}{\pgf@x=0cm\relax \pgfmathsetlength{\pgf@y}{\cdir*(\numC-\numE)*\multistep/2}% } \anchor{gcenter}{% \northeast\pgf@xa=0.5\pgf@x \southwest\advance\pgf@xa by 0.5\pgf@x \pgf@x=\pgf@xa \pgfmathsetlength{\pgf@y}{\cdir*(\numC-\numE)*\multistep/2}% } % external connections \anchor{E}{ \ifnum\cdir>0% npn, emitter down \southeast \else \northeast \fi }% first emitter \anchor{emitter}{\ifnum\cdir>0\southeast\else\northeast\fi}% first emitter \anchor{C}{\ifnum\cdir<0\southeast\else\northeast\fi} \anchor{collector}{\ifnum\cdir<0\southeast\else\northeast\fi} \backgroundpath{ \pgftransformationadjustments \pgfsetcolor{\ctikzvalof{color}} % % set the type and up and down number of connections % \ifnum\cdir> 0 \pgf@circuit@trans@ntypetrue \edef\numup{\numC} \edef\numdown{\numE} \else \pgf@circuit@trans@ntypefalse \edef\numup{\numE} \edef\numdown{\numC} \fi \basedimension \pgf@circ@res@up = \pgf@y \pgf@circ@res@down = -\pgf@y \pgf@circ@res@right = \pgf@x \pgf@circ@res@left = -\pgf@x \pgf@circ@scaled@Rlen=\scaledRlen \pgf@circ@res@step=\multistep % % set arrow positions options % \edef\@@anchor{center}\edef\@@pos{\ctikzvalof{tripoles/#1/arrow pos}} \ifpgf@circuit@trans@arrowatend \edef\@@pos{1.0} \ifpgf@circuit@trans@ntype % arrow is toward outside, push it a bit \edef\@@anchor{btip} \else \edef\@@anchor{tip} \fi \fi % % Drawing upper connections % \pgfscope \pgf@circ@count@a=\numup\relax \pgfmathloop% \ifnum\pgf@circ@count@a>0 \advance\pgf@circ@count@a-1\relax \pgfmathsetlength{\pgf@circ@res@other}{\the\pgf@circ@count@a*\multistep}% \ifnum\pgf@circ@count@a=\numexpr\numup-1\relax % draw the external pin connection \pgfpathmoveto{\pgfpoint {\pgf@circ@res@right}% {\pgf@circ@res@up+\external+\pgfverticaltransformationadjustment*.5*\pgflinewidth+\pgf@circ@res@other}}% \pgfpathlineto{\pgfpoint {\pgf@circ@res@right}% {\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth+\pgf@circ@res@other}}% \else \pgfpathmoveto{\pgfpoint {\pgf@circ@res@right}% {\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth+\pgf@circ@res@other}}% \fi \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/bjt/base width}\pgf@circ@res@left}% {\ctikzvalof{tripoles/bjt/base height 2}\pgf@circ@res@up+\pgf@circ@res@other}}% \pgfsetroundcap % better when connecting to sloped lines \pgfusepath{draw} \ifpgf@circuit@trans@ntype\else % it's a PNP; draw arrow \pgfscope \pgfslopedattimetrue \pgfallowupsidedownattimetrue \pgfresetnontranslationattimefalse \pgftransformlineattime{\@@pos}{% \pgfpoint {\pgf@circ@res@right}% {\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth+\pgf@circ@res@other}% }{\pgfpoint {\ctikzvalof{tripoles/bjt/base width}\pgf@circ@res@left}% {\ctikzvalof{tripoles/bjt/base height 2}\pgf@circ@res@up+\pgf@circ@res@other}% } \pgfnode{trarrow}{\@@anchor}{}{}{\pgfusepath{stroke}} \endpgfscope \fi \repeatpgfmathloop \endpgfscope % % Drawing base % \pgfscope \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/bjt/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/bjt/base height}\pgf@circ@res@up+(\numup-1)*\multistep}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/bjt/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/bjt/base height}\pgf@circ@res@down-(\numdown-1)*\multistep}} \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \ifpgf@circuit@bpt@schottky % upper \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/bjt/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/bjt/base height}\pgf@circ@res@up+(\numup-1)*\multistep}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/bjt/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/bjt/base height}\pgf@circ@res@up+(\numup-1)*\multistep+ \ctikzvalof{tripoles/schottky base size}\pgf@circ@scaled@Rlen}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/bjt/base width}\pgf@circ@res@left+ \ctikzvalof{tripoles/schottky base size}\pgf@circ@scaled@Rlen} {\ctikzvalof{tripoles/bjt/base height}\pgf@circ@res@up+(\numup-1)*\multistep+ \ctikzvalof{tripoles/schottky base size}\pgf@circ@scaled@Rlen}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/bjt/base width}\pgf@circ@res@left+ \ctikzvalof{tripoles/schottky base size}\pgf@circ@scaled@Rlen} {\ctikzvalof{tripoles/bjt/base height}\pgf@circ@res@up+(\numup-1)*\multistep}} % lower \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/bjt/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/bjt/base height}\pgf@circ@res@down-(\numdown-1)*\multistep}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/bjt/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/bjt/base height}\pgf@circ@res@down-(\numdown-1)*\multistep- \ctikzvalof{tripoles/schottky base size}\pgf@circ@scaled@Rlen}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/bjt/base width}\pgf@circ@res@left- \ctikzvalof{tripoles/schottky base size}\pgf@circ@scaled@Rlen} {\ctikzvalof{tripoles/bjt/base height}\pgf@circ@res@down-(\numdown-1)*\multistep- \ctikzvalof{tripoles/schottky base size}\pgf@circ@scaled@Rlen}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/bjt/base width}\pgf@circ@res@left- \ctikzvalof{tripoles/schottky base size}\pgf@circ@scaled@Rlen} {\ctikzvalof{tripoles/bjt/base height}\pgf@circ@res@down-(\numdown-1)*\multistep}} \fi \pgfsetroundcap % I like it more... \pgfusepath{draw} \endpgfscope % % draw base external connection % \pgfpathmoveto{\pgfpoint{\ctikzvalof{tripoles/bjt/base width}\pgf@circ@res@left}{0pt}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/bjt/base width}\pgf@circ@res@left-\external}{0pt}} \pgfusepath{draw} % % Drawing lower connections % \pgfscope \pgf@circ@count@a=\numdown\relax \pgfmathloop% \ifnum\pgf@circ@count@a>0 \advance\pgf@circ@count@a-1\relax \pgfmathsetlength{\pgf@circ@res@other}{\the\pgf@circ@count@a*\multistep}% \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/bjt/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/bjt/base height 2}\pgf@circ@res@down-\pgf@circ@res@other}} \pgfpathlineto{\pgfpoint {\pgf@circ@res@right} {\pgf@circ@res@down-\pgfverticaltransformationadjustment*.5*\pgflinewidth-\pgf@circ@res@other}} \ifnum\pgf@circ@count@a=\numexpr\numdown-1\relax % draw the external pin connection \pgfpathlineto{\pgfpoint {\pgf@circ@res@right} {\pgf@circ@res@down-\pgfverticaltransformationadjustment*.5*\pgflinewidth-\pgf@circ@res@other-\external}} \fi \pgfsetroundcap % better when connecting to sloped lines \pgfusepath{draw} \ifpgf@circuit@trans@ntype % it's a NPN; draw arrow \pgfscope \pgfslopedattimetrue \pgfallowupsidedownattimetrue \pgfresetnontranslationattimefalse \pgftransformlineattime{\@@pos}{% \pgfpoint {\ctikzvalof{tripoles/bjt/base width}\pgf@circ@res@left}% {\ctikzvalof{tripoles/bjt/base height 2}\pgf@circ@res@down-\pgf@circ@res@other}% }{\pgfpoint {\pgf@circ@res@right}% {\pgf@circ@res@down-\pgfverticaltransformationadjustment*.5*\pgflinewidth-\pgf@circ@res@other}% } \pgfnode{trarrow}{\@@anchor}{}{}{\pgfusepath{stroke}} \endpgfscope \fi \repeatpgfmathloop \endpgfscope } % \pgf@sh@s@ contains all the code for the shape % and is executed just before a node is drawn. \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@bjt#1\endcsname{% % Start with the maximum collector number and go backwards. \pgf@circ@count@a=\numC\relax \pgfmathloop% \ifnum\pgf@circ@count@a>0 % we will create two anchors per pin: the "normal one" like `pin 1` for the % electrical contact, and the "border one" like `bpin 1` for labels. % they will coincide if `external pins width` is set to 0. \expandafter\xdef\csname pgf@anchor@bjt#1@C\the\pgf@circ@count@a\endcsname{% \noexpand\pgf@circ@bjt@C@anchor{\the\pgf@circ@count@a}% } \advance\pgf@circ@count@a by -1\relax% \repeatpgfmathloop% % and emitters \pgf@circ@count@a=\numE\relax \pgfmathloop% \ifnum\pgf@circ@count@a>0 % we will create two anchors per pin: the "normal one" like `pin 1` for the % electrical contact, and the "border one" like `bpin 1` for labels. % they will coincide if `external pins width` is set to 0. \expandafter\xdef\csname pgf@anchor@bjt#1@E\the\pgf@circ@count@a\endcsname{% \noexpand\pgf@circ@bjt@E@anchor{\the\pgf@circ@count@a}% } \advance\pgf@circ@count@a by -1\relax% \repeatpgfmathloop% }% } } \declarebjt{npn} \declarebjt{pnp} % end of multi-bjts \long\def\declareigbt#1{ \pgfcircdeclaretransistor{#1}{ \anchor{inner up}{ \northeast \pgf@y=\ctikzvalof{tripoles/#1/gate height}\pgf@y } \anchor{inner down}{ \northeast \pgf@y=-\ctikzvalof{tripoles/#1/gate height}\pgf@y } } { % add the circle if requested (before everything else, so we can fill it) \pgfcirc@transistorcircle % fill the gap color if requested \pgfcirc@fillgategap{#1} %draw upper connection \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/#1/gate height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/gate height 2}\pgf@circ@res@up}} \pgfusepath{draw} %draw thicker gate lines \pgfscope \pgfscope \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/outer base height}\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5\pgflinewidth}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/outer base height}\pgf@circ@res@down-\pgfverticaltransformationadjustment*.5\pgflinewidth}} % set the normal thickness \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \edef\@@extrat{\ctikzvalof{tripoles/#1/outer base thickness}} \pgfsetlinewidth{\@@extrat\pgflinewidth} \pgfusepath{draw} \endpgfscope \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5\pgflinewidth}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@down-\pgfverticaltransformationadjustment*.5\pgflinewidth}} \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfusepath{draw} \endpgfscope %draw lower connection \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/gate height 2}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/#1/gate height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down-\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfusepath{draw} %draw arrow depending on type of transistor \pgfscope \pgfslopedattimetrue \pgfallowupsidedownattimetrue \pgfresetnontranslationattimefalse \ifpgf@circuit@trans@arrowatend \ifpgf@circuit@trans@ntype \edef\@@anchor{btip}\edef\@@pos{1.0} \else \edef\@@anchor{tip}\edef\@@pos{1.0} \fi \else \edef\@@anchor{center}\edef\@@pos{0.5} \fi \ifpgf@circuit@trans@ntype \pgftransformlineattime{\@@pos}{% \pgfpoint% {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left}% {\ctikzvalof{tripoles/#1/gate height 2}\pgf@circ@res@down}% }{% \pgfpoint{\pgf@circ@res@right}% {\ctikzvalof{tripoles/#1/gate height}\pgf@circ@res@down}% } \else \pgftransformlineattime{\@@pos}{% \pgfpoint{\pgf@circ@res@right}% {\ctikzvalof{tripoles/#1/gate height}\pgf@circ@res@up}% }{% \pgfpoint{\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left}% {\ctikzvalof{tripoles/#1/gate height 2}\pgf@circ@res@up}% } \fi \pgfnode{trarrow}{\@@anchor}{}{}{\pgfusepath{stroke}} \endpgfscope %draw gate \ifpgf@circuit@trans@ntype \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/conn height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left-\pgfhorizontaltransformationadjustment*.5*\pgflinewidth}% {\ctikzvalof{tripoles/#1/conn height}\pgf@circ@res@down}} \else \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/conn height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left-\pgfhorizontaltransformationadjustment*.5*\pgflinewidth}% {\ctikzvalof{tripoles/#1/conn height}\pgf@circ@res@up}} \fi \pgfusepath{draw} } } \declareigbt{pigbt} \declareigbt{nigbt} \declareigbt{Lnigbt} \declareigbt{Lpigbt} % Graphene FET, See https://github.com/circuitikz/circuitikz/issues/496 \long\def\declaregfet#1{ \pgfcircdeclaretransistor{#1}{ \anchor{inner up}{ \northeast \pgf@y=\ctikzvalof{tripoles/#1/gate height}\pgf@y } \anchor{inner down}{ \northeast \pgf@y=-\ctikzvalof{tripoles/#1/gate height}\pgf@y } \anchor{outer hex up}{ \left \pgf@xa=\ctikzvalof{tripoles/#1/base width}\pgf@x \northeast \pgf@y=\ctikzvalof{tripoles/#1/gate height 2}\pgf@y \pgf@x=-\pgf@xa } \anchor{outer hex down}{ \left \pgf@xa=\ctikzvalof{tripoles/#1/base width}\pgf@x \northeast \pgf@y=\ctikzvalof{tripoles/#1/gate height 2}\pgf@y \pgf@y=-\pgf@y \pgf@x=-\pgf@xa } \anchor{inner hex up}{ \left \pgf@xa=\ctikzvalof{tripoles/#1/base width}\pgf@x \northeast \pgf@y=\ctikzvalof{tripoles/#1/gate height 2}\pgf@y \pgf@x=\pgf@xa } \anchor{inner hex down}{ \left \pgf@xa=\ctikzvalof{tripoles/#1/base width}\pgf@x \northeast \pgf@y=\ctikzvalof{tripoles/#1/gate height 2}\pgf@y \pgf@y=-\pgf@y \pgf@x=\pgf@xa } \anchor{right}{ \northeast\pgf@y=0pt\relax \pgfmathsetlength{\pgf@xa}{\ctikzvalof{tripoles/#1/base width}* \ctikzvalof{tripoles/#1/width}*\pgf@circ@scaled@Rlen} \advance \pgf@x by \pgf@xa } \anchor{text}{% need a different text: no circle, shift to the right \northeast \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \ifpgf@circuit@transisors@fixlabels \ifpgf@circuit@fet@bodydiode \advance \pgf@x by \extrabodydiodelen \else \pgfmathsetlength{\pgf@xa}{\ctikzvalof{tripoles/#1/base width}* \ctikzvalof{tripoles/#1/width}*\pgf@circ@scaled@Rlen} \advance \pgf@x by \pgf@xa \fi % no circle for gfets % add a bit of space to avoid central (substrate) terminal if drawn \advance\pgf@x by 0.05\pgf@circ@scaled@Rlen\relax \pgf@y=\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox\relax \else \pgf@y=.7\pgf@y \pgf@x= \pgf@circ@scaled@Rlen \pgf@x=0.1\pgf@x \fi } } { % no circle for gfets (clearly!) %draw upper connection to hexagon \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/#1/gate height}\pgf@circ@res@up}} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/#1/gate height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down-\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfusepath{draw} % draw (fillable) hexagon \pgfscope \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/gate height 2}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/#1/gate height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {-\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/gate height 2}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {-\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/gate height 2}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/#1/gate height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {-\ctikzvalof{tripoles/#1/gate height 2}\pgf@circ@res@up}} \pgfpathclose \pgf@circ@draworfill \endpgfscope %draw thicker gate lines \pgfscope \pgfscope \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/outer base height}\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5\pgflinewidth}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/outer base height}\pgf@circ@res@down-\pgfverticaltransformationadjustment*.5\pgflinewidth}} % set the normal thickness \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \edef\@@extrat{\ctikzvalof{tripoles/#1/outer base thickness}} \pgfsetlinewidth{\@@extrat\pgflinewidth} \pgfusepath{draw} \endpgfscope \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5\pgflinewidth}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@down-\pgfverticaltransformationadjustment*.5\pgflinewidth}} \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfusepath{draw} \endpgfscope %draw arrow depending on type of transistor \pgfscope \pgfslopedattimetrue \pgfallowupsidedownattimetrue \pgfresetnontranslationattimefalse \ifpgf@circuit@trans@arrowatend \ifpgf@circuit@trans@ntype \edef\@@anchor{btip}\edef\@@pos{1.0} \else \edef\@@anchor{tip}\edef\@@pos{1.0} \fi \else \edef\@@anchor{center}\edef\@@pos{0.5} \fi \ifpgf@circuit@trans@ntype \pgftransformlineattime{\@@pos}{% \pgfpoint% {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left}% {\ctikzvalof{tripoles/#1/gate height 2}\pgf@circ@res@down}% }{% \pgfpoint{\pgf@circ@res@right}% {\ctikzvalof{tripoles/#1/gate height}\pgf@circ@res@down}% } \else \pgftransformlineattime{\@@pos}{% \pgfpoint{\pgf@circ@res@right}% {\ctikzvalof{tripoles/#1/gate height}\pgf@circ@res@up}% }{% \pgfpoint{\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left}% {\ctikzvalof{tripoles/#1/gate height 2}\pgf@circ@res@up}% } \fi \pgfnode{trarrow}{\@@anchor}{}{}{\pgfusepath{stroke}} \endpgfscope %draw gate \ifpgf@circuit@trans@ntype \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/conn height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left-\pgfhorizontaltransformationadjustment*.5*\pgflinewidth}% {\ctikzvalof{tripoles/#1/conn height}\pgf@circ@res@down}} \else \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/conn height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left-\pgfhorizontaltransformationadjustment*.5*\pgflinewidth}% {\ctikzvalof{tripoles/#1/conn height}\pgf@circ@res@up}} \fi \pgfusepath{draw} } } \declaregfet{pgfet} \declaregfet{ngfet} % Plain MOSes \pgfcircdeclaretransistor{nmos}{ \anchor{inner up}{ \northeast \pgf@y=\ctikzvalof{tripoles/nmos/gate height}\pgf@y } \anchor{inner down}{ \northeast \pgf@y=-\ctikzvalof{tripoles/nmos/gate height}\pgf@y } }{% % add the circle if requested (before everything else, so we can fill it) \pgfcirc@transistorcircle % fill the gap color if requested \pgfcirc@fillgategap{nmos} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/nmos/gate height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/nmos/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/nmos/gate height}\pgf@circ@res@up}} \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/nmos/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/nmos/gate height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/nmos/gate height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down-\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfusepath{draw} \pgfscope \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/nmos/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/nmos/base height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/nmos/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/nmos/base height}\pgf@circ@res@down}} \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/nmos/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/nmos/gate height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/nmos/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/nmos/gate height}\pgf@circ@res@down}} \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfusepath{draw} \endpgfscope \ifpgf@circuit@mos@arrows \pgfscope \ifpgf@circuit@trans@arrowatend \pgftransformshift{\pgfpoint {\pgf@circ@res@right}% {\ctikzvalof{tripoles/pmos/gate height}\pgf@circ@res@down}% } \pgfnode{trarrow}{btip}{}{}{\pgfusepath{stroke}} \else \pgfslopedattimetrue \pgfallowupsidedownattimetrue \pgfresetnontranslationattimefalse \pgftransformlineattime{\ctikzvalof{tripoles/nmos/arrow pos}}{% \pgfpoint% {\ctikzvalof{tripoles/nmos/gate width}\pgf@circ@res@left}% {\ctikzvalof{tripoles/nmos/gate height}\pgf@circ@res@down}% }{% \pgfpoint {\pgf@circ@res@right}% {\ctikzvalof{tripoles/nmos/gate height}\pgf@circ@res@down}% } \pgfnode{currarrow}{center}{}{}{\pgfusepath{stroke}} \fi \endpgfscope \fi \ifpgf@circuit@bpt@drawgate \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/nmos/gate width}\pgf@circ@res@left} {\pgf@circ@res@up+\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left-\pgfhorizontaltransformationadjustment*.5*\pgflinewidth}{\pgf@circ@res@up+\pgf@circ@res@down}} \pgfusepath{draw} \fi \ifpgf@circuit@bpt@drawbulk % added by Burak Kelleci \pgfpathmoveto{\pgfpoint{\ctikzvalof{tripoles/nmos/base width}\pgf@circ@res@left} {\pgf@circ@res@up+\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right+\pgfhorizontaltransformationadjustment*.5*\pgflinewidth} {\pgf@circ@res@up+\pgf@circ@res@down}} \pgfusepath{draw} \fi \pgfcirc@ferroelectric{nmos}{0} } \pgfcircdeclaretransistor{pmos}{ \anchor{inner up}{ \northeast \pgf@y=\ctikzvalof{tripoles/pmos/gate height}\pgf@y } \anchor{inner down}{ \northeast \pgf@y=-\ctikzvalof{tripoles/pmos/gate height}\pgf@y } }{% % add the circle if requested (before everything else, so we can fill it) \pgfcirc@transistorcircle % fill the gap color if requested \pgfcirc@fillgategap{nmos} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/pmos/gate height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/pmos/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/pmos/gate height}\pgf@circ@res@up}} \pgfusepath{draw} \ifpgf@circuit@mos@arrows \pgfscope \ifpgf@circuit@trans@arrowatend \pgftransformshift{\pgfpoint {\ctikzvalof{tripoles/pmos/base width}\pgf@circ@res@left}% {\ctikzvalof{tripoles/pmos/gate height}\pgf@circ@res@up}% } \pgftransformrotate{180} \pgfnode{trarrow}{tip}{}{}{\pgfusepath{stroke}} \else \pgfslopedattimetrue \pgfallowupsidedownattimetrue \pgfresetnontranslationattimefalse \pgftransformlineattime{\ctikzvalof{tripoles/pmos/arrow pos}}{% \pgfpoint% {\pgf@circ@res@right}% {\ctikzvalof{tripoles/pmos/gate height}\pgf@circ@res@up}% }{% \pgfpoint {\ctikzvalof{tripoles/pmos/gate width}\pgf@circ@res@left}% {\ctikzvalof{tripoles/pmos/gate height}\pgf@circ@res@up}% } \pgfnode{currarrow}{center}{}{}{\pgfusepath{stroke}} \fi \endpgfscope \fi \pgfscope \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/pmos/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/pmos/base height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/pmos/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/pmos/base height}\pgf@circ@res@down}} \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/pmos/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/pmos/gate height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/pmos/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/pmos/gate height}\pgf@circ@res@down}} \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfusepath{draw} \endpgfscope \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/pmos/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/pmos/gate height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/pmos/gate height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down-\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfusepath{draw} \ifpgf@circuit@bpt@drawgate \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/pmos/gate width}\pgf@circ@res@left} {\pgf@circ@res@up+\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left-\pgfhorizontaltransformationadjustment*.5*\pgflinewidth}{\pgf@circ@res@up+\pgf@circ@res@down}} \pgfusepath{draw} \fi \ifpgf@circuit@bpt@drawbulk % added by Burak Kelleci \pgfpathmoveto{\pgfpoint{\ctikzvalof{tripoles/pmos/base width}\pgf@circ@res@left} {\pgf@circ@res@up+\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right+\pgfhorizontaltransformationadjustment*.5*\pgflinewidth} {\pgf@circ@res@up+\pgf@circ@res@down}} \pgfusepath{draw} \fi \ifpgf@circuit@pmos@nocircle\else % we are not scaling the circle with the MOS --- I think it's better to have it % coherent with the poles/nodes of the rest of the circuit. \pgfpathcircle{\pgfpoint {\ctikzvalof{tripoles/pmos/gate width}\pgf@circ@res@left - \ctikzvalof{nodes width}*\pgf@circ@Rlen} {\pgf@circ@res@up+\pgf@circ@res@down}}{\ctikzvalof{nodes width}*\pgf@circ@Rlen} \ifpgf@circuit@pmos@emptycircle \pgfsetfillcolor{white} \fi \pgfusepath{draw,fill} \fi \pgfcirc@ferroelectric{pmos}{0} } %%% depletion MOSFET (simplified symbols) \long\def\pgfcirc@filldraw@depletion#1{% \ifx\tikz@fillcolor\pgfutil@empty % if there is no explicit fill check the specific key \edef\@@tmp{\ctikzvalof{tripoles/#1/depletion color}}\edef\@@none{none}% \ifx\@@tmp\@@none % if it's none \pgfusepath{draw}% \else \edef\@@default{default}% \ifx\@@tmp\@@default % fill with the pen color \pgfusepath{draw, fill}% \else \pgfsetfillcolor{\@@tmp}% \pgfusepath{draw, fill}% \fi \fi \else \pgfsetfillcolor{\tikz@fillcolor}% \pgfusepath{draw, fill}% \fi } \pgfcircdeclaretransistor{nmosd}{ \anchor{inner up}{ \northeast \pgf@y=\ctikzvalof{tripoles/nmosd/gate height}\pgf@y } \anchor{inner down}{ \northeast \pgf@y=-\ctikzvalof{tripoles/nmosd/gate height}\pgf@y } \anchor{nobulk}{ %override \left \pgf@circ@res@temp=\ctikzvalof{tripoles/nmosd/depletion width}\pgf@x \pgf@x=\ctikzvalof{tripoles/nmosd/base width}\pgf@x \advance\pgf@x by -\pgf@circ@res@temp } }{% % draw depletion channel % add the circle if requested (before everything else, so we can fill it) \pgfcirc@transistorcircle % fill the gap color if requested \pgfcirc@fillgategap{nmos} \pgfscope \pgfpathrectanglecorners {\pgfpoint {\ctikzvalof{tripoles/nmosd/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/nmosd/gate height}\pgf@circ@res@up}} {\pgfpoint {(\ctikzvalof{tripoles/nmosd/base width} - \ctikzvalof{tripoles/nmosd/depletion width})*\pgf@circ@res@left} {-\ctikzvalof{tripoles/nmosd/gate height}\pgf@circ@res@up}} \pgfcirc@filldraw@depletion{nmosd} \endpgfscope % draw drain and source terminals \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{\ctikzvalof{tripoles/nmosd/gate height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/nmosd/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/nmosd/gate height}\pgf@circ@res@up}} \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/nmosd/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/nmosd/gate height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/nmosd/gate height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down-\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfusepath{draw} \pgfscope \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/nmosd/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/nmosd/base height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/nmosd/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/nmosd/base height}\pgf@circ@res@down}} \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/nmosd/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/nmosd/gate height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/nmosd/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/nmosd/gate height}\pgf@circ@res@down}} \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfusepath{draw} \endpgfscope \ifpgf@circuit@mos@arrows \pgfscope \ifpgf@circuit@trans@arrowatend \pgftransformshift{\pgfpoint {\pgf@circ@res@right}% {\ctikzvalof{tripoles/pmosd/gate height}\pgf@circ@res@down}% } \pgfnode{trarrow}{btip}{}{}{\pgfusepath{stroke}} \else \pgfslopedattimetrue \pgfallowupsidedownattimetrue \pgfresetnontranslationattimefalse \pgftransformlineattime{\ctikzvalof{tripoles/nmosd/arrow pos}}{% \pgfpoint% {\ctikzvalof{tripoles/nmosd/gate width}\pgf@circ@res@left}% {\ctikzvalof{tripoles/nmosd/gate height}\pgf@circ@res@down}% }{% \pgfpoint {\pgf@circ@res@right-\ctikzvalof{tripoles/nmosd/depletion width}*\pgf@circ@res@left}% {\ctikzvalof{tripoles/nmosd/gate height}\pgf@circ@res@down}% } \pgfnode{currarrow}{center}{}{}{\pgfusepath{stroke}} \fi \endpgfscope \fi \ifpgf@circuit@bpt@drawgate \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/nmosd/gate width}\pgf@circ@res@left} {\pgf@circ@res@up+\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left-\pgfhorizontaltransformationadjustment*.5*\pgflinewidth}{\pgf@circ@res@up+\pgf@circ@res@down}} \pgfusepath{draw} \fi \ifpgf@circuit@bpt@drawbulk % added by Burak Kelleci \pgfpathmoveto{\pgfpoint{\ctikzvalof{tripoles/nmosd/base width}\pgf@circ@res@left-\ctikzvalof{tripoles/nmosd/depletion width}*\pgf@circ@res@left} {\pgf@circ@res@up+\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right+\pgfhorizontaltransformationadjustment*.5*\pgflinewidth} {\pgf@circ@res@up+\pgf@circ@res@down}} \pgfusepath{draw} \fi \pgfcirc@ferroelectric{nmosd}{\ctikzvalof{tripoles/nmosd/depletion width}} } \pgfcircdeclaretransistor{pmosd}{ \anchor{inner up}{ \northeast \pgf@y=\ctikzvalof{tripoles/pmosd/gate height}\pgf@y } \anchor{inner down}{ \northeast \pgf@y=-\ctikzvalof{tripoles/pmosd/gate height}\pgf@y } \anchor{nobulk}{ %override \left \pgf@circ@res@temp=\ctikzvalof{tripoles/pmosd/depletion width}\pgf@x \pgf@x=\ctikzvalof{tripoles/pmosd/base width}\pgf@x \advance\pgf@x by -\pgf@circ@res@temp } }{% % add the circle if requested (before everything else, so we can fill it) \pgfcirc@transistorcircle % fill the gap color if requested \pgfcirc@fillgategap{nmos} % draw depletion channel \pgfscope \pgfpathrectanglecorners {\pgfpoint {\ctikzvalof{tripoles/pmosd/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/pmosd/gate height}\pgf@circ@res@up}} {\pgfpoint {(\ctikzvalof{tripoles/pmosd/base width} - \ctikzvalof{tripoles/pmosd/depletion width})*\pgf@circ@res@left} {-\ctikzvalof{tripoles/pmosd/gate height}\pgf@circ@res@up}} \pgfcirc@filldraw@depletion{pmosd} \endpgfscope \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/pmosd/gate height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/pmosd/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/pmosd/gate height}\pgf@circ@res@up}} \pgfusepath{draw} \ifpgf@circuit@mos@arrows \pgfscope \ifpgf@circuit@trans@arrowatend \pgftransformshift{\pgfpoint {\ctikzvalof{tripoles/pmosd/base width}\pgf@circ@res@left-\ctikzvalof{tripoles/nmosd/depletion width}*\pgf@circ@res@left}% {\ctikzvalof{tripoles/pmosd/gate height}\pgf@circ@res@up}% } \pgftransformrotate{180} \pgfnode{trarrow}{tip}{}{}{\pgfusepath{stroke}} \else \pgfslopedattimetrue \pgfallowupsidedownattimetrue \pgfresetnontranslationattimefalse \pgftransformlineattime{\ctikzvalof{tripoles/pmosd/arrow pos}}{% \pgfpoint% {\pgf@circ@res@right-\ctikzvalof{tripoles/nmosd/depletion width}*\pgf@circ@res@left}% {\ctikzvalof{tripoles/pmosd/gate height}\pgf@circ@res@up}% }{% \pgfpoint {\ctikzvalof{tripoles/pmosd/gate width}\pgf@circ@res@left}% {\ctikzvalof{tripoles/pmosd/gate height}\pgf@circ@res@up}% } \pgfnode{currarrow}{center}{}{}{\pgfusepath{stroke}} \fi \endpgfscope \fi \pgfscope \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/pmosd/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/pmosd/base height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/pmosd/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/pmosd/base height}\pgf@circ@res@down}} \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/pmosd/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/pmosd/gate height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/pmosd/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/pmosd/gate height}\pgf@circ@res@down}} \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfusepath{draw} \endpgfscope \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/pmosd/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/pmosd/gate height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/pmosd/gate height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down-\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfusepath{draw} \ifpgf@circuit@bpt@drawgate \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/pmosd/gate width}\pgf@circ@res@left} {\pgf@circ@res@up+\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left-\pgfhorizontaltransformationadjustment*.5*\pgflinewidth}{\pgf@circ@res@up+\pgf@circ@res@down}} \pgfusepath{draw} \fi \ifpgf@circuit@bpt@drawbulk % added by Burak Kelleci \pgfpathmoveto{\pgfpoint{\ctikzvalof{tripoles/pmosd/base width}\pgf@circ@res@left-\ctikzvalof{tripoles/nmosd/depletion width}*\pgf@circ@res@left} {\pgf@circ@res@up+\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right+\pgfhorizontaltransformationadjustment*.5*\pgflinewidth} {\pgf@circ@res@up+\pgf@circ@res@down}} \pgfusepath{draw} \fi \ifpgf@circuit@pmos@nocircle\else % we are not scaling the circle with the MOS --- I think it's better to have it % coherent with the poles/nodes of the rest of the circuit. \pgfpathcircle{\pgfpoint {\ctikzvalof{tripoles/pmosd/gate width}\pgf@circ@res@left - \ctikzvalof{nodes width}*\pgf@circ@Rlen} {\pgf@circ@res@up+\pgf@circ@res@down}}{\ctikzvalof{nodes width}*\pgf@circ@Rlen} \ifpgf@circuit@pmos@emptycircle \pgfsetfillcolor{white} \fi \pgfusepath{draw,fill} \fi \pgfcirc@ferroelectric{pmosd}{\ctikzvalof{tripoles/pmosd/depletion width}} } %% HEMT FET Transistor \pgfcircdeclaretransistor{hemt}{ \anchor{inner up}{ \northeast \pgf@y=\ctikzvalof{tripoles/hemt/gate height}\pgf@y } \anchor{inner down}{ \northeast \pgf@y=-\ctikzvalof{tripoles/hemt/gate height}\pgf@y } }{% % add the circle if requested (before everything else, so we can fill it) \pgfcirc@transistorcircle \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/hemt/gate height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/hemt/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/hemt/gate height}\pgf@circ@res@up}} \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/hemt/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/hemt/gate height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/hemt/gate height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down-\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfusepath{draw} \pgfscope \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/hemt/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/hemt/base height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/hemt/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/hemt/base height}\pgf@circ@res@down}} \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfusepath{draw} \endpgfscope \ifpgf@circuit@bpt@drawgate \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/hemt/base width}\pgf@circ@res@left} {\pgf@circ@res@up+\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left-\pgfhorizontaltransformationadjustment*.5*\pgflinewidth}{\pgf@circ@res@up+\pgf@circ@res@down}} \pgfusepath{draw} \fi } \long\def\drawfetcore#1{ \pgftransformationadjustments % add the circle if requested (before everything else, so we can fill it) \pgfcirc@transistorcircle % fill the gap color if requested \pgfcirc@fillgategap{#1} %top connection \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/#1/gate height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/gate height}\pgf@circ@res@up}} \pgfusepath{draw} \pgfscope \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@up}} \ifpgf@circuit@trans@depletiontype \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@down}} \else \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@up*0.45}} \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@up*0.25}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@down*0.25}} \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/nfet/base height}\pgf@circ@res@down*0.45}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@down}} \fi \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfusepath{draw} \endpgfscope %Bulk connection line \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\pgf@circ@res@up+\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right+\pgfhorizontaltransformationadjustment*.5*\pgflinewidth} {\pgf@circ@res@up+\pgf@circ@res@down}} %bottom connection \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/gate height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/#1/gate height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down-\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfusepath{draw} %draw thick gate line \pgfscope \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/gate height}\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/gate height}\pgf@circ@res@down-\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfusepath{draw} \endpgfscope % arrows \pgfscope \pgfslopedattimetrue \pgfallowupsidedownattimetrue \pgfresetnontranslationattimefalse \ifpgf@circuit@trans@arrowatend \ifpgf@circuit@trans@ntype \edef\@@anchor{tip} \edef\@@pos{1.0} \else \edef\@@anchor{btip} \edef\@@pos{0.0} \fi \else \edef\@@anchor{center}\edef\@@pos{0.6} \fi \pgftransformlineattime{\@@pos}{% \pgfpoint {\pgf@circ@res@right}% {\pgf@circ@res@up+\pgf@circ@res@down}% }{% \pgfpoint% {\ctikzvalof{tripoles/#1/base width}\pgf@circ@res@left}% {\pgf@circ@res@up+\pgf@circ@res@down}% } \ifpgf@circuit@trans@ntype \else \pgftransformrotate{180} \fi \pgfnode{trarrow}{\@@anchor}{}{}{\pgfusepath{stroke}} \endpgfscope % GATE CONNECTION \ifpgf@circuit@bpt@drawgate \ifpgf@circuit@trans@ntype \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/conn height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left-\pgfhorizontaltransformationadjustment*.5*\pgflinewidth}{\ctikzvalof{tripoles/#1/conn height}\pgf@circ@res@down}} \else \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/gate width}\pgf@circ@res@left} {-\ctikzvalof{tripoles/#1/conn height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left-\pgfhorizontaltransformationadjustment*.5*\pgflinewidth}{-\ctikzvalof{tripoles/#1/conn height}\pgf@circ@res@down}} \fi \pgfusepath{draw} \fi \pgfcirc@ferroelectric{#1}{0} } \long\def\pgfdeclaretransistorwrapperaddbulk#1#2#3 {\pgfcircdeclaretransistor{#1}{ \anchor{bulk}{\left\pgf@x=0pt} \anchor{B}{\left\pgf@x=0pt}%override Base anchor from npn&igbt \anchor{inner up}{ \northeast \pgf@y=\ctikzvalof{tripoles/#1/gate height}\pgf@y } \anchor{inner down}{ \northeast \pgf@y=-\ctikzvalof{tripoles/#1/gate height}\pgf@y } #2 } {#3} } \pgfdeclaretransistorwrapperaddbulk{nfet}{}{% \pgf@circuit@trans@depletiontypefalse \drawfetcore{nfet} } \pgfdeclaretransistorwrapperaddbulk{pfet}{}{% \pgf@circuit@trans@depletiontypefalse \drawfetcore{pfet} } \pgfdeclaretransistorwrapperaddbulk{nfetd}{}{% \pgf@circuit@trans@depletiontypetrue \drawfetcore{nfetd} } \pgfdeclaretransistorwrapperaddbulk{pfetd}{}{% \pgf@circuit@trans@depletiontypetrue \drawfetcore{pfetd} } % N-CHANNEL IGFET ENHANCEMENT TYPE \pgfdeclaretransistorwrapperaddbulk{nigfete}{}{% \pgf@circuit@trans@depletiontypefalse \drawfetcore{nigfete} % SOURCE CONNECTION \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down}} \pgfusepath{draw} % SOLDER DOT at source-bulk connection \ifpgf@circuit@fet@solderdot \pgfscope \pgftransformshift{\pgfpoint{\pgf@circ@res@right}{ \ctikzvalof{tripoles/nigfete/gate height}\pgf@circ@res@down}} \pgfnode{circ}{center}{}{}{} \endpgfscope{} \fi } % N-CHANNEL IGFET ENHANCEMENT TYPE with Bulk connector \pgfdeclaretransistorwrapperaddbulk{nigfetebulk}{}{% \pgf@circuit@trans@depletiontypefalse \drawfetcore{nigfetebulk} % SOLDER DOT at source-bulk connection \ifpgf@circuit@fet@solderdot \pgfscope \pgftransformshift{\pgfpoint{\pgf@circ@res@right}{ \ctikzvalof{tripoles/nigfetebulk/gate height}\pgf@circ@res@down}} \pgfnode{circ}{center}{}{}{} \endpgfscope{} \fi } % N-CHANNEL IGFET DEPLETION TYPE \pgfdeclaretransistorwrapperaddbulk{nigfetd}{}{% \pgf@circuit@trans@depletiontypetrue \drawfetcore{nigfetd} % SOURCE CONNECTION \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down}} \pgfusepath{draw} % SOLDER DOT at source-bulk connection \ifpgf@circuit@fet@solderdot \pgfscope \pgftransformshift{\pgfpoint{\pgf@circ@res@right}{ \ctikzvalof{tripoles/nigfete/gate height}\pgf@circ@res@down}} \pgfnode{circ}{center}{}{}{} \endpgfscope{} \fi } % P-CHANNEL IGFET ENHANCEMENT TYPE \pgfdeclaretransistorwrapperaddbulk{pigfete}{}{% \pgf@circuit@trans@depletiontypefalse \drawfetcore{pigfete} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up}} % SOURCE CONNECTION \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up}} \pgfusepath{draw} % SOLDER DOT at source-bulk connection \ifpgf@circuit@fet@solderdot \pgfscope \pgftransformshift{\pgfpoint{\pgf@circ@res@right}{ \ctikzvalof{tripoles/pigfete/gate height}\pgf@circ@res@up}} \pgfnode{circ}{center}{}{}{} \endpgfscope \fi } % P-CHANNEL IGFET ENHANCEMENT TYPE with bulk connector \pgfdeclaretransistorwrapperaddbulk{pigfetebulk}{}{% \pgf@circuit@trans@depletiontypefalse \drawfetcore{pigfetebulk} } % P-CHANNEL IGFET DEPLETION TYPE \pgfdeclaretransistorwrapperaddbulk{pigfetd}{}{% \pgf@circuit@trans@depletiontypetrue \drawfetcore{pigfetd} % SOURCE CONNECTION \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up}} \pgfusepath{draw} % SOLDER DOT at source-bulk connection \ifpgf@circuit@fet@solderdot \pgfscope \pgftransformshift{\pgfpoint{\pgf@circ@res@right}{ \ctikzvalof{tripoles/nigfete/gate height}\pgf@circ@res@up}} \pgfnode{circ}{center}{}{}{} \endpgfscope{} \fi } %%% uni-junction transistors: jfets, ujts \long\def\pgfcircdeclarejunctiontransistor#1#2#3{% name, extra anchors, extra draw \pgfcircdeclaretransistor{#1}{ \anchor{inner up}{ \northeast \pgf@y=\ctikzvalof{tripoles/#1/gate height 2}\pgf@y } \anchor{inner down}{ \northeast \pgf@y=-\ctikzvalof{tripoles/#1/gate height 2}\pgf@y } \anchor{kink}{ \northeast \pgf@ya=-\ctikzvalof{tripoles/#1/gate height 2}\pgf@y \left \pgf@y=\ctikzvalof{tripoles/#1/curr direction}\pgf@ya \pgf@x=\ctikzvalof{tripoles/#1/conn kink}\pgf@x } % extra anchors (or override) #2 }{% % add the circle if requested (before everything else, so we can fill it) \pgfcirc@transistorcircle % get direction \edef\@@dir{\ctikzvalof{tripoles/#1/curr direction}} % draw drain/source connections: up \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/#1/gate height 2}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/gate height 2}\pgf@circ@res@up}} % down \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/gate height 2}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/#1/gate height 2}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down-\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfusepath{draw} \pgfscope \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/#1/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/gate height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/#1/gate width}\pgf@circ@res@left} {\ctikzvalof{tripoles/#1/gate height}\pgf@circ@res@down}} \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfusepath{draw} \endpgfscope % arrow \pgfscope \pgfslopedattimetrue \pgfallowupsidedownattimetrue \pgfresetnontranslationattimefalse \ifpgf@circuit@trans@arrowatend \ifnum\@@dir>0 \edef\@@anchor{tip}\edef\@@pos{1.0} \else \edef\@@anchor{btip}\edef\@@pos{1.0} \fi \else \ifnum\@@dir>0 \edef\@@anchor{center}\edef\@@pos{0.6} \else \edef\@@anchor{center}\edef\@@pos{0.4} \fi \fi % find x1, x2 and y for the base arrow \ifnum\@@dir>0 \pgf@circ@res@step=\ctikzvalof{tripoles/#1/conn kink}\pgf@circ@res@left \pgf@circ@res@other=\ctikzvalof{tripoles/#1/gate width}\pgf@circ@res@left \pgf@circ@res@zero=\ctikzvalof{tripoles/#1/union height}\pgf@circ@res@down \pgf@circ@res@temp=\ctikzvalof{tripoles/#1/gate height 2}\pgf@circ@res@down \else \pgf@circ@res@step=\ctikzvalof{tripoles/#1/gate width}\pgf@circ@res@left \pgf@circ@res@other=\ctikzvalof{tripoles/#1/conn kink}\pgf@circ@res@left \pgf@circ@res@zero=\ctikzvalof{tripoles/#1/gate height 2}\pgf@circ@res@up \pgf@circ@res@temp=\ctikzvalof{tripoles/#1/union height}\pgf@circ@res@up \fi % % gate line (called emitter in UJT) % \pgfpathmoveto{\pgfpoint{\pgf@circ@res@step}{\pgf@circ@res@temp}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{\pgf@circ@res@zero}} % % horizontal gate line % \ifpgf@circuit@bpt@drawgate \ifnum\@@dir>0 \pgfpathmoveto{\pgfpoint{\pgf@circ@res@step}{\pgf@circ@res@temp}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@temp}} \else \pgfpathmoveto{\pgfpoint{\pgf@circ@res@other}{\pgf@circ@res@zero}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@zero}} \fi \fi \pgfusepath{draw} % % gate arrows (called emitter in UJT) % \pgftransformlineattime{\@@pos}{% \pgfpoint{\pgf@circ@res@step}{\pgf@circ@res@temp} }{% \pgfpoint{\pgf@circ@res@other}{\pgf@circ@res@zero} } \pgfnode{trarrow}{\@@anchor}{}{}{\pgfusepath{stroke}} % % gate line (called emitter in UJT) % \endpgfscope % extra drawings #3 } } % NJFET and PJFET \pgfcircdeclarejunctiontransistor{njfet}{}{} \pgfcircdeclarejunctiontransistor{pjfet}{}{} \def\@ujtanchoroverride#1{ \savedanchor{\ujtrealemitter}{ \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/#1/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y %north anchor height % kink AND conn height, they're the same \pgf@y=-\ctikzvalof{tripoles/#1/gate height 2}\pgf@y \pgf@y=\ctikzvalof{tripoles/#1/curr direction}\pgf@y % horizontal \pgf@x=-\ctikzvalof{tripoles/#1/width}\pgf@circ@scaled@Rlen % left \ifpgf@circuit@bpt@drawgate\else \pgf@x=\ctikzvalof{tripoles/#1/conn kink}\pgf@x \fi } \anchor{E}{\ujtrealemitter} \anchor{emitter}{\ujtrealemitter} \anchor{B2}{\northeast\pgf@y=-\pgf@y} \anchor{B1}{\northeast} } \pgfcircdeclarejunctiontransistor{nujt}{\@ujtanchoroverride{nujt}}{} \pgfcircdeclarejunctiontransistor{pujt}{\@ujtanchoroverride{pujt}}{} \pgfdeclaretransistorwrapperaddbulk{isfet}{ }{% % add the circle if requested (before everything else, so we can fill it) \pgfcirc@transistorcircle \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}} % DRAIN CONNECTION \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/isfet/gate height}\pgf@circ@res@up}} % DRAIN \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/isfet/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/isfet/gate height}\pgf@circ@res@up}} \pgfusepath{draw} % GATE, DEPLETION TYPE \pgfscope %% added \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/isfet/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/isfet/base height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/isfet/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/isfet/base height}\pgf@circ@res@down}} \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} %% added \pgfusepath{draw} %% added \endpgfscope %% added % BULK \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/isfet/base width}\pgf@circ@res@left} {\pgf@circ@res@up+\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right+.5\pgflinewidth} {\pgf@circ@res@up+\pgf@circ@res@down}} % SOURCE \pgfpathmoveto{\pgfpoint {\ctikzvalof{tripoles/isfet/base width}\pgf@circ@res@left} {\ctikzvalof{tripoles/isfet/gate height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right} {\ctikzvalof{tripoles/isfet/gate height}\pgf@circ@res@down}} % SOURCE CONNECTION \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down-\pgfverticaltransformationadjustment*.5*\pgflinewidth}} \pgfusepath{draw} % SOLDER DOT at source-bulk connection \ifpgf@circuit@fet@solderdot \pgfscope \pgftransformshift{\pgfpoint{\pgf@circ@res@right}{ \ctikzvalof{tripoles/nigfete/gate height}\pgf@circ@res@down}} \pgfnode{circ}{center}{}{}{} \endpgfscope{} \fi % ARROW \pgfscope \pgfslopedattimetrue \pgfallowupsidedownattimetrue \pgfresetnontranslationattimefalse \ifpgf@circuit@trans@arrowatend \edef\@@anchor{tip}\edef\@@pos{1.0} \else \edef\@@anchor{center}\edef\@@pos{0.6} \fi \pgftransformlineattime{\@@pos}{% \pgfpoint {\pgf@circ@res@right}% {\pgf@circ@res@up+\pgf@circ@res@down}% }{% \pgfpoint% {\ctikzvalof{tripoles/isfet/base width}\pgf@circ@res@left}% {\pgf@circ@res@up+\pgf@circ@res@down}% } \pgfnode{trarrow}{\@@anchor}{}{}{\pgfusepath{stroke}} \endpgfscope \pgfusepath{draw} % Wavy lines \pgfscope \pgfpathmoveto{\pgfpoint{-\ctikzvalof{tripoles/isfet/waves x sep}\pgf@circ@res@up}{\ctikzvalof{tripoles/isfet/waves y sep}\pgf@circ@res@up}} \pgfpathsine{\pgfpoint{-\ctikzvalof{tripoles/isfet/wave width}\pgf@circ@res@up}{-\ctikzvalof{tripoles/isfet/wave amp}\pgf@circ@res@up}} \pgfpathcosine{\pgfpoint{-\ctikzvalof{tripoles/isfet/wave width}\pgf@circ@res@up}{\ctikzvalof{tripoles/isfet/wave amp}\pgf@circ@res@up}} \pgfpathsine{\pgfpoint{-\ctikzvalof{tripoles/isfet/wave width}\pgf@circ@res@up}{\ctikzvalof{tripoles/isfet/wave amp}\pgf@circ@res@up}} \pgfpathcosine{\pgfpoint{-\ctikzvalof{tripoles/isfet/wave width}\pgf@circ@res@up}{-\ctikzvalof{tripoles/isfet/wave amp}\pgf@circ@res@up}} \pgfusepath{draw} \pgfpathmoveto{\pgfpoint{-\ctikzvalof{tripoles/isfet/waves x sep}\pgf@circ@res@up}{0cm}} \pgfpathsine{\pgfpoint{-\ctikzvalof{tripoles/isfet/wave width}\pgf@circ@res@up}{-\ctikzvalof{tripoles/isfet/wave amp}\pgf@circ@res@up}} \pgfpathcosine{\pgfpoint{-\ctikzvalof{tripoles/isfet/wave width}\pgf@circ@res@up}{\ctikzvalof{tripoles/isfet/wave amp}\pgf@circ@res@up}} \pgfpathsine{\pgfpoint{-\ctikzvalof{tripoles/isfet/wave width}\pgf@circ@res@up}{\ctikzvalof{tripoles/isfet/wave amp}\pgf@circ@res@up}} \pgfpathcosine{\pgfpoint{-\ctikzvalof{tripoles/isfet/wave width}\pgf@circ@res@up}{-\ctikzvalof{tripoles/isfet/wave amp}\pgf@circ@res@up}} \pgfusepath{draw} \pgfpathmoveto{\pgfpoint{-\ctikzvalof{tripoles/isfet/waves x sep}\pgf@circ@res@up}{-\ctikzvalof{tripoles/isfet/waves y sep}\pgf@circ@res@up}} \pgfpathsine{\pgfpoint{-\ctikzvalof{tripoles/isfet/wave width}\pgf@circ@res@up}{-\ctikzvalof{tripoles/isfet/wave amp}\pgf@circ@res@up}} \pgfpathcosine{\pgfpoint{-\ctikzvalof{tripoles/isfet/wave width}\pgf@circ@res@up}{\ctikzvalof{tripoles/isfet/wave amp}\pgf@circ@res@up}} \pgfpathsine{\pgfpoint{-\ctikzvalof{tripoles/isfet/wave width}\pgf@circ@res@up}{\ctikzvalof{tripoles/isfet/wave amp}\pgf@circ@res@up}} \pgfpathcosine{\pgfpoint{-\ctikzvalof{tripoles/isfet/wave width}\pgf@circ@res@up}{-\ctikzvalof{tripoles/isfet/wave amp}\pgf@circ@res@up}} \pgfusepath{draw} \endpgfscope } % end of transistors % %>>> %% Transistor's path definitions%<<< \pgf@circ@definetranspath{nmos} \pgf@circ@definetranspath{pmos} \pgf@circ@definetranspath{nmosd} \pgf@circ@definetranspath{pmosd} \pgf@circ@definetranspath{hemt} \pgf@circ@definetranspath{npn} \pgf@circ@definetranspath{pnp} \pgf@circ@definetranspath{nfet} \pgf@circ@definetranspath{nigfete} \pgf@circ@definetranspath{nigfetd} \pgf@circ@definetranspath{nigfetebulk} \pgf@circ@definetranspath{pfet} \pgf@circ@definetranspath{pigfete} \pgf@circ@definetranspath{pigfetd} \pgf@circ@definetranspath{pigfetebulk} \pgf@circ@definetranspath{njfet} \pgf@circ@definetranspath{pjfet} \pgf@circ@definetranspath{pigbt} \pgf@circ@definetranspath{nigbt} \pgf@circ@definetranspath{Lpigbt} \pgf@circ@definetranspath{Lnigbt}% %>>> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Amplifiers %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Settings for Amplifiers%<<<1 % % switches for op amps % changing input polarity % \newif\ifpgf@circuit@oa@iplusup\pgf@circuit@oa@iplusupfalse \pgfkeys{/tikz/noinv input up/.add code={}{\pgf@circuit@oa@iplusuptrue}} \ctikzset{noinv input up/.add code={}{\pgf@circuit@oa@iplusuptrue}} \pgfkeys{/tikz/noinv input down/.add code={}{\pgf@circuit@oa@iplusupfalse}} \ctikzset{noinv input down/.add code={}{\pgf@circuit@oa@iplusupfalse}} % % changing output polarity (for fully diff objects) % \newif\ifpgf@circuit@oa@oplusup\pgf@circuit@oa@oplusuptrue \pgfkeys{/tikz/noinv output up/.add code={}{\pgf@circuit@oa@oplusuptrue}} \ctikzset{noinv output up/.add code={}{\pgf@circuit@oa@oplusuptrue}} \pgfkeys{/tikz/noinv output down/.add code={}{\pgf@circuit@oa@oplusupfalse}} \ctikzset{noinv output down/.add code={}{\pgf@circuit@oa@oplusupfalse}} % Operational amplifier \ctikzset{tripoles/op amp/width/.initial=1.7} % Total width \ctikzset{tripoles/op amp/port width/.initial=.7} % Terminals length \ctikzset{tripoles/op amp/height/.initial=1.4} % Total height \ctikzset{tripoles/op amp/input height/.initial=.5} % Input port vertical separation \ctikzset{tripoles/op amp/up pos/.initial=.45} % Top and bottom anchor position \ctikzset{tripoles/op amp/font/.initial=\pgf@circ@font@tenbm} % Absolute font size needed! % Fully differential operational amplifier \ctikzset{tripoles/fd op amp/width/.initial=1.7} % Total width \ctikzset{tripoles/fd op amp/port width/.initial=.7} % Terminals length \ctikzset{tripoles/fd op amp/height/.initial=1.4} % Total height \ctikzset{tripoles/fd op amp/input height/.initial=.5} % Input port vertical separation \ctikzset{tripoles/fd op amp/output height/.initial=.5} % Output port vertical separation \ctikzset{tripoles/fd op amp/up pos/.initial=.45} % Top and bottom anchor position \ctikzset{tripoles/fd op amp/font/.initial=\pgf@circ@font@tenbm} % Absolute font size needed! \ctikzset{tripoles/en amp/width/.initial=1.7} \ctikzset{tripoles/en amp/port width/.initial=.7} \ctikzset{tripoles/en amp/height/.initial=1.6} \ctikzset{tripoles/en amp/input height/.initial=.3} \ctikzset{tripoles/en amp/up pos/.initial=.45} \ctikzset{tripoles/en amp/font/.initial=\pgf@circ@font@tenbm} % Absolute font size needed! \ctikzset{tripoles/en amp/font2/.initial=\pgf@circ@font@twelve} % Absolute font size needed! \ctikzset{tripoles/en amp/text/.initial={$\mathstrut{\triangleright}\,{\infty}$}} \tikzset{ en amp text/.code = {% \ctikzsetvalof{tripoles/en amp/text}{#1}% }, en amp text A/.code = {% \ctikzsetvalof{tripoles/en amp/text}{$\mathstrut{\triangleright}\,\mathrm{A}$}% }, } % Transconductance amplifier \ctikzset{tripoles/gm amp/width/.initial=1.7} % Total width \ctikzset{tripoles/gm amp/port width/.initial=.7} % Terminals length \ctikzset{tripoles/gm amp/height/.initial=1.4} % Left side of the trapezoid \ctikzset{tripoles/gm amp/height 2/.initial=0.5} % Right side of the trapezoid \ctikzset{tripoles/gm amp/input height/.initial=.5} % Input port vertical separation \ctikzset{tripoles/gm amp/up pos/.initial=.45} % Top and bottom anchor position \ctikzset{tripoles/gm amp/font/.initial=\pgf@circ@font@tenbm} % Absolute font size needed! % Instrumentation amplifier \ctikzset{tripoles/inst amp/width/.initial=1.7} % Total width \ctikzset{tripoles/inst amp/port width/.initial=.7} % Terminals length \ctikzset{tripoles/inst amp/height/.initial=1.4} % Left side of the trapezoid \ctikzset{tripoles/inst amp/height 2/.initial=0.6} % Right side of the trapezoid \ctikzset{tripoles/inst amp/input height/.initial=.5} % Input ports vertical separation \ctikzset{tripoles/inst amp/up pos/.initial=.4} % Top and bottom anchor position \ctikzset{tripoles/inst amp/refv pos/.initial=.7} % Top and bottom voltage reference position \ctikzset{tripoles/inst amp/font/.initial=\pgf@circ@font@tenbm} % Absolute font size needed! % Instrumentation amplifier with differential output \ctikzset{tripoles/fd inst amp/width/.initial=1.7} % Total width \ctikzset{tripoles/fd inst amp/port width/.initial=.7} % Terminals length \ctikzset{tripoles/fd inst amp/height/.initial=1.4} % Left side of the trapezoid \ctikzset{tripoles/fd inst amp/height 2/.initial=0.6} % Right side of the trapezoid \ctikzset{tripoles/fd inst amp/input height/.initial=.5} % Input ports vertical separation \ctikzset{tripoles/fd inst amp/output height/.initial=.5} % Output ports vertical separation \ctikzset{tripoles/fd inst amp/up pos/.initial=.4} % Top and bottom anchor position \ctikzset{tripoles/fd inst amp/refv pos/.initial=.7} % Top and bottom voltage reference position \ctikzset{tripoles/fd inst amp/font/.initial=\pgf@circ@font@tenbm} % Absolute font size needed! % Instrumentation amplifier with gain resistor terminals \ctikzset{tripoles/inst amp ra/width/.initial=2.4} % Total width \ctikzset{tripoles/inst amp ra/port width/.initial=.7} % Terminals length \ctikzset{tripoles/inst amp ra/height/.initial=2.9} % Left side of the trapezoid \ctikzset{tripoles/inst amp ra/height 2/.initial=0.4} % Right side of the trapezoid \ctikzset{tripoles/inst amp ra/input height/.initial=.7} % Input ports vertical separation \ctikzset{tripoles/inst amp ra/up pos/.initial=.4} % Top and bottom anchor position \ctikzset{tripoles/inst amp ra/refv pos/.initial=.7} % Top and bottom voltage reference position \ctikzset{tripoles/inst amp ra/ra pos/.initial=.6} % Gain resistor terminals vertical separation \ctikzset{tripoles/inst amp ra/font/.initial=\pgf@circ@font@tenbm} % Absolute font size needed! % Plain amplifier \ctikzset{tripoles/plain amp/width/.initial=1.7} % Total width \ctikzset{tripoles/plain amp/port width/.initial=.7} % Terminals length \ctikzset{tripoles/plain amp/height/.initial=1.4} % Total height \ctikzset{tripoles/plain amp/input height/.initial=.5} % Input ports vertical separation \ctikzset{tripoles/plain amp/up pos/.initial=.45} % Top and bottom anchor position % changing fonts and symbols of amplifiers \ctikzset{amplifiers/symbol font/.code={% \ctikzset{tripoles/inst amp ra/font=#1}% \ctikzset{tripoles/fd inst amp/font=#1}% \ctikzset{tripoles/inst amp/font=#1}% \ctikzset{tripoles/gm amp/font=#1}% \ctikzset{tripoles/en amp/font=#1}% \ctikzset{tripoles/fd op amp/font=#1}% \ctikzset{tripoles/op amp/font=#1}% }} \ctikzset{amplifiers/plus/.initial={$+$}} \ctikzset{amplifiers/minus/.initial={$-$}} \tikzset{amp symbol font/.code={% \ctikzset{amplifiers/symbol font={#1}}% } } \tikzset{amp plus/.code={\ctikzsetvalof{amplifiers/plus}{#1}}} \tikzset{amp minus/.code={\ctikzsetvalof{amplifiers/minus}{#1}}} \def\pgf@circ@ampli@plus{\ctikzvalof{amplifiers/plus}} \def\pgf@circ@ampli@minus{\ctikzvalof{amplifiers/minus}} %%>>> %% Nodes for amplifiers%<<< %% operational and instrumentation amplifiers \pgfdeclareshape{op amp} { \savedmacro{\ctikzclass}{\edef\ctikzclass{amplifiers}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \anchor{center}{\pgfpointorigin} \savedanchor\northwest{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/op amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/op amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \savedanchor\left{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@x=-\ctikzvalof{tripoles/op amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@y=0pt } \anchor{south}{ \northwest \pgf@y=-\pgf@y \pgf@x=0pt } \anchor{north}{ \northwest \pgf@x=0pt } \savedanchor\left{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@x=-\ctikzvalof{tripoles/op amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@y=0pt } \savedanchor\inOneFixed{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/op amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@y=\ctikzvalof{tripoles/op amp/input height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/op amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{in up}{ \inOneFixed } \anchor{in down}{ \inOneFixed \pgf@y=-\pgf@y } \savedanchor\inOne{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/op amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@y=\ctikzvalof{tripoles/op amp/input height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/op amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \ifpgf@circuit@oa@iplusup\pgf@y=-\pgf@y\fi } \anchor{-}{ \inOne } \anchor{+}{ \inOne \pgf@y=-\pgf@y } \savedanchor\up{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/op amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/op amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@circ@res@up = \pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgfpointlineattime{ \ctikzvalof{tripoles/op amp/up pos}}{ \pgfpoint{ \ctikzvalof{tripoles/op amp/port width}\pgf@circ@res@left} {\pgf@circ@res@up}} {\pgfpoint{\ctikzvalof{tripoles/op amp/port width}\pgf@circ@res@right}{0pt}} } \anchor{up}{ \up } \anchor{down}{ \up \pgf@y=-\pgf@y } \anchor{out}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } \anchor{west}{ \left } \anchor{east}{ \left \pgf@x=-\pgf@x } % support for border anchors \savedanchor\leftedge{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@x=-\ctikzvalof{tripoles/op amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@x = \ctikzvalof{tripoles/op amp/port width}\pgf@x \pgf@y=0pt } \anchor{leftedge}{\leftedge} \anchor{rightedge}{\leftedge \pgf@x =-\pgf@x } \anchor{bin up}{ \inOneFixed \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bin down}{ \inOneFixed \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{b-}{ \inOne \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{b+}{ \inOne \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bout}{ \leftedge \pgf@y=0pt \pgf@x=-\pgf@x } % end border anchors \anchor{south west}{ \northwest \pgf@y=-\pgf@y } \anchor{north east}{ \northwest \pgf@x=-\pgf@x } \anchor{north west}{ \northwest } \anchor{south east}{ \northwest \pgf@x=-\pgf@x \pgf@y=-\pgf@y } \anchor{text}{ \ifpgf@circ@center@text \pgf@x=\dimexpr -.6\wd\pgfnodeparttextbox\relax \else \leftedge \pgfmathsetlength{\pgf@x}{\pgf@x + \ctikzvalof{left text distance}} \fi \pgf@y=\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox\relax } \backgroundpath{ \pgfsetcolor{\ctikzvalof{color}} \northwest \pgf@circ@res@up = \pgf@y \pgf@circ@res@down = -\pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgf@circ@scaled@Rlen=\scaledRlen % Triangle \pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgftransformxshift{\ctikzvalof{tripoles/op amp/port width}\pgf@circ@res@left} \pgf@circ@res@step=\pgf@circ@res@right \advance\pgf@circ@res@step by -\pgf@circ@res@left \pgf@circ@res@step=\ctikzvalof{tripoles/op amp/port width}\pgf@circ@res@step \pgfpathmoveto{\pgfpoint{\pgf@circ@res@step}{0pt}} \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@down}} \pgfpathclose \pgf@circ@draworfill \endpgfscope % Negative input terminal \pgfpathmoveto{\pgfpoint {\pgf@circ@res@left} {\ctikzvalof{tripoles/op amp/input height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/op amp/port width}\pgf@circ@res@left} {\ctikzvalof{tripoles/op amp/input height}\pgf@circ@res@up}} \pgftext[left, at=\pgfpoint{\ctikzvalof{tripoles/op amp/port width}\pgf@circ@res@left}{\ctikzvalof{tripoles/op amp/input height}\pgf@circ@res@up}]{\ctikzvalof{tripoles/op amp/font} \ifpgf@circuit@oa@iplusup\pgf@circ@ampli@plus\else\pgf@circ@ampli@minus\fi} % Positive input terminal \pgfpathmoveto{\pgfpoint {\pgf@circ@res@left} {\ctikzvalof{tripoles/op amp/input height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/op amp/port width}\pgf@circ@res@left} {\ctikzvalof{tripoles/op amp/input height}\pgf@circ@res@down}} \pgftext[left, at=\pgfpoint{\ctikzvalof{tripoles/op amp/port width}\pgf@circ@res@left}{\ctikzvalof{tripoles/op amp/input height}\pgf@circ@res@down}]{\ctikzvalof{tripoles/op amp/font} \ifpgf@circuit@oa@iplusup\pgf@circ@ampli@minus\else\pgf@circ@ampli@plus\fi} % Output terminal \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/op amp/port width}\pgf@circ@res@right}{0pt}} \pgfsetrectcap \pgfusepath{draw} } } % Op amp shape as in european standard EN 60617 \pgfdeclareshape{en amp} { \savedmacro{\ctikzclass}{\edef\ctikzclass{amplifiers}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \anchor{center}{\pgfpointorigin} \savedanchor\northwest{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/en amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/en amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \savedanchor\left{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@x=-\ctikzvalof{tripoles/en amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@y=0pt } \anchor{south}{ \northwest \pgf@y=-\pgf@y \pgf@x=0pt } \anchor{north}{ \northwest \pgf@x=0pt } \savedanchor\inOneFixed{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/en amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@y=\ctikzvalof{tripoles/en amp/input height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/en amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{in up}{ \inOneFixed } \anchor{in down}{ \inOneFixed \pgf@y=-\pgf@y } \savedanchor\inOne{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/en amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@y=\ctikzvalof{tripoles/en amp/input height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/en amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \ifpgf@circuit@oa@iplusup\pgf@y=-\pgf@y\fi } \anchor{-}{ \inOne } \anchor{+}{ \inOne \pgf@y=-\pgf@y } \anchor{up}{ \northwest \pgf@x=0pt } \anchor{down}{ \northwest \pgf@x=0pt \pgf@y=-\pgf@y } \anchor{out}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } \anchor{west}{ \left } \anchor{east}{ \left \pgf@x=-\pgf@x } % support for border anchors \savedanchor\leftedge{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@x=-\ctikzvalof{tripoles/en amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@x = \ctikzvalof{tripoles/en amp/port width}\pgf@x \pgf@y=0pt } \anchor{leftedge}{\leftedge} \anchor{rightedge}{\leftedge \pgf@x =-\pgf@x } \anchor{bin up}{ \inOneFixed \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bin down}{ \inOneFixed \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{b-}{ \inOne \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{b+}{ \inOne \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bout}{ \leftedge \pgf@y=0pt \pgf@x=-\pgf@x } % end border anchors \anchor{south west}{ \northwest \pgf@y=-\pgf@y } \anchor{north east}{ \northwest \pgf@x=-\pgf@x } \anchor{north west}{ \northwest } \anchor{south east}{ \northwest \pgf@x=-\pgf@x \pgf@y=-\pgf@y } \anchor{text}{ \ifpgf@circ@center@text \pgf@x=\dimexpr -.6\wd\pgfnodeparttextbox\relax \else \leftedge \pgfmathsetlength{\pgf@x}{\pgf@x + \ctikzvalof{left text distance}} \fi \pgf@y=\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox\relax } \backgroundpath{ \pgfsetcolor{\ctikzvalof{color}} \northwest \pgf@circ@res@up = \pgf@y \pgf@circ@res@down = -\pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgf@circ@scaled@Rlen=\scaledRlen \pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgfpathmoveto{\pgfpoint{\ctikzvalof{tripoles/en amp/port width}\pgf@circ@res@left}{\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/en amp/port width}\pgf@circ@res@left}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/en amp/port width}\pgf@circ@res@right}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/en amp/port width}\pgf@circ@res@right}{\pgf@circ@res@down}} \pgfpathclose \pgf@circ@draworfill \endpgfscope \pgfpathmoveto{\pgfpoint {\pgf@circ@res@left} {\ctikzvalof{tripoles/en amp/input height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/en amp/port width}\pgf@circ@res@left} {\ctikzvalof{tripoles/en amp/input height}\pgf@circ@res@up}} \pgftext[left, at=\pgfpoint{\ctikzvalof{tripoles/en amp/port width}\pgf@circ@res@left}{\ctikzvalof{tripoles/en amp/input height}\pgf@circ@res@up}]{\ctikzvalof{tripoles/en amp/font} \ifpgf@circuit@oa@iplusup\pgf@circ@ampli@plus\else\pgf@circ@ampli@minus\fi} \pgfpathmoveto{\pgfpoint {\pgf@circ@res@left} {\ctikzvalof{tripoles/en amp/input height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/en amp/port width}\pgf@circ@res@left} {\ctikzvalof{tripoles/en amp/input height}\pgf@circ@res@down}} \pgftext[left, at=\pgfpoint{\ctikzvalof{tripoles/en amp/port width}\pgf@circ@res@left}{\ctikzvalof{tripoles/en amp/input height}\pgf@circ@res@down}]{\ctikzvalof{tripoles/en amp/font} \ifpgf@circuit@oa@iplusup\pgf@circ@ampli@minus\else\pgf@circ@ampli@plus\fi} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@right}{0pt}} \pgfsetrectcap \pgfusepath{draw} \pgftext[top, y=-.5ex, at=\pgfpoint{0pt}{\pgf@circ@res@up}]{\hbox{\ctikzvalof{tripoles/en amp/font2}\ctikzvalof{tripoles/en amp/text}}} % \pgftext[top, y=-.5ex, at=\pgfpoint{0pt}{\pgf@circ@res@up}]{\ctikzvalof{tripoles/en amp/font2}$\mathstrut{\triangleright}\,\mathrm{A}$} } } % Fully differential output op amp % Contributed by Kristofer M. Monisit \pgfdeclareshape{fd op amp} { \savedmacro{\ctikzclass}{\edef\ctikzclass{amplifiers}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \anchor{center}{\pgfpointorigin} \savedanchor\northwest{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/fd op amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/fd op amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \savedanchor\outline{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/fd op amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/fd op amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \ifpgf@circuit@oa@oplusup\else\pgf@y=-\pgf@y\fi } \anchor{south}{ \northwest \pgf@y=-\pgf@y\pgf@x=0pt\relax } \anchor{north}{ \northwest\pgf@x=0pt\relax } \savedanchor\left{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@x=-\ctikzvalof{tripoles/fd op amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@y=0pt } \savedanchor\inOneFixed{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/fd op amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@y=\ctikzvalof{tripoles/fd op amp/input height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/fd op amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{in up}{ \inOneFixed } \anchor{in down}{ \inOneFixed \pgf@y=-\pgf@y } \savedanchor\inOne{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/fd op amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@y=\ctikzvalof{tripoles/fd op amp/input height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/fd op amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \ifpgf@circuit@oa@iplusup\pgf@y=-\pgf@y\fi } \anchor{-}{ \inOne } \anchor{+}{ \inOne \pgf@y=-\pgf@y } \savedanchor\up{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/fd op amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/fd op amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@circ@res@up = \pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgfpointlineattime{ \ctikzvalof{tripoles/fd op amp/up pos}}{ \pgfpoint{ \ctikzvalof{tripoles/fd op amp/port width}\pgf@circ@res@left} {\pgf@circ@res@up}} {\pgfpoint{\ctikzvalof{tripoles/fd op amp/port width}\pgf@circ@res@right}{0pt}} } \anchor{up}{ \up } \anchor{down}{ \up \pgf@y=-\pgf@y } \anchor{out up}{ \northwest \pgf@y=\ctikzvalof{tripoles/fd op amp/output height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/fd op amp/port width}\pgf@x } \anchor{out down}{ \northwest \pgf@y=-\ctikzvalof{tripoles/fd op amp/output height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/fd op amp/port width}\pgf@x } \anchor{out +}{ \outline \pgf@y=\ctikzvalof{tripoles/fd op amp/output height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/fd op amp/port width}\pgf@x } \anchor{out -}{ \outline \pgf@y=-\ctikzvalof{tripoles/fd op amp/output height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/fd op amp/port width}\pgf@x } % support for border anchors \savedanchor\leftedge{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@x=-\ctikzvalof{tripoles/fd op amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@x = \ctikzvalof{tripoles/fd op amp/port width}\pgf@x \pgf@y=0pt } \anchor{leftedge}{\leftedge} \anchor{rightedge}{\leftedge \pgf@x =-\pgf@x } \anchor{bin up}{ \inOneFixed \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bin down}{ \inOneFixed \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{b-}{ \inOne \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{b+}{ \inOne \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bout}{ \leftedge \pgf@y=0pt \pgf@x=-\pgf@x } \anchor{bout +}{ \outline \pgf@xa=\pgf@x\pgf@ya=\pgf@y \pgfpointlineattime{\ctikzvalof{tripoles/fd op amp/output height}} {\pgfpoint{\pgf@xa}{0pt}} {\pgfpoint{0pt}{\pgf@ya}} } \anchor{bout -}{ \outline \pgf@xa=\pgf@x\pgf@ya=\pgf@y \pgfpointlineattime{\ctikzvalof{tripoles/fd op amp/output height}} {\pgfpoint{\pgf@xa}{0pt}} {\pgfpoint{0pt}{\pgf@ya}} \pgf@y=-\pgf@y } \anchor{bout up}{ \northwest \pgf@xa=\pgf@x\pgf@ya=\pgf@y \pgfpointlineattime{\ctikzvalof{tripoles/fd op amp/output height}} {\pgfpoint{\pgf@xa}{0pt}} {\pgfpoint{0pt}{\pgf@ya}} } \anchor{bout down}{ \northwest \pgf@xa=\pgf@x\pgf@ya=\pgf@y \pgfpointlineattime{\ctikzvalof{tripoles/fd op amp/output height}} {\pgfpoint{\pgf@xa}{0pt}} {\pgfpoint{0pt}{\pgf@ya}} \pgf@y=-\pgf@y } % end border anchors \anchor{west}{ \left } \anchor{east}{ \left \pgf@x=-\ctikzvalof{tripoles/fd op amp/port width}\pgf@x } \anchor{out}{% should not be used \left \pgf@x=-\ctikzvalof{tripoles/fd op amp/port width}\pgf@x } \anchor{south west}{ \northwest \pgf@y=-\pgf@y } \anchor{north east}{ \northwest \pgf@x=-\ctikzvalof{tripoles/fd op amp/port width}\pgf@x } \anchor{north west}{ \northwest } \anchor{south east}{ \northwest \pgf@x=-\ctikzvalof{tripoles/fd op amp/port width}\pgf@x \pgf@y=-\pgf@y } \anchor{text}{ \ifpgf@circ@center@text \pgf@x=\dimexpr -.6\wd\pgfnodeparttextbox\relax \else \leftedge \pgfmathsetlength{\pgf@x}{\pgf@x + \ctikzvalof{left text distance}} \fi \pgf@y=\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox\relax } \backgroundpath{ \pgfsetcolor{\ctikzvalof{color}} \northwest \pgf@circ@res@up = \pgf@y \pgf@circ@res@down = -\pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgf@circ@scaled@Rlen=\scaledRlen % Triangle % Includes output terminals in the traingular shape % to ensure that diagonal joins are properly displayed % we first draw the main triangle and the leads with normal thickness, % and the redraw the main triangle with the component shape \pgfscope % shift origin a bit to ease calculations \pgftransformxshift{\ctikzvalof{tripoles/fd op amp/port width}\pgf@circ@res@left} \pgf@circ@res@step=\pgf@circ@res@right \advance\pgf@circ@res@step by -\pgf@circ@res@left \pgf@circ@res@step=\ctikzvalof{tripoles/fd op amp/port width}\pgf@circ@res@step % Initial point (right vertex) \pgfpathmoveto{\pgfpoint{\pgf@circ@res@step}{0pt}} % Negative output terminal \pgfpathlineto{\pgfpointlineattime{\ctikzvalof{tripoles/fd op amp/output height}}{\pgfpoint{\pgf@circ@res@step}{0pt}}{\pgfpoint{0pt}{\pgf@circ@res@up}}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@step}{\ctikzvalof{tripoles/fd op amp/output height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpointlineattime{\ctikzvalof{tripoles/fd op amp/output height}}{\pgfpoint{\pgf@circ@res@step}{0pt}}{\pgfpoint{0pt}{\pgf@circ@res@up}}} % Top vertex \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@up}} % Bottom vertex \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@down}} % Positive output terminal \pgfpathlineto{\pgfpointlineattime{\ctikzvalof{tripoles/fd op amp/output height}}{\pgfpoint{\pgf@circ@res@step}{0pt}}{\pgfpoint{0pt}{\pgf@circ@res@down}}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@step}{\ctikzvalof{tripoles/fd op amp/output height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpointlineattime{\ctikzvalof{tripoles/fd op amp/output height}}{\pgfpoint{\pgf@circ@res@step}{0pt}}{\pgfpoint{0pt}{\pgf@circ@res@down}}} % Right vertex \pgfpathlineto{\pgfpoint{\pgf@circ@res@step}{0pt}} \pgfpathclose \pgfusepath{stroke} % ok, now we'll redraw the triangle with the class specific % thickness and optionally fill \pgfscope \pgf@circ@setlinewidth{quadpoles}{\pgflinewidth} % Initial point (right vertex) \pgfpathmoveto{\pgfpoint{\pgf@circ@res@step}{0pt}} % Top vertex \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@up}} % Bottom vertex \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@down}} \pgfpathclose \pgf@circ@draworfill \endpgfscope % thick and fill \endpgfscope % shift % Negative input terminal \pgfpathmoveto{\pgfpoint {\pgf@circ@res@left} {\ctikzvalof{tripoles/fd op amp/input height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/fd op amp/port width}\pgf@circ@res@left} {\ctikzvalof{tripoles/fd op amp/input height}\pgf@circ@res@up}} \pgftext[left, at=\pgfpoint{\ctikzvalof{tripoles/fd op amp/port width}\pgf@circ@res@left}{\ctikzvalof{tripoles/fd op amp/input height}\pgf@circ@res@up}]{\ctikzvalof{tripoles/fd op amp/font} \ifpgf@circuit@oa@iplusup\pgf@circ@ampli@plus\else\pgf@circ@ampli@minus\fi} % Positive input terminal \pgfpathmoveto{\pgfpoint {\pgf@circ@res@left} {\ctikzvalof{tripoles/fd op amp/input height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/fd op amp/port width}\pgf@circ@res@left} {\ctikzvalof{tripoles/fd op amp/input height}\pgf@circ@res@down}} \pgftext[left, at=\pgfpoint{\ctikzvalof{tripoles/fd op amp/port width}\pgf@circ@res@left}{\ctikzvalof{tripoles/fd op amp/input height}\pgf@circ@res@down}]{\ctikzvalof{tripoles/fd op amp/font} \ifpgf@circuit@oa@iplusup\pgf@circ@ampli@minus\else\pgf@circ@ampli@plus\fi} % Negative output terminal label \pgftext[right, bottom, x=3pt, y=1pt, at=\pgfpoint{0pt}{0.425\pgf@circ@res@down}]{\ctikzvalof{tripoles/fd op amp/font} \ifpgf@circuit@oa@oplusup\pgf@circ@ampli@minus\else\pgf@circ@ampli@plus\fi} % Positive output terminal label \pgftext[right, top, x=3pt, y=-1pt, at=\pgfpoint{0pt}{0.425\pgf@circ@res@up}]{\ctikzvalof{tripoles/fd op amp/font} \ifpgf@circuit@oa@oplusup\pgf@circ@ampli@plus\else\pgf@circ@ampli@minus\fi} \pgfsetrectcap \pgfusepath{draw} } } % Instrumentation amplifier with differential output \pgfdeclareshape{fd inst amp} { \savedmacro{\ctikzclass}{\edef\ctikzclass{amplifiers}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} % when tikz calls the anchor it wants the relative position in the lengths % \pgf@x \pgf@y % \pgfpoint* functions set that variables % anchors are visible outside and run on use \anchor{center}{\pgfpointorigin} % savedanchors are internals and run on node creation (not use) % bounding-box top left \savedanchor\northwest{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/fd inst amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/fd inst amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{nw}{ \northwest } \anchor{south}{ \northwest \pgf@y=-\pgf@y\pgf@x=0pt\relax } \anchor{north}{ \northwest\pgf@x=0pt\relax } \savedanchor\left{% \pgf@y=0pt } \anchor{leftedge} {\left \pgf@x = \ctikzvalof{tripoles/fd inst amp/port width}\pgf@x } \savedanchor\inOneFixed{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/fd inst amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@y=\ctikzvalof{tripoles/fd inst amp/input height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/fd inst amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{in up}{ \inOneFixed } \anchor{in down}{ \inOneFixed \pgf@y=-\pgf@y } \savedanchor\inOne{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/fd inst amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@y=\ctikzvalof{tripoles/fd inst amp/input height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/fd inst amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \ifpgf@circuit@oa@iplusup\pgf@y=-\pgf@y\fi } \anchor{-}{ \inOne } \anchor{+}{ \inOne \pgf@y=-\pgf@y } \savedanchor\up{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/fd inst amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/fd inst amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@circ@res@up = \pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgfpointlineattime{ \ctikzvalof{tripoles/fd inst amp/up pos}}{ \pgfpoint{ \ctikzvalof{tripoles/fd inst amp/port width}\pgf@circ@res@left} {\pgf@circ@res@up}} {\pgfpoint{\ctikzvalof{tripoles/fd inst amp/port width}\pgf@circ@res@right}{\ctikzvalof{tripoles/fd inst amp/height 2}\pgf@circ@res@up}} } \anchor{up}{ \up } \anchor{down}{ \up \pgf@y=-\pgf@y } % reference voltage input anchors. \savedanchor\refv{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/fd inst amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/fd inst amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@circ@res@up = \pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgfpointlineattime{ \ctikzvalof{tripoles/fd inst amp/refv pos}}{ \pgfpoint{ \ctikzvalof{tripoles/fd inst amp/port width}\pgf@circ@res@left} {\pgf@circ@res@up}} {\pgfpoint{\ctikzvalof{tripoles/fd inst amp/port width}\pgf@circ@res@right}{\ctikzvalof{tripoles/fd inst amp/height 2}\pgf@circ@res@up}} } % we need both because they are normally drawn under the amp, and if you % mirror it vertically you need them \anchor{refv up}{ \refv } \anchor{refv down}{ \refv \pgf@y=-\pgf@y } \savedanchor\outport{ \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/fd inst amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@y=\ctikzvalof{tripoles/fd inst amp/input height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/fd inst amp/width}\pgf@circ@scaled@Rlen \pgf@x=-.5\pgf@x \ifpgf@circuit@oa@oplusup\else\pgf@y=-\pgf@y\fi } \anchor{out}{ \outport \pgf@y=0pt } \anchor{out +}{ \outport } \anchor{out -}{ \outport \pgf@y=-\pgf@y } \savedanchor\outportfixed{ \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/fd inst amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@y=\ctikzvalof{tripoles/fd inst amp/input height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/fd inst amp/width}\pgf@circ@scaled@Rlen \pgf@x=-.5\pgf@x } \anchor{out up}{ \outportfixed } \anchor{out down}{ \outportfixed \pgf@y=-\pgf@y } % support for border anchors \savedanchor\leftedge{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@x=-\ctikzvalof{tripoles/fd inst amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@x = \ctikzvalof{tripoles/fd inst amp/port width}\pgf@x \pgf@y=0pt } \anchor{leftedge}{\leftedge} \anchor{rightedge}{\leftedge \pgf@x =-\pgf@x } \anchor{bin up}{ \inOneFixed \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bin down}{ \inOneFixed \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{b-}{ \inOne \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{b+}{ \inOne \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bout}{ \leftedge \pgf@x=-\pgf@x \pgf@y=0pt } \anchor{bout +}{ \outport \pgf@ya=\pgf@y \leftedge \pgf@x=-\pgf@x \pgf@y=\pgf@ya } \anchor{bout -}{ \outport \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@x=-\pgf@x \pgf@y=\pgf@ya } \anchor{bout up}{ \outportfixed \pgf@ya=\pgf@y \leftedge \pgf@x=-\pgf@x \pgf@y=\pgf@ya } \anchor{bout down}{ \outportfixed \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@x=-\pgf@x \pgf@y=\pgf@ya } % end border anchors % \anchor{west}{ \left } \anchor{east}{ \left \pgf@x=-\pgf@x } \anchor{south west}{ \northwest \pgf@y=-\pgf@y } \anchor{north east}{ \northwest \pgf@x=-\pgf@x } \anchor{north west}{ \northwest } \anchor{south east}{ \northwest \pgf@x=-\pgf@x \pgf@y=-\pgf@y } \anchor{text}{ \ifpgf@circ@center@text \pgf@x=\dimexpr -.6\wd\pgfnodeparttextbox\relax \else \leftedge \pgfmathsetlength{\pgf@x}{\pgf@x + \ctikzvalof{left text distance}} \fi \pgf@y=\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox\relax } % let's start drawing the component \backgroundpath{ \pgfsetcolor{\ctikzvalof{color}} % \northwest \pgf@circ@res@up = \pgf@y \pgf@circ@res@down = -\pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgf@circ@scaled@Rlen=\scaledRlen % main component, normally in thicker lines \pgfscope \newdimen\pgf@circ@res@right@double \pgf@circ@res@right@double=2\pgf@circ@res@right \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgftransformxshift{\ctikzvalof{tripoles/fd inst amp/port width}\pgf@circ@res@left} \pgf@circ@res@step=\pgf@circ@res@right \advance\pgf@circ@res@step by -\pgf@circ@res@left \pgf@circ@res@step=\ctikzvalof{tripoles/fd inst amp/port width}\pgf@circ@res@step %first point (near output) \pgfpathmoveto{\pgfpoint{\ctikzvalof{tripoles/fd inst amp/port width}\pgf@circ@res@right@double}{0}} %from the exit to the top (short side)... (note that the .6 must be copied in \up and \refv anchors \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/fd inst amp/port width}\pgf@circ@res@right@double}{\ctikzvalof{tripoles/fd inst amp/height 2}\pgf@circ@res@up}} % and then to the input "front up", "down", to the output short side "down" \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/fd inst amp/port width}\pgf@circ@res@right@double}{\ctikzvalof{tripoles/fd inst amp/height 2}\pgf@circ@res@down}} % ...and close \pgfpathclose \pgf@circ@draworfill \endpgfscope % input terminal up \pgfpathmoveto{\pgfpoint {\pgf@circ@res@left} {\ctikzvalof{tripoles/fd inst amp/input height}\pgf@circ@res@up}} % \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/fd inst amp/port width}\pgf@circ@res@left} {\ctikzvalof{tripoles/fd inst amp/input height}\pgf@circ@res@up}} % \pgftext[left, at=\pgfpoint{\ctikzvalof{tripoles/fd inst amp/port width}\pgf@circ@res@left}{\ctikzvalof{tripoles/fd inst amp/input height}\pgf@circ@res@up}]{\ctikzvalof{tripoles/fd inst amp/font} \ifpgf@circuit@oa@iplusup\pgf@circ@ampli@plus\else\pgf@circ@ampli@minus\fi} % input terminal down \pgfpathmoveto{\pgfpoint {\pgf@circ@res@left} {\ctikzvalof{tripoles/fd inst amp/input height}\pgf@circ@res@down}} % \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/fd inst amp/port width}\pgf@circ@res@left} {\ctikzvalof{tripoles/fd inst amp/input height}\pgf@circ@res@down}} \pgftext[left, at=\pgfpoint{\ctikzvalof{tripoles/fd inst amp/port width}\pgf@circ@res@left}{\ctikzvalof{tripoles/fd inst amp/input height}\pgf@circ@res@down}]{\ctikzvalof{tripoles/fd inst amp/font} \ifpgf@circuit@oa@iplusup\pgf@circ@ampli@minus\else\pgf@circ@ampli@plus\fi} % output leads down and up \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\ctikzvalof{tripoles/fd inst amp/output height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/fd inst amp/port width}\pgf@circ@res@right}{\ctikzvalof{tripoles/fd inst amp/output height}\pgf@circ@res@down}} % \pgftext[right, at=\pgfpoint{\ctikzvalof{tripoles/fd inst amp/port width}\pgf@circ@res@right}{\ctikzvalof{tripoles/fd inst amp/output height}\pgf@circ@res@down}]{\ctikzvalof{tripoles/fd inst amp/font}\ifpgf@circuit@oa@oplusup$-\;$\else$+\;$\fi} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\ctikzvalof{tripoles/fd inst amp/output height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/fd inst amp/port width}\pgf@circ@res@right}{\ctikzvalof{tripoles/fd inst amp/output height}\pgf@circ@res@up}} % \pgftext[right, at=\pgfpoint{\ctikzvalof{tripoles/fd inst amp/port width}\pgf@circ@res@right}{\ctikzvalof{tripoles/fd inst amp/output height}\pgf@circ@res@up}]{\ctikzvalof{tripoles/fd inst amp/font}\ifpgf@circuit@oa@oplusup$+\;$\else$-\;$\fi} % \pgfsetrectcap \pgfusepath{draw} } } % Transconductance amplifier (Transkonduktanzverstärker) \pgfdeclareshape{gm amp} { \savedmacro{\ctikzclass}{\edef\ctikzclass{amplifiers}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \anchor{center}{\pgfpointorigin} \savedanchor\northwest{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/gm amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/gm amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{south}{ \northwest \pgf@y=-\pgf@y } \anchor{north}{ \northwest } \savedanchor\left{% \pgf@y=0pt } \anchor{leftedge} {\left \pgf@x = \ctikzvalof{tripoles/op amp/port width}\pgf@x } \savedanchor\inOneFixed{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/gm amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@y=\ctikzvalof{tripoles/gm amp/input height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/gm amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{in up}{ \inOneFixed } \anchor{in down}{ \inOneFixed \pgf@y=-\pgf@y } \savedanchor\inOne{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/gm amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@y=\ctikzvalof{tripoles/gm amp/input height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/gm amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \ifpgf@circuit@oa@iplusup\pgf@y=-\pgf@y\fi } \anchor{-}{ \inOne } \anchor{+}{ \inOne \pgf@y=-\pgf@y } \savedanchor\up{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/gm amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/gm amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@circ@res@up = \pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgfpointlineattime{ \ctikzvalof{tripoles/gm amp/up pos}}{ \pgfpoint{ \ctikzvalof{tripoles/gm amp/port width}\pgf@circ@res@left} {\pgf@circ@res@up}} {\pgfpoint{\ctikzvalof{tripoles/gm amp/port width}\pgf@circ@res@right}{\ctikzvalof{tripoles/gm amp/height 2}\pgf@circ@res@up}} } \anchor{up}{ \up } \anchor{down}{ \up \pgf@y=-\pgf@y } \anchor{out}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } % support for border anchors \savedanchor\leftedge{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@x=-\ctikzvalof{tripoles/gm amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@x = \ctikzvalof{tripoles/gm amp/port width}\pgf@x \pgf@y=0pt } \anchor{leftedge}{\leftedge} \anchor{rightedge}{\leftedge \pgf@x =-\pgf@x } \anchor{bin up}{ \inOneFixed \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bin down}{ \inOneFixed \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{b-}{ \inOne \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{b+}{ \inOne \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bout}{ \leftedge \pgf@y=0pt \pgf@x=-\pgf@x } % end border anchors \anchor{west}{ \left } \anchor{east}{ \left \pgf@x=-\pgf@x } \anchor{south west}{ \northwest \pgf@y=-\pgf@y } \anchor{north east}{ \northwest \pgf@x=-\pgf@x } \anchor{north west}{ \northwest } \anchor{south east}{ \northwest \pgf@x=-\pgf@x \pgf@y=-\pgf@y } \anchor{text}{ \ifpgf@circ@center@text \pgf@x=\dimexpr -.6\wd\pgfnodeparttextbox\relax \else \leftedge \pgfmathsetlength{\pgf@x}{\pgf@x + \ctikzvalof{left text distance}} \fi \pgf@y=\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox\relax } \backgroundpath{ \pgfsetcolor{\ctikzvalof{color}} \northwest \pgf@circ@res@up = \pgf@y \pgf@circ@res@down = -\pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgf@circ@scaled@Rlen=\scaledRlen \pgfscope \newdimen\pgf@circ@res@right@double \pgf@circ@res@right@double=2\pgf@circ@res@right \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgftransformxshift{\ctikzvalof{tripoles/gm amp/port width}\pgf@circ@res@left} \pgf@circ@res@step=\pgf@circ@res@right \advance\pgf@circ@res@step by -\pgf@circ@res@left \pgf@circ@res@step=\ctikzvalof{tripoles/gm amp/port width}\pgf@circ@res@step %Umrandung: \pgfpathmoveto{\pgfpoint{\ctikzvalof{tripoles/gm amp/port width}\pgf@circ@res@right@double}{0}} %geändert startpunkt neu am ausgangsstrich \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/gm amp/port width}\pgf@circ@res@right@double}{\ctikzvalof{tripoles/gm amp/height 2}\pgf@circ@res@up}}%vom Ausgang nach oben \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@up}} %neu ecke links oben nach rechts oben \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@down}} %bei deneigängen runter \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/gm amp/port width}\pgf@circ@res@right@double}{\ctikzvalof{tripoles/gm amp/height 2}\pgf@circ@res@down}}%ecke links unten nach rechts unten \pgfpathclose \pgf@circ@draworfill \endpgfscope \pgfpathmoveto{\pgfpoint {\pgf@circ@res@left} {\ctikzvalof{tripoles/gm amp/input height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/gm amp/port width}\pgf@circ@res@left} {\ctikzvalof{tripoles/gm amp/input height}\pgf@circ@res@up}} \pgftext[left, at=\pgfpoint{\ctikzvalof{tripoles/gm amp/port width}\pgf@circ@res@left}{\ctikzvalof{tripoles/gm amp/input height}\pgf@circ@res@up}]{\ctikzvalof{tripoles/gm amp/font} \ifpgf@circuit@oa@iplusup\pgf@circ@ampli@plus\else\pgf@circ@ampli@minus\fi} \pgfpathmoveto{\pgfpoint {\pgf@circ@res@left} {\ctikzvalof{tripoles/gm amp/input height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/gm amp/port width}\pgf@circ@res@left} {\ctikzvalof{tripoles/gm amp/input height}\pgf@circ@res@down}} \pgftext[left, at=\pgfpoint{\ctikzvalof{tripoles/gm amp/port width}\pgf@circ@res@left}{\ctikzvalof{tripoles/gm amp/input height}\pgf@circ@res@down}]{\ctikzvalof{tripoles/gm amp/font} \ifpgf@circuit@oa@iplusup\pgf@circ@ampli@minus\else\pgf@circ@ampli@plus\fi} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/gm amp/port width}\pgf@circ@res@right}{0pt}} % \pgfsetrectcap \pgfusepath{draw} } } % Instrumentation amplifier \pgfdeclareshape{inst amp} { \savedmacro{\ctikzclass}{\edef\ctikzclass{amplifiers}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} % when tikz calls the anchor it wants the relative position in the lengths % \pgf@x \pgf@y % \pgfpoint* functions set that variables % anchors are visible outside and run on use \anchor{center}{\pgfpointorigin} % savedanchors are internals and run on node creation (not use) % bounding-box top left \savedanchor\northwest{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/inst amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/inst amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{nw}{ \northwest } \anchor{south}{ \northwest \pgf@y=-\pgf@y } \anchor{north}{ \northwest } \savedanchor\left{% \pgf@y=0pt } \anchor{leftedge} {\left \pgf@x = \ctikzvalof{tripoles/op amp/port width}\pgf@x } \savedanchor\inOneFixed{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/inst amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@y=\ctikzvalof{tripoles/inst amp/input height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/inst amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{in up}{ \inOneFixed } \anchor{in down}{ \inOneFixed \pgf@y=-\pgf@y } \savedanchor\inOne{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/inst amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@y=\ctikzvalof{tripoles/inst amp/input height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/inst amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \ifpgf@circuit@oa@iplusup\pgf@y=-\pgf@y\fi } \anchor{-}{ \inOne } \anchor{+}{ \inOne \pgf@y=-\pgf@y } \savedanchor\up{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/inst amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/inst amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@circ@res@up = \pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgfpointlineattime{ \ctikzvalof{tripoles/inst amp/up pos}}{ \pgfpoint{ \ctikzvalof{tripoles/inst amp/port width}\pgf@circ@res@left} {\pgf@circ@res@up}} {\pgfpoint{\ctikzvalof{tripoles/inst amp/port width}\pgf@circ@res@right}{\ctikzvalof{tripoles/inst amp/height 2}\pgf@circ@res@up}} } \anchor{up}{ \up } \anchor{down}{ \up \pgf@y=-\pgf@y } % reference voltage input anchors. \savedanchor\refv{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/inst amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/inst amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@circ@res@up = \pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgfpointlineattime{ \ctikzvalof{tripoles/inst amp/refv pos}}{ \pgfpoint{ \ctikzvalof{tripoles/inst amp/port width}\pgf@circ@res@left} {\pgf@circ@res@up}} {\pgfpoint{\ctikzvalof{tripoles/inst amp/port width}\pgf@circ@res@right}{\ctikzvalof{tripoles/inst amp/height 2}\pgf@circ@res@up}} } % we need both because they are normally drawn under the amp, and if you % mirror it vertically you need them \anchor{refv up}{ \refv } \anchor{refv down}{ \refv \pgf@y=-\pgf@y } \anchor{out}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } % support for border anchors \savedanchor\leftedge{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@x=-\ctikzvalof{tripoles/inst amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@x = \ctikzvalof{tripoles/inst amp/port width}\pgf@x \pgf@y=0pt } \anchor{leftedge}{\leftedge} \anchor{rightedge}{\leftedge \pgf@x =-\pgf@x } \anchor{bin up}{ \inOneFixed \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bin down}{ \inOneFixed \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{b-}{ \inOne \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{b+}{ \inOne \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bout}{ \leftedge \pgf@y=0pt \pgf@x=-\pgf@x } % end border anchors \anchor{west}{ \left } \anchor{east}{ \left \pgf@x=-\pgf@x } \anchor{south west}{ \northwest \pgf@y=-\pgf@y } \anchor{north east}{ \northwest \pgf@x=-\pgf@x } \anchor{north west}{ \northwest } \anchor{south east}{ \northwest \pgf@x=-\pgf@x \pgf@y=-\pgf@y } \anchor{text}{ \ifpgf@circ@center@text \pgf@x=\dimexpr -.6\wd\pgfnodeparttextbox\relax \else \leftedge \pgfmathsetlength{\pgf@x}{\pgf@x + \ctikzvalof{left text distance}} \fi \pgf@y=\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox\relax } % let's start drawing the component \backgroundpath{ \pgfsetcolor{\ctikzvalof{color}} % \northwest \pgf@circ@res@up = \pgf@y \pgf@circ@res@down = -\pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgf@circ@scaled@Rlen=\scaledRlen % main component, normally in thicker lines \pgfscope \newdimen\pgf@circ@res@right@double \pgf@circ@res@right@double=2\pgf@circ@res@right \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgftransformxshift{\ctikzvalof{tripoles/inst amp/port width}\pgf@circ@res@left} \pgf@circ@res@step=\pgf@circ@res@right \advance\pgf@circ@res@step by -\pgf@circ@res@left \pgf@circ@res@step=\ctikzvalof{tripoles/inst amp/port width}\pgf@circ@res@step %first point (near output) \pgfpathmoveto{\pgfpoint{\ctikzvalof{tripoles/inst amp/port width}\pgf@circ@res@right@double}{0}} %from the exit to the top (short side)... (note that the .6 must be copied in \up and \refv anchors \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/inst amp/port width}\pgf@circ@res@right@double}{\ctikzvalof{tripoles/inst amp/height 2}\pgf@circ@res@up}} % and then to the input "front up", "down", to the output short side "down" \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/inst amp/port width}\pgf@circ@res@right@double}{\ctikzvalof{tripoles/inst amp/height 2}\pgf@circ@res@down}} % ...and close \pgfpathclose \pgf@circ@draworfill \endpgfscope % Negative input terminal \pgfpathmoveto{\pgfpoint {\pgf@circ@res@left} {\ctikzvalof{tripoles/inst amp/input height}\pgf@circ@res@up}} % \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/inst amp/port width}\pgf@circ@res@left} {\ctikzvalof{tripoles/inst amp/input height}\pgf@circ@res@up}} % \pgftext[left, at=\pgfpoint{\ctikzvalof{tripoles/inst amp/port width}\pgf@circ@res@left}{\ctikzvalof{tripoles/inst amp/input height}\pgf@circ@res@up}]{\ctikzvalof{tripoles/inst amp/font} \ifpgf@circuit@oa@iplusup\pgf@circ@ampli@plus\else\pgf@circ@ampli@minus\fi} % Positive input terminal \pgfpathmoveto{\pgfpoint {\pgf@circ@res@left} {\ctikzvalof{tripoles/inst amp/input height}\pgf@circ@res@down}} % \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/inst amp/port width}\pgf@circ@res@left} {\ctikzvalof{tripoles/inst amp/input height}\pgf@circ@res@down}} \pgftext[left, at=\pgfpoint{\ctikzvalof{tripoles/inst amp/port width}\pgf@circ@res@left}{\ctikzvalof{tripoles/inst amp/input height}\pgf@circ@res@down}]{\ctikzvalof{tripoles/inst amp/font} \ifpgf@circuit@oa@iplusup\pgf@circ@ampli@minus\else\pgf@circ@ampli@plus\fi} % Output terminal \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/inst amp/port width}\pgf@circ@res@right}{0pt}} % % \pgfsetrectcap \pgfusepath{draw} } } % Instrumentation amplifier with terminals for gain resistance between inputs \pgfdeclareshape{inst amp ra} { \savedmacro{\ctikzclass}{\edef\ctikzclass{amplifiers}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \anchor{center}{\pgfpointorigin} % bounding-box top left \savedanchor\northwest{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/inst amp ra/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/inst amp ra/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{nw}{ \northwest } \anchor{south}{ \northwest \pgf@y=-\pgf@y\pgf@x=0pt\relax } \anchor{north}{ \northwest\pgf@x=0pt\relax } \savedanchor\left{% \pgf@y=0pt } \anchor{leftedge} {\left \pgf@x = \ctikzvalof{tripoles/op amp/port width}\pgf@x } % inputs (+-) \savedanchor\inOneFixed{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/inst amp ra/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@y=\ctikzvalof{tripoles/inst amp ra/input height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/inst amp ra/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{in up}{ \inOneFixed } \anchor{in down}{ \inOneFixed \pgf@y=-\pgf@y } \savedanchor\inOne{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/inst amp ra/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@y=\ctikzvalof{tripoles/inst amp ra/input height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/inst amp ra/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \ifpgf@circuit@oa@iplusup\pgf@y=-\pgf@y\fi } \anchor{-}{ \inOne } \anchor{+}{ \inOne \pgf@y=-\pgf@y } % R ampli anchors. They are by default at 20% more than R-length distance % you can change that with the `ra pos` key (use 0.5 for one-R). \savedanchor\raOneFixed{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\pgf@circ@scaled@Rlen \pgf@y=\ctikzvalof{tripoles/inst amp ra/ra pos}\pgf@y \pgf@x=-\ctikzvalof{tripoles/inst amp ra/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{ra up}{ \raOneFixed } \anchor{ra down}{ \raOneFixed \pgf@y=-\pgf@y } \savedanchor\raOne{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\pgf@circ@scaled@Rlen \pgf@y=\ctikzvalof{tripoles/inst amp ra/ra pos}\pgf@y \pgf@x=-\ctikzvalof{tripoles/inst amp ra/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \ifpgf@circuit@oa@iplusup\pgf@y=-\pgf@y\fi } \anchor{ra-}{ \raOne } \anchor{ra+}{ \raOne \pgf@y=-\pgf@y } % power supplies \savedanchor\up{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/inst amp ra/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/inst amp ra/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@circ@res@up = \pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgfpointlineattime{ \ctikzvalof{tripoles/inst amp ra/up pos}}{ \pgfpoint{ \ctikzvalof{tripoles/inst amp ra/port width}\pgf@circ@res@left} {\pgf@circ@res@up}} {\pgfpoint{\ctikzvalof{tripoles/inst amp ra/port width}\pgf@circ@res@right}{\ctikzvalof{tripoles/inst amp ra/height 2}\pgf@circ@res@up}} } \anchor{up}{ \up } \anchor{down}{ \up \pgf@y=-\pgf@y } % reference voltage input anchors. \savedanchor\refv{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/inst amp ra/height}\pgf@circ@scaled@Rlen \pgf@y=0.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/inst amp ra/width}\pgf@circ@scaled@Rlen \pgf@x=0.5\pgf@x \pgf@circ@res@up = \pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgfpointlineattime{ \ctikzvalof{tripoles/inst amp ra/refv pos}}{ \pgfpoint{ \ctikzvalof{tripoles/inst amp ra/port width}\pgf@circ@res@left} {\pgf@circ@res@up}} {\pgfpoint{\ctikzvalof{tripoles/inst amp ra/port width}\pgf@circ@res@right}{\ctikzvalof{tripoles/inst amp ra/height 2}\pgf@circ@res@up}} } % we need both because they are normally drawn under the amp, and if you % mirror it vertically you need them \anchor{refv up}{ \refv } \anchor{refv down}{ \refv \pgf@y=-\pgf@y } \anchor{out}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } % support for border anchors \savedanchor\leftedge{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@x=-\ctikzvalof{tripoles/inst amp ra/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@x = \ctikzvalof{tripoles/inst amp ra/port width}\pgf@x \pgf@y=0pt } \anchor{leftedge}{\leftedge} \anchor{rightedge}{\leftedge \pgf@x =-\pgf@x } \anchor{bin up}{ \inOneFixed \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bin down}{ \inOneFixed \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{b-}{ \inOne \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{b+}{ \inOne \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bra up}{ \raOneFixed \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bra down}{ \raOneFixed \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bra-}{ \raOne \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bra+}{ \raOne \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bout}{ \leftedge \pgf@y=0pt \pgf@x=-\pgf@x } % end border anchors \anchor{west}{ \left } \anchor{east}{ \left \pgf@x=-\pgf@x } \anchor{south west}{ \northwest \pgf@y=-\pgf@y } \anchor{north east}{ \northwest \pgf@x=-\pgf@x } \anchor{north west}{ \northwest } \anchor{south east}{ \northwest \pgf@x=-\pgf@x \pgf@y=-\pgf@y } \anchor{text}{ \ifpgf@circ@center@text \pgf@x=\dimexpr -.6\wd\pgfnodeparttextbox\relax \else \leftedge \pgfmathsetlength{\pgf@x}{\pgf@x + \ctikzvalof{left text distance}} \fi \pgf@y=\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox\relax } % drawing of the component \backgroundpath{ \pgfsetcolor{\ctikzvalof{color}} \northwest \pgf@circ@res@up = \pgf@y \pgf@circ@res@down = -\pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgf@circ@scaled@Rlen=\scaledRlen \newdimen\pgf@circ@res@right@double \pgf@circ@res@right@double=2\pgf@circ@res@right % main component, normally in thicker lines \pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgftransformxshift{\ctikzvalof{tripoles/inst amp ra/port width}\pgf@circ@res@left} \pgf@circ@res@step=\pgf@circ@res@right \advance\pgf@circ@res@step by -\pgf@circ@res@left \pgf@circ@res@step=\ctikzvalof{tripoles/inst amp ra/port width}\pgf@circ@res@step %primer punto: la linea de salida (lado componente) \pgfpathmoveto{\pgfpoint{\ctikzvalof{tripoles/inst amp ra/port width}\pgf@circ@res@right@double}{0}} %from the exit to the top (short side)... (note that the .6 must be copied in \up anchor \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/inst amp ra/port width}\pgf@circ@res@right@double}{\ctikzvalof{tripoles/inst amp ra/height 2}\pgf@circ@res@up}} % and then to the input "front up", "down", to the output short side "down" \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/inst amp ra/port width}\pgf@circ@res@right@double}{\ctikzvalof{tripoles/inst amp ra/height 2}\pgf@circ@res@down}} % ...and close \pgfpathclose \pgf@circ@draworfill \endpgfscope % ra terminal - \pgfpathmoveto{\pgfpoint {\pgf@circ@res@left} {\ctikzvalof{tripoles/inst amp ra/ra pos}\pgf@circ@Rlen}} % \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/inst amp ra/port width}\pgf@circ@res@left} {\ctikzvalof{tripoles/inst amp ra/ra pos}\pgf@circ@Rlen}} % ra terminal + \pgfpathmoveto{\pgfpoint {\pgf@circ@res@left} {-\ctikzvalof{tripoles/inst amp ra/ra pos}\pgf@circ@Rlen}} % \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/inst amp ra/port width}\pgf@circ@res@left} {-\ctikzvalof{tripoles/inst amp ra/ra pos}\pgf@circ@Rlen}} % Negative input terminal \pgfpathmoveto{\pgfpoint {\pgf@circ@res@left} {\ctikzvalof{tripoles/inst amp ra/input height}\pgf@circ@res@up}} % \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/inst amp ra/port width}\pgf@circ@res@left} {\ctikzvalof{tripoles/inst amp ra/input height}\pgf@circ@res@up}} % \pgftext[left, at=\pgfpoint{\ctikzvalof{tripoles/inst amp ra/port width}\pgf@circ@res@left}{\ctikzvalof{tripoles/inst amp ra/input height}\pgf@circ@res@up}]{\ctikzvalof{tripoles/inst amp ra/font} \ifpgf@circuit@oa@iplusup\pgf@circ@ampli@plus\else\pgf@circ@ampli@minus\fi} % Positive input terminal \pgfpathmoveto{\pgfpoint {\pgf@circ@res@left} {\ctikzvalof{tripoles/inst amp ra/input height}\pgf@circ@res@down}} % \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/inst amp ra/port width}\pgf@circ@res@left} {\ctikzvalof{tripoles/inst amp ra/input height}\pgf@circ@res@down}} \pgftext[left, at=\pgfpoint{\ctikzvalof{tripoles/inst amp ra/port width}\pgf@circ@res@left}{\ctikzvalof{tripoles/inst amp ra/input height}\pgf@circ@res@down}]{\ctikzvalof{tripoles/inst amp ra/font} \ifpgf@circuit@oa@iplusup\pgf@circ@ampli@minus\else\pgf@circ@ampli@plus\fi} % Output terminal \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/inst amp ra/port width}\pgf@circ@res@right}{0pt}} % % \pgfsetrectcap \pgfusepath{draw} } } % Buffer % Contributed by Danilo Piazzalunga \pgfdeclareshape{buffer} { \savedmacro{\ctikzclass}{\edef\ctikzclass{amplifiers}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \anchor{center}{\pgfpointorigin} \savedanchor\northwest{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{bipoles/buffer/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{bipoles/buffer/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{east}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } \anchor{west}{ \northwest \pgf@y=0pt } \anchor{south}{ \northwest \pgf@x=0pt \pgf@y=-\pgf@y } \anchor{north}{ \northwest \pgf@x=0pt } \anchor{south west}{ \northwest \pgf@y=-\pgf@y } \anchor{north east}{ \northwest \pgf@x=-\pgf@x } \anchor{north west}{ \northwest } \anchor{south east}{ \northwest \pgf@x=-\pgf@x \pgf@y=-\pgf@y } \savedanchor\left{% \pgf@y=0pt } \anchor{in}{ \northwest \pgf@y=0pt } \anchor{out}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } \anchor{bin}{ \northwest \pgf@y=0pt \pgf@x=0.7\pgf@x } \anchor{bout}{ \northwest \pgf@y=0pt \pgf@x=-0.7\pgf@x } \anchor{text}{ \ifpgf@circ@center@text \pgf@x=\dimexpr -.6\wd\pgfnodeparttextbox\relax \else \northwest \pgfmathsetlength{\pgf@x}{0.7*\pgf@x + \ctikzvalof{left text distance}} \fi \pgf@y=\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox\relax } \backgroundpath{ \pgfsetcolor{\ctikzvalof{color}} \northwest \pgf@circ@res@up = \pgf@y \pgf@circ@res@down = -\pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgf@circ@scaled@Rlen=\scaledRlen \pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgftransformxshift{.7\pgf@circ@res@left} \pgf@circ@res@step=\pgf@circ@res@right \advance\pgf@circ@res@step by -\pgf@circ@res@left \pgf@circ@res@step=.7\pgf@circ@res@step \pgfpathmoveto{\pgfpoint{\pgf@circ@res@step}{0pt}} \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@down}} \pgfpathclose \pgf@circ@draworfill \endpgfscope \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}} \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@left}{0pt}} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@right}{0pt}} \pgfusepath{draw} } } % plain amplifier, no symbols \pgfdeclareshape{plain amp} { \savedmacro{\ctikzclass}{\edef\ctikzclass{amplifiers}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \anchor{center}{\pgfpointorigin} \savedanchor\northwest{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/plain amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/plain amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{east}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } \anchor{west}{ \northwest \pgf@y=0pt } \anchor{south}{ \northwest \pgf@x=0pt \pgf@y=-\pgf@y } \anchor{north}{ \northwest \pgf@x=0pt } \anchor{south west}{ \northwest \pgf@y=-\pgf@y } \anchor{north east}{ \northwest \pgf@x=-\pgf@x } \anchor{north west}{ \northwest } \anchor{south east}{ \northwest \pgf@x=-\pgf@x \pgf@y=-\pgf@y } \savedanchor\left{% \pgf@y=0pt } \savedanchor\inOne{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/plain amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@y=\ctikzvalof{tripoles/plain amp/input height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/plain amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \ifpgf@circuit@oa@iplusup\pgf@y=-\pgf@y\fi } \savedanchor\inOneFixed{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/plain amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@y=\ctikzvalof{tripoles/plain amp/input height}\pgf@y \pgf@x=-\ctikzvalof{tripoles/plain amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{-}{ \inOne } \anchor{+}{ \inOne \pgf@y=-\pgf@y } \anchor{in up}{ \inOneFixed } \anchor{in down}{ \inOneFixed \pgf@y=-\pgf@y } % support for border anchors \savedanchor\leftedge{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@x=-\ctikzvalof{tripoles/plain amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@x = \ctikzvalof{tripoles/plain amp/port width}\pgf@x \pgf@y=0pt } \anchor{leftedge}{\leftedge} \anchor{rightedge}{\leftedge \pgf@x =-\pgf@x } \anchor{bin up}{ \inOneFixed \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bin down}{ \inOneFixed \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{b-}{ \inOne \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{b+}{ \inOne \pgf@y=-\pgf@y \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bout}{ \leftedge \pgf@y=0pt \pgf@x=-\pgf@x } % end border anchors \savedanchor\up{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/plain amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/plain amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@circ@res@up = \pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgfpointlineattime{ \ctikzvalof{tripoles/plain amp/up pos}}{ \pgfpoint{ \ctikzvalof{tripoles/plain amp/port width}\pgf@circ@res@left} {\pgf@circ@res@up}} {\pgfpoint{\ctikzvalof{tripoles/plain amp/port width}\pgf@circ@res@right}{0pt}} } \anchor{up}{ \up } \anchor{down}{ \up \pgf@y=-\pgf@y } \anchor{out}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } \anchor{text}{ \ifpgf@circ@center@text \pgf@x=\dimexpr -.6\wd\pgfnodeparttextbox\relax \else \leftedge \pgfmathsetlength{\pgf@x}{\pgf@x + \ctikzvalof{left text distance}} \fi \pgf@y=\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox\relax } \backgroundpath{ \pgfsetcolor{\ctikzvalof{color}} \northwest \pgf@circ@res@up = \pgf@y \pgf@circ@res@down = -\pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgftransformxshift{\ctikzvalof{tripoles/plain amp/port width}\pgf@circ@res@left} \pgf@circ@res@step=\pgf@circ@res@right \advance\pgf@circ@res@step by -\pgf@circ@res@left \pgf@circ@res@step=\ctikzvalof{tripoles/plain amp/port width}\pgf@circ@res@step \pgfpathmoveto{\pgfpoint{\pgf@circ@res@step}{0pt}} \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@down}} \pgfpathclose \pgf@circ@draworfill \endpgfscope \pgfpathmoveto{\pgfpoint {\pgf@circ@res@left} {\ctikzvalof{tripoles/plain amp/input height}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/plain amp/port width}\pgf@circ@res@left} {\ctikzvalof{tripoles/plain amp/input height}\pgf@circ@res@up}} \pgfpathmoveto{\pgfpoint {\pgf@circ@res@left} {\ctikzvalof{tripoles/plain amp/input height}\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/plain amp/port width}\pgf@circ@res@left} {\ctikzvalof{tripoles/plain amp/input height}\pgf@circ@res@down}} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/plain amp/port width}\pgf@circ@res@right}{0pt}} \pgfusepath{draw} } } % plain amplifier, no symbols, one input \pgfdeclareshape{plain mono amp} { \savedmacro{\ctikzclass}{\edef\ctikzclass{amplifiers}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \anchor{center}{\pgfpointorigin} \savedanchor\northwest{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/plain amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/plain amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{east}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } \anchor{west}{ \northwest \pgf@y=0pt } \anchor{south}{ \northwest \pgf@x=0pt \pgf@y=-\pgf@y } \anchor{north}{ \northwest \pgf@x=0pt } \anchor{south west}{ \northwest \pgf@y=-\pgf@y } \anchor{north east}{ \northwest \pgf@x=-\pgf@x } \anchor{north west}{ \northwest } \anchor{south east}{ \northwest \pgf@x=-\pgf@x \pgf@y=-\pgf@y } \savedanchor\left{% \pgf@y=0pt } \savedanchor\inOne{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@x=-\ctikzvalof{tripoles/plain amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@y=0pt\relax } \anchor{in}{ \inOne } % support for border anchors \savedanchor\leftedge{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@x=-\ctikzvalof{tripoles/plain amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@x = \ctikzvalof{tripoles/plain amp/port width}\pgf@x \pgf@y=0pt } \anchor{leftedge}{\leftedge} \anchor{rightedge}{\leftedge \pgf@x =-\pgf@x } \anchor{bin}{ \inOne \pgf@ya=\pgf@y \leftedge \pgf@y=\pgf@ya } \anchor{bout}{ \leftedge \pgf@y=0pt \pgf@x=-\pgf@x } % end border anchors \savedanchor\up{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/plain amp/height}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/plain amp/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x \pgf@circ@res@up = \pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgfpointlineattime{ \ctikzvalof{tripoles/plain amp/up pos}}{ \pgfpoint{ \ctikzvalof{tripoles/plain amp/port width}\pgf@circ@res@left} {\pgf@circ@res@up}} {\pgfpoint{\ctikzvalof{tripoles/plain amp/port width}\pgf@circ@res@right}{0pt}} } \anchor{up}{ \up } \anchor{down}{ \up \pgf@y=-\pgf@y } \anchor{out}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } \anchor{text}{ \ifpgf@circ@center@text \pgf@x=\dimexpr -.6\wd\pgfnodeparttextbox\relax \else \leftedge \pgfmathsetlength{\pgf@x}{\pgf@x + \ctikzvalof{left text distance}} \fi \pgf@y=\dimexpr.5\dp\pgfnodeparttextbox-.5\ht\pgfnodeparttextbox\relax } \backgroundpath{ \pgfsetcolor{\ctikzvalof{color}} \northwest \pgf@circ@res@up = \pgf@y \pgf@circ@res@down = -\pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgfscope \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgftransformxshift{\ctikzvalof{tripoles/plain amp/port width}\pgf@circ@res@left} \pgf@circ@res@step=\pgf@circ@res@right \advance\pgf@circ@res@step by -\pgf@circ@res@left \pgf@circ@res@step=\ctikzvalof{tripoles/plain amp/port width}\pgf@circ@res@step \pgfpathmoveto{\pgfpoint{\pgf@circ@res@step}{0pt}} \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0pt}{\pgf@circ@res@down}} \pgfpathclose \pgf@circ@draworfill \endpgfscope \pgfpathmoveto{\pgfpoint {\pgf@circ@res@left} {0pt}} \pgfpathlineto{\pgfpoint {\ctikzvalof{tripoles/plain amp/port width}\pgf@circ@res@left} {0pt}} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tripoles/plain amp/port width}\pgf@circ@res@right}{0pt}} \pgfusepath{draw} } }% %>>> %%%%%%%%%%%%%%%%%%%%%%%%%%% %% Tubes and magnetron %%%%%%%%%%%%%%%%%%%%%%%% % Settings Electronic tubes: diodetube, triode, tetrode and pentode%<<<1 \ctikzset{tubes/width/.initial=1} % relative width \ctikzset{tubes/height/.initial=1.4} % relative height \ctikzset{tubes/tube radius/.initial=0.40} % radius of tube circle \ctikzset{tubes/anode distance/.initial=0.40} % distance from center \ctikzset{tubes/anode width/.initial=0.40} % width of an anode/plate \ctikzset{tubes/grid protrusion/.initial=0.25} % distance from center \ctikzset{tubes/grid dashes/.initial=5} % number of grid dashes \ctikzset{tubes/grid separation/.initial=0.2} % separation between grids \ctikzset{tubes/grid shift/.initial=0.0} % y shift grids from center \ctikzset{tubes/cathode distance/.initial=0.40} % distance from grid \ctikzset{tubes/cathode width/.initial=0.40} % width of an cathode \ctikzset{tubes/cathode corners/.initial=0.06} % corners of the cathode wire \ctikzset{tubes/cathode right extend/.initial=0.075} % extension at the right side \ctikzset{tubes/filament distance/.initial=0.1} % distance from cathode \ctikzset{tubes/filament angle/.initial=15} % Angle from centerpoint \ctikzset{/tikz/circuitikz/tripoles/magnetron/width/.initial=1} \newif\ifpgf@circuit@tubes@filament\pgf@circuit@tubes@filamentfalse \pgfkeys{/tikz/filament/.add code={}{\pgf@circuit@tubes@filamenttrue}} \ctikzset{tubes/filament/.add code={}{\pgf@circuit@tubes@filamenttrue}} \newif\ifpgf@circuit@tubes@nocathode\pgf@circuit@tubes@nocathodefalse \pgfkeys{/tikz/nocathode/.add code={}{\pgf@circuit@tubes@nocathodetrue}} \ctikzset{tubes/nocathode/.add code={}{\pgf@circuit@tubes@nocathodetrue}} \newif\ifpgf@circuit@tubes@fullcathode\pgf@circuit@tubes@fullcathodefalse \pgfkeys{/tikz/fullcathode/.add code={}{\pgf@circuit@tubes@fullcathodetrue}} \ctikzset{tubes/fullcathode/.add code={}{\pgf@circuit@tubes@fullcathodetrue}}% %>>> %% Node shapes for tubes & co%<<< %%%%%%%%%%%%%%%%%%% %% Magnetron %%%%%%%%%%%%%%%%%%% \pgfdeclareshape{magnetron} { \savedmacro{\ctikzclass}{\edef\ctikzclass{tubes}} % class of these components \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \savedanchor\northwest{ \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@y=\ctikzvalof{tripoles/magnetron/width}\pgf@circ@scaled@Rlen \pgf@y=.5\pgf@y \pgf@x=-\ctikzvalof{tripoles/magnetron/width}\pgf@circ@scaled@Rlen \pgf@x=.5\pgf@x } \anchor{center}{ \pgfpointorigin } \anchor{anode}{ \northwest \pgf@x=0pt \pgf@y=-\pgf@y } \anchor{cathode1}{ \northwest \pgf@circ@res@step=\pgf@y \pgfmathparse{cos(105)} \pgf@x=\pgfmathresult\pgf@circ@res@step \pgfmathparse{sin(105)} \pgf@y=\pgfmathresult\pgf@circ@res@step %\pgfpointorigin %\pgfpathmoveto{\pgfpointpolar{105}{\pgf@circ@res@step}}%not working in a scaled tikzpicture } \anchor{cathode2}{ \northwest \pgf@circ@res@step=\pgf@y \pgfmathparse{cos(75)} \pgf@x=\pgfmathresult\pgf@circ@res@step \pgfmathparse{sin(75)} \pgf@y=\pgfmathresult\pgf@circ@res@step %\pgfpointorigin %\pgfpathmoveto{\pgfpointpolar{75}{\pgf@circ@res@step}}%not working in a scaled tikzpicture } \anchor{text}{ \pgfpointorigin \advance \pgf@x by -.5\wd\pgfnodeparttextbox \advance \pgf@y by -.5\ht\pgfnodeparttextbox } \anchor{left}{% \northwest \pgf@y=0pt } \anchor{right}{% \northwest \pgf@y=0pt \pgf@x=-\pgf@x } \anchor{top}{ \northwest \pgf@x=0pt } \anchor{pathstart}{ \northwest \pgf@x=0pt } \anchor{pathend}{ \northwest \pgf@x=0pt \pgf@y=-\pgf@y } \anchor{bottom}{ \northwest \pgf@x=0pt \pgf@y=-\pgf@y } \anchor{center}{ \pgf@y=0pt \pgf@x=0pt } \anchor{east}{ \northwest \pgf@y=0pt \pgf@x=-\pgf@x } \anchor{west}{ \northwest \pgf@y=0pt } \anchor{south}{ \northwest \pgf@x=0pt \pgf@y=-\pgf@y } \anchor{north}{ \northwest \pgf@x=0pt } \anchor{south west}{ \northwest \pgf@y=-\pgf@y } \anchor{north east}{ \northwest \pgf@x=-\pgf@x } \anchor{north west}{ \northwest } \anchor{south east}{ \northwest \pgf@x=-\pgf@x \pgf@y=-\pgf@y } \backgroundpath{ \pgfsetcolor{\ctikzvalof{color}} \pgf@circ@scaled@Rlen=\scaledRlen \pgf@circ@res@step=\ctikzvalof{tripoles/magnetron/width}\pgf@circ@scaled@Rlen \northwest \pgf@circ@res@up = \pgf@y \pgf@circ@res@down = -\pgf@y \pgf@circ@res@right = -\pgf@x \pgf@circ@res@left = \pgf@x \pgfmathsetlength{\pgf@circ@res@other}{sin(15)*\pgf@circ@res@up} \pgfscope \pgfstartlinewidth=\pgflinewidth \pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth} %create outer circle \pgfpathcircle{\pgfpoint{0}{0}} {\pgf@circ@res@right} \pgf@circ@draworfill %create chambers \foreach \angle in {45,135,225,315}{ \pgfpathmoveto{ \pgfpointpolar{\angle}{0.6\pgf@circ@res@right}} \pgfpathlineto{ \pgfpointpolar{\angle}{\pgf@circ@res@right}} } \pgfsetroundcap \pgfusepath{draw} \pgfscope %draw connection from outside %anode \pgfsetlinewidth{\pgfstartlinewidth} \pgfpathmoveto{\pgfpoint{0\pgf@circ@res@left}{\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{0\pgf@circ@res@right}{.5\pgf@circ@res@down}} %cathodes \pgfpathmoveto{\pgfpointpolar{105}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{-\pgf@circ@res@other}{.5\pgf@circ@res@up}} \pgfpathmoveto{\pgfpointpolar{75}{\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{.5\pgf@circ@res@up}} \pgfsetbuttcap \pgfusepath{draw} \endpgfscope %create cathode \pgfpathmoveto{\pgfpoint{\pgf@circ@res@other}{.5\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{0}{.15\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{-\pgf@circ@res@other}{.5\pgf@circ@res@up}} \pgfusepath{draw} %create anode \pgfpathmoveto{\pgfpoint{0.3\pgf@circ@res@left}{.5\pgf@circ@res@down}} \pgfpathlineto{\pgfpoint{0.3\pgf@circ@res@right}{.5\pgf@circ@res@down}} \pgfsetbuttcap \pgfusepath{draw} \endpgfscope } } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Electronic tubes, submitted by J. op den Brouw %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Draw tube outline \def\pgf@circ@tubes@drawtube{% \ifdim\ctikzvalof{tubes/width}pt>\ctikzvalof{tubes/height}pt\relax \pgfpathmoveto{\pgfpoint{0pt}{\pgf@circ@res@up}} \pgfutil@tempdima=\pgf@circ@res@right \advance\pgfutil@tempdima by -\pgf@circ@res@up \pgfpathlineto{\pgfpoint{\pgfutil@tempdima}{\pgf@circ@res@up}} \pgfpatharc{90}{-90}{\pgf@circ@res@up} \pgfpathlineto{\pgfpoint{-\pgfutil@tempdima}{-\pgf@circ@res@up}} \pgfpatharc{270}{90}{\pgf@circ@res@up} \else \pgfpathmoveto{\pgfpoint{-\pgf@circ@res@right}{0pt}} \pgfutil@tempdima=\pgf@circ@res@up \advance\pgfutil@tempdima by -\pgf@circ@res@right \pgfpathlineto{\pgfpoint{-\pgf@circ@res@right}{\pgfutil@tempdima}} \pgfpatharc{180}{0}{\pgf@circ@res@right} \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}{-\pgfutil@tempdima}} \pgfpatharc{180}{0}{-\pgf@circ@res@right} \fi \pgfpathclose } %% The diode (tube), triode, tetrode and pentode only differ in the %% number of grids. So we construct a generic declare function in %% which we can put code for the grid anchors and grid drawing code %% \pgfcircdeclaretube{tube name}{grid anchors}{grid drawing code} \long\def\pgfcircdeclaretube#1#2#3{% \pgfdeclareshape{#1}{ \savedmacro{\ctikzclass}{\edef\ctikzclass{tubes}} \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}} \anchor{center}{ \pgfpointorigin } \savedanchor\northwest{% \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen} \pgf@circ@res@up=\ctikzvalof{tubes/height}\pgf@circ@scaled@Rlen \pgf@circ@res@right=\ctikzvalof{tubes/width}\pgf@circ@scaled@Rlen % x and y should be half the Rlen \pgf@y=\pgf@circ@res@up \pgf@y=.5\pgf@y \pgf@x=-\pgf@circ@res@right \pgf@x=.5\pgf@x } \anchor{north} {% \northwest \pgf@x=0pt } \anchor{east}{% \northwest \pgf@x=-\pgf@x \pgf@y=0pt } \anchor{south}{% \northwest \pgf@y=-\pgf@y \pgf@x=0pt } \anchor{west}{% \northwest \pgf@y=0pt } \anchor{north west}{% \northwest } \anchor{north east}{% \northwest \pgf@x=-\pgf@x } \anchor{south east}{ \northwest \pgf@x=-\pgf@x \pgf@y=-\pgf@y } \anchor{south west}{ \northwest \pgf@y=-\pgf@y } \anchor{anode} {% \northwest \pgf@x=0pt } \anchor{cathode}{% \northwest \pgf@y=-\pgf@y \pgf@x=\ctikzvalof{tubes/cathode width}\pgf@x } \anchor{cathode 1}{% \northwest \pgf@y=-\pgf@y \pgf@x=\ctikzvalof{tubes/cathode width}\pgf@x } \anchor{cathode 2}{% \northwest \pgf@y=-\pgf@y \pgf@x=-\ctikzvalof{tubes/cathode width}\pgf@x } \anchor{filament 1}{% \northwest \pgfmathparse{(\ctikzvalof{tubes/tube radius}*sin(\ctikzvalof{tubes/filament angle})} \pgf@x=\pgfmathresult\pgf@x \pgf@y=-\pgf@y } \anchor{filament 2}{% \northwest \pgfmathparse{(\ctikzvalof{tubes/tube radius}*sin(\ctikzvalof{tubes/filament angle})} \pgf@x=-\pgfmathresult\pgf@x \pgf@y=-\pgf@y } % Extra anchors #2 \backgroundpath{ \pgfscope % Line width for tripoles \pgf@circ@setlinewidth{tripoles}{\pgflinewidth} \pgf@circ@scaled@Rlen=\scaledRlen % Setup to draw tube \pgf@circ@res@up=\ctikzvalof{tubes/height}\pgf@circ@scaled@Rlen \pgf@circ@res@right=\ctikzvalof{tubes/width}\pgf@circ@scaled@Rlen \pgf@circ@res@up=\ctikzvalof{tubes/tube radius}\pgf@circ@res@up \pgf@circ@res@right=\ctikzvalof{tubes/tube radius}\pgf@circ@res@right % Tube outline \pgf@circ@tubes@drawtube % Setup to draw grid, filament, anode and cathode \pgf@circ@res@up=\ctikzvalof{tubes/height}\pgf@circ@scaled@Rlen \pgf@circ@res@right=\ctikzvalof{tubes/width}\pgf@circ@scaled@Rlen \pgf@circ@res@up=0.5\pgf@circ@res@up \pgf@circ@res@right=0.5\pgf@circ@res@right % Tube fill color (if any) \pgf@circ@draworfill % Grid drawing #3 % Filament (is not drawn by default) \ifpgf@circuit@tubes@filament \pgf@circ@res@temp=-\ctikzvalof{tubes/cathode distance}\pgf@circ@res@up \advance\pgf@circ@res@temp by -\ctikzvalof{tubes/filament distance}\pgf@circ@res@up \pgfmathparse{(\ctikzvalof{tubes/tube radius}*sin(\ctikzvalof{tubes/filament angle})} \pgf@xa=\pgfmathresult\pgf@circ@res@right \pgfmathparse{\ctikzvalof{tubes/tube radius}+\ctikzvalof{tubes/tube radius}*cos(\ctikzvalof{tubes/filament angle}} \pgf@ya=\pgfmathresult\pgf@circ@res@up \pgfpathmoveto{\pgfpoint{0pt}{\pgf@circ@res@temp}} \pgfpathlineto{\pgfpoint{-\pgf@xa}{-\pgf@ya}} \pgfpathlineto{\pgfpoint{-\pgf@xa}{-\pgf@circ@res@up}} \pgfpathmoveto{\pgfpoint{0pt}{\pgf@circ@res@temp}} \pgfpathlineto{\pgfpoint{\pgf@xa}{-\pgf@ya}} \pgfpathlineto{\pgfpoint{\pgf@xa}{-\pgf@circ@res@up}} \pgf@circuit@tubes@filamentfalse \fi % Anode (or plate) \pgfpathmoveto{\pgfpoint{0pt}{\pgf@circ@res@up}} % north \pgfpathlineto{\pgfpoint{0pt}{\ctikzvalof{tubes/anode distance}\pgf@circ@res@up}} \pgfpathmoveto{\pgfpoint{-\ctikzvalof{tubes/anode width}\pgf@circ@res@right}{\ctikzvalof{tubes/anode distance}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tubes/anode width}\pgf@circ@res@right}{\ctikzvalof{tubes/anode distance}\pgf@circ@res@up}} % Cathode \ifpgf@circuit@tubes@nocathode \pgf@circuit@tubes@nocathodefalse \else \pgfsetcornersarced{\pgfpoint{\ctikzvalof{tubes/cathode corners}\pgf@circ@res@up}{\ctikzvalof{tubes/cathode corners}\pgf@circ@res@up}} \pgfpathmoveto{\pgfpoint{-\ctikzvalof{tubes/cathode width}\pgf@circ@res@right}{-\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{-\ctikzvalof{tubes/cathode width}\pgf@circ@res@right}{-\ctikzvalof{tubes/cathode distance}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tubes/cathode width}\pgf@circ@res@right}{-\ctikzvalof{tubes/cathode distance}\pgf@circ@res@up}} \ifpgf@circuit@tubes@fullcathode \pgfpathlineto{\pgfpoint{\ctikzvalof{tubes/cathode width}\pgf@circ@res@right}{-\pgf@circ@res@up}} \pgf@circuit@tubes@fullcathodefalse \else \pgfpathlineto{\pgfpoint{\ctikzvalof{tubes/cathode width}\pgf@circ@res@right}{-\ctikzvalof{tubes/cathode distance}\pgf@circ@res@up-\ctikzvalof{tubes/cathode right extend}\pgf@circ@res@up}} \fi \fi % Draw the background \pgfusepath{draw} \endpgfscope } } } \pgfcircdeclaretube{diodetube}{}{} % shape diode already exists \pgfcircdeclaretube{triode} { \anchor{grid} {% should not be used \northwest \pgf@y=\ctikzvalof{tubes/grid shift}\pgf@y } \anchor{control} {% \northwest \pgf@y=\ctikzvalof{tubes/grid shift}\pgf@y } } { % Grid protrusion \pgf@xa=-\ctikzvalof{tubes/tube radius}\pgf@circ@res@right \advance\pgf@xa by -\ctikzvalof{tubes/grid protrusion}\pgf@circ@res@right \pgfpathmoveto{\pgfpoint{-\pgf@circ@res@right}{\ctikzvalof{tubes/grid shift}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\pgf@xa}{\ctikzvalof{tubes/grid shift}\pgf@circ@res@up}} % Grid dashes: calculations \pgf@xb=2\pgf@circ@res@right \pgf@circ@res@step=\ctikzvalof{tubes/tube radius}\pgf@xb \pgf@circ@count@a=\ctikzvalof{tubes/grid dashes} % dashes*2+1 \multiply\pgf@circ@count@a by 2\relax \advance\pgf@circ@count@a by 1\relax \advance\pgf@circ@res@step by -\pgf@xa \divide\pgf@circ@res@step by \pgf@circ@count@a % Grid dashes: draw \pgf@circ@res@temp=\pgf@xa \pgf@circ@count@a=\ctikzvalof{tubes/grid dashes} \loop \advance\pgf@circ@res@temp by\pgf@circ@res@step \pgfpathmoveto{\pgfpoint{\pgf@circ@res@temp}{\ctikzvalof{tubes/grid shift}\pgf@circ@res@up}} \advance\pgf@circ@res@temp by\pgf@circ@res@step \pgfpathlineto{\pgfpoint{\pgf@circ@res@temp}{\ctikzvalof{tubes/grid shift}\pgf@circ@res@up}} \advance\pgf@circ@count@a by-1 \ifnum\pgf@circ@count@a>0\relax \repeat } \pgfcircdeclaretube{tetrode} { \anchor{grid} {% should not be used \northwest \pgfutil@tempdima=\pgf@y \pgf@y=-\ctikzvalof{tubes/grid separation}\pgf@y \pgf@y=0.5\pgf@y \advance\pgf@y by \ctikzvalof{tubes/grid shift}\pgfutil@tempdima } \anchor{control} {% \northwest \pgfutil@tempdima=\pgf@y \pgf@y=-\ctikzvalof{tubes/grid separation}\pgf@y \pgf@y=0.5\pgf@y \advance\pgf@y by \ctikzvalof{tubes/grid shift}\pgfutil@tempdima } \anchor{screen} {% \northwest \pgfutil@tempdima=\pgf@y \pgf@y=\ctikzvalof{tubes/grid separation}\pgf@y \pgf@y=0.5\pgf@y \advance\pgf@y by \ctikzvalof{tubes/grid shift}\pgfutil@tempdima } } { % Grid x/y points \pgf@xa=-\ctikzvalof{tubes/tube radius}\pgf@circ@res@right \advance\pgf@xa by -\ctikzvalof{tubes/grid protrusion}\pgf@circ@res@right \pgfutil@tempdima=\ctikzvalof{tubes/grid separation}\pgf@circ@res@up \pgfutil@tempdimb=-\pgfutil@tempdima \pgfutil@tempdima=0.5\pgfutil@tempdima \advance\pgfutil@tempdima by \ctikzvalof{tubes/grid shift}\pgf@circ@res@up \pgfutil@tempdimb=0.5\pgfutil@tempdimb \advance\pgfutil@tempdimb by \ctikzvalof{tubes/grid shift}\pgf@circ@res@up % Grid protrusion \pgfpathmoveto{\pgfpoint{-\pgf@circ@res@right}{\pgfutil@tempdimb}} \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgfutil@tempdimb}} \pgfpathmoveto{\pgfpoint{-\pgf@circ@res@right}{\pgfutil@tempdima}} \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgfutil@tempdima}} % Grid dashes: calculations \pgf@xb=2\pgf@circ@res@right \pgf@circ@res@step=\ctikzvalof{tubes/tube radius}\pgf@xb \pgf@circ@count@a=\ctikzvalof{tubes/grid dashes} % dashes*2+1 \multiply\pgf@circ@count@a by 2\relax \advance\pgf@circ@count@a by 1\relax \advance\pgf@circ@res@step by -\pgf@xa \divide\pgf@circ@res@step by \pgf@circ@count@a % Grid dashes: draw \pgf@circ@res@temp=\pgf@xa \pgf@circ@count@a=\ctikzvalof{tubes/grid dashes} \loop \advance\pgf@circ@res@temp by\pgf@circ@res@step \pgfpathmoveto{\pgfpoint{\pgf@circ@res@temp}{\pgfutil@tempdima}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@temp+\pgf@circ@res@step}{\pgfutil@tempdima}} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@temp}{\pgfutil@tempdimb}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@temp+\pgf@circ@res@step}{\pgfutil@tempdimb}} \advance\pgf@circ@res@temp by\pgf@circ@res@step \advance\pgf@circ@count@a by-1 \ifnum\pgf@circ@count@a>0\relax \repeat } \pgfcircdeclaretube{pentode} { \anchor{grid} {% should not be used \northwest \pgfutil@tempdima=\pgf@y \pgf@y=-\ctikzvalof{tubes/grid separation}\pgf@y \advance\pgf@y by \ctikzvalof{tubes/grid shift}\pgfutil@tempdima } \anchor{control} {% \northwest \pgfutil@tempdima=\pgf@y \pgf@y=-\ctikzvalof{tubes/grid separation}\pgf@y \advance\pgf@y by \ctikzvalof{tubes/grid shift}\pgfutil@tempdima } \anchor{screen} {% \northwest \pgf@y=\ctikzvalof{tubes/grid shift}\pgf@y } \anchor{suppressor} {% \northwest \pgfutil@tempdima=\pgf@y \pgf@y=\ctikzvalof{tubes/grid separation}\pgf@y \advance\pgf@y by \ctikzvalof{tubes/grid shift}\pgfutil@tempdima } } { % Grid x/y points \pgf@xa=-\ctikzvalof{tubes/tube radius}\pgf@circ@res@right \advance\pgf@xa by -\ctikzvalof{tubes/grid protrusion}\pgf@circ@res@right \pgfutil@tempdima=\ctikzvalof{tubes/grid separation}\pgf@circ@res@up \pgfutil@tempdimb=-\pgfutil@tempdima \advance\pgfutil@tempdima by \ctikzvalof{tubes/grid shift}\pgf@circ@res@up \advance\pgfutil@tempdimb by \ctikzvalof{tubes/grid shift}\pgf@circ@res@up \pgf@circ@res@other=\ctikzvalof{tubes/grid shift}\pgf@circ@res@up % Grid protrusion \pgfpathmoveto{\pgfpoint{-\pgf@circ@res@right}{\pgfutil@tempdimb}} \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgfutil@tempdimb}} \pgfpathmoveto{\pgfpoint{-\pgf@circ@res@right}{\pgfutil@tempdima}} \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgfutil@tempdima}} \pgfpathmoveto{\pgfpoint{-\pgf@circ@res@right}{\pgf@circ@res@other}} \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgf@circ@res@other}} % Grid dashes: calculations \pgf@xb=2\pgf@circ@res@right \pgf@circ@res@step=\ctikzvalof{tubes/tube radius}\pgf@xb \pgf@circ@count@a=\ctikzvalof{tubes/grid dashes} % dashes*2+1 \multiply\pgf@circ@count@a by 2\relax \advance\pgf@circ@count@a by 1\relax \advance\pgf@circ@res@step by -\pgf@xa \divide\pgf@circ@res@step by \pgf@circ@count@a % Grid dashes: draw \pgf@circ@res@temp=\pgf@xa \pgf@circ@count@a=\ctikzvalof{tubes/grid dashes} \loop \advance\pgf@circ@res@temp by\pgf@circ@res@step \pgfpathmoveto{\pgfpoint{\pgf@circ@res@temp}{\pgfutil@tempdima}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@temp+\pgf@circ@res@step}{\pgfutil@tempdima}} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@temp}{\pgfutil@tempdimb}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@temp+\pgf@circ@res@step}{\pgfutil@tempdimb}} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@temp}{\pgf@circ@res@other}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@temp+\pgf@circ@res@step}{\pgf@circ@res@other}} \advance\pgf@circ@res@temp by\pgf@circ@res@step \advance\pgf@circ@count@a by-1 \ifnum\pgf@circ@count@a>0\relax \repeat } \pgfcircdeclaretube{pentode suppressor to cathode} { \anchor{grid} {% should not be used \northwest \pgfutil@tempdima=\pgf@y \pgf@y=-\ctikzvalof{tubes/grid separation}\pgf@y \advance\pgf@y by \ctikzvalof{tubes/grid shift}\pgfutil@tempdima } \anchor{control} {% \northwest \pgfutil@tempdima=\pgf@y \pgf@y=-\ctikzvalof{tubes/grid separation}\pgf@y \advance\pgf@y by \ctikzvalof{tubes/grid shift}\pgfutil@tempdima } \anchor{screen} {% \northwest \pgf@y=\ctikzvalof{tubes/grid shift}\pgf@y } } { % Grid x/y points \pgf@xa=-\ctikzvalof{tubes/tube radius}\pgf@circ@res@right \advance\pgf@xa by -\ctikzvalof{tubes/grid protrusion}\pgf@circ@res@right \pgfutil@tempdima=\ctikzvalof{tubes/grid separation}\pgf@circ@res@up \pgfutil@tempdimb=-\pgfutil@tempdima \advance\pgfutil@tempdima by \ctikzvalof{tubes/grid shift}\pgf@circ@res@up \advance\pgfutil@tempdimb by \ctikzvalof{tubes/grid shift}\pgf@circ@res@up \pgf@circ@res@other=\ctikzvalof{tubes/grid shift}\pgf@circ@res@up % Grid protrusion \pgfpathmoveto{\pgfpoint{-\pgf@circ@res@right}{\pgfutil@tempdimb}} \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgfutil@tempdimb}} \pgfpathmoveto{\pgfpoint{-\pgf@circ@res@right}{\pgf@circ@res@other}} \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgf@circ@res@other}} % Grid dashes: calculations \pgf@xb=2\pgf@circ@res@right \pgf@circ@res@step=\ctikzvalof{tubes/tube radius}\pgf@xb \pgf@circ@count@a=\ctikzvalof{tubes/grid dashes} % dashes*2+1 \multiply\pgf@circ@count@a by 2\relax \advance\pgf@circ@count@a by 1\relax \advance\pgf@circ@res@step by -\pgf@xa \divide\pgf@circ@res@step by \pgf@circ@count@a % Grid dashes: draw \pgf@circ@res@temp=\pgf@xa \pgf@circ@count@a=\ctikzvalof{tubes/grid dashes} \loop \advance\pgf@circ@res@temp by\pgf@circ@res@step \ifnum\pgf@circ@count@a>1\relax \pgfpathmoveto{\pgfpoint{\pgf@circ@res@temp}{\pgfutil@tempdimb}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@temp+\pgf@circ@res@step}{\pgfutil@tempdimb}} \pgfpathmoveto{\pgfpoint{\pgf@circ@res@temp}{\pgf@circ@res@other}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@temp+\pgf@circ@res@step}{\pgf@circ@res@other}} \fi \pgfpathmoveto{\pgfpoint{\pgf@circ@res@temp}{\pgfutil@tempdima}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@temp+\pgf@circ@res@step}{\pgfutil@tempdima}} \advance\pgf@circ@res@temp by\pgf@circ@res@step \advance\pgf@circ@count@a by-1 \ifnum\pgf@circ@count@a>0\relax \repeat % Grid: connection from suppressor to cathode \pgfsetcornersarced{\pgfpoint{\ctikzvalof{tubes/cathode corners}\pgf@circ@res@up}{\ctikzvalof{tubes/cathode corners}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\pgf@circ@res@temp}{\pgfutil@tempdima-2*\ctikzvalof{tubes/grid separation}\pgf@circ@res@up}} \pgfpathlineto{\pgfpoint{\ctikzvalof{tubes/cathode width}\pgf@circ@res@right-0.4142136*\ctikzvalof{tubes/cathode corners}\pgf@circ@res@right}{-\ctikzvalof{tubes/cathode distance}\pgf@circ@res@up-0.4142136*\ctikzvalof{tubes/cathode corners}\pgf@circ@res@up}} }% %>>> \endinput % vim: set fdm=marker fmr=%<<<,%>>>: