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.
2525 lines
84 KiB
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]%
|
|
}%
|
|
|