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


\pgfkeys{/pgf/.cd,
	logic gate input sep/.initial=0.125cm,
	logic gate inputs/.initial={normal,normal},%
	logic gate inverted radius/.initial=2pt,%
	logic gate anchors use bounding box/.is if=pgfgateanchorsuseboundingrectangle,%
	and gate IEC symbol/.initial=$\char`\&$,
	nand gate IEC symbol/.initial=$\char`\&$,
	or gate IEC symbol/.initial=$\geq1$,
	nor gate IEC symbol/.initial=$\geq1$,
	xor gate IEC symbol/.initial={$=1$},
	xnor gate IEC symbol/.initial={$=1$},
	not gate IEC symbol/.initial=1,
	buffer gate IEC symbol/.initial=1,
	logic gate IEC symbol align/.initial=top,
	logic gate IEC symbol color/.initial=% no value
}

\pgfkeys{/pgf/logic gate IEC symbol align/.cd,
	top/.code=\pgftransformyshift{\innerhalfheight},
	bottom/.code=\pgftransformyshift{-\innerhalfheight},
	left/.code=\pgftransformxshift{-\innerhalfwidth},
	right/.code=\pgftransformxshift{\innerhalfwidth}
}

% Internal macro for parsing inputs.
%
\expandafter\ifx\csname pgf@lib@sh@logicgate@parseinputs\endcsname\relax%
\def\pgf@lib@sh@logicgate@parseinputs#1{%
	\edef\pgf@lib@sh@temp{\pgfkeysvalueof{/pgf/logic gate inputs}}%
	\c@pgf@counta#1\relax%
	\c@pgf@countb0\relax%
	\expandafter\pgfutil@in@\expandafter,\expandafter{\pgf@lib@sh@temp}%
	\ifpgfutil@in@%
		\let\pgf@lib@sh@next\pgf@lib@sh@logicgate@parseinputs@long%
	\else%
		\let\pgf@lib@sh@next\pgf@lib@sh@logicgate@parseinputs@short%
	\fi%
	\pgf@lib@sh@next%
}	
\def\pgf@lib@sh@itext{i}
\def\pgf@lib@sh@invertedtext{inverted}
%
%	The `short' version for input specifcation is an extension of
%	ideas due to Juergen Werber and Christoph Bartoschek.
%
\def\pgf@lib@sh@logicgate@parseinputs@short{%
	\expandafter\pgf@lib@sh@logicgate@parseinputs@@short\pgf@lib@sh@temp\pgf@stop%
}
\def\pgf@lib@sh@logicgate@parseinputs@@short#1{%
	\ifx#1\pgf@stop%
		\edef\pgf@lib@sh@logicgate@numinputs{\the\c@pgf@countb}%
		\let\pgf@lib@sh@next\relax%
	\else%
		\ifnum\c@pgf@countb=\c@pgf@counta%
			\edef\pgf@lib@sh@logicgate@numinputs{\the\c@pgf@countb}%
			\let\pgf@lib@sh@next\relax%
		\else%
			\advance\c@pgf@countb1\relax%
			\expandafter\ifx\pgf@lib@sh@itext#1%
				\expandafter\pgf@sh@resavedmacro\expandafter{\csname input-\the\c@pgf@countb\endcsname}{%
					\expandafter\def\csname input-\the\c@pgf@countb\endcsname{i}}%
			\else%
				\expandafter\pgf@sh@resavedmacro\expandafter{\csname input-\the\c@pgf@countb\endcsname}{%
					\expandafter\def\csname input-\the\c@pgf@countb\endcsname{n}}%
			\fi%		
			\let\pgf@lib@sh@next\pgf@lib@sh@logicgate@parseinputs@@short%
		\fi%
	\fi%
	\pgf@lib@sh@next%
}
\def\pgf@lib@sh@logicgate@parseinputs@long{%
	\expandafter\pgf@lib@sh@logicgate@parseinputs@@long\pgf@lib@sh@temp,\pgf@stop,%
}
\def\pgf@lib@sh@logicgate@parseinputs@@long#1,{%
	\ifx#1\pgf@stop%
		\edef\pgf@lib@sh@logicgate@numinputs{\the\c@pgf@countb}%
		\let\pgf@lib@sh@next\relax%
	\else%
		\ifnum\c@pgf@countb=\c@pgf@counta%
			\edef\pgf@lib@sh@logicgate@numinputs{\the\c@pgf@countb}%
			\let\pgf@lib@sh@next\relax%
		\else%
			\advance\c@pgf@countb1\relax%
			\def\pgf@lib@sh@temp{#1}%
			\ifx\pgf@lib@sh@invertedtext\pgf@lib@sh@temp%
				\expandafter\pgf@sh@resavedmacro\expandafter{\csname input-\the\c@pgf@countb\endcsname}{%
					\expandafter\def\csname input-\the\c@pgf@countb\endcsname{i}}%
			\else%
				\expandafter\pgf@sh@resavedmacro\expandafter{\csname input-\the\c@pgf@countb\endcsname}{%
					\expandafter\def\csname input-\the\c@pgf@countb\endcsname{n}}%
			\fi%		
			\let\pgf@lib@sh@next\pgf@lib@sh@logicgate@parseinputs@@@long%
		\fi%
	\fi%
	\pgf@lib@sh@next%
}
\def\pgf@lib@sh@logicgate@parseinputs@@@long{%
	\pgfutil@ifnextchar x{\pgf@lib@sh@logicgate@parseinputs@@long}%
		{\pgf@lib@sh@logicgate@parseinputs@@long}%
}
\fi%

\def\pgf@lib@sh@logicgates@IEC@foregroundpath#1{%
	\dimensions%
	{%
		\pgftransformshift{\centerpoint}%
		\edef\pgf@lib@sh@temp{\pgfkeysvalueof{/pgf/logic gate IEC symbol align}}%
		\edef\pgf@lib@sh@@temp{/pgf/logic gate IEC symbol align/.cd, \pgf@lib@sh@temp}%
		\expandafter\pgfkeys\expandafter{\pgf@lib@sh@@temp}%
		\expandafter\pgftext\expandafter[\pgf@lib@sh@temp]{%
			\pgfkeysgetvalue{/pgf/logic gate IEC symbol color}{\pgf@lib@sh@temp}%
			\ifx\pgf@lib@sh@temp\pgfutil@empty%
			\else%
				\expandafter\color\expandafter{\pgf@lib@sh@temp}%
			\fi%
			\pgfkeysvalueof{/pgf/#1 gate IEC symbol}%
		}%
	}%
}	


\def\pgf@lib@sh@logicgates@dimensions@IEC#1{%
	\pgf@x.5\wd\pgfnodeparttextbox%
	\pgf@y.5\ht\pgfnodeparttextbox%
	\advance\pgf@y.5\dp\pgfnodeparttextbox%
	%
	% Adjust for the width of the gate symbol.
	%
	\setbox\pgf@hbox\hbox{{\pgfkeysvalueof{/pgf/#1 gate IEC	symbol}}}% add braces as color-aftergroup-fix TT
	\pgf@xa.5\wd\pgf@hbox%
	\pgf@ya.5\ht\pgf@hbox%
	\advance\pgf@ya.5\dp\pgf@hbox%
	\ifdim\pgf@x<\pgf@xa%
		\pgf@x\pgf@xa%
	\fi%
	\ifdim\pgf@y<\pgf@ya%
		\pgf@y\pgf@ya%
	\fi%
	\pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
	\pgfmathaddtolength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
	%
	% Adjust for minimum height and width.
	%
	\pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
	\pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
	\ifdim\pgf@x<.5\pgf@xa%
		\pgf@x.5\pgf@xa%
	\fi%
	\ifdim\pgf@y<.5\pgf@ya%
		\pgf@y.5\pgf@ya%
	\fi%
	%
	% Adjust the height for the number of inputs.
	%
	\c@pgf@counta\pgf@lib@sh@logicgate@numinputs%
	\advance\c@pgf@counta1\relax%
	\pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
	\pgf@yb2.0\pgf@yb%
	\advance\pgf@yb\pgflinewidth%
	\pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/logic gate input sep}}%
	\edef\inputsep{\the\pgf@yc}%
	\addtosavedmacro\inputsep%
	\ifdim\pgf@yb<\pgf@yc%
		\pgf@yb\pgf@yc%
	\fi%
	\multiply\pgf@yb\c@pgf@counta%
	\ifdim\pgf@y<.5\pgf@yb%
		\pgf@y.5\pgf@yb%
	\fi%
	%
	\pgf@xa\pgf@y%
	\pgfmathaddtolength\pgf@xa{-\pgfkeysvalueof{/pgf/inner xsep}}%
	\edef\innerhalfwidth{\the\pgf@xa}%
	\addtosavedmacro\innerhalfwidth%
	%
	\pgf@ya\pgf@y%
	\pgfmathaddtolength\pgf@ya{-\pgfkeysvalueof{/pgf/inner ysep}}%
	\edef\innerhalfheight{\the\pgf@ya}%
	\addtosavedmacro\innerhalfheight%
	%
	% Take into account the outer sep.
	%
	\pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
	\pgfmathaddtolength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
	%
	\edef\halfwidth{\the\pgf@x}%
	\edef\halfheight{\the\pgf@y}%
	\addtosavedmacro\halfwidth%
	\addtosavedmacro\halfheight%
}%

\def\pgf@lib@sh@logicgate@IEC@inputanchor#1{%
	\dimensions%
	\centerpoint%
	\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\halfheight%
	\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\halfheight%
	\advance\pgf@y-\pgfutil@tempdima%
}



% Shape and gate IEC
%
\pgfdeclareshape{and gate IEC}{
	\expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@and gate IEC\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 IEC@input \pgfmathcounter}{%
				\expandafter\xdef\csname pgf@anchor@and gate IEC@input \pgfmathcounter\endcsname{%
					\noexpand\pgf@lib@sh@logicgate@IEC@inputanchor{\pgfmathcounter}%
				}%
			}{}%
		\repeatpgfmathloop%
		\ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
			\PackageError{PGF}{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@IEC{and}%
	}
	\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 west}{%
		\dimensions%
		\midpoint%
		\advance\pgf@x-\halfwidth}%
	\anchor{mid east}{%
		\dimensions%
		\midpoint%
		\advance\pgf@x\halfwidth}%
	\anchor{base}{\basepoint}
	\anchor{base west}{%
		\dimensions%
		\basepoint%
		\advance\pgf@x-\halfwidth}%
	\anchor{base east}{%
		\dimensions%
		\basepoint%
		\advance\pgf@x\halfwidth}%
	\anchor{north}{\dimensions\centerpoint\advance\pgf@y\halfheight}%
	\anchor{south}{\dimensions\centerpoint\advance\pgf@y-\halfheight}%
	\anchor{east}{\dimensions\centerpoint\advance\pgf@x\halfwidth}%
	\anchor{west}{\dimensions\centerpoint\advance\pgf@x-\halfwidth}%
	\anchor{north east}{\dimensions\centerpoint\advance\pgf@x\halfwidth\advance\pgf@y\halfheight}%
	\anchor{north west}{\dimensions\centerpoint\advance\pgf@x-\halfwidth\advance\pgf@y\halfheight}%
	\anchor{south east}{\dimensions\centerpoint\advance\pgf@x\halfwidth\advance\pgf@y-\halfheight}%
	\anchor{south west}{\dimensions\centerpoint\advance\pgf@x-\halfwidth\advance\pgf@y-\halfheight}%
	\anchor{output}{\dimensions\centerpoint\advance\pgf@x\halfwidth} 
	\backgroundpath{%
		\dimensions%
		\pgf@xc\halfwidth%
		\pgf@yc\halfheight%
		\pgfmathaddtolength\pgf@xc{-\pgfkeysvalueof{/pgf/outer xsep}}%
		\pgfmathaddtolength\pgf@yc{-\pgfkeysvalueof{/pgf/outer xsep}}%
		{%
			\pgftransformshift{\centerpoint}%
			\pgfpathrectangle{\pgfqpoint{-\pgf@xc}{-\pgf@yc}}%
				{%
					\pgf@xc2.0\pgf@xc%
					\pgf@yc2.0\pgf@yc%
					\pgfqpoint{\pgf@xc}{\pgf@yc}%
				}%
			\pgfpathclose%
			%
			% Draw inputs.
			%
			\pgf@xc-\halfwidth%
			\advance\pgf@xc-\invertedradius%
			\pgf@yc\halfheight%
			\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{\pgfqpoint{\pgf@xc}{\pgf@yc}}{\invertedradius}%			
					}%
				\fi%
			\repeatpgfmathloop%
		}%
	}
	\foregroundpath{\pgf@lib@sh@logicgates@IEC@foregroundpath{and}}
	\anchorborder{%
		\pgfextract@process\externalpoint{}%
		\dimensions%
		\pgfpointadd{\centerpoint}{\pgfpointborderrectangle{\externalpoint}{\pgfqpoint{\halfwidth}{\halfheight}}}%
	}%	
}





% Shape nand gate IEC
%
\pgfdeclareshape{nand gate IEC}{
	\expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@nand gate IEC\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 IEC@input \pgfmathcounter}{%
				\expandafter\xdef\csname pgf@anchor@nand gate IEC@input \pgfmathcounter\endcsname{%
					\noexpand\pgf@lib@sh@logicgate@IEC@inputanchor{\pgfmathcounter}%
				}%
			}{}%
		\repeatpgfmathloop%
		\ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
			\PackageError{PGF}{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@IEC{nand}%
	}
	\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=and gate IEC]{center}
	\inheritanchor[from=and gate IEC]{mid}
	\inheritanchor[from=and gate IEC]{mid west}
	\inheritanchor[from=and gate IEC]{mid east}
	\inheritanchor[from=and gate IEC]{base}
	\inheritanchor[from=and gate IEC]{base west}
	\inheritanchor[from=and gate IEC]{base east}
	\inheritanchor[from=and gate IEC]{north}
	\inheritanchor[from=and gate IEC]{south}
	\inheritanchor[from=and gate IEC]{east}
	\inheritanchor[from=and gate IEC]{west}
	\inheritanchor[from=and gate IEC]{north east}
	\inheritanchor[from=and gate IEC]{north west}
	\inheritanchor[from=and gate IEC]{south east}
	\inheritanchor[from=and gate IEC]{south west}
	\anchor{output}{%
		\csname pgf@anchor@and gate IEC@east\endcsname%
		\advance\pgf@x\invertedradius%
		\advance\pgf@x\outerinvertedradius%
	}
	\backgroundpath{%
		\csname pgf@sh@bg@and gate IEC\endcsname%
		\pgfpathcircle{%
			\centerpoint%
			\advance\pgf@x\halfwidth%
			\advance\pgf@x\invertedradius%
		}{+\invertedradius}%
	}
	\foregroundpath{\pgf@lib@sh@logicgates@IEC@foregroundpath{nand}}
	\inheritanchorborder[from=and gate IEC]
}





% Shape or gate IEC
%
\pgfdeclareshape{or gate IEC}{
	\expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@or gate IEC\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 IEC@input \pgfmathcounter}{%
				\expandafter\xdef\csname pgf@anchor@or gate IEC@input \pgfmathcounter\endcsname{%
					\noexpand\pgf@lib@sh@logicgate@IEC@inputanchor{\pgfmathcounter}%
				}%
			}{}%
		\repeatpgfmathloop%
		\ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
			\PackageError{PGF}{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\outerinvertedradius{%
		\pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
		\advance\pgf@x.5\pgflinewidth%
	}
	\savedmacro\dimensions{%
		\pgf@lib@sh@logicgates@dimensions@IEC{or}%
	}
	\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=and gate IEC]{center}
	\inheritanchor[from=and gate IEC]{mid}
	\inheritanchor[from=and gate IEC]{mid west}
	\inheritanchor[from=and gate IEC]{mid east}
	\inheritanchor[from=and gate IEC]{base}
	\inheritanchor[from=and gate IEC]{base west}
	\inheritanchor[from=and gate IEC]{base east}
	\inheritanchor[from=and gate IEC]{north}
	\inheritanchor[from=and gate IEC]{south}
	\inheritanchor[from=and gate IEC]{east}
	\inheritanchor[from=and gate IEC]{west}
	\inheritanchor[from=and gate IEC]{north east}
	\inheritanchor[from=and gate IEC]{north west}
	\inheritanchor[from=and gate IEC]{south east}
	\inheritanchor[from=and gate IEC]{south west}
	\inheritanchor[from=and gate IEC]{output}
	\inheritbackgroundpath[from=and gate IEC]
	\foregroundpath{\pgf@lib@sh@logicgates@IEC@foregroundpath{or}}
	\inheritanchorborder[from=and gate IEC]
}





% Shape nor gate IEC
%
\pgfdeclareshape{nor gate IEC}{
	\expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@nor gate IEC\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 IEC@input \pgfmathcounter}{%
				\expandafter\xdef\csname pgf@anchor@nor gate IEC@input \pgfmathcounter\endcsname{%
					\noexpand\pgf@lib@sh@logicgate@IEC@inputanchor{\pgfmathcounter}%
				}%
			}{}%
		\repeatpgfmathloop%
		\ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
			\PackageError{PGF}{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\outerinvertedradius{%
		\pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
		\advance\pgf@x.5\pgflinewidth%
	}
	\savedmacro\dimensions{%
		\pgf@lib@sh@logicgates@dimensions@IEC{nor}%
	}
	\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=and gate IEC]{center}
	\inheritanchor[from=and gate IEC]{mid}
	\inheritanchor[from=and gate IEC]{mid west}
	\inheritanchor[from=and gate IEC]{mid east}
	\inheritanchor[from=and gate IEC]{base}
	\inheritanchor[from=and gate IEC]{base west}
	\inheritanchor[from=and gate IEC]{base east}
	\inheritanchor[from=and gate IEC]{north}
	\inheritanchor[from=and gate IEC]{south}
	\inheritanchor[from=and gate IEC]{east}
	\inheritanchor[from=and gate IEC]{west}
	\inheritanchor[from=and gate IEC]{north east}
	\inheritanchor[from=and gate IEC]{north west}
	\inheritanchor[from=and gate IEC]{south east}
	\inheritanchor[from=and gate IEC]{south west}
	\inheritanchor[from=nand gate IEC]{output}%
	\inheritbackgroundpath[from=nand gate IEC]
	\foregroundpath{\pgf@lib@sh@logicgates@IEC@foregroundpath{nor}}
	\inheritanchorborder[from=and gate IEC]
}





% Shape xor gate IEC
%
\pgfdeclareshape{xor gate IEC}{
	\expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@xor gate IEC\endcsname{%
		\pgf@lib@sh@logicgate@parseinputs{2}% Maximum 1024 (!) inputs.
		%
		\pgfmathloop%
		\ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
		\else%
			\pgfutil@ifundefined{pgf@anchor@xor gate IEC@input \pgfmathcounter}{%
				\expandafter\xdef\csname pgf@anchor@xor gate IEC@input \pgfmathcounter\endcsname{%
					\noexpand\pgf@lib@sh@logicgate@IEC@inputanchor{\pgfmathcounter}%
				}%
			}{}%
		\repeatpgfmathloop%
		\ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
			\PackageError{PGF}{An xor 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\outerinvertedradius{%
		\pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
		\advance\pgf@x.5\pgflinewidth%
	}
	\savedmacro\dimensions{%
		\pgf@lib@sh@logicgates@dimensions@IEC{xor}%
	}
	\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=and gate IEC]{center}
	\inheritanchor[from=and gate IEC]{mid}
	\inheritanchor[from=and gate IEC]{mid west}
	\inheritanchor[from=and gate IEC]{mid east}
	\inheritanchor[from=and gate IEC]{base}
	\inheritanchor[from=and gate IEC]{base west}
	\inheritanchor[from=and gate IEC]{base east}
	\inheritanchor[from=and gate IEC]{north}
	\inheritanchor[from=and gate IEC]{south}
	\inheritanchor[from=and gate IEC]{east}
	\inheritanchor[from=and gate IEC]{west}
	\inheritanchor[from=and gate IEC]{north east}
	\inheritanchor[from=and gate IEC]{north west}
	\inheritanchor[from=and gate IEC]{south east}
	\inheritanchor[from=and gate IEC]{south west}
	\inheritanchor[from=and gate IEC]{output}
	\inheritbackgroundpath[from=and gate IEC]
	\foregroundpath{\pgf@lib@sh@logicgates@IEC@foregroundpath{xor}}
	\inheritanchorborder[from=and gate IEC]
}




% Shape xnor gate IEC
%

\pgfdeclareshape{xnor gate IEC}{
	\expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@xnor gate IEC\endcsname{%
		\pgf@lib@sh@logicgate@parseinputs{1024}% Maximum 1024 (!) inputs.
		%
		\pgfmathloop%
		\ifnum\pgfmathcounter>\pgf@lib@sh@logicgate@numinputs%
		\else%
			\pgfutil@ifundefined{pgf@anchor@xnor gate IEC@input \pgfmathcounter}{%
				\expandafter\xdef\csname pgf@anchor@xnor gate IEC@input \pgfmathcounter\endcsname{%
					\noexpand\pgf@lib@sh@logicgate@IEC@inputanchor{\pgfmathcounter}%
				}%
			}{}%
		\repeatpgfmathloop%
		\ifnum\pgf@lib@sh@logicgate@numinputs<2\relax%
			\PackageError{PGF}{A 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\outerinvertedradius{%
		\pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
		\advance\pgf@x.5\pgflinewidth%
	}
	\savedmacro\dimensions{%
		\pgf@lib@sh@logicgates@dimensions@IEC{xnor}%
	}
	\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=and gate IEC]{center}
	\inheritanchor[from=and gate IEC]{mid}
	\inheritanchor[from=and gate IEC]{mid west}
	\inheritanchor[from=and gate IEC]{mid east}
	\inheritanchor[from=and gate IEC]{base}
	\inheritanchor[from=and gate IEC]{base west}
	\inheritanchor[from=and gate IEC]{base east}
	\inheritanchor[from=and gate IEC]{north}
	\inheritanchor[from=and gate IEC]{south}
	\inheritanchor[from=and gate IEC]{east}
	\inheritanchor[from=and gate IEC]{west}
	\inheritanchor[from=and gate IEC]{north east}
	\inheritanchor[from=and gate IEC]{north west}
	\inheritanchor[from=and gate IEC]{south east}
	\inheritanchor[from=and gate IEC]{south west}
	\inheritanchor[from=nand gate IEC]{output}
	\inheritbackgroundpath[from=nand gate IEC]
	\foregroundpath{\pgf@lib@sh@logicgates@IEC@foregroundpath{xnor}}
	\inheritanchorborder[from=and gate IEC]
}




% Shape buffer gate IEC
%
\pgfdeclareshape{buffer gate IEC}{
	\expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@buffer gate IEC\endcsname{%
		\pgf@lib@sh@logicgate@parseinputs{1}% Maximum 1 input.
		%
		\expandafter\gdef\csname pgf@anchor@buffer gate IEC@input\endcsname{%
			\pgf@lib@sh@logicgate@IEC@inputanchor{1}%
		}%
		\ifnum\pgf@lib@sh@logicgate@numinputs=0\relax%
			\PackageError{PGF}{A buffer gate must have one 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@IEC{xor}%
	}
	\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=and gate IEC]{center}
	\inheritanchor[from=and gate IEC]{mid}
	\inheritanchor[from=and gate IEC]{mid west}
	\inheritanchor[from=and gate IEC]{mid east}
	\inheritanchor[from=and gate IEC]{base}
	\inheritanchor[from=and gate IEC]{base west}
	\inheritanchor[from=and gate IEC]{base east}
	\inheritanchor[from=and gate IEC]{north}
	\inheritanchor[from=and gate IEC]{south}
	\inheritanchor[from=and gate IEC]{east}
	\inheritanchor[from=and gate IEC]{west}
	\inheritanchor[from=and gate IEC]{north east}
	\inheritanchor[from=and gate IEC]{north west}
	\inheritanchor[from=and gate IEC]{south east}
	\inheritanchor[from=and gate IEC]{south west}
	\inheritanchor[from=and gate IEC]{output}
	\inheritbackgroundpath[from=and gate IEC]
	\foregroundpath{\pgf@lib@sh@logicgates@IEC@foregroundpath{buffer}}
	\inheritanchorborder[from=and gate IEC]
}





% Shape not gate IEC
%
\pgfdeclareshape{not gate IEC}{
	\expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@not gate IEC\endcsname{%
		\pgf@lib@sh@logicgate@parseinputs{1}%
		%
		\pgfutil@ifundefined{pgf@anchor@not gate IEC@input}{%
			\expandafter\gdef\csname pgf@anchor@not gate IEC@input\endcsname{%
					\pgf@lib@sh@logicgate@IEC@inputanchor{1}%
				}}{}%
		\ifnum\pgf@lib@sh@logicgate@numinputs=0\relax%
			\PackageError{PGF}{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\outerinvertedradius{%
		\pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/logic gate inverted radius}}%
		\advance\pgf@x.5\pgflinewidth%
	}
	\savedmacro\dimensions{%
		\pgf@lib@sh@logicgates@dimensions@IEC{not}%
	}
	\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=and gate IEC]{center}
	\inheritanchor[from=and gate IEC]{mid}
	\inheritanchor[from=and gate IEC]{mid west}
	\inheritanchor[from=and gate IEC]{mid east}
	\inheritanchor[from=and gate IEC]{base}
	\inheritanchor[from=and gate IEC]{base west}
	\inheritanchor[from=and gate IEC]{base east}
	\inheritanchor[from=and gate IEC]{north}
	\inheritanchor[from=and gate IEC]{south}
	\inheritanchor[from=and gate IEC]{east}
	\inheritanchor[from=and gate IEC]{west}
	\inheritanchor[from=and gate IEC]{north east}
	\inheritanchor[from=and gate IEC]{north west}
	\inheritanchor[from=and gate IEC]{south east}
	\inheritanchor[from=and gate IEC]{south west}
	\inheritanchor[from=nand gate IEC]{output}
	\inheritbackgroundpath[from=nand gate IEC]
	\foregroundpath{\pgf@lib@sh@logicgates@IEC@foregroundpath{not}}
	\inheritanchorborder[from=and gate IEC]
}

\endinput