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.
733 lines
24 KiB
733 lines
24 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}%
|
|
|
|
\pgfkeys{/pgf/.cd,
|
|
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},
|
|
}%
|
|
|
|
\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@x%
|
|
\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@y{\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%
|
|
\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@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%
|
|
\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@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%
|
|
\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\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%
|
|
\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\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%
|
|
\pgferror{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%
|
|
\pgferror{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%
|
|
\pgferror{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%
|
|
\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\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
|
|
|