
    \h                         S r S/rSSKJr  SSKJrJrJrJrJ	r	J
r
JrJrJrJr  SSKJr  S rS rS rS	 rS
 rS rS rS rS rS r " S S5      rg)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                 .    [        U R                  5       6 $ N)r   
splitlines)liness    R/var/www/auris/envauris/lib/python3.13/site-packages/sympy/physics/quantum/qasm.py	read_qasmr      s    !!#$$    c                 @    [        [        U 5      R                  5       6 $ r   )r   open	readlines)filenames    r   read_qasm_filer      s    h))+,,r   c                     X-
  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     3q5Lr   c                 :    SU ;  a  U $ U R                  S5      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    [        U5      n[        UR                  U 5      U5      $ )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    U  Vs/ s H  n[        X!5      PM     sn$ s  snf r   )r-   )targetsr+   ts      r   get_indicesr1   F   s    *12'QIa '222s   c              #   j   #    U  H)  n[        U5      nUR                  5       (       a  M%  Uv   M+     g 7fr   )r&   isspace)argsr%   s     r   nonblankr5   I   s0     Dz<<>>
	 
 s   13c                     U R                  5       nSR                  USS  5      n[        US   5      UR                  S5       Vs/ s H  o3R                  5       PM     sn4$ s  snf )N r   r   ,)r$   join
fixcommandstrip)r%   wordsrestss       r   	fullsplitr?   Q   sS    JJLE88E!"IDeAhTZZ_!E_'')_!EEE!Es   A"c                 p    S/nU R                  5       n U H  nU R                  US5      n M     U S:X  a  gU $ )zkFix 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   s@      5		A$IIdB %EzHr   c                 N    U R                  SS5      n U R                  SS5      n U $ )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                       \ rS rSrSrS rS rS rS rS r	SS	 jr
S
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)r   s   a6  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                 f    0 U l         / U l        / U l        0 U l        U R                  " U6   X l        g r   )defscircuitr+   initsaddkwargs)selfr4   rU   s      r   __init__Qasm.__init__~   s.    	
$r   c                    [        U5       H  n[        U5      u  p4U R                  R                  U5      (       a  U R                  R                  U5      nU R	                  U5      n[        U5      S:X  a&  U R                  R                  U" US   5      5        M  U R                  R                  U" US S US   5      5        M  [        X5      (       a  [        X5      nU" U6   M  [        SU-  5        M     g )Nr   r   z!Function %s not defined. Skipping)r5   r?   rQ   getindicesr(   rR   appendhasattrgetattrprint)rV   r   r%   commandr=   functionr\   s          r   rT   Qasm.add   s    UOD%dOMGyy}}W%%99==1,,t,w<1$LL''(<=LL''"wr{(KL''"41$9GCD $r   c                 >    [        [        U R                  5      5      $ r   )r   reversedrR   rV   s    r   get_circuitQasm.get_circuit   s    HT\\*++r   c                 >    [        [        U R                  5      5      $ r   )listre   r+   rf   s    r   
get_labelsQasm.get_labels   s    HT[[)**r   c                     SSK Jn  U R                  5       U R                  5       p2U" U[	        U5      X0R
                  S9  g )Nr   )CircuitPlot)r+   rS   )!sympy.physics.quantum.circuitplotrn   rg   rk   r(   rS   )rV   rn   rR   r+   s       r   plot	Qasm.plot   s0    A**,doo.?GS[zzJr   Nc                 f    U R                   R                  U5        U(       a  X R                  U'   g g r   )r+   r]   rS   )rV   arginits      r   qubit
Qasm.qubit   s#    34C4r   c                 ,    [        XR                  5      $ r   )r1   r+   rV   r4   s     r   r\   Qasm.indices   s    4--r   c                 ,    [        XR                  5      $ r   )r-   r+   rV   rs   s     r   r)   
Qasm.index   s    kk**r   c                     g r   r   rx   s     r   nopQasm.nop   s    r   c                 j    U R                   R                  [        U R                  U5      5      5        g r   )rR   r]   r   r)   r{   s     r   xQasm.x   !    Adjjo./r   c                 j    U R                   R                  [        U R                  U5      5      5        g r   )rR   r]   r   r)   r{   s     r   zQasm.z   r   r   c                 j    U R                   R                  [        U R                  U5      5      5        g r   )rR   r]   r   r)   r{   s     r   hQasm.h   r   r   c                 j    U R                   R                  [        U R                  U5      5      5        g r   )rR   r]   r   r)   r{   s     r   r>   Qasm.s   r   r   c                 j    U R                   R                  [        U R                  U5      5      5        g r   )rR   r]   r   r)   r{   s     r   r0   Qasm.t   r   r   c                 j    U R                   R                  [        U R                  U5      5      5        g r   )rR   r]   r   r)   r{   s     r   measureQasm.measure   s!    Btzz#/0r   c                 f    U R                   R                  [        U R                  X/5      6 5        g r   )rR   r]   r   r\   rV   a1a2s      r   cnot	Qasm.cnot   $    D$,,x"89:r   c                 f    U R                   R                  [        U R                  X/5      6 5        g r   )rR   r]   r   r\   r   s      r   swap	Qasm.swap   r   r   c                 f    U R                   R                  [        U R                  X/5      6 5        g r   )rR   r]   r   r\   r   s      r   cphaseQasm.cphase   s$    FDLL"$:;<r   c                     U R                  XU/5      u  pEnU R                  R                  [        XE4[	        U5      5      5        g r   )r\   rR   r]   r
   r   )rV   r   r   a3i1i2i3s          r   toffoliQasm.toffoli   s7    \\22,/
FB8QrU34r   c                     U R                  X/5      u  p4U R                  R                  [        U[	        U5      5      5        g r   )r\   rR   r]   r	   r   rV   r   r   fifjs        r   cxQasm.cx   1    rh'E"ae,-r   c                     U R                  X/5      u  p4U R                  R                  [        U[	        U5      5      5        g r   )r\   rR   r]   r	   r   r   s        r   czQasm.cz   r   r   c                     [        SU5        g )Nz$defbox not supported yet. Skipping: )r`   rx   s     r   defboxQasm.defbox   s    4d;r   c                     SSK JnJn  [        U5      n[	        U5      n[        U5      nUS:  a  U" U5      U R                  U'   g U" U5      U R                  U'   g )Nr   )CreateOneQubitGateCreateCGate)ro   r   r   intr:   rM   rQ   )rV   name	ncontrolssymbolr   r   ra   s          r   rD   	Qasm.qdef   sO    U	N	T"V$q=!,V!4DIIg!3F!;DIIgr   )rR   rQ   rS   rU   r+   r   )__name__
__module____qualname____firstlineno____doc__rW   rT   rg   rk   rp   ru   r\   r)   r~   r   r   r   r>   r0   r   r   r   r   r   r   r   r   rD   __static_attributes__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   ro   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   