§
    º³ÙgU ã                   óÆ  — d Z ddlmZ ddlmZ ddlmZ ddlZddlZddl	m
Z
mZmZmZ ddl	mZmZmZ ddl	mZmZmZmZmZ dd	lmZ dd
lmZ ddlmZmZmZmZmZ ddl 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,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5 dZ6dZ7dZ8 G d„ de5¦  «        Z9 G d„ d¦  «        Z: G d„ de:¦  «        Z; G d„ de:¦  «        Z< G d„ de:¦  «        Z= G d„ d e<¦  «        Z> G d!„ d"e:¦  «        Z? G d#„ d$e?e<¦  «        Z@ G d%„ d&e?¦  «        ZA G d'„ d(eAe<¦  «        ZB G d)„ d*e?e<¦  «        ZC G d+„ d,e:¦  «        ZD G d-„ d.e?e<¦  «        ZE G d/„ d0e?e<¦  «        ZF G d1„ d2e?e<¦  «        ZG G d3„ d4e?e;¦  «        ZH G d5„ d6eAe;¦  «        ZI G d7„ d8e?e;¦  «        ZJ G d9„ d:e:¦  «        ZK G d;„ d<eK¦  «        ZL G d=„ d>eK¦  «        ZM G d?„ d@eK¦  «        ZN G dA„ dBeK¦  «        ZO G dC„ dDeK¦  «        ZP G dE„ dFe:¦  «        ZQ G dG„ dHeQ¦  «        ZR G dI„ dJeQ¦  «        ZS G dK„ dLe:¦  «        ZT G dM„ dNe:¦  «        ZU G dO„ dPe:¦  «        ZV G dQ„ dR¦  «        ZW G dS„ dT¦  «        ZXdS )UzN
A module for drawing circuits in ascii art or some other text representation
é    )ÚStringIO)Úwarn)Úget_terminal_sizeN)ÚQubitÚClbitÚClassicalRegisterÚCircuitError)ÚControlledGateÚResetÚMeasure)ÚControlFlowOpÚWhileLoopOpÚIfElseOpÚ	ForLoopOpÚSwitchCaseOp)Úexpr)Únode_resources)ÚIGateÚRZZGateÚSwapGateÚSXGateÚSXdgGate)Ú_canonicalize_modifiersÚControlModifier)Úpi_check)Úast)ÚBasicPrinter)Ú_ExprBuilderé   )Úget_gate_ctrl_textÚget_param_strÚget_wire_mapÚget_bit_registerÚget_bit_reg_indexÚget_wire_labelÚget_condition_label_valÚ_get_layered_instructionsé   )ÚVisualizationErrorc                   ó   — e Zd ZdZdS )ÚTextDrawerEncodingErrorzA problem with encodingN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úW/granary/edev/quantum/lib/python3.11/site-packages/qiskit/visualization/circuit/text.pyr+   r+   5   s   € € € € € Ø!Ð!à€Dr1   r+   c                   ó°   — e Zd ZdZdd„Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Z	ed„ ¦   «         Z
e
j        d	„ ¦   «         Z
dd
„ZdS )ÚDrawElementz2An element is an operation that needs to be drawn.Nc                 ó  — d | _         |x| _        | _        dx| _        x| _        | _        dx| _        | _        dx| _        x| _	        | _
        dx| _        x| _        | _        i | _        i | _        dx| _        x| _        | _        d| _        d S )Nú%sú r   Ú )Ú_widthÚlabelÚmid_contentÚ
top_formatÚ
mid_formatÚ
bot_formatÚtop_connectÚbot_connectÚtop_padÚ_mid_paddingÚbot_padÚmid_bckÚtop_bckÚbot_bckÚbot_connectorÚtop_connectorÚ
right_fillÚ	left_fillÚlayer_widthÚ
wire_label)Úselfr:   s     r2   Ú__init__zDrawElement.__init__>   s™   € ØˆŒØ(-Ð-ˆŒ
�TÔ%Ø>BÐBˆŒÐB˜$œ/¨D¬OØ.1Ð1ˆÔ˜4Ô+Ø:=Ð=ˆŒÐ=�tÔ(¨4¬<Ø58Ð8ˆŒÐ8�t”| d¤lØˆÔØˆÔØ>?Ð?ˆŒÐ?˜$œ.¨4Ô+;ØˆŒˆˆr1   c                 ó*  — | j         dz  dk    rit          | j        ¦  «        dz  dk    rNt          | j        ¦  «        dk    r6| j        | j        | j        z                        | j         | j        ¦  «        z  }n-| j        | j                             | j         | j        ¦  «        z  }| j        r |                     | j        | j        ¦  «        }| j        r | 	                    | j        | j        ¦  «        }|                     | j
        | j        ¦  «        }|S )z&Constructs the top line of the elementr(   r   r   )ÚwidthÚlenr<   r?   rA   ÚcenterrI   ÚljustrJ   ÚrjustrK   rE   ©rM   Úrets     r2   ÚtopzDrawElement.topJ   sû   € ð ŒJ˜‰N˜qÒ Ð ¥S¨¬Ñ%9Ô%9¸AÑ%=ÀÒ%BÐ%BÅsÈ4ÔK[ÑG\ÔG\Ð`aÒGaÐGaØ”/ T¤\°DÔ4DÑ%D×$LÒ$LØ”
˜DœLñ%ô %ñ ˆCˆCð ”/ DÔ$4×$;Ò$;¸D¼JÈÌÑ$UÔ$UÑUˆCØŒ?ð 	;Ø—)’)˜DœO¨T¬\Ñ:Ô:ˆCØŒ>ð 	:Ø—)’)˜DœN¨D¬LÑ9Ô9ˆCØ�jŠj˜Ô)¨4¬<Ñ8Ô8ˆØˆ
r1   c                 ó<  — | j         | j                             | j        | j        ¦  «        z  }| j        r |                     | j        | j        ¦  «        }| j        r |                     | j        | j        ¦  «        }|                     | j	        | j
        ¦  «        }|S )z)Constructs the middle line of the element)r=   r;   rR   rP   rB   rI   rS   rJ   rT   rK   rD   rU   s     r2   ÚmidzDrawElement.midZ   sŠ   € ð Œo Ô 0× 7Ò 7¸¼
ÀDÔDUÑ VÔ VÑVˆØŒ?ð 	@Ø—)’)˜DœO¨TÔ->Ñ?Ô?ˆCØŒ>ð 	?Ø—)’)˜DœN¨DÔ,=Ñ>Ô>ˆCØ�jŠj˜Ô)¨4¬<Ñ8Ô8ˆØˆ
r1   c                 óú  — | j         dz  dk    rQt          | j        ¦  «        dz  dk    r6| j        | j        | j        z                        | j         | j        ¦  «        z  }n-| j        | j                             | j         | j        ¦  «        z  }| j        r |                     | j        | j        ¦  «        }| j	        r | 
                    | j	        | j        ¦  «        }|                     | j        | j        ¦  «        }|S )z)Constructs the bottom line of the elementr(   r   r   )rP   rQ   r<   r>   rC   r@   rR   rI   rS   rJ   rT   rK   rF   rU   s     r2   ÚbotzDrawElement.bote   så   € ð ŒJ˜‰N˜qÒ Ð ¥S¨¬Ñ%9Ô%9¸AÑ%=ÀÒ%BÐ%BØ”/ T¤\°DÔ4DÑ%D×$LÒ$LØ”
˜DœLñ%ô %ñ ˆCˆCð ”/ DÔ$4×$;Ò$;¸D¼JÈÌÑ$UÔ$UÑUˆCØŒ?ð 	;Ø—)’)˜DœO¨T¬\Ñ:Ô:ˆCØŒ>ð 	:Ø—)’)˜DœN¨D¬LÑ9Ô9ˆCØ�jŠj˜Ô)¨4¬<Ñ8Ô8ˆØˆ
r1   c                 ó�   — t          t          | j        ¦  «        t          | j        ¦  «        t          | j        ¦  «        ¦  «        S )z<Returns the length of the element, including the box around.)ÚmaxrQ   rW   rY   r[   ©rM   s    r2   ÚlengthzDrawElement.lengthu   s.   € õ •3�t”x‘=”=¥# d¤h¡-¤-µ°T´X±´Ñ?Ô?Ð?r1   c                 óF   — | j         r| j         S t          | j        ¦  «        S ©z1Returns the width of the label, including padding)r9   rQ   r;   r^   s    r2   rP   zDrawElement.widthz   s'   € ð Œ;ð 	Ø”;ÐÝ�4Ô#Ñ$Ô$Ð$r1   c                 ó   — || _         d S ©N)r9   )rM   Úvalues     r2   rP   zDrawElement.width�   s   € àˆŒˆˆr1   c                 ó¸   — d|v r| j         r| j         |         | _        d|v r| j        r| j        |         | _        |r| j        dd…         |r|ndz   | _        dS dS )u8  Connects boxes and elements using wire_char and setting proper connectors.

        Args:
            wire_char (char): For example 'â•‘' or 'â”‚'.
            where (list["top", "bot"]): Where the connector should be set.
            label (string): Some connectors have a label (see cu1, for example).
        rW   r[   Néÿÿÿÿr8   )rH   r?   rG   r@   r<   )rM   Ú	wire_charÚwherer:   s       r2   ÚconnectzDrawElement.connect…   s}   € ð �Eˆ>ˆ>˜dÔ0ˆ>Ø#Ô1°)Ô<ˆDÔà�Eˆ>ˆ>˜dÔ0ˆ>Ø#Ô1°)Ô<ˆDÔàð 	NØ"œo¨c¨r¨cÔ2¸uÐ6L°e°eÈ"ÑMˆDŒOˆOˆOð	Nð 	Nr1   rc   )r,   r-   r.   r/   rN   ÚpropertyrW   rY   r[   r_   rP   Úsetterri   r0   r1   r2   r4   r4   ;   sï   € € € € € Ø<Ð<ð
ð 
ð 
ð 
ð ðð ñ „Xðð ðð ñ „Xðð ðð ñ „Xðð ð@ð @ñ „Xð@ð ð%ð %ñ „Xð%ð „\ðð ñ „\ððNð Nð Nð Nð Nð Nr1   r4   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚBoxOnClWireu»   Draws a box on the classical wire.

    ::

        top: â”Œâ”€â”€â”€â”�   â”Œâ”€â”€â”€â”�
        mid: â•¡ A â•ž â•�â•�â•¡ A â•žâ•�â•�
        bot: â””â”€â”€â”€â”˜   â””â”€â”€â”€â”˜
    r8   õ   â”€c                 óÈ   •— t          ¦   «                              |¦  «         d| _        d| _        d| _        dx| _        | _        d| _        || _        || _	        || _
        d S )Nõ   â”Œâ”€%sâ”€â”�u
   â•¡ %s â•žõ   â””â”€%sâ”€â”˜rn   õ   â•�)ÚsuperrN   r<   r=   r>   rA   rC   rD   r?   r@   r;   )rM   r:   r?   r@   Ú	__class__s       €r2   rN   zBoxOnClWire.__init__¢   sc   ø€ Ý‰Œ×Ò˜ÑÔÐØ*ˆŒØ&ˆŒØ*ˆŒØ&+Ð+ˆŒ�t”|ØˆŒØ&ˆÔØ&ˆÔØ ˆÔÐÐr1   )r8   rn   rn   ©r,   r-   r.   r/   rN   Ú__classcell__©rt   s   @r2   rm   rm   ˜   sG   ø€ € € € € ðð ð	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!r1   rm   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚBoxOnQuWireu¹   Draws a box on the quantum wire.

    ::

        top: â”Œâ”€â”€â”€â”�   â”Œâ”€â”€â”€â”�
        mid: â”¤ A â”œ â”€â”€â”¤ A â”œâ”€â”€
        bot: â””â”€â”€â”€â”˜   â””â”€â”€â”€â”˜
    r8   rn   Fc                 óô   •— t          ¦   «                              |¦  «         d| _        d| _        d| _        dx| _        x| _        | _        || _        |rdnd| _	        || _
        ddi| _        ddi| _        d S )	Nrp   u
   â”¤ %s â”œrq   rn   õ   â•¥õ   â”‚õ   â”´õ   â”¬)rs   rN   r<   r=   r>   rA   rC   rD   r?   r@   r;   rH   rG   )rM   r:   r?   Úconditionalrt   s       €r2   rN   zBoxOnQuWire.__init__¸   s„   ø€ Ý‰Œ×Ò˜ÑÔÐØ*ˆŒØ&ˆŒØ*ˆŒØ5:Ð:ˆŒÐ:�t”| d¤lØ&ˆÔØ$/Ð:˜5˜5°UˆÔØ ˆÔØ# U˜^ˆÔØ# U˜^ˆÔÐÐr1   ©r8   rn   Fru   rw   s   @r2   ry   ry   ®   sG   ø€ € € € € ðð ð
,ð 
,ð 
,ð 
,ð 
,ð 
,ð 
,ð 
,ð 
,ð 
,r1   ry   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )Ú	MeasureTou¤   The element on the classic wire to which the measure is performed.

    ::

        top:  â•‘     â•‘
        mid: â•�â•©â•� â•�â•�â•�â•©â•�â•�â•�
        bot:
    r8   c                 ó€   •— t          ¦   «                              ¦   «          d| _        d| _        || _        d| _        d S )Nu    â•‘ u	   â•�â•©â•�rr   )rs   rN   r?   r;   r@   rD   ©rM   r:   rt   s     €r2   rN   zMeasureTo.__init__Ï   s<   ø€ Ý‰Œ×ÒÑÔÐØ"ˆÔØ&ˆÔØ ˆÔØˆŒˆˆr1   ©r8   ru   rw   s   @r2   r‚   r‚   Å   sG   ø€ € € € € ðð ðð ð ð ð ð ð ð ð ð r1   r‚   c                   ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚMeasureFromuÇ   The element on the quantum wire in which the measure is performed.

    ::

        top: â”Œâ”€â”�    â”Œâ”€â”�
        mid: â”¤Mâ”œ â”€â”€â”€â”¤Mâ”œâ”€â”€â”€
        bot: â””â•¥â”˜    â””â•¥â”˜
    c                 óÆ   •— t          ¦   «                              ¦   «          dx| _        x| _        | _        d| _        d| _        d| _        dx| _        | _	        d| _
        d S )Nr6   u	   â”Œâ”€â”�u   â”¤Mâ”œu	   â””â•¥â”˜r7   rn   )rs   rN   r<   r=   r>   r?   r;   r@   rA   rC   rB   )rM   rt   s    €r2   rN   zMeasureFrom.__init__á   sb   ø€ Ý‰Œ×ÒÑÔÐØ>BÐBˆŒÐB˜$œ/¨D¬OØ&ˆÔØ$ˆÔØ&ˆÔà&)Ð)ˆŒ�t”|Ø!ˆÔÐÐr1   ru   rw   s   @r2   r‡   r‡   ×   sB   ø€ € € € € ðð ð"ð "ð "ð "ð "ð "ð "ð "ð "r1   r‡   c                   ó.   — e Zd ZdZd„ Zed„ ¦   «         ZdS )ÚMultiBoxz,Elements that are drawn over multiple wires.c                 óR  — ||cxk    rdk    rn n| j         | _        dS d                     |dz  dz
  ¦  «                             d¦  «        dz   }|dz  dz   }|dz   }||cxk    r|k     r=n dS ||k    r| j         | _        dS ||dz   k    r| j         | _        dS | j         | _        dS dS )zÉIn multi-bit elements, the label is centered vertically.

        Args:
            input_length (int): Rhe amount of wires affected.
            order (int): Which middle element is this one?
        r   NÚ*r(   r   )r:   r?   rR   Úindexr;   r@   )rM   Úinput_lengthÚorderÚlocation_in_the_boxÚ	top_limitÚ	bot_limits         r2   Úcenter_labelzMultiBox.center_labelï   sò   € ð ˜5Ð%Ð%Ò%Ð% AÒ%Ð%Ð%Ð%Ð%Ø#œzˆDÔØˆFØ!Ÿjšj¨¸Ñ)9¸AÑ)=Ñ>Ô>×DÒDÀSÑIÔIÈAÑMÐØ˜A‘I ‘Mˆ	Ø ‘Mˆ	ØÐ+Ð7Ð7Ò7Ð7¨iÒ7Ð7Ð7Ð7Ð7Ð7Ø" iÒ/Ð/Ø#'¤:�Ô Ð Ð Ø$¨	°A©Ò5Ð5Ø#'¤:�Ô Ð Ð à#'¤:�Ô Ð Ð ð 8Ð7r1   c                 óF   — | j         r| j         S t          | j        ¦  «        S ra   )r9   rQ   r:   r^   s    r2   rP   zMultiBox.width  s$   € ð Œ;ð 	Ø”;ÐÝ�4”:‰ŒÐr1   N)r,   r-   r.   r/   r“   rj   rP   r0   r1   r2   rŠ   rŠ   ì   sD   € € € € € Ø6Ð6ð.ð .ð .ð* ðð ñ „Xðð ð r1   rŠ   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚBoxOnQuWireTopzCDraws the top part of a box that affects more than one quantum wirer8   Nc                 ó¬  •— t          ¦   «                              |¦  «         || _        dx| _        | _        d| _        t          | j        ¦  «        | _        dd                     | j        dz   d¦  «        z   dz   | _	        | j	         
                    dd¦  «        | _	        d	| j        › d
�| _        d| j        | j        z  › d�| _        |r|nd| _        d S )Nr7   r8   õ   â”Œâ”€Úsr   rn   õ   â”€â”�r6   õ   â”¤õ    %s â”œr|   õ    %s â”‚)rs   rN   rL   r@   rC   r;   rQ   rJ   rR   r<   Úreplacer=   r>   r?   ©rM   r:   r?   rL   rt   s       €r2   rN   zBoxOnQuWireTop.__init__  sÏ   ø€ Ý‰Œ×Ò˜ÑÔÐØ$ˆŒØ*-Ð-ˆÔ˜4œ<ØˆÔÝ˜Tœ_Ñ-Ô-ˆŒØ" S§Z¢Z°´ÀÑ0BÀEÑ%JÔ%JÑJÈXÑUˆŒØœ/×1Ò1°#°tÑ<Ô<ˆŒØ8 ¤Ð8Ð8Ð8ˆŒØF ¤¨t¬~Ñ =ÐFÐFÐFˆŒØ*5Ð@˜;˜;¸5ˆÔÐÐr1   ©r8   Nr8   ru   rw   s   @r2   r–   r–     sM   ø€ € € € € ØMÐMð
Að 
Að 
Að 
Að 
Að 
Að 
Að 
Að 
Að 
Ar1   r–   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚBoxOnWireMidzA generic middle boxr8   c                 óx  •— t          ¦   «                              |¦  «         dx| _        x| _        x| _        | _        || _        t          | j        ¦  «        | _        d| j        | j        z  › d�| _	        d| j        | j        z  › d�| _
        dx| _        x| _        | _        |                      ||¦  «         d S )Nr7   r|   r�   r8   )rs   rN   rA   rC   r?   r@   rL   rQ   rJ   r<   r>   r;   r“   )rM   r:   rŽ   r�   rL   rt   s        €r2   rN   zBoxOnWireMid.__init__  s»   ø€ Ý‰Œ×Ò˜ÑÔÐØLOÐOˆŒÐO�t”|ÐO dÔ&6¸Ô9IØ$ˆŒÝ˜Tœ_Ñ-Ô-ˆŒØF ¤¨t¬~Ñ =ÐFÐFÐFˆŒØF ¤¨t¬~Ñ =ÐFÐFÐFˆŒØACÐCˆÔÐC˜4Ô+¨dÔ.>Ø×Ò˜,¨Ñ.Ô.Ð.Ð.Ð.r1   r…   ru   rw   s   @r2   r¢   r¢     sC   ø€ € € € € ØÐð/ð /ð /ð /ð /ð /ð /ð /ð /ð /r1   r¢   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚBoxOnQuWireMidzFDraws the middle part of a box that affects more than one quantum wirer8   Nc                 óœ   •— t          ¦   «                              ||||¬¦  «         |r|› | j        › d�| _        d S d| j        › d�| _        d S )N©rL   rœ   r›   ©rs   rN   rL   r=   )rM   r:   rŽ   r�   rL   Úcontrol_labelrt   s         €r2   rN   zBoxOnQuWireMid.__init__-  s_   ø€ Ý‰Œ×Ò˜ ¨eÀ
ÐÑKÔKÐKØð 	=Ø!.ÐH°´ÐHÐHÐHˆDŒOˆOˆOà< D¤OÐ<Ð<Ð<ˆDŒOˆOˆOr1   )r8   Nru   rw   s   @r2   r¥   r¥   *  sC   ø€ € € € € ØPÐPð=ð =ð =ð =ð =ð =ð =ð =ð =ð =r1   r¥   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚBoxOnQuWireBotzFDraws the bottom part of a box that affects more than one quantum wireNr8   Fc                 óÖ  •— t          ¦   «                              |¦  «         || _        d| _        t	          | j        ¦  «        | _        d| j        | j        z  › d�| _        d| j        › d�| _        dd                     | j        dz   d	¦  «        z   d
z   | _	        | j	         
                    dd¦  «        | _	        |r|nd	}|rdn|| _        dx| _        | _        |dk    r	|| _        d S d S )Nr7   r|   r�   r›   rœ   õ   â””â”€r™   r   rn   õ   â”€â”˜r6   r{   r8   r(   )rs   rN   rL   rA   rQ   rJ   r<   r=   rR   r>   rž   r@   r;   r?   )rM   r:   rŽ   r@   rL   r   rt   s         €r2   rN   zBoxOnQuWireBot.__init__8  sø   ø€ Ý‰Œ×Ò˜ÑÔÐØ$ˆŒØˆŒÝ˜Tœ_Ñ-Ô-ˆŒØF ¤¨t¬~Ñ =ÐFÐFÐFˆŒØ8 ¤Ð8Ð8Ð8ˆŒØ" S§Z¢Z°´ÀÑ0BÀEÑ%JÔ%JÑJÈXÑUˆŒØœ/×1Ò1°#°tÑ<Ô<ˆŒØ%0Ð;�k�k°eˆØ$/Ð@˜5˜5°[ˆÔà.0Ð0ˆÔ˜4Ô+Ø˜1ÒÐØ$ˆDÔÐÐð Ðr1   ©Nr8   Fru   rw   s   @r2   r«   r«   5  sC   ø€ € € € € ØPÐPð%ð %ð %ð %ð %ð %ð %ð %ð %ð %r1   r«   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚFlowOnQuWirez5Draws a box for a ControlFlowOp using a single qubit.r8   rn   Fc                 ó6  •— t          ¦   «                              |¦  «         |t          k    rd| _        d| _        d| _        nd| _        d| _        d| _        dx| _        x| _        | _        || _	        |rdnd| _
        || _        d	d
i| _        d	di| _        d S )Nu    â”€%sâ”€â”�u     %s â”œu    â”€%sâ”€â”˜u   â”Œâ”€%sâ”€ u   â”¤ %s  u   â””â”€%sâ”€ rn   r{   r|   r}   r~   )rs   rN   ÚCF_RIGHTr<   r=   r>   rA   rC   rD   r?   r@   r;   rH   rG   )rM   Úsectionr:   r?   r   rt   s        €r2   rN   zFlowOnQuWire.__init__L  s¦   ø€ Ý‰Œ×Ò˜ÑÔÐØ•hÒÐØ,ˆDŒOØ(ˆDŒOØ,ˆDŒOˆOà,ˆDŒOØ(ˆDŒOØ,ˆDŒOØ5:Ð:ˆŒÐ:�t”| d¤lØ&ˆÔØ$/Ð:˜5˜5°UˆÔØ ˆÔØ# U˜^ˆÔØ# U˜^ˆÔÐÐr1   r€   ru   rw   s   @r2   r±   r±   I  sC   ø€ € € € € Ø?Ð?ð,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,r1   r±   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚFlowOnQuWireTopzIDraws the top of a box for a ControlFlowOp that uses more than one qubit.r8   Nc                 ó   •— t          ¦   «                              |¦  «         || _        dx| _        | _        d| _        t          | j        ¦  «        | _        |t          k    rod 	                    | j        dz   d¦  «        dz   | _
        | j
                             dd¦  «        | _
        d| j        › d�| _        d| j        | j        z  › d	�| _        nqd
d 	                    | j        dz   d¦  «        z   dz   | _
        | j
                             dd¦  «        | _
        d| j        › d�| _        d| j        | j        z  › d�| _        |r|nd| _        d S )Nr7   r8   r™   r(   rn   rš   r6   rœ   r�   r˜   r›   ú %s  r|   )rs   rN   rL   r@   rC   r;   rQ   rJ   r³   rR   r<   rž   r=   r>   r?   )rM   r´   r:   r?   rL   rt   s        €r2   rN   zFlowOnQuWireTop.__init__a  sF  ø€ Ý‰Œ×Ò˜ÑÔÐØ$ˆŒØ*-Ð-ˆÔ˜4œ<ØˆÔÝ˜Tœ_Ñ-Ô-ˆŒØ•hÒÐØ!Ÿjšj¨¬¸!Ñ);¸UÑCÔCÀhÑNˆDŒOØ"œo×5Ò5°c¸4Ñ@Ô@ˆDŒOØ: $¤/Ð:Ð:Ð:ˆDŒOØH $¤,°´Ñ"?ÐHÐHÐHˆDŒOˆOà&¨¯ª°D´NÀQÑ4FÈÑ)NÔ)NÑNÐQTÑTˆDŒOØ"œo×5Ò5°c¸4Ñ@Ô@ˆDŒOØ: D¤OÐ:Ð:Ð:ˆDŒOØH D¤L°4´>Ñ$AÐHÐHÐHˆDŒOØ*5Ð@˜;˜;¸5ˆÔÐÐr1   r    ru   rw   s   @r2   r¶   r¶   ^  sM   ø€ € € € € ØSÐSðAð Að Að Að Að Að Að Að Að Ar1   r¶   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚFlowOnQuWireMidzLDraws the middle of a box for a ControlFlowOp that uses more than one qubit.r8   c                 ó0  •— t          ¦   «                              |¦  «         dx| _        x| _        x| _        | _        || _        t          | j        ¦  «        | _        |t          k    rAd| j        | j        z  › d�| _
        d| j        | j        z  › d�| _        d| j        › d�| _        n@d| j        | j        z  › d�| _
        d| j        | j        z  › d�| _        d| j        › d�| _        dx| _        x| _        | _        |                      ||¦  «         d S )Nr7   r�   rœ   r|   r¸   r›   r8   )rs   rN   rA   rC   r?   r@   rL   rQ   rJ   r³   r<   r>   r=   r;   r“   )rM   r´   r:   rŽ   r�   rL   rt   s         €r2   rN   zFlowOnQuWireMid.__init__w  s&  ø€ Ý‰Œ×Ò˜ÑÔÐØLOÐOˆŒÐO�t”|ÐO dÔ&6¸Ô9IØ$ˆŒÝ˜Tœ_Ñ-Ô-ˆŒØ•hÒÐØH $¤,°´Ñ"?ÐHÐHÐHˆDŒOØH $¤,°´Ñ"?ÐHÐHÐHˆDŒOØ: $¤/Ð:Ð:Ð:ˆDŒOˆOàH D¤L°4´>Ñ$AÐHÐHÐHˆDŒOØH D¤L°4´>Ñ$AÐHÐHÐHˆDŒOØ: D¤OÐ:Ð:Ð:ˆDŒOØACÐCˆÔÐC˜4Ô+¨dÔ.>Ø×Ò˜,¨Ñ.Ô.Ð.Ð.Ð.r1   r…   ru   rw   s   @r2   rº   rº   t  sC   ø€ € € € € ØVÐVð/ð /ð /ð /ð /ð /ð /ð /ð /ð /r1   rº   c                   ó*   ‡ — e Zd ZdZ	 	 	 dˆ fd„	Zˆ xZS )ÚFlowOnQuWireBotzLDraws the bottom of a box for a ControlFlowOp that uses more than one qubit.Nr8   Fc                 óÐ  •— t          ¦   «                              |¦  «         || _        d| _        t	          | j        ¦  «        | _        |t          k    rrd| j        | j        z  › d�| _        d| j        › d�| _        dd 	                    | j        dz   d¦  «        z   dz   | _
        | j
                             dd¦  «        | _
        nqd	| j        | j        z  › d
�| _        d| j        › d
�| _        dd 	                    | j        dz   d¦  «        z   dz   | _
        | j
                             dd¦  «        | _
        |r|nd}|rdn|| _        dx| _        | _        |dk    r	|| _        d S d S )Nr7   r�   rœ   r™   r(   rn   r®   r6   r|   r¸   r›   r­   r{   r8   )rs   rN   rL   rA   rQ   rJ   r³   r<   r=   rR   r>   rž   r@   r;   r?   )rM   r´   r:   rŽ   r@   rL   r   rt   s          €r2   rN   zFlowOnQuWireBot.__init__‹  sv  ø€ õ 	‰Œ×Ò˜ÑÔÐØ$ˆŒØˆŒÝ˜Tœ_Ñ-Ô-ˆŒØ•hÒÐØH $¤,°´Ñ"?ÐHÐHÐHˆDŒOØ: $¤/Ð:Ð:Ð:ˆDŒOØ! C§J¢J¨t¬~ÀÑ/AÀ5Ñ$IÔ$IÑIÈHÑTˆDŒOØ"œo×5Ò5°c¸4Ñ@Ô@ˆDŒOˆOàH D¤L°4´>Ñ$AÐHÐHÐHˆDŒOØ: D¤OÐ:Ð:Ð:ˆDŒOØ&¨¯ª°D´NÀQÑ4FÈÑ)NÔ)NÑNÐQTÑTˆDŒOØ"œo×5Ò5°c¸4Ñ@Ô@ˆDŒOØ%0Ð;�k�k°eˆØ$/Ð@˜5˜5°[ˆÔà.0Ð0ˆÔ˜4Ô+Ø˜1ÒÐØ$ˆDÔÐÐð Ðr1   r¯   ru   rw   s   @r2   r½   r½   ˆ  sN   ø€ € € € € ØVÐVð ØØð%ð %ð %ð %ð %ð %ð %ð %ð %ð %r1   r½   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚBoxOnClWireTopzQDraws the top part of a conditional box that affects more than one classical wirer8   Nc                 ó¦   •— t          ¦   «                              |¦  «         || _        d| _        d| _        |r|nd| _        dx| _        | _        d S )Nr8   u
   â”‚ %s â”‚rn   r7   )rs   rN   rL   r;   r>   r?   r@   rC   rŸ   s       €r2   rN   zBoxOnClWireTop.__init__­  sU   ø€ Ý‰Œ×Ò˜ÑÔÐØ$ˆŒØˆÔØ&ˆŒØ*5Ð@˜;˜;¸5ˆÔØ*-Ð-ˆÔ˜4œ<˜<˜<r1   r    ru   rw   s   @r2   rÀ   rÀ   ª  sC   ø€ € € € € Ø[Ð[ð.ð .ð .ð .ð .ð .ð .ð .ð .ð .r1   rÀ   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚBoxOnClWireMidzTDraws the middle part of a conditional box that affects more than one classical wirer8   c                 ór   •— t          ¦   «                              ||||¬¦  «         d| j        › d�| _        d S )Nr§   õ   â•¡õ    %s â•žr¨   )rM   r:   rŽ   r�   rL   Ú_rt   s         €r2   rN   zBoxOnClWireMid.__init__¹  s<   ø€ Ý‰Œ×Ò˜ ¨eÀ
ÐÑKÔKÐKØ8 ¤Ð8Ð8Ð8ˆŒˆˆr1   r…   ru   rw   s   @r2   rÃ   rÃ   ¶  sC   ø€ € € € € Ø^Ð^ð9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9r1   rÃ   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚBoxOnClWireBotzTDraws the bottom part of a conditional box that affects more than one classical wirern   r8   c                 óÜ  •— t          ¦   «                              |¦  «         || _        t          | j        ¦  «        | _        d| _        d| _        d| j        | j        z  › d�| _        d| j        › d�| _        dd 	                    | j        d	z   d¦  «        z   d
z   | _
        | j
                             dd¦  «        | _
        |r|nd}|| _        dx| _        | _        |dk    r	|| _        d S d S )Nr7   rn   r|   r�   rÅ   rÆ   r­   r™   r   r®   r6   r8   r(   )rs   rN   rL   rQ   rJ   rA   rC   r<   r=   rR   r>   rž   r@   r;   r?   )rM   r:   rŽ   r@   rL   rÇ   rt   s         €r2   rN   zBoxOnClWireBot.__init__Á  sö   ø€ Ý‰Œ×Ò˜ÑÔÐØ$ˆŒÝ˜Tœ_Ñ-Ô-ˆŒØˆŒØˆŒØF ¤¨t¬~Ñ =ÐFÐFÐFˆŒØ8 ¤Ð8Ð8Ð8ˆŒØ" S§Z¢Z°´ÀÑ0BÀEÑ%JÔ%JÑJÈXÑUˆŒØœ/×1Ò1°#°tÑ<Ô<ˆŒØ%0Ð;�k�k°eˆØ&ˆÔà.0Ð0ˆÔ˜4Ô+Ø˜1ÒÐØ$ˆDÔÐÐð Ðr1   )rn   r8   ru   rw   s   @r2   rÉ   rÉ   ¾  sC   ø€ € € € € Ø^Ð^ð%ð %ð %ð %ð %ð %ð %ð %ð %ð %r1   rÉ   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚDirectOnQuWirez0
    Element to the wire (without the box).
    r8   c                 ó¸   •— t          ¦   «                              |¦  «         d| _        d| _        d| _        dx| _        | _        dddœ| _        dddœ| _        d S )Nú %s u   â”€%sâ”€rn   r|   õ   â•‘©r|   rÏ   ©	rs   rN   r<   r=   r>   rB   rD   rH   rG   r„   s     €r2   rN   zDirectOnQuWire.__init__Ø  óe   ø€ Ý‰Œ×Ò˜ÑÔÐØ ˆŒØ$ˆŒØ ˆŒØ+0Ð0ˆÔ˜DœLØ%*°5Ð9Ð9ˆÔØ%*°5Ð9Ð9ˆÔÐÐr1   r…   ru   rw   s   @r2   rÌ   rÌ   Ó  óG   ø€ € € € € ðð ð:ð :ð :ð :ð :ð :ð :ð :ð :ð :r1   rÌ   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚBarrieru§   Draws a barrier with a label at the top if there is one.

    ::

        top:  â–‘   label
        mid: â”€â–‘â”€ â”€â”€â”€â–‘â”€â”€â”€
        bot:  â–‘     â–‘
    r8   c                 óŠ   •— t          ¦   «                              d¦  «         |r|nd| _        d| _        i | _        i | _        d S )Nu   â–‘)rs   rN   r?   r@   rH   rG   r„   s     €r2   rN   zBarrier.__init__ì  sJ   ø€ Ý‰Œ×Ò˜ÑÔÐØ$)Ð4˜5˜5¨uˆÔØ ˆÔØˆÔØˆÔÐÐr1   r…   ru   rw   s   @r2   rÕ   rÕ   â  sG   ø€ € € € € ðð ð ð  ð  ð  ð  ð  ð  ð  ð  ð  r1   rÕ   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚExu¦   Draws an X (usually with a connector). E.g. the top part of a swap gate.

    ::

        top:
        mid: â”€Xâ”€ â”€â”€â”€Xâ”€â”€â”€
        bot:  â”‚     â”‚
    r7   Fc                 ón   •— t          ¦   «                              d¦  «         |rdn|| _        || _        d S )NÚXrÏ   )rs   rN   r@   r?   )rM   r@   r?   r   rt   s       €r2   rN   zEx.__init__þ  s:   ø€ Ý‰Œ×Ò˜ÑÔÐØ$/Ð@˜5˜5°[ˆÔØ&ˆÔÐÐr1   )r7   r7   Fru   rw   s   @r2   rØ   rØ   ô  sG   ø€ € € € € ðð ð'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'r1   rØ   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚResetDisplayzDraws a reset gateFc                 ó`   •— t          ¦   «                              d¦  «         |r	d| _        d S d S )Nú|0>rÏ   )rs   rN   r@   )rM   r   rt   s     €r2   rN   zResetDisplay.__init__  s;   ø€ Ý‰Œ×Ò˜ÑÔÐØð 	%Ø$ˆDÔÐÐð	%ð 	%r1   ©Fru   rw   s   @r2   rÜ   rÜ     sC   ø€ € € € € ØÐð%ð %ð %ð %ð %ð %ð %ð %ð %ð %r1   rÜ   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚBulletu®   Draws a bullet (usually with a connector). E.g. the top part of a CX gate.

    ::

        top:
        mid: â”€â– â”€  â”€â”€â”€â– â”€â”€â”€
        bot:  â”‚      â”‚
    r8   FNc                 ó´   •— t          ¦   «                              d¦  «         || _        || _        |rdn|| _        |r
|r|| _        n	|r|| _        d| _        d S )Nõ   â– rÏ   rn   ©rs   rN   r   r?   r@   rD   ©rM   r?   r@   r   r:   Úbottomrt   s         €r2   rN   zBullet.__init__  sq   ø€ Ý‰Œ×Ò˜ÑÔÐØ&ˆÔØ&ˆÔØ$/Ð@˜5˜5°[ˆÔØð 	%�Vð 	%Ø$ˆDÔÐØð 	%Ø$ˆDÔØˆŒˆˆr1   ©r8   r8   FNFru   rw   s   @r2   rá   rá     óG   ø€ € € € € ðð ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	r1   rá   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )Ú
OpenBulletu°   Draws an open bullet (usually with a connector). E.g. the top part of a CX gate.

    ::

        top:
        mid: â”€oâ”€  â”€â”€â”€oâ”€â”€â”€
        bot:  â”‚      â”‚
    r8   FNc                 ó´   •— t          ¦   «                              d¦  «         || _        || _        |rdn|| _        |r
|r|| _        n	|r|| _        d| _        d S )NÚorÏ   rn   rä   rå   s         €r2   rN   zOpenBullet.__init__-  sq   ø€ Ý‰Œ×Ò˜ÑÔÐØ&ˆÔØ&ˆÔØ$/Ð@˜5˜5°[ˆÔØð 	%�Vð 	%Ø$ˆDÔÐØð 	%Ø$ˆDÔØˆŒˆˆr1   rç   ru   rw   s   @r2   rê   rê   #  rè   r1   rê   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚDirectOnClWirez:
    Element to the classical wire (without the box).
    r8   c                 ó¸   •— t          ¦   «                              |¦  «         d| _        d| _        d| _        dx| _        | _        dddœ| _        dddœ| _        d S )NrÎ   u   â•�%sâ•�rr   r|   rÏ   rÐ   rÑ   r„   s     €r2   rN   zDirectOnClWire.__init__>  rÒ   r1   r…   ru   rw   s   @r2   rî   rî   9  rÓ   r1   rî   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚClBulletuÀ   Draws a bullet on classical wire (usually with a connector). E.g. the top part of a CX gate.

    ::

        top:
        mid: â•�â– â•�  â•�â•�â•�â– â•�â•�â•�
        bot:  â”‚      â”‚
    r8   FNc                 ó¦   •— t          ¦   «                              d¦  «         || _        |rdn|| _        |r
|r|| _        n	|r|| _        d| _        d S )Nrã   rÏ   rr   ©rs   rN   r?   r@   rD   rå   s         €r2   rN   zClBullet.__init__R  si   ø€ Ý‰Œ×Ò˜ÑÔÐØ&ˆÔØ$/Ð@˜5˜5°[ˆÔØð 	%�Vð 	%Ø$ˆDÔÐØð 	%Ø$ˆDÔØˆŒˆˆr1   rç   ru   rw   s   @r2   rñ   rñ   H  óG   ø€ € € € € ðð ðð ð ð ð ð ð ð ð ð r1   rñ   c                   ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚClOpenBulletuÂ   Draws an open bullet on classical wire (usually with a connector). E.g. the top part of a CX gate.

    ::

        top:
        mid: â•�oâ•�  â•�â•�â•�oâ•�â•�â•�
        bot:  â”‚      â”‚
    r8   FNc                 ó¦   •— t          ¦   «                              d¦  «         || _        |rdn|| _        |r
|r|| _        n	|r|| _        d| _        d S )Nrì   rÏ   rr   ró   rå   s         €r2   rN   zClOpenBullet.__init__g  si   ø€ Ý‰Œ×Ò˜ÑÔÐØ&ˆÔØ$/Ð@˜5˜5°[ˆÔØð 	%�Vð 	%Ø$ˆDÔÐØð 	%Ø$ˆDÔØˆŒˆˆr1   rç   ru   rw   s   @r2   rö   rö   ]  rô   r1   rö   c                   ó8   ‡ — e Zd ZdZˆ fd„Zed„ ¦   «         Zˆ xZS )Ú	EmptyWirez2This element is just the wire, with no operations.c                 óf   •— t          ¦   «                              |¦  «         |x| _        | _        d S rc   )rs   rN   rB   rD   )rM   Úwirert   s     €r2   rN   zEmptyWire.__init__u  s.   ø€ Ý‰Œ×Ò˜ÑÔÐØ+/Ð/ˆÔ˜DœL˜L˜Lr1   c                 óŒ   — d„ t          | ¦  «        D ¦   «         D ])}||k    rt          d¦  «        nt          d¦  «        | |<   Œ*| S )a  Given a layer, replace the Nones in it with EmptyWire elements.

        Args:
            layer (list): The layer that contains Nones.
            first_clbit (int): The first wire that is classic.

        Returns:
            list: The new layer, with no Nones.
        c                 ó   — g | ]	\  }}|­|‘Œ
S rc   r0   )Ú.0ÚiÚxs      r2   ú
<listcomp>z*EmptyWire.fillup_layer.<locals>.<listcomp>„  s   € ÐBÐBÐB™D˜A˜q¸¸	�a¸	¸	¸	r1   rr   rn   )Ú	enumeraterù   )ÚlayerÚfirst_clbitÚnoness      r2   Úfillup_layerzEmptyWire.fillup_layery  s\   € ð CÐB¥I¨eÑ$4Ô$4ÐBÑBÔBð 	Zð 	ZˆEØ/4¸Ò/CÐ/C�9 UÑ+Ô+Ð+ÍÐSXÑIYÔIYˆE�%‰LˆLØˆr1   ©r,   r-   r.   r/   rN   Ústaticmethodr  rv   rw   s   @r2   rù   rù   r  sY   ø€ € € € € Ø<Ð<ð0ð 0ð 0ð 0ð 0ð ðð ñ „\ðð ð ð ð r1   rù   c                   ó8   ‡ — e Zd ZdZˆ fd„Zed„ ¦   «         Zˆ xZS )Ú	BreakWirez;This element is used to break the drawing in several pages.c                 óœ   •— t          ¦   «                              ¦   «          dx| _        x| _        | _        || _        || _        || _        d S )Nr6   )rs   rN   r<   r=   r>   r?   r;   r@   )rM   Ú
arrow_charrt   s     €r2   rN   zBreakWire.__init__Œ  sL   ø€ Ý‰Œ×ÒÑÔÐØ>BÐBˆŒÐB˜$œ/¨D¬OØ%ˆÔØ%ˆÔØ%ˆÔÐÐr1   c                 ór   — g }t          | ¦  «        D ]$}|                     t          |¦  «        ¦  «         Œ%|S )a  Creates a layer with BreakWire elements.

        Args:
            layer_length (int): The length of the layer to create
            arrow_char (char): The char used to create the BreakWire element.

        Returns:
            list: The new layer.
        )ÚrangeÚappendr
  )Úlayer_lengthr  Úbreakwire_layerrÇ   s       r2   r  zBreakWire.fillup_layer“  sE   € ð ˆÝ�|Ñ$Ô$ð 	:ð 	:ˆAØ×"Ò"¥9¨ZÑ#8Ô#8Ñ9Ô9Ð9Ð9ØÐr1   r  rw   s   @r2   r
  r
  ‰  sY   ø€ € € € € ØEÐEð&ð &ð &ð &ð &ð ðð ñ „\ðð ð ð ð r1   r
  c                   ó8   ‡ — e Zd ZdZˆ fd„Zed„ ¦   «         Zˆ xZS )Ú	InputWirez:This element is the label and the initial value of a wire.c                 óJ   •— t          ¦   «                              |¦  «         d S rc   )rs   rN   r„   s     €r2   rN   zInputWire.__init__§  s!   ø€ Ý‰Œ×Ò˜ÑÔÐÐÐr1   c                 ó°   — t          d„ | D ¦   «         ¦  «        }g }| D ]7}|                     t          |                     |¦  «        ¦  «        ¦  «         Œ8|S )z©Creates a layer with InputWire elements.

        Args:
            names (list): List of names for the wires.

        Returns:
            list: The new layer
        c              3   ó4   K  — | ]}t          |¦  «        V — Œd S rc   )rQ   )rþ   Únames     r2   ú	<genexpr>z)InputWire.fillup_layer.<locals>.<genexpr>´  s(   è è € Ð2Ð2 D•c˜$‘i”iÐ2Ð2Ð2Ð2Ð2Ð2r1   )r]   r  r  rT   )ÚnamesÚlongestÚinputs_wiresr  s       r2   r  zInputWire.fillup_layerª  sg   € õ Ð2Ð2¨EÐ2Ñ2Ô2Ñ2Ô2ˆØˆØð 	@ð 	@ˆDØ×Ò¥	¨$¯*ª*°WÑ*=Ô*=Ñ >Ô >Ñ?Ô?Ð?Ð?ØÐr1   r  rw   s   @r2   r  r  ¤  sY   ø€ € € € € ØDÐDð ð  ð  ð  ð  ð ðð ñ „\ðð ð ð ð r1   r  c                   óÜ   — e Zd ZdZ	 	 	 	 	 	 	 	 	 dd„Zd„ Zd	„ Zd
„ Zd„ Zdd„Z	dd„Z
dd„Zd„ Zd„ Zed„ ¦   «         Zedd„¦   «         Zed„ ¦   «         Zed„ ¦   «         Zd„ Zd„ Zd„ Zdd„ZdS ) ÚTextDrawingzThe text drawingFTNÚhighé   c                 ó²  — || _         || _        || _        || _        |r+| j        j        r| j        j        j        | _        nd | _        nd | _        |	| _        |j        | _        || _	        || _
        || _        || _        |dvrt          d¦  «        ‚|| _        i | _        |
| _        |pt"          j        j        pd| _        d| _        d| _        d| _        d S )N)r  ÚmediumÚlowz;Vertical compression can only be 'high', 'medium', or 'low'Úutf8r   r8   )ÚqubitsÚclbitsÚnodesÚ_circuitÚ_layoutÚinitial_layoutÚlayoutÚinitial_stateÚglobal_phaseÚplotbarriersÚreverse_bitsÚline_lengthÚexpr_lenÚ
ValueErrorÚvertical_compressionÚ	_wire_mapÚ
cregbundleÚsysÚstdoutÚencodingÚ_nest_depthÚ
_expr_textÚ_single_string)rM   r$  r%  r&  Úcircuitr.  r-  r/  r2  r+  r4  r7  Úwith_layoutr0  s                 r2   rN   zTextDrawing.__init__¾  sî   € ð  ˆŒØˆŒØˆŒ
ØˆŒØð 	ØŒ}Ô$ð #Ø"œmÔ3ÔB�”�à"�”�àˆDŒKà*ˆÔØ#Ô0ˆÔØ(ˆÔØ(ˆÔØ&ˆÔØ ˆŒØÐ'@Ð@Ð@ÝÐZÑ[Ô[Ð[Ø$8ˆÔ!ØˆŒØ$ˆŒà ÐA¥C¤JÔ$7ÐA¸6ˆŒàˆÔØˆŒð
 !ˆÔÐÐr1   c                 ó*   — |                       ¦   «         S rc   ©Úsingle_stringr^   s    r2   Ú__str__zTextDrawing.__str__ð  ó   € Ø×!Ò!Ñ#Ô#Ð#r1   c                 ó2   — d|                       ¦   «         › d�S )NzŠ<pre style="word-wrap: normal;white-space: pre;background: #fff0;line-height: 1.1;font-family: &quot;Courier New&quot;,Courier,monospace">z</pre>r>  r^   s    r2   Ú_repr_html_zTextDrawing._repr_html_ó  s,   € ð,ð
 ×!Ò!Ñ#Ô#ð,ð ,ð ,ð	
r1   c                 ó*   — |                       ¦   «         S rc   r>  r^   s    r2   Ú__repr__zTextDrawing.__repr__ý  rA  r1   c                 ó  — | j         r| j         S 	 d                     |                      ¦   «         ¦  «                             | j        ¦  «                             | j        ¦  «        | _         n˜# t          t          f$ r„ t          d| j        › d�t          ¦  «         d| _        d                     |                      ¦   «         ¦  «                             | j        ¦  «                             | j        ¦  «        | _         Y nw xY w| j         S )z{Creates a long string with the ascii art.
        Returns:
            str: The lines joined by a newline (``\n``)
        ú
zThe encoding zf has a limited charset. Consider a different encoding in your environment. UTF-8 is being used insteadzutf-8)
r:  ÚjoinÚlinesÚencoder7  ÚdecodeÚUnicodeEncodeErrorÚUnicodeDecodeErrorr   ÚRuntimeWarningr^   s    r2   r?  zTextDrawing.single_string   s
  € ð Ôð 	'ØÔ&Ð&ð	à—	’	˜$Ÿ*š*™,œ,Ñ'Ô'×.Ò.¨t¬}Ñ=Ô=×DÒDÀTÄ]ÑSÔSð ÔÐøõ #Õ$6Ð7ð 
	ð 
	ð 
	Ýð; ¤ð ;ð ;ð ;õ ñ	ô ð ð $ˆDŒMà—	’	˜$Ÿ*š*™,œ,Ñ'Ô'×.Ò.¨t¬}Ñ=Ô=×DÒDÀTÄ]ÑSÔSð ÔÐÐð
	øøøð Ô"Ð"s   �AA- Á-BDÄDc                 ó¸   — t          |d|p| j        ¬¦  «        5 }|                     |                      ¦   «         ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zÀDumps the ascii art in the file.

        Args:
            filename (str): File to dump the ascii art.
            encoding (str): Optional. Force encoding, instead of self.encoding.
        Úw)Úmoder7  N)Úopenr7  Úwriter?  )rM   Úfilenamer7  Ú	text_files       r2   ÚdumpzTextDrawing.dump  sŸ   € õ �( ¨xÐ/H¸4¼=ÐIÑIÔIð 	2ÈYØ�OŠO˜D×.Ò.Ñ0Ô0Ñ1Ô1Ð1ð	2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øøøð 	2ð 	2ð 	2ð 	2ð 	2ð 	2s   š(AÁAÁAc                 ób  — |€| j         }|s0dt          j        v rdt          j        vrd}nt          ¦   «         \  }}t	          | j        ¦  «        }|                      ¦   «         }g g}|}t          |¦  «        D �]Í\  }}t           	                    ||¦  «        ||<   t                               |¦  «         |dk    r|d                              |¦  «         Œ`||         d         j        }	|	|k     r!|d                              |¦  «         ||	z  }Œš|d                              t           	                    t	          |¦  «        d¦  «        ¦  «         |                     t           	                    t	          |¦  «        d¦  «        g¦  «         ||d         d         d         j        z
  }|d                              t           	                    |                      d	¬
¦  «        ¦  «        ¦  «         ||d         d         d         j        z  }|d                              |¦  «         ||d         d         d         j        z  }�ŒÏg }
| j        r,|
                     dt%          | j        d¬¦  «        › �¦  «         |D ]0}t'          t)          |Ž ¦  «        }|
|                      |¦  «        z  }
Œ1|
S )aD  Generates a list with lines. These lines form the text drawing.

        Args:
            line_length (int): Optional. Breaks the circuit drawing to this length. This is
                               useful when the drawing does not fit in the console. If
                               None (default), it will try to guess the console width using
                               shutil.get_terminal_size(). If you don't want pagination
                               at all, set line_length=-1.

        Returns:
            list: A list of lines with the text drawing.
        NÚ	ipykernelÚspyderéP   rf   r   õ   Â»õ   Â«F©Úwith_initial_statezglobal phase: é   ©Úndigits)r/  r5  Úmodulesr   rQ   r$  Úbuild_layersr  rù   r  r  Únormalize_widthr  r_   r
  r  Ú
wire_namesr,  r   ÚlistÚzipÚ
draw_wires)rM   r/  rÇ   ÚnoqubitsÚlayersÚlayer_groupsÚrest_of_the_lineÚlayernor  r  rI  Úlayer_groupÚwiress                r2   rI  zTextDrawing.lines$  s¶  € ð ÐØÔ*ˆKØð 	5Ø�sœ{Ð*Ð*°ÅÄÐ1LÐ1LØ ��å!2Ñ!4Ô!4‘�˜Qå�t”{Ñ#Ô#ˆà×"Ò"Ñ$Ô$ˆØ�tˆØ&ÐÝ'¨Ñ/Ô/ð 	Cñ 	C‰NˆG�Uå'×4Ò4°U¸HÑEÔEˆF�7‰Oå×'Ò'¨Ñ.Ô.Ð.à˜bÒ Ð à˜RÔ ×'Ò'¨Ñ.Ô.Ð.Øð " 'œ?¨1Ô-Ô4ˆLàÐ.Ò.Ð.Ø˜RÔ ×'Ò'¨Ñ.Ô.Ð.Ø  LÑ0Ð Ð à˜RÔ ×'Ò'­	×(>Ò(>½sÀ5¹z¼zÈ4Ñ(PÔ(PÑQÔQÐQð ×#Ò#¥Y×%;Ò%;½CÀ¹J¼JÈÑ%MÔ%MÐ$NÑOÔOÐOØ#.°¸bÔ1AÀ"Ô1EÀaÔ1HÔ1OÑ#OÐ à˜RÔ ×'Ò'Ý×*Ò*¨4¯?ª?Èe¨?Ñ+TÔ+TÑUÔUñô ð ð ! L°Ô$4°RÔ$8¸Ô$;Ô$BÑBÐ à˜RÔ ×'Ò'¨Ñ.Ô.Ð.Ø  L°Ô$4°RÔ$8¸Ô$;Ô$BÑBÐ Ñ àˆàÔð 	TØ�LŠLÐR­(°4Ô3DÈaÐ*PÑ*PÔ*PÐRÐRÑSÔSÐSà'ð 	,ð 	,ˆKÝ�˜kÐ*Ñ+Ô+ˆEØ�T—_’_ UÑ+Ô+Ñ+ˆEˆEàˆr1   c                 óV  — |rd}d}nd}d}t          | j        | j        | j        z   | j        ¦  «        | _        g }| j                             ¦   «         D ]Ô\  }}t          |t          ¦  «        r|}nt          | j        |¦  «        \  }}}	|€|n|	}t          d||| j        | j        ¬¦  «        }
|
| j        �t          |t          ¦  «        rdndz  }
d}t          |t          ¦  «        r|}n"|}| j        r|�t          |j        ¦  «        d	z   }|                     |
|z   |z   ¦  «         ŒÕ|S )
zùReturns a list of names for each wire.

        Args:
            with_initial_state (bool): Optional (Default: False). If true, adds
                the initial value to the name.

        Returns:
            List: The list of wire names.
        rÞ   z0 r8   NÚtext)r*  r4  r7   z: ú/)r"   r'  r$  r%  r4  r3  ÚitemsÚ
isinstancer   r$   r%   r*  r   ÚstrÚsizer  )rM   r^  Úinitial_qubit_valueÚinitial_clbit_valueÚwire_labelsrû   r�   ÚregisterÚ	bit_indexÚ	reg_indexrL   Ú	cregb_addÚinitial_bit_values                r2   re  zTextDrawing.wire_namesi  sn  € ð ð 	%Ø"'ÐØ"&ÐÐà"$ÐØ"$Ðå% d¤m°d´kÀDÄKÑ6OÐRVÔRaÑbÔbˆŒØˆØœ>×/Ò/Ñ1Ô1ð 	Kð 	K‰KˆD�%Ý˜$Õ 1Ñ2Ô2ð EØ��å1BÀ4Ä=ÐRVÑ1WÔ1WÑ.�˜) YØ%-Ð%5˜	˜	¸9�å'Ø˜ %°´ÈÌðñ ô ˆJð  ¤Ð!8½ZÈÍeÑ=TÔ=TÐ!8˜#˜#ÐZ^Ñ^ˆJàˆIÝ˜$¥Ñ&Ô&ð 9Ø$7Ð!Ð!à$7Ð!Ø”?ð 9 xÐ';Ý # H¤MÑ 2Ô 2°SÑ 8�IØ×Ò˜zÐ,=Ñ=À	ÑIÑJÔJÐJÐJàÐr1   c                 óê   — | j         dk    rdS | j         dk    rdS t          ||¦  «        D ]G\  }}|dv r|dv r dS |                     ¦   «         r|dk    s|                     ¦   «         r	|dk    r dS ŒHdS )zdDecides if the top_line and bot_line should be merged,
        based on `self.vertical_compression`.r  Tr"  F)r}   õ   â•¨)r~   r{   r7   )r2  rg  Úisalnum)rM   Útop_lineÚbot_linerW   r[   s        r2   Úshould_compresszTextDrawing.should_compress“  sœ   € ð Ô$¨Ò.Ð.Ø�4ØÔ$¨Ò-Ð-Ø�5Ý˜H hÑ/Ô/ð 	ð 	‰HˆC�Ø�nÐ$Ð$¨°Ð)>Ð)>Ø�u�uØ—’‘”ð  #¨¢* *°#·+²+±-´- *ÀCÈ3ÂJÀJØ�u�uøØˆtr1   c                 ó¤  — g }d}|D �]G}d}|D ]}||j         z  }Œ|€|                     |¦  «         n�|                      ||¦  «        rA|                     t                               |                     ¦   «         |¦  «        ¦  «         n6|                     t                               |d         |d¬¦  «        ¦  «         d}|D ]}||j        z  }Œ|                     t                               |d         |d¬¦  «        ¦  «         d}|D ]}||j        z  }Œ|                     t                               |d         |d¬¦  «        ¦  «         �ŒI|S )zÝGiven a list of wires, creates a list of lines with the text drawing.

        Args:
            wires (list): A list of wires with nodes.
        Returns:
            list: A list of lines with the text drawing.
        Nr8   rf   r[   )Úicod)rW   r  r„  r  Úmerge_linesÚpoprY   r[   )rM   ro  rI  rƒ  rû   r‚  ÚnodeÚmid_lines           r2   rh  zTextDrawing.draw_wires¡  st  € ð ˆØˆØð 	Sñ 	SˆDàˆHØð %ð %�Ø˜DœHÑ$��àÐØ—’˜XÑ&Ô&Ð&Ð&à×'Ò'¨°(Ñ;Ô;ð [Ø—L’L¥×!8Ò!8¸¿º¹¼ÀhÑ!OÔ!OÑPÔPÐPÐPà—L’L¥×!8Ò!8¸¸r¼ÀHÐSXÐ!8Ñ!YÔ!YÑZÔZÐZð ˆHØð %ð %�Ø˜DœHÑ$��Ø�LŠL�×0Ò0°°r´¸HÈ5Ð0ÑQÔQÑRÔRÐRð ˆHØð %ð %�Ø˜DœHÑ$��Ø�LŠL�×0Ò0°°r´¸HÈ5Ð0ÑQÔQÑRÔRÐRÑRàˆr1   c                 ó~   — t           dt          dt          di}t          | dd¦  «        }|                     |d¦  «        S )z%Some instructions have special labelsÚIu   âˆšXu   âˆšXdgÚ
base_classN)r   r   r   ÚgetattrÚget)r‰  ÚlabelsÚ	node_types      r2   Úspecial_labelzTextDrawing.special_labelÇ  s;   € õ ˜�f f­h¸ÐAˆÝ˜D ,°Ñ5Ô5ˆ	Ø�zŠz˜) TÑ*Ô*Ð*r1   rW   c                 ó   — d}t          | |¦  «        D �]y\  }}||k    r||z  }Œ|dv r|dk    r|dz  }Œ"|dk    r||z  }Œ.|dv r|dv r|dk    r||z  }ŒB|dv r|dk    r|d	k    r|dz  }ŒX|d
v r|dk    r|d	k    r|dz  }Œn|dv r|dk    r|dz  }Œ~|dv r|dk    r|dz  }ŒŽ|dv r|dk    r|dk    r||z  }Œ¤|dv r|dk    r|dk    r||z  }Œº|dv r|dk    r|d	k    r||z  }ŒÐ|dv r
|dv r|dz  }ŒÞ|dv r
|dv r|dz  }Œì|dv r
|dv r|dz  }Œú|dv r|dv r|dz  }�Œ	|dk    r|dk    r|dk    r|dz  }�Œ"|dk    r|dk    r|dk    r|dz  }�Œ;|dv r|dk    r|dz  }�ŒL|dv r|dv r|dk    r|d z  }�Œa|dk    r|dk    r||z  }�Œt||z  }�Œ{|S )!aI  Merges two lines (top and bot) in a way that the overlapping makes sense.

        Args:
            top (str): the top line
            bot (str): the bottom line
            icod (top or bot): in case of doubt, which line should have priority? Default: "top".
        Returns:
            str: The merge of both lines.
        r8   u   â”¼â•ªr7   r|   u   â”¬â•¥u    â•‘â”‚rW   r~   r[   r{   rÏ   u   â”¬â”‚rr   u   â•ªrn   u   â”¼u   â””â”˜â•‘â”‚â–‘u   â”€â•�u   â•‘â•¥u   â•¬u   â•«u	   â•‘â•«â•¬u	   â”‚â”¼â•ªu   â””u   â”Œu   â”œu   â”˜u   â”�r›   u   â”�â”Œu   â”˜â””r}   )rg  )rW   r[   r†  rV   ÚtopcÚbotcs         r2   r‡  zTextDrawing.merge_linesÎ  s¹  € ð ˆÝ˜c 3™-œ-ð *	ñ *	‰JˆD�$Ø�tŠ|ˆ|Ø�t‘��Ø˜Ð!Ð! d¨c¢k kØ�u‘��Ø˜’�Ø�t‘��Ø˜Ð!Ð! d¨iÐ&7Ð&7¸DÀEºM¸MØ�t‘��Ø˜�� 4¨3¢; ;°4¸5²=°=Ø�u‘��Ø˜�� 4¨3¢; ;°4¸5²=°=Ø�u‘��Ø˜Ð!Ð! d¨e¢m mØ�u‘��Ø˜Ð!Ð! d¨e¢m mØ�u‘��ØÐ*Ð*Ð*¨t°sª{¨{¸tÀuº}¸}Ø�t‘��Ø˜Ð!Ð! d¨c¢k k°d¸e²m°mØ�t‘��Ø˜Ð!Ð! d¨c¢k k°d¸e²m°mØ�t‘��Ø˜Ð!Ð! d¨e m mØ�u‘��Ø˜Ð!Ð! d¨e m mØ�u‘��Ø˜Ð$Ð$¨°¨¨Ø�u‘��Ø˜Ð$Ð$¨°¨¨Ø�u‘�‘Ø˜’� 4¨5¢= =°T¸U²]°]Ø�u‘�‘Ø˜’� 4¨5¢= =°T¸U²]°]Ø�u‘�‘Ø˜Ð!Ð! d¨e¢m mØ�u‘�‘Ø˜Ð!Ð! d¨e m m¸Àº¸Ø�u‘�‘Ø˜’� ¨¢ Ø�t‘�‘à�t‘�‘Øˆ
r1   c                 óŒ   — t          t          d„ | ¦  «        ¦  «        }t          d„ |D ¦   «         ¦  «        }|D ]	}||_        Œ
dS )z¨
        When the elements of the layer have different widths, sets the width to the max elements.

        Args:
            layer (list): A list of elements.
        c                 ó
   — | d uS rc   r0   )r   s    r2   ú<lambda>z-TextDrawing.normalize_width.<locals>.<lambda>  s
   €  a¨t m€ r1   c              3   ó$   K  — | ]}|j         V — Œd S rc   )r_   )rþ   r‰  s     r2   r  z.TextDrawing.normalize_width.<locals>.<genexpr>  s$   è è € Ð4Ð4 d�d”kÐ4Ð4Ð4Ð4Ð4Ð4r1   N)rf  Úfilterr]   rK   )r  r&  r  r‰  s       r2   rd  zTextDrawing.normalize_width  s_   € õ •VÐ3Ð3°UÑ;Ô;Ñ<Ô<ˆÝÐ4Ð4¨eÐ4Ñ4Ô4Ñ4Ô4ˆØð 	'ð 	'ˆDØ&ˆDÔÐð	'ð 	'r1   c           
      ó’  ‡‡— | j         }|r|j        n|j        }| j        d|…         }| j        |d…         Š|r|j        n|j        }|d›                     |d¦  «        ddd…         }g }	g }
g }t          ˆˆfd„‰D ¦   «         ¦  «        }t          ||¦  «        D ]�}t          |¦  «        ‰|d                  k    r|
                     |¦  «         Œ7t          |¦  «        ‰|d                  k     r|                     |¦  «         Œl|	                     |¦  «         Œ‚g }t          t          |¦  «        ¦  «        D ]†}t          |dd¦  «        �d}||         d	k    r3|                     t          ||t          |¦  «        ¬
¦  «        ¦  «         ŒT|                     t          ||t          |¦  «        ¬
¦  «        ¦  «         Œ‡||
||	‰fS )a;  
        Analyzes the node in the layer and checks if the controlled arguments are in
        the box or out of the box.

        Args:
            node (DAGNode): node to analyse
            wire_map (dict): map of qubits/clbits to position
            ctrl_text (str): text for a control label
            conditional (bool): is this a node with a condition
            mod_control (ControlModifier): an instance of a modifier for an
                AnnotatedOperation

        Returns:
            Tuple(list, list, list):
              - tuple: controlled arguments on top of the "node box", and its status
              - tuple: controlled arguments on bottom of the "node box", and its status
              - tuple: controlled arguments in the "node box", and its status
              - the rest of the arguments
        NÚbÚ0rf   c              3   ó0   •K  — | ]}|‰v ¯‰|         V — Œd S rc   r0   )rþ   r   Úargs_qubitsÚwire_maps     €€r2   r  z/TextDrawing.controlled_wires.<locals>.<genexpr>4  s1   øè è € ÐQÐQ¨qÀÀ[Ð@PÐ@P˜x¨œ{Ð@PÐ@PÐ@PÐ@PÐQÐQr1   r   Ú	conditionTÚ1)r   r:   ræ   )ÚopÚnum_ctrl_qubitsÚqargsÚ
ctrl_staterT   Úsortedrg  Úminr  r]   r  rQ   rŽ  rá   Úboolrê   )r‰  r   Ú	ctrl_textr   Úmod_controlr£  r¤  Úctrl_qubitsr¦  Úin_boxÚtop_boxÚbot_boxÚqubit_indicesÚ
ctrl_qubitÚgatesrÿ   rŸ  s    `              @r2   Úcontrolled_wireszTextDrawing.controlled_wires  s  øø€ ð* ŒWˆØ9DÐ\˜+Ô5Ð5È"ÔJ\ˆØ”jÐ!1 /Ð!1Ô2ˆØ”j Ð!1Ð!1Ô2ˆØ/:ÐM�[Ô+Ð+ÀÄˆ
Ø"Ð&Ð&×,Ò,¨_¸cÑBÔBÀ4À4ÀRÀ4ÔHˆ
àˆØˆØˆåÐQÐQÐQÐQÐQ°HÐQÑQÔQÑQÔQˆå˜k¨:Ñ6Ô6ð 	*ð 	*ˆJÝ�=Ñ!Ô! H¨Z¸¬]Ô$;Ò;Ð;Ø—’˜zÑ*Ô*Ð*Ð*Ý�]Ñ#Ô# h¨z¸!¬}Ô&=Ò=Ð=Ø—’˜zÑ*Ô*Ð*Ð*à—’˜jÑ)Ô)Ð)Ð)àˆÝ•s˜;Ñ'Ô'Ñ(Ô(ð 
	ð 
	ˆAõ �r˜;¨Ñ-Ô-Ð9Ø"�Ø˜!Œ} Ò#Ð#Ø—’�V°À9ÕUYÐZaÑUbÔUbÐcÑcÔcÑdÔdÐdÐdà—’Ý¨;¸iÕPTÐU\ÑP]ÔP]Ð^Ñ^Ô^ñô ð ð ð �w ¨°Ð=Ð=r1   c                 ó<  ‡ ‡!— |j         }g }g }d}dŠ!t          |dd¦  «        }t          |dd¬¦  «        }	t          |t          t
          t          f¦  «        sFt          |dd¦  «        s5t          |d¦  «        \  }
}}t           	                    |¦  «        p|
}
|
|	z   }
t          |dd¦  «        �"|| 
                    |j        |d	¬
¦  «        z  }dŠ!d„ }d}t          |dd¦  «        r2t          |j        ¦  «        }|D ]}t          |t          ¦  «        r|} nŒt          |t          ¦  «        rÈt          ¦   «         }|                     |j        d         |¦  «         t%          ‰ j        |j        d         ¦  «        \  }}}‰ j        r?|�=|                     |j        d         t/          t1          |¦  «        ¦  «        ¦  «         �n|                     |j        d         t/          ¦   «         ¦  «         �nÝt          |dd¦  «        rm‰ j        s||||fS t5          |j        ˆ fd„¬¦  «        }|j        D ]=}|‰ j        v r2||k    r|j        nd}|                     |t;          |¦  «        ¦  «         Œ>�n_t          |t
          ¦  «        r>ˆ!fd„t=          t?          |j        ¦  «        ¦  «        D ¦   «         } ||||||¦  «         �nt          |t          ¦  «        r1|                     |j        d         tA          ‰!¬¦  «        ¦  «         �nÆt          |tB          ¦  «        r6d|	› �}tE          ‰!¬¦  «        tE          ‰!¬¦  «        g} ||||||¦  «         �n{t?          |j        ¦  «        dk    r9|j        s2|                     |j        d         tG          |
‰!¬¦  «        ¦  «         �n*t          |tH          ¦  «        s|�rŽt           %                    |||‰!|¦  «        }|\  }}}}}|r¶t?          |¦  «        dk    r&| &                    tG          |
‰!¬¦  «        ¦  «         �n|rdnd}|rdnd}| '                    ||
‰!|||¬¦  «        }t=          t5          |¦  «        tQ          |¦  «        dz   ¦  «        D ]&} | &                    | tS          d¦  «        f¦  «         Œ'�n |j*        dk    r%| &                    tE          ‰!¬¦  «        ¦  «         �np|j*        dv rB|j*         +                    ¦   «         › |	› �}| &                    tE          ‰!¬¦  «        ¦  «         �n%|j*        dk    r3|tY          ‰!¬¦  «        tY          ‰!¬¦  «        gz  } ||||||¦  «         nç|j*        dk    r)d|	› �}|tE          ‰!¬¦  «        tE          ‰!¬¦  «        gz  }n³t?          |¦  «        dk    r||rdnd}|rdnd}| '                    ||
‰!|||¬¦  «        }t=          t5          |¦  «        tQ          |¦  «        dz   ¦  «        D ]&} | &                    | tS          d¦  «        f¦  «         Œ'n$| &                    tG          |
‰!¬¦  «        ¦  «          ||||||¦  «         n„t?          |j        ¦  «        dk    r%|j        s| '                    |j        |
‰!¬¦  «         nG|j        r+|j        r$| -                    |
|j        |j        ‰!¬¦  «         nt]          d|j*        ¦  «        ‚| /                    d „ ¬¦  «         d!„ |D ¦   «         }| /                    d"„ ¬¦  «         d#„ |D ¦   «         }||||fS )$zäConvert a dag op node into its corresponding Gate object, and establish
        any connections it introduces between qubits. gate_wire_map is the flow_wire_map
        if gate is inside a ControlFlowOp, else it's self._wire_mapNFÚ	base_gaterq  r_  r`  Ú
_directiver¡  r€  ©r?   Tc                 óâ   — t          |¦  «        D ]^\  }}|| j        |                  }|d„ |D ¦   «         vr8|                     | j        |         |¦  «         |                     ||f¦  «         Œ_d S )Nc                 ó   — g | ]\  }}|‘ŒS r0   r0   ©rþ   rÿ   Újs      r2   r  zITextDrawing._node_to_gate.<locals>.add_connected_gate.<locals>.<listcomp>f  s   € Ð'CÐ'CÐ'C©d¨a°¨Ð'CÐ'CÐ'Cr1   )r  r¥  Ú	set_qubitr  )r‰  r²  r  Úcurrent_consÚgate_wire_maprÿ   ÚgateÚactual_indexs           r2   Úadd_connected_gatez5TextDrawing._node_to_gate.<locals>.add_connected_gatec  s…   € Ý$ UÑ+Ô+ð >ð >‘��4Ø,¨T¬Z¸¬]Ô;�ØÐ'CÐ'C°lÐ'CÑ'CÔ'CÐCÐCØ—O’O D¤J¨q¤M°4Ñ8Ô8Ð8Ø ×'Ò'¨°tÐ(<Ñ=Ô=Ð=øð	>ð >r1   Ú	modifiersr   c                 óT   •— ‰j                              | t          d¦  «        ¦  «        S )NÚinf)r3  r�  Úfloat)ÚqrM   s    €r2   r˜  z+TextDrawing._node_to_gate.<locals>.<lambda>„  s    ø€ °d´n×6HÒ6HÈÍEÐRWÉLÌLÑ6YÔ6Y€ r1   ©Úkeyr8   c                 ó0   •— g | ]}t          ‰¬ ¦  «        ‘ŒS )©r   )rØ   )rþ   rÇ   r   s     €r2   r  z-TextDrawing._node_to_gate.<locals>.<listcomp>Œ  s$   ø€ ÐQÐQÐQ°Q•R KÐ0Ñ0Ô0ÐQÐQÐQr1   rÊ  ÚZZr   r}   r~   )r   Úcontrolled_edger?   r@   Úz)Úu1ÚpÚswapÚrzzr(   )r¥  Úcargsr   z7Text visualizer does not know how to handle this node: c                 ó   — | d         S ©Nr   r0   ©Útups    r2   r˜  z+TextDrawing._node_to_gate.<locals>.<lambda>æ  s
   € ¨#¨a¬&€ r1   c                 ó   — g | ]\  }}|‘ŒS r0   r0   )rþ   rÆ  Úgs      r2   r  z-TextDrawing._node_to_gate.<locals>.<listcomp>ç  s   € Ð3Ð3Ð3™d˜a ˜Ð3Ð3Ð3r1   c                 ó   — | d         S rÔ  r0   rÕ  s    r2   r˜  z+TextDrawing._node_to_gate.<locals>.<lambda>è  s
   € ¨s°1¬v€ r1   c                 ó   — g | ]\  }}|‘ŒS r0   r0   )rþ   ÚcrØ  s      r2   r  z-TextDrawing._node_to_gate.<locals>.<listcomp>é  s   € Ð=Ð=Ð=¡4 1 a˜QÐ=Ð=Ð=r1   )0r£  rŽ  r!   rt  r   r   r   r    r  r’  Úset_cl_multiboxr¡  r   rÂ  r   r‡   r¼  r¥  r$   r'  rÒ  r4  Ú	set_clbitr‚   ru  r-  r¨  r$  r:   rÕ   r  rQ   rÜ   r   rá   ry   r
   r³  r  Úset_qu_multiboxr]   r4   r  ÚupperrØ   Ú_set_multiboxr)   Úsort)"rM   r‰  r  r¾  r£  r½  Úcurrent_cons_condÚconnection_labelrµ  ÚparamsÚ	gate_textrª  rÇ   rÁ  r«  Úcanonical_modifiersÚmodifierr¿  rz  r|  Ú	top_qubitÚqubitr:   r²  Úcontrols_arrayÚcontrolled_topÚcontrolled_botrÌ  Úrestr?   r@   Úindexesr�   r   s"   `                                @r2   Ú_node_to_gatezTextDrawing._node_to_gateL  s  øø€ ð ŒWˆØˆØÐØÐØˆÝ˜B ¨TÑ2Ô2ˆ	å˜r 6°1Ð5Ñ5Ô5ˆÝ˜"�w­µ%Ð8Ñ9Ô9ð 	+Å'È"ÈlÐ\aÑBbÔBbð 	+Ý&8¸¸VÑ&DÔ&DÑ#ˆI�y !Ý#×1Ò1°"Ñ5Ô5ÐB¸ˆIØ! FÑ*ˆIå�2�{ DÑ)Ô)Ð5à ×!6Ò!6°r´|À]Ð`eÐ!6Ñ!fÔ!fÑfÐØˆKð	>ð 	>ð 	>ð ˆÝ�2�{ DÑ)Ô)ð 	Ý"9¸"¼,Ñ"GÔ"GÐØ/ð ð �Ý˜h­Ñ8Ô8ð Ø"*�KØ�Eðõ �b�'Ñ"Ô"ð o	Ý‘=”=ˆDØ�OŠO˜DœJ qœM¨4Ñ0Ô0Ð0Ý%6°t´}ÀdÄjÐQRÄmÑ%TÔ%TÑ"ˆH�a˜ØŒð < 8Ð#7Ø—’Ø”J˜q”MÝ�c )™nœnÑ-Ô-ñô ð ñ ð
 —’ ¤
¨1¤­y©{¬{Ñ;Ô;Ð;Ñ;å�R˜ uÑ-Ô-ð c	àÔ$ð PØ˜lÐ,=Ð?OÐOÐOå˜DœJÐ,YÐ,YÐ,YÐ,YÐZÑZÔZˆIØœð ;ð ;�Ø˜DœKÐ'Ð'Ø(-°Ò(:Ð(:˜BœH˜HÀ�EØ—O’O E­7°5©>¬>Ñ:Ô:Ð:øñ;õ
 ˜�HÑ%Ô%ð X	àQÐQÐQÐQ½%ÅÀDÄJÁÄÑ:PÔ:PÐQÑQÔQˆEØÐ˜t U¨E°<ÀÑOÔOÐOÑOå˜�EÑ"Ô"ð S	à�OŠO˜DœJ qœM­<ÀKÐ+PÑ+PÔ+PÑQÔQÐQÑQå˜�GÑ$Ô$ð O	à, F˜}˜}ÐÝ¨Ð4Ñ4Ô4µfÈÐ6UÑ6UÔ6UÐVˆEØÐ˜t U¨E°<ÀÑOÔOÐOÑOå�”‰_Œ_ Ò!Ð!¨$¬*Ð!à�OŠO˜DœJ qœM­;°yÈkÐ+ZÑ+ZÔ+ZÑ[Ô[Ð[Ñ[å˜�NÑ+Ô+ð E	¨{ñ E	Ý(×9Ò9Ø�m Y°¸[ñô ˆNð LZÑHˆE�> >°?ÀDØð /NÝ�t‘9”9 ’>�>Ø—L’L¥¨YÀKÐ!PÑ!PÔ!PÑQÔQÐQÑQà+9Ð"C % %¸t�KØ+9Ð"C % %¸t�KØ#×3Ò3ØØ!Ø$/Ø(7Ø$/Ø$/ð 4ñ ô �Gõ "'¥s¨7¡|¤|µS¸±\´\ÀAÑ5EÑ!FÔ!Fð Fð F˜à$×+Ò+¨UµKÀ±O´OÐ,DÑEÔEÐEÐEñFð ” 3Ò&Ð&à—’�V°Ð<Ñ<Ô<Ñ=Ô=Ð=Ñ=Ø” ;Ð.Ð.à&/¤n×&:Ò&:Ñ&<Ô&<Ð#F¸fÐ#FÐ#FÐ Ø—’�V°Ð<Ñ<Ô<Ñ=Ô=Ð=Ñ=Ø” 6Ò)Ð)à�"¨Ð5Ñ5Ô5µrÀkÐ7RÑ7RÔ7RÐSÑS�Ø"Ð" 4¨°°|À]ÑSÔSÐSÐSØ” 5Ò(Ð(à#0¨ = =Ð Ø�&¨[Ð9Ñ9Ô9½6ÈkÐ;ZÑ;ZÔ;ZÐ[Ñ[��Ý�T‘”˜Q’�Ø'5Ð?˜e˜e¸4�Ø'5Ð?˜e˜e¸4�Ø×/Ò/ØØØ +Ø$3Ø +Ø +ð 0ñ ô �õ #¥3 w¡<¤<µ°W±´ÀÑ1AÑBÔBð Bð B�Eà ×'Ò'¨µ¸B±´Ð(@ÑAÔAÐAÐAðBð —’�[¨ÀÐLÑLÔLÑMÔMÐMàÐ˜t U¨E°<ÀÑOÔOÐOÐOå�”‰_Œ_ Ò!Ð!¨$¬*Ð!Ø×!Ò! $¤*¨iÀ[Ð!ÑQÔQÐQÐQàŒZð 
	˜DœJð 
	Ø×ÒØØ”jØ”jØ'ð	  ñ ô ð ð õ %ØIÈ2Ì7ñô ð ð 	×ÒÐ0Ð0ÐÑ1Ô1Ð1Ø3Ð3 lÐ3Ñ3Ô3ˆØ×ÒÐ#5Ð#5ÐÑ6Ô6Ð6Ø=Ð=Ð+<Ð=Ñ=Ô=Ðà�lÐ$5Ð7GÐGÐGr1   c                 ó|  — |                       | j        ¬¦  «        }|sg S t                               |¦  «        g}| j        D ]ù}t          | j        | j        | j        | j	        | j
        ¦  «        }|D ]™}t          |j        t          ¦  «        r$d| _        |                      ||| j
        ¦  «         Œ@|                      ||| j
        ¦  «        \  }}}}|j                             ||f¦  «         |j                             d|f¦  «         Œš|                     d¦  «         |                     |j        ¦  «         Œú|S )zË
        Constructs layers.
        Returns:
            list: List of DrawElements.
        Raises:
            VisualizationError: When the drawing is, for some reason, impossible to be drawn.
        r]  r   Nr|   )re  r+  r  r  r&  ÚLayerr$  r%  r4  r'  r3  rt  r£  r   r8  Úadd_control_flowrï  Úconnectionsr  Úconnect_withÚ
full_layer)	rM   re  rj  Ú
node_layerr  r‰  r½  râ  rã  s	            r2   rc  zTextDrawing.build_layersí  s^  € ð —_’_¸Ô8J�_ÑKÔKˆ
Øð 	ØˆIå×(Ò(¨Ñ4Ô4Ð5ˆàœ*ð 	,ð 	,ˆJÝØ”Ø”Ø”Ø”Ø”ñô ˆEð #ð 	Hð 	H�Ý˜dœg¥}Ñ5Ô5ð HØ'(�DÔ$Ø×)Ò)¨$°¸¼ÑGÔGÐGÐGàOS×OaÒOaØ˜e T¤^ñPô PÑL�E˜<Ð):Ð<Lð Ô%×,Ò,Ð.>ÀÐ-MÑNÔNÐNØÔ%×,Ò,¨dÐ4EÐ-FÑGÔGÐGÐGØ×Ò˜uÑ%Ô%Ð%Ø�MŠM˜%Ô*Ñ+Ô+Ð+Ð+àˆr1   c           	      óÆ	  ‡ ‡— t          |j        t          ¦  «        r$t          |j        j        t          j        ¦  «        s;t          |j        dd¦  «        �r"t          |j        j        t          j        ¦  «        rþˆ ˆfd„}t          |j        t          ¦  «        r|j        j        n|j        j        }t          t          |¦  «        j
        ¦  «        }t          ¦   «         }t          |d¬¦  «                             |                     t          |¦  «        ¦  «        ¦  «         |                     ¦   «         ‰ _        t%          ‰ j        ¦  «        ‰ j        k    r‰ j        d‰ j        …         dz   ‰ _        nt          |j        t(          ¦  «         }‰                      |‰t,          |¬¦  «        }|                     |j        ¦  «         t3          |j        j        ¦  «        }	t          |j        t          ¦  «        rX|	                     dt3          |j                             ¦   «         ¦  «        d         d	                              ¦   «         ¦  «         t=          |	¦  «        D �]@\  }
}‰                     ¦   «         }|                      ˆfd
„tC          |j"        |j#        ¦  «        D ¦   «         ¦  «         tC          |j$        |j
        ¦  «        D ]s\  }}‰ j%        rJtM          ‰ j'        |¦  «        x}�3tM          ‰ j'        |¦  «        }|                      |‰|         i¦  «         ŒV|                      |‰|         i¦  «         Œt|
dk    r<‰                      ||tP          |
d	z
  d¬¦  «        }|                     |j        ¦  «         tS          ||¬¦  «        \  }}}|D �]}tU          ‰ j#        ‰ j
        ‰ j%        ‰ j'        |¦  «        }|D ]¨}t          |j        tV          ¦  «        r8‰ xj,        d	z  c_,        ‰  -                    |||¦  «         ‰ xj,        d	z  c_,        ŒT‰  .                    |||¦  «        \  }}}}|j/                             ||f¦  «         |j/                             d|f¦  «         Œ©| 0                    d¦  «         |                     |j        ¦  «         �Œ�ŒB‰                      ||tb          d¬¦  «        }|                     |j        ¦  «         dS )z,Add control flow ops to the circuit drawing.r¡  Nc                 óà  •— t          | t          j        ¦  «        rt          j        | j        ¦  «        S t          | t          ¦  «        rt          j        | j        ¦  «        S 	 t          ‰j        | ¦  «        \  }}}n-# t          $ r  t          j        d‰|          › �¦  «        cY S w xY w|€t          j        d|› �¦  «        S t          j
        |j        t          j        |¦  «        ¦  «        S )zˆLook up a classical-expression variable or register/bit in our internal symbol
                table, and return an OQ3-like identifier.Ú_bit)rt  r   ÚVarr   Ú
Identifierr  r   r$   r'  r	   ÚSubscriptedIdentifierÚIntegerLiteral)Úvarrz  r{  r|  rM   r   s       €€r2   Ú
lookup_varz0TextDrawing.add_control_flow.<locals>.lookup_var  s÷   ø€ õ
 ˜c¥4¤8Ñ,Ô,ð 4Ýœ>¨#¬(Ñ3Ô3Ð3Ý˜cÕ#4Ñ5Ô5ð 4Ýœ>¨#¬(Ñ3Ô3Ð3ðBÝ5FÀtÄ}ÐVYÑ5ZÔ5ZÑ2�H˜i¨¨øÝ#ð Bð Bð Bõ œ>Ð*@°¸#´Ð*@Ð*@ÑAÔAÐAÐAÐAðBøøøð Ð#Ýœ>Ð*<°Ð*<Ð*<Ñ=Ô=Ð=ÝÔ0°´ÅÔ@RÐS\Ñ@]Ô@]Ñ^Ô^Ð^s   Á$A> Á>'B(Â'B(z  )Úindentz...rÊ  r   r   c                 ó(   •— i | ]\  }}|‰|         “ŒS r0   r0   )rþ   ÚouterÚinnerr   s      €r2   ú
<dictcomp>z0TextDrawing.add_control_flow.<locals>.<dictcomp>K  s#   ø€ Ð\Ð\Ð\©L¨E°5�˜ œÐ\Ð\Ð\r1   F)r   r|   )2rt  r£  r   Útargetr   ÚExprrŽ  r¡  r©  r   r%  r   r   ÚvisitÚacceptr   Úgetvaluer9  rQ   r0  r   Údraw_flow_boxÚCF_LEFTr  rõ  rf  ÚblocksÚinsertÚcases_specifierÚcopy_empty_liker  ÚcopyÚupdaterg  r¥  r$  rÒ  r4  r#   r'  ÚCF_MIDr'   rñ  r   r8  rò  rï  ró  rô  r³   )rM   r‰  rj  r   rÿ  r¡  Údraw_conditionalÚstreamÚ
flow_layerÚcircuit_listÚcirc_numr;  Úflow_wire_mapr  r  Úin_regÚout_regrÇ   r&  Úlayer_nodesÚflow_layer2Ú
layer_noder½  râ  rã  s   `  `                     r2   rò  zTextDrawing.add_control_flow  sÌ  øø€ õ �t”w¥Ñ-Ô-ð %	Bµ*¸T¼W¼^ÍTÌYÑ2WÔ2Wð %	BÝ�D”G˜[¨$Ñ/Ô/ñ%	BÝ4>¸t¼wÔ?PÕRVÔR[Ñ4\Ô4\ð%	Bð_ð _ð _ð _ð _ð _õ0 +5°T´W½lÑ*KÔ*KÐb˜œœ˜ÐQUÔQXÔQbˆIÝ#¥N°9Ñ$=Ô$=Ô$DÑEÔEÐÝ‘Z”ZˆFÝ˜¨Ð-Ñ-Ô-×3Ò3°I×4DÒ4DÅ\ÐR\ÑE]ÔE]Ñ4^Ô4^Ñ_Ô_Ð_Ø$ŸošoÑ/Ô/ˆDŒOå�4”?Ñ#Ô# d¤mÒ3Ð3Ø"&¤/°/°D´M°/Ô"BÀUÑ"J�”øå#-¨d¬gµyÑ#AÔ#AÐAÐð ×'Ò'¨¨h½ÐM]Ð'Ñ^Ô^ˆ
Ø�Š�jÔ+Ñ,Ô,Ð,õ ˜DœGœNÑ+Ô+ˆå�d”g�|Ñ,Ô,ð 	\à×Ò ¥4¨¬×(?Ò(?Ñ(AÔ(AÑ#BÔ#BÀ1Ô#EÀaÔ#H×#XÒ#XÑ#ZÔ#ZÑ[Ô[Ð[å!*¨<Ñ!8Ô!8ð -	6ñ -	6ÑˆH�gà$ŸMšM™OœOˆMØ× Ò Ø\Ð\Ð\Ð\½CÀÄ
ÈGÌNÑ<[Ô<[Ð\Ñ\Ô\ñô ð õ !$ D¤J°´Ñ ?Ô ?ð Cð C‘��uØ”?ð CÝ/°´¸uÑEÔEÐE�VÐRå.¨t¬}¸eÑDÔD�GØ!×(Ò(¨&°(¸7Ô2CÐ)DÑEÔEÐEÐEà!×(Ò(¨%°¸%´Ð)AÑBÔBÐBÐBà˜!Š|ˆ|à!×/Ò/Ø˜-­°¸A±È5ð 0ñ ô �
ð —’˜jÔ3Ñ4Ô4Ð4å3°GÀmÐTÑTÔT‰KˆAˆq�%Ø$ð 6ñ 6�å#Ø”K ¤¨d¬o¸t¼}Èmñô �ð #.ð Rð R�JÝ! *¤-µÑ?Ô?ð RàÐ(Ô(¨AÑ-Ð(Ô(Ø×-Ò-¨j¸&À-ÑPÔPÐPØÐ(Ô(¨AÑ-Ð(Ô(Ð(ð !×.Ò.¨z¸;ÈÑVÔVñØ'Ø(Ø-Ø,à#Ô/×6Ò6Ð8HÈ,Ð7WÑXÔXÐXØ#Ô/×6Ò6¸Ð>OÐ7PÑQÔQÐQÐQà×(Ò(¨Ñ/Ô/Ð/Ø—’˜kÔ4Ñ5Ô5Ð5Ñ5ñ-6ð2 ×'Ò'¨¨m½XÐSXÐ'ÑYÔYˆ
Ø�Š�jÔ+Ñ,Ô,Ð,Ð,Ð,r1   r   c                 ó  ‡— |j         }t          | j        ¦  «        }|t          k    ràd}| j        r
d| j        z   }t          |t          ¦  «        r
d|z   |z   }	�nlt          |t          ¦  «        r
d|z   |z   }	�nMt          |t          ¦  «        rq|j	        d         }
dt          |
¦  «        vr8t          |
¦  «        dk    r%t          |
dd…         ¦  «        }|dd	…         d
z   }nt          |
¦  «        }d|z   dz   |z   }	nÇd|z   |z   }	n¾|t          k    r®t          |t          ¦  «        rd|z   }	n˜g }t          |                     ¦   «         ¦  «        D ]\  }}|                     |¦  «         Œdt          ||         d         ¦  «        v rd}n)t          ||         ¦  «                             dd¦  «        }d|z   dz   |z   }	nd|z   }	t!          | j        | j        | j        | j        ‰¦  «        }t          |j        ¦  «        dk    rC|                     | j        ‰|j        d                           t/          ||	|¬¦  «        ¦  «         nöˆfd„|j        D ¦   «         }t1          |¦  «        }t3          |¦  «        }||z
  dz   }|                     | j        |         t5          ||	d¬¦  «        ¦  «         t7          t9          |dz   |¦  «        ¦  «        D ]8\  }}|                     | j        |         t;          ||	||d¬¦  «        ¦  «         Œ9|                     | j        |         t=          ||	||d¬¦  «        ¦  «         |rÁt          |j         t>          ¦  «        rƒt          |j         j         tB          j"        ¦  «        r|j         j         }n^t          |j         j         tF          ¦  «        r|j         j         df}n0|j         j         d|j         j         j$        z  dz
  f}n|j         j%        }| &                    |‰d¬¦  «        }|S )z5Draw the left, middle, or right of a control flow boxr8   r7   zIf-zWhile-r   r  é   Nrf   z, ...)zFor-zSwitch-zElse-Údefaultz,)ú)zCase-zEnd-r   )r:   r   c                 ó    •— g | ]
}‰|         ‘ŒS r0   r0   )rþ   Úqargr  s     €r2   r  z-TextDrawing.draw_flow_box.<locals>.<listcomp>²  s   ø€ ÐCÐCÐC°˜ dÔ+ÐCÐCÐCr1   )r:   rL   )r:   rŽ   r�   rL   )r:   rŽ   r   rL   r(   r€  r·  )'r£  ru  r8  r  r9  rt  r   r   r   rä  rQ   r  rf  r  r  rž   rñ  r$  r%  r4  r'  r¥  r¼  r±   r¨  r]   r¶   r  r  rº   r½   r   r  r   r  r   rv  r¡  rÜ  )rM   r‰  r  r´   r  r   r£  ÚdepthÚetextr:   ÚindexsetÚ	index_strÚ	jump_listÚjump_valuesrÇ   Újump_strr  Úidx_listÚmin_idxÚmax_idxÚ
box_heightr�   rÿ   r¡  s     `                     r2   r
  zTextDrawing.draw_flow_boxz  sS  ø€ ð ŒWˆÝ�DÔ$Ñ%Ô%ˆØ•gÒÐØˆEØŒð .Ø˜dœoÑ-�Ý˜"�hÑ'Ô'ð 2Ø ™¨Ñ-�‘Ý˜B¥Ñ,Ô,ð 2Ø  5Ñ(¨5Ñ0�‘Ý˜B¥	Ñ*Ô*ð 
2Øœ9 Qœ<�à¥# h¡-¤-Ð/Ð/µC¸±M´MÀAÒ4EÐ4EÝ # H¨R¨a¨R¤LÑ 1Ô 1�IØ )¨#¨2¨#¤°Ñ 9�I�Iå # H¡¤�IØ ™¨Ñ,¨yÑ8��à! EÑ)¨EÑ1��Ø�ÒÐÝ˜"�hÑ'Ô'ð 9Ø %™��à�	Ý&*¨2×+=Ò+=Ñ+?Ô+?Ñ&@Ô&@ð 2ð 2‘N�K Ø×$Ò$ [Ñ1Ô1Ð1Ð1à¥ I¨hÔ$7¸Ô$:Ñ ;Ô ;Ð;Ð;Ø(�H�Hå" 9¨XÔ#6Ñ7Ô7×?Ò?ÀÀcÑJÔJ�HØ %™¨#Ñ-°Ñ8��ð ˜U‘NˆEåØŒKØŒKØŒOØŒMØñ
ô 
ˆ
õ ˆtŒz‰?Œ?˜aÒÐØ× Ò Ø”˜M¨$¬*°Q¬-Ô8Ô9Ý˜W¨E¸{ÐKÑKÔKñô ð ð ð DÐCÐCÐC¸¼
ÐCÑCÔCˆHÝ˜(‘m”mˆGÝ˜(‘m”mˆGØ  7Ñ*¨QÑ.ˆJà× Ò Ø”˜GÔ$¥o°gÀUÐWYÐ&ZÑ&ZÔ&Zñô ð õ &¥e¨G°a©K¸Ñ&AÔ&AÑBÔBð 
ð 
‘��qØ×$Ò$Ø”K ”NÝ#ØØ#Ø%/Ø#Ø#%ðñ ô ñ	ô 	ð 	ð 	ð × Ò Ø”˜GÔ$ÝØØØ!+Ø +Ø!ðñ ô ñ	ô 	ð 	ð ð 
	XÝ˜$œ'¥<Ñ0Ô0ð .Ý˜dœgœn­d¬iÑ8Ô8ð QØ $¤¤�I�IÝ ¤¤µÑ6Ô6ð QØ!%¤¤°Ð 3�I�Ià!%¤¤°°t´w´~Ô7JÑ1KÈaÑ1OÐ P�I�Ià œGÔ-�	Ø×*Ò*¨9°mÐQVÐ*ÑWÔWˆAàÐr1   )	FTNr  TNNFr  rc   rß   )rW   )r   F)r,   r-   r.   r/   rN   r@  rC  rE  r?  rV  rI  re  r„  rh  r  r’  r‡  rd  r³  rï  rc  rò  r
  r0   r1   r2   r  r  »  s¯  € € € € € ØÐð ØØØ#ØØØØØð0!ð 0!ð 0!ð 0!ðd$ð $ð $ð
ð 
ð 
ð$ð $ð $ð#ð #ð #ð42ð 2ð 2ð 2ðCð Cð Cð CðJ(ð (ð (ð (ðTð ð ð$ð $ð $ðL ð+ð +ñ „\ð+ð ð6ð 6ð 6ñ „\ð6ðp ð
'ð 
'ñ „\ð
'ð ð5>ð 5>ñ „\ð5>ðn_Hð _Hð _HðB#ð #ð #ðJf-ð f-ð f-ðPað að að að að ar1   r  c                   ór   — e Zd ZdZd„ Zed„ ¦   «         Zd„ Zd„ Z	 	 	 	 	 	 dd„Z	dd
„Z
d„ Z	 	 	 	 dd„Zd„ ZdS )rñ  z'A layer is the "column" of the circuit.c                 óŠ  — || _         || _        |rfg | _        d }|D ]Y}t          | j        |¦  «        }|r||k    rŒ |€| j                             |¦  «         Œ=|}| j                             |¦  «         ŒZn|| _        d gt          |¦  «        z  | _        g | _        d gt          |¦  «        z  | _        || _	        || _
        d S rc   )r$  r'  r%  r#   r  rQ   Úqubit_layerró  Úclbit_layerr4  r3  )	rM   r$  r%  r4  r;  r   Úprevious_cregÚbitrz  s	            r2   rN   zLayer.__init__á  sè   € ØˆŒØˆŒØð 	!ØˆDŒKØ ˆMØð 6ð 6�Ý+¨D¬M¸3Ñ?Ô?�Ø ð  ]°hÒ%>Ð%>ØØÐ#Ø”K×&Ò& sÑ+Ô+Ð+Ð+à$,�MØ”K×&Ò& }Ñ5Ô5Ð5Ð5ð6ð !ˆDŒKØ ˜6¥C¨¡K¤KÑ/ˆÔØˆÔØ ˜6¥C¨¡K¤KÑ/ˆÔØ$ˆŒØ!ˆŒˆˆr1   c                 ó    — | j         | j        z   S )z�
        Returns the composition of qubits and classic wires.
        Returns:
            String: self.qubit_layer + self.clbit_layer
        )r1  r2  r^   s    r2   rõ  zLayer.full_layerø  s   € ð Ô $Ô"2Ñ2Ð2r1   c                 ó0   — || j         | j        |         <   dS )z§Sets the qubit to the element.

        Args:
            qubit (qbit): Element of self.qubits.
            element (DrawElement): Element to set in the qubit
        N)r1  r3  )rM   ré  Úelements      r2   r¼  zLayer.set_qubit  s   € ð 3:ˆÔ˜œ¨Ô.Ñ/Ð/Ð/r1   c                 óî   — t          | j        |¦  «        }| j        r.|�,|| j        | j        |         t          | j        ¦  «        z
  <   dS || j        | j        |         t          | j        ¦  «        z
  <   dS )z§Sets the clbit to the element.

        Args:
            clbit (cbit): Element of self.clbits.
            element (DrawElement): Element to set in the clbit
        N)r#   r'  r4  r2  r3  rQ   r$  )rM   Úclbitr7  rz  s       r2   rÝ  zLayer.set_clbit
  sw   € õ $ D¤M°5Ñ9Ô9ˆØŒ?ð 	Q˜xÐ3ØLSˆDÔ˜Tœ^¨HÔ5½¸D¼KÑ8HÔ8HÑHÑIÐIÐIàIPˆDÔ˜Tœ^¨EÔ2µS¸¼Ñ5EÔ5EÑEÑFÐFÐFr1   NFc                 ó8  ‡‡‡‡— ‰��9‰��6t          ˆfd„t          | j        ¦  «        D ¦   «         ¦  «        }t          ˆfd„t          | j        ¦  «        D ¦   «         ¦  «        }	t	          t          t          t          ‰¦  «        dz
  ¦  «        ¦  «        t          t          t          ‰¦  «        dz
  ¦  «        ¦  «        ¦  «        Šˆˆfd„| j        D ¦   «         }
ˆˆfd„| j        D ¦   «         }t          ‰| j        j        ¬¦  «        Št          ‰| j        j        ¬¦  «        Št          | j        ¦  «        t          |¦  «        z
  t	          |	¦  «        z   dz   }|  	                    ‰ 
                    d¦  «        t          ||
 
                    d¦  «        ¬¦  «        ¦  «         d}t          t          t          |¦  «        dz   t          | j        ¦  «        ¦  «        ¦  «        D ]m\  }}||v r+‰ 
                    d¦  «        }|
 
                    d¦  «        }n| j        |         }d	‰z  }|  	                    |t          ||||¬¦  «        ¦  «         Œnt          t          t	          |	¦  «        ¦  «        |dz   ¦  «        D ]m\  }}||	v r+‰ 
                    d¦  «        }| 
                    d¦  «        }n| j        |         }d	‰z  }|                      |t          ||||¬¦  «        ¦  «         Œn|                      ‰ 
                    d¦  «        t!          ||| 
                    d¦  «        ¬¦  «        ¦  «         |	S ‰€Á‰�¿t#          ‰¦  «        Št          ˆfd
„t          | j        ¦  «        D ¦   «         ¦  «        }t          t          t          ‰¦  «        dz
  ¦  «        ¦  «        Š‰                     | j        j        ¬¦  «         dgt          ‰¦  «        z  }
| j        }t&          }t(          }t          }t           }nÓ‰€Â‰�Àt#          ‰¦  «        Št          ˆfd„t          | j        ¦  «        D ¦   «         ¦  «        }t          t          t          ‰¦  «        dz
  ¦  «        ¦  «        Šˆˆfd„| j        D ¦   «         }
‰                     | j        j        ¬¦  «         | j	        }t*          }t          }t          }t,          }nt/          d¦  «        ‚i }|r5t          | j        ¦  «        D ] \  }}|D ]\  }}||k    r|dk    rdnd||<   ŒŒ!t          |¦  «        dk    r |‰d          |||¬¦  «        ¦  «         �nXt	          |¦  «        t          |¦  «        z
  dz   } |‰ 
                    d¦  «         ||||
 
                    d¦  «        ¬¦  «        ¦  «         t          t          t          |¦  «        dz   t	          |¦  «        ¦  «        ¦  «        D ]}\  }}||v r+‰ 
                    d¦  «        }|
 
                    d¦  «        }n| j        | j        z   |         }d	‰z  }|                     |¦  «        } || ||||||¬¦  «        ¦  «         Œ~ |‰ 
                    d¦  «         |||||
 
                    d¦  «        |¬¦  «        ¦  «         |S )Nc              3   ó*   •K  — | ]\  }}|‰v ¯	|V — Œd S rc   r0   )rþ   rÿ   r   r¥  s      €r2   r  z&Layer._set_multibox.<locals>.<genexpr>"  ó+   øè è € Ð!UÐ!U©¨¨1È!ÈuÈ*È* !È*È*È*È*Ð!UÐ!Ur1   c              3   ó*   •K  — | ]\  }}|‰v ¯	|V — Œd S rc   r0   )rþ   rÿ   r   rÒ  s      €r2   r  z&Layer._set_multibox.<locals>.<genexpr>#  r<  r1   r   c                 ó„   •— g | ]<}|‰v ¯t          ‰                     |¦  «        ¦  «                             ‰d ¦  «        ‘Œ=S ©r7   ©ru  r�   rS   )rþ   Úqbitr¥  Úwire_label_lens     €€r2   r  z'Layer._set_multibox.<locals>.<listcomp>(  óN   ø€ ð ð ð àØ˜5�=�=õ �E—K’K Ñ%Ô%Ñ&Ô&×,Ò,¨^¸SÑAÔAà �=�=r1   c                 ó„   •— g | ]<}|‰v ¯t          ‰                     |¦  «        ¦  «                             ‰d ¦  «        ‘Œ=S r?  r@  )rþ   ÚcbitrÒ  rB  s     €€r2   r  z'Layer._set_multibox.<locals>.<listcomp>-  rC  r1   rÇ  r   r§   r7   c              3   ó*   •K  — | ]\  }}|‰v ¯	|V — Œd S rc   r0   ©rþ   rÿ   r   Úbitss      €r2   r  z&Layer._set_multibox.<locals>.<genexpr>U  ó+   øè è € Ð SÐ S¡t q¨!ÈÈdÈÈ ÈÈÈÈÐ SÐ Sr1   r8   c              3   ó*   •K  — | ]\  }}|‰v ¯	|V — Œd S rc   r0   rG  s      €r2   r  z&Layer._set_multibox.<locals>.<genexpr>a  rI  r1   c                 ó„   •— g | ]<}|‰v ¯t          ‰                     |¦  «        ¦  «                             ‰d ¦  «        ‘Œ=S r?  r@  )rþ   rA  rH  rB  s     €€r2   r  z'Layer._set_multibox.<locals>.<listcomp>c  sN   ø€ ð ð ð àØ˜4�<�<õ �D—J’J˜tÑ$Ô$Ñ%Ô%×+Ò+¨N¸CÑ@Ô@à�<�<r1   z_set_multibox error!.r¢  rã   rì   r·  )r?   rL   )rL   r©   )r@   rL   r   )r§  r  r$  r%  r]   rQ   ru  r�   r¨  r¼  rˆ  r–   r  r¥   rÝ  rÃ   rÉ   rf  rá  rm   rÀ   ry   r«   r)   r�  )rM   r:   r¥  rÒ  r?   r@   r   rÌ  Úqarg_indicesÚcarg_indicesÚ	qargs_strÚ	cargs_strr.  r�   Úbit_iÚ	named_bitrL   Úbit_indicesÚset_bitÚOnWireÚ	OnWireTopÚ	OnWireMidÚ	OnWireBotÚcontrol_indexr�   ré  Úqubit_in_edgerd   r©   rH  rB  s     ``                         @@r2   rà  zLayer._set_multibox  s  øøøø€ ð Ñ Ñ!2Ý!Ð!UÐ!UÐ!UÐ!Uµ	¸$¼+Ñ0FÔ0FÐ!UÑ!UÔ!UÑUÔUˆLÝ!Ð!UÐ!UÐ!UÐ!Uµ	¸$¼+Ñ0FÔ0FÐ!UÑ!UÔ!UÑUÔUˆLõ !¥¥S­¨U©¬°a©Ñ%8Ô%8Ñ!9Ô!9½3½sÅ3ÀuÁ:Ä:ÐPQÁ>Ñ?RÔ?RÑ;SÔ;SÑTÔTˆNðð ð ð ð à œKðñ ô ˆIð
ð ð ð ð à œKðñ ô ˆIõ ˜5 d¤kÔ&7Ð8Ñ8Ô8ˆEÝ˜5 d¤kÔ&7Ð8Ñ8Ô8ˆEå˜Tœ[Ñ)Ô)­C°Ñ,=Ô,=Ñ=ÅÀLÑ@QÔ@QÑQÐTUÑUˆJà�NŠN˜5Ÿ9š9 Q™<œ<­¸È)Ï-Ê-ÐXYÑJZÔJZÐ)[Ñ)[Ô)[Ñ\Ô\Ð\ØˆEÝ )­%µ°LÑ0AÔ0AÀAÑ0EÅsÈ4Ì;ÑGWÔGWÑ*XÔ*XÑ YÔ Yð 	ð 	‘��uØ˜LÐ(Ð(Ø %§	¢	¨!¡¤�IØ!*§¢¨qÑ!1Ô!1�J�Jà $¤¨EÔ 2�IØ!$ ~Ñ!5�JØ—’Ø�~¨e°ZÀÐS]Ð^Ñ^Ô^ñô ð ð õ !*­%µ°LÑ0AÔ0AÑ*BÔ*BÀEÈAÁIÑ NÔ Nð 	ð 	‘��uØ˜LÐ(Ð(Ø %§	¢	¨!¡¤�IØ!*§¢¨qÑ!1Ô!1�J�Jà $¤¨EÔ 2�IØ!$ ~Ñ!5�JØ—’Ø�~¨e°ZÀÐS]Ð^Ñ^Ô^ñô ð ð ð �NŠNØ—	’	˜!‘”�n¨U°JÈ9Ï=Ê=ÐYZÑK[ÔK[Ð\Ñ\Ô\ñô ð ð  Ðàˆ=˜UÐ.Ý˜‘;”;ˆDÝ Ð SÐ SÐ SÐ S­y¸¼Ñ/EÔ/EÐ SÑ SÔ SÑSÔSˆKÝ ¥¥S¨¡Y¤Y°¡]Ñ!3Ô!3Ñ4Ô4ˆNØ�IŠI˜$œ+Ô+ˆIÑ,Ô,Ð,Ø˜�s 4™yœyÑ(ˆIØ”nˆGÝ ˆFÝ&ˆIÝ&ˆIÝ&ˆIˆIàˆ]˜uÐ0Ý˜‘;”;ˆDÝ Ð SÐ SÐ SÐ S­y¸¼Ñ/EÔ/EÐ SÑ SÔ SÑSÔSˆKÝ ¥¥S¨¡Y¤Y°¡]Ñ!3Ô!3Ñ4Ô4ˆNðð ð ð ð à œKðñ ô ˆIð
 �IŠI˜$œ+Ô+ˆIÑ,Ô,Ð,Ø”nˆGÝ ˆFÝ&ˆIÝ&ˆIÝ&ˆIˆIå$Ð%<Ñ=Ô=Ð=àˆØð 	NÝ )¨$¬+Ñ 6Ô 6ð Nð N‘��uØ,;ð Nð NÑ(�M 5Ø Ò-Ð-Ø8=Àº¸¨u¨uÈ#˜ eÑ,øðNõ ˆ{ÑÔ˜qÒ Ð ØˆG�D˜”G˜V˜V E°{ÐCÑCÔCÑDÔDÐDÑDå˜[Ñ)Ô)­C°Ñ,<Ô,<Ñ<¸qÑ@ˆJØˆGØ—’˜‘”˜Y˜Y u¸+ÐR[×R_ÒR_Ð`aÑRbÔRbÐcÑcÔcñô ð õ !*­%µ°KÑ0@Ô0@À1Ñ0DÅcÈ+ÑFVÔFVÑ*WÔ*WÑ XÔ Xð ð ‘��uØ˜KÐ'Ð'Ø $§¢¨¡¤�IØ!*§¢¨qÑ!1Ô!1�J�Jà!%¤¨t¬{Ñ!:¸EÔ B�IØ!$ ~Ñ!5�Jà -× 1Ò 1°%Ñ 8Ô 8�Ø�ØØ�IØ˜z¨5¸ZÐWdðñ ô ñô ð ð ð ˆGØ—’˜‘”Ø�	ØØØ +Ø(Ÿ}š}¨QÑ/Ô/Ø +ðñ ô ñ	ô 	ð 	ð Ðr1   r}   c           
      ó„  ‡— t          |t          j        ¦  «        �rHd}g }t          |¦  «        j        }t          j        t          ¦  «        }|D ]0}|t          | j	        |¦  «                  
                    |¦  «         Œ1|                     dd¦  «        x}	r<|                     |                      |dgt          |	¦  «        z  |	|¦  «        ¦  «         | j        r1|D ]-}
|                      |
d         t#          ||¬¦  «        ¦  «         Œ.nV|                     ¦   «         D ]A\  }
}|                     |                      |dgt          |¦  «        z  ||¦  «        ¦  «         ŒB|S t'          || j	        | j        ¦  «        \  }}t          |d         t(          ¦  «        r	|d         Šnt          | j	        |d         ¦  «        Š| j        rœt          |d         t*          ¦  «        rN‰€ |                      |||d         g|¦  «         n]|                      |d         t#          ||¬¦  «        ¦  «         n1|                      |d         d         t#          ||¬¦  «        ¦  «         g S t          |d         t*          ¦  «        r
|d         g}n ˆfd„t-          ‰j        ¦  «        D ¦   «         }|                      ||||¦  «        S )ai  Sets the multi clbit box.

        Args:
            condition (list[Union(Clbit, ClassicalRegister), int]): The condition
            wire_map (dict): Map of bits to indices
            top_connect (char): The char to connect the box on the top.

        Returns:
            List: list of tuples of connections between clbits for multi-bit conditions
        z[expr]Nr0   r¢  r   )r:   r?   c                 ó    •— g | ]
}‰|         ‘ŒS r0   r0   )rþ   ÚidxÚcond_regs     €r2   r  z)Layer.set_cl_multibox.<locals>.<listcomp>Ñ  s   ø€ ÐHÐHÐH¨C˜( 3œ-ÐHÐHÐHr1   )rt  r   r  r   r%  ÚcollectionsÚdefaultdictrf  r#   r'  r  rˆ  ÚextendÚset_cond_bulletsrQ   r4  rÝ  rm   rs  r&   r   r   r  rv  )rM   r¡  r   r?   r:   ÚoutÚcondition_bitsÚ	registersr4  Úregisterlessrz  rH  Úval_bitsr%  r]  s                 @r2   rÜ  zLayer.set_cl_multibox™  sÜ  ø€ õ �i¥¤Ñ+Ô+ñ 	ð ˆEØˆCÝ+¨IÑ6Ô6Ô=ˆNÝ#Ô/µÑ5Ô5ˆIØ%ð Lð L�ØÕ*¨4¬=¸#Ñ>Ô>Ô?×FÒFÀsÑKÔKÐKÐKØ(Ÿ}š}¨T°2Ñ6Ô6Ð6ˆ|ð Ø—
’
Ø×)Ò)¨%°#°½¸\Ñ9JÔ9JÑ1JÈLÐZbÑcÔcñô ð ð Œð `ð !*ð cð c�HØ—N’N 8¨A¤;µÀ%ÐU`Ð0aÑ0aÔ0aÑbÔbÐbÐbðcð '0§o¢oÑ&7Ô&7ð `ð `‘N�H˜dØ—J’J˜t×4Ò4°U¸S¸EÅCÈÁIÄIÑ<MÈtÐU]Ñ^Ô^Ñ_Ô_Ð_Ð_ØˆJå1°)¸T¼]ÈDÌOÑ\Ô\‰ˆˆxÝ�i ”lÕ$5Ñ6Ô6ð 	EØ  ”|ˆHˆHå'¨¬°yÀ´|ÑDÔDˆHØŒ?ð 	LÝ˜) Aœ,­Ñ.Ô.ð 	càÐ#Ø×)Ò)¨%°¸IÀa¼L¸>È8ÑTÔTÐTÐTð —N’N 9¨Q¤<µÀ5ÐVaÐ1bÑ1bÔ1bÑcÔcÐcÐcð —’˜y¨œ|¨AœµÀ%ÐU`Ð0aÑ0aÔ0aÑbÔbÐbØˆIå˜) Aœ,­Ñ.Ô.ð IØ# Aœ,˜��àHÐHÐHÐHµ5¸¼Ñ3GÔ3GÐHÑHÔH�Ø×(Ò(¨°¸&À(ÑKÔKÐKr1   c           	      ó4  ‡— g }t          ˆfd„|D ¦   «         ¦  «        }t          |¦  «        D ]é\  }}d}	‰|         |k    r|}	||         dk    r5t          d|	¬¦  «        | j        ‰|         t	          | j        ¦  «        z
  <   n@||         dk    r4t          d|	¬¦  «        | j        ‰|         t	          | j        ¦  «        z
  <   ‰|         }
|
d„ |D ¦   «         vr=|                     |
| j        ‰|         t	          | j        ¦  «        z
           f¦  «         Œê|S )aÖ  Sets bullets for classical conditioning when cregbundle=False.

        Args:
            label (str): String to display below the condition
            val_bits (list(int)): A list of bit values
            clbits (list[Clbit]): The list of classical bits on
                which the instruction is conditioned.
            wire_map (dict): Map of bits to indices

        Returns:
            List: list of tuples of open or closed bullets for condition bits
        c              3   ó(   •K  — | ]}‰|         V — Œd S rc   r0   )rþ   r4  r   s     €r2   r  z)Layer.set_cond_bullets.<locals>.<genexpr>â  s'   øè è € Ð7Ð7¨�x ”}Ð7Ð7Ð7Ð7Ð7Ð7r1   r7   r¢  rÏ   )r?   r@   r�  c                 ó   — g | ]\  }}|‘ŒS r0   r0   rº  s      r2   r  z*Layer.set_cond_bullets.<locals>.<listcomp>ð  s   € Ð#?Ð#?Ð#?©$¨!¨Q AÐ#?Ð#?Ð#?r1   )r]   r  rñ   r2  rQ   r$  rö   r  )rM   r:   rf  r%  r   r½  Úwire_maxrÿ   r4  r@   rÀ  s       `      r2   ra  zLayer.set_cond_bulletsÔ  sZ  ø€ ð ˆÝÐ7Ð7Ð7Ð7°Ð7Ñ7Ô7Ñ7Ô7ˆÝ Ñ'Ô'ð 	ð 	‰FˆAˆsØˆKØ˜Œ} Ò(Ð(Ø#�Ø˜Œ{˜cÒ!Ð!ÝEMØ %°;ðFñ Fô F�Ô  ¨#¤µ°T´[Ñ1AÔ1AÑ!AÑBÐBð ˜!” Ò#Ð#ÝEQØ %°;ðFñ Fô F�Ô  ¨#¤µ°T´[Ñ1AÔ1AÑ!AÑBð $ Cœ=ˆLØÐ#?Ð#?°,Ð#?Ñ#?Ô#?Ð?Ð?Ø×#Ò#Ø! 4Ô#3°H¸S´MÅCÈÌÑDTÔDTÑ4TÔ#UÐVñô ð øð Ðr1   c                 ó8   — |                       ||||||¬¦  «        S )a  Sets the multi qubit box.

        Args:
            bits (list[int]): A list of affected bits.
            label (string): The label for the multi qubit box.
            top_connect (char): None or a char connector on the top
            bot_connect (char): None or a char connector on the bottom
            conditional (bool): If the box has a conditional
            controlled_edge (list): A list of bit that are controlled (to draw them at the edge)
        Return:
            List: A list of indexes of the box.
        )r¥  r?   r@   r   rÌ  )rà  )rM   rH  r:   r?   r@   r   rÌ  s          r2   rÞ  zLayer.set_qu_multiboxö  s3   € ð* ×!Ò!ØØØ#Ø#Ø#Ø+ð "ñ 
ô 
ð 	
r1   c                 óF  — | j         D �]—\  }}|sŒ	t          |¦  «        D �]\  }}t          |t          t          f¦  «        rzd}|dk    r+t          |¦  «        dk    r|                     |dg¦  «         ŒU|t          |¦  «        dz
  k    r|                     |dg¦  «         Œƒ|                     |ddg¦  «         Œœ|dk    r|                     |dg¦  «         Œº|t          |¦  «        dz
  k    r|                     |dg|¦  «         Œé|                     |ddg¦  «         �Œ|rz|D ]w}t          |¦  «        t          |j        ¦  «        z   |_        t          |t          t          f¦  «        r0|j        r)t          |¦  «        t          |j        ¦  «        z   |_        Œx�Œ™dS )u…   Connects the elements in the layer using wire_char.

        Args:
            wire_char (char): For example 'â•‘' or 'â”‚'.
        rÏ   r   r   r[   rW   N)ró  r  rt  rñ   rö   rQ   ri   rY   rI   rá   rê   r   rJ   )rM   rg   r:   Úaffected_bitsr�   Úaffected_bits         r2   rô  zLayer.connect_with  sæ  € ð %)Ô$4ð 	Tñ 	TÑ ˆE�=à ð Øå'0°Ñ'?Ô'?ð Hñ HÑ#��|Ý˜l­Xµ|Ð,DÑEÔEð HØ %�IØ ’z�z¥c¨-Ñ&8Ô&8¸1Ò&<Ð&<Ø$×,Ò,¨Y¸¸Ñ@Ô@Ð@Ð@Ø¥# mÑ"4Ô"4°qÑ"8Ò8Ð8Ø$×,Ò,¨Y¸¸Ñ@Ô@Ð@Ð@à$×,Ò,¨Y¸À¸ÑGÔGÐGÐGà ’z�zØ$×,Ò,¨Y¸¸Ñ@Ô@Ð@Ð@Ø¥# mÑ"4Ô"4°qÑ"8Ò8Ð8Ø$×,Ò,¨Y¸¸ÀÑGÔGÐGÐGà$×,Ò,¨Y¸À¸ÑGÔGÐGÑGàð TØ$1ð Tð T�LÝ.1°%©j¬j½3¸|Ô?OÑ;PÔ;PÑ.P�LÔ+Ý! ,µ½Ð0DÑEÔEð TÈ,ÔJbð TÝ14°U±´½cÀ,ÔBRÑ>SÔ>SÑ1S˜Ô.øùð5	Tð 	Tr1   )NNNNFN)r}   )NNFN)r,   r-   r.   r/   rN   rj   rõ  r¼  rÝ  rà  rÜ  ra  rÞ  rô  r0   r1   r2   rñ  rñ  Þ  sñ   € € € € € Ø1Ð1ð"ð "ð "ð. ð3ð 3ñ „Xð3ð:ð :ð :ðQð Qð Qð  ØØØØØð@ð @ð @ð @ðD9Lð 9Lð 9Lð 9Lðv ð  ð  ðL ØØØð
ð 
ð 
ð 
ð<!Tð !Tð !Tð !Tð !Tr1   rñ  )Yr/   Úior   Úwarningsr   Úshutilr   r^  r5  Úqiskit.circuitr   r   r   r	   r
   r   r   r   r   r   r   r   Úqiskit.circuit.classicalr   Úqiskit.circuit.controlflowr   Ú%qiskit.circuit.library.standard_gatesr   r   r   r   r   Ú"qiskit.circuit.annotated_operationr   r   Úqiskit.circuit.tools.pi_checkr   Úqiskit.qasm3r   Úqiskit.qasm3.printerr   Úqiskit.qasm3.exporterr   Ú_utilsr    r!   r"   r#   r$   r%   r&   r'   Ú
exceptionsr)   r  r  r³   r+   r4   rm   ry   r‚   r‡   rŠ   r–   r¢   r¥   r«   r±   r¶   rº   r½   rÀ   rÃ   rÉ   rÌ   rÕ   rØ   rÜ   rá   rê   rî   rñ   rö   rù   r
  r  r  rñ  r0   r1   r2   ú<module>r}     s–  ððð ð Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ø 
€
€
€
à HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XØ )Ð )Ð )Ð )Ð )Ð )Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø \Ð \Ð \Ð \Ð \Ð \Ð \Ð \Ð \Ð \Ð \Ð \Ð \Ð \Ø WÐ WÐ WÐ WÐ WÐ WÐ WÐ WØ 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø Ð Ð Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -Ø .Ð .Ð .Ð .Ð .Ð .ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð ,Ð +Ð +Ð +Ð +Ð +ð €Ø	
€Ø€ð	ð 	ð 	ð 	ð 	Ð0ñ 	ô 	ð 	ðZNð ZNð ZNð ZNð ZNñ ZNô ZNð ZNðz!ð !ð !ð !ð !�+ñ !ô !ð !ð,,ð ,ð ,ð ,ð ,�+ñ ,ô ,ð ,ð.ð ð ð ð �ñ ô ð ð$"ð "ð "ð "ð "�+ñ "ô "ð "ð*ð ð ð ð ˆ{ñ ô ð ð@Að Að Að Að A�X˜{ñ Aô Að Að /ð /ð /ð /ð /�8ñ /ô /ð /ð=ð =ð =ð =ð =�\ ;ñ =ô =ð =ð%ð %ð %ð %ð %�X˜{ñ %ô %ð %ð(,ð ,ð ,ð ,ð ,�;ñ ,ô ,ð ,ð*Að Að Að Að A�h ñ Aô Að Að,/ð /ð /ð /ð /�h ñ /ô /ð /ð(%ð %ð %ð %ð %�h ñ %ô %ð %ðD	.ð 	.ð 	.ð 	.ð 	.�X˜{ñ 	.ô 	.ð 	.ð9ð 9ð 9ð 9ð 9�\ ;ñ 9ô 9ð 9ð%ð %ð %ð %ð %�X˜{ñ %ô %ð %ð*:ð :ð :ð :ð :�[ñ :ô :ð :ð ð  ð  ð  ð  ˆnñ  ô  ð  ð$'ð 'ð 'ð 'ð 'ˆñ 'ô 'ð 'ð %ð %ð %ð %ð %�>ñ %ô %ð %ðð ð ð ð ˆ^ñ ô ð ð,ð ð ð ð �ñ ô ð ð,:ð :ð :ð :ð :�[ñ :ô :ð :ðð ð ð ð ˆ~ñ ô ð ð*ð ð ð ð �>ñ ô ð ð*ð ð ð ð �ñ ô ð ð.ð ð ð ð �ñ ô ð ð6ð ð ð ð �ñ ô ð ð.`ð `ð `ð `ð `ñ `ô `ð `ðFWTð WTð WTð WTð WTñ WTô WTð WTð WTð WTr1   