% BEGIN_FOLD Circuit layout
\ifnum\yquant@compat<2 %
   \pgfqkeys{/yquant}{%
      register/minimum height/.code=%
         {\dimdef\yquant@config@register@minimum@height{.5\dimexpr#1\relax}%
          \let\yquant@config@register@minimum@depth=\yquant@config@register@minimum@height}%
   }
\else%
   \pgfqkeys{/yquant}{%
      register/minimum height/.code=%
         {\dimdef\yquant@config@register@minimum@height{#1}},%
      register/minimum depth/.code=%
         {\dimdef\yquant@config@register@minimum@depth{#1}},%
      register/minimum left/.forward to=/yquant/register/minimum height,%
      register/minimum right/.forward to=/yquant/register/minimum depth,%
      register/minimum before/.forward to=/yquant/register/minimum height,%
      register/minimum after/.forward to=/yquant/register/minimum after%
   }
\fi
\def\yquant@config@draw@ensurelayers@addwires#1,main,#2\yquant@stop{%
   \ifstrempty{#2}{%
      % main was the last item in the list, so we needed to add the comma
      \edef\pgf@layerlist{\@gobble#1,wires,main}%
   }{%
      % there were more items in the list, so we have a spurious comma in #2
      \expandafter\yquant@config@draw@ensurelayers@addwires@%
         \expandafter,\pgf@layerlist\yquant@stop%
   }%
}
\def\yquant@config@draw@ensurelayers@addwires@#1,main,#2\yquant@stop{%
   \edef\pgf@layerlist{\@gobble#1,wires,main,#2}%
}
\def\yquant@config@draw@ensurelayers@haswires#1,wires,#2\yquant@stop{%
   \ifstrempty{#2}{%
      % wires not present yet, take action
      \expandafter\yquant@config@draw@ensurelayers@addwires%
         \expandafter,\pgf@layerlist,\yquant@stop%
   }\relax%
}
\def\yquant@config@draw@ensurelayers@addbehindwires#1,wires,#2\yquant@stop{%
   \ifstrempty{#2}{%
      % wires was the last item in the list, so we needed to add the comma (should never happen)
      \edef\pgf@layerlist{\@gobble#1,behindwires,wires}%
      \PackageWarning{yquant.sty}{The wires layer was set on top of the main layer - expect undesirable outcomes.}%
   }{%
      % there were more items in the list, so we have a spurious comma in #2
      \expandafter\yquant@config@draw@ensurelayers@addbehindwires@%
         \expandafter,\pgf@layerlist\yquant@stop%
   }%
}
\def\yquant@config@draw@ensurelayers@addbehindwires@#1,wires,#2\yquant@stop{%
   \edef\pgf@layerlist{\@gobble#1,behindwires,wires,#2}%
}
\def\yquant@config@draw@ensurelayers@hasbehindwires#1,behindwires,#2\yquant@stop{%
   \ifstrempty{#2}{%
      % wires not present yet, take action
      \expandafter\yquant@config@draw@ensurelayers@addbehindwires%
         \expandafter,\pgf@layerlist,\yquant@stop%
   }\relax%
}
\def\yquant@config@draw@ensurelayers{%
   \expandafter\yquant@config@draw@ensurelayers@haswires%
      \expandafter,\pgf@layerlist,wires,\yquant@stop%
   \expandafter\yquant@config@draw@ensurelayers@hasbehindwires%
      \expandafter,\pgf@layerlist,behindwires,\yquant@stop%
   \ifyquant@config@draw@quality%
      % maybe the option was set outside of a tikzpicture, then we need to keep this
      \global\let\endpgfpicture=\yquant@old@endpgfpicture%
      \global\yquant@config@requirelayersfalse%
   \fi%
}

\pgfqkeys{/yquant}{%
   register/separation/.code=%
      {\dimdef\yquant@config@register@sep{#1}},%
   operator/minimum width/.code=%
      {\dimdef\yquant@config@operator@minimum@width{#1}},%
   operator/minimum extent/.forward to=/yquant/operator/minimum width,%
   operator/separation/.code=%
      {\dimdef\yquant@config@operator@sep{#1}},%
   operator/multi warning/.is if=%
      yquant@config@operator@multi@warn,%
   drawing mode/.is choice,%
   drawing mode/quality/.code=%
      {\yquant@config@draw@qualitytrue%
       \pgfkeysalso{/yquant/default background=none}%
       \unless\ifpgfpicture%
          % we do not reset the special layer injection (there may be multiple yquant environments, and only one of them had the "size" drawing mode; then, we still need the layers), unless this is actually set outside of a tikzpicture
          \ifdefined\yquant@old@endpgfpicture% only if we changed before
            \global\let\endpgfpicture=\yquant@old@endpgfpicture%
            \global\yquant@config@requirelayersfalse%
          \fi%
       \fi},%
   drawing mode/size/.code=%
      {\yquant@config@draw@qualityfalse%
       \pgfkeysalso{/yquant/default background=white}%
       \unless\ifyquant@config@requirelayers%
          \global\let\yquant@old@endpgfpicture=\endpgfpicture%
          \gpreto\endpgfpicture\yquant@config@draw@ensurelayers%
       \fi%
       \global\yquant@config@requirelayerstrue},%
   default background/.initial=%
      {none},%
   default fill/.style={%
      fill/.expanded=\pgfkeysvalueof{/yquant/default background}}
}%
% END_FOLD
% BEGIN_FOLD Register creation
\pgfqkeys{/yquant}{%
   register/default name/.store in=%
      \yquant@config@register@default@name,%
   register/default lazy name/.store in=%
      \yquant@config@register@default@lazyname%
}
\ifnum\yquant@compat<2 %
   \pgfqkeys{/yquant}{%
      every label/.style=%
         {shape=yquant-init, anchor=center,%
          align/.expanded=\ifyquanthorz{right}{center}, outer timesep=2pt},%
      every multi label/.style=%
         {draw, decoration/.expanded={gapped brace, raise=2pt, \ifyquanthorz{mirror}{}}, decorate}%
   }
\else
   \pgfqkeys{/yquant}{%
      every label/.style=%
         {shape=yquant-init, anchor=center,%
          align/.expanded=\ifyquanthorz{right}{center}, outer timesep=2pt,%
          /yquant/operator/if multi={draw, decoration/.expanded={gapped brace, raise=2pt, \ifyquanthorz{mirror}{}}, decorate}}%
    }
\fi
\pgfqkeys{/yquant}{
   every initial label/.style=%
      {anchor/.expanded=\ifyquanthorz{east}{south}, /yquant/internal/autorotate init},%
   every qubit label/.style=%
      {},%
   every cbit label/.style=%
      {},%
   every qubits label/.style=%
      {}%
}
\ifnum\yquant@compat<2 %
   \pgfqkeys{/yquant}{%
      every input label/.style=%
         {}%
   }%
\fi%
% END_FOLD
% BEGIN_FOLD Register outputs
\ifnum\yquant@compat<2 %
   \pgfqkeys{/yquant}{%
      every output/.style=%
         {shape=yquant-output, anchor/.expanded=\ifyquanthorz{west}{north},%
          align/.expanded=\ifyquanthorz{left}{center}, outer timesep=2pt,%
          /yquant/internal/autorotate output},%
      every multi output/.style=%
         {draw, decoration/.expanded={gapped brace, raise=2pt, \ifyquanthorz{}{mirror}}, decorate}%
   }
\else
   \pgfqkeys{/yquant}{%
      every output/.style=%
         {shape=yquant-output, anchor/.expanded=\ifyquanthorz{west}{north},%
          align/.expanded=\ifyquanthorz{left}{center}, outer timesep=2pt,%
          /yquant/operator/if multi={draw, decoration/.expanded={gapped brace, raise=2pt, \ifyquanthorz{}{mirror}}, decorate},%
          /yquant/internal/autorotate output}%
   }
\fi
\pgfqkeys{/yquant}{%
   every qubit output/.style=%
      {},%
   every cbit output/.style=%
      {},%
   every qubits output/.style=%
      {}%
}
% END_FOLD
% BEGIN_FOLD General styling
\pgfqkeys{/yquant}{%
   every circuit/.style={%
      every node/.prefix style={transform shape}
   }%
}
\@ifpackagelater{pgf}{2020/09/31}\relax{
   \pgfkeys{/yquant/every circuit/.append style={%
      every label/.prefix style={transform shape=false}%
   }}
}
\pgfqkeys{/yquant}{%
   every wire/.style=%
      {draw},%
   every qubit wire/.style=%
      {},%
   every cbit wire/.style=%
      {},%
   every qubits wire/.style=%
      {},%
   every control line/.style=%
      {draw},%
   every control/.style=%
      {shape=yquant-circle, anchor=center, radius=.5mm},%
   every positive control/.style=%
      {fill=black},%
   every negative control/.style=%
      {draw, /yquant/default fill},%
   every operator/.style=%
      {anchor=center},%
   every multi line/.style=%
      {draw, decoration={snake, amplitude=.25mm, segment length=5pt}, decorate},%
   this operator/.style=%
      {},%
   this control/.style=%
      {},%
   operator style/.style=%
      {/yquant/this operator/.append style={#1}},%
   control style/.style=%
      {/yquant/every control line/.append style={#1},%
       /yquant/this control/.append style={#1}},%
   style/.style=%
      {/yquant/this operator/.append style={#1},%
       /yquant/every control line/.append style={#1},%
       /yquant/this control/.append style={#1}},%
   operator/multi as single/.code=%
      {\ifnum\yquant@draw@@currentcontroltype=0 %
          \pgfkeysalso{/yquant/every multi line/.style=/yquant/every control line}%
       \else%
          % #21: we don't need to double-draw the line in the same style as a control line if controls are present - then, the control line will already encompass all the registers
          \pgfkeysalso{/yquant/every multi line/.style={draw=none}}%
       \fi%
      },%
   operator/if multi/.code=%
      {\ifyquant@config@operator@multi\pgfkeysalso{#1}\fi},%
   circuit/seamless/.is if=yquant@config@circuit@seamless,%
   circuit/orientation/.is choice,%
   circuit/orientation/horizontal/.code={%
      \ifyquant@config@circuitsetup%
         \pgfkeysalso{/yquant/internal/autorotate init/.style={},%
            /yquant/internal/autorotate output/.style={}}%
         \yquant@config@circuit@orientation@horizontal%
      \else%
         \PackageError{yquant.sty}{`circuit/orientation' can only be modified in the environment options or globally.}{Don't modify this within a circuit.}%
      \fi%
   },%
   circuit/orientation/vertical/.code={%
      \ifyquant@config@circuitsetup%
         \yquant@config@circuit@orientation@vertical%
      \else%
         \PackageError{yquant.sty}{`circuit/orientation' can only be modified in the environment options or globally.}{Don't modify this within a circuit.}%
      \fi%
   },%
   horizontal/.forward to=/yquant/circuit/orientation/horizontal,%
   vertical/.code={%
      \pgfkeysalso{/yquant/circuit/orientation/vertical}%
      \unless\ifdim#1 pt=0pt %
         \ifdefined\adjustbox%
            \pgfkeysalso{%
               /yquant/internal/autorotate init/.style={%
                  /tikz/execute at begin node={\adjustbox{rotate=#1}}%
               }, /yquant/internal/autorotate output/.style={%
                  /tikz/execute at begin node={\adjustbox{rotate=-#1}}%
               }%
            }%
         \else%
            \PackageWarning{yquant.sty}{In order to use the automatic rotation of initial labels for vertical circuits, you need to load the `adjustbox' package.}%
         \fi%
      \fi%
   },%
   vertical/.default=0,%
   every post measurement control/.is choice,
   every post measurement control/indirect/.code={%
      \undef\yquant@lang@attr@directcontrol%
   },%
   every post measurement control/direct/.code={%
      \let\yquant@lang@attr@directcontrol=\relax%
   },%
}
\def\yquant@config@only@multi#1#2#3#4\yquant@sep{%
   \yquant@config@only{#1}{#2}{#3}%
   \ifstrempty{#4}\relax{%
      \yquant@config@only@multi{#1}#4\yquant@sep%
   }%
}
\protected\def\yquant@config@only#1#2#3{%
   \begingroup%
      \let\yquant@config@onlyloop@idxs=\empty%
      \forcsvlist\yquant@config@onlyloop{#2}%
      \let\ifdoit=\iffalse%
      \ifdefined\yquant@config@onlyloop@allupto%
         \unless\ifnum\idx>\yquant@config@onlyloop@allupto\space%
            \csletcs{ifdoit}{iftrue}%
         \fi%
      \fi%
      \ifdefined\yquant@config@onlyloop@allfrom%
         \unless\ifnum\idx<\yquant@config@onlyloop@allfrom\space%
            \csletcs{ifdoit}{iftrue}%
         \fi%
      \fi%
      \unless\ifdoit%
         \xifinlist\idx\yquant@config@onlyloop@idxs{%
            \csletcs{ifdoit}{iftrue}%
         }\relax%
      \fi%
      \expandafter%
   \endgroup%
   #1\ifdoit
      \pgfkeysalso{#3}%
   \fi%
}
\protected\def\yquant@config@onlyloop#1{%
   \yquant@config@onlyloop@checkrange#1-\yquant@sep%
}
\protected\def\yquant@config@onlyloop@checkrange#1-#2\yquant@sep{%
   \ifstrempty{#2}{%
      \listeadd\yquant@config@onlyloop@idxs{#1}%
   }{%
      \yquant@config@onlyloop@range#1-#2\yquant@sep%
   }%
}
\protected\def\yquant@config@onlyloop@range#1-#2-\yquant@sep{%
   \ifblank{#1}{%
      \ifblank{#2}{%
         % pretty meaningless, but let's allow for it
         \def\yquant@config@onlyloop@allfrom{0}%
      }{%
         \ifdefined\yquant@config@onlyloop@allupto%
            \ifnum#2>\yquant@config@onlyloop@allupto\space%
               \numdef\yquant@config@onlyloop@allupto{#2}%
            \fi%
         \else%
            \numdef\yquant@config@onlyloop@allupto{#2}%
         \fi%
      }
   }{%
      \ifblank{#2}{%
         \ifdefined\yquant@config@onlyloop@allfrom%
            \ifnum#1<\yquant@config@onlyloop@allfrom\space%
               \numdef\yquant@config@onlyloop@allfrom{#1}%
            \fi%
         \else%
            \numdef\yquant@config@onlyloop@allfrom{#1}%
         \fi%
      }{%
         \yquant@for \i := #1 to #2 {%
            \listeadd\yquant@config@onlyloop@idxs\i%
         }%
      }%
   }%
}
% END_FOLD
% BEGIN_FOLD Styles for operators
\ifnum\yquant@compat<2 %
   \pgfqkeys{/yquant}{%
      operators/every barrier/.style=%
         {shape=yquant-line, dashed, draw}%
   }
\else
   \pgfqkeys{/yquant}{%
      operators/every barrier/.style=%
         {shape=yquant-line, dashed, draw, shorten <= -1mm, shorten >= -1mm}
   }
\fi
\pgfqkeys{/yquant}{%
   operators/every text/.style=%
      {shape=yquant-rectangle, align=center, inner timesep=1mm, time radius=2mm, space radius=2.47mm, /yquant/default fill}%
}
\ifnum\yquant@compat<3 %
   \pgfqkeys{/yquant}{%
      % we did not have this style before 0.6, but for the ease of implementation, we just change the direction of inheritance---users of earlier compat versions will never use the style, so this is fully transparent
      operators/every rectangular box/.style=%
         {/yquant/operators/every box},%
      operators/every box/.style=%
         {shape=yquant-rectangle, draw, align=center, inner timesep=1mm, time radius=2mm, space radius=2.47mm, /yquant/default fill}%
   }
\else
   \pgfqkeys{/yquant}{%
      operators/every rectangular box/.style=%
         {shape=yquant-rectangle, draw, align=center, inner timesep=1mm, time radius=2mm, space radius=2.47mm, /yquant/default fill},%
      operators/every box/.style=%
         {/yquant/operators/every rectangular box}%
   }
\fi
\ifnum\yquant@compat<2 %
   \pgfqkeys{/yquant}{%
      operators/every custom gate/.style=%
         {/yquant/operators/subcircuit/frameless, /yquant/register/default name=}%
   }
\else
   \pgfqkeys{/yquant}{%
      operators/every custom gate/.style=%
         {/yquant/operators/subcircuit/seamless}%
   }
\fi
\pgfqkeys{/yquant}{%
   operators/every dmeter/.style=%
      {shape=yquant-dmeter, time radius=2mm, space radius=2mm, draw, /yquant/default fill},
   % every h is implicitly defined during gate declaration
   operators/every inspect/.style=%
      {shape=yquant-output, align/.expanded=\ifyquanthorz{left}{center},
       outer timesep=.3333em, space radius=2.47mm, /yquant/default fill,%
       /yquant/operator/if multi={draw, decoration/.expanded={gapped brace, raise=2pt, \ifyquanthorz{}{mirror}}, decorate}},%
   operators/every measure/.style=%
      {shape=yquant-measure, x radius=4mm, y radius=2.5mm, draw, /yquant/default fill},%
   operators/every measure meter/.style=%
      {draw, -{Latex[length=2.5pt]}},%
   operators/every not/.style=%
      {shape=yquant-oplus, radius=1.3mm, draw, /yquant/default fill},%
   operators/every pauli/.style=%
      {/yquant/operators/every rectangular box},%
   operators/every phase/.style=%
      {shape=yquant-circle, radius=.5mm, fill},%
   operators/every slash/.style=%
      {shape=yquant-slash, x radius=.5mm, y radius=.7mm, draw},%
   operators/every subcircuit/.style=%
      {},%
   operators/every subcircuit box/.style=%
      {/yquant/operators/every rectangular box, fill=none},%
   subcircuit box style/.style=%
      {/yquant/operators/every subcircuit box/.append style={#1}},%
   operators/this subcircuit box/.style=%
      {},%
   this subcircuit box style/.style=%
      {/yquant/operators/this subcircuit box/.append style={#1}},%
   operators/subcircuit/frameless/.style=
      {/yquant/operators/this subcircuit box/.append style={draw=none, inner sep=0pt}},%
   operators/subcircuit/seamless/.code=%
      {\pgfkeysalso{/yquant/operators/subcircuit/frameless, /yquant/register/default name=}%
       \ifdefined\yquant@prefix%
          \csletcs{yquant@prevseamless}{\yquant@prefix seamless}%
       \else%
          \csletcs{yquant@prevseamless}{iffalse}%
       \fi%
       \yquant@config@circuit@seamlesstrue},
   operators/subcircuit/name mangling/.is choice,%
   operators/subcircuit/name mangling/prefix or discard/.code=%
      {\def\yquant@config@operator@subcircuit@mangling{0}},%
   operators/subcircuit/name mangling/prefix or transparent/.code=%
      {\def\yquant@config@operator@subcircuit@mangling{1}},%
   operators/subcircuit/name mangling/transparent/.code=%
      {\def\yquant@config@operator@subcircuit@mangling{2}},%
   operators/subcircuit/name mangling/discard/.code=%
      {\def\yquant@config@operator@subcircuit@mangling{3}},%
   operators/subcircuit/name mangling reset/.is if=%
      yquant@config@operator@subcircuit@manglingreset,
   operators/every swap/.style=%
      {shape=yquant-swap, radius=.75mm, draw},%
   operators/every iswap/.style=%
      {shape=yquant-ocross, radius=.75mm, draw},%
   operators/every wave/.style=%
      {shape=yquant-circle, radius=.5mm, fill},%
   % every x is implicitly defined during gate declaration
   operators/every xx/.style=%
      {shape=yquant-rectangle, radius=.75mm, draw, /yquant/default fill},%
   % every y is implicitly defined during gate declaration
   % every z is implicitly defined during gate declaration
   operators/every zz/.style=%
      {shape=yquant-circle, radius=.5mm, fill},%
% END_FOLD
% BEGIN_FOLD Enclose styles
   enclose/.cd,%
   options/.is family,%
   name/.code=%
      {\unless\ifdefined\yquant@circuit@enclose@allowname%
          \PackageError{yquant.sty}{Repeated enclose names}%
                       {A name for an enclosing region may only be specified once.}%
       \fi%
       \ifcsname yquant@circuit@enclose@names@#1\endcsname%
          \PackageError{yquant.sty}{Duplicate enclose names}%
                       {The name `#1' is already defined for an enclosing region.}%
       \fi%
       \csxdef{yquant@circuit@enclose@names@#1}{\the\yquant@circuit@enclose@count}%
       \undef\yquant@circuit@enclose@allowname%
      },
   name/.belongs to family=/yquant/enclose/options,%
   from/.code=%
      {\expandafter\yquant@register@singleget%
          \csname yquant@config@enclose@\yquant@circuit@enclose@id @from\endcsname%
          {#1}0%
       \ifcsname yquant@config@enclose@\yquant@circuit@enclose@id @from\endcsname
          \csxdef{yquant@config@enclose@\yquant@circuit@enclose@id @from}{%
             \expandafter\yquant@register@resolvetocolon%
               \csname yquant@config@enclose@\yquant@circuit@enclose@id @from\endcsname%
             \yquant@list@delim%
          }%
       \else%
          % maybe the register does not exist, but it is created within the macro... So we have to store the id
          \global\cslet{yquant@config@enclose@\yquant@circuit@enclose@id @from}\empty%
          \csxdef{yquant@config@enclose@\yquant@circuit@enclose@id @fromresolve}{#1}%
       \fi%
      },
   from/.belongs to family=/yquant/enclose/options,
   to/.code=%
      {\expandafter\yquant@register@singleget%
          \csname yquant@config@enclose@\yquant@circuit@enclose@id @to\endcsname%
          {#1}3{%
          % even if the "to" register already exists, if it was a vector register with no explicitly specified index and thus could be enlarged during the macro, we always have to store the id
          \csxdef{yquant@config@enclose@\yquant@circuit@enclose@id @toresolve}{#1}%
       }{%
          % the index was specified explicitly, so we know it for sure, if it exists
          \unless\ifcsname yquant@config@enclose@\yquant@circuit@enclose@id @to\endcsname%
             \csxdef{yquant@config@enclose@\yquant@circuit@enclose@id @toresolve}{#1}%
          \fi%
       }%
       \ifcsname yquant@config@enclose@\yquant@circuit@enclose@id @to\endcsname%
          \csxdef{yquant@config@enclose@\yquant@circuit@enclose@id @to}{%
             \expandafter\yquant@register@resolvetocolon
                \csname yquant@config@enclose@\yquant@circuit@enclose@id @to\endcsname%
             \yquant@list@delim%
          }%
       \else%
          \global\cslet{yquant@config@enclose@\yquant@circuit@enclose@id @to}\empty%
       \fi%
      },
   to/.belongs to family=/yquant/enclose/options,%
   spacing/.is choice,%
   spacing/.belongs to family=/yquant/enclose/options,%
   spacing/register/.code={\def\yquant@config@enclose@spacing{0}},%
   spacing/register/.belongs to family=/yquant/enclose/options,%
   spacing/gate/.code={\def\yquant@config@enclose@spacing{1}},%
   spacing/gate/.belongs to family=/yquant/enclose/options,%
   spacing/gate or local register/.code={\def\yquant@config@enclose@spacing{2}}%,
   spacing/gate or local register/.belongs to family=/yquant/enclose/options,%
   shape/.is choice,%
   shape/.belongs to family=/yquant/enclose/options,%
   shape/rectangle/.code={\def\yquant@config@enclose@shape{0}},%
   shape/rectangle/.belongs to family=/yquant/enclose/options,%
   shape/polygon/.code={\def\yquant@config@enclose@shape{1}},%
   shape/polygon/.belongs to family=/yquant/enclose/options,%
   every enclose/.style={draw, dashed, inner spacesep=.5*\yquant@config@register@sep, inner timesep=.5*\yquant@config@operator@sep, name=myname},%
   style/.style={/yquant/enclose/every enclose/.append style={#1}},%
   every braced enclose/.style={draw=none},
   braced enclose style/.style={/yquant/enclose/every braced enclose/.append style={#1}},%
   layer/.initial=background,%
   label layer/.initial=main,%
   shape/polygon/points/.initial,%
   overlay command/.store in=\yquant@config@enclose@beamercommand,%
   brace above/.code={\tikzset{/yquant/enclose/every braced enclose}\yquant@config@enclose@brace0{#1}},%
   brace below/.code={\tikzset{/yquant/enclose/every braced enclose}\yquant@config@enclose@brace1{#1}},%
   brace left/.forward to=/yquant/enclose/brace above,%
   brace right/.forward to=/yquant/enclose/brace below,%
   every brace label/.style={label distance=4pt},%
   every brace label above or left/.style={},%
   every brace label below or right/.style={},%
   every brace label above/.style={align=center},%
   every brace label below/.style={align=center},%
   every brace label left/.style={align=right},%
   every brace label right/.style={align=left},%
   every brace/.style={draw, /pgf/decoration/brace, decorate},%
   every brace above or left/.style={},%
   every brace below or right/.style={},%
   every brace above/.style={/pgf/decoration/raise=1pt},%
   every brace below/.style={/pgf/decoration/raise=1pt, /pgf/decoration/mirror},%
   every brace left/.style={/pgf/decoration/raise=2pt, /pgf/decoration/mirror},%
   every brace right/.style={/pgf/decoration/raise=2pt},%
   brace label style/.style={/yquant/enclose/every brace label/.append style={#1}},%
   brace label above or left style/.style={/yquant/enclose/every brace label above or left/.append style={#1}},%
   brace label below or right style/.style={/yquant/enclose/every brace label below or right/.append style={#1}},%
   brace label above style/.style={/yquant/enclose/every brace label above/.append style={#1}},%
   brace label below style/.style={/yquant/enclose/every brace label below/.append style={#1}},%
   brace label left style/.style={/yquant/enclose/every brace label left/.append style={#1}},%
   brace label right style/.style={/yquant/enclose/every brace label right/.append style={#1}},%
   brace style/.style={/yquant/enclose/every brace/.append style={#1}},%
   brace style above or left/.style={/yquant/enclose/every brace above or left/.append style={#1}},%
   brace style below or right/.style={/yquant/enclose/every brace below or right/.append style={#1}},%
   brace style above/.style={/yquant/enclose/every brace above/.append style={#1}},%
   brace style below/.style={/yquant/enclose/every brace below/.append style={#1}},%
   brace style left/.style={/yquant/enclose/every brace left/.append style={#1}},%
   brace style right/.style={/yquant/enclose/every brace right/.append style={#1}},%
   bracing style/.style={/yquant/enclose/brace style={#1},/yquant/enclose/brace label style={#1}},%
   bracing style above or left/.style={/yquant/enclose/brace above or left style={#1},/yquant/enclose/brace label above or left style={#1}},%
   bracing style below or right/.style={/yquant/enclose/brace below or right style={#1},/yquant/enclose/brace label below or right style={#1}},%
   bracing style above/.style={/yquant/enclose/brace above style={#1},/yquant/enclose/brace label above style={#1}},%
   bracing style below/.style={/yquant/enclose/brace below style={#1},/yquant/enclose/brace label below style={#1}},%
   bracing style left/.style={/yquant/enclose/brace left style={#1},/yquant/enclose/brace label left style={#1}},%
   bracing style right/.style={/yquant/enclose/brace right style={#1},/yquant/enclose/brace label right style={#1}},%
}
\def\yquant@config@enclose@brace#1#2{%
   % we copy the label parsing from TikZ
   \edef\yquant@config@enclose@brace@label@default@pos{\ifnum#1=0 \ifyquanthorz{above}{left}\else\ifyquanthorz{below}{right}\fi}%
   \begingroup%
      \ifnum\the\catcode`\:=\active\relax%
         \def\tikz@next{%
            \endgroup%
            \yquant@config@enclose@brace@parse@active{#1}{#2}%
         }%
      \else%
         \def\tikz@next{%
            \endgroup%
            \@ifnextchar[%
               {\yquant@config@enclose@brace@parse@nonactive{#1}}%
               {\yquant@config@enclose@brace@parse@nonactive{#1}[]}#2:\pgf@nil%
         }
      \fi%
      \tikz@next%
}
\begingroup%
   \catcode`\:=\active\relax
   \gdef\yquant@config@enclose@brace@parse@active#1#2{%
      \@ifnextchar[%
         {\yquant@config@enclose@brace@parse@active@i{#1}}%
         {\yquant@config@enclose@brace@parse@active@i[]}{#1}#2:\pgf@nil%
   }
   \gdef\yquant@config@enclose@brace@parse@active@i#1[#2]#3:#4\pgf@nil{%
      \ifstrempty{#4}{%
         % no position, use default
         \yquant@config@enclose@brace@parse@active@ii{#1}[{#2}]\yquant@config@enclose@brace@label@default@pos:#3:\pgf@nil%
      }{%
         \ifstrempty{#3}{%
            \yquant@config@enclose@brace@parse@active@ii{#1}[{#2}]\yquant@config@enclose@brace@label@default@pos:#4\pgf@nil%
         }{%
            \yquant@config@enclose@brace@parse@active@ii{#1}[{#2}]#3:#4\pgf@nil%
         }%
      }%
   }
   \gdef\yquant@config@enclose@brace@parse@active@ii#1[#2]#3:#4:\pgf@nil{%
      \yquant@config@enclose@brace@do{#1}[{#2}]{#3}{#4}%
   }
\endgroup%
\def\yquant@config@enclose@brace@parse@nonactive#1[#2]#3:#4\pgf@nil{%
   \ifstrempty{#4}{%
      % no position, use default
      \yquant@config@enclose@brace@parse@nonactive@i{#1}[{#2}]\yquant@config@enclose@brace@label@default@pos:#3:\pgf@nil%
   }{%
      \ifstrempty{#3}{%
         \yquant@config@enclose@brace@parse@nonactive@i{#1}[{#2}]\yquant@config@enclose@brace@label@default@pos:#4\pgf@nil%
      }{%
         \yquant@config@enclose@brace@parse@nonactive@i{#1}[{#2}]#3:#4\pgf@nil%
      }%
   }%
}
\def\yquant@config@enclose@brace@parse@nonactive@i#1[#2]#3:#4:\pgf@nil{%
   \yquant@config@enclose@brace@do{#1}[{#2}]{#3}{#4}%
}
\def\yquant@config@enclose@brace@do#1[#2]#3#4{%
   \numdef\yquant@config@enclose@braces{\yquant@config@enclose@braces+1}%
   \begingroup%
      \edef\yquant@config@enclose@brace@style{%
         \endgroup%
         \noexpand\pgfkeysalso{%
            /yquant/internal/collect brace styles={#1}{\yquant@config@enclose@braces}, /tikz/append after command={\noexpand\pgfextra{%
            \noexpand\path[/yquant/internal/collected brace decoration \yquant@config@enclose@braces, /tikz/name prefix=, /tikz/name suffix=]%
               \ifnum#1=0 %
                  (yquantbox.north west) -- %
                  (yquantbox.\ifyquanthorz{north east}{south west})%
               \else%
                  (yquantbox.\ifyquanthorz{south west}{north east}) -- %
                  (yquantbox.south east)%
               \fi;%
         }}}%
         \noexpand\tikz@@parse@label@nonactive[{/yquant/internal/collected brace label \yquant@config@enclose@braces, #2}]#3:#4:\noexpand\pgf@nil%
      }%
      \yquant@config@enclose@brace@style%
      \csgundef{/pgfk@/yquant/internal/collected brace decoration/.@cmd}%
      \csgundef{/pgfk@/yquant/internal/collected brace label/.@cmd}%
}
\protected\def\yquant@config@enclose@collectbracestyles#1#2{%
   \csxdef{pgfk@/yquant/internal/collected brace decoration #2/.@cmd}##1\pgfeov{%
      \unexpanded\expandafter\expandafter\expandafter{\csname pgfk@/yquant/enclose/every brace/.@cmd\endcsname##1\pgfeov}%
      \unexpanded\expandafter\expandafter\expandafter{\csname pgfk@/yquant/enclose/every brace \ifnum#1=0 above or left\else below or right\fi/.@cmd\endcsname##1\pgfeov}%
      \unexpanded\expandafter\expandafter\expandafter{\csname pgfk@/yquant/enclose/every brace \ifnum#1=0 \ifyquanthorz{above}{left}\else\ifyquanthorz{below}{right}\fi/.@cmd\endcsname##1\pgfeov}%
   }%
   \csxdef{pgfk@/yquant/internal/collected brace label #2/.@cmd}##1\pgfeov{%
      \unexpanded\expandafter\expandafter\expandafter{\csname pgfk@/yquant/enclose/every brace label/.@cmd\endcsname##1\pgfeov}%
      \unexpanded\expandafter\expandafter\expandafter{\csname pgfk@/yquant/enclose/every brace label \ifnum#1=0 above or left\else below or right\fi/.@cmd\endcsname##1\pgfeov}%
      \unexpanded\expandafter\expandafter\expandafter{\csname pgfk@/yquant/enclose/every brace label \ifnum#1=0 \ifyquanthorz{above}{left}\else\ifyquanthorz{below}{right}\fi/.@cmd\endcsname##1\pgfeov}%
   }%
}
% END_FOLD
% BEGIN_FOLD Internal styles (undocument, do not use!)
\def\yquant@config@enclose@checkmovealllabels#1{%
   \csname yquant@circuit@enclose@#1@allowmovelabel\endcsname\relax{%
      \yquant@config@operator@position@rightalignfalse%
      \listbreak%
   }%
}
\pgfqkeys{/yquant}{%
   internal/move label/.code=%
      {\yquant@config@operator@position@rightaligntrue},
   internal/maybe move label/.code 2 args={%
      \yquant@config@operator@position@rightaligntrue%
      \forlistloop\yquant@config@enclose@checkmovealllabels{#2}%
      \unless\ifyquant@config@operator@position@rightalign%
         \ifdim\yquant@draw@@width<#1 %
            \def\yquant@draw@@width{#1}%
         \fi%
         \pgfkeys{/yquant/every initial label/.style={}}%
      \fi%
   },%
   internal/multi main/.is if=%
      yquant@config@internal@multi@main,%
   internal/setup done/.code=%
      {\yquant@config@circuitsetupfalse},%
   internal/autorotate init/.style={},%
   internal/autorotate output/.style={},%
   internal/before styles/.style={%
      /tikz/only at/.code=\yquant@config@only@multi{}##1\yquant@sep,
      /tikz/not at/.code=\yquant@config@only@multi\unless##1\yquant@sep
   },%
   internal/corner/.code n args={4}{%
      \def\yquant@config@corner@at{#2}%
      \def\yquant@config@corner@min{#3}%
      \def\yquant@config@corner@max{#4}%
      \begingroup%
         \tikzset{/yquant/every control line}%
         \edef\tmp{%
            \endgroup%
            \def\noexpand\yquant@config@corner@xamount{#1\the\dimexpr.5\pgflinewidth\relax}%
         }%
         \tmp%
   },%
   internal/name unaliased/.code={%
      \let\yquant@config@internal@oldppname=\tikz@pp@name%
      \let\tikz@pp@name=\@firstofone%
      \ifx\tikz@fig@name\pgfutil@empty%
         \pgfkeysalso{/tikz/name={#1}}%
      \else%
         \pgfkeysalso{/tikz/alias={#1}}%
      \fi%
      \let\tikz@pp@name=\yquant@config@internal@oldppname%
   },%
   internal/dename/.code={
      \pgfkeysalso{/tikz/name/.code=, /tikz/alias/.code=}%
   },%
   internal/collect brace styles/.code 2 args={%
      \yquant@config@enclose@collectbracestyles{#1}{#2}%
   },%
   internal/no enclose/.is if=%
      yquant@config@internal@noenclose,%
}
\ifnum\yquant@compat<2 %
   \pgfqkeys{/yquant}{%
      internal/squeeze slash/.code=%
         {\dimdef\yquant@config@operator@sep{.5\dimexpr\yquant@config@operator@sep-\pgflinewidth\relax}%
          \yquant@config@operator@position@advancefalse},%
   }
\else%
   \pgfqkeys{/yquant}{%
      internal/squeeze slash/.code={}%
   }
\fi
\ifnum\yquant@compat<4 %
   \pgfqkeys{/yquant}{%
      internal/setregidx/.code 2 args={}%
   }
\else%
   \pgfqkeys{/yquant}{%
      internal/setregidx/.code 2 args=%
         {\def\yquant@draw@@idx@content{#1}%
          \ifnum\csname\yquant@prefix registerhigh@#2\endcsname>0 %
             \def\yquant@lang@maybe@idx{[\idx]}%
          \else%
             \let\yquant@lang@maybe@idx=\empty%
          \fi}
   }
\fi%
% END_FOLD

\protected\def\yquant@config@circuit@orientation@horizontal{%
   \let\ifyquanthorz=\@firstoftwo%
   \tikzset{%
      % in principle, these are all /.forward to handlers, but we want them non-accumulative
      time radius/.code={\pgfkeys{/tikz/x radius={##1}}},%
      space radius/.code={\pgfkeys{/tikz/y radius={##1}}},%
      inner timesep/.code={\pgfkeys{/tikz/inner xsep={##1}}},%
      inner spacesep/.code={\pgfkeys{/tikz/inner ysep={##1}}},%
      outer timesep/.code={\pgfkeys{/tikz/outer xsep={##1}}},%
      outer spacesep/.code={\pgfkeys{/tikz/outer ysep={##1}}}%
   }%
   \def\yquant@config@register@minimum@height@default{1.5mm}%
   \def\yquant@config@register@minimum@depth@default{1.5mm}%
   \def\yquant@config@operator@minimum@width@default{5mm}%
   \let\yquant@pgf@picminx=\pgf@picminx%
   \let\yquant@pgf@picmaxx=\pgf@picmaxx%
   \let\yquant@pgf@picminy=\pgf@picminy%
   \let\yquant@pgf@picmaxy=\pgf@picmaxy%
   \let\yquant@pgf@x=\pgf@x%
   \let\yquant@pgf@y=\pgf@y%
   \let\yquant@pgf@pt@x=\pgf@pt@x%
   \let\yquant@pgf@pt@y=\pgf@pt@y%
   \let\yquant@pgfqpoint=\pgfqpoint%
   \let\yquant@coords=\empty%
   \let\pgfshapeclippath=\yquant@pgfshapeclippath@horz%
   \def\yquant@orientation@x{x}%
   \def\yquant@orientation@y{y}%
   \def\yquant@orientation@plus{+}%
   \def\yquant@orientation@minus{-}%
}

\protected\def\yquant@config@circuit@orientation@vertical{%
   \let\ifyquanthorz=\@secondoftwo%
   \tikzset{%
      % in principle, these are all /.forward to handlers, but we want them non-accumulative
      time radius/.code={\pgfkeys{/tikz/y radius={##1}}},%
      space radius/.code={\pgfkeys{/tikz/x radius={##1}}},%
      inner timesep/.code={\pgfkeys{/tikz/inner ysep={##1}}},%
      inner spacesep/.code={\pgfkeys{/tikz/inner xsep={##1}}},%
      outer timesep/.code={\pgfkeys{/tikz/outer ysep={##1}}},%
      outer spacesep/.code={\pgfkeys{/tikz/outer xsep={##1}}}%
   }%
   \def\yquant@config@register@minimum@height@default{2.5mm}%
   \def\yquant@config@register@minimum@depth@default{2.5mm}%
   \def\yquant@config@operator@minimum@width@default{3mm}%
   \let\yquant@pgf@picminx=\pgf@picminy%
   \let\yquant@pgf@picmaxx=\pgf@picmaxy%
   \let\yquant@pgf@picminy=\pgf@picminx%
   \let\yquant@pgf@picmaxy=\pgf@picmaxx%
   \let\yquant@pgf@x=\pgf@y%
   \let\yquant@pgf@y=\pgf@x%
   \let\yquant@pgf@pt@x=\pgf@pt@y%
   \let\yquant@pgf@pt@y=\pgf@pt@x%
   \def\yquant@pgfqpoint##1##2{\pgfqpoint{##2}{##1}}%
   \def\yquant@coords(##1,##2){({##2},{##1})}%
   \let\pgfshapeclippath=\yquant@pgfshapeclippath@vert%
   \def\yquant@orientation@x{y}%
   \def\yquant@orientation@y{x}%
   \def\yquant@orientation@plus{-}%
   \def\yquant@orientation@minus{+}%
}

\let\yquant@pgfshapeclippath@horz=\pgfshapeclippath
\let\yquant@pgfshapeclippath@vert=\pgfshapeclippath
\patchcmd\yquant@pgfshapeclippath@vert{%
   \global\let\pgfshapeclippathhorzresult=\pgfshapeclippathresult%
   \ifcsname pgf@sh@clipvert@\csname pgf@sh@ns@#1\endcsname\endcsname%
      % different clipping in vertical direction
      \pgfsyssoftpath@setcurrentpath\pgfutil@empty%
      \csname pgf@sh@clipvert@\csname pgf@sh@ns@#1\endcsname\endcsname%
      \pgfsyssoftpath@getcurrentpath\pgfshapeclippathresult%
      \pgfprocessround{\pgfshapeclippathresult}{\pgfshapeclippathresult}%
   \fi%
   \global\let\pgfshapeclippathvertresult=\pgfshapeclippathresult%
}{%
   \global\let\pgfshapeclippathvertresult=\pgfshapeclippathresult%
   \ifcsname pgf@sh@clipvert@\csname pgf@sh@ns@#1\endcsname\endcsname%
      % different clipping in vertical direction
      \pgfsyssoftpath@setcurrentpath\pgfutil@empty%
      \csname pgf@sh@clipvert@\csname pgf@sh@ns@#1\endcsname\endcsname%
      \pgfsyssoftpath@getcurrentpath\pgfshapeclippathresult%
      \pgfprocessround{\pgfshapeclippathresult}{\pgfshapeclippathresult}%
   \fi%
   \global\let\pgfshapeclippathhorzresult=\pgfshapeclippathresult%
}{}{%
   \PackageError{yquant.sty}{Unable to path \string\pgfshapeclippath}%
                {Vertical layout will not work.}%
}

\def\yquant@config@register@default@name{\regidx}
\let\yquant@config@register@default@lazyname=\empty
\def\yquant@config@register@minimum@height{\yquant@config@register@minimum@height@default}
\def\yquant@config@register@minimum@height@default{1.5mm}
\def\yquant@config@register@minimum@depth{\yquant@config@register@minimum@depth@default}
\def\yquant@config@register@minimum@depth@default{1.5mm}
\def\yquant@config@register@sep{1mm}
\def\yquant@config@operator@sep{1mm}
\def\yquant@config@operator@minimum@width{\yquant@config@operator@minimum@width@default}
\def\yquant@config@operator@minimum@width@default{5mm}
\def\yquant@config@enclose@spacing{2}
\def\yquant@config@enclose@shape{0}
\def\yquant@config@enclose@beamercommand{\uncover}
\newif\ifyquant@config@internal@multi@main
\yquant@config@internal@multi@maintrue
\newif\ifyquant@config@internal@noenclose
\newif\ifyquant@config@operator@multi@warn
\yquant@config@operator@multi@warntrue
\newif\ifyquant@config@operator@position@rightalign
\newif\ifyquant@config@operator@position@advance
\yquant@config@operator@position@advancetrue
\newif\ifyquant@config@circuit@seamless
\def\yquant@config@operator@subcircuit@mangling{0}
\newif\ifyquant@config@operator@subcircuit@manglingreset
\yquant@config@operator@subcircuit@manglingresettrue
\newif\ifyquant@config@operator@multi
\newif\ifyquant@config@circuitsetup
\yquant@config@circuitsetuptrue
\yquant@config@circuit@orientation@horizontal
\newif\ifyquant@config@draw@quality
\yquant@config@draw@qualitytrue
\newif\ifyquant@config@requirelayers

\protected\def\yquant@config@operator@subcircuit@mangling@set#1{%
   \ifyquant@config@operator@subcircuit@manglingreset%
      \def\yquant@config@operator@subcircuit@mangling{#1}%
   \fi%
}