2
$\begingroup$

In Example 6, the case of multiple qubit controlled custom $U$ gate is covered, but I want to reuse the standard NOT symbol i.e. $\bigoplus$.

enter image description here

Say I want to draw this circuit, but with a $\bigoplus$ instead of the $U$ in a box. Clearly, defining a new custom gate isn't going to work as it'll still place the $\bigoplus$ in a box. I was trying to do something like this:

qubit   j0
qubit   j1
qubit   j2
qubit   j3

toffoli j0,j1,j2
X   j0
cnot    j2,j3,j0,j1
H   j2
measure j3

but as expected, I get the ERROR: [qgate] OOPS! line 8 wrong number of qubits in cnot j2,j3,j0,j1. There's also the toffoli but even that is limited to a maximum of two control qubits. It's surprising that none of the other examples cover this case. So, any idea whether it's possible to draw a multiple qubit controlled NOT using the qasm2circ package?

$\endgroup$
1
$\begingroup$

I checked the source code in the qasm2tex.py file. On line 410 the if structure goes like:

if(m):
    (name,nctrl) = m.group(1).split(',')
    tex = m.group(2)
    if(tex=='bullet'):        # special for bullet, no \op{}
        texsym = r'\b'
    elif(tex.find(r'\dmeter')>=0):  # if meas, don't put in \op{}
        texsym = tex
    else:
        texsym = '\op{%s}' % tex
    nctrl = int(nctrl)
    if GateMasterDef.has_key(name):
        print "[qasm_parser] oops! duplicate def for op %s" % line
    else:
        GateMasterDef[name] = (nctrl+1, nctrl, texsym)
    # print "definition: %s" % m.group(1)
    continue

So there are no cases for handling oplus and times is handled, although they're defined along with bullet in the xyqcirc.tex file, as single qubit operations, i.e.

% single qubit operations

\def\op#1{*+[F]{\rule[-0.2ex]{0ex}{2.1ex}#1}}   % operator in box
\def\b{*={\bullet}}
\def\o{*={\oplus}}
\def\t{*={\times}}              % for swap gate
\def\sq{*=<6pt,6pt>[F]{}}           % square, for controlled-phase
\def\m#1{\left[\matrix{#1}\right]}      % matrix shortcut
\def\z{*+[]{\rule[-0.2ex]{0ex}{2.1ex}~|0\>}}    % re-init to |0>
\def\discard{*[]{\rule[-0.2ex]{0.75pt}{2.1ex}~}}    % vertical ``|''
\def\slash{*={/}}               % slash for wire bundles

This is most likely a bug. However, according to the qasm2tex.py docstring it was last updated by Ike (Isaac Chuang) on 2004/03/25 15:36:59, so I'm not hoping that it'll ever be officially fixed. Anyhow, the fix is just a four-line addition to qasm2tex.py, so I'm writing it down here just in case someone finds it helpful or wishes to write their own extension to the code:

if(m):
    (name,nctrl) = m.group(1).split(',')
    tex = m.group(2)
    if(tex=='bullet'):        # special for bullet, no \op{}
        texsym = r'\b'
    if(tex=='oplus'):
        texsym = r'\o'        # special for oplus, no \op{}
    if(tex=='times'):
        texsym = r'\t'        # special for times, no \op{}        
    elif(tex.find(r'\dmeter')>=0):  # if meas, don't put in \op{}
        texsym = tex
    else:
        texsym = '\op{%s}' % tex
    nctrl = int(nctrl)
    if GateMasterDef.has_key(name):
        print "[qasm_parser] oops! duplicate def for op %s" % line
    else:
        GateMasterDef[name] = (nctrl+1, nctrl, texsym)
    # print "definition: %s" % m.group(1)
    continue

Now to answer the original question, after the above fix has been made, the required QASM code and the corresponding TeX output is:

%   def cccnot,3,'oplus'
% 
%   qubit   j0
%   qubit   j1
%   qubit   j2
%   qubit   j3
% 
%   toffoli j0,j1,j2
%   X   j0
%   cccnot  j2,j3,j0,j1
%   H   j2
%   measure j3
% 

%  Time 01:
%    Gate 00 toffoli(j0,j1,j2)
%  Time 02:
%    Gate 01 X(j0)
%  Time 03:
%    Gate 02 cccnot(j2,j3,j0,j1)
%  Time 04:
%    Gate 03 H(j2)
%    Gate 04 measure(j3)

% Qubit circuit matrix:
%
% j0: gAxA, gBxA, gCxA, n  , n  
% j1: gAxB, n  , gCxB, n  , n  
% j2: gAxC, n  , gCxC, gDxC, n  
% j3: n  , n  , gCxD, gDxD, N  

\documentclass[11pt]{article}
\input{xyqcirc.tex}

% definitions for the circuit elements

\def\gAxA{\b\w\A{gAxA}}
\def\gAxB{\b\w\A{gAxB}}
\def\gAxC{\o\w\A{gAxC}}
\def\gBxA{\op{X}\w\A{gBxA}}
\def\gCxC{\b\w\A{gCxC}}
\def\gCxD{\b\w\A{gCxD}}
\def\gCxA{\b\w\A{gCxA}}
\def\gCxB{\o\w\A{gCxB}}
\def\gDxC{\op{H}\w\A{gDxC}}
\def\gDxD{\meter\w\A{gDxD}}

% definitions for bit labels and initial states

\def\bA{ \q{j_{0}}}
\def\bB{ \q{j_{1}}}
\def\bC{ \q{j_{2}}}
\def\bD{ \q{j_{3}}}

% The quantum circuit as an xymatrix

\xymatrix@R=5pt@C=10pt{
    \bA & \gAxA &\gBxA &\gCxA &\n   &\n  
\\  \bB & \gAxB &\n   &\gCxB &\n   &\n  
\\  \bC & \gAxC &\n   &\gCxC &\gDxC &\n  
\\  \bD & \n   &\n   &\gCxD &\gDxD &\N  
%
% Vertical lines and other post-xymatrix latex
%
\ar@{-}"gAxC";"gAxA"\ar@{-}"gAxC";"gAxB"
\ar@{-}"gCxB";"gCxC"\ar@{-}"gCxB";"gCxD"\ar@{-}"gCxB";"gCxA"
}

\end{document}

Circuit Diagram:

qasm2circ: Example 6 (replaced U with oplus)

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.