
    Edd                         d Z dgZddlmZ ddlmZmZmZmZm	Z	m
Z
mZmZmZmZ ddlmZ d Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Z G d d          ZdS )a  

qasm.py - Functions to parse a set of qasm commands into a SymPy Circuit.

Examples taken from Chuang's page: http://www.media.mit.edu/quanta/qasm2circ/

The code returns a circuit and an associated list of labels.

>>> from sympy.physics.quantum.qasm import Qasm
>>> q = Qasm('qubit q0', 'qubit q1', 'h q0', 'cnot q0,q1')
>>> q.get_circuit()
CNOT(1,0)*H(1)

>>> q = Qasm('qubit q0', 'qubit q1', 'cnot q0,q1', 'cnot q1,q0', 'cnot q0,q1')
>>> q.get_circuit()
CNOT(1,0)*CNOT(0,1)*CNOT(1,0)
Qasm    )prod)
HCNOTXZCGateCGateSSWAPSTCPHASE)Mzc                 8    t          |                                  S N)r   
splitlines)liness    :lib/python3.11/site-packages/sympy/physics/quantum/qasm.py	read_qasmr      s    !!##$$    c                 R    t          t          |                                            S r   )r   open	readlines)filenames    r   read_qasm_filer      s    h))++,,r   c                     || z
  dz
  S )zReorder qubit indices from largest to smallest.

    >>> from sympy.physics.quantum.qasm import flip_index
    >>> flip_index(0, 2)
    1
    >>> flip_index(1, 2)
    0
        )ins     r   
flip_indexr!   "   s     Q3q5Lr   c                 D    d| vr| S |                      d          d         S )zRemove everything following comment # characters in line.

    >>> from sympy.physics.quantum.qasm import trim
    >>> trim('nothing happens here')
    'nothing happens here'
    >>> trim('something #happens here')
    'something '
    #r   )split)lines    r   trimr&   -   s*     $ ::c??1r   c                 f    t          |          }t          |                    |           |          S )zGet qubit labels from the rest of the line,and return indices

    >>> from sympy.physics.quantum.qasm import get_index
    >>> get_index('q0', ['q0', 'q1'])
    1
    >>> get_index('q1', ['q0', 'q1'])
    0
    )lenr!   index)targetlabelsnqs      r   	get_indexr-   :   s+     
VBfll6**B///r   c                      fd| D             S )Nc                 0    g | ]}t          |          S r   )r-   ).0tr+   s     r   
<listcomp>zget_indices.<locals>.<listcomp>G   s#    222QIa  222r   r   )targetsr+   s    `r   get_indicesr4   F   s    2222'2222r   c              #   d   K   | D ]*}t          |          }|                                r&|V  +d S r   )r&   isspace)argsr%   s     r   nonblankr8   I   sC        Dzz<<>> 	




Fr   c                     |                                  }d                    |dd                    }t          |d                   d |                     d          D             fS )N r   r   c                 6    g | ]}|                                 S r   )strip)r0   ss     r   r2   zfullsplit.<locals>.<listcomp>T   s     !E!E!E!''))!E!E!Er   ,)r$   join
fixcommand)r%   wordsrests      r   	fullsplitrC   Q   sX    JJLLE88E!""IDeAh!E!ETZZ__!E!E!EEEr   c                 z    dg}|                                  } |D ]}|                     |d          } | dk    rdS | S )zwFix Qasm command names.

    Remove all of forbidden characters from command c, and
    replace 'def' with 'qdef'.
    - defqdef)lowerreplace)cforbidden_characterschars      r   r@   r@   V   sS      5			A$    IIdBEz vHr   c                 ^    |                      dd          } |                      dd          } | S )zReplace explicit quotes in a string.

    >>> from sympy.physics.quantum.qasm import stripquotes
    >>> stripquotes("'S'") == 'S'
    True
    >>> stripquotes('"S"') == 'S'
    True
    >>> stripquotes('S') == 'S'
    True
    "rF   ')rJ   )r=   s    r   stripquotesrQ   d   s/     	
		#rA			#rAHr   c                       e Zd ZdZd Zd Zd Zd Zd ZddZ	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )r   aV  Class to form objects from Qasm lines

    >>> from sympy.physics.quantum.qasm import Qasm
    >>> q = Qasm('qubit q0', 'qubit q1', 'h q0', 'cnot q0,q1')
    >>> q.get_circuit()
    CNOT(1,0)*H(1)
    >>> q = Qasm('qubit q0', 'qubit q1', 'cnot q0,q1', 'cnot q1,q0', 'cnot q0,q1')
    >>> q.get_circuit()
    CNOT(1,0)*CNOT(0,1)*CNOT(1,0)
    c                 `    i | _         g | _        g | _        i | _         | j        |  || _        d S r   )defscircuitr+   initsaddkwargs)selfr7   rX   s      r   __init__zQasm.__init__~   s6    	
$r   c                 4   t          |          D ]}t          |          \  }}| j                            |          r| j                            |          }|                     |          }t          |          dk    r*| j                             ||d                              | j                             ||d d         |d                              t          | |          rt          | |          } ||  t          d|z             d S )Nr   r   z!Function %s not defined. Skipping)r8   rC   rT   getindicesr(   rU   appendhasattrgetattrprint)rY   r   r%   commandrB   functionr^   s          r   rW   zQasm.add   s!   UOO 	E 	ED%dOOMGTy}}W%% E9==11,,t,,w<<1$ ML''(<(<====L''"wr{(K(KLLLLw'' E"411$9GCDDDD	E 	Er   c                 D    t          t          | j                            S r   )r   reversedrU   rY   s    r   get_circuitzQasm.get_circuit   s    HT\**+++r   c                 D    t          t          | j                            S r   )listrf   r+   rg   s    r   
get_labelszQasm.get_labels   s    HT[))***r   c                     ddl m} |                                 |                                 }} ||t	          |          || j                   d S )Nr   )CircuitPlot)r+   rV   )!sympy.physics.quantum.circuitplotrm   rh   rk   r(   rV   )rY   rm   rU   r+   s       r   plotz	Qasm.plot   sZ    AAAAAA**,,doo.?.?GS[[tzJJJJJJr   Nc                 V    | j                             |           |r|| j        |<   d S d S r   )r+   r_   rV   )rY   arginits      r   qubitz
Qasm.qubit   s2    3'4C''r   c                 ,    t          || j                  S r   )r4   r+   rY   r7   s     r   r^   zQasm.indices   s    4---r   c                 ,    t          || j                  S r   )r-   r+   rY   rq   s     r   r)   z
Qasm.index   s    dk***r   c                     d S r   r   ru   s     r   nopzQasm.nop   s    r   c                 z    | j                             t          |                     |                               d S r   )rU   r_   r   r)   rw   s     r   xzQasm.x   0    Adjjoo../////r   c                 z    | j                             t          |                     |                               d S r   )rU   r_   r   r)   rw   s     r   zzQasm.z   r|   r   c                 z    | j                             t          |                     |                               d S r   )rU   r_   r   r)   rw   s     r   hzQasm.h   r|   r   c                 z    | j                             t          |                     |                               d S r   )rU   r_   r   r)   rw   s     r   r=   zQasm.s   r|   r   c                 z    | j                             t          |                     |                               d S r   )rU   r_   r   r)   rw   s     r   r1   zQasm.t   r|   r   c                 z    | j                             t          |                     |                               d S r   )rU   r_   r   r)   rw   s     r   measurezQasm.measure   s0    Btzz#//00000r   c                 r    | j                             t          |                     ||g                      d S r   )rU   r_   r   r^   rY   a1a2s      r   cnotz	Qasm.cnot   3    D$,,Bx"8"89:::::r   c                 r    | j                             t          |                     ||g                      d S r   )rU   r_   r   r^   r   s      r   swapz	Qasm.swap   r   r   c                 r    | j                             t          |                     ||g                      d S r   )rU   r_   r   r^   r   s      r   cphasezQasm.cphase   s3    FDLL"b$:$:;<<<<<r   c                     |                      |||g          \  }}}| j                            t          ||ft	          |                               d S r   )r^   rU   r_   r
   r   )rY   r   r   a3i1i2i3s          r   toffolizQasm.toffoli   sO    \\2r2,//
BFB8QrUU3344444r   c                     |                      ||g          \  }}| j                            t          |t	          |                               d S r   )r^   rU   r_   r	   r   rY   r   r   fifjs        r   cxzQasm.cx   G    r2h''BE"aee,,-----r   c                     |                      ||g          \  }}| j                            t          |t	          |                               d S r   )r^   rU   r_   r	   r   r   s        r   czzQasm.cz   r   r   c                 &    t          d|           d S )Nz$defbox not supported yet. Skipping: )rb   ru   s     r   defboxzQasm.defbox   s    4d;;;;;r   c                     ddl m}m} t          |          }t	          |          }t          |          }|dk    r ||          | j        |<   d S  ||          | j        |<   d S )Nr   )CreateOneQubitGateCreateCGate)rn   r   r   intr@   rQ   rT   )rY   name	ncontrolssymbolr   r   rc   s          r   rH   z	Qasm.qdef   s    UUUUUUUU	NN	T""V$$q= 	<!,V!4!4DIg!3!3F!;!;DIgr   r   )__name__
__module____qualname____doc__rZ   rW   rh   rk   ro   rs   r^   r)   ry   r{   r~   r   r=   r1   r   r   r   r   r   r   r   r   rH   r   r   r   r   r   s   s       	 	  E E E , , ,+ + +K K K
( ( ( (. . .+ + +  0 0 00 0 00 0 00 0 00 0 01 1 1; ; ;; ; ;= = =5 5 5. . .. . .< < << < < < <r   N)r   __all__mathr   sympy.physics.quantum.gater   r   r   r   r	   r
   r   r   r   r   rn   r   r   r   r!   r&   r-   r4   r8   rC   r@   rQ   r   r   r   r   <module>r      s^   &        V V V V V V V V V V V V V V V V V V V V V V V V 0 0 0 0 0 0% % %- - -	 	 	  
0 
0 
03 3 3  F F F
    m< m< m< m< m< m< m< m< m< m<r   