% Copyright 2018-2020 by Romano Giannetti
% Copyright 2015-2020 by Stefan Lindner
% Copyright 2013-2020 by Stefan Erhardt
% Copyright 2007-2020 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

%%%%%%%%%%%%%
%% switches
%%%%%%%%%%%%%

% Legacy spdt
\pgfdeclareshape{spdt}{
    \savedmacro{\ctikzclass}{\edef\ctikzclass{switches}}
    \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/spdt/height}\pgf@circ@scaled@Rlen
        \pgf@y=.5\pgf@y
        \pgf@x=-\ctikzvalof{tripoles/spdt/width}\pgf@circ@scaled@Rlen
        \pgf@x=.5\pgf@x
    }
    \anchor{left}{%
        \northwest
        \pgf@y=0pt
    }
    \anchor{in}{
        \northwest
        \pgf@y=0pt
    }
    \anchor{out 1}{
        \northwest
        \pgf@x=-\pgf@x
    }
    \anchor{out 2}{
        \northwest
        \pgf@x=-\pgf@x
        \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}}

        \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{tripoles/spdt/margin}\pgf@circ@res@left


        \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up}}
        \pgfpathlineto{\pgfpoint{-\pgf@circ@res@other}{\pgf@circ@res@up}}
        \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down}}
        \pgfpathlineto{\pgfpoint{-\pgf@circ@res@other}{\pgf@circ@res@down}}

        \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}}
        \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{0pt}}

        \pgfusepath{draw}

        \pgfscope
            \pgftransformshift{\pgfpoint{-\pgf@circ@res@other}{\pgf@circ@res@up}}
            \pgfnode{ocirc}{center}{}{spdt1}{\pgfusepath{stroke}}
        \endpgfscope
        \pgfscope
            \pgftransformshift{\pgfpoint{-\pgf@circ@res@other}{\pgf@circ@res@down}}
            \pgfnode{ocirc}{center}{}{}{\pgfusepath{stroke}}
        \endpgfscope
        \pgfscope
            \pgftransformshift{\pgfpoint{\pgf@circ@res@other}{0pt}}
            \pgfnode{ocirc}{center}{}{spdt2}{\pgfusepath{stroke}}
        \endpgfscope

        \pgfscope
            \pgfpathmoveto{\pgfpointshapeborder{spdt2}{\pgfpointorigin}}
            \pgfpathlineto{
                \pgfpointadd{\pgfpointshapeborder{spdt1}{\pgfpoint{-\pgf@circ@res@other}{-100pt}}}
                {\pgfpoint{-.05\pgf@circ@res@up}{-.05\pgf@circ@res@up}}
            }
            \pgf@circ@setlinewidth{tripoles}{\pgflinewidth}
            \pgfusepath{draw}
        \endpgfscope
    }
}


% cute switch "node" shapes, matching with cute "to" shapes
% #1 -> name
% #2 -> barposition
% #3 -> arrowcode
\long\def\pgfcircdeclarecutespdt#1#2#3{
    \pgfdeclareshape{#1}
    {
        \savedmacro{\ctikzclass}{\edef\ctikzclass{switches}}
        \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{bipoles/cuteswitch/height}\pgf@circ@scaled@Rlen
            \pgf@y=.5\pgf@y
            \pgf@x=-\ctikzvalof{tripoles/spdt/width}\pgf@circ@scaled@Rlen
            \pgf@x=.25\pgf@x
        }
        \savedanchor\midlever{
            % these values are calculated when we create the definition of the shape.
            \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}
            \pgf@y=\ctikzvalof{bipoles/cuteswitch/height}\pgf@circ@scaled@Rlen
            \pgf@circ@res@temp=\ctikzvalof{nodes width}\pgf@circ@scaled@Rlen
            \pgf@circ@res@temp=\ctikzvalof{bipoles/cuteswitch/thickness}\pgf@circ@res@temp
            \pgf@circ@res@down = -.5\pgf@y
            \pgf@circ@res@up = .5\pgf@y
            \pgfextracty{\pgf@circ@res@other}{#2}
            \pgf@x=0pt
            \pgf@y=.5\pgf@circ@res@other
        }
        % radius of the connector
        % This is the radius of the "ocirc" shape (see pgfcircshapes.tex)
        \saveddimen{\radius}{\pgfmathsetlength\pgf@x{\pgf@circ@Rlen*\ctikzvalof{nodes width}}}
        % shapename
        \savedmacro{\thisshape}{\def\thisshape{\tikz@fig@name}}
        % shape type
        \savedmacro{\cshape}{\def\cshape{\ctikzvalof{bipoles/cuteswitch/shape}}}
        % mid of the lever, to stack switches
        \anchor{mid}{\midlever}
        % center anchors
        \anchor{cin}{ \northwest \pgf@y=0pt}
        \anchor{cout 1}{ \northwest \pgf@x=-\pgf@x }
        \anchor{cout 2}{ \northwest \pgf@x=-\pgf@x \pgf@y=-\pgf@y }
        % horizontal angles
        \anchor{in}{ \northwest \pgf@y=0pt\advance\pgf@x by -\radius}
        \anchor{out 1}{ \northwest \pgf@x=-\pgf@x \advance\pgf@x by \radius}
        \anchor{out 2}{ \northwest \pgf@x=-\pgf@x \advance\pgf@x by \radius \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}}
            \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
            % This is the radius of the "ocirc" shape (see pgfcircshapes.tex)
            \pgf@circ@res@temp=\radius\relax
            \pgf@circ@res@temp=\ctikzvalof{bipoles/cuteswitch/thickness}\pgf@circ@res@temp
            \pgfsetlinewidth{2\pgf@circ@res@temp}
            \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}}
            \pgfpathlineto{#2}
            \pgfsetroundcap\pgfusepath{draw}
            \endpgfscope
            \pgfscope % arrow
            #3
            \endpgfscope
            % terminals
            \pgfscope
            \pgftransformshift{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up}}
            \pgfnode{\cshape}{center}{}{\thisshape-out 1}{\pgfusepath{stroke}}
            \endpgfscope
            \pgfscope
            \pgftransformshift{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down}}
            \pgfnode{\cshape}{center}{}{\thisshape-out 2}{\pgfusepath{stroke}}
            \endpgfscope
            \pgfscope
            \pgftransformshift{\pgfpoint{\pgf@circ@res@left}{0pt}}
            \pgfnode{\cshape}{center}{}{\thisshape-in}{\pgfusepath{stroke}}
            \endpgfscope

        }
    }
}

\pgfcircdeclarecutespdt{cute spdt up}
{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up-1.5\pgf@circ@res@temp}}
{}

\pgfcircdeclarecutespdt{cute spdt mid}
{\pgfpoint{\pgf@circ@res@right}{0pt}}
{}

\pgfcircdeclarecutespdt{cute spdt down}
{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down+1.5\pgf@circ@res@temp}}
{}

\pgfcircdeclarecutespdt{cute spdt up arrow}
{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up-1.5\pgf@circ@res@temp}}
{
    \pgf@circ@setlinewidth{bipoles}{\pgflinewidth}
    \pgftransformshift{\pgfpoint{\pgf@circ@res@left}{0pt}} % in node
    \pgfpathmoveto{\pgfpointpolar{70}{1.5\pgf@circ@res@right}}
    \pgfpatharc{70}{-50}{1.5\pgf@circ@res@right}
    \pgfsetarrowsend{latexslim}
    \pgfusepath{draw}
}

\pgfcircdeclarecutespdt{cute spdt mid arrow}
{\pgfpoint{\pgf@circ@res@right}{0pt}}
{
    \pgf@circ@setlinewidth{bipoles}{\pgflinewidth}
    \pgftransformshift{\pgfpoint{\pgf@circ@res@left}{0pt}} % in node
    \pgfsetarrowsstart{latexslim}
    \pgfpathmoveto{\pgfpointpolar{-60}{1.5\pgf@circ@res@right}}
    \pgfpatharc{-60}{60}{1.5\pgf@circ@res@right}
    \pgfsetarrowsend{latexslim}
    \pgfusepath{draw}
}

\pgfcircdeclarecutespdt{cute spdt down arrow}
{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down+1.5\pgf@circ@res@temp}}
{
    \pgf@circ@setlinewidth{bipoles}{\pgflinewidth}
    \pgftransformshift{\pgfpoint{\pgf@circ@res@left}{0pt}} % in node
    \pgfpathmoveto{\pgfpointpolar{-50}{1.5\pgf@circ@res@right}}
    \pgfpatharc{-50}{70}{1.5\pgf@circ@res@right}
    \pgfsetarrowsend{latexslim}
    \pgfusepath{draw}
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%%       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@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
    \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}}
    \pgfpathlineto{\pgfpoint
        {\ctikzvalof{tripoles/american and port/port width}\pgf@circ@res@right}
    {0pt}}
    \pgfusepath{draw}


    \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@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

    \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}}
    \pgfpathlineto{\pgfpoint
        {\ctikzvalof{tripoles/american nand port/port width}\pgf@circ@res@right} {0pt}}

    \pgfusepath{draw}
    \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@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
    \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}}
    \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{0pt}}

    \pgfusepath{draw}

    \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@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
    \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}}
    \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{0pt}}

    \pgfusepath{draw}

    \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@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
    \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}}
    \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{0pt}}

    \pgfusepath{draw}

    \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@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
    \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}}
    \pgfpathlineto{\pgfpoint{\pgf@circ@res@other}{0pt}}

    \pgfusepath{draw}

    \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{bin}{
        \northwest
        \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{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
    }
    \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@leads
            %input leads
            \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}}
            \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@left}{0pt}}
        \fi

        \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}}
        \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@right}{0pt}}

        \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{bin}{
        \northwest
        \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{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
    }
    \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@leads
            %input leads
            \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}}
            \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@left}{0pt}}
        \fi

        \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}}
        \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@right}{0pt}}

        \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{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{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
    }
    \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@leads
            %input leads
            \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}}
            \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@left}{0pt}}
        \fi

        \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}}
        \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@right}{0pt}}
        \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{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{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
    }
    \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@leads
            %input leads
            \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}}
            \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@left}{0pt}}
        \fi

        \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}}
        \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@right-\pgf@circ@res@other}{0pt}}
        \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}{%
            \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
        }
        \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}

    \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}}
        \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@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
        \fi
        %
        \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}}
        \pgfpathlineto{%
        \pgfpoint{\ctikzvalof{tripoles/european #1 port/reserved}\pgf@circ@res@right}{0pt}}
        %
        \pgfusepath{draw}
        %
        \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

%%%%%%%%%%%%%%%%%%%%%%%%
%% Transistors
%%%%%%%%%%%%%%%%%%%%%%%%


\long\def\pgfcircdeclaretransistor#1#2#3{
    \pgfdeclareshape{#1}
    {
        \savedmacro{\ctikzclass}{\edef\ctikzclass{transistors}}
        \saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}}
        \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{%center right -- added by Burak Kelleci % this is really 0,0
            \pgf@y=0pt
            \pgf@x=0pt
        }
        \anchor{text}{
            \northeast
            \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}
            \ifpgf@circuit@transisors@fixlabels
                \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}
                    \advance\pgf@x by \pgf@circ@res@other
                \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{east}{
            \northeast
            \pgf@y=0pt
        }
        \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{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{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
        }
        }{
        \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@<name of the shape here> 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
        }
    }
    {
        %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}

\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
        }
    }{%
    \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
}

\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
        }
    }{%
    \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
}

%% 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
        }
    }{%
    \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

    \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}
}

\long\def\drawfetcore#1{
    \pgftransformationadjustments
    %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

}

\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}
}

% 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
}

\pgfcircdeclaretransistor{njfet}{
        \anchor{inner up}{
            \northeast
            \pgf@y=\ctikzvalof{tripoles/njfet/gate height 2}\pgf@y
        }
        \anchor{inner down}{
            \northeast
            \pgf@y=-\ctikzvalof{tripoles/njfet/gate height 2}\pgf@y
        }
    }{%
    \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}}
    \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}
    {\ctikzvalof{tripoles/njfet/gate height 2}\pgf@circ@res@up}}
    \pgfpathlineto{\pgfpoint
        {\ctikzvalof{tripoles/njfet/gate width}\pgf@circ@res@left}
    {\ctikzvalof{tripoles/njfet/gate height 2}\pgf@circ@res@up}}

    \pgfpathmoveto{\pgfpoint
        {\ctikzvalof{tripoles/njfet/gate width}\pgf@circ@res@left}
    {\ctikzvalof{tripoles/njfet/gate height 2}\pgf@circ@res@down}}
    \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}
    {\ctikzvalof{tripoles/njfet/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/njfet/gate width}\pgf@circ@res@left}
        {\ctikzvalof{tripoles/njfet/gate height}\pgf@circ@res@up}}
        \pgfpathlineto{\pgfpoint
            {\ctikzvalof{tripoles/njfet/gate width}\pgf@circ@res@left}
        {\ctikzvalof{tripoles/njfet/gate height}\pgf@circ@res@down}}
        \pgf@circ@setlinewidth{tripoles}{\pgflinewidth}
        \pgfusepath{draw}
    \endpgfscope

    % 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@left}%
            {\ctikzvalof{tripoles/njfet/gate height 2}\pgf@circ@res@down}%
            }{%
            \pgfpoint
            {\ctikzvalof{tripoles/njfet/gate width}\pgf@circ@res@left}%
            {\ctikzvalof{tripoles/njfet/gate height 2}\pgf@circ@res@down}%
        }
        \pgfnode{trarrow}{\@@anchor}{}{}{\pgfusepath{stroke}}
    \endpgfscope

    \pgfpathmoveto{\pgfpoint
        {\ctikzvalof{tripoles/njfet/gate width}\pgf@circ@res@left}
    {\ctikzvalof{tripoles/njfet/gate height 2}\pgf@circ@res@down}}
    \pgfpathlineto{\pgfpoint{\pgf@circ@res@left-\pgfhorizontaltransformationadjustment*.5*\pgflinewidth}
    {\ctikzvalof{tripoles/njfet/gate height 2}\pgf@circ@res@down}}
    \pgfusepath{draw}
}

\pgfcircdeclaretransistor{pjfet}{
        \anchor{inner up}{
            \northeast
            \pgf@y=\ctikzvalof{tripoles/pjfet/gate height 2}\pgf@y
        }
        \anchor{inner down}{
            \northeast
            \pgf@y=-\ctikzvalof{tripoles/pjfet/gate height 2}\pgf@y
        }
    }{%
    \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}}
    \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}
    {\ctikzvalof{tripoles/pjfet/gate height 2}\pgf@circ@res@up}}
    \pgfpathlineto{\pgfpoint
        {\ctikzvalof{tripoles/pjfet/gate width}\pgf@circ@res@left}
    {\ctikzvalof{tripoles/pjfet/gate height 2}\pgf@circ@res@up}}

    \pgfpathmoveto{\pgfpoint
        {\ctikzvalof{tripoles/pjfet/gate width}\pgf@circ@res@left}
    {\ctikzvalof{tripoles/pjfet/gate height 2}\pgf@circ@res@down}}
    \pgfpathlineto{\pgfpoint{\pgf@circ@res@right}
    {\ctikzvalof{tripoles/pjfet/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/pjfet/gate width}\pgf@circ@res@left}
        {\ctikzvalof{tripoles/pjfet/gate height}\pgf@circ@res@up}}
        \pgfpathlineto{\pgfpoint
            {\ctikzvalof{tripoles/pjfet/gate width}\pgf@circ@res@left}
        {\ctikzvalof{tripoles/pjfet/gate height}\pgf@circ@res@down}}
        \pgf@circ@setlinewidth{tripoles}{\pgflinewidth}
        \pgfusepath{draw}
    \endpgfscope

    \pgfscope
        \pgfslopedattimetrue
        \pgfallowupsidedownattimetrue
        \pgfresetnontranslationattimefalse
        \ifpgf@circuit@trans@arrowatend
            \edef\@@anchor{btip}\edef\@@pos{1.0}
        \else
            \edef\@@anchor{center}\edef\@@pos{0.4}
        \fi
        \pgftransformlineattime{\@@pos}{%
            \pgfpoint%
            {\ctikzvalof{tripoles/pjfet/gate width}\pgf@circ@res@left}%
            {\ctikzvalof{tripoles/pjfet/gate height 2}\pgf@circ@res@up}%
            }{%
            \pgfpoint{\pgf@circ@res@left}%
            {\ctikzvalof{tripoles/pjfet/gate height 2}\pgf@circ@res@up}%
        }
        \pgfnode{trarrow}{\@@anchor}{}{}{\pgfusepath{stroke}}
    \endpgfscope

    \pgfpathmoveto{\pgfpoint
        {\ctikzvalof{tripoles/pjfet/gate width}\pgf@circ@res@left}
    {\ctikzvalof{tripoles/pjfet/gate height 2}\pgf@circ@res@up}}
    \pgfpathlineto{\pgfpoint{\pgf@circ@res@left-\pgfhorizontaltransformationadjustment*.5*\pgflinewidth}
    {\ctikzvalof{tripoles/pjfet/gate height 2}\pgf@circ@res@up}}
    \pgfusepath{draw}
}

\pgfdeclaretransistorwrapperaddbulk{isfet}{}{%
    \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

%%%%%%%%%%%%%
%% Switches
%%%%%%%%%%%%%

\pgfcircdeclarebipole{
	\anchor{out 1}{
		\northeast
		\pgf@y=0cm
	}
	\anchor{out 2}{
		\northeast
		\pgf@y=.8\pgf@y
	}
}
{\ctikzvalof{tripoles/toggleswitch/height 2}}
{toggleswitch}
{\ctikzvalof{tripoles/toggleswitch/height}}
{\ctikzvalof{tripoles/toggleswitch/width}}
{

    \pgfpathmoveto{\pgfpoint{\pgf@circ@res@left}{0pt}}
    \pgfpathlineto{\pgfpoint{.3\pgf@circ@res@left}{0pt}}
    \pgfusepath{draw}
    \pgfscope
        \pgfpathmoveto{\pgfpoint{.3\pgf@circ@res@left}{0pt}}
        \pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
        \pgfpathlineto{\pgfpoint{.7\pgf@circ@res@right}{.5\pgf@circ@res@up}}
        \pgfusepath{draw}
    \endpgfscope

    \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{0pt}}
    \pgfpathlineto{\pgfpoint{.5\pgf@circ@res@right}{0}}

    \pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{.8\pgf@circ@res@up}}
    \pgfpathlineto{\pgfpoint{.5\pgf@circ@res@right}{.8\pgf@circ@res@up}}
    \pgfpathlineto{\pgfpoint{.5\pgf@circ@res@right}{.15\pgf@circ@res@up}}
    \pgfusepath{draw}


    \pgfpathmoveto{\pgfpoint{.2\pgf@circ@res@left}{\pgf@circ@res@up}}
    \pgfpathlineto{\pgfpoint{.2\pgf@circ@res@right}{\pgf@circ@res@up}}
    \pgfusepath{draw}

    \pgfsetdash{{.08\pgf@circ@res@up}{.04\pgf@circ@res@up}{.7\pgf@circ@res@up}{.04\pgf@circ@res@up}{.8\pgf@circ@res@up}}{0cm}
    \pgfpathmoveto{\pgfpoint{0}{\pgf@circ@res@up}}
    \pgfpathlineto{\pgfpoint{0}{.8\pgf@circ@res@up}}
    \pgfpathlineto{\pgfpoint{.2\pgf@circ@res@left}{.6\pgf@circ@res@up}}
    \pgfpathlineto{\pgfpoint{0}{.4\pgf@circ@res@up}}
    \pgfpathlineto{\pgfpoint{0}{.2\pgf@circ@res@up}}
    \pgfusepath{draw}
    \pgfsetdash{}{0cm}
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 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}
    }
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% electromechanical device (motor/generator)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\pgfdeclareshape{elmech}
{
    \savedmacro{\ctikzclass}{\edef\ctikzclass{electromechanicals}}
    \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/elmech/height}\pgf@circ@scaled@Rlen
        \pgf@y=.5\pgf@y
        \pgf@x=-\ctikzvalof{tripoles/elmech/width}\pgf@circ@scaled@Rlen
        \pgf@x=.5\pgf@x
    }
    \anchor{center}{
        \pgfpointorigin
    }
    \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 }
    \anchorborder{%
        \@tempdima=\pgf@x\@tempdimb=\pgf@y
        \northwest\pgf@circ@res@other=-\pgf@x
        \pgfpointborderellipse{\pgfqpoint{\@tempdima}{\@tempdimb}}{\pgfqpoint{\pgf@circ@res@other}{\pgf@circ@res@other}}
    }
    \anchor{block north west}{\northwest\pgf@x=0.5\pgf@x}
    \anchor{block south west}{\northwest\pgf@x=0.5\pgf@x\pgf@y=-\pgf@y}
    \anchor{block north east}{\northwest\pgf@x=-0.5\pgf@x}
    \anchor{block south east}{\northwest\pgf@x=-0.5\pgf@x\pgf@y=-\pgf@y}
    \anchor{block up right}{
        \northwest
        % remember that pgf@x is negative
        % center of the block is at 0.5*H+W*cos(30)/2
        \pgf@y=\dimexpr0.5\pgf@y - 0.433\pgf@x\relax
        \pgf@x=-0.5\pgf@x
    }
    \anchor{block up left}{
        \northwest
        % remember that pgf@x is negative
        % center of the block is at 0.5*H+W*cos(30)/2
        \pgf@y=\dimexpr0.5\pgf@y - 0.433\pgf@x\relax
        \pgf@x=0.5\pgf@x
    }
    \anchor{block down right}{
        \northwest
        % remember that pgf@x is negative
        % center of the block is at 0.5*H+W*cos(30)/2
        \pgf@y=\dimexpr0.5\pgf@y - 0.433\pgf@x\relax
        \pgf@y=-\pgf@y
        \pgf@x=-0.5\pgf@x
    }
    \anchor{block down left}{
        \northwest
        % remember that pgf@x is negative
        % center of the block is at 0.5*H+W*cos(30)/2
        \pgf@y=\dimexpr0.5\pgf@y - 0.433\pgf@x\relax
        \pgf@y=-\pgf@y
        \pgf@x=0.5\pgf@x
    }
    \behindbackgroundpath{
        \pgfsetcolor{\ctikzvalof{color}}
        \pgf@circ@scaled@Rlen=\scaledRlen
        \pgf@circ@res@step=\ctikzvalof{tripoles/elmech/width}\pgf@circ@scaled@Rlen
        \pgf@circ@res@up=\ctikzvalof{tripoles/elmech/height}\pgf@circ@scaled@Rlen
        \pgfscope
            \pgfstartlinewidth=\pgflinewidth
            \pgf@circ@setlinewidth{bipoles}{\pgfstartlinewidth}
            \pgfscope % clip the bar: whole size minus the circle
                \pgfpathrectanglecorners{\pgfpoint{-.5\pgf@circ@res@step}{-.5\pgf@circ@res@up}}{\pgfpoint{.5\pgf@circ@res@step}{.5\pgf@circ@res@up}}
                \pgfpathcircle{\pgfpoint{0}{0}} {0.5\pgf@circ@res@step}
                \pgfseteorule
                \pgfusepath{clip}
                \pgfpathrectangle{\pgfpoint{-.25\pgf@circ@res@step}{-.5\pgf@circ@res@up}}{\pgfpoint{.5\pgf@circ@res@step}{\pgf@circ@res@up}}
                \pgfsetfillcolor{\ctikzvalof{color}}
                \pgfusepath{fill, draw}
            \endpgfscope
            \pgfpathcircle{\pgfpoint{0}{0}} {0.5\pgf@circ@res@step}
            \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}
                \pgfusepath{draw, fill}
            \fi
        \endpgfscope
    }
}

%%%%%%%%%%%%%%%%%%%
%% 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
