summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/yquant/yquant-lang.tex
diff options
context:
space:
mode:
authorNorbert Preining <preining@logic.at>2021-04-03 23:54:49 +0000
committerNorbert Preining <preining@logic.at>2021-04-03 23:54:49 +0000
commit32f9a397a899dfac82a4f4d80670f48b675da246 (patch)
tree4d4429493606d826f06de7ae1401bf3a3b667bcc /Master/texmf-dist/tex/latex/yquant/yquant-lang.tex
parent8687c318c8de471be301f160ad143242f1a88e68 (diff)
yquant (4apr21)
git-svn-id: svn://tug.org/texlive/trunk@58712 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/yquant/yquant-lang.tex')
-rw-r--r--Master/texmf-dist/tex/latex/yquant/yquant-lang.tex859
1 files changed, 428 insertions, 431 deletions
diff --git a/Master/texmf-dist/tex/latex/yquant/yquant-lang.tex b/Master/texmf-dist/tex/latex/yquant/yquant-lang.tex
index 2ea08e8b16c..f19ebfcc386 100644
--- a/Master/texmf-dist/tex/latex/yquant/yquant-lang.tex
+++ b/Master/texmf-dist/tex/latex/yquant/yquant-lang.tex
@@ -14,21 +14,66 @@
\let\yquant@lang@attr@input=\relax%
\undef\yquant@lang@attr@output%
},%
- in/.default=\regidx,%
out/.code={%
\undef\yquant@lang@attr@input%
\let\yquant@lang@attr@output=\relax%
},%
- out/.default=\regidx,%
inout/.code={%
\let\yquant@lang@attr@input=\relax%
\let\yquant@lang@attr@output=\relax%
+ },%
+ frameless/.code={%
+ \pgfkeysalso{/yquant/operators/subcircuit/frameless}%
+ \appto\yquant@attrs@remaining{,/yquant/operators/subcircuit/frameless}%
+ },%
+ seamless/.code={%
+ \pgfkeysalso{/yquant/operators/subcircuit/seamless}%
+ \appto\yquant@attrs@remaining{,/yquant/operators/subcircuit/seamless}%
+ },%
+ direct control/.code={%
+ \let\yquant@lang@attr@directcontrol=\relax%
+ },%
+ indirect control/.code={%
+ \undef\yquant@lang@attr@directcontrol%
}%
- inout/.default=\regidx,%
}
\yquant@langhelper@declare@attr@global{%
- name/.store in=\yquant@lang@attr@name%
-}
+ name/.store in=\yquant@lang@attr@name,%
+ overlay/.code={%
+ \ifstrequal{#1}{true}{%
+ \yquant@lang@attr@overlay@multitrue%
+ \yquant@lang@attr@overlay@heighttrue%
+ \yquant@lang@attr@overlay@depthtrue%
+ }{%
+ \ifstrequal{#1}{false}{%
+ % Why??? This is the default and should always be reset automatically!
+ \yquant@lang@attr@overlay@multifalse%
+ \yquant@lang@attr@overlay@heightfalse%
+ \yquant@lang@attr@overlay@depthfalse%
+ }{%
+ \pgfqkeys{/yquant/global attrs/overlay}{#1}%
+ }%
+ }%
+ },%
+ overlay/.default=true,%
+ overlay/multi/.is if=yquant@lang@attr@overlay@multi,%
+ overlay/m/.forward to=/yquant/global attrs/overlay/multi,%
+ overlay/height/.is if=yquant@lang@attr@overlay@height,%
+ overlay/ht/.forward to=/yquant/global attrs/overlay/height,%
+ overlay/h/.forward to=/yquant/global attrs/overlay/height,%
+ overlay/depth/.is if=yquant@lang@attr@overlay@depth,%
+ overlay/dp/.forward to=/yquant/global attrs/overlay/depth,%
+ overlay/d/.forward to=/yquant/global attrs/overlay/depth,%
+ overlay/single/.code={\pgfkeysalso{%
+ /yquant/global attrs/overlay/height={#1},%
+ /yquant/global attrs/overlay/depth={#1}%
+ }},%
+ overlay/single/.default=true,%
+ overlay/s/.forward to=/yquant/global attrs/overlay/single,%
+}
+\newif\ifyquant@lang@attr@overlay@multi%
+\newif\ifyquant@lang@attr@overlay@height%
+\newif\ifyquant@lang@attr@overlay@depth%
\protected\def\yquant@lang@reset@attrs{%
\undef\yquant@lang@attr@value%
@@ -36,6 +81,9 @@
\undef\yquant@lang@attr@type%
\yquant@lang@reset@attrs@inputoutput%
\let\yquant@lang@attr@name=\empty%
+ \yquant@lang@attr@overlay@multifalse%
+ \yquant@lang@attr@overlay@heightfalse%
+ \yquant@lang@attr@overlay@depthfalse%
}
\protected\def\yquant@lang@reset@attrs@inputoutput{%
@@ -50,7 +98,7 @@
% END_FOLD
% BEGIN_FOLD Declaration of registers
-\yquant@langhelper@declare@command@uncontrolled{nobit}\yquant@lang@@nobit
+\yquant@langhelper@declare@command@create{nobit}\yquant@lang@@nobit
\yquant@langhelper@setup@attrs{nobit}{}{ancilla,out}
\def\yquant@lang@@nobit#1{%
\let\yquant@lang@create@type=\yquant@register@type@none%
@@ -64,7 +112,7 @@
\yquant@lang@create@parse@name#1[;%
}
-\yquant@langhelper@declare@command@uncontrolled{qubit}\yquant@lang@@qubit
+\yquant@langhelper@declare@command@create{qubit}\yquant@lang@@qubit
\yquant@langhelper@setup@attrs{qubit}{}{after,value,ancilla,in,out,inout}
\def\yquant@lang@@qubit#1{%
\let\yquant@lang@create@type=\yquant@register@type@q%
@@ -75,18 +123,18 @@
\yquant@lang@create@parse@name#1[;%
}
-\yquant@langhelper@declare@command@uncontrolled{cbit}\yquant@lang@@cbit
+\yquant@langhelper@declare@command@create{cbit}\yquant@lang@@cbit
\yquant@langhelper@setup@attrs{cbit}{}{after,value,ancilla,in,out,inout}
\def\yquant@lang@@cbit#1{%
\let\yquant@lang@create@type=\yquant@register@type@c%
- \def\yquant@lang@create@style{qubit}%
+ \def\yquant@lang@create@style{cbit}%
\unless\ifdefined\yquant@lang@attr@value%
\let\yquant@lang@attr@value=\yquant@config@register@default@name%
\fi%
\yquant@lang@create@parse@name#1[;%
}
-\yquant@langhelper@declare@command@uncontrolled{qubits}\yquant@lang@@qubits
+\yquant@langhelper@declare@command@create{qubits}\yquant@lang@@qubits
\yquant@langhelper@setup@attrs{qubits}{}{after,value,ancilla,in,out,inout}
\def\yquant@lang@@qubits#1{%
\let\yquant@lang@create@type=\yquant@register@type@qs%
@@ -136,193 +184,87 @@
\else%
\def\regidx{\reg[\idx]}%
\fi%
- % determine x position
- \ifdefined\yquant@lang@attr@after%
- \yquant@register@get@maxxlist\yquant@lang@create@x\yquant@lang@attr@after%
- \ifdefined\yquant@lang@attr@input%
- \PackageError{yquant.sty}{An input register cannot be created with `after` attribute}{}%
+ \numdef\yquant@circuit@operator@mintarget{\csname\yquant@prefix registers\endcsname+1}%
+ % create the registers
+ \begingroup%
+ % if we have the after attribute, we start with a discarded wire
+ \ifdefined\yquant@lang@attr@after%
+ \ifdefined\yquant@lang@attr@input%
+ \PackageError{yquant.sty}{An input register cannot be created with `after` attribute}{}%
+ \fi%
+ \let\yquant@lang@create@type=\yquant@register@type@none%
\fi%
+ \yquant@for \idx := \idx to \numexpr \len -1\relax {%
+ \yquant@prepare@create\reg\idx\yquant@lang@create@type%
+ }%
+ \endgroup%
+ % gather details about the created registers
+ \letcs\yquant@circuit@operator@maxtarget{\yquant@prefix registers}%
+ \numdef\yquant@circuit@operator@numtarget{\yquant@circuit@operator@maxtarget-\yquant@circuit@operator@mintarget+1}%
+ \edef\yquant@circuit@operator@targets{%
+ \yquant@list@range%
+ \yquant@circuit@operator@mintarget%
+ \yquant@circuit@operator@maxtarget%
+ }%
+ \let\yquant@circuit@operator@pctrls=\empty%
+ \def\yquant@circuit@operator@minpctrl{2147483647}%
+ \def\yquant@circuit@operator@maxpctrl{0}%
+ \let\yquant@circuit@operator@numpctrl=\yquant@circuit@operator@maxpctrl%
+ \let\yquant@circuit@operator@nctrls=\empty%
+ \let\yquant@circuit@operator@minnctrl=\yquant@circuit@operator@minpctrl%
+ \let\yquant@circuit@operator@maxnctrl=\yquant@circuit@operator@maxpctrl%
+ \let\yquant@circuit@operator@numnctrl=\yquant@circuit@operator@numpctrl%
+ \let\yquant@circuit@operator@minctrl=\yquant@circuit@operator@mintarget%
+ \let\yquant@circuit@operator@maxctrl=\yquant@circuit@operator@maxtarget%
+ % if we have the after attribute, we fake an align gate
+ \ifdefined\yquant@lang@attr@after%
+ \edef\jointindices{\yquant@circuit@operator@targets\yquant@lang@attr@after}%
+ \yquant@circuit@align\jointindices%
+ % and we also need to change the wire after the alignment
+ \let\yquant@circuit@settype@to=\yquant@lang@create@type%
+ \let\yquant@prepare@callback@prepare=\yquant@circuit@settype@prepare%
+ \let\yquant@prepare@callback@draw=\yquant@circuit@settype%
+ \expandafter\@thirdofthree%
\else%
- \let\yquant@lang@create@x=\yquant@env@create@x%
+ \expandafter\@firstofone%
\fi%
- \begingroup%
+ % unless there is no name, no text and no after attribute, we now need an init gate
+ {%
+ \ifx\yquant@lang@attr@value\empty%
+ \expandafter\@firstofone%
+ \else%
+ \expandafter\@secondoftwo%
+ \fi%
+ }%
+ {%
\ifx\yquant@lang@attr@name\empty%
- \let\yquant@lang@create@name=\empty%
+ \expandafter\@gobble%
\else%
- \def\yquant@lang@create@name{\yquant@lang@attr@name-\idx}%
+ \expandafter\@firstofone%
\fi%
- % pre-set y position
- \yquant@for \idx := \idx to \numexpr \len -1\relax {%
- \ifdefined\yquant@lang@attr@input%
- \expandafter\yquant@list@gdequeue\csname \yquant@prefix parameters\endcsname\outermap%
- \ifx\outermap\empty%
- \PackageError{yquant.sty}{Invalid subcircuit parameter count}%
- {No outer register available for input register `\reg[\idx]`.}%
- \fi%
- \csxappto{\yquant@prefix draw}{%
- \yquant@lang@create@check@input{\outermap}{\yquant@lang@create@type}%
- {\reg[\idx]}%
- }%
- \unless\ifdefined\yquant@lang@attr@output%
- \listcsxadd{\yquant@prefix inonly}%
- {\the\numexpr\csname\yquant@prefix registers\endcsname+1\relax}%
- \fi%
- \yquant@register@alias%
- \yquant@lang@create@type%
- \yquant@lang@create@x%
- \reg\idx\outermap%
- \else%
- \ifdefined\yquant@lang@attr@output%
- \expandafter\yquant@list@gdequeue\csname\yquant@prefix parameters\endcsname\outermap%
- \ifx\outermap\empty%
- \PackageError{yquant.sty}{Invalid subcircuit parameter count}%
- {No outer register available for output register `\reg`.}%
- \fi%
- \csxappto{\yquant@prefix draw}{%
- \yquant@lang@create@check@output{\outermap}{\reg[\idx]}%
- }%
- \yquant@register@alias%
- \yquant@lang@create@type%
- \yquant@lang@create@x%
- \reg\idx\outermap%
- \else%
- \yquant@register@define%
- \yquant@lang@create@type%
- \yquant@lang@create@x%
- \reg\idx%
- \fi%
- \fi%
- % First determine the actual height by a virtual draw command
- \protected@edef\trimmedvalue{\trim@spaces{\yquant@lang@attr@value}}%
- \unless\ifx\empty\trimmedvalue%
- \pgfinterruptboundingbox%
- \yquant@env@virtualize@path%
- \edef\cmd{%
- \noexpand\path%
- (\yquant@lang@create@x, 0pt)%
- node[/yquant/every label, /yquant/every initial label,%
- /yquant/every \yquant@lang@create@style\space label%
- \ifdefined\yquant@lang@attr@input, /yquant/every input label\fi]%
- {\unexpanded\expandafter{\trimmedvalue}};%
- }%
- \cmd%
- \ifdim\pgf@picminx<\csname\yquant@prefix xmin\endcsname%
- \csxdef{\yquant@prefix xmin}{\the\pgf@picminx}%
- \fi%
- \expandafter\yquant@register@update@height%
- \csname\yquant@prefix registers\endcsname%
- {\the\pgf@picmaxy}%
- \expandafter\yquant@register@update@depth%
- \csname\yquant@prefix registers\endcsname%
- {\the\dimexpr-\pgf@picminy\relax}%
- \endpgfinterruptboundingbox%
- \fi%
- % Prepare to shipout
- \csxappto{\yquant@prefix draw}{%
- \yquant@lang@create@draw{\csname\yquant@prefix registers\endcsname}%
- {\yquant@lang@create@x}%
- {\yquant@lang@create@style}%
- \ifdefined\yquant@lang@attr@input1\else0\fi%
- {\unexpanded\expandafter{\trimmedvalue}}%
- {\yquant@lang@create@name}%
- \unless\ifdefined\yquant@lang@attr@input%
- \ifdefined\yquant@lang@attr@output%
- \yquant@circuit@flushwire%
- {\csname\yquant@prefix registers\endcsname}%
- \yquant@register@set@type%
- {\csname\yquant@prefix registers\endcsname}%
- \yquant@lang@create@type%
- \fi%
- \fi%
+ }%
+ {%
+ % there are no multi inits in this context
+ \preto\yquant@attrs@remaining{internal/move label,}%
+ \def\yquant@config@operator@minimum@width{0pt}%
+ \unless\ifx\yquant@lang@attr@value\empty%
+ % make sure to immediately remove the "clear" marker again if we have a text
+ \yquant@for \i := \yquant@circuit@operator@mintarget to \yquant@circuit@operator@maxtarget {%
+ \yquant@register@execclear@lastgate{\i}{init}%
}%
- }%
+ \fi%
+ \expandafter\yquant@prepare%
+ \expandafter{\yquant@lang@attr@value}%
+ {/yquant/every label, /yquant/every initial label,%
+ /yquant/every \yquant@lang@create@style\space label,%
+ \ifnum\yquant@compat<2 \ifdefined\yquant@lang@attr@input /yquant/every input label\fi\fi}%
\unless\ifx\yquant@lang@attr@name\empty%
\ifnum\len=1 %
\csxappto{\yquant@prefix draw}%
{\yquant@draw@alias{\yquant@lang@attr@name}}%
\fi%
\fi%
- \endgroup%
-}
-
-\protected\def\yquant@lang@create@check@input#1#2#3{%
- \begingroup%
- \let\yquant@prefix=\yquant@parent%
- \unless\if#2\yquant@register@get@type{#1}%
- \PackageError{yquant.sty}{Subcircuit expects wire of type `\yquant@register@type@tostring{#2}', but got `\yquant@register@type@tostring{\yquant@register@get@type{#1}}'}%
- {Outer and inner wire types must match for input wire `\detokenize{#3}`.}%
- \fi%
- \endgroup%
-}
-
-\protected\def\yquant@lang@create@check@output#1#2{%
- \begingroup%
- \let\yquant@prefix=\yquant@parent%
- \unless\if\yquant@register@type@none\yquant@register@get@type{#1}%
- \PackageError{yquant.sty}%
- {Subcircuit expects discarded wire, got `\yquant@register@type@tostring{\yquant@register@get@type{#1}}'}%
- {Outer wire must be discarded before being acceptable for output-only register `\detokenize{#2}`.}%
- \fi%
- \endgroup%
-}
-
-\protected\def\yquant@lang@create@draw#1#2#3#4#5#6{%
- \begingroup%
- \dimdef\wireypos{\yquant@register@get@y{#1}}%
- \ifcsname\yquant@prefix xshift\endcsname%
- \dimdef\createxpos{#2+\csname\yquant@prefix xshift\endcsname}%
- \else%
- \dimdef\createxpos{#2}%
- \fi%
- \ifstrempty{#5}{%
- % For empty labels, we still put the node at the appropriate position as it may needs to be referenced, but we will not let it effect the bounding box (so that the left end is not shifted), and we don't need an inner separation, so that the label is truely just a coordinate.
- \path[overlay]%
- (\createxpos, \wireypos)%
- coordinate[name prefix=, name suffix=, name=yquantbox];%
- \let\pgfshapeclippathhorzresult=\empty%
- }{%
- \edef\cmd{%
- \noexpand\path%
- (\createxpos, \wireypos)%
- node[/yquant/every label, /yquant/every initial label,%
- /yquant/every #3 label\ifx1#4, /yquant/every input label\fi,%
- name prefix=, name suffix=, name=yquantbox]%
- {\unexpanded{#5}};%
- \ifcsname\yquant@prefix registermap@#1\endcsname%
- \pgfshapeclippath{yquantbox}%
- {/yquant/every label, /yquant/every initial label,%
- /yquant/every #3 label\ifx1#4, /yquant/every input label\fi}%
- \fi%
- }%
- \cmd%
- }%
- \ifcsname\yquant@prefix registermap@#1\endcsname%
- % if this is an alias, the creation is just an extension
- \if\yquant@register@type@none\yquant@register@get@type{#1}%
- \ifstrequal{#3}{initial}{%
- \yquant@circuit@extendwire{#1}{east}%
- }{%
- % however, our inner wire is present, while the outer wire was discarded.
- \tikzset{/yquant/every wire}%
- \pgfpointanchor{yquantbox}{east}%
- \yquant@register@set@lastwire{#1}{%
- {\the\pgf@x}{\the\pgf@x}{}%
- {\unexpanded\expandafter{\pgfshapeclippathhorzresult}}%
- }%
- }%
- \else%
- \yquant@circuit@extendwire{#1}{east}%
- \fi%
- \else%
- % set the wire style to have the correct \pgflinewidth available (we don't allow individual line widths for different types of wires)
- \tikzset{/yquant/every wire}%
- \pgfpointanchor{yquantbox}{east}%
- \yquant@register@set@lastwire{#1}{{\the\pgf@x}{\the\pgf@x}{}{}}%
- \fi%
- \ifstrempty{#6}\relax{%
- \pgfnodealias{\tikz@pp@name{#6}}{yquantbox}%
- }%
- \endgroup%
+ }%
}
% END_FOLD
@@ -348,23 +290,21 @@
\protected\long\def\yquantdefinegate@i#1[#2]#3{%
\pgfkeys{/yquant/operators/every #1/.style={#2}}%
+ \yquant@prepare@ifs@set%
\protected@edef\yquantdefinegate@do{%
\yquant@langhelper@declare@command%
{#1}%
- \expandafter\noexpand\csname yquant@lang@@#1\endcsname%
+ \yquant@register@get@multiaslist%
+ {%
+ \let\noexpand\yquant@lang@attr@value=\expandafter\noexpand\csname yquant@lang@@#1\endcsname%
+ \yquant@prepare@subcircuit{/yquant/operators/every #1}%
+ }%
% This does not clear the attributes for redefines, but makes at least sure nothing is marked as required that should not be.
\yquant@langhelper@setup@attrs{#1}{}{}%
% Now define the gate's content as a macro
- \def\expandafter\noexpand\csname yquant@lang@@@#1\endcsname{%
+ \def\expandafter\noexpand\csname yquant@lang@@#1\endcsname{%
#3%
}%
- % And provide the implementation
- \protected\def\expandafter\noexpand\csname yquant@lang@@#1\endcsname####1####2####3{%
- \yquant@register@get@multiaslist%
- \yquant@circuit@operator{####1}{####2}{####3}%
- \let\noexpand\yquant@lang@attr@value=\expandafter\noexpand\csname yquant@lang@@@#1\endcsname%
- \yquant@draw@@subcircuit{/yquant/operators/every #1}%
- }%
}%
\yquantdefinegate@do%
}
@@ -374,8 +314,15 @@
\PackageError{yquant.sty}{Gate redefined}%
{The gate `#1' already exists. Use \string\yquantredefinebox\space if you really want to redefine it.}%
\fi%
- \@ifnextchar[{\yquantdefinebox@i{#1}}%
- {\yquantdefinebox@i{#1}[/yquant/operators/every box]}%
+ \yquantdefinebox@{#1}{}%
+}
+
+\def\yquantdefinemultibox#1{%
+ \ifcsname yquant@lang@#1\endcsname%
+ \PackageError{yquant.sty}{Gate redefined}%
+ {The gate `#1' already exists. Use \string\yquantredefinemultibox\space if you really want to redefine it.}%
+ \fi%
+ \yquantdefinebox@{#1}\yquant@register@get@allowmultitrue%
}
\def\yquantredefinebox#1{%
@@ -383,38 +330,47 @@
\PackageError{yquant.sty}{Unknown gate redefined}%
{The gate `#1' is unknown and cannot be redefined. Use \string\yquantdefinebox\space to define it.}%
\fi%
- \yquantdefinebox@i{#1}%
- \@ifnextchar[{\yquantdefinebox@i{#1}}%
- {\yquantdefinebox@i{#1}[/yquant/operators/every box]}%
+ \yquantdefinebox@{#1}{}%
}
-\protected\long\def\yquantdefinebox@i#1[#2]#3{%
- \pgfkeys{/yquant/operators/every #1/.style={#2}}%
+\def\yquantredefinemultibox#1{%
+ \unless\ifcsname yquant@lang@#1\endcsname%
+ \PackageError{yquant.sty}{Unknown gate redefined}%
+ {The gate `#1' is unknown and cannot be redefined. Use \string\yquantdefinemultibox\space to define it.}%
+ \fi%
+ \yquantdefinebox@{#1}\yquant@register@get@allowmultitrue%
+}
+
+\def\yquantdefinebox@#1#2{%
+ \@ifnextchar[{\yquantdefinebox@i{#1}{#2}}%
+ {\yquantdefinebox@i{#1}{#2}[/yquant/operators/every box]}%
+}
+
+\protected\long\def\yquantdefinebox@i#1#2[#3]#4{%
+ \pgfkeys{/yquant/operators/every #1/.style={#3}}%
+ \yquant@prepare@ifs@set%
\protected@edef\yquantdefinebox@do{%
\yquant@langhelper@declare@command%
{#1}%
- \expandafter\noexpand\csname yquant@lang@@#1\endcsname%
- \yquant@langhelper@setup@attrs{#1}{}{}%
- \def\expandafter\noexpand\csname yquant@lang@@#1\endcsname{%
- \yquant@draw%
- {#3}%
- {/yquant/operators/every #1}%
- }%
+ {\unexpanded{#2}}%
+ {\yquant@prepare{#4}{/yquant/operators/every #1}}%
}%
\yquantdefinebox@do%
+ \yquant@langhelper@setup@attrs{#1}{}{}%
}
% END_FOLD
% BEGIN_FOLD Box registers
% all-purpose box with arbitrary text
-\yquant@langhelper@declare@command{box}\yquant@lang@@box
-\yquant@langhelper@setup@attrs{box}{value}{}
-\def\yquant@lang@@box{%
+\yquant@langhelper@declare@command%
+ {box}%
\yquant@register@get@allowmultitrue%
- \expandafter\yquant@draw%
- \expandafter{\yquant@lang@attr@value}%
- {/yquant/operators/every box}%
-}
+ {%
+ \expandafter\yquant@prepare%
+ \expandafter{\yquant@lang@attr@value}%
+ {/yquant/operators/every box}%
+ }
+\yquant@langhelper@setup@attrs{box}{value}{}
% Hadamard
\yquantdefinebox{h}{$H$}
@@ -429,183 +385,255 @@
\yquantdefinebox{z}[/yquant/operators/every pauli]{$Z$}
% sub-circuit: This is a nested circuit.
-\yquant@langhelper@declare@command{subcircuit}\yquant@lang@@subcircuit
-\yquant@langhelper@setup@attrs{subcircuit}{value}{}
-\protected\def\yquant@lang@@subcircuit#1#2#3{%
+\yquant@langhelper@declare@command%
+ {subcircuit}%
\yquant@register@get@multiaslist%
- \yquant@circuit@operator{#1}{#2}{#3}%
- \yquant@draw@@subcircuit{/yquant/operators/every subcircuit}%
-}
+ {%
+ \yquant@prepare@subcircuit{/yquant/operators/every subcircuit}%
+ }
+\yquant@langhelper@setup@attrs{subcircuit}{value}{frameless,seamless}
% END_FOLD
% BEGIN_FOLD other geometric shapes
% phase
-\yquant@langhelper@declare@command{phase}\yquant@lang@@phase
+\yquant@langhelper@declare@command%
+ {phase}%
+ {}%
+ {%
+ \edef\cmd{%
+ \yquant@prepare%
+ {}%
+ {/yquant/operators/every phase, label={\unexpanded\expandafter{\yquant@lang@attr@value}}}%
+ }%
+ \cmd%
+ }
\yquant@langhelper@setup@attrs{phase}{value}{}%
-\def\yquant@lang@@phase{%
- \edef\cmd{%
- \noexpand\yquant@draw%
- {}%
- {/yquant/operators/every phase, label={\unexpanded\expandafter{\yquant@lang@attr@value}}}%
- }%
- \cmd%
-}
% two-qubit controlled x (symmetric notation)
-\yquant@langhelper@declare@command{xx}\yquant@lang@@xx
-\yquant@langhelper@setup@attrs{xx}{}{}
-\def\yquant@lang@@xx{%
+\yquant@langhelper@declare@command%
+ {xx}%
\yquant@register@get@multiassingle%
- \yquant@draw%
- {}%
- {/yquant/operators/every xx}%
-}
+ {%
+ \yquant@prepare%
+ {}%
+ {/yquant/operators/every xx}%
+ }
+\yquant@langhelper@setup@attrs{xx}{}{}
% two-qubit controlled phase (symmetric notation)
-\yquant@langhelper@declare@command@uncontrolled{zz}\yquant@lang@@zz
-\yquant@langhelper@setup@attrs{zz}{}{}
-\def\yquant@lang@@zz{%
+\yquant@langhelper@declare@command@uncontrolled%
+ {zz}%
\yquant@register@get@multiassingle%
- \yquant@draw%
- {}%
- {/yquant/operators/every zz}%
- {}{}%
-}
+ {%
+ \yquant@prepare%
+ {}%
+ {/yquant/operators/every zz}%
+ }
+\yquant@langhelper@setup@attrs{zz}{}{}
% slash (pseudo-operator, alternative indication for a bundle)
-\yquant@langhelper@declare@command@uncontrolled{slash}\yquant@lang@@slash
-\yquant@langhelper@setup@attrs{slash}{}{}
-\protected\def\yquant@lang@@slash#1{%
- % temporarily squeeze most into the separation
- \pgfkeys{%
- /yquant/operator/minimum width=0pt,%
- /yquant/operator/separation=.5\dimexpr\yquant@config@operator@sep-\pgflinewidth\relax%
- }%
- \def\yquant@draw@callback@wire##1{%
- \yquant@register@set@x%
- {##1}%
- {\the\dimexpr\yquant@register@get@x{##1}-\yquant@config@operator@sep-\pgflinewidth\relax}%
+\yquant@langhelper@declare@command@uncontrolled%
+ {slash}%
+ {}%
+ {%
+ % temporarily squeeze most into the separation
+ \pgfkeys{%
+ /yquant/operator/minimum width=0pt,%
+ }%
+ \preto\yquant@attrs@remaining{internal/squeeze slash,}%
+ \yquant@prepare%
+ {}%
+ {/yquant/operators/every slash}%
}
- \yquant@draw%
- {}%
- {/yquant/operators/every slash}%
- {}{}{#1}%
-}
+\yquant@langhelper@setup@attrs{slash}{}{}
% swap
-\yquant@langhelper@declare@command{swap}\yquant@lang@@swap
+\yquant@langhelper@declare@command%
+ {swap}%
+ \yquant@register@get@multiassingle
+ {%
+ \yquant@prepare%
+ {}%
+ {/yquant/operators/every swap}%
+ }
\yquant@langhelper@setup@attrs{swap}{}{}
-\def\yquant@lang@@swap{%
- \yquant@register@get@multiassingle%
- \yquant@draw%
- {}%
- {/yquant/operators/every swap}%
-}
% not
-\yquant@langhelper@declare@command{not}\yquant@lang@@not
+\yquant@langhelper@declare@command%
+ {not}%
+ {}%
+ {%
+ \yquant@prepare%
+ {}%
+ {/yquant/operators/every not}%
+ }
\yquant@langhelper@setup@attrs{not}{}{}
-\def\yquant@lang@@not{%
- \yquant@draw%
- {}%
- {/yquant/operators/every not}%
-}
% alias to cnot
-\let\yquant@lang@cnot=\yquant@lang@not
+\yquant@langhelper@declare@command@alias{cnot}{not}
\yquant@langhelper@setup@attrs{cnot}{}{}
% measure
-\yquant@langhelper@declare@command@uncontrolled{measure}\yquant@lang@@measure
-\yquant@langhelper@setup@attrs{measure}{}{value,type}
-\def\yquant@lang@@measure{%
- \ifdefined\yquant@lang@attr@type%
- \yquant@register@type@fromstring\yquant@lang@attr@type\yquant@circuit@settype@to%
- \else%
- \let\yquant@circuit@settype@to=\yquant@register@type@c%
- \fi%
- \let\yquant@draw@callback@wire=\yquant@circuit@settype%
+\yquant@langhelper@declare@command@uncontrolled%
+ {measure}%
\yquant@register@get@allowmultitrue%
- \unless\ifcsname yquant@lang@attr@value\endcsname%
- \let\yquant@lang@attr@value=\empty%
- \fi%
- \expandafter\yquant@draw%
- \expandafter{\yquant@lang@attr@value}%
- {/yquant/operators/every measure}%
- {}{}%
-}
+ {%
+ \ifdefined\yquant@lang@attr@type%
+ \yquant@register@type@fromstring\yquant@lang@attr@type\yquant@circuit@settype@to%
+ \else%
+ \let\yquant@circuit@settype@to=\yquant@register@type@c%
+ \fi%
+ \let\yquant@prepare@callback@prepare=\yquant@circuit@settype@prepare%
+ \let\yquant@prepare@callback@draw=\yquant@circuit@settype%
+ \unless\ifcsname yquant@lang@attr@value\endcsname%
+ \let\yquant@lang@attr@value=\empty%
+ \fi%
+ \ifdefined\yquant@lang@attr@directcontrol%
+ % direct control means that we must defer this operator until the next that has this/these targets as positive controls.
+ \expandafter\yquant@prepare@injection%
+ \expandafter{\yquant@lang@attr@value}%
+ {/yquant/operators/every measure}%
+ \else%
+ \expandafter\yquant@prepare%
+ \expandafter{\yquant@lang@attr@value}%
+ {/yquant/operators/every measure}%
+ \fi%
+ }
+\yquant@langhelper@setup@attrs{measure}{}{value,type,direct control,indirect control}
% measure (dmeter)
-\yquant@langhelper@declare@command@uncontrolled{dmeter}\yquant@lang@@dmeter
-\yquant@langhelper@setup@attrs{dmeter}{}{value,type}
-\def\yquant@lang@@dmeter{%
- \ifdefined\yquant@lang@attr@type%
- \yquant@register@type@fromstring\yquant@lang@attr@type\yquant@circuit@settype@to%
- \else%
- \let\yquant@circuit@settype@to=\yquant@register@type@c%
- \fi%
- \let\yquant@draw@callback@wire=\yquant@circuit@settype%
+\yquant@langhelper@declare@command@uncontrolled%
+ {dmeter}%
\yquant@register@get@allowmultitrue%
- \unless\ifcsname yquant@lang@attr@value\endcsname%
- \let\yquant@lang@attr@value=\empty%
- \fi%
- \expandafter\yquant@draw%
- \expandafter{\yquant@lang@attr@value}%
- {/yquant/operators/every dmeter}%
- {}{}%
-}
+ {%
+ \ifdefined\yquant@lang@attr@type%
+ \yquant@register@type@fromstring\yquant@lang@attr@type\yquant@circuit@settype@to%
+ \else%
+ \let\yquant@circuit@settype@to=\yquant@register@type@c%
+ \fi%
+ \let\yquant@prepare@callback@prepare=\yquant@circuit@settype@prepare%
+ \let\yquant@prepare@callback@draw=\yquant@circuit@settype%
+ \unless\ifcsname yquant@lang@attr@value\endcsname%
+ \let\yquant@lang@attr@value=\empty%
+ \fi%
+ \expandafter\yquant@prepare%
+ \expandafter{\yquant@lang@attr@value}%
+ {/yquant/operators/every dmeter}%
+ }
+\yquant@langhelper@setup@attrs{dmeter}{}{value,type}
% END_FOLD
% BEGIN_FOLD miscellaneous
-\yquant@langhelper@declare@command@uncontrolled{barrier}\yquant@lang@@barrier
-\yquant@langhelper@setup@attrs{barrier}{}{}
-\def\yquant@lang@@barrier{%
+\yquant@langhelper@declare@command@uncontrolled%
+ {barrier}%
\yquant@register@get@allowmultitrue%
- \yquant@draw%
- {}%
- {/yquant/operators/every barrier}%
- {}{}%
-}
+ {%
+ \yquant@prepare%
+ {}%
+ {/yquant/operators/every barrier}%
+ }%
+\yquant@langhelper@setup@attrs{barrier}{}{}
-\yquant@langhelper@declare@command@uncontrolled{correlate}\yquant@lang@@correlate
+\yquant@langhelper@declare@command@uncontrolled%
+ {correlate}%
+ {%
+ % do not call \yquant@register@get@multiassingle, we do not want to install a different multi line style!
+ \yquant@register@get@allowmultitrue%
+ \let\yquant@register@multi@splitparts=\yquant@register@multi@splitparts@sepall%
+ }{%
+ \yquant@prepare%
+ {}%
+ {/yquant/operators/every wave}%
+ }
\yquant@langhelper@setup@attrs{correlate}{}{}
-\def\yquant@lang@@correlate{%
- % do not call \yquant@register@get@multiassingle, we do not want to install a different multi line style!
- \yquant@register@get@allowmultitrue%
- \let\yquant@register@multi@splitparts=\yquant@register@multi@splitparts@sepall%
- \yquant@draw%
- {}%
- {/yquant/operators/every wave}%
- {}{}%
-}
-\yquant@langhelper@declare@command@uncontrolled{align}\yquant@lang@@align
+\yquant@langhelper@declare@command@uncontrolled%
+ {align}%
+ {}%
+ {%
+ \yquant@circuit@align\yquant@circuit@operator@targets%
+ }
\yquant@langhelper@setup@attrs{align}{}{}
-\def\yquant@lang@@align#1{%
- \yquant@register@get@ids{#1}%
- \yquant@circuit@align\yquant@register@get@ids@list%
-}
-\yquant@langhelper@declare@command@uncontrolled{hspace}\yquant@lang@@hspace
+\yquant@langhelper@declare@command@uncontrolled%
+ {hspace}%
+ {%
+ \yquant@langhelper@validate\amount\dimen\yquant@lang@attr@value%
+ }{%
+ \yquant@circuit@hspace\yquant@circuit@operator@targets\amount%
+ }
\yquant@langhelper@setup@attrs{hspace}{value}{}
-\def\yquant@lang@@hspace#1{%
- \yquant@langhelper@validate\amount\dimen\yquant@lang@attr@value%
- \yquant@register@get@ids{#1}%
- \yquant@circuit@hspace\yquant@register@get@ids@list\amount%
-}
-\yquant@langhelper@declare@command@uncontrolled{discard}\yquant@lang@@discard
+\yquant@langhelper@declare@command@uncontrolled%
+ {discard}%
+ {\yquant@langhelper@execclear@lastgatefalse}%
+ {%
+ \let\yquant@circuit@settype@to=\yquant@register@type@none%
+ \yquant@circuit@actonwires%
+ \yquant@circuit@settype@prepare%
+ \yquant@circuit@settype%
+ \yquant@circuit@operator@targets%
+ {}%
+ }
\yquant@langhelper@setup@attrs{discard}{}{}
-\def\yquant@lang@@discard#1{%
- \yquant@register@get@ids{#1}%
- \let\yquant@circuit@settype@to=\yquant@register@type@none%
- \yquant@circuit@actonwires%
- \yquant@circuit@settype%
- \yquant@register@get@ids@list%
- \yquant@register@type@none%
-}
-\yquant@langhelper@declare@command@uncontrolled{init}\yquant@lang@@init
+\yquant@langhelper@declare@command@uncontrolled%
+ {init}%
+ {%
+ \yquant@register@get@allowmultitrue%
+ % we will count how many registers contain the "clean" flag, and only if this is equal to the number of targets, we apply the shift.
+ \count8=0 %
+ }%
+ {%
+ \ifdefined\yquant@lang@attr@type%
+ \yquant@register@type@fromstring\yquant@lang@attr@type\yquant@circuit@settype@to%
+ \else%
+ % We don't know which type is desired. Scan all target registers and use the first wire that is available as a type.
+ \let\yquant@circuit@settype@to=\yquant@register@type@none%
+ \forlistloop\yquant@lang@@init@loop\yquant@circuit@operator@targets%
+ \ifx\yquant@circuit@settype@to\yquant@register@type@none%
+ % now we don't have a clue; assume it's a qubit
+ \let\yquant@circuit@settype@to=\yquant@register@type@q%
+ \fi%
+ \edef\yquant@lang@attr@type{%
+ \yquant@register@type@tostring\yquant@circuit@settype@to%
+ }%
+ \fi%
+ \let\yquant@prepare@callback@prepare=\yquant@circuit@settype@prepare%
+ \let\yquant@prepare@callback@draw=\yquant@circuit@settype%
+ \let\yquant@prepare@multi=\yquant@prepare@multiinit%
+ \ifnum\count8=\numexpr\yquant@circuit@operator@maxctrl-\yquant@circuit@operator@minctrl+1\relax%
+ \def\yquant@config@operator@minimum@width{0pt}%
+ \preto\yquant@attrs@remaining{internal/move label,}%
+ \edef\cmd{%
+ \yquant@prepare%
+ {\unexpanded\expandafter{\yquant@lang@attr@value}}%
+ {/yquant/every label, /yquant/every initial label,%
+ /yquant/every \yquant@lang@attr@type\space label}%
+ }%
+ \else%
+ \edef\cmd{%
+ \yquant@prepare%
+ {\unexpanded\expandafter{\yquant@lang@attr@value}}%
+ {/yquant/every label, /yquant/every \yquant@lang@attr@type\space label}%
+ }%
+ \fi%
+ \cmd%
+ }
\yquant@langhelper@setup@attrs{init}{value}{type}
+
+\protected\def\yquant@lang@@init@loop#1{%
+ \ifyquant@firsttoken\yquant@register@multi{#1}{%
+ \let\yquant@register@multi@contiguous=\yquant@lang@@init@multi@@extract%
+ \@fifthoffive#1%
+ % we should reset multi@contiguous to the original command; but this is really just a placeholder. As long as it is \protected, everything is fine.
+ }{%
+ \edef\yquant@circuit@settype@to{\yquant@register@get@type{#1}}%
+ }%
+ \unless\ifx\yquant@circuit@settype@to\yquant@register@type@none%
+ \expandafter\listbreak%
+ \fi%
+}
+
\protected\def\yquant@lang@@init@multi@@extract#1#2#3{%
\yquant@for \yquant@i := #1 to #2 {%
\edef\yquant@circuit@settype@to{\yquant@register@get@type\yquant@i}%
@@ -615,95 +643,64 @@
}%
}
-\protected\def\yquant@lang@@init#1{%
+\yquant@langhelper@declare@command@uncontrolled%
+ {output}%
\yquant@register@get@allowmultitrue%
- \yquant@register@get@ids{#1}%
- \ifdefined\yquant@lang@attr@type%
- \yquant@register@type@fromstring\yquant@lang@attr@type\yquant@circuit@settype@to%
- \else%
- % We don't know which type is desired. Scan all target registers and use the first wire that is available as a type.
- \let\yquant@circuit@settype@to=\yquant@register@type@none%
- \def\do##1{%
- \ifyquant@firsttoken\yquant@register@multi{##1}{%
- \let\yquant@register@multi@contiguous=\yquant@lang@@init@multi@@extract%
- \@fifthoffive##1%
- % we should reset multi@contiguous to the original command; but this is really just a placeholder. As long as it is \protected, everything is fine.
- }{%
- \edef\yquant@circuit@settype@to{\yquant@register@get@type{##1}}%
- }%
- \unless\ifx\yquant@circuit@settype@to\yquant@register@type@none%
- \expandafter\listbreak%
- \fi%
- }%
- \dolistloop\yquant@register@get@ids@list%
- \ifx\yquant@circuit@settype@to\yquant@register@type@none%
- % now we don't have a clue; assume it's a qubit
- \let\yquant@circuit@settype@to=\yquant@register@type@q%
- \fi%
- \edef\yquant@lang@attr@type{%
- \yquant@register@type@tostring\yquant@circuit@settype@to%
- }%
- \fi%
- \let\yquant@draw@callback@wire=\yquant@circuit@settype%
- \let\yquant@draw@@multi=\yquant@draw@@multiinit%
- \yquant@circuit@operator{}{}{#1}%
- % special case: if there were no operations at any affected wire before, we will replace the wire description
- \ifdim\yquant@circuit@operator@x=\yquant@config@operator@sep\relax%
- \def\yquant@circuit@operator@x{-.5\dimen2}%
- \let\yquant@draw@finalize@ctrl@single=\yquant@draw@finalize@ctrl@singleinit%
- \let\yquant@draw@finalize@ctrl@multi=\yquant@draw@finalize@ctrl@multiinit%
- \expandafter\yquant@draw@%
- \expandafter{\yquant@lang@attr@value}%
- {/yquant/every label, /yquant/every initial label, /yquant/every \yquant@lang@attr@type\space label}%
- \else%
- \expandafter\yquant@draw@%
- \expandafter{\yquant@lang@attr@value}%
- {/yquant/every label, /yquant/every \yquant@lang@attr@type\space label}%
- \fi%
-}
-
-\yquant@langhelper@declare@command@uncontrolled{output}\yquant@lang@@output
+ \yquant@circuit@output%
\yquant@langhelper@setup@attrs{output}{value}{}
-\def\yquant@lang@@output#1{%
- \yquant@register@get@allowmultitrue%
- \yquant@register@get@ids{#1}%
- \expandafter\yquant@circuit@output\expandafter{\yquant@register@get@ids@list}%
-}
-\yquant@langhelper@declare@command@uncontrolled{settype}\yquant@lang@@settype
+\yquant@langhelper@declare@command@uncontrolled%
+ {inspect}%
+ \yquant@register@get@allowmultitrue%
+ {%
+ \expandafter\yquant@prepare%
+ \expandafter{\yquant@lang@attr@value}%
+ {/yquant/operators/every inspect}%
+ }
+\yquant@langhelper@setup@attrs{inspect}{value}{}
+
+\yquant@langhelper@declare@command@uncontrolled%
+ {settype}%
+ {\yquant@langhelper@execclear@lastgatefalse}%
+ {%
+ \yquant@register@type@fromstring\yquant@lang@attr@value\yquant@circuit@settype@to%
+ \yquant@circuit@actonwires%
+ \yquant@circuit@settype@prepare%
+ \yquant@circuit@settype%
+ \yquant@circuit@operator@targets%
+ {}%
+ }
\yquant@langhelper@setup@attrs{settype}{value}{}
-\protected\def\yquant@lang@@settype#1{%
- \yquant@register@get@ids{#1}%
- \yquant@register@type@fromstring\yquant@lang@attr@value\yquant@circuit@settype@to%
- \yquant@circuit@actonwires%
- \yquant@circuit@settype%
- \yquant@register@get@ids@list%
- {}%
-}
-
-\def\yquant@lang@setwire{%
- \PackageWarning{yquant.sty}{`setwire' gate is deprecated as of yquant 0.1.2. Use `settype' instead.}%
- \yquant@lang@settype%
-}
-\yquant@langhelper@setup@attrs{setwire}{value}{}
-\yquant@langhelper@declare@command@uncontrolled{setstyle}\yquant@lang@@setstyle
+\ifnum\yquant@compat<2 %
+ \def\yquant@lang@setwire{%
+ \PackageWarning{yquant.sty}{`setwire' gate is deprecated as of yquant 0.1.2. Use `settype' instead.}%
+ \yquant@lang@settype%
+ }
+ \yquant@langhelper@setup@attrs{setwire}{value}{}
+\fi
+
+\yquant@langhelper@declare@command@uncontrolled%
+ {setstyle}%
+ {\yquant@langhelper@execclear@lastgatefalse}%
+ {%
+ \yquant@circuit@actonwires%
+ \@gobbletwo%
+ \yquant@circuit@setstyle%
+ \yquant@circuit@operator@targets%
+ {{\yquant@lang@attr@value}}%
+ }
\yquant@langhelper@setup@attrs{setstyle}{value}{}
-\protected\def\yquant@lang@@setstyle#1{%
- \yquant@register@get@ids{#1}%
- \yquant@circuit@actonwires%
- \yquant@circuit@setstyle%
- \yquant@register@get@ids@list%
- {{\yquant@lang@attr@value}}%
-}
-\yquant@langhelper@declare@command@uncontrolled{addstyle}\yquant@lang@@addstyle
+\yquant@langhelper@declare@command@uncontrolled%
+ {addstyle}%
+ {\yquant@langhelper@execclear@lastgatefalse}%
+ {%
+ \yquant@circuit@actonwires%
+ \@gobbletwo%
+ \yquant@circuit@addstyle%
+ \yquant@circuit@operator@targets%
+ {{\yquant@lang@attr@value}}%
+ }
\yquant@langhelper@setup@attrs{addstyle}{value}{}
-\protected\def\yquant@lang@@addstyle#1{%
- \yquant@register@get@ids{#1}%
- \yquant@circuit@actonwires%
- \yquant@circuit@addstyle%
- \yquant@register@get@ids@list%
- {{\yquant@lang@attr@value}}%
-}
% END_FOLD \ No newline at end of file