You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
tex-compiler/texmf-dist/tex/generic/pgf/libraries/shapes/circuits/pgflibraryshapes.gates.logi...

2525 lines
84 KiB

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