Crear una forma de nodo personalizada con un número variable de anclajes

Crear una forma de nodo personalizada con un número variable de anclajes

Con el fin de entrenarme en PGF, quiero crear una forma de nodo que tenga múltiples puertos con un interruptor de selección como se muestra a continuación.

ingrese la descripción de la imagen aquí

Este es mi intento de crear este nodo para una cantidad particular de anclajes (3 entradas + 1 salida) e inicialmente es satisfactorio.

\documentclass[border=5pt]{standalone}
\usepackage{blindtext}
\usepackage{calc} 
\usepackage{ifthen}
\usepackage{tikz}
\usepackage{lipsum}
    \usetikzlibrary{calc,shapes,arrows,positioning,patterns,fit,shapes.arrows, fadings,arrows.meta}
    \usetikzlibrary{decorations.text}
        \usetikzlibrary{decorations.pathmorphing,calc,shadows.blur,shadings, , backgrounds}
        \usepackage{circuitikz}

        \pgfdeclarelayer{background layer}
        \pgfdeclarelayer{foreground layer}
        \pgfsetlayers{background,background layer,main,foreground layer}

\makeatletter
\pgfkeys{/tikz/ilength/.initial = 2cm}
\pgfkeys{/tikz/olength/.initial = 2cm}
\pgfkeys{/tikz/hspace/.initial = 1.5cm}
\pgfkeys{/tikz/port length ratio/.initial = 0.2}
\pgfkeys{/tikz/output len to output port ratio/.initial = 0.6}
\pgfkeys{/tikz/select/.initial = 1} %for multiswitch control
\newlength\portlen
\pgfdeclareshape{killer}{
    \anchor{center}{\pgfpointorigin}
    \anchor{middle}{\pgfpointorigin}
    \anchor{text}{\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
    %-------------------
    %----------------------
    \savedanchor\kcenter{\pgfpointorigin}
    \savedanchor\knorthwest{\pgfpoint{-0.5*\pgfkeysvalueof{/tikz/hspace}}{0.5*\pgfkeysvalueof{/tikz/ilength}}}%
    \savedanchor\ksouthwest{\pgfpoint{-0.5*\pgfkeysvalueof{/tikz/hspace}}{-0.5*\pgfkeysvalueof{/tikz/ilength}}}%
    \savedanchor\knortheast{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}}{0.5*\pgfkeysvalueof{/tikz/olength}}}%
    \savedanchor\ksoutheast{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}}{-0.5*\pgfkeysvalueof{/tikz/olength}}}%
    \anchor{north west}{\knorthwest}
    \anchor{south west}{\ksouthwest}    
    \anchor{north east}{\knortheast}
    \anchor{south east}{\ksoutheast}
    \savedanchor\knorth{\pgfpoint{0cm}{0.25*\pgfkeysvalueof{/tikz/ilength}+0.25*\pgfkeysvalueof{/tikz/olength}}}%
    \savedanchor\ksouth{\pgfpoint{0cm}{-0.25*\pgfkeysvalueof{/tikz/ilength}-0.25*\pgfkeysvalueof{/tikz/olength}}}%
    \savedanchor\keast{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}}{0cm}}%
    \savedanchor\kwest{\pgfpoint{-0.5*\pgfkeysvalueof{/tikz/hspace}}{0cm}}%
    \anchor{north}{\knorth}
    \anchor{north}{\knorth}
    \anchor{east}{\keast}
    \anchor{west}{\kwest}
    
    %--------------------------
    
    \savedanchor\porti{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}}{
        0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio} - 0*0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio}}
        }%
    \savedanchor\portii{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}}{
        0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio} - 1*0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio}}
        }%
    \savedanchor\portiii{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}}{
        0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio} - 2*0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio}}
        }%

    \savedanchor\inp{\pgfpoint{-0.5*\pgfkeysvalueof{/tikz/hspace}}{0cm}
        }%
    \anchor{port 1}{\porti}
    \anchor{port 2}{\portii}
    \anchor{port 3}{\portiii}
    \anchor{input}{\inp}
\backgroundpath{%
        %
        \pgfpathmoveto{\knorthwest}%
        \pgfpathlineto{\ksouthwest}%
        \pgfpathlineto{\ksoutheast}%
        \pgfpathlineto{\knortheast}%
        \pgfpathclose%
        %----------------
    }
\foregroundpath{
        \pgfmathsetlength{\portlen}{\pgfkeysvalueof{/tikz/hspace}*0.5*\pgfkeysvalueof{/tikz/port length ratio}}
        \pgfpathmoveto{\inp}
        \pgfpathlineto{\inp \advance \pgf@x by \portlen}
        \pgfsetarrows{{Stealth[width=1.5mm]}-}
        \pgfpathlineto{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}-\portlen}{
            0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio} - (\pgfkeysvalueof{/tikz/select}-1)*0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio}
        }}
        \pgfusepath{stroke}
        \pgfsetarrows{-}
        \pgfpathmoveto{\porti}
        \pgfpathlineto{\porti \advance \pgf@x by -\portlen}
        \pgfpathmoveto{\portii}
        \pgfpathlineto{\portii \advance \pgf@x by -\portlen}
        \pgfpathmoveto{\portiii}
        \pgfpathlineto{\portiii \advance \pgf@x by -\portlen}
}}    

\makeatother
\begin{document}
\begin{tikzpicture}
    \node [killer,draw=blue,scale=1, port length ratio=0.4,ilength=1.2cm] (A) {};
    \node [killer,draw=blue,fill=green,scale=1,select=3, port length ratio=0.4, left = of A] (B) {};
\end{tikzpicture}
\end{document}

Sin embargo, no pude dibujar el borde de anclaje para este nodo a pesar de tomarme horas para leer el manual pgf para usar el comando \anchorborder{}, tal vez no pude entender cómo funciona. De todos modos, evitando mi problema con el borde de anclaje, mi siguiente paso es controlar la cantidad de puertos de entrada (ancla) mediante una clave \pgfkeys{/tikz/number of input ports/.initial = 4}como esa en las puertas lógicas. Sé que a menudo es necesario usar comandos como \csname ..... \endcsnamey \expandafterque me resultan confusos y además ya he intentado usarlos pero fue en vano.

Finalmente, cualquier sugerencia adicional para modificar mi código es bienvenida, excepto el uso de nodos predefinidos.

información relacionada