나만의 맞춤형 화이트박스 디지털 회로 구성 요소 정의

나만의 맞춤형 화이트박스 디지털 회로 구성 요소 정의

Tikz에는 기본 또는 복잡한 유용한 디지털 회로 구성 요소가 많이 있습니다. 여기가 필요해요일부내 자신의 것, 반드시 편리한 것 중 하나도 아닙니다. 하지만 좀 더 편리한 예를 들어보겠습니다. 크기 비교기입니다.

나는 이것을 갖고 싶다크기 비교기내 작업을 위한 구성 요소의 신호 포트는 다음과 같이 정의됩니다.anchor s로 정의된 내 작업의 구성 요소입니다. 포트에 라벨을 붙이고 이름을 적는 상자를 만들 수 있지만 그건부족한!

내부에 무엇이 있는지도 보여줘야 합니다. 세부 사항은 게이트를 넘어서는 안 됩니다. 트랜지스터가 주변에 있는 것을 원하지 않지만 게이트는 필요합니다.

지금까지 제가 가지고 있는 것은 다음과 같습니다. 대부분은 다음과 같습니다.이 (유명한?) 데이터 플립플롭 예제:

\makeatletter

% Magnitude Comparator (magn comparator) shape
\pgfdeclareshape{magn comparator}
{
    % The 'minimum width' and 'minimum height' keys, not the content, determine
    % the size
    \savedanchor\northeast
    {%
        \pgfmathsetlength\pgf@x{\pgfshapeminwidth}%
        \pgfmathsetlength\pgf@y{\pgfshapeminheight}%
        \pgf@x=0.5\pgf@x
        \pgf@y=0.5\pgf@y
    }
    % This is redundant, but makes some things easier:
    \savedanchor\southwest
    {%
        \pgfmathsetlength\pgf@x{\pgfshapeminwidth}%
        \pgfmathsetlength\pgf@y{\pgfshapeminheight}%
        \pgf@x=-0.5\pgf@x
        \pgf@y=-0.5\pgf@y
    }
    % Inherit from rectangle
    \inheritanchorborder[from=rectangle]

    % Define same anchor a normal rectangle has
    \anchor{center}{\pgfpointorigin}
    \anchor{north}{\northeast \pgf@x=0pt}
    \anchor{east}{\northeast \pgf@y=0pt}
    \anchor{south}{\southwest \pgf@x=0pt}
    \anchor{west}{\southwest \pgf@y=0pt}
    \anchor{north east}{\northeast}
    \anchor{north west}{\northeast \pgf@x=-\pgf@x}
    \anchor{south west}{\southwest}
    \anchor{south east}{\southwest \pgf@x=-\pgf@x}
    \anchor{text}
    {
        \pgfpointorigin
        \advance\pgf@x by -.5\wd\pgfnodeparttextbox%
        \advance\pgf@y by -.5\ht\pgfnodeparttextbox%
        \advance\pgf@y by +.5\dp\pgfnodeparttextbox%
    }

    % Define anchors for input signal ports
    \anchor{input gt}
    {
        \pgf@process{\southwest}%
        \pgf@y=-.5\pgf@y%
    }
    \anchor{input eq}
    {
        \pgf@process{\southwest}%
        \pgf@y=0pt%
    }
    \anchor{input lt}
    {
        \pgf@process{\southwest}%
        \pgf@y=.5\pgf@y%
    }
    \anchor{input a}
    {
        \pgf@process{\northeast}%
        \pgf@x=-.3\pgf@x%
    }
    \anchor{input b}
    {
        \pgf@process{\northeast}%
        \pgf@x=.3\pgf@x%
    }

    % Define anchors for output signal ports
    \anchor{output gt}
    {
        \pgf@process{\northeast}%
        \pgf@y=.5\pgf@y%
    }
    \anchor{output eq}
    {
        \pgf@process{\northeast}%
        \pgf@y=0pt%
    }
    \anchor{output lt}
    {
        \pgf@process{\northeast}%
        \pgf@y=-.5\pgf@y%
    }

    % Draw the rectangle box and the port labels
    \backgroundpath
    {
        % Rectangle box
        \pgfpathrectanglecorners{\southwest}{\northeast}
        % \node [and gate] (kek) at (0, 0) {};
    }
}

% Define default style for this node
\tikzset
{
    every magn comparator node/.style =
    {
        draw,
        minimum width = 2cm,
        minimum height = 2cm,
        thick,
        inner sep = 1mm,
        outer sep = 0pt,
        cap = round
    }
}

\makeatother

이것은 내 기본 LaTeX 파일의 서문에 포함된 별도의 파일에 있습니다.

여기에는 게이트가 없으며 단지 상자를 그립니다. 나는 이 외부에서 수행하는 일반적인 방식으로 단순히 임의의 AND 게이트를 내려놓으려고 시도했지만 \pgfdeclareshape물론 작동하지 않았습니다. 나는 그 시도에 대해 언급했습니다.

기존 모양 위에 추가 모양을 정의할 수 있는 방법이 있어야 합니다. 그것은 무엇입니까?

편집하다:AND/OR/NOR/XOR/NAND 게이트와 유사하게 앵커로 쉽게 접근할 수 있는 포트와 배치할 수 있어야 하는 다음과 같은 것이 내 손에 있을 것으로 기대합니다.

여기에 이미지 설명을 입력하세요

상자 내부는 크기 비교기로 실제로 기능하지 않으며 단지 내가 기대하는 것의 더미 예일 뿐입니다.

답변1

사용 사례의 복잡성과 필요한 모양 수에 따라… 여기에서 시작합니다.

대답은 다음과 같이 구성됩니다.

  • ( 앵커 가 있는 빌린 모양 임 ) rectangle ee정의를 차용한 모양 선언입니다 .circuits.eerectangle.input.output

    저도 링크된 곳에서 빌려왔습니다예제모양 정의 내부의 텍스트입니다. 앵커는 다음과 같이 설정됩니다 (이것은 직선을 따르는 키 또는 의 표기법 내부 요소 \pgfpointlineattime와 유사합니다 ).poscalc($(<p1>)!<factor>!(<p2>)$)

    직사각형의 경계를 따라 여러 가지 앵커가 필요한 모양이 더 많이 있는 경우 모양 선언 내부의 루프와 페이 키를 사용하여 직렬화할 수 있습니다. 이는 텍스트에도 적용됩니다.

  • 이제 앵커와 텍스트가 포함된 모양이 있으므로 이를 사용할 수 있습니다. 적절한 회로 모양을 위해 기호를 로 선언 circuit declare symbol하고 로 설정합니다 set <symbol name> graphic.

    키는 (후드 아래의 TeX 치수) 와 관련하여 circuit symbol size설정됩니다 . 이를 통해 다른 회로 기호와 관련하여 확장 가능합니다. 경로를 따라 회전하려면 ' 키 가 필요합니다 .minimum widthminimum heightcircuit symbol unittransform shapecircuitsto

  • path picture제안된 코드를 사용하는 A내 또 다른 대답. 노드와 함께 회전하고 크기를 조정하는 로컬 좌표계를 설정하려면: 좌표는 (0, 0)노드의 중심에 있습니다. 그만큼엑스east벡터는 (= output) 를 가리키고 ,와이북쪽 앵커에 대한 벡터입니다. 이는 노드의 수평 치수의 절반을 (left:.2)사용하는 것과 같은 좌표 지정에 중요합니다..2그리고적용된 회전.

    내부의 회로 기호는 path picture옵션 gray(선과 마찬가지로)을 가져오고 circuit symbol unit=.1cm기호를 적절한 크기로 축소합니다. 올바른 크기를 얻으려면 이 값을 가지고 놀아야 할 수도 있습니다. 또한 이를 치수 \pgf@xx및 를 사용하여 앞서 언급한 로컬 좌표계에 종속되게 만드는 것도 가능할 수 있습니다 \pgf@yy.

    not gate분명히 앵커와 연결 레이아웃은 동일하지만 게이트가 다른 여러 기호가 필요한 경우 이 경우에는 , nand gate및 로 설정된 세 가지 값 키에 따라 모양 정의를 가변적으로 만들 수 있습니다 nor gate.

나는 내 것을 사용했다paths.ortho도서관내부 연결의 경우 path picture. 분명히 이러한 선을 연결하는 데는 어떤 방법이든 사용할 수 있습니다.

암호

\documentclass[tikz]{standalone}
\usetikzlibrary{circuits.ee,circuits.logic.US,paths.ortho}
\makeatletter
\pgfdeclareshape{my complicated box}{%
  \inheritsavedanchors[from=rectangle ee]
  \inheritanchor[from=rectangle ee]{center}
  \inheritanchor[from=rectangle ee]{north}
  \inheritanchor[from=rectangle ee]{south}
  \inheritanchor[from=rectangle ee]{east}
  \inheritanchor[from=rectangle ee]{west}
  \inheritanchor[from=rectangle ee]{north east}
  \inheritanchor[from=rectangle ee]{north west}
  \inheritanchor[from=rectangle ee]{south east}
  \inheritanchor[from=rectangle ee]{south west}
  \inheritanchor[from=rectangle ee]{input}
  \inheritanchor[from=rectangle ee]{output}
  \inheritanchorborder[from=rectangle ee]
  \inheritbackgroundpath[from=rectangle ee]
  \anchor{eq in} {\pgf@sh@reanchor{\pgf@sm@shape@name}{input}}
  \anchor{eq out}{\pgf@sh@reanchor{\pgf@sm@shape@name}{output}}
  \anchor{lt in}{%
    \pgfpointlineattime{.2}{\southwest}
    {\southwest\pgf@xc\pgf@x\northeast\pgf@x\pgf@xc}}
  \anchor{gt in}{%
    \pgfpointlineattime{.8}{\southwest}
    {\southwest\pgf@xc\pgf@x\northeast\pgf@x\pgf@xc}}
  \anchor{gt out}{%
    \pgfpointlineattime{.3}{\northeast}
    {\southwest\pgf@yc\pgf@y\northeast\pgf@y\pgf@yc}}
  \anchor{lt out}{%
    \pgfpointlineattime{.7}{\northeast}
    {\southwest\pgf@yc\pgf@y\northeast\pgf@y\pgf@yc}}
  \anchor{a}{%
    \pgfpointlineattime{.4}
      {\southwest\pgf@xc\pgf@x\northeast\pgf@x\pgf@xc}{\northeast}}
  \anchor{b}{%
    \pgfpointlineattime{.6}
      {\southwest\pgf@xc\pgf@x\northeast\pgf@x\pgf@xc}{\northeast}}
  \beforebackgroundpath{%
    \begingroup
      \tikzset{my complicated box/labels/.try}\tikz@textfont
      \pgf@sh@reanchor{\pgf@sm@shape@name}{eq in}
      \pgftext[at=\pgfqpoint{\pgf@x}{\pgf@y},left,%
                x=\pgfkeysvalueof{/pgf/inner xsep}]{$\mathrm{eq}_{\mathrm{in}}$}
      \pgf@sh@reanchor{\pgf@sm@shape@name}{eq out}
      \pgftext[at=\pgfqpoint{\pgf@x}{\pgf@y},right,%
                x=-\pgfkeysvalueof{/pgf/inner xsep}]{$\mathrm{eq}_{\mathrm{out}}$}
      \pgf@sh@reanchor{\pgf@sm@shape@name}{gt in}
      \pgftext[at=\pgfqpoint{\pgf@x}{\pgf@y},left,%
                x=\pgfkeysvalueof{/pgf/inner xsep}]{$\mathrm{gt}_{\mathrm{in}}$}
      \pgf@sh@reanchor{\pgf@sm@shape@name}{gt out}
      \pgftext[at=\pgfqpoint{\pgf@x}{\pgf@y},right,%
                x=-\pgfkeysvalueof{/pgf/inner xsep}]{$\mathrm{gt}_{\mathrm{out}}$}
      \pgf@sh@reanchor{\pgf@sm@shape@name}{lt in}
      \pgftext[at=\pgfqpoint{\pgf@x}{\pgf@y},left,%
                x=\pgfkeysvalueof{/pgf/inner xsep}]{$\mathrm{lt}_{\mathrm{in}}$}
      \pgf@sh@reanchor{\pgf@sm@shape@name}{lt out}
      \pgftext[at=\pgfqpoint{\pgf@x}{\pgf@y},right,%
                x=-\pgfkeysvalueof{/pgf/inner xsep}]{$\mathrm{lt}_{\mathrm{out}}$}
      \pgf@sh@reanchor{\pgf@sm@shape@name}{a}
      \pgftext[at=\pgfqpoint{\pgf@x}{\pgf@y},top,%
                y=-\pgfkeysvalueof{/pgf/inner ysep}]{a\vphantom{b}}
      \pgf@sh@reanchor{\pgf@sm@shape@name}{b}
      \pgftext[at=\pgfqpoint{\pgf@x}{\pgf@y},top,%
                y=-\pgfkeysvalueof{/pgf/inner ysep}]{b}
    \endgroup}
}
\makeatother
\tikzset{my complicated box/labels/.style={font=\footnotesize, inner sep=.1667em}}
\tikzset{
  circuit declare symbol=my complicated symbol,
  set my complicated symbol graphic={
    draw, shape=my complicated box, circuit symbol size=width 10 height 8,
    transform shape,
    path picture={
      \expandafter\let\expandafter\tfn\csname tikz@fig@name\endcsname
      \pgftransformshift{\pgfpointanchor{\tfn}{center}}%
      \pgfsetxvec{\pgfpointdiff{\pgfpointanchor{\tfn}{center}}
                 {\pgfpointanchor{\tfn}{east}}}%
      \pgfsetyvec{\pgfpointdiff{\pgfpointanchor{\tfn}{center}}
                 {\pgfpointanchor{\tfn}{north}}}
      \tikzset{every circuit symbol/.append style={circuit symbol unit=.1cm, gray}}
      \path[thin, draw=gray]
        (\tfn.eq in) to[not gate=near end] (\tfn.eq out)
        (\tfn.lt out) to ++ (left:.2)
          node[anchor=output, logic gate inputs=nn, nand gate] (\tfn-nand) {}
        (\tfn-nand.input 2) to[-|-=.6] (\tfn.lt in)
        (\tfn-nand.input 1) to[-|] (\tfn.a)
        (\tfn.gt out) to ++ (left:.2)
          node[anchor=output, logic gate inputs=nn, nor gate] (\tfn-nor) {}
        (\tfn-nor.input 2) to[-|-=.6] (\tfn.gt in)
        (\tfn-nor.input 1) to[-|] (\tfn.b);
    }},
}
\begin{document}
\begin{tikzpicture}[circuit logic US]
\draw (0,0) to[my complicated symbol] ++ (30:4);
\end{tikzpicture}
\end{document}

산출

여기에 이미지 설명을 입력하세요

답변2

.picspic-anchors포지셔닝에 사용하기 어렵습니다 (TiKZ 사진 고정하기) 그러나 둘 사이의 링크를 그리기 위한 참조 지점 역할을 합니다.

\documentclass[tikz,border=2mm]{standalone}

\usetikzlibrary{positioning,circuits.logic.US, fit}

\tikzset{
    mycircuit/.pic={
        \begin{scope}[circuit logic US]
        \node[gray, thick, draw, nor gate] (-gt) at (2,0.75) {};
        \node[gray, thick, draw, not gate] (-eq) at (2,0) {};
        \node[gray, thick, draw, nand gate] (-lt) at (2,-0.75) {};

        \draw[gray] (-gt.output)--++(3mm,0) 
             coordinate[label={[black]left:$\mathrm{gt}_\mathrm{out}$}] (-gtout);

        \draw[gray] (-eq.output)--(-eq.output-|-gtout) 
             coordinate[label={[black]left:$\mathrm{eq}_\mathrm{out}$}] (-eqout);

        \draw[gray] (-lt.output)--(-lt.output-|-gtout) 
             coordinate[label={[black]left:$\mathrm{lt}_\mathrm{out}$}] (-eqout);

        \draw[gray] (-gt.input 1)-|++(-3mm,.5cm) 
             coordinate[label={[black]below:$\mathrm{b}$}] (-b);

        \draw[gray] (-lt.input 1)-|([xshift=-6mm]-b.center) 
             coordinate[label={[black]below:$\mathrm{a}$}] (-a);

        \draw[gray] (-eq.input)--++(-2cm,0) 
             coordinate[label={[black]right:$\mathrm{eq}_\mathrm{in}$}] (-eqin);

        \draw[gray] (-gt.input 2)--++(-1.2cm,0) |- ([yshift=1cm]-eqin.center)  
             coordinate[label={[black]right:$\mathrm{gt}_\mathrm{in}$}] (-gtin);

        \draw[gray] (-lt.input 2)--++(-1.2cm,0) |- ([yshift=-1cm]-eqin.center)  
             coordinate[label={[black]right:$\mathrm{lt}_\mathrm{in}$}] (-ltin);

        \node[draw, fit={(-ltin) (-b) ([yshift=-.5cm]-lt.input 2) (-gtout)}, 
              inner sep=0pt] (-box) {};
        \end{scope}
    }}

\begin{document}
\begin{tikzpicture}

\pic (a) at (0,0) {mycircuit};

\pic (b) at (5,1) {mycircuit};

\draw (a-gtout) -- (b-gtin);
\draw ([yshift=2cm]a-a) coordinate (aux)--(a-a);
\draw ([yshift=-5mm]aux)-|(b-a);
\end{tikzpicture}
\end{document}

여기에 이미지 설명을 입력하세요

관련 정보