% Copyright 2008 by Mark Wibrow
%
% 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 file doc/generic/pgf/licenses/LICENSE for more details.

\usepgflibrary{shapes.gates.logic}%


\newif\ifpgfgateanchorsuseboundingrectangle%


% Keys for US/CDH logic gates.
%
\pgfkeys{
  /pgf/logic gate anchors use bounding box/.is if=pgfgateanchorsuseboundingrectangle,%
}%

% An internal macro for calculating internal dimensions of
% the US + CDH gates (excluding and gate US and nand gate US).
%
\def\pgf@lib@sh@logicgates@dimensions@orUS{%
    \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
    \advance\pgf@x.5\wd\pgfnodeparttextbox%
    \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
    \advance\pgf@y.5\ht\pgfnodeparttextbox%
    \advance\pgf@y.5\dp\pgfnodeparttextbox%
    %
    % Adjust the height for the number of inputs.
    %
    \c@pgf@counta\pgf@lib@sh@logicgate@numinputs%
    \advance\c@pgf@counta1\relax%
    \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
    \advance\pgf@ya\pgflinewidth%
    \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/logic gate input sep}}%
    \pgf@yb.5\pgf@yb%
    \ifdim\pgf@ya<\pgf@yb%
        \pgf@ya\pgf@yb%
    \fi%
    \multiply\pgf@ya\c@pgf@counta%
    \ifdim\pgf@y<\pgf@ya%
        \pgf@y\pgf@ya%
    \fi%
    %
    \ifdim\pgf@x>\pgf@y%
        \pgf@y\pgf@x%
    \else%
        \pgf@x\pgf@y%
    \fi%
    %
    % Adjust for minimum height and width.
    %
    \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
    \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
    \ifdim\pgf@y<.5\pgf@ya%
        \pgf@y.5\pgf@ya%
    \fi%
    \pgf@xb\pgf@x%
    \advance\pgf@xb1.732051\pgf@y% 2y*cos(30)
    \ifdim\pgf@xb<\pgf@xa%
        \pgf@xb\pgf@xa%
        \pgf@x0.366025\pgf@xb% xb / (1 + 2*cos(30))
    \fi%
    %
    \ifdim\pgf@x>\pgf@y%
        \pgf@y\pgf@x%
    \else%
        \pgf@x\pgf@y%
    \fi%
    \edef\halfside{\the\pgf@x}%
    \addtosavedmacro\halfside%
    %
    % Take into account the outer sep.
    %
    \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
    \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
    \edef\outerxsep{\the\pgf@xa}%
    \edef\outerysep{\the\pgf@ya}%
    \addtosavedmacro\outerxsep%
    \addtosavedmacro\outerysep%
    \advance\pgf@x\pgf@xa%
    \advance\pgf@y\pgf@ya%
    %
    \edef\halfwidth{\the\pgf@x}%
    \edef\halfheight{\the\pgf@y}%
    \addtosavedmacro\halfwidth%
    \addtosavedmacro\halfheight%
    %
    \pgfextract@process\tipanchor{%
        \advance\pgf@x-\pgf@xa%
        \advance\pgf@y-\pgf@ya%
        \pgf@x-.16666\pgf@x%
        \pgf@yb2.0\pgf@y%
        \advance\pgf@x.866025\pgf@yb%
        \advance\pgf@x1.154701\pgf@xa%
        \pgf@y0pt%
    }%
    \addtosavedmacro\tipanchor%
}%


% An internal macro for calculating internal dimensions of
% the and gate US and nand gate US.
%
\def\pgf@lib@sh@logicgates@dimensions@andUS{%
    \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
    \advance\pgf@x.5\wd\pgfnodeparttextbox%
    \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
    \advance\pgf@y.5\ht\pgfnodeparttextbox%
    \advance\pgf@y.5\dp\pgfnodeparttextbox%
    %
    % Adjust the height for the number of inputs.
    %
    \c@pgf@counta\pgf@lib@sh@logicgate@numinputs%
    \advance\c@pgf@counta1\relax%
    \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
    \advance\pgf@ya\pgflinewidth%
    \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/logic gate input sep}}%
    \pgf@yb.5\pgf@yb%
    \ifdim\pgf@ya<\pgf@yb%
        \pgf@ya\pgf@yb%
    \fi%
    \multiply\pgf@ya\c@pgf@counta%
    \ifdim\pgf@y<\pgf@ya%
        \pgf@y\pgf@ya%
    \fi%
    %
    \ifdim\pgf@x>\pgf@y%
        \pgf@y\pgf@x%
    \else%
        \pgf@x\pgf@y%
    \fi%
    %
    % Adjust for minimum height and width.
    %
    \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
    \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
    \ifdim\pgf@y<.5\pgf@ya%
        \pgf@y.5\pgf@ya%
    \fi%
    \pgf@xb2.5\pgf@x%
    \ifdim\pgf@xb<\pgf@xa%
        \pgf@xb\pgf@xa%
        \pgf@x0.4\pgf@xb%
    \fi%
    %
    \ifdim\pgf@x>\pgf@y%
        \pgf@y\pgf@x%
    \else%
        \pgf@x\pgf@y%
    \fi%
    \edef\halfside{\the\pgf@x}%
    \addtosavedmacro\halfside%
    %
    % Take into account the outer sep.
    %
    \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
    \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
    \edef\outerxsep{\the\pgf@xa}%
    \edef\outerysep{\the\pgf@ya}%
    \addtosavedmacro\outerxsep%
    \addtosavedmacro\outerysep%
    \advance\pgf@x\pgf@xa%
    \advance\pgf@y\pgf@ya%
    %
    \edef\halfwidth{\the\pgf@x}%
    \edef\halfheight{\the\pgf@y}%
    \addtosavedmacro\halfwidth%
    \addtosavedmacro\halfheight%
    %
}%


% Internal macro for calculation input anchors. Used by
% both and gates and nand gates, and also the not gate and buffer.
%
\def\pgf@lib@sh@logicgate@AND@inputanchor#1{%
    \dimensions%
    \centerpoint%
    \pgf@xa\halfside%
    \advance\pgf@x-.166666\pgf@xa%
    \advance\pgf@x-\halfwidth%
    \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-#1\endcsname%
        \advance\pgf@x-\invertedradius%
        \advance\pgf@x-\outerinvertedradius%
    \fi%
    %
    \pgfutil@tempdima\halfside%
    \multiply\pgfutil@tempdima2\relax%
    \c@pgf@counta\numinputs%
    \advance\c@pgf@counta1\relax%
    \divide\pgfutil@tempdima\c@pgf@counta%
    \multiply\pgfutil@tempdima#1\relax%
    \advance\pgf@y\halfside%
    \advance\pgf@y-\pgfutil@tempdima%
}%




% Shape and gate US
%
\pgfdeclareshape{and gate US}{%
    \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@and gate US\endcsname{%
        \pgf@lib@sh@logicgate@parseinputs{1024}% Maximum 1024 (!) inputs.
        %
        \pgfmathloop%
        \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
        \else%
            \pgfutil@ifundefined{pgf@anchor@and gate US@input \pgfmathcounter}{%
                \expandafter\xdef\csname pgf@anchor@and gate US@input \pgfmathcounter\endcsname{%
                    \noexpand\pgf@lib@sh@logicgate@AND@inputanchor{\pgfmathcounter}%
                }%
            }{}%
        \repeatpgfmathloop%
        \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
            \pgferror{An and gate must have at least two inputs}%
        \fi%
    }%
    \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
    \saveddimen\invertedradius{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
    }%
    \saveddimen\outerinvertedradius{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
        \advance\pgf@x.5\pgflinewidth%
    }%
    \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@andUS}%
    \savedanchor\centerpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y.5\ht\pgfnodeparttextbox%
        \advance\pgf@y-.5\dp\pgfnodeparttextbox%
    }%
    \savedanchor\midpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgfmathsetlength\pgf@y{+0.5ex}%
    }%
    \savedanchor\basepoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y0pt%
    }%
    \anchor{center}{\centerpoint}%
    \anchor{mid}{\midpoint}%
    \anchor{mid east}{%
        \csname pgf@anchor@and gate US@east\endcsname%
        \pgf@xa\pgf@x%
        \midpoint%
        \pgf@x\pgf@xa}%
    \anchor{mid west}{%
        \csname pgf@anchor@and gate US@west\endcsname%
        \pgf@xa\pgf@x%
        \midpoint%
        \pgf@x\pgf@xa}%
    \anchor{base}{\basepoint}%
    \anchor{base east}{%
        \csname pgf@anchor@and gate US@east\endcsname%
        \pgf@xa\pgf@x%
        \basepoint%
        \pgf@x\pgf@xa}%
    \anchor{base west}{%
        \csname pgf@anchor@and gate US@west\endcsname%
        \pgf@xa\pgf@x%
        \basepoint%
        \pgf@x\pgf@xa}%
    \anchor{east}{%
        \dimensions%
        \pgf@xa\halfwidth%
        \pgf@xb\pgf@xa%
        \advance\pgf@xb-\outerxsep%
        \centerpoint%
        \advance\pgf@x.333333\pgf@xb%
        \advance\pgf@x\pgf@xa%
    }%
    \anchor{output}{\csname pgf@anchor@and gate US@east\endcsname}%
    \anchor{north east}{%
        \dimensions%
        \ifpgfgateanchorsuseboundingrectangle%
            \csname pgf@anchor@nand gate US@east\endcsname%
            \advance\pgf@y\halfheight%
        \else
            \pgf@xa\halfwidth%
            \pgf@ya\halfheight%
            \pgf@xb\pgf@xa%
            \advance\pgf@xb-\outerxsep%
            \centerpoint%
            \advance\pgf@x.333333\pgf@xb%
            \advance\pgf@x.707106\pgf@xa%
            \advance\pgf@y.707106\pgf@ya%
        \fi%
    }%
    \anchor{south east}{%
        \dimensions%
        \ifpgfgateanchorsuseboundingrectangle%
            \csname pgf@anchor@nand gate US@east\endcsname%
            \advance\pgf@y-\halfheight%
        \else
            \pgf@xa\halfwidth%
            \pgf@ya\halfheight%
            \pgf@xb\pgf@xa%
            \advance\pgf@xb-\outerxsep%
            \centerpoint%
            \advance\pgf@x.333333\pgf@xb%
            \advance\pgf@x.707106\pgf@xa%
            \advance\pgf@y-.707106\pgf@ya%
        \fi%
    }%
    \anchor{north}{%
        \dimensions%
        \centerpoint%
        \advance\pgf@y\halfheight%
    }%
    \anchor{south}{%
        \dimensions%
        \centerpoint%
        \advance\pgf@y-\halfheight%
    }%
    \anchor{south west}{%
        \dimensions%
        \centerpoint%
        \pgf@xa\halfside%
        \advance\pgf@x-1.16666\pgf@xa%
        \advance\pgf@x-\outerxsep%
        \advance\pgf@y-\halfheight%
    }%
    \anchor{north west}{%
        \dimensions%
        \centerpoint%
        \pgf@xa\halfside%
        \advance\pgf@x-1.16666\pgf@xa%
        \advance\pgf@x-\outerxsep%
        \advance\pgf@y\halfheight%
    }%
    \anchor{west}{%
        \dimensions%
        \centerpoint%
        \pgf@xa\halfside%
        \advance\pgf@x-1.16666\pgf@xa%
        \advance\pgf@x-\outerxsep%
    }%
    \backgroundpath{%
        \dimensions%
        \pgf@xc\halfwidth%
        \pgf@yc\halfheight%
        \advance\pgf@xc-\outerxsep%
        \advance\pgf@yc-\outerysep%
        \pgf@xb.333333\pgf@xc%
        {%
            \pgftransformshift{\centerpoint}%
            \pgfpathmoveto{\pgfqpoint{\pgf@xb}{\pgf@yc}}%
            {%
                \edef\pgf@marshal{%
                    \noexpand\pgfpatharc{90}{-90}{\the\pgf@yc}%
                }%
                \pgf@marshal%
            }
            \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{-\pgf@yc}}%
            \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{\pgf@yc}}%
            \pgfpathclose%
            %
            % Draw the inputs.
            %
            \pgfutil@tempdima2.0\pgf@yc%
            \c@pgf@counta\numinputs%
            \advance\c@pgf@counta1\relax%
            \divide\pgfutil@tempdima\c@pgf@counta%
            \pgfmathloop%
            \ifnum\pgfmathcounter>\numinputs%
            \else%
                \advance\pgf@yc-\pgfutil@tempdima%
                \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-\pgfmathcounter\endcsname%
                    {%
                        \pgfpathcircle{%
                            \pgf@xa\halfside%
                            \pgf@x-1.16666\pgf@xa%
                            \advance\pgf@x-.5\pgflinewidth%
                            \advance\pgf@x-\invertedradius%
                            \pgf@y\pgf@yc%
                        }{+\invertedradius}%
                    }%
                \fi%
            \repeatpgfmathloop%
        }%
    }%
    \anchorborder{%
        \pgfextract@process\externalpoint{}%
        \pgfextract@process\externalpoint{\pgfpointadd{\centerpoint}{\externalpoint}}%
        \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
        \let\externalangle\pgfmathresult%
        \dimensions%
        \pgf@xb\halfside%
        \pgf@xc1.66666\pgf@xb%
        \advance\pgf@xc\outerxsep%
        \pgf@yc\halfheight%
        \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@and gate US@north west\endcsname}%
        \ifdim\externalangle pt<\pgfmathresult pt\relax%
            \pgfmathanglebetweenpoints{\centerpoint}{\centerpoint\advance\pgf@x.333333\pgf@xb\advance\pgf@y\pgf@yc}%
            \ifdim\externalangle pt<\pgfmathresult pt\relax%
                \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
                    {%
                        \centerpoint%
                        \advance\pgf@x.333333\pgf@xb%
                    }%
                    {0}{90}{+\halfwidth and +\halfheight}%
            \else%
                \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
                    {\centerpoint\advance\pgf@x.333333\pgf@xb\advance\pgf@y\pgf@yc}%
                    {\centerpoint\advance\pgf@x-\pgf@xc\advance\pgf@y\pgf@yc}%
            \fi%
        \else%
            \pgfmathanglebetweenpoints{\centerpoint}{\centerpoint\advance\pgf@x.333333\pgf@xb\advance\pgf@y-\pgf@yc}%
            \ifdim\externalangle pt>\pgfmathresult pt\relax%
                    \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
                    {%
                        \centerpoint%
                        \advance\pgf@x.333333\pgf@xb%
                    }%
                    {270}{360}{+\halfwidth and +\halfheight}%
            \else%
                \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@and gate US@south west\endcsname}%
                \ifdim\externalangle pt>\pgfmathresult pt\relax%
                    \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
                        {\centerpoint\advance\pgf@x.333333\pgf@xb\advance\pgf@y-\pgf@yc}%
                        {\csname pgf@anchor@and gate US@south west\endcsname}%
                \else%
                    \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
                        {\csname pgf@anchor@and gate US@north west\endcsname}%
                        {\csname pgf@anchor@and gate US@south west\endcsname}%
                \fi%
            \fi%
        \fi%
    }%
}%





% Shape nand gate US
%
\pgfdeclareshape{nand gate US}{%
    \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@nand gate US\endcsname{%
        \pgf@lib@sh@logicgate@parseinputs{1024}% Maximum 1024 (!) inputs.
        %
        \pgfmathloop%
        \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
        \else%
            \pgfutil@ifundefined{pgf@anchor@nand gate US@input \pgfmathcounter}{%
                \expandafter\xdef\csname pgf@anchor@nand gate US@input \pgfmathcounter\endcsname{%
                    \noexpand\pgf@lib@sh@logicgate@AND@inputanchor{\pgfmathcounter}%
                }%
            }{}%
        \repeatpgfmathloop%
        \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
            \pgferror{A nand gate must have at least two inputs}%
        \fi%
    }%
    \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
    \saveddimen\invertedradius{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
    }%
    \saveddimen\outerinvertedradius{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
        \advance\pgf@x.5\pgflinewidth%
    }%
    \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@andUS}%
    \savedanchor\centerpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y.5\ht\pgfnodeparttextbox%
        \advance\pgf@y-.5\dp\pgfnodeparttextbox%
    }%
    \savedanchor\midpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgfmathsetlength\pgf@y{+0.5ex}%
    }%
    \savedanchor\basepoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y0pt%
    }%
    \anchor{center}{\centerpoint}%
    \inheritanchor[from=and gate US]{mid}%
    \inheritanchor[from=and gate US]{mid east}%
    \inheritanchor[from=and gate US]{mid west}%
    \inheritanchor[from=and gate US]{base}%
    \inheritanchor[from=and gate US]{base east}%
    \inheritanchor[from=and gate US]{base west}%
    \anchor{output}{%
        \dimensions
        \pgfpointadd{\centerpoint}{%
            \pgf@xa\halfside%
            \pgf@x1.33333\pgf@xa%
            \advance\pgf@x\invertedradius%
            \advance\pgf@x\outerinvertedradius%
            \advance\pgf@x\outerxsep%
            \pgf@y0pt%
        }%
    }%
    \inheritanchor[from=and gate US]{east}%
    \inheritanchor[from=and gate US]{north east}%
    \inheritanchor[from=and gate US]{south east}%
    \inheritanchor[from=and gate US]{north}%
    \inheritanchor[from=and gate US]{south}%
    \inheritanchor[from=and gate US]{south west}%
    \inheritanchor[from=and gate US]{north west}%
    \inheritanchor[from=and gate US]{west}%
    \backgroundpath{%
        \dimensions%
        \pgf@xc\halfwidth%
        \pgf@yc\halfheight%
        \advance\pgf@xc-\outerxsep%
        \advance\pgf@yc-\outerysep%
        \pgf@xb.333333\pgf@xc%
        {%
            \pgftransformshift{\centerpoint}%
            \pgfpathmoveto{\pgfqpoint{\pgf@xb}{\pgf@yc}}%
            {%
                \edef\pgf@marshal{%
                    \noexpand\pgfpatharc{90}{-90}{\the\pgf@yc}%
                }%
                \pgf@marshal%
            }
            \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{-\pgf@yc}}%
            \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{\pgf@yc}}%
            \pgfpathclose%
            %
            % Draw the inputs.
            %
            \pgfutil@tempdima2.0\pgf@yc%
            \c@pgf@counta\numinputs%
            \advance\c@pgf@counta1\relax%
            \divide\pgfutil@tempdima\c@pgf@counta%
            \pgfmathloop%
            \ifnum\pgfmathcounter>\numinputs%
            \else%
                \advance\pgf@yc-\pgfutil@tempdima%
                \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-\pgfmathcounter\endcsname%
                    {%
                        \pgfpathcircle{%
                            \pgf@xa\halfside%
                            \pgf@x-1.166666\pgf@xa%
                            \advance\pgf@x-.5\pgflinewidth%
                            \advance\pgf@x-\invertedradius%
                            \pgf@y\pgf@yc%
                        }{+\invertedradius}%
                    }%
                \fi%
            \repeatpgfmathloop%
            %
            % Draw the output inverter.
            %
            {%
                \pgfpathcircle{%
                    \pgf@x1.33333\pgf@xc%
                    \advance\pgf@x\outerinvertedradius%
                    \pgf@y0pt%
                }{+\invertedradius}%
            }%
        }%
    }%
    \inheritanchorborder[from=and gate US]%
}%


% Internal macro for calculation input anchors. Used by
% or, nor xnor gates (US).
%
\def\pgf@lib@sh@logicgate@OR@inputanchor#1{%
    \dimensions%
    \pgf@ya\halfside%
    \pgf@yb2.0\pgf@ya%
    %
    \pgfutil@tempdima\halfside%
    \multiply\pgfutil@tempdima2\relax%
    \c@pgf@counta\numinputs%
    \advance\c@pgf@counta1\relax%
    \divide\pgfutil@tempdima\c@pgf@counta%
    \multiply\pgfutil@tempdima#1\relax%
    \pgf@yc\pgf@ya%
    \advance\pgf@yc-\pgfutil@tempdima%
    %
    \pgf@xb\pgf@yb%
    \advance\pgf@yb-\halflinewidth%
    \pgfmathdivide@{\pgfmath@tonumber{\pgf@yc}}{\pgfmath@tonumber{\pgf@yb}}%
    \pgfmathasin@{\pgfmathresult}%
    \pgfmathcos@{\pgfmathresult}%
    %
    \pgf@xc-1.166666\pgf@ya%
    \advance\pgf@xc-.866025\pgf@xb%
    \advance\pgf@xc\pgfmathresult\pgf@yb%
    \advance\pgf@xc\halflinewidth%
    \advance\pgf@xc-\outerxsep%
    %
    \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-#1\endcsname%
        \advance\pgf@xc-\invertedradius%
        \advance\pgf@xc-\outerinvertedradius%
    \fi%
    %
    \centerpoint%
    \advance\pgf@x\pgf@xc%
    \advance\pgf@y\pgf@yc%
}%


% Shape or gate US
%
\pgfdeclareshape{or gate US}{%
    \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@or gate US\endcsname{%
        \pgf@lib@sh@logicgate@parseinputs{1024}% Maximum 1024 (!) inputs.
        %
        \pgfmathloop%
        \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
        \else%
            \pgfutil@ifundefined{pgf@anchor@or gate US@input \pgfmathcounter}{%
                \expandafter\xdef\csname pgf@anchor@or gate US@input \pgfmathcounter\endcsname{%
                    \noexpand\pgf@lib@sh@logicgate@OR@inputanchor{\pgfmathcounter}%
                }%
            }{}%
        \repeatpgfmathloop%
        \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
            \pgferror{An or gate must have at least two inputs}%
        \fi%
    }%
    \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
    \saveddimen\invertedradius{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
    }%
    \saveddimen\halflinewidth{%
        \pgf@x.5\pgflinewidth%
    }%
    \saveddimen\outerinvertedradius{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
        \advance\pgf@x.5\pgflinewidth%
    }%
    \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@orUS}%
    \savedanchor\centerpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y.5\ht\pgfnodeparttextbox%
        \advance\pgf@y-.5\dp\pgfnodeparttextbox%
    }%
    \savedanchor\midpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgfmathsetlength\pgf@y{+0.5ex}%
    }%
    \savedanchor\basepoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y0pt%
    }%
    \savedanchor\centerpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y.5\ht\pgfnodeparttextbox%
        \advance\pgf@y-.5\dp\pgfnodeparttextbox%
    }%
    \savedanchor\midpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgfmathsetlength\pgf@y{+0.5ex}%
    }%
    \savedanchor\basepoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y0pt%
    }%
    \anchor{center}{\centerpoint}%
    \anchor{mid}{\midpoint}%
    \anchor{mid east}{%
        \csname pgf@anchor@or gate US@east\endcsname%
        \pgf@xa\pgf@x%
        \midpoint%
        \pgf@x\pgf@xa}%
    \anchor{mid west}{%
        \csname pgf@anchor@or gate US@north west\endcsname%
        \pgf@xa\pgf@x%
        \midpoint%
        \pgf@x\pgf@xa}%
    \anchor{base}{\basepoint}%
    \anchor{base east}{%
        \csname pgf@anchor@or gate US@east\endcsname%
        \pgf@xa\pgf@x%
        \basepoint%
        \pgf@x\pgf@xa}%
    \anchor{base west}{%
        \csname pgf@anchor@or gate US@north west\endcsname%
        \pgf@xa\pgf@x%
        \basepoint%
        \pgf@x\pgf@xa}%
    \anchor{east}{%
        \dimensions%
        \pgfpointadd{\centerpoint}{\tipanchor}%
    }%
    \anchor{output}{\csname pgf@anchor@or gate US@east\endcsname}%
    \anchor{north east}{%
        \dimensions%
        \ifpgfgateanchorsuseboundingrectangle%
            \tipanchor%
            \pgf@xa\pgf@x%
            \centerpoint%
            \advance\pgf@x\pgf@xa%
            \advance\pgf@y\halfheight%
        \else%
            \centerpoint%
            \pgf@xa\halfwidth%
            \pgf@ya\halfheight%
            \pgf@xb\halfside%
            \advance\pgf@x-.166666\pgf@xb%
            \advance\pgf@xa\pgf@xb%
            \advance\pgf@x.5\pgf@xa%
            \advance\pgf@y-\pgf@xb%
            \advance\pgf@ya\pgf@xb%
            \advance\pgf@y.866025\pgf@ya%
        \fi%
    }%
    \anchor{south east}{%
        \dimensions%
        \ifpgfgateanchorsuseboundingrectangle%
            \tipanchor%
            \pgf@xa\pgf@x%
            \centerpoint%
            \advance\pgf@x\pgf@xa%
            \advance\pgf@y-\halfheight%
        \else
            \centerpoint%
            \pgf@xa\halfwidth%
            \pgf@ya\halfheight%
            \pgf@xb\halfside%
            \advance\pgf@x-.166666\pgf@xb%
            \advance\pgf@xa\pgf@xb%
            \advance\pgf@x.5\pgf@xa%
            \advance\pgf@y\pgf@xb%
            \advance\pgf@ya\pgf@xb%
            \advance\pgf@y-.866025\pgf@ya%
        \fi%
    }%
    \anchor{north}{%
        \dimensions%
        \centerpoint%
        \ifpgfgateanchorsuseboundingrectangle%
            \advance\pgf@y\halfheight%
        \else%
            \pgf@ya\halfheight%
            \advance\pgf@y.993043\pgf@ya%
        \fi%
    }%
    \anchor{south}{%
        \dimensions%
        \centerpoint%
        \ifpgfgateanchorsuseboundingrectangle%
            \advance\pgf@y-\halfheight%
        \else%
            \pgf@ya\halfheight%
            \advance\pgf@y-.993043\pgf@ya%
        \fi%
    }%
    \anchor{south west}{%
        \dimensions%
        \centerpoint%
        \pgf@xa\halfside%
        \advance\pgf@x-1.16666\pgf@xa%
        \pgf@xa\outerxsep%
        \advance\pgf@x-1.732050\pgf@xa%
        \advance\pgf@y-\halfheight%
    }%
    \anchor{north west}{%
        \dimensions%
        \centerpoint%
        \pgf@xa\halfside%
        \advance\pgf@x-1.16666\pgf@xa%
        \pgf@xa\outerxsep%
        \advance\pgf@x-1.732050\pgf@xa%
        \advance\pgf@y\halfheight%
    }%
    \anchor{west}{%
        \dimensions%
        \centerpoint%
        \pgf@xa\halfside%
        \ifpgfgateanchorsuseboundingrectangle%
            \advance\pgf@x-1.16666\pgf@xa%
            \advance\pgf@x-\outerxsep%
        \else%
            \advance\pgf@x-1.16666\pgf@xa%
            \advance\pgf@x-\outerxsep%
            \advance\pgf@x0.267949\pgf@xa%
        \fi%
    }%
    \backgroundpath{%
        \dimensions%
        \pgf@xc\halfwidth%
        \pgf@yc\halfheight%
        \advance\pgf@xc-\outerxsep%
        \advance\pgf@yc-\outerysep%
        {%
            \pgftransformshift{\centerpoint}%
            \pgfpathmoveto{\pgfqpoint{-.16666\pgf@xc}{\pgf@yc}}%
            {%
                \pgf@yc2.0\pgf@yc%
                \edef\pgf@marshal{%
                    \noexpand\pgfpatharc{90}{30}{\the\pgf@yc}%
                }%
                \pgf@marshal%
            }
            {%
                \pgf@yc2.0\pgf@yc%
                \edef\pgf@marshal{%
                    \noexpand\pgfpatharc{-30}{-90}{\the\pgf@yc}%
                }%
                \pgf@marshal%
            }
            \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{-\pgf@yc}}%
            {%
                \pgf@yc2.0\pgf@yc%
                \pgfpatharc{-30}{0}{+\pgf@yc}%
            }
            {%
                \pgf@yc2.0\pgf@yc%
                \pgfpatharc{0}{30}{+\pgf@yc}%
            }%
            \pgfpathclose%
            %
            % Draw the inputs.
            %
            \pgfutil@tempdima2.0\pgf@yc%
            \c@pgf@counta\numinputs%
            \advance\c@pgf@counta1\relax%
            \divide\pgfutil@tempdima\c@pgf@counta%
            \pgfmathloop%
            \ifnum\pgfmathcounter>\numinputs%
            \else%
                \advance\pgf@yc-\pgfutil@tempdima%
                \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-\pgfmathcounter\endcsname%
                    {%
                        \pgfpathcircle{%
                            \pgf@ya\halfside%
                            \pgf@yb2.0\pgf@ya%
                            \pgf@xa\pgf@yb%
                            \advance\pgf@yb-\halflinewidth%
                            \pgfmathdivide@{\pgfmath@tonumber{\pgf@yc}}{\pgfmath@tonumber{\pgf@yb}}%
                            \let\sineangle\pgfmathresult%
                            \pgfmathasin@{\pgfmathresult}%
                            \pgfmathcos@{\pgfmathresult}%
                            %
                            \pgf@x-1.166666\pgf@ya%
                            \advance\pgf@x-.866025\pgf@xa%
                            \advance\pgf@x\pgfmathresult\pgf@yb%
                            \advance\pgf@x-\invertedradius%
                            \pgf@y\pgf@yc%
                        }{+\invertedradius}%
                    }%
                \fi%
            \repeatpgfmathloop%
        }%
    }%
    \anchorborder{%
        \pgfextract@process\externalpoint{}%
        \pgfextract@process\externalpoint{\pgfpointadd{\centerpoint}{\externalpoint}}%
        \pgf@xa\pgf@x%
        \pgf@ya\pgf@y%
        \centerpoint%
        \pgf@xb\pgf@x%
        \pgf@yb\pgf@y%
        \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
        \let\externalangle\pgfmathresult%
        \dimensions%
        \pgf@xc\halfside%
        %
        \pgf@xc-.166666\pgf@xc%
        \ifdim\pgf@xa<\pgf@xc%
            \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@or gate US@north west\endcsname}%
            \ifdim\externalangle pt<\pgfmathresult pt\relax%
                \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
                    {%
                        \pgfgateanchorsuseboundingrectangletrue%
                        \csname pgf@anchor@or gate US@north\endcsname%
                    }%
                    {\csname pgf@anchor@or gate US@north west\endcsname}%
            \else%
                \pgfmathsubtract@{360}{\pgfmathresult}%
                \ifdim\externalangle pt>\pgfmathresult pt\relax%
                    \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
                    {%
                        \pgfgateanchorsuseboundingrectangletrue%
                        \csname pgf@anchor@or gate US@south\endcsname%
                    }%
                    {\csname pgf@anchor@or gate US@south west\endcsname}%
                \else%
                    \ifdim\pgf@ya>\pgf@yb%
                        \pgf@yc\halfheight%
                        \advance\pgf@yc\halfside%
                        \advance\pgf@yc-\outerxsep%
                        \pgfextract@process\point{%
                            \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
                            {%
                                \centerpoint%
                                \pgf@xa\halfside%
                                \advance\pgf@x-1.166666\pgf@xa%
                                \pgf@xa2.0\pgf@xa%
                                \advance\pgf@x-.866025\pgf@xa%
                                \advance\pgf@x-\outerxsep%
                            }%
                            {0}{90}{+\pgf@yc}%
                        }%
                    \else%
                        \pgf@yc\halfheight%
                        \advance\pgf@yc\halfside%
                        \advance\pgf@yc-\outerxsep%
                        \pgfextract@process\point{%
                            \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
                            {%
                                \centerpoint%
                                \pgf@xa\halfside%
                                \advance\pgf@x-1.166666\pgf@xa%
                                \pgf@xa2.0\pgf@xa%
                                \advance\pgf@x-.866025\pgf@xa%
                                \advance\pgf@x-\outerxsep%
                            }%
                            {270}{360}{+\pgf@yc}%
                        }%
                    \fi%
                \fi%
            \fi%
        \else%
            \ifdim\pgf@y=0pt\relax%
                \csname pgf@anchor@and gate US@east\endcsname%
            \else%
                \pgf@xc\halfwidth%
                \advance\pgf@xc\halfside%
                \pgf@yc\halfheight%
                \advance\pgf@yc\halfside%
                \pgf@xb\halfside%
                \pgf@xb-.166666\pgf@xb%
                \ifdim\pgf@ya<0pt%
                    \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
                    {%
                        \centerpoint%
                        \advance\pgf@y\halfside%
                        \advance\pgf@x\pgf@xb%
                    }%
                    {270}{330}{+\pgf@yc}%
                \else%
                    \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
                    {%
                        \centerpoint%
                        \advance\pgf@y-\halfside%
                        \advance\pgf@x\pgf@xb%
                    }%
                    {30}{90}{+\pgf@xc and +\pgf@yc}%
                \fi%
            \fi%
        \fi%
    }%
}%




% Shape nor gate US
%
\pgfdeclareshape{nor gate US}{%
    \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@nor gate US\endcsname{%
        \pgf@lib@sh@logicgate@parseinputs{1024}% Maximum 1024 (!) inputs.
        %
        \pgfmathloop%
        \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
        \else%
            \pgfutil@ifundefined{pgf@anchor@nor gate US@input \pgfmathcounter}{%
                \expandafter\xdef\csname pgf@anchor@nor gate US@input \pgfmathcounter\endcsname{%
                    \noexpand\pgf@lib@sh@logicgate@OR@inputanchor{\pgfmathcounter}%
                }%
            }{}%
        \repeatpgfmathloop%
        \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
            \pgferror{A nor gate must have at least two inputs}%
        \fi%
    }%
    \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
    \saveddimen\invertedradius{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
    }%
    \saveddimen\halflinewidth{%
        \pgf@x.5\pgflinewidth%
    }%
    \saveddimen\outerinvertedradius{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
        \advance\pgf@x.5\pgflinewidth%
    }%
    \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@orUS}%
    \savedanchor\centerpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y.5\ht\pgfnodeparttextbox%
        \advance\pgf@y-.5\dp\pgfnodeparttextbox%
    }%
    \savedanchor\midpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgfmathsetlength\pgf@y{+0.5ex}%
    }%
    \savedanchor\basepoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y0pt%
    }%
    \inheritanchor[from=or gate US]{center}%
    \inheritanchor[from=or gate US]{mid}%
    \inheritanchor[from=or gate US]{mid east}%
    \inheritanchor[from=or gate US]{mid west}%
    \inheritanchor[from=or gate US]{base}%
    \inheritanchor[from=or gate US]{base east}%
    \inheritanchor[from=or gate US]{base west}%
    \inheritanchor[from=or gate US]{east}%
    \inheritanchor[from=or gate US]{north east}%
    \inheritanchor[from=or gate US]{south east}%
    \inheritanchor[from=or gate US]{north}%
    \inheritanchor[from=or gate US]{south}%
    \inheritanchor[from=or gate US]{south west}%
    \inheritanchor[from=or gate US]{north west}%
    \inheritanchor[from=or gate US]{west}%
    \anchor{output}{%
        \dimensions%
        \centerpoint%
        \pgf@xc\halfside%
        \pgf@yc\pgf@xc%
        \advance\pgf@x-.166666\pgf@xc%
        \pgf@yc2.0\pgf@yc%
        \advance\pgf@x.866025\pgf@yc%
        \advance\pgf@x\outerinvertedradius%
        \advance\pgf@x\invertedradius%
        \advance\pgf@x\outerxsep%
    }%
    \backgroundpath{%
        \dimensions%
        \pgf@xc\halfwidth%
        \pgf@yc\halfheight%
        \advance\pgf@xc-\outerxsep%
        \advance\pgf@yc-\outerysep%
        {%
            \pgftransformshift{\centerpoint}%
            \pgfpathmoveto{\pgfqpoint{-.16666\pgf@xc}{\pgf@yc}}%
            {%
                \pgf@yc2.0\pgf@yc%
                \edef\pgf@marshal{%
                    \noexpand\pgfpatharc{90}{30}{\the\pgf@yc}%
                }%
                \pgf@marshal%
            }
            {%
                \pgf@yc2.0\pgf@yc%
                \edef\pgf@marshal{%
                    \noexpand\pgfpatharc{-30}{-90}{\the\pgf@yc}%
                }%
                \pgf@marshal%
            }
            \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{-\pgf@yc}}%
            {%
                \pgf@yc2.0\pgf@yc%
                \pgfpatharc{-30}{0}{+\pgf@yc}%
            }
            {%
                \pgf@yc2.0\pgf@yc%
                \pgfpatharc{0}{30}{+\pgf@yc}%
            }%
            \pgfpathclose%
            % Draw the output inverter.
            %
            {%
                \pgfpathcircle{%
                    \pgf@x-.166666\pgf@xc%
                    \pgf@yc2.0\pgf@yc%
                    \advance\pgf@x.866025\pgf@yc%
                    \advance\pgf@x\outerinvertedradius%
                    \pgf@y0pt%
                }{+\invertedradius}%
            }%
            %
            % Draw the inputs.
            %
            \pgfutil@tempdima2.0\pgf@yc%
            \c@pgf@counta\numinputs%
            \advance\c@pgf@counta1\relax%
            \divide\pgfutil@tempdima\c@pgf@counta%
            \pgfmathloop%
            \ifnum\pgfmathcounter>\numinputs%
            \else%
                \advance\pgf@yc-\pgfutil@tempdima%
                \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-\pgfmathcounter\endcsname%
                    {%
                        \pgfpathcircle{%
                            \pgf@ya\halfside%
                            \pgf@yb2.0\pgf@ya%
                            \pgf@xa\pgf@yb%
                            \advance\pgf@yb-\halflinewidth%
                            \pgfmathdivide@{\pgfmath@tonumber{\pgf@yc}}{\pgfmath@tonumber{\pgf@yb}}%
                            \let\sineangle\pgfmathresult%
                            \pgfmathasin@{\pgfmathresult}%
                            \pgfmathcos@{\pgfmathresult}%
                            %
                            \pgf@x-1.166666\pgf@ya%
                            \advance\pgf@x-.866025\pgf@xa%
                            \advance\pgf@x\pgfmathresult\pgf@yb%
                            \advance\pgf@x-\invertedradius%
                            \pgf@y\pgf@yc%
                        }{+\invertedradius}%
                    }%
                \fi%
            \repeatpgfmathloop%
        }%
    }%
    \inheritanchorborder[from=or gate US]%
}%



% Internal macro for calculation input anchors. Used by
% xor and xnor gates (US).
%
\def\pgf@lib@sh@logicgate@XOR@inputanchor#1{%
    \dimensions%
    \pgf@ya\halfside%
    \pgf@yb2.0\pgf@ya%
    %
    \pgfutil@tempdima\halfside%
    \multiply\pgfutil@tempdima2\relax%
    \c@pgf@counta\numinputs%
    \advance\c@pgf@counta1\relax%
    \divide\pgfutil@tempdima\c@pgf@counta%
    \multiply\pgfutil@tempdima#1\relax%
    \pgf@yc\pgf@ya%
    \advance\pgf@yc-\pgfutil@tempdima%
    %
    \pgf@xb\pgf@yb%
    \advance\pgf@yb-\halflinewidth%
    \pgfmathdivide@{\pgfmath@tonumber{\pgf@yc}}{\pgfmath@tonumber{\pgf@yb}}%
    \pgfmathasin@{\pgfmathresult}%
    \pgfmathcos@{\pgfmathresult}%
    %
    \pgf@xc-1.166666\pgf@ya%
    \advance\pgf@xc-.866025\pgf@xb%
    \advance\pgf@xc\pgfmathresult\pgf@yb%
    \advance\pgf@xc\halflinewidth%
    \advance\pgf@xc-\outerxsep%
    %
    \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-#1\endcsname%
        \advance\pgf@xc-\invertedradius%
        \advance\pgf@xc-\outerinvertedradius%
    \fi%
    %
    \centerpoint%
    \advance\pgf@x\pgf@xc%
    \advance\pgf@y\pgf@yc%
    \pgf@xa\halfside%
    \advance\pgf@x-.333333\pgf@xa%
}%





% Shape xor gate US
%
\pgfdeclareshape{xor gate US}{%
    \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@xor gate US\endcsname{%
        \pgf@lib@sh@logicgate@parseinputs{2}%
        %
        \pgfmathloop%
        \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
        \else%
            \pgfutil@ifundefined{pgf@anchor@xor gate US@input \pgfmathcounter}{%
                \expandafter\xdef\csname pgf@anchor@xor gate US@input \pgfmathcounter\endcsname{%
                    \noexpand\pgf@lib@sh@logicgate@XOR@inputanchor{\pgfmathcounter}%
                }%
            }{}%
        \repeatpgfmathloop%
        \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
            \pgferror{An xor gate must have at two inputs}%
        \fi%
    }%
    \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
    \saveddimen\invertedradius{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
    }%
    \saveddimen\halflinewidth{%
        \pgf@x.5\pgflinewidth%
    }%
    \saveddimen\outerinvertedradius{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
        \advance\pgf@x.5\pgflinewidth%
    }%
    \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@orUS}%
    \savedanchor\centerpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y.5\ht\pgfnodeparttextbox%
        \advance\pgf@y-.5\dp\pgfnodeparttextbox%
    }%
    \savedanchor\midpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgfmathsetlength\pgf@y{+0.5ex}%
    }%
    \savedanchor\basepoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y0pt%
    }%
    \anchor{center}{\centerpoint}%
    \anchor{mid}{\midpoint}%
    \inheritanchor[from=or gate US]{mid east}%
    \anchor{mid west}{%
        \csname pgf@anchor@xor gate US@north west\endcsname%
        \pgf@xa\pgf@x%
        \midpoint%
        \pgf@x\pgf@xa}%
    \anchor{base}{\basepoint}%
    \inheritanchor[from=or gate US]{base east}%
    \anchor{base west}{%
        \csname pgf@anchor@xor gate US@north west\endcsname%
        \pgf@xa\pgf@x%
        \basepoint%
        \pgf@x\pgf@xa}%
    \inheritanchor[from=or gate US]{base}%
    \inheritanchor[from=or gate US]{output}%
    \inheritanchor[from=or gate US]{east}%
    \inheritanchor[from=or gate US]{north east}%
    \inheritanchor[from=or gate US]{south east}%
    \inheritanchor[from=or gate US]{north}%
    \inheritanchor[from=or gate US]{south}%
    \anchor{south west}{%
        \dimensions%
        \pgf@xa\halfside%
        \pgf@xa-3.232051\pgf@xa% (7/6 + 2*cos(30) + 1/3) * x
        \pgf@xb\halfside%
        \pgf@xb2.0\pgf@xb%
        \advance\pgf@xb-\halflinewidth%
        \advance\pgf@xa.866025\pgf@xb%
        \pgf@ya.5\pgf@xb%
        \centerpoint%
        \advance\pgf@x\pgf@xa%
        \ifpgfgateanchorsuseboundingrectangle%
            \advance\pgf@y-\halfheight%
        \else%
            \advance\pgf@y-\pgf@ya%
        \fi%
    }%
    \anchor{north west}{%
        \dimensions%
        \pgf@xa\halfside%
        \pgf@xa-3.232051\pgf@xa% (7/6 + 2*cos(30) + 1/3) * x
        \pgf@xb\halfside%
        \pgf@xb2.0\pgf@xb%
        \advance\pgf@xb-\halflinewidth%
        \advance\pgf@xa.866025\pgf@xb%
        \pgf@ya.5\pgf@xb%
        \centerpoint%
        \advance\pgf@x\pgf@xa%
        \ifpgfgateanchorsuseboundingrectangle%
            \advance\pgf@y\halfheight%
        \else%
            \advance\pgf@y\pgf@ya%
        \fi%
    }%
    \anchor{west}{%
        \dimensions%
        \pgf@ya\halfside%
        \pgf@yb2.0\pgf@ya%
        %
        \pgf@xb\pgf@yb%
        \advance\pgf@yb-\halflinewidth%
        \pgfmathdivide@{0}{\pgfmath@tonumber{\pgf@yb}}%
        \pgfmathasin@{\pgfmathresult}%
        \pgfmathcos@{\pgfmathresult}%
        %
        \pgf@xc-1.166666\pgf@ya%
        \advance\pgf@xc-.866025\pgf@xb%
        \advance\pgf@xc\pgfmathresult\pgf@yb%
        \advance\pgf@xc\halflinewidth%
        \advance\pgf@xc-\outerxsep%
        %
        \centerpoint%
        \advance\pgf@x\pgf@xc%
        \pgf@xa\halfside%
        \advance\pgf@x-.333333\pgf@xa%
        \ifpgfgateanchorsuseboundingrectangle%
            \pgf@xa2.0\pgf@xa%
            \advance\pgf@x-0.133974\pgf@xa%
        \fi%
    }%
    \backgroundpath{%
        \dimensions%
        \pgf@xc\halfwidth%
        \pgf@yc\halfheight%
        \advance\pgf@xc-\outerxsep%
        \advance\pgf@yc-\outerysep%
        {%
            \pgftransformshift{\centerpoint}%
            \pgfpathmoveto{\pgfqpoint{-.16666\pgf@xc}{\pgf@yc}}%
            {%
                \pgf@yc2.0\pgf@yc%
                \edef\pgf@marshal{%
                    \noexpand\pgfpatharc{90}{30}{\the\pgf@yc}%
                }%
                \pgf@marshal%
            }
            {%
                \pgf@yc2.0\pgf@yc%
                \edef\pgf@marshal{%
                    \noexpand\pgfpatharc{-30}{-90}{\the\pgf@yc}%
                }%
                \pgf@marshal%
            }
            \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{-\pgf@yc}}%
            {%
                \pgf@yc2.66666\pgf@yc%
                \pgfpatharc{-22}{0}{+1.166666\pgf@yc and +\pgf@yc}%
            }
            {%
                \pgf@yc2.66666\pgf@yc%
                \pgfpatharc{0}{22}{+1.166666\pgf@yc and +\pgf@yc}%
            }%
            \pgfpathclose%
            %
            % Draw the inputs.
            %
            \pgfutil@tempdima2.0\pgf@yc%
            \c@pgf@counta\numinputs%
            \advance\c@pgf@counta1\relax%
            \divide\pgfutil@tempdima\c@pgf@counta%
            \pgfmathloop%
            \ifnum\pgfmathcounter>\numinputs%
            \else%
                \advance\pgf@yc-\pgfutil@tempdima%
                \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-\pgfmathcounter\endcsname%
                    {%
                        \pgfpathcircle{%
                            \pgf@ya\halfside%
                            \pgf@yb2.0\pgf@ya%
                            \pgf@xa\pgf@yb%
                            \advance\pgf@yb-\halflinewidth%
                            \pgfmathdivide@{\pgfmath@tonumber{\pgf@yc}}{\pgfmath@tonumber{\pgf@yb}}%
                            \pgfmathasin@{\pgfmathresult}%
                            \pgfmathcos@{\pgfmathresult}%
                            %
                            \pgf@x-1.5\pgf@ya%
                            \advance\pgf@x-.866025\pgf@xa%
                            \advance\pgf@x\pgfmathresult\pgf@yb%
                            \advance\pgf@x-\invertedradius%
                            \pgf@y\pgf@yc%
                        }{+\invertedradius}%
                    }%
                \fi%
            \repeatpgfmathloop%
            %
            % Now, some fooling around to stop the `tail' being filled.
            % Technically it still is, but it isn't visible.
            %
            \pgf@xc\halfside%
            \pgf@yc\halfside%
            \pgfpathmoveto{\pgfqpoint{-1.5\pgf@xc}{-\pgf@yc}}%
            \pgf@yc2.0\pgf@yc%
            \pgfmathloop%
            \ifnum\pgfmathcounter<61\relax%
                {%
                    \pgfextract@process\point{%
                        \pgfpointadd{%
                            \pgf@x\halfside%
                            \pgf@x-3.232051\pgf@x% (7/6 + 2*cos(30) + 1/3) * x
                            \pgf@y0pt%
                        }{%
                            \pgfpointpolar{\pgfmathcounter-30}{+\pgf@yc}%
                        }%
                    }%
                    \pgfpathlineto{\point}%
                    \pgfpathmoveto{\point}%
                }
            \repeatpgfmathloop%
        }%
    }%
    \anchorborder{%
        \pgfextract@process\externalpoint{}%
        \pgfextract@process\externalpoint{\pgfpointadd{\centerpoint}{\externalpoint}}%
        \pgf@xa\pgf@x%
        \pgf@ya\pgf@y%
        \centerpoint%
        \pgf@xb\pgf@x%
        \pgf@yb\pgf@y%
        \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
        \let\externalangle\pgfmathresult%
        \dimensions%
        \pgf@xc\halfside%
        %
        \pgf@xc-.166666\pgf@xc%
        \ifdim\pgf@xa<\pgf@xc%
            \pgfmathanglebetweenpoints{\centerpoint}%
            {%
                \pgfgateanchorsuseboundingrectangletrue%
                \csname pgf@anchor@xor gate US@north west\endcsname%
            }%
            \ifdim\externalangle pt<\pgfmathresult pt\relax%
                \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
                    {%
                        \pgfgateanchorsuseboundingrectangletrue%
                        \csname pgf@anchor@xor gate US@north\endcsname%
                    }%
                    {%
                        \pgfgateanchorsuseboundingrectangletrue%
                        \csname pgf@anchor@xor gate US@north west\endcsname%
                    }%
            \else%
                \pgfmathsubtract@{360}{\pgfmathresult}%
                \ifdim\externalangle pt>\pgfmathresult pt\relax%
                    \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
                    {%
                        \pgfgateanchorsuseboundingrectangletrue%
                        \csname pgf@anchor@xor gate US@south\endcsname%
                    }%
                    {%
                        \pgfgateanchorsuseboundingrectangletrue%
                        \csname pgf@anchor@xor gate US@south west\endcsname%
                    }%
                \else%
                    \ifdim\pgf@ya>\pgf@yb%
                        \pgf@yc\halfheight%
                        \advance\pgf@yc\halfside%
                        \advance\pgf@yc-\outerxsep%
                        \pgf@process{%
                            \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
                            {%
                                \centerpoint%
                                \pgf@xa\halfside%
                                \advance\pgf@x-1.166666\pgf@xa%
                                \pgf@xa2.0\pgf@xa%
                                \advance\pgf@x-.866025\pgf@xa%
                                \advance\pgf@x-\outerxsep%
                                \advance\pgf@x-.166666\pgf@xa%
                            }%
                            {0}{90}{+\pgf@yc}%
                        }%
                    \else%
                        \pgf@yc\halfheight%
                        \advance\pgf@yc\halfside%
                        \advance\pgf@yc-\outerxsep%
                        \pgf@process{%
                            \pgfmathpointintersectionoflineandarc{\centerpoint}{\externalpoint}%
                            {%
                                \centerpoint%
                                \pgf@xa\halfside%
                                \advance\pgf@x-1.166666\pgf@xa%
                                \pgf@xa2.0\pgf@xa%
                                \advance\pgf@x-.866025\pgf@xa%
                                \advance\pgf@x-\outerxsep%
                                \advance\pgf@x-.166666\pgf@xa%
                            }%
                            {270}{360}{+\pgf@yc}%
                        }%
                    \fi%
                \fi%
            \fi%
        \else%
            \ifdim\pgf@y=0pt\relax%
                \csname pgf@anchor@and gate US@east\endcsname%
            \else%
                \pgf@xc\halfwidth%
                \advance\pgf@xc\halfside%
                \pgf@yc\halfheight%
                \advance\pgf@yc\halfside%
                \pgf@xb\halfside%
                \pgf@xb-.166666\pgf@xb%
                \ifdim\pgf@ya<0pt%
                    \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
                    {%
                        \centerpoint%
                        \advance\pgf@y\halfside%
                        \advance\pgf@x\pgf@xb%
                    }%
                    {270}{330}{+\pgf@yc}%
                \else%
                    \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
                    {%
                        \centerpoint%
                        \advance\pgf@y-\halfside%
                        \advance\pgf@x\pgf@xb%
                    }%
                    {30}{90}{+\pgf@xc and +\pgf@yc}%
                \fi%
            \fi%
        \fi%
    }%
}%




% Shape xnor gate US
%
\pgfdeclareshape{xnor gate US}{%
    \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@xnor gate US\endcsname{%
        \pgf@lib@sh@logicgate@parseinputs{2}%
        %
        \pgfmathloop%
        \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
        \else%
            \pgfutil@ifundefined{pgf@anchor@xnor gate US@input \pgfmathcounter}{%
                \expandafter\xdef\csname pgf@anchor@xnor gate US@input \pgfmathcounter\endcsname{%
                    \noexpand\pgf@lib@sh@logicgate@XOR@inputanchor{\pgfmathcounter}%
                }%
            }{}%
        \repeatpgfmathloop%
        \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
            \pgferror{An xnor gate must have two inputs}%
        \fi%
    }%
    \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
    \saveddimen\invertedradius{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
    }%
    \saveddimen\halflinewidth{%
        \pgf@x.5\pgflinewidth%
    }%
    \saveddimen\outerinvertedradius{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
        \advance\pgf@x.5\pgflinewidth%
    }%
    \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@orUS}%
    \savedanchor\centerpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y.5\ht\pgfnodeparttextbox%
        \advance\pgf@y-.5\dp\pgfnodeparttextbox%
    }%
    \savedanchor\midpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgfmathsetlength\pgf@y{+0.5ex}%
    }%
    \savedanchor\basepoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y0pt%
    }%
    \anchor{center}{\centerpoint}%
    \anchor{mid}{\midpoint}%
    \inheritanchor[from=xor gate US]{mid east}%
    \inheritanchor[from=xor gate US]{mid west}%
    \anchor{base}{\basepoint}%%
    \inheritanchor[from=xor gate US]{base east}%
    \inheritanchor[from=xor gate US]{base west}%
    \inheritanchor[from=xor gate US]{base}%
    \inheritanchor[from=nor gate US]{output}%
    \inheritanchor[from=xor gate US]{east}%
    \inheritanchor[from=xor gate US]{north east}%
    \inheritanchor[from=xor gate US]{south east}%
    \inheritanchor[from=xor gate US]{north}%
    \inheritanchor[from=xor gate US]{south}%
    \inheritanchor[from=xor gate US]{south west}%
    \inheritanchor[from=xor gate US]{north west}%
    \inheritanchor[from=xor gate US]{west}%
    \backgroundpath{%
        \dimensions%
        \pgf@xc\halfwidth%
        \pgf@yc\halfheight%
        \advance\pgf@xc-\outerxsep%
        \advance\pgf@yc-\outerysep%
        {%
            \pgftransformshift{\centerpoint}%
            \pgfpathmoveto{\pgfqpoint{-.16666\pgf@xc}{\pgf@yc}}%
            {%
                \pgf@yc2.0\pgf@yc%
                \edef\pgf@marshal{%
                    \noexpand\pgfpatharc{90}{30}{\the\pgf@yc}%
                }%
                \pgf@marshal%
            }
            {%
                \pgf@yc2.0\pgf@yc%
                \edef\pgf@marshal{%
                    \noexpand\pgfpatharc{-30}{-90}{\the\pgf@yc}%
                }%
                \pgf@marshal%
            }
            \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{-\pgf@yc}}%
            {%
                \pgf@yc2.66666\pgf@yc%
                \pgfpatharc{-22}{0}{+1.166666\pgf@yc and +\pgf@yc}%
            }
            {%
                \pgf@yc2.66666\pgf@yc%
                \pgfpatharc{0}{22}{+1.166666\pgf@yc and +\pgf@yc}%
            }%
            \pgfpathclose%
            %
            % Draw the output inverter.
            %
            {%
                \pgfpathcircle{%
                    \pgf@x-.166666\pgf@xc%
                    \pgf@yc2.0\pgf@yc%
                    \advance\pgf@x.866025\pgf@yc%
                    \advance\pgf@x\outerinvertedradius%
                    \pgf@y0pt%
                }{+\invertedradius}%
            }%
            %
            % Draw the inputs.
            %
            \pgfutil@tempdima2.0\pgf@yc%
            \c@pgf@counta\numinputs%
            \advance\c@pgf@counta1\relax%
            \divide\pgfutil@tempdima\c@pgf@counta%
            \pgfmathloop%
            \ifnum\pgfmathcounter>\numinputs%
            \else%
                \advance\pgf@yc-\pgfutil@tempdima%
                \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-\pgfmathcounter\endcsname%
                    {%
                        \pgfpathcircle{%
                            \pgf@ya\halfside%
                            \pgf@yb2.0\pgf@ya%
                            \pgf@xa\pgf@yb%
                            \advance\pgf@yb-\halflinewidth%
                            \pgfmathdivide@{\pgfmath@tonumber{\pgf@yc}}{\pgfmath@tonumber{\pgf@yb}}%
                            \pgfmathasin@{\pgfmathresult}%
                            \pgfmathcos@{\pgfmathresult}%
                            %
                            \pgf@x-1.5\pgf@ya%
                            \advance\pgf@x-.866025\pgf@xa%
                            \advance\pgf@x\pgfmathresult\pgf@yb%
                            \advance\pgf@x-\invertedradius%
                            \pgf@y\pgf@yc%
                        }{+\invertedradius}%
                    }%
                \fi%
            \repeatpgfmathloop%
            %
            % Now, some fooling around to stop the `tail' being filled.
            %
            \pgf@xc\halfside%
            \pgf@yc\halfside%
            \pgfpathmoveto{\pgfqpoint{-1.5\pgf@xc}{-\pgf@yc}}%
            \pgf@yc2.0\pgf@yc%
            \pgfmathloop%
            \ifnum\pgfmathcounter<61\relax%
                {%
                    \pgfextract@process\point{%
                        \pgfpointadd{%
                            \pgf@x\halfside%
                            \pgf@x-3.232051\pgf@x% (7/6 + 2*cos(30) + 1/3) * x
                            \pgf@y0pt%
                        }{%
                            \pgfpointpolar{\pgfmathcounter-30}{+\pgf@yc}%
                        }%
                    }%
                    \pgfpathlineto{\point}%
                    \pgfpathmoveto{\point}%
                }
            \repeatpgfmathloop%
        }%
    }%
    \inheritanchorborder[from=xor gate US]%
}%






% Shape not gate US
%
\pgfdeclareshape{not gate US}{%
  \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@not gate US\endcsname{%
    \pgf@lib@sh@logicgate@parseinputs{1}%
    \ifnum\pgf@lib@sh@logicgate@numinputs=0\relax%
      \pgferror{A not gate must have one input}%
    \fi%
  }%
  \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
  \saveddimen\invertedradius{%
    \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
  }%
  \saveddimen\halflinewidth{%
    \pgf@x.5\pgflinewidth%
  }%
  \saveddimen\outerinvertedradius{%
    \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
    \advance\pgf@x.5\pgflinewidth%
  }%
  \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@orUS}%
  \savedanchor\centerpoint{%
    \pgf@x.5\wd\pgfnodeparttextbox%
    \pgf@y.5\ht\pgfnodeparttextbox%
    \advance\pgf@y-.5\dp\pgfnodeparttextbox%
  }%
  \savedanchor\midpoint{%
    \pgf@x.5\wd\pgfnodeparttextbox%
    \pgfmathsetlength\pgf@y{+0.5ex}%
  }%
  \savedanchor\basepoint{%
    \pgf@x.5\wd\pgfnodeparttextbox%
    \pgf@y0pt%
  }%
  \anchor{center}{\centerpoint}%
  \anchor{mid}{\midpoint}%
  \anchor{mid east}{%
    \midpoint%
    \pgfutil@tempdima\pgf@y%
    \csname pgf@anchor@not gate US@east\endcsname%
    \pgf@y\pgfutil@tempdima%
  }%
  \anchor{mid west}{%
    \dimensions%
    \pgf@xc\halfside%
    \pgf@xc-.833333\pgf@xc%
    \advance\pgf@xc-\outerxsep%
    \midpoint%
    \advance\pgf@x\pgf@xc%
  }%
  \anchor{base}{\basepoint}%
  \anchor{base east}{%
    \basepoint%
    \pgfutil@tempdima\pgf@y%
    \csname pgf@anchor@not gate US@east\endcsname%
    \pgf@y\pgfutil@tempdima%
  }%
  \anchor{base west}{%
    \dimensions%
    \pgf@xc\halfside%
    \pgf@xc-.833333\pgf@xc%
    \advance\pgf@xc-\outerxsep%
    \basepoint%
    \advance\pgf@x\pgf@xc%
  }%
  \inheritanchor[from=and gate US]{base}%
  \anchor{output}{%
    \dimensions%
    \pgf@xc\halfside%
    \centerpoint%
    \advance\pgf@x-.166666\pgf@xc%
    \pgf@xc2.0\pgf@xc%
    \advance\pgf@x.866025\pgf@xc%
    \advance\pgf@x\invertedradius%
    \advance\pgf@x\outerinvertedradius%
    \advance\pgf@x\outerxsep%
  }%
  \anchor{east}{%
    \dimensions%
    \tipanchor%
    \pgf@xa\pgf@x%
    \centerpoint%
    \advance\pgf@x\pgf@xa%
  }%
  \anchor{north}{%
    \dimensions%
    \ifpgfgateanchorsuseboundingrectangle%
      \csname pgf@anchor@not gate US@north west\endcsname%
      \pgf@ya\pgf@y%
      \centerpoint%
      \pgf@y\pgf@ya%
    \else%
      \pgfpointintersectionoflines{\centerpoint}{\centerpoint\advance\pgf@y1pt}%
      {\csname pgf@anchor@not gate US@north west\endcsname}%
      {%
        \pgfpointadd{\centerpoint}{%
          \tipanchor%
          \pgf@xa\outerxsep%
          \advance\pgf@x2.350943\pgf@xa%
        }%
      }%
    \fi%
  }%
  \anchor{south}{%
    \dimensions%
    \ifpgfgateanchorsuseboundingrectangle%
      \csname pgf@anchor@not gate US@south west\endcsname%
      \pgf@ya\pgf@y%
      \centerpoint%
      \pgf@y\pgf@ya%
    \else%
      \pgfpointintersectionoflines{\centerpoint}{\centerpoint\advance\pgf@y-1pt}%
      {\csname pgf@anchor@not gate US@south west\endcsname}%
      {%
        \pgfpointadd{\centerpoint}{%
          \tipanchor%
          \pgf@xa\outerxsep%
          \advance\pgf@x2.350943\pgf@xa%
        }%
      }%
    \fi%
  }%
  \anchor{south east}{%
    \dimensions%
    \ifpgfgateanchorsuseboundingrectangle%
      \csname pgf@anchor@not gate US@south west\endcsname%
      \pgf@ya\pgf@y%
      \pgf@process{%
        \dimensions%
        \tipanchor%
        \pgf@xa\pgf@x%
        \centerpoint%
        \advance\pgf@x\pgf@xa%
      }%
      \pgf@y\pgf@ya%
    \else%
      \pgfpointintersectionoflines{\centerpoint}{\centerpoint\advance\pgf@x1pt\advance\pgf@y-1pt}%
      {\csname pgf@anchor@not gate US@south west\endcsname}%
      {%
        \pgfpointadd{\centerpoint}{%
          \tipanchor%
          \pgf@xa\outerxsep%
          \advance\pgf@x2.350943\pgf@xa%
        }%
      }%
    \fi%
  }%
  \anchor{north east}{%
    \dimensions%
    \ifpgfgateanchorsuseboundingrectangle%
      \csname pgf@anchor@not gate US@north west\endcsname%
      \pgf@ya\pgf@y%
      \pgf@process{%
        \dimensions%
        \tipanchor%
        \pgf@xa\pgf@x%
        \centerpoint%
        \advance\pgf@x\pgf@xa%
      }%
      \pgf@y\pgf@ya%
    \else%
      \pgfpointintersectionoflines{\centerpoint}{\centerpoint\advance\pgf@x1pt\advance\pgf@y1pt}%
      {\csname pgf@anchor@not gate US@north west\endcsname}%
      {%
        \pgfpointadd{\centerpoint}{%
          \tipanchor%
          \pgf@xa\outerxsep%
          \advance\pgf@x2.350943\pgf@xa%
        }%
      }%
    \fi%
  }%
  \anchor{south west}{%
    \dimensions%
    \pgf@xa\halfside%
    \centerpoint%
    \advance\pgf@x-.833333\pgf@xa
    \advance\pgf@x-\outerxsep%
    \advance\pgf@y-1.166666\pgf@xa%
    \pgf@ya\outerysep%
    \advance\pgf@y-1.565\pgf@ya% Selected by trial and error.
  }%
  \anchor{north west}{%
    \dimensions%
    \pgf@xa\halfside%
    \centerpoint%
    \advance\pgf@x-.833333\pgf@xa
    \advance\pgf@x-\outerxsep%
    \advance\pgf@y1.166666\pgf@xa%
    \pgf@ya\outerysep%
    \advance\pgf@y1.565\pgf@ya% Selected by trial and error.
  }%
  \anchor{input}{%
    \dimensions%
    \pgf@lib@sh@logicgate@AND@inputanchor{1}%
    \pgf@xc\halfside%
    \advance\pgf@x.333333\pgf@xc%
  }%
  \anchor{west}{%
    \dimensions%
    \pgf@xc\halfside%
    \pgf@xc-.833333\pgf@xc%
    \advance\pgf@xc-\outerxsep%
    \centerpoint%
    \advance\pgf@x\pgf@xc%
  }%
  \backgroundpath{%
    \dimensions%
    \pgf@xc\halfwidth%
    \pgf@yc\halfheight%
    \advance\pgf@xc-\outerxsep%
    \advance\pgf@yc-\outerysep%
    {%
      \pgftransformshift{\centerpoint}%
      \pgfpathmoveto{\tipanchor}%
      \pgfpathlineto{\pgfqpoint{-.833333\pgf@xc}{1.166666\pgf@yc}}%
      \pgfpathlineto{\pgfqpoint{-.833333\pgf@xc}{-1.166666\pgf@yc}}%
      \pgfpathlineto{\tipanchor}%
      %
      % Draw the output inverter.
      %
      {%
        \pgfpathcircle{%
          \pgf@x-.166666\pgf@xc%
          \pgf@yc2.0\pgf@yc%
          \advance\pgf@x.866025\pgf@yc%
          \advance\pgf@x\outerinvertedradius%
          \pgf@y0pt%
        }{+\invertedradius}%
      }%
      %
      % Draw the input.
      %
      \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-1\endcsname%
      {%
        \pgfpathcircle{%
          \pgf@xa\halfside%
          \pgf@x-.833333\pgf@xa%
          \advance\pgf@x-.5\pgflinewidth%
          \advance\pgf@x-\invertedradius%
          \pgf@y0pt%
        }{+\invertedradius}%
      }%
      \fi%
    }%
  }%
  \anchorborder{%
    \pgf@lib@gates@not@buffer@border{not gate US}
  }%
}%

\def\pgf@lib@gates@not@buffer@border#1{
  \pgfextract@process\externalpoint{}%
  \pgfextract@process\externalpoint{\pgfpointadd{\centerpoint}{\externalpoint}}%
  \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
  \ifx\pgfmathresult\pgf@lib@zero@text%
    \csname pgf@anchor@#1@output\endcsname%
  \else%
    \ifx\pgfmathresult\pgf@lib@onehundredeighty@text%
      \csname pgf@anchor@#1@input\endcsname%
    \else%
      \let\externalangle\pgfmathresult%
      \dimensions%
      \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@not gate US@north west\endcsname}%
      \ifdim\externalangle pt<\pgfmathresult pt%
        \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
        {\csname pgf@anchor@not gate US@north west\endcsname}%
        {%
          \pgfpointadd{\centerpoint}{%
            \tipanchor%
            \pgf@xa\outerxsep%
            \advance\pgf@x2.350943\pgf@xa%
          }%
        }%
      \else%
        \pgfmathanglebetweenpoints{\centerpoint}{\csname pgf@anchor@not gate US@south west\endcsname}%
        \ifdim\externalangle pt<\pgfmathresult pt%
          \pgfpointintersectionoflines{\externalpoint}{\centerpoint}%
          {\csname pgf@anchor@not gate US@north west\endcsname}%
          {\csname pgf@anchor@not gate US@south west\endcsname}%
        \else%
          \pgfpointintersectionoflines{\centerpoint}{\externalpoint}%
          {\csname pgf@anchor@not gate US@south west\endcsname}%
          {%
            \pgfpointadd{\centerpoint}{%
              \tipanchor%
              \pgf@xa\outerxsep%
              \advance\pgf@x2.350943\pgf@xa%
            }%
          }%
        \fi%
      \fi%
    \fi%
  \fi%
}%


\def\pgf@lib@zero@text{0.0}%
\def\pgf@lib@onehundredeighty@text{180.0}%




% Shape buffer gate US.
%
\pgfdeclareshape{buffer gate US}{%
    \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@buffer gate US\endcsname{%
        \pgf@lib@sh@logicgate@parseinputs{1}%
        \ifnum\pgf@lib@sh@logicgate@numinputs=0\relax%
            \pgferror{A buffer gate must have one input}%
        \fi%
    }%
    \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
    \saveddimen\invertedradius{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
    }%
    \saveddimen\halflinewidth{%
        \pgf@x.5\pgflinewidth%
    }%
    \saveddimen\outerinvertedradius{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
        \advance\pgf@x.5\pgflinewidth%
    }%
    \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@orUS}%
    \savedanchor\centerpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y.5\ht\pgfnodeparttextbox%
        \advance\pgf@y-.5\dp\pgfnodeparttextbox%
    }%
    \savedanchor\midpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgfmathsetlength\pgf@y{+0.5ex}%
    }%
    \savedanchor\basepoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y0pt%
    }%
    \anchor{center}{\centerpoint}%
    \anchor{mid}{\midpoint}%
    \anchor{mid east}{%
        \midpoint%
        \pgfutil@tempdima\pgf@y%
        \csname pgf@anchor@buffer gate US@east\endcsname%
        \pgf@y\pgfutil@tempdima%
    }%
    \anchor{mid west}{%
        \dimensions%
        \pgf@xc\halfside%
        \pgf@xc-.833333\pgf@xc%
        \advance\pgf@xc-\outerxsep%
        \midpoint%
        \advance\pgf@x\pgf@xc%
    }%
    \anchor{base}{\basepoint}%
    \anchor{base east}{%
        \basepoint%
        \pgfutil@tempdima\pgf@y%
        \csname pgf@anchor@buffer gate US@east\endcsname%
        \pgf@y\pgfutil@tempdima%
    }%
    \inheritanchor[from=not gate US]{base west}%
    \inheritanchor[from=and gate US]{base}%
    \anchor{output}{\csname pgf@anchor@buffer gate US@east\endcsname}%
    \anchor{east}{%
        \dimensions%
        \pgfpointadd{\centerpoint}{%
            \tipanchor%
            \pgf@xa\outerxsep%
            \advance\pgf@x2.350943\pgf@xa%
        }%
    }%
    \anchor{north}{%
        \dimensions%
        \ifpgfgateanchorsuseboundingrectangle%
            \csname pgf@anchor@not gate US@north west\endcsname%
            \pgf@ya\pgf@y%
            \centerpoint%
            \pgf@y\pgf@ya%
        \else%
            \pgfpointintersectionoflines{\centerpoint}{\centerpoint\advance\pgf@y1pt}%
                {\csname pgf@anchor@buffer gate US@north west\endcsname}%
                {%
                    \pgfpointadd{\centerpoint}{%
                        \tipanchor%
                        \pgf@xa\outerxsep%
                        \advance\pgf@x2.350943\pgf@xa%
                    }%
                }%
        \fi%
    }%
    \anchor{south}{%
        \dimensions%
        \ifpgfgateanchorsuseboundingrectangle%
            \csname pgf@anchor@not gate US@south west\endcsname%
            \pgf@ya\pgf@y%
            \centerpoint%
            \pgf@y\pgf@ya%
        \else%
            \pgfpointintersectionoflines{\centerpoint}{\centerpoint\advance\pgf@y-1pt}%
                {\csname pgf@anchor@not gate US@south west\endcsname}%
                {%
                    \pgfpointadd{\centerpoint}{%
                        \tipanchor%
                        \pgf@xa\outerxsep%
                        \advance\pgf@x2.350943\pgf@xa%
                    }%
                }%
        \fi%
    }%
    \anchor{south east}{%
        \dimensions%
        \ifpgfgateanchorsuseboundingrectangle%
            \csname pgf@anchor@not gate US@south west\endcsname%
            \pgfutil@tempdima\pgf@y%
            \csname pgf@anchor@buffer gate US@east\endcsname%
            \pgf@y\pgfutil@tempdima%
        \else%
            \pgfpointintersectionoflines{\centerpoint}{\centerpoint\advance\pgf@x1pt\advance\pgf@y-1pt}%
                {\csname pgf@anchor@buffer gate US@south west\endcsname}%
                {%
                    \pgfpointadd{\centerpoint}{%
                        \tipanchor%
                        \pgf@xc\outerxsep%
                        \advance\pgf@x2.350943\pgf@xc%
                    }%
                }%
        \fi%
    }%
    \anchor{north east}{%
        \dimensions%
        \ifpgfgateanchorsuseboundingrectangle%
            \csname pgf@anchor@not gate US@north west\endcsname%
            \pgfutil@tempdima\pgf@y%
            \csname pgf@anchor@buffer gate US@east\endcsname%
            \pgf@y\pgfutil@tempdima%
        \else%
            \pgfpointintersectionoflines{\centerpoint}{\centerpoint\advance\pgf@x1pt\advance\pgf@y1pt}%
                {\csname pgf@anchor@buffer gate US@north west\endcsname}%
                {%
                    \pgfpointadd{\centerpoint}{%
                        \tipanchor%
                        \pgf@xa\outerxsep%
                        \advance\pgf@x2.350943\pgf@xa%
                    }%
                }%
        \fi%
    }%
    \inheritanchor[from=not gate US]{south west}%
    \inheritanchor[from=not gate US]{north west}%
    \inheritanchor[from=not gate US]{input}%
    \inheritanchor[from=not gate US]{west}%
    \backgroundpath{%
        \dimensions%
        \pgf@xc\halfwidth%
        \pgf@yc\halfheight%
        \advance\pgf@xc-\outerxsep%
        \advance\pgf@yc-\outerysep%
        {%
            \pgftransformshift{\centerpoint}%
            \pgfpathmoveto{\tipanchor}%
            \pgfpathlineto{\pgfqpoint{-.833333\pgf@xc}{1.166666\pgf@yc}}%
            \pgfpathlineto{\pgfqpoint{-.833333\pgf@xc}{-1.166666\pgf@yc}}%
            \pgfpathclose%
            %
            % Draw the input.
            %
            \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-1\endcsname%
                {%
                    \pgfpathcircle{%
                        \pgf@xa\halfside%
                        \pgf@x-.833333\pgf@xa%
                        \advance\pgf@x-.5\pgflinewidth%
                        \advance\pgf@x-\invertedradius%
                        \pgf@y0pt%
                    }{+\invertedradius}%
                }%
            \fi%
        }%
    }%
  \anchorborder{%
    \pgf@lib@gates@not@buffer@border{buffer gate US}
  }%
}%





\pgfdeclareshape{and gate CDH}{%
    \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@and gate CDH\endcsname{%
        \pgf@lib@sh@logicgate@parseinputs{1024}% Maximum 1024 (!) inputs.
        %
        \pgfmathloop%
        \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
        \else%
            \pgfutil@ifundefined{pgf@anchor@and gate CDH@input \pgfmathcounter}{%
                \expandafter\xdef\csname pgf@anchor@and gate CDH@input \pgfmathcounter\endcsname{%
                    \noexpand\pgf@lib@sh@logicgate@AND@inputanchor{\pgfmathcounter}%
                }%
            }{}%
        \repeatpgfmathloop%
        \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
            \pgferror{An and gate must have at least two inputs}%
        \fi%
    }%
    \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
    \saveddimen\invertedradius{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
    }%
    \saveddimen\outerinvertedradius{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
        \advance\pgf@x.5\pgflinewidth%
    }%
    \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@orUS}%
    \savedanchor\centerpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y.5\ht\pgfnodeparttextbox%
        \advance\pgf@y-.5\dp\pgfnodeparttextbox%
    }%
    \savedanchor\midpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgfmathsetlength\pgf@y{+0.5ex}%
    }%
    \savedanchor\basepoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y0pt%
    }%
    \anchor{center}{\centerpoint}%
    \anchor{mid}{\midpoint}%
    \anchor{mid east}{%
        \csname pgf@anchor@and gate CDH@east\endcsname%
        \pgf@xa\pgf@x%
        \midpoint%
        \pgf@x\pgf@xa}%
    \anchor{mid west}{%
        \csname pgf@anchor@and gate CDH@west\endcsname%
        \pgf@xa\pgf@x%
        \midpoint%
        \pgf@x\pgf@xa}%
    \anchor{base}{\basepoint}%
    \anchor{base east}{%
        \csname pgf@anchor@and gate CDH@east\endcsname%
        \pgf@xa\pgf@x%
        \basepoint%
        \pgf@x\pgf@xa}%
    \anchor{base west}{%
        \csname pgf@anchor@and gate CDH@west\endcsname%
        \pgf@xa\pgf@x%
        \basepoint%
        \pgf@x\pgf@xa}%
    \anchor{east}{%
        \dimensions%
        \pgfpointadd{\centerpoint}{\tipanchor}%
    }%
    \anchor{output}{\csname pgf@anchor@and gate CDH@east\endcsname}%
    \anchor{north east}{%
        \dimensions%
        \ifpgfgateanchorsuseboundingrectangle%
            \tipanchor%
            \pgf@xa\pgf@x%
            \centerpoint%
            \advance\pgf@x\pgf@xa%
            \advance\pgf@y\halfheight%
        \else%
            \centerpoint%
            \pgf@xa\halfwidth%
            \pgf@ya\halfheight%
            \pgf@xb\halfside%
            \advance\pgf@x-.166666\pgf@xb%
            \advance\pgf@xa\pgf@xb%
            \advance\pgf@x.5\pgf@xa%
            \advance\pgf@y-\pgf@xb%
            \advance\pgf@ya\pgf@xb%
            \advance\pgf@y.866025\pgf@ya%
        \fi%
    }%
    \anchor{south east}{%
        \dimensions%
        \ifpgfgateanchorsuseboundingrectangle%
            \tipanchor%
            \pgf@xa\pgf@x%
            \centerpoint%
            \advance\pgf@x\pgf@xa%
            \advance\pgf@y-\halfheight%
        \else
            \centerpoint%
            \pgf@xa\halfwidth%
            \pgf@ya\halfheight%
            \pgf@xb\halfside%
            \advance\pgf@x-.166666\pgf@xb%
            \advance\pgf@xa\pgf@xb%
            \advance\pgf@x.5\pgf@xa%
            \advance\pgf@y\pgf@xb%
            \advance\pgf@ya\pgf@xb%
            \advance\pgf@y-.866025\pgf@ya%
        \fi%
    }%
    \anchor{north}{%
        \dimensions%
        \centerpoint%
        \ifpgfgateanchorsuseboundingrectangle%
            \advance\pgf@y\halfheight%
        \else%
            \pgf@ya\halfheight%
            \advance\pgf@y.993043\pgf@ya%
        \fi%
    }%
    \anchor{south}{%
        \dimensions%
        \centerpoint%
        \ifpgfgateanchorsuseboundingrectangle%
            \advance\pgf@y-\halfheight%
        \else%
            \pgf@ya\halfheight%
            \advance\pgf@y-.993043\pgf@ya%
        \fi%
    }%
    \anchor{south west}{%
        \dimensions%
        \centerpoint%
        \pgf@xa\halfside%
        \advance\pgf@x-1.16666\pgf@xa%
        \advance\pgf@x-\outerxsep%
        \advance\pgf@y-\halfheight%
    }%
    \anchor{north west}{%
        \dimensions%
        \centerpoint%
        \pgf@xa\halfside%
        \advance\pgf@x-1.16666\pgf@xa%
        \advance\pgf@x-\outerxsep%
        \advance\pgf@y\halfheight%
    }%
    \anchor{west}{%
        \dimensions%
        \centerpoint%
        \pgf@xa\halfside%
        \advance\pgf@x-1.16666\pgf@xa%
        \advance\pgf@x-\outerxsep%
    }%
    \backgroundpath{%
        \dimensions%
        \pgf@xc\halfwidth%
        \pgf@yc\halfheight%
        \advance\pgf@xc-\outerxsep%
        \advance\pgf@yc-\outerysep%
        {%
            \pgftransformshift{\centerpoint}%
            \pgfpathmoveto{\pgfqpoint{-.16666\pgf@xc}{\pgf@yc}}%
            {%
                \pgf@yc2.0\pgf@yc%
                \edef\pgf@marshal{%
                    \noexpand\pgfpatharc{90}{30}{\the\pgf@yc}%
                }%
                \pgf@marshal%
            }
            {%
                \pgf@yc2.0\pgf@yc%
                \edef\pgf@marshal{%
                    \noexpand\pgfpatharc{-30}{-90}{\the\pgf@yc}%
                }%
                \pgf@marshal%
            }
            \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{-\pgf@yc}}%
            \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{\pgf@yc}}%
            \pgfpathclose%
            %
            % Draw the inputs.
            %
            \pgfutil@tempdima2.0\pgf@yc%
            \c@pgf@counta\numinputs%
            \advance\c@pgf@counta1\relax%
            \divide\pgfutil@tempdima\c@pgf@counta%
            \pgfmathloop%
            \ifnum\pgfmathcounter>\numinputs%
            \else%
                \advance\pgf@yc-\pgfutil@tempdima%
                \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-\pgfmathcounter\endcsname%
                    {%
                        \pgfpathcircle{%
                            \pgf@xa\halfside%
                            \pgf@x-1.16666\pgf@xa%
                            \advance\pgf@x-.5\pgflinewidth%
                            \advance\pgf@x-\invertedradius%
                            \pgf@y\pgf@yc%
                        }{+\invertedradius}%
                    }%
                \fi%
            \repeatpgfmathloop%
        }%
    }%
    \anchorborder{%
        \pgfextract@process\externalpoint{}%
        \pgf@xa\pgf@x%
        \pgf@ya\pgf@y%
        \dimensions%
        \pgf@xb\halfside%
        %
        \pgf@xb-.166666\pgf@xb%
        \ifdim\pgf@xa<\pgf@xb%
            \pgfpointadd{\centerpoint}{%
                \pgfpointborderrectangle{\externalpoint}{%
                    \pgf@xc\halfside%
                    \pgf@xc.166666\pgf@xc%
                    \advance\pgf@xc\halfwidth%
                    \pgfqpoint{\pgf@xc}{\halfheight}%
                }%
            }%
        \else%
            \ifdim\pgf@y=0pt\relax%
                \csname pgf@anchor@and gate CDH@east\endcsname%
            \else%
                \pgfextract@process\externalpoint{\pgfpointadd{\centerpoint}{\externalpoint}}%
                \pgf@xc\halfwidth%
                \advance\pgf@xc\halfside%
                \pgf@yc\halfheight%
                \advance\pgf@yc\halfside%
                \ifdim\pgf@ya<0pt%
                    \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
                    {%
                        \centerpoint%
                        \advance\pgf@y\halfside%
                        \advance\pgf@x\pgf@xb%
                    }%
                    {270}{330}{+\pgf@yc}%
                \else%
                    \pgfmathpointintersectionoflineandarc{\externalpoint}{\centerpoint}%
                    {%
                        \centerpoint%
                        \advance\pgf@y-\halfside%
                        \advance\pgf@x\pgf@xb%
                    }%
                    {30}{90}{+\pgf@xc and +\pgf@yc}%
                \fi%
            \fi%
        \fi%
    }%
}%


\pgfdeclareshape{nand gate CDH}{%
    \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@nand gate CDH\endcsname{%
        \pgf@lib@sh@logicgate@parseinputs{1024}% Maximum 1024 (!) inputs.
        %
        \pgfmathloop%
        \ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
        \else%
            \pgfutil@ifundefined{pgf@anchor@nand gate CDH@input \pgfmathcounter}{%
                \expandafter\xdef\csname pgf@anchor@nand gate CDH@input \pgfmathcounter\endcsname{%
                    \noexpand\pgf@lib@sh@logicgate@AND@inputanchor{\pgfmathcounter}%
                }%
            }{}%
        \repeatpgfmathloop%
        \ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
            \pgferror{A nand gate must have at least two inputs}%
        \fi%
    }%
    \savedmacro\numinputs{\let\numinputs\pgf@lib@sh@logicgate@numinputs}%
    \saveddimen\invertedradius{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
    }%
    \saveddimen\outerinvertedradius{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
        \advance\pgf@x.5\pgflinewidth%
    }%
    \savedmacro\dimensions{\pgf@lib@sh@logicgates@dimensions@orUS}%
    \savedanchor\centerpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y.5\ht\pgfnodeparttextbox%
        \advance\pgf@y-.5\dp\pgfnodeparttextbox%
    }%
    \savedanchor\midpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgfmathsetlength\pgf@y{+0.5ex}%
    }%
    \savedanchor\basepoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y0pt%
    }%
    \anchor{center}{\centerpoint}%
    \anchor{mid}{\midpoint}%
    \inheritanchor[from=and gate CDH]{mid east}%
    \inheritanchor[from=and gate CDH]{mid west}%
    \anchor{base}{\basepoint}%%
    \inheritanchor[from=and gate CDH]{base east}%
    \inheritanchor[from=and gate CDH]{base west}%
    \anchor{output}{%
        \dimensions
        \pgfpointadd{\centerpoint}{%
            \pgf@xa\halfside%
            \pgf@x-.166666\pgf@xa%
            \pgf@xb2.0\pgf@xa%
            \advance\pgf@x.866025\pgf@xb%
            \advance\pgf@x\invertedradius%
            \advance\pgf@x\outerinvertedradius%
            \advance\pgf@x\outerxsep%
            \pgf@y0pt%
        }%
    }%
    \inheritanchor[from=and gate CDH]{east}%
    \inheritanchor[from=and gate CDH]{north east}%
    \inheritanchor[from=and gate CDH]{south east}%
    \inheritanchor[from=and gate CDH]{north}%
    \inheritanchor[from=and gate CDH]{south}%
    \inheritanchor[from=and gate CDH]{south west}%
    \inheritanchor[from=and gate CDH]{north west}%
    \inheritanchor[from=and gate CDH]{west}%
    \backgroundpath{%
        \dimensions%
        \pgf@xc\halfwidth%
        \pgf@yc\halfheight%
        \advance\pgf@xc-\outerxsep%
        \advance\pgf@yc-\outerysep%
        {%
            \pgftransformshift{\centerpoint}%
            \pgfpathmoveto{\pgfqpoint{-.16666\pgf@xc}{\pgf@yc}}%
            {%
                \pgf@yc2.0\pgf@yc%
                \edef\pgf@marshal{%
                    \noexpand\pgfpatharc{90}{30}{\the\pgf@yc}%
                }%
                \pgf@marshal%
            }
            {%
                \pgf@yc2.0\pgf@yc%
                \edef\pgf@marshal{%
                    \noexpand\pgfpatharc{-30}{-90}{\the\pgf@yc}%
                }%
                \pgf@marshal%
            }
            \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{-\pgf@yc}}%
            \pgfpathlineto{\pgfqpoint{-1.16666\pgf@xc}{\pgf@yc}}%
            \pgfpathclose%
            %
            % Draw the output inverter.
            %
            {%
                \pgfpathcircle{%
                    \pgf@x-.166666\pgf@xc%
                    \pgf@yc2.0\pgf@yc%
                    \advance\pgf@x.866025\pgf@yc%
                    \advance\pgf@x\outerinvertedradius%
                    \pgf@y0pt%
                }{+\invertedradius}%
            }%
            %
            % Draw the inputs.
            %
            \pgfutil@tempdima2.0\pgf@yc%
            \c@pgf@counta\numinputs%
            \advance\c@pgf@counta1\relax%
            \divide\pgfutil@tempdima\c@pgf@counta%
            \pgfmathloop%
            \ifnum\pgfmathcounter>\numinputs%
            \else%
                \advance\pgf@yc-\pgfutil@tempdima%
                \expandafter\ifx\expandafter\pgf@lib@sh@itext\csname input-\pgfmathcounter\endcsname%
                    {%
                        \pgfpathcircle{%
                            \pgf@xa\halfside%
                            \pgf@x-1.16666\pgf@xa%
                            \advance\pgf@x-.5\pgflinewidth%
                            \advance\pgf@x-\invertedradius%
                            \pgf@y\pgf@yc%
                        }{+\invertedradius}%
                    }%
                \fi%
            \repeatpgfmathloop%
        }%
    }%
    \inheritanchorborder[from=and gate CDH]%
}%
