summaryrefslogtreecommitdiff
path: root/graphics/pgf/contrib/yquant/tex/yquant-registers.tex
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/pgf/contrib/yquant/tex/yquant-registers.tex')
-rw-r--r--graphics/pgf/contrib/yquant/tex/yquant-registers.tex355
1 files changed, 302 insertions, 53 deletions
diff --git a/graphics/pgf/contrib/yquant/tex/yquant-registers.tex b/graphics/pgf/contrib/yquant/tex/yquant-registers.tex
index 18a23662d3..c90a44614c 100644
--- a/graphics/pgf/contrib/yquant/tex/yquant-registers.tex
+++ b/graphics/pgf/contrib/yquant/tex/yquant-registers.tex
@@ -3,6 +3,38 @@
\def\yquant@register@type@c{2}
\def\yquant@register@type@qs{3}
+\def\yquant@register@type@tostring#1{%
+ \ifcase#1 %
+ nobit%
+ \or%
+ qubit%
+ \or%
+ cbit%
+ \or%
+ qubits%
+ \else%
+ \PackageError{yquant.sty}{Internal inconsistency detected}%
+ {Unknown wire type: `#1'.}%
+ \fi%
+}
+
+\protected\def\yquant@register@type@fromstring#1#2{%
+ \expandafter\ifstrequal\expandafter{#1}{qubit}%
+ {\let#2=\yquant@register@type@q}%
+ {%
+ \expandafter\ifstrequal\expandafter{#1}{cbit}%
+ {\let#2=\yquant@register@type@c}%
+ {%
+ \expandafter\ifstrequal\expandafter{#1}{qubits}%
+ {\let#2=\yquant@register@type@qs}%
+ {%
+ \PackageError{yquant.sty}{Invalid bit type: `#1'}%
+ {Use one of `qubit', `cbit', or `qubits'.}%
+ }%
+ }%
+ }%
+}
+
% Internally, we store the register information in a single macro. Indeed, this is almost always faster than using multiple macros (at least in the way implemented here), apart from changing a single type of information, which is almost as fast.
% BEGIN_FOLD Constructor: create single register and cleanup environment
@@ -16,17 +48,55 @@
\csxdef{\yquant@prefix register@\csname\yquant@prefix registers\endcsname}{%
{#1}% type
{#2}% x pos
- {\yquant@config@register@minimum@height}% height; at the end, the y position
- {{0pt}{0pt}{}{}}% wire start positions and clipping
+ {{\the\dimexpr.5\dimexpr\yquant@config@register@minimum@height\relax\relax}%
+ {\the\dimexpr.5\dimexpr\yquant@config@register@minimum@height\relax\relax}}% height and depth; at the end, the y position
+ {{\yquant@env@create@x}{\yquant@env@create@x}{}{}}% wire start positions and clipping
{}% wire style
}%
\global\csletcs{\yquant@prefix registername@#3[#4]}{\yquant@prefix registers}%
- \csxdef{\yquant@prefix registerhigh@\reg}{#4}%
+ \csxdef{\yquant@prefix registerhigh@#3}{#4}%
\yquant@cleanup@csadd{\yquant@prefix register@\csname\yquant@prefix registers\endcsname}%
\yquant@cleanup@csadd{\yquant@prefix registername@#3[#4]}%
\ifnum0=#4\relax%
- \yquant@cleanup@csadd{\yquant@prefix registerhigh@\reg}%
+ \yquant@cleanup@csadd{\yquant@prefix registerhigh@#3}%
+ \fi%
+}
+
+% in a subcircuit, create a new register that is only an alias for an existing register in the outer circuit.
+% #5: id in the outer circuit
+\protected\def\yquant@register@alias#1#2#3#4#5{%
+ \csnumgdef{\yquant@prefix registers}%
+ {\csname\yquant@prefix registers\endcsname+1}%
+ \ifcsname\yquant@parent registermap@#5\endcsname%
+ % the parent is already an alias itself, pass this on transparently
+ \global\csletcs%
+ {\yquant@prefix registermap@\csname\yquant@prefix registers\endcsname}%
+ {\yquant@parent registermap@#5}%
+ \else%
+ \csxdef{\yquant@prefix registermap@\csname\yquant@prefix registers\endcsname}%
+ {\yquant@parent register@#5}%
+ \fi%
+ % even though this is an alias, we still need to keep track of its internal dimensions
+ \csgdef{\yquant@prefix registerdim@\csname\yquant@prefix registers\endcsname}%
+ {{0pt}{0pt}}%
+ \yquant@cleanup@csadd{\yquant@prefix registerdim@\csname\yquant@prefix registers\endcsname}%
+ \global\csletcs{\yquant@prefix registername@#3[#4]}{\yquant@prefix registers}%
+ \csxdef{\yquant@prefix registerhigh@#3}{#4}%
+ \yquant@cleanup@csadd{\yquant@prefix registermap@\csname\yquant@prefix registers\endcsname}%
+ \yquant@cleanup@csadd{\yquant@prefix registername@#3[#4]}%
+ \ifnum0=#4\relax%
+ \yquant@cleanup@csadd{\yquant@prefix registerhigh@#3}%
+ \fi%
+ \csxdef{\yquant@prefix lastinput}{{\csname\yquant@prefix registers\endcsname}{#5}}%
+ \unless\ifcsname\yquant@prefix firstinput\endcsname%
+ \csxdef{\yquant@prefix firstinput}{{\csname\yquant@prefix registers\endcsname}{#5}}%
+ \yquant@cleanup@csadd{\yquant@prefix firstinput}%
+ \yquant@cleanup@csadd{\yquant@prefix lastinput}%
\fi%
+ \expandafter\yquant@register@set@@aux%
+ \csname\csname\yquant@prefix registermap@\csname\yquant@prefix registers\endcsname\endcsname\endcsname%
+ \yquant@register@set@x@aux%
+ {#2}%
}
% END_FOLD
@@ -43,19 +113,17 @@
% same as before, but resolves to the _index_ of the last register
\protected\def\yquant@register@get@id@high#1#2{%
- \ifcsname\yquant@prefix registerhigh@#2\endcsname%
- \letcs#1{\yquant@prefix registerhigh@#2}%
- \else%
+ \unless\ifcsname\yquant@prefix registerhigh@#2\endcsname%
\yquant@register@get@id@lazycreate{#2}%
- \letcs#1{\yquant@prefix registers}%
\fi%
+ \letcs#1{\yquant@prefix registerhigh@#2}%
}
% In the lazy mode, we create all unknown registers on-the-fly.
\def\yquant@register@get@id@lazycreate#1{%
\ifyquant@env@lazy%
% In principle, we could just call \yquant@lang@@qubit. However, if access to a vector register is desired and a _part_ of this does already exist (though not the requested index), we only create the missing registers.
- \yquant@register@get@id@lazycreate@parse#1[;
+ \yquant@register@get@id@lazycreate@parse#1[;%
\else%
\PackageError{yquant.sty}{Register `#1' unknown}%
{You referred to an unknown register.
@@ -96,13 +164,14 @@
\yquant@for \idx := \idx to \numexpr \len -1\relax {%
\yquant@register@define%
\yquant@register@type@q%
- {0pt}%
- \reg\idx
+ {\yquant@env@create@x}%
+ \reg\idx%
% Prepare to shipout
\csxappto{\yquant@prefix draw}{%
\yquant@lang@create@draw{\csname\yquant@prefix registers\endcsname}%
{0pt}%
{qubit}%
+ 0%
{}%
{}%
}%
@@ -137,7 +206,10 @@
\catcode`(=\active%
\def[##1]{\yquant@register@get@ids@@index{##1}}%
\def(##1){\yquant@register@get@ids@@multi{##1}}%
- \edef\yquant@register@get@ids@retokenized{\scantokens{#1\noexpand}}%
+ % this is also invoked by other languages which might have completely redefined all catcodes (qasm redefines the backslash), so don't just add \noexpand at the end of the \scantokens...
+ \everyeof{\noexpand}%
+ \endlinechar=-1 %
+ \edef\yquant@register@get@ids@retokenized{\scantokens{#1}}%
\expandafter%
\endgroup%
\expandafter\docsvlist\expandafter{\yquant@register@get@ids@retokenized}%
@@ -239,7 +311,7 @@
}%
\count0=2147483647 %
\csletcs{ifallowmain}{iffalse}%
- }{
+ }{%
\let\yquant@register@get@ids@norange@checkindex@setmain=\relax%
}%
\else%
@@ -346,7 +418,7 @@
\expandafter\yquant@register@get@id\expandafter\idx\expandafter{\idx}%
\count6=\idx%
\csletcs{ifallowmain}{iffalse}%
- }{
+ }{%
\yquant@register@get@id\idx{\current[#1]}%
}%
\else%
@@ -575,50 +647,99 @@
}%
}
+\protected\def\yquant@register@multi@splitparts@sort{%
+ \yquant@sort@list\yquant@register@get@ids@list\yquant@sort@ascending%
+}
+
\protected\def\yquant@register@get@multiassingle{%
\yquant@register@get@allowmultitrue%
\let\yquant@register@multi@splitparts=\yquant@register@multi@splitparts@sepall%
\preto\yquant@attrs@remaining{/yquant/operator/multi as single,}%
}
+
+\protected\def\yquant@register@get@multiaslist{%
+ \yquant@register@get@allowmultitrue%
+ \let\yquant@register@multi@splitparts=\yquant@register@multi@splitparts@sort%
+}
+
+\let\yquant@register@multi@reset@original@splitparts=\yquant@register@multi@splitparts%
+\protected\def\yquant@register@reset@multi{%
+% \yquant@register@get@allowmultifalse% not needed, as \yquant@circuit@operator automatically resets it
+ \let\yquant@register@multi@splitparts=\yquant@register@multi@reset@original@splitparts%
+}
% END_FOLD
% BEGIN_FOLD Getters: extract the requested information from the register with given id
\def\yquant@register@get@type#1{%
- \expandafter\expandafter\expandafter%
- \yquant@register@get@type@aux\csname\yquant@prefix register@#1\endcsname%
+ \ifcsname\yquant@prefix registermap@#1\endcsname%
+ \expandafter\expandafter\expandafter%
+ \yquant@register@get@type@aux\csname\csname\yquant@prefix registermap@#1\endcsname\endcsname%
+ \else%
+ \expandafter\expandafter\expandafter%
+ \yquant@register@get@type@aux\csname\yquant@prefix register@#1\endcsname%
+ \fi%
}
\def\yquant@register@get@type@aux#1#2#3#4#5{#1}
\def\yquant@register@get@x#1{%
- \expandafter\expandafter\expandafter%
- \yquant@register@get@x@aux\csname\yquant@prefix register@#1\endcsname%
+ \ifcsname\yquant@prefix registermap@#1\endcsname%
+ \expandafter\expandafter\expandafter%
+ \yquant@register@get@x@aux\csname\csname\yquant@prefix registermap@#1\endcsname\endcsname%
+ \else%
+ \expandafter\expandafter\expandafter%
+ \yquant@register@get@x@aux\csname\yquant@prefix register@#1\endcsname%
+ \fi%
}
\def\yquant@register@get@x@aux#1#2#3#4#5{#2}
\def\yquant@register@get@height#1{%
- \expandafter\expandafter\expandafter%
- \yquant@register@get@height@aux\csname\yquant@prefix register@#1\endcsname%
+ \ifcsname\yquant@prefix registermap@#1\endcsname%
+ \expandafter\expandafter\expandafter%
+ \@firstoftwo\csname\yquant@prefix registerdim@#1\endcsname%
+ \else%
+ \expandafter\expandafter\expandafter%
+ \yquant@register@get@height@aux\csname\yquant@prefix register@#1\endcsname%
+ \fi%
}
-\def\yquant@register@get@height@aux#1#2#3#4#5{#3}
+\def\yquant@register@get@height@aux#1#2#3#4#5{\@firstoftwo#3}
+
+\def\yquant@register@get@depth#1{%
+ \ifcsname\yquant@prefix registermap@#1\endcsname%
+ \expandafter\expandafter\expandafter%
+ \@secondoftwo\csname\yquant@prefix registerdim@#1\endcsname%
+ \else%
+ \expandafter\expandafter\expandafter%
+ \yquant@register@get@depth@aux\csname\yquant@prefix register@#1\endcsname%
+ \fi%
+}
+
+\def\yquant@register@get@depth@aux#1#2#3#4#5{\@secondoftwo#3}
% The y parameter get macros exist in two forms: The protected one is used during the storage to the draw macro; it should never be executed. The env environment then maps them to their proper expandable forms.
-\protected\def\yquant@register@get@@protected{%
+\protected\def\yquant@register@get@y{%
\PackageError%
{yquant.sty}%
{Execution of a get-y macro in an illegal context}%
{get-y macros may not be called unless the yquant environment ends.}%
}
-\let\yquant@register@get@y=\yquant@register@get@@protected
-\let\yquant@register@y=\yquant@register@get@@protected
% This plays a similar role: It must never be expanded before the tikz command is invoked (because it does not exist).
-\let\nodepart=\yquant@register@get@@protected
+\protected\def\nodepart{}
-% getting the y position is the same as getting the height parameter, since we will reuse it at the end.
-\let\yquant@register@get@y@unprotected=\yquant@register@get@height
+\def\yquant@register@get@y@unprotected#1{%
+ \ifcsname\yquant@prefix registermap@#1\endcsname%
+ \expandafter\expandafter\expandafter%
+ \yquant@register@get@y@aux\csname\csname\yquant@prefix registermap@#1\endcsname\endcsname%
+ \else%
+ \expandafter\expandafter\expandafter%
+ \yquant@register@get@y@aux\csname\yquant@prefix register@#1\endcsname%
+ \fi%
+}
+
+\def\yquant@register@get@y@aux#1#2#3#4#5{#3}
% y distance between two registers.
\def\yquant@register@get@ydist#1#2{%
@@ -626,17 +747,23 @@
{\the\dimexpr\yquant@register@get@y{#2}-\yquant@register@get@y{#1}\relax}%
}
-% y position of the current register
-\def\yquant@register@y@unprotected{0pt}%
-
\protected\def\yquant@register@get@y@@expandable{%
\let\yquant@register@get@y=\yquant@register@get@y@unprotected%
- \let\yquant@register@y=\yquant@register@y@unprotected%
}
\def\yquant@register@get@lastwire#1{%
- \expandafter\expandafter\expandafter%
- \yquant@register@get@lastwire@aux\csname\yquant@prefix register@#1\endcsname%
+ \ifcsname\yquant@prefix registermap@#1\endcsname%
+ \expandafter\@firstoftwo%
+ \else%
+ \expandafter\@secondoftwo%
+ \fi%
+ {%
+ \expandafter\expandafter\expandafter%
+ \yquant@register@get@lastwire@aux\csname\csname\yquant@prefix registermap@#1\endcsname\endcsname%
+ }{%
+ \expandafter\expandafter\expandafter%
+ \yquant@register@get@lastwire@aux\csname\yquant@prefix register@#1\endcsname%
+ }%
}
\protected\def\yquant@register@get@lastwire@aux#1#2#3#4#5#6{%
@@ -644,15 +771,30 @@
}
\def\yquant@register@get@style#1{%
- \expandafter\expandafter\expandafter%
- \yquant@register@get@style@aux\csname\yquant@prefix register@#1\endcsname%
+ \ifcsname\yquant@prefix registermap@#1\endcsname%
+ \expandafter\expandafter\expandafter%
+ \yquant@register@get@style@aux\csname\csname\yquant@prefix registermap@#1\endcsname\endcsname%
+ \else%
+ \expandafter\expandafter\expandafter%
+ \yquant@register@get@style@aux\csname\yquant@prefix register@#1\endcsname%
+ \fi%
}
\def\yquant@register@get@style@aux#1#2#3#4#5{#5}
\def\yquant@register@get@typeywire#1{%
- \expandafter\expandafter\expandafter%
- \yquant@register@get@typeywire@aux\csname\yquant@prefix register@#1\endcsname%
+ \ifcsname\yquant@prefix registermap@#1\endcsname%
+ \expandafter\@firstoftwo%
+ \else%
+ \expandafter\@secondoftwo%
+ \fi%
+ {%
+ \expandafter\expandafter\expandafter%
+ \yquant@register@get@typeywire@aux\csname\csname\yquant@prefix registermap@#1\endcsname\endcsname%
+ }{%
+ \expandafter\expandafter\expandafter%
+ \yquant@register@get@typeywire@aux\csname\yquant@prefix register@#1\endcsname%
+ }%
}
\protected\def\yquant@register@get@typeywire@aux#1#2#3#4#5#6#7#8{%
@@ -695,12 +837,23 @@
% BEGIN_FOLD Setters: change register information
\protected\long\def\yquant@register@set@@aux#1#2#3{%
- \long\xdef#1{\expandafter#2#1{#3}}%
+ \xdef#1{\expandafter#2#1{#3}}%
}
\protected\def\yquant@register@set@type#1{%
- \expandafter\yquant@register@set@@aux%
- \csname\yquant@prefix register@#1\endcsname\yquant@register@set@type@aux%
+ \ifcsname\yquant@prefix registermap@#1\endcsname%
+ \expandafter\@firstoftwo%
+ \else%
+ \expandafter\@secondoftwo%
+ \fi%
+ {%
+ \expandafter\yquant@register@set@@aux%
+ \csname\csname\yquant@prefix registermap@#1\endcsname\endcsname%
+ }{%
+ \expandafter\yquant@register@set@@aux%
+ \csname\yquant@prefix register@#1\endcsname%
+ }%
+ \yquant@register@set@type@aux%
}
\long\def\yquant@register@set@type@aux#1#2#3#4#5#6{%
@@ -708,8 +861,19 @@
}
\protected\def\yquant@register@set@x#1{%
- \expandafter\yquant@register@set@@aux%
- \csname\yquant@prefix register@#1\endcsname\yquant@register@set@x@aux%
+ \ifcsname\yquant@prefix registermap@#1\endcsname%
+ \expandafter\@firstoftwo%
+ \else%
+ \expandafter\@secondoftwo%
+ \fi%
+ {%
+ \expandafter\yquant@register@set@@aux%
+ \csname\csname\yquant@prefix registermap@#1\endcsname\endcsname%
+ }{%
+ \expandafter\yquant@register@set@@aux%
+ \csname\yquant@prefix register@#1\endcsname%
+ }%
+ \yquant@register@set@x@aux%
}
\long\def\yquant@register@set@x@aux#1#2#3#4#5#6{%
@@ -717,25 +881,99 @@
}
\protected\def\yquant@register@update@height#1#2{%
- \ifdim#2>\yquant@register@get@height{#1} %
- \expandafter\yquant@register@set@@aux%
- \csname\yquant@prefix register@#1\endcsname\yquant@register@set@height@aux{#2}%
+ \ifcsname\yquant@prefix registermap@#1\endcsname%
+ \ifdim#2>%
+ \expandafter\expandafter\expandafter%
+ \@firstoftwo\csname\yquant@prefix registerdim@#1\endcsname%
+ \relax%
+ \csxdef{\yquant@prefix registerdim@#1}{%
+ {#2}%
+ {\expandafter\expandafter\expandafter%
+ \@secondoftwo\csname\yquant@prefix registerdim@#1\endcsname}%
+ }%
+ \fi%
+ \else%
+ \ifdim#2>%
+ \expandafter\expandafter\expandafter%
+ \yquant@register@get@height@aux\csname\yquant@prefix register@#1\endcsname%
+ \relax%
+ \expandafter\yquant@register@set@@aux%
+ \csname\yquant@prefix register@#1\endcsname%
+ \yquant@register@set@height@aux{#2}%
+ \fi%
+ \fi%
+}
+
+\long\def\yquant@register@set@height@aux#1#2#3#4#5#6{%
+ \unexpanded{{#1}{#2}}%
+ {{#6}{\unexpanded\expandafter{\@secondoftwo#3}}}%
+ \unexpanded{{#4}{#5}}%
+}
+
+\protected\def\yquant@register@update@depth#1#2{%
+ \ifcsname\yquant@prefix registermap@#1\endcsname%
+ \ifdim#2>%
+ \expandafter\expandafter\expandafter%
+ \@secondoftwo\csname\yquant@prefix registerdim@#1\endcsname%
+ \relax%
+ \csxdef{\yquant@prefix registerdim@#1}{%
+ {\expandafter\expandafter\expandafter%
+ \@firstoftwo\csname\yquant@prefix registerdim@#1\endcsname}%
+ {#2}%
+ }%
+ \fi%
+ \else%
+ \ifdim#2>%
+ \expandafter\expandafter\expandafter%
+ \yquant@register@get@depth@aux\csname\yquant@prefix register@#1\endcsname%
+ \relax%
+ \expandafter\yquant@register@set@@aux%
+ \csname\yquant@prefix register@#1\endcsname%
+ \yquant@register@set@depth@aux{#2}%
+ \fi%
\fi%
}
+\long\def\yquant@register@set@depth@aux#1#2#3#4#5#6{%
+ \unexpanded{{#1}{#2}}%
+ {{\unexpanded\expandafter{\@firstoftwo#3}}{#6}}%
+ \unexpanded{{#4}{#5}}%
+}
+
\protected\def\yquant@register@set@y#1{%
- \expandafter\yquant@register@set@@aux%
- \csname\yquant@prefix register@#1\endcsname\yquant@register@set@height@aux%
+ \ifcsname\yquant@prefix registermap@#1\endcsname%
+ \expandafter\@firstoftwo%
+ \else%
+ \expandafter\@secondoftwo%
+ \fi%
+ {%
+ \expandafter\yquant@register@set@@aux%
+ \csname\csname\yquant@prefix registermap@#1\endcsname\endcsname%
+ }{%
+ \expandafter\yquant@register@set@@aux%
+ \csname\yquant@prefix register@#1\endcsname%
+ }%
+ \yquant@register@set@y@aux%
}
-% Set the currently used register
-\long\def\yquant@register@set@height@aux#1#2#3#4#5#6{%
+\long\def\yquant@register@set@y@aux#1#2#3#4#5#6{%
\unexpanded{{#1}{#2}}{#6}\unexpanded{{#4}{#5}}%
}
\protected\def\yquant@register@set@lastwire#1{%
- \expandafter\yquant@register@set@@aux%
- \csname\yquant@prefix register@#1\endcsname\yquant@register@set@lastwire@aux%
+ \ifcsname\yquant@prefix registermap@#1\endcsname%
+ \expandafter\@firstoftwo%
+ \else%
+ \expandafter\@secondoftwo%
+ \fi%
+ {%
+ \expandafter\yquant@register@set@@aux%
+ \csname\csname\yquant@prefix registermap@#1\endcsname\endcsname%
+ }{%
+ \expandafter\yquant@register@set@@aux%
+ \csname\yquant@prefix register@#1\endcsname%
+ }%
+ \yquant@register@set@lastwire@aux%
}
\long\def\yquant@register@set@lastwire@aux#1#2#3#4#5#6{%
@@ -743,8 +981,19 @@
}
\protected\def\yquant@register@set@style#1{%
- \expandafter\yquant@register@set@@aux%
- \csname\yquant@prefix register@#1\endcsname\yquant@register@set@style@aux%
+ \ifcsname\yquant@prefix registermap@#1\endcsname%
+ \expandafter\@firstoftwo%
+ \else%
+ \expandafter\@secondoftwo%
+ \fi%
+ {%
+ \expandafter\yquant@register@set@@aux%
+ \csname\csname\yquant@prefix registermap@#1\endcsname\endcsname%
+ }{%
+ \expandafter\yquant@register@set@@aux%
+ \csname\yquant@prefix register@#1\endcsname%
+ }%
+ \yquant@register@set@style@aux%
}
\long\def\yquant@register@set@style@aux#1#2#3#4#5#6{%