§
    º³Ùg _  ã                   ó‚  — d Z ddlZddlmZ ddlmZ ddl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mZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlm Z! ddl"m#Z# d„ Z$d#d„Z%d$d„Z&d„ Z'd„ Z(d„ Z)d%d„Z*d„ Z+d„ Z,e!j-         .                    d¦  «        d„ ¦   «         Z/d„ Z0	 d&d„Z1d„ Z2d„ Z3d „ Z4da5 G d!„ d"e6¦  «        Z7dS )'z'Common circuit visualization utilities.é    N)ÚOrderedDict)Úwarn)
ÚClassicalRegisterÚClbitÚControlFlowOpÚControlledGateÚDelayÚGateÚInstructionÚMeasureÚQuantumCircuitÚQubit)ÚAnnotatedOperationÚInverseModifierÚPowerModifier)Úcondition_resources)ÚPauliEvolutionGate)Úpi_check)Úcircuit_to_dag)Ú	optionalsé   )ÚVisualizationErrorc                 ó`   — t           j        sdS ddlm} t	          ||¦  «        o
| |j        k    S )NFr   )ÚBooleanExpression)Ú
_optionalsÚHAS_TWEEDLEDUMÚ qiskit.circuit.classicalfunctionr   Ú
isinstanceÚname)Ú	gate_textÚopr   s      úY/granary/edev/quantum/lib/python3.11/site-packages/qiskit/visualization/circuit/_utils.pyÚ_is_boolean_expressionr#   +   sA   € ÝÔ$ð ØˆuØBÐBÐBÐBÐBÐBå�bÐ+Ñ,Ô,ÐE°¸b¼gÒ1EÐEó    c           
      óº  — g }d}t          | t          ¦  «        r¡| j        rš| j        D ]}}t          |t          ¦  «        r|                     d¦  «         Œ-t          |t
          ¦  «        r;|                     dt          t          |j        d¦  «        ¦  «        z   dz   ¦  «         Œ~d 	                    |¦  «        }t          | dd¦  «        }t          | ¦  «        }dx}	x}
}t          | d	¦  «        r,| j        j        }	| j        j        }
t          | j        ¦  «        }t          | d
¦  «        r| j        j        }	d}|
r|
}|}n-|rt          | t"          ¦  «        r|	}|}n|r|}n|	r|	}n| j        }||	k    r| j        n|}|dk    r^||d         v rT|d         |         d         dk    r(|d         |         d         dk    r|d         |         }�nKd|d         |         › d�}�n7|dk    rãt%          || ¦  «        r1|                     dd¦  «                             dd¦  «        }d|› d�}n›|| j        k    r|t(          t*          fvs||	k    r2|t(          t*          fvr"|t,          urd|                     ¦   «         › d�}nHd|› d�}|                     dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }d|› d�}nN|| j        k    r|t(          t*          fvs||	k    r-|t(          t*          fvr|t,          ur|                     ¦   «         }|dk    r/| j        |v r&t          | t"          ¦  «        r|€dn|}d|z   }n|d z   }|r|d!|z   z  }|||fS )"zBLoad the gate_text and ctrl_text strings based on names and labelsÚ ÚInvzPow(é   ú)ú, ÚlabelNÚ	base_gateÚbase_opÚtextÚdisptexr   ú$éÿÿÿÿz	$\mathrm{z}$Úlatexú~z$\neg$ú&z\&z	$\texttt{Ú_ú\_ú^z\string^ú-z\mbox{-}Úmplz(cal)
z
(cal)z - )r   r   Ú	modifiersr   Úappendr   ÚstrÚroundÚpowerÚjoinÚgetattrÚtypeÚhasattrr,   r   r+   r-   r   r#   Úreplacer
   r   r   Ú
capitalize)r!   ÚdrawerÚstyleÚcalibrationsÚ	anno_listÚ	anno_textÚmodifierÚop_labelÚop_typeÚ	base_nameÚ
base_labelÚ	base_typeÚ	ctrl_textr    Úraw_gate_texts                  r"   Úget_gate_ctrl_textrR   3   s  € à€IØ€IÝ�"Õ(Ñ)Ô)ð )¨b¬lð )Øœð 	Oð 	OˆHÝ˜(¥OÑ4Ô4ð OØ× Ò  Ñ'Ô'Ð'Ð'Ý˜H¥mÑ4Ô4ð OØ× Ò  ­#­e°H´NÀAÑ.FÔ.FÑ*GÔ*GÑ!GÈ#Ñ!MÑNÔNÐNøØ—I’I˜iÑ(Ô(ˆ	å�r˜7 DÑ)Ô)€HÝ�2‰hŒh€GØ)-Ð-€IÐ-�
˜YÝˆr�;ÑÔð 'Ø”LÔ%ˆ	Ø”\Ô'ˆ
Ý˜œÑ&Ô&ˆ	Ýˆr�9ÑÔð $Ø”J”Oˆ	Ø€Iàð Øˆ	Øˆ	ˆ	Ø	ð •j ¥^Ñ4Ô4ð Øˆ	Øˆ	ˆ	Ø	ð Øˆ	ˆ	Ø	ð Øˆ	ˆ	à”Gˆ	ð  )¨IÒ5Ð5�B”G�G¸9€Mð �ÒÐ˜I¨¨yÔ)9Ð9Ð9ð �Ô˜IÔ& qÔ)¨SÒ0Ð0°U¸9Ô5EÀiÔ5PÐQSÔ5TÐX[Ò5[Ð5[Ø˜iÔ(¨Ô3ˆI‰IàF e¨IÔ&6°yÔ&AÐFÐFÐFˆI‰Ià	�7Ò	Ð	å! )¨RÑ0Ô0ð 	<Ø!×)Ò)¨#¨yÑ9Ô9×AÒAÀ#ÀuÑMÔMˆIØ4 iÐ4Ð4Ð4ˆIˆIð ˜"œ'Ò!Ð! gµd½KÐ5HÐ&HÐ&HØ˜YÒ&Ð&¨9½TÅ;Ð<OÐ+OÐ+OØÕ0Ð0Ð0ØA i×&:Ò&:Ñ&<Ô&<ÐAÐAÐAˆIˆIà4 iÐ4Ð4Ð4ˆIà!×)Ò)¨#¨uÑ5Ô5ˆIØ!×)Ò)¨#¨{Ñ;Ô;ˆIØ!×)Ò)¨#¨{Ñ;Ô;ˆIØ0 )Ð0Ð0Ð0ˆ	ˆ	ð 
�b”gÒ	Ð	 'µ$½Ð1DÐ"DÐ"DØ˜Ò"Ð" y½½{Ð8KÐ'KÐ'KØÕ,Ð,Ð,Ø×(Ò(Ñ*Ô*ˆ	à�‚€˜2œ7 lÐ2Ð2Ý�b�.Ñ)Ô)ð 	.Ø'Ð/˜˜°YˆIØ! IÑ-ˆIˆIà! IÑ-ˆIàð 'Ø�U˜YÑ&Ñ&ˆ	à�i Ð.Ð.r$   é   c                 ó"  — t          | d¦  «        r<t          d„ | j        D ¦   «         ¦  «        st          d„ | j        D ¦   «         ¦  «        rdS t          | t          ¦  «        r| j        d         › d| j        › d�g}n£g }t          | j        ¦  «        D ]Œ\  }}|dk    r|d	k    s|d
k    r|dk    r|                     d¦  «          nY	 |                     t          |||¬¦  «        ¦  «         Œ[# t          $ r% |                     t          |¦  «        ¦  «         Y Œ‰w xY wd}|rj|dk    rdd                     |¦  «        › d�}nJ|d
k    r+d                     |¦  «        ›                      dd¦  «        }ndd                     |¦  «        › d�}|S )z:Get the params as a string to add to the gate text displayÚparamsc              3   óJ   K  — | ]}t          |t          j        ¦  «        V — Œd S ©N)r   ÚnpÚndarray©Ú.0Úparams     r"   ú	<genexpr>z get_param_str.<locals>.<genexpr>�   s.   è è € ÐDÐD°�z˜%¥¤Ñ,Ô,ÐDÐDÐDÐDÐDÐDr$   c              3   ó@   K  — | ]}t          |t          ¦  «        V — Œd S rW   )r   r   rZ   s     r"   r]   z get_param_str.<locals>.<genexpr>�   s,   è è € ÐHÐH°U�z˜%¥Ñ0Ô0ÐHÐHÐHÐHÐHÐHr$   r&   r   ú[ú]r2   rS   r9   é   z...)ÚoutputÚndigitsz\,(\mathrm{ú,z})r*   r8   z$-$ú(r)   )rB   ÚanyrU   r   r	   ÚunitÚ	enumerater;   r   Ú	TypeErrorr<   r?   rC   )r!   rE   rc   Ú
param_listÚcountr\   Ú	param_strs          r"   Úget_param_strrm   ‹   sæ  € õ �B˜Ñ!Ô!ðåÐDÐD¸"¼)ÐDÑDÔDÑDÔDðõ ÐHÐH¸b¼iÐHÑHÔHÑHÔHðð
 ˆrå�"•eÑÔð .Øœ 1œÐ2Ð2¨¬Ð2Ð2Ð2Ð3ˆ
ˆ
àˆ
Ý% b¤iÑ0Ô0ð 		.ð 		.‰LˆE�5ð ˜'Ò!Ð! e¨a¢i i°V¸u²_°_ÈÐQSÊÈØ×!Ò! %Ñ(Ô(Ð(Ø�ð.Ø×!Ò!¥(¨5¸ÈÐ"QÑ"QÔ"QÑRÔRÐRÐRøÝð .ð .ð .Ø×!Ò!¥# e¡*¤*Ñ-Ô-Ð-Ð-Ð-ð.øøøð €IØð 4Ø�WÒÐØB¨¯ª°*Ñ)=Ô)=ÐBÐBÐBˆIˆIØ�uŠ_ˆ_ØŸ9š9 ZÑ0Ô0Ð2×:Ò:¸3ÀÑFÔFˆIˆIà3˜CŸHšH ZÑ0Ô0Ð3Ð3Ð3ˆIàÐs   Ã	%C/Ã/,DÄDc                 ó°   — d}d}i }|D ]L}t          | |¦  «        }|�t          |t          ¦  «        r|s|||<   |dz  }Œ6|�|r||k    r|}|||<   |dz  }ŒM|S )a  Map the bits and registers to the index from the top of the drawing.
    The key to the dict is either the (Qubit, Clbit) or if cregbundle True,
    the register that is being bundled.

    Args:
        circuit (QuantumCircuit): the circuit being drawn
        bits (list(Qubit, Clbit)): the Qubit's and Clbit's in the circuit
        cregbundle (bool): if True bundle classical registers. Default: ``True``.

    Returns:
        dict((Qubit, Clbit, ClassicalRegister): index): map of bits/registers
            to index
    Nr   r(   )Úget_bit_registerr   r   )ÚcircuitÚbitsÚ
cregbundleÚprev_regÚ
wire_indexÚwire_mapÚbitÚregisters           r"   Úget_wire_maprx   ¯   s’   € ð €HØ€JØ€HØð ð ˆÝ# G¨SÑ1Ô1ˆØÐ¥:¨cµ5Ñ#9Ô#9ÐÀÐØ&ˆH�S‰MØ˜!‰OˆJˆJØÐ! jÐ!°XÀÒ5IÐ5IØˆHØ!+ˆH�XÑØ˜!‰OˆJøà€Or$   c                 ód   — |                       |¦  «        }|j        r|j        d         d         ndS )a
  Get the register for a bit if there is one

    Args:
        circuit (QuantumCircuit): the circuit being drawn
        bit (Qubit, Clbit): the bit to use to find the register and indexes

    Returns:
        ClassicalRegister: register associated with the bit
    r   N)Úfind_bitÚ	registers)rp   rv   Úbit_locs      r"   ro   ro   Í   s7   € ð ×Ò˜sÑ#Ô#€GØ&-Ô&7ÐAˆ7Ô˜QÔ Ô"Ð"¸TÐAr$   c                 óv   — |                       |¦  «        }|j        }|j        r|j        d         nd\  }}|||fS )aü  Get the register for a bit if there is one, and the index of the bit
    from the top of the circuit, or the index of the bit within a register.

    Args:
        circuit (QuantumCircuit): the circuit being drawn
        bit (Qubit, Clbit): the bit to use to find the register and indexes

    Returns:
        (ClassicalRegister, None): register associated with the bit
        int: index of the bit from the top of the circuit
        int: index of the bit within the register, if there is a register
    r   ©NN)rz   Úindexr{   )rp   rv   r|   Ú	bit_indexrw   Ú	reg_indexs         r"   Úget_bit_reg_indexr‚   Û   sJ   € ð ×Ò˜sÑ#Ô#€GØ”€IØ29Ô2CÐU˜'Ô+¨AÔ.Ð.ÈÑ€HˆiØ�Y 	Ð)Ð)r$   Tc                 ó  ‡
— | dk    r|› nd|› d�}|€|}|S | dk    r|j         › }|j         › d|› �}n dt          |j         ¦  «        › d�}|› d|› d�}t          |t          ¦  «        r&|r| dk    r
|j         › }|S |j        dk    s|r|}n|}|S |j        dk    r|}nç|€|}nâ||         rØ||         Š
	 t          ˆ
fd	„|                     ¦   «         D ¦   «         ¦  «        }	| dk    r+|	j         › d|	dd…                              ‰
¦  «        › d
|› �}n,d|	j         › d|	dd…                              ‰
¦  «        › d|› d�}n'# t          $ r | dk    r‰
› d
|› �}n	d‰
› d|› d�}Y nw xY w| dk    r| 	                    dd¦  «        }n|}|S )a  Get the bit labels to display to the left of the wires.

    Args:
        drawer (str): which drawer is calling ("text", "mpl", or "latex")
        register (QuantumRegister or ClassicalRegister): get wire_label for this register
        index (int): index of bit in register
        layout (Layout): Optional. mapping of virtual to physical bits
        cregbundle (bool): Optional. if set True bundle classical registers.
            Default: ``True``.

    Returns:
        str: label to display for the register/index
    r.   Ú{Ú}Nr5   z_{r2   r(   c              3   ó$   •K  — | ]
}‰|v ¯|V — Œd S rW   © )r[   ÚregÚvirt_bits     €r"   r]   z!get_wire_label.<locals>.<genexpr>  s(   øè è € ÐUÐU CÀXÐQTÀ_À_˜CÀ_À_À_À_ÐUÐUr$   z -> z}_{z} \mapsto {ú ú\;)
r   Úfix_special_charactersr   r   ÚsizeÚnextÚget_registersr   ÚStopIterationrC   )rE   rw   r   Úlayoutrr   Ú	index_strÚ
wire_labelÚreg_nameÚreg_name_indexÚvirt_regr‰   s             @r"   Úget_wire_labelr—   î   s`  ø€ ð %¨Ò.Ð.�5�
�
°N¸°N°N°N€IØÐØˆ
ØÐà�ÒÐØ”mÐ%ˆØ$œMÐ3Ð3¨EÐ3Ð3ˆˆàAÕ.¨x¬}Ñ=Ô=ÐAÐAÐAˆØ$Ð2Ð2¨Ð2Ð2Ð2ˆõ �(Õ-Ñ.Ô.ð 	Øð 	˜& GÒ+Ð+Ø$œMÐ+ˆJØÐàŒ=˜AÒÐ ÐØ!ˆJˆJà'ˆJØÐð „}˜ÒÐØˆ
ˆ
Ø	ˆØ#ˆ
ˆ
Ø	�Œð Ø˜%”=ˆð	DÝÐUÐUÐUÐU¨6×+?Ò+?Ñ+AÔ+AÐUÑUÔUÑUÔUˆHØ˜ÒÐØ (¤ÐXÐX°¸¸¸´×0AÒ0AÀ(Ñ0KÔ0KÐXÐXÐQVÐXÐX�
�
ð b˜œÐaÐa¨X°a°a°a¬[×->Ò->¸xÑ-HÔ-HÐaÐaÐX]ÐaÐaÐað øøõ ð 	Dð 	Dð 	DØ˜ÒÐØ (Ð5Ð5¨eÐ5Ð5�
�
àC (ÐCÐC¸%ÐCÐCÐC�
øøð		Døøøð
 �VÒÐØ#×+Ò+¨C°Ñ7Ô7ˆJøàˆ
àÐs   Â1B
D< Ä<!E ÅE c                 óê  — t          t          | d         t          ¦  «        ¦  «        }t          | d         ¦  «        }t          | d         t          ¦  «        r,|s*t          |d| d         j        › d�›¦  «        ddd…         }nt          t          |¦  «        ¦  «        }d}|r;|r9t          || d         ¦  «        \  }}}	|�|j	        › d|	› d	t          |¦  «        › �}n|st          |¦  «        }||fS )
a™  Get the label and value list to display a condition

    Args:
        condition (Union[Clbit, ClassicalRegister], int): classical condition
        circuit (QuantumCircuit): the circuit that is being drawn
        cregbundle (bool): if set True bundle classical registers

    Returns:
        str: label to display for the condition
        list(str): list of 1's and 0's indicating values of condition
    r   r(   Ú0ÚbNr1   r&   r5   ú=)Úboolr   r   Úintr   Úlistr�   r<   r‚   r   Úhex)
Ú	conditionrp   rr   Úcond_is_bitÚcond_valÚval_bitsr+   rw   r5   r�   s
             r"   Úget_condition_label_valr¤   0  s
  € õ •z )¨A¤,µÑ6Ô6Ñ7Ô7€KÝ�9˜Q”<Ñ Ô €Hõ �)˜A”,Õ 1Ñ2Ô2ð '¸:ð 'Ý˜8Ð; i°¤lÔ&7Ð;Ð;Ð;Ð;Ñ<Ô<¸T¸T¸r¸TÔBˆˆå�˜H™œÑ&Ô&ˆà€EØð �zð Ý!2°7¸IÀa¼LÑ!IÔ!IÑˆ�!�YØÐØ”}ÐBÐB yÐBÐBµ3°x±=´=ÐBÐBˆEøØð Ý�H‘”ˆà�(ˆ?Ðr$   c                 óZ   — |                       dd¦  «                              dd¦  «        } | S )a  
    Convert any special characters for mpl and latex drawers.
    Currently only checks for multiple underscores in register names
    and uses wider space for mpl and latex drawers.

    Args:
        label (str): the label to fix

    Returns:
        str: label to display
    r5   r6   rŠ   r‹   )rC   )r+   s    r"   rŒ   rŒ   Q  s,   € ð �MŠM˜#˜uÑ%Ô%×-Ò-¨c°5Ñ9Ô9€EØ€Lr$   z*the latex and latex_source circuit drawersc                 ó.  — ddl m} t          j        d¦  «        }|                     | ¦  «        }|s$|                      dd¦  «        }  || d¬¦  «        }n«|                     d¦  «                             dd¦  «        }| d	|                     ¦   «         …         }|                     dd¦  «        }| |                     ¦   «         d	…         }|                     dd¦  «        } ||d¬¦  «        |z    ||d¬¦  «        z   }|                     d
d¦  «        S )z(Convert a label to a valid latex string.r   )Úutf8tolatexz(?<!\\)\$(.*)(?<!\\)\$z\$r0   T)Únon_ascii_onlyr(   NrŠ   z\,)	Úpylatexenc.latexencoder§   ÚreÚcompileÚsearchrC   ÚgroupÚstartÚend)r+   r§   ÚregexÚmatchÚ	final_strÚmathmode_stringÚbefore_matchÚafter_matchs           r"   Úgenerate_latex_labelr¶   a  s+  € ð 3Ð2Ð2Ð2Ð2Ð2åŒJÐ0Ñ1Ô1€EØ�LŠL˜ÑÔ€EØð 
Ø—’˜e SÑ)Ô)ˆØ�K °dÐ;Ñ;Ô;ˆ	ˆ	àŸ+š+ a™.œ.×0Ò0°¸Ñ<Ô<ˆØ˜_˜uŸ{š{™}œ}˜_Ô-ˆØ#×+Ò+¨E°3Ñ7Ô7ˆØ˜EŸIšI™KœK˜M˜MÔ*ˆØ!×)Ò)¨%°Ñ5Ô5ˆàˆK˜°TÐ:Ñ:Ô:Øñàˆk˜+°dÐ;Ñ;Ô;ñ<ð 	ð
 ×Ò˜S %Ñ(Ô(Ð(r$   c                 ó    — t          | t          ¦  «        r|                      ¦   «         } | €d} | dvrt          d| › d�t          d¦  «         d} | S )z9Returns a valid `justify` argument, warning if necessary.NÚleft)r¸   ÚrightÚnoneuJ   Setting QuantumCircuit.draw()â€™s or circuit_drawer()'s justify argument: zÿ, to a value other than 'left', 'right', 'none' or None (='left'). Default 'left' will be used. Support for invalid justify arguments is deprecated as of Qiskit 1.2.0. Starting no earlier than 3 months after the release date, invalid arguments will error.r   )r   r<   Úlowerr   ÚDeprecationWarning)Újustifys    r"   Ú_get_valid_justify_argr¾   y  sx   € å�'�3ÑÔð "Ø—-’-‘/”/ˆà€ØˆàÐ/Ð/Ð/åðZÐY`ð Zð Zð Zõ Øñ	
ô 	
ð 	
ð ˆà€Nr$   Fc                 ó˜  ‡— t          |¦  «        }|�d„ |D ¦   «         Šn| j                             ¦   «         Š| j                             ¦   «         }g }t	          d„ |D ¦   «         ¦  «        }|r|�t          d¦  «        ‚|r)‰                     ¦   «          |                     ¦   «          ni|�gg }	g }
|D ]\}|t          ‰¦  «        k     r|	                     ‰|         ¦  «         Œ1|
                     ||t          ‰¦  «        z
           ¦  «         Œ]|	Š|
}t          | ¦  «        }|dk    r.| 
                    ¦   «         D ]}|                     |g¦  «         Œnt          |‰|||¦  «        }|sM|                     ddg¬¦  «        D ]4}|‰v r‰                     |¦  «         ||v r|                     |¦  «         Œ5ˆfd	„|D ¦   «         }‰||fS )
a¢  
    Given a circuit, return a tuple (qubits, clbits, nodes) where
    qubits and clbits are the quantum and classical registers
    in order (based on reverse_bits or wire_order) and nodes
    is a list of DAGOpNodes.

    Args:
        circuit (QuantumCircuit): From where the information is extracted.
        reverse_bits (bool): If true the order of the bits in the registers is
            reversed.
        justify (str) : `left`, `right` or `none`. Defaults to `left`. Says how
            the circuit should be justified. If an invalid value is provided,
            default `left` will be used.
        idle_wires (bool): Include idle wires. Default is True.
        wire_order (list): A list of ints that modifies the order of the bits.

    Returns:
        Tuple(list,list,list): To be consumed by the visualizer directly.

    Raises:
        VisualizationError: if both reverse_bits and wire_order are entered.
    Nc                 ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS r‡   )r   r   )r[   rv   s     r"   ú
<listcomp>z-_get_layered_instructions.<locals>.<listcomp>¬  s'   € ÐDÐDÐD˜#­Z¸½UÑ-CÔ-CÐD�#ÐDÐDÐDr$   c                 ó   — g | ]}|d f‘ŒS )r1   r‡   )r[   Úcs     r"   rÁ   z-_get_layered_instructions.<locals>.<listcomp>µ  s   € Ð7Ð7Ð7¨1  2˜wÐ7Ð7Ð7r$   z@Cannot set both reverse_bits and wire_order in the same drawing.rº   ÚbarrierÚdelay)Úignorec                 ó,   •— g | ]}ˆfd „|D ¦   «         ‘ŒS )c                 óT   •— g | ]$}t          ˆfd „|j        D ¦   «         ¦  «        ¯"|‘Œ%S )c              3   ó    •K  — | ]}|‰v V — Œ	d S rW   r‡   )r[   ÚqÚqubitss     €r"   r]   zB_get_layered_instructions.<locals>.<listcomp>.<listcomp>.<genexpr>Ù  s'   øè è € Ð+LÐ+L¸A¨A°¨KÐ+LÐ+LÐ+LÐ+LÐ+LÐ+Lr$   )rf   Úqargs)r[   ÚnoderË   s     €r"   rÁ   z8_get_layered_instructions.<locals>.<listcomp>.<listcomp>Ù  s=   ø€ ÐMÐMÐM�t­Ð+LÐ+LÐ+LÐ+LÀÄÐ+LÑ+LÔ+LÑ(LÔ(LÐMˆdÐMÐMÐMr$   r‡   )r[   ÚlayerrË   s     €r"   rÁ   z-_get_layered_instructions.<locals>.<listcomp>Ù  s/   ø€ ÐaÐaÐaÐRWÐMÐMÐMÐM˜uÐMÑMÔMÐaÐaÐar$   )r¾   rË   ÚcopyÚclbitsr   r   ÚreverseÚlenr;   r   Útopological_op_nodesÚ_LayerSpoolerÚ
idle_wiresÚremove)rp   Úreverse_bitsr½   rÕ   Ú
wire_orderru   rÐ   ÚnodesÚmeasure_mapÚ
new_qubitsÚ
new_clbitsrv   ÚdagrÍ   ÚwirerË   s                  @r"   Ú_get_layered_instructionsrß   �  s*  ø€ õ2 % WÑ-Ô-€GàÐØDÐD ÐDÑDÔDˆˆà”×$Ò$Ñ&Ô&ˆØŒ^× Ò Ñ"Ô"€FØ€Eõ
 Ð7Ð7°Ð7Ñ7Ô7Ñ8Ô8€Kàð e˜
Ð.Ý Ð!cÑdÔdÐdàð Ø�ŠÑÔÐØ�ŠÑÔÐÐØ	Ð	Øˆ
Øˆ
Øð 	=ð 	=ˆCØ•S˜‘[”[Ò Ð Ø×!Ò! &¨¤+Ñ.Ô.Ð.Ð.à×!Ò! &¨­s°6©{¬{Ñ):Ô";Ñ<Ô<Ð<Ð<ØˆØˆå
˜Ñ
!Ô
!€Cà�&ÒÐØ×,Ò,Ñ.Ô.ð 	!ð 	!ˆDØ�LŠL˜$˜Ñ Ô Ð Ð ð	!õ ˜c 6¨6°7¸KÑHÔHˆð ð $Ø—N’N¨9°gÐ*>�NÑ?Ô?ð 	$ð 	$ˆDØ�vˆ~ˆ~Ø—’˜dÑ#Ô#Ð#Ø�vˆ~ˆ~Ø—’˜dÑ#Ô#Ð#øàaÐaÐaÐaÐ[`ÐaÑaÔa€Eà�6˜5Ð Ð r$   c                 óh   — | d                               ¦   «         }|                     d„ ¬¦  «         |S )zRConvert DAG layer into list of nodes sorted by node_id
    qiskit-terra #2802
    Úgraphc                 ó   — | j         S rW   )Ú_node_id)Únds    r"   ú<lambda>z_sorted_nodes.<locals>.<lambda>ä  s   € ˜bœk€ r$   )Úkey)Úop_nodesÚsort)Ú	dag_layerrÙ   s     r"   Ú_sorted_nodesrê   Þ  s7   € ð �gÔ×'Ò'Ñ)Ô)€Eà	‡J‚JÐ)Ð)€JÑ*Ô*Ð*Ø€Lr$   c                 ó:  — t          | ¦  «        }d}|j        D ]'}|                      |¦  «        }||k     r|}||k    r|}Œ(t          |j        t
          ¦  «        r| }n=|j        st          |dd¦  «        r| |t          | ¦  «        …         }n| ||dz   …         }|S )zPGet the list of qubits drawing this gate would cover
    qiskit-terra #2802
    r   r    Nr(   )rÒ   rÌ   r   r   r!   r   Úcargsr@   )rË   rÍ   Ú	min_indexÚ	max_indexÚqregr   Úspans          r"   Ú_get_gate_spanrñ   è  sÀ   € õ �F‘”€IØ€IØ”
ð ð ˆØ—’˜TÑ"Ô"ˆà�9ÒÐØˆIØ�9ÒÐØˆIøõ �$”'�=Ñ)Ô)ð 1ØˆˆØ	Œð 1•w˜t [°$Ñ7Ô7ð 1Ø�i¥# f¡+¤+Ð-Ô.ˆˆà�i )¨a¡-Ð/Ô0ˆà€Kr$   c                 ó–   ‡ — t          t          t          ‰ |¦  «        ¦  «                             ˆ fd„|D ¦   «         ¦  «        ¦  «        S )z2Return True .IFF. 'node' crosses over any 'nodes'.c              3   óB   •K  — | ]}t          ‰|¦  «        D ]}|V — ŒŒd S rW   )rñ   )r[   Ú
check_noderv   rË   s      €r"   r]   z!_any_crossover.<locals>.<genexpr>  sR   øè è € ð 7
ð 7
Øµ>À&È*Ñ3UÔ3Uð7
ð 7
Ø,/ˆCð7
ð 7
ð 7
ð 7
ð 7
ð 7
ð 7
r$   )rœ   Úsetrñ   Úintersection)rË   rÍ   rÙ   s   `  r"   Ú_any_crossoverr÷     s`   ø€ åÝ�N˜6 4Ñ(Ô(Ñ)Ô)×6Ò6ð 7
ð 7
ð 7
ð 7
Ø"'ð7
ñ 7
ô 7
ñ 	
ô 	
ñô ð r$   c                   ó@   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	ˆ xZ
S )rÔ   z=Manipulate list of layer dicts for _get_layered_instructions.c                 óp  •‡ — t          ¦   «                              ¦   «          |‰ _        |‰ _        |‰ _        |‰ _        |‰ _        ˆ fd„‰ j        j        D ¦   «         ‰ _        ‰ j        dk    rU|                     ¦   «         D ]>}t          ‰ ¦  «        dz
  }t          |¦  «        }|D ]}	‰                      |	|¦  «         ŒŒ?dS g }
|                     ¦   «         D ]}|
                     |¦  «         Œ|
                     ¦   «          |
D ].}d}t          |¦  «        }|D ]}	‰                      |	|¦  «         ŒŒ/dS )zCreate spoolc                 ó4   •— g | ]}‰j         j        |         ‘ŒS r‡   )rÝ   Úcregs)r[   rˆ   Úselfs     €r"   rÁ   z*_LayerSpooler.__init__.<locals>.<listcomp>  s"   ø€ ÐDÐDÐD¨c�d”h”n SÔ)ÐDÐDÐDr$   r¸   r(   r   N)ÚsuperÚ__init__rÝ   rË   rÐ   ÚjustificationrÚ   rû   ÚlayersrÒ   rê   Úaddr;   rÑ   )rü   rÝ   rË   rÐ   rÿ   rÚ   ré   Úcurrent_indexÚ	dag_nodesrÍ   Ú
dag_layersÚ	__class__s   `          €r"   rþ   z_LayerSpooler.__init__  ss  øø€ å‰Œ×ÒÑÔÐØˆŒØˆŒØˆŒØ*ˆÔØ&ˆÔØDÐDÐDÐD°T´X´^ÐDÑDÔDˆŒ
àÔ Ò'Ð'Ø ŸZšZ™\œ\ð 2ð 2�	Ý # D¡	¤	¨A¡�Ý)¨)Ñ4Ô4�	Ø%ð 2ð 2�DØ—H’H˜T =Ñ1Ô1Ð1Ð1ð2ð2ð 2ð ˆJØ ŸZšZ™\œ\ð -ð -�	Ø×!Ò! )Ñ,Ô,Ð,Ð,ð ×ÒÑ Ô Ð à'ð 2ð 2�	Ø !�Ý)¨)Ñ4Ô4�	Ø%ð 2ð 2�DØ—H’H˜T =Ñ1Ô1Ð1Ð1ð2ð2ð 2r$   c                 ó†   ‡— g }|D ]!}|j         D ]}|                     |¦  «         ŒŒ"t          ˆfd„|D ¦   «         ¦  «        S )z*Is any qreq in node found in any of nodes?c              3   ó*   •K  — | ]}|‰j         v V — Œd S rW   )rÌ   )r[   ÚirÍ   s     €r"   r]   z,_LayerSpooler.is_found_in.<locals>.<genexpr>5  s)   øè è € Ð6Ð6 q�1˜œ
�?Ð6Ð6Ð6Ð6Ð6Ð6r$   )rÌ   r;   rf   )rü   rÍ   rÙ   Ú	all_qargsÚa_nodeÚqargs    `    r"   Úis_found_inz_LayerSpooler.is_found_in/  sg   ø€ àˆ	Øð 	'ð 	'ˆFØœð 'ð '�Ø× Ò  Ñ&Ô&Ð&Ð&ð'åÐ6Ð6Ð6Ð6¨IÐ6Ñ6Ô6Ñ6Ô6Ð6r$   c                 ó0   — t          | j        ||¦  «         S )z-True .IFF. we can add 'node' to layer 'nodes')r÷   rË   )rü   rÍ   rÙ   s      r"   Ú
insertablez_LayerSpooler.insertable7  s   € å! $¤+¨t°UÑ;Ô;Ð;Ð;r$   c                 ó”  ‡ ‡‡— d}t          ‰j        t          ¦  «        r t          ˆfd„‰ j        D ¦   «         ¦  «        }‰ sd}‰                      ‰g¦  «         �n‡d}|}d}d}t          ‰dd¦  «        x}	�/t          ˆ fd„t          |	¦  «        j	        D ¦   «         |¬¦  «        }‰j
        rY‰j
        D ]QŠ	 t          ˆfd	„‰ j        D ¦   «         ¦  «        }
‰ j        |
         |k    r‰ j        |
         }ŒB# t          $ r Y ŒNw xY w||k    rF‰                      ‰‰ |         ¦  «        rn)‰                      ‰‰ |         ¦  «        r|}|d
z
  }||k    °F|dk    r d}‰ |                              ‰¦  «         |}nkd}|}|t          ‰ ¦  «        k     rT‰                      ‰‰ |         ¦  «        r ‰ |                              ‰¦  «         |}d}n|d
z   }|t          ‰ ¦  «        k     °T|s‰                      ‰g¦  «         t          ‰j        t          ¦  «        r1|st          ‰ ¦  «        d
z
  }|‰ j        |         k    r|‰ j        |<   dS dS dS )zCInsert node into first layer where there is no conflict going l > rNc              3   ó>   •K  — | ]}‰j         d          |k    ¯|V — ŒdS )r   N)rì   )r[   rv   rÍ   s     €r"   r]   z0_LayerSpooler.slide_from_left.<locals>.<genexpr>?  s4   øè è € ÐWÐW sÀ$Ä*ÈQÄ-ÐSVÒBVÐBV˜sÐBVÐBVÐBVÐBVÐWÐWr$   TFr1   r    c              3   ó2   •K  — | ]}‰j         |         V — Œd S rW   )rÚ   )r[   rv   rü   s     €r"   r]   z0_LayerSpooler.slide_from_left.<locals>.<genexpr>K  s+   øè è € Ð\Ð\¨s�TÔ% cÔ*Ð\Ð\Ð\Ð\Ð\Ð\r$   )Údefaultc              3   ó(   •K  — | ]}‰|k    ¯|V — Œd S rW   r‡   )r[   rv   Úcargs     €r"   r]   z0_LayerSpooler.slide_from_left.<locals>.<genexpr>Q  s(   øè è € Ð'WÐ'W°È4ÐSVÊ;È;¨È;È;È;È;Ð'WÐ'Wr$   r(   r   )r   r!   r   rŽ   rÚ   r;   r@   Úmaxr   rÐ   rì   r�   r  r  rÒ   )rü   rÍ   r   Úmeasure_layerÚmeasure_bitÚinsertedÚ
curr_indexÚlast_insertable_indexÚ
index_stopr    Úcarg_bitr  s   ``         @r"   Úslide_from_leftz_LayerSpooler.slide_from_left;  sä  øøø€ àˆÝ�d”g�wÑ'Ô'ð 	XÝÐWÐWÐWÐW¨dÔ.>ÐWÑWÔWÑWÔWˆKàð )	0ØˆHØ�KŠK˜˜ÑÔÐÑàˆHØˆJØ$&Ð!ØˆJÝ$ T¨;¸Ñ=Ô=Ð=�	ÐJÝ Ø\Ð\Ð\Ð\Õ6IÈ)Ñ6TÔ6TÔ6[Ð\Ñ\Ô\Ø&ðñ ô �
ð Œzð Ø œJð ð �DðÝ#'Ð'WÐ'WÐ'WÐ'W°tÔ7GÐ'WÑ'WÔ'WÑ#WÔ#W˜ØÔ+¨HÔ5¸
ÒBÐBØ)-Ô)9¸(Ô)C˜JøøÝ(ð ð ð Ø˜ðøøøà˜zÒ)Ð)Ø×#Ò# D¨$¨zÔ*:Ñ;Ô;ð ØØ—?’? 4¨¨jÔ)9Ñ:Ô:ð 7Ø,6Ð)Ø'¨!™^�
ð ˜zÒ)Ð)ð %¨Ò)Ð)Ø�ØÐ*Ô+×2Ò2°4Ñ8Ô8Ð8Ø 5��à �Ø"�
Ø ¥3 t¡9¤9Ò,Ð,Ø—’ t¨T°*Ô-=Ñ>Ô>ð Ø˜ZÔ(×/Ò/°Ñ5Ô5Ð5Ø(2˜Ø#'˜ØØ!+¨a¡�Jð !¥3 t¡9¤9Ò,Ð,ð ð 	 Ø�KŠK˜˜ÑÔÐå�d”g�wÑ'Ô'ð 	>Ø ð .Ý # D¡	¤	¨A¡�Ø˜tÔ/°Ô<Ò<Ð<Ø0=�Ô  Ñ-Ð-Ð-ð		>ð 	>ð =Ð<s   Â7>C6Ã6
DÄDc                 ó&  — | s|                       d|g¦  «         d}nÙd}|}d}|t          | ¦  «        k     rS|                      || |         ¦  «        rn6|                      || |         ¦  «        r|}|dz   }|t          | ¦  «        k     °S|r| |                              |¦  «         d}nM|}|dk    rE|                      || |         ¦  «        r| |                              |¦  «         d}n|dz
  }|dk    °E|s|                       d|g¦  «         dS dS )z>Insert node into rightmost layer as long there is no conflict.r   TFNr(   r1   )ÚinsertrÒ   r  r  r;   )rü   rÍ   r   r  r  r  s         r"   Úslide_from_rightz_LayerSpooler.slide_from_rightu  s^  € àð 	0Ø�KŠK˜˜D˜6Ñ"Ô"Ð"ØˆHˆHàˆHØˆJØ$(Ð!à�s 4™yœyÒ(Ð(Ø×#Ò# D¨$¨zÔ*:Ñ;Ô;ð ØØ—?’? 4¨¨jÔ)9Ñ:Ô:ð 7Ø,6Ð)Ø'¨!™^�
ð �s 4™yœyÒ(Ð(ð %ð 
0ØÐ*Ô+×2Ò2°4Ñ8Ô8Ð8Ø��à"�
Ø  2’o�oØ—’ t¨T°*Ô-=Ñ>Ô>ð Ø˜ZÔ(×/Ò/°Ñ5Ô5Ð5Ø#'˜ØØ!+¨a¡�Jð ! 2’o�oð ð 	#Ø�KŠK˜˜D˜6Ñ"Ô"Ð"Ð"Ð"ð	#ð 	#r$   c                 ó¤   — t           |_        t           dz  a | j        dk    r|                      ||¦  «         dS |                      ||¦  «         dS )z9Add 'node' where it belongs, starting the try at 'index'.r(   r¸   N)Ú_GLOBAL_NIDrã   rÿ   r  r   )rü   rÍ   r   s      r"   r  z_LayerSpooler.add•  s[   € õ $ˆŒÝ�qÑˆØÔ Ò'Ð'Ø× Ò   uÑ-Ô-Ð-Ð-Ð-à×!Ò! $¨Ñ.Ô.Ð.Ð.Ð.r$   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rþ   r  r  r  r   r  Ú__classcell__)r  s   @r"   rÔ   rÔ     s‹   ø€ € € € € ØGÐGð2ð 2ð 2ð 2ð 2ð<7ð 7ð 7ð<ð <ð <ð8>ð 8>ð 8>ðt#ð #ð #ð@/ð /ð /ð /ð /ð /ð /r$   rÔ   r~   )rS   )NT)FNTNN)8r&  rª   Úcollectionsr   Úwarningsr   ÚnumpyrX   Úqiskit.circuitr   r   r   r   r	   r
   r   r   r   r   Ú"qiskit.circuit.annotated_operationr   r   r   Úqiskit.circuit.controlflowr   Úqiskit.circuit.libraryr   Úqiskit.circuit.toolsr   Úqiskit.convertersr   Úqiskit.utilsr   r   Ú
exceptionsr   r#   rR   rm   rx   ro   r‚   r—   r¤   rŒ   ÚHAS_PYLATEXÚrequire_in_callr¶   r¾   rß   rê   rñ   r÷   r"  rž   rÔ   r‡   r$   r"   ú<module>r5     s¿  ðð .Ð -à 	€	€	€	Ø #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð à Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð bÐ aÐ aÐ aÐ aÐ aÐ aÐ aÐ aÐ aØ :Ð :Ð :Ð :Ð :Ð :Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø )Ð )Ð )Ð )Ð )Ð )Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0à +Ð +Ð +Ð +Ð +Ð +ðFð Fð FðU/ð U/ð U/ð U/ðp!ð !ð !ð !ðHð ð ð<Bð Bð Bð*ð *ð *ð&?ð ?ð ?ð ?ðDð ð ðBð ð ð  Ô×'Ò'Ð(TÑUÔUð)ð )ñ VÔUð)ð.ð ð ð0 [_ðK!ð K!ð K!ð K!ð\ð ð ðð ð ð4ð ð ð €ðU/ð U/ð U/ð U/ð U/�Dñ U/ô U/ð U/ð U/ð U/r$   