
    sg                         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y)a  

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

Examples taken from Chuang's page: https://web.archive.org/web/20220120121541/https://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                 .    t        | j                          S N)r   
splitlines)liness    M/var/www/html/venv/lib/python3.12/site-packages/sympy/physics/quantum/qasm.py	read_qasmr      s    !!#$$    c                 @    t        t        |       j                          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                 6    d| vr| S | j                  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                 N    t        |      }t        |j                  |       |      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                 @    | D cg c]  }t        ||       c}S c c}w r   )r-   )targetsr+   ts      r   get_indicesr1   F   s    *12QIa 222s   c              #   Z   K   | D ]"  }t        |      }|j                         r| $ y wr   )r&   isspace)argsr%   s     r   nonblankr5   I   s4      Dz<<>
	
 s   )+c                     | j                         }dj                  |dd        }t        |d         |j                  d      D cg c]  }|j                          c}fS c c}w )N r   r   ,)r$   join
fixcommandstrip)r%   wordsrestss       r   	fullsplitr?   Q   sQ    JJLE88E!"IDeAhTZZ_!E!'')!EEE!Es   A c                 j    dg}| j                         } |D ]  }| j                  |d      }  | dk(  ry| 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   sE      5		A$  IIdB EzHr   c                 N    | j                  dd      } | j                  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
    "rB   ')rF   )r>   s    r   stripquotesrM   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y)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                 h    i | _         g | _        g | _        i | _         | j                  |  || _        y r   )defscircuitr+   initsaddkwargs)selfr4   rT   s      r   __init__zQasm.__init__~   s2    	
$r   c                    t        |      D ]  }t        |      \  }}| j                  j                  |      r| j                  j                  |      }| j	                  |      }t        |      dk(  r%| j                  j                   ||d                | j                  j                   ||d d |d                t        | |      rt        | |      } ||  t        d|z          y )Nr   r   z!Function %s not defined. Skipping)r5   r?   rP   getindicesr(   rQ   appendhasattrgetattrprint)rU   r   r%   commandr=   functionrZ   s          r   rS   zQasm.add   s    UO 	ED%dOMGTyy}}W%99==1,,t,w<1$LL''(<=LL''"wr{(KLw'"41$9GCD	Er   c                 >    t        t        | j                              S r   )r   reversedrQ   rU   s    r   get_circuitzQasm.get_circuit   s    HT\\*++r   c                 >    t        t        | j                              S r   )listrb   r+   rc   s    r   
get_labelszQasm.get_labels   s    HT[[)**r   c                     ddl m} | j                         | j                         }} ||t	        |      || j
                         y )Nr   )CircuitPlot)r+   rR   )!sympy.physics.quantum.circuitplotri   rd   rg   r(   rR   )rU   ri   rQ   r+   s       r   plotz	Qasm.plot   s4    A**,doo.?GS[tzzJr   Nc                 ^    | j                   j                  |       |r|| j                  |<   y y r   )r+   r[   rR   )rU   arginits      r   qubitz
Qasm.qubit   s%    34C4r   c                 .    t        || j                        S r   )r1   r+   rU   r4   s     r   rZ   zQasm.indices   s    4--r   c                 .    t        || j                        S r   )r-   r+   rU   rm   s     r   r)   z
Qasm.index   s    dkk**r   c                      y r   r   rq   s     r   nopzQasm.nop   s    r   c                 j    | j                   j                  t        | j                  |                   y r   )rQ   r[   r   r)   rs   s     r   xzQasm.x   !    Adjjo./r   c                 j    | j                   j                  t        | j                  |                   y r   )rQ   r[   r   r)   rs   s     r   zzQasm.z   rx   r   c                 j    | j                   j                  t        | j                  |                   y r   )rQ   r[   r   r)   rs   s     r   hzQasm.h   rx   r   c                 j    | j                   j                  t        | j                  |                   y r   )rQ   r[   r   r)   rs   s     r   r>   zQasm.s   rx   r   c                 j    | j                   j                  t        | j                  |                   y r   )rQ   r[   r   r)   rs   s     r   r0   zQasm.t   rx   r   c                 j    | j                   j                  t        | j                  |                   y r   )rQ   r[   r   r)   rs   s     r   measurezQasm.measure   s!    Btzz#/0r   c                 h    | j                   j                  t        | j                  ||g              y r   )rQ   r[   r   rZ   rU   a1a2s      r   cnotz	Qasm.cnot   &    D$,,Bx"89:r   c                 h    | j                   j                  t        | j                  ||g              y r   )rQ   r[   r   rZ   r   s      r   swapz	Qasm.swap   r   r   c                 h    | j                   j                  t        | j                  ||g              y r   )rQ   r[   r   rZ   r   s      r   cphasezQasm.cphase   s&    FDLL"b$:;<r   c                     | j                  |||g      \  }}}| j                  j                  t        ||ft	        |                   y r   )rZ   rQ   r[   r
   r   )rU   r   r   a3i1i2i3s          r   toffolizQasm.toffoli   s=    \\2r2,/
BFB8QrU34r   c                     | j                  ||g      \  }}| j                  j                  t        |t	        |                   y r   )rZ   rQ   r[   r	   r   rU   r   r   fifjs        r   cxzQasm.cx   5    r2h'BE"ae,-r   c                     | j                  ||g      \  }}| j                  j                  t        |t	        |                   y r   )rZ   rQ   r[   r	   r   r   s        r   czzQasm.cz   r   r   c                     t        d|       y )Nz$defbox not supported yet. Skipping: )r^   rq   s     r   defboxzQasm.defbox   s    4d;r   c                     ddl m}m} t        |      }t	        |      }t        |      }|dkD  r ||      | j                  |<   y  ||      | j                  |<   y )Nr   )CreateOneQubitGateCreateCGate)rj   r   r   intr:   rM   rP   )rU   name	ncontrolssymbolr   r   r_   s          r   rD   z	Qasm.qdef   sO    U	N	T"V$q=!,V!4DIIg!3F!;DIIgr   r   )__name__
__module____qualname____doc__rV   rS   rd   rg   rk   ro   rZ   r)   ru   rw   rz   r|   r>   r0   r   r   r   r   r   r   r   r   rD   r   r   r   r   r   s   s|    	E ,+K
(.+000001;;=5..<<r   N)r   __all__mathr   sympy.physics.quantum.gater   r   r   r   r	   r
   r   r   r   r   rj   r   r   r   r!   r&   r-   r1   r5   r?   r:   rM   r   r   r   r   <module>r      sf   &   V V V 0%-	
03F
m< m<r   