
    z	iA                       S r SSKrSSKrSSKrSSKJr  SSKrSSKJ	r	J
r
JrJrJrJrJrJrJrJrJrJrJr  SSKJr  SSKJr  SSKJrJr  SSKJr  SS	KJ r J!r!J"r"J#r#J$r$J%r%  SS
K&J'r'  SSK(J)r)  SSK*J+r+  SSK,J-r-  SSK.J/r0  SSK1J2r2  SSK3J4r4J5r5  SSK6J7r7J8r8J9r9J:r:J;r;J<r<J=r=J>r>  SSK?J@r@  SrASrBSrCSrDSrESrFSrGSrHSrISrJSrKSrL\0R                  R                  \0R                  R                   " S S 5      5       5       rP " S! S"5      rQg)#z"mpl circuit visualization backend.    N)StringIO)QuantumCircuitQubitClbitClassicalRegisterControlledGateMeasureControlFlowOpBoxOpWhileLoopOpIfElseOp	ForLoopOpSwitchCaseOpCircuitError)condition_resources)expr)_canonicalize_modifiersControlModifier)
Initialize)SwapGateRZZGateU1Gate	PhaseGateXGateZGate)ast)_ExprBuilder)BasicPrinter)pi_check)	optionals)
load_style)MPLDefaultStyleMPLStyleDict   )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   )matplotlib_close_if_inline?               
         i c                   6   \ rS rSrSr\R                  " S5      r           S S jrS!S jr	S r
S r S"S	 jrS#S
 jrS rS r S$S jrS rS rS rS rS"S jrS"S jrS rS r S%S jrS&S jrS'S jrS rS"S jrS"S jrS(S jrSS\ 4S jr!S$S jr"Sr#g))MatplotlibDrawerZ   z2Matplotlib drawer class called from circuit_drawerz(?<!\\)\$(.*)(?<!\\)\$Nc                 n   X@l         Xl        X l        X0l        Uc  SOUU l        X`l        Xl        Xpl        U(       aI  U R                   R                  (       a&  U R                   R                  R                  U l        OS U l        OS U l        Xl
        U R                  S:  a  SU l
        Xl        Xl        U R                   R                  U l        Xl        Xl        Xl        SU l        SU l        SU l        SU l        SU l        0 U l        S U l        0 U l        0 SS	_S
S_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS	_S S!_S"S#_S$S%_S&S'_0 S(S)_S*S+_S,S_S-S+_S.S_S/S)_S0S+_S1S2_S3S+_S4S5_S6S5_S7S8_S9S_S:S8_S;S<_S=S>_S?S@_E0 SASB_SCSD_SESF_SGS'_SHSI_SJSK_SLSM_SNSO_SPSO_SQSR_SSST_SUSV_SWSM_SXSY_SZS[_S\SY_S]SD_E0 S^S2_S_S`_SaSb_ScS@_SdSe_SfS@_SgSh_SiSB_SjSk_SlS%_SmS_SnS_SoSp_SqS_SrSs_StS_SuSv_E0 SwS2_SxSs_SySz_S{S2_S|S2_S}S~_SS~_SS_SS~_SS_SS2_SSh_SS_SS2_SS_SS_SS_ES2SSSSSS+SS2S.	EU l        g )N      ?r-         ?       @      @      @ )JY?g}b٭?!)?W[??")Bi?ffffff?#)g	h"?<Nё\?$)aTR'?uq?%)gNё\C?痐z6?&)g???')g&S?[B>٬?()rN   rF   )*)333333?c]F?+)      ?rK   ,-)$(~?N@?.)rC   ?W[?/)9#?g      ?0)g      ?rN   1)0*D?rN   2)rM   Bi?345678)rf   rh   9:)rc   ra   ;<)r[   gZӼ?=>?)glxz,C?9EGr?@)g^)?V/?A)g7d?0*D?B)g9#?rz   C)g?gaTR'?D)j+?g9#?EF)g??gV/?G)r~   g+	h?H)g?rH   I)rI   g6?JK)g9EGr?rE   L)g-!lV?[B>٬?M)g#?g#?NO)g6<R!?rR   P)oŏ1?̼?QRST)rx   r   U)glxz,C?gioT?VW)g	c?矫_v?XY)r   r   Z[)rN   g333333?\]^_)d]Fx?rY   `a)rx   g-!lV?bc)gu?rc   def)r   r_   ghi)g?ܵ?rT   jk)g6<R!?r^   lm)gz6?r   nopqr)g      ?gZӼ?s)rK   rC   t)rP   glxz,C?)g_v?r   )rK   rv   )皙?ra   )	uvwxyz{|})_circuit_qubits_clbits_nodes_scale_style_plot_barriers_reverse_bits_layoutinitial_layout_fold_ax_initial_stateglobal_phase_global_phase	_expr_len_cregbundle_measure_arrows_lwidth1	_lwidth15_lwidth2_lwidth3_lwidth4_flow_drawers_flow_parent_flow_wire_map
_char_list)selfqubitsclbitsnodescircuitscalestylereverse_bitsplot_barriersfoldaxinitial_state
cregbundlewith_layoutexpr_lenmeasure_arrowss                   a/home/james-whalen/.local/lib/python3.13/site-packages/qiskit/visualization/circuit/matplotlib.py__init__MatplotlibDrawer.__init__a   s"   $  "]c+)}}$$#}}44CC#DL
::>DJ+!]]77!%-   ! _
!_
!_
 !_
 !	_

 !_
 !_
 !_
 !_
 !_
 !_
 _
 _
 !_
 !_
 !_
  !!_
" !#_
$ !%_
& !'_
( !)_
* !+_
, !-_
. !/_
0 !1_
2 !3_
4 !5_
6 !7_
8 !9_
: ;_
< =_
> ?_
@ !A_
B !C_
D !E_
F !G_
H !I_
J !K_
L !M_
N !O_
P !Q_
R S_
T !U_
V !W_
X !Y_
Z ![_
\ !]_
^ __
` !a_
b !c_
d !e_
f !g_
h !i_
j !k_
l !m_
n !o_
p !q_
r !s_
t !u_
v !w_
x y_
z "{_
| !}_
~ !_
@ !A_
B C_
D !E_
F !G_
H !I_
J !K_
L !M_
N !O_
P !Q_
R !S_
T !U_
V !W_
X !Y_
Z ![_
\ !]_
^ !__
` !a_
b !c_
d !e_
f g_
h !i_
j !k_
l "!!!!!!!}_
    c                  
   SSK Jn  SSK Jn  0 nX5S'   Un[        U R                  [
        [        5       SSS9u  U l        nU R                  S   U-  U R                  S	   -  US
'   U R                  cO  SnUR                  5       n	U	R                  R                  U R                  S   S9  U	R                  S5      U l        OSnU R                  R                  5       n	U R                  R                  S5        U R                  R                  S5        U R                  R                  SSSSS9  [!        U R"                  U R$                  U R&                  -   U R(                  5      n
0 n0 n0 nU R+                  XX5        U R-                  XU R"                  U5      nU R/                  XU R"                  XX5      nU R0                  S:  a  [3        SUS-
  5      U R0                  -  OSnXR0                  s=:  a  S:  a*  O  O'U R0                  US   -   S-   nUS-   US   S-   -  S-
  nO(U R4                  (       d  SOSnUS-   US   -   U-
  nUS   nU R                  S   S   * nUU R                  S   S   -   nU* U R                  S   S   -
  S-   nU R                  S   S   S-   nU R                  R7                  UU5        U R                  R9                  UU5        UU-
  S-  nUU-
  S-  nU R:                  nU(       aT  U R                  R=                  5       R?                  U	R@                  RC                  5       5      nURD                  U-  S-  nOU R:                  S:w  a-  U	RG                  UU R:                  -  UU R:                  -  5        OUU R                  S    S!:  a0  U R                  S    S"-  nU	RG                  UUU-  U-  5        UU-  nOU	RG                  UU5        US:w  a`  U R                  S	==   U-  ss'   U R                  S==   U-  ss'   SU-  U l$        S#U-  U l%        S$U-  U l&        S%U-  U l'        S&U-  U l(        U RR                  (       a(  URU                  UUS'[W        U RR                  S(S)9 35        U RY                  UUXX5        U R[                  U R4                  UU
U R"                  UUUUU5	        U(       a-  U	R]                  UU R                  S*   S+U	R_                  5       S,9  U(       d  [a        U	5        U	$ g)-zMain entry point to 'matplotlib' ('mpl') drawer. Called from
``visualization.circuit_drawer`` and from ``QuantumCircuit.draw`` through circuit_drawer.
r   )patches)pyplotpatches_modcircuit_mpl_stylecircuit_mpl_style_path)
style_dictdefault_styleuser_config_optuser_config_path_optsfsfssubfont_factorNFbgcoloro   Toffequal)labelbottomlabeltop	labelleft
labelrightr$   x_offsetr   n_lines皙?g?marginr-         ?r0   gRl?r<   figwidth        gn/?r>   r?   r@   rA   zGlobal Phase: mpl)outputdpitight)r  bbox_inches	facecolor)1
matplotlibr   r   r!   r   r#   r"   r   figurepatchset_facecoloradd_subplot
get_figureaxis
set_aspecttick_paramsr'   r   r   r   r   _set_bit_reg_info_get_layer_widths_get_coordsr   maxr   set_xlimset_ylimr   get_window_extenttransformeddpi_scale_transinvertedwidthset_size_inchesr   r   r   r   r   r   textr   _draw_regs_wires	_draw_opssavefigget_facecolorr.   )r   filenameverboser   plt	glob_dataplt_moddef_font_ratio
is_user_ax
mpl_figurewire_map	node_dataqubits_dictclbits_dictlayer_widthsmax_x_index	num_foldsxmaxymaxx_incrxlxrybyt
base_fig_w
base_fig_hr   bbox	adj_fig_ws                                r   drawMatplotlibDrawer.draw   s    	', 	#*- &0KK#)+/!9'
#^ '+kk%&8>&IDKKX\L]&]	"# 88JJ**T1B*C!--c2DHJ,,.JeG$%\ab  t||dll/JDL\L\] 	  	xkM --i4==R[\ &&;
 >BZZ!^C;?+tzz9QR	 'a'::	* 55;DMi	&:Q&>?!CD $SF?Yz%::VCDY'Dkk(#A&&DKK)!,,UT[[*1--3[["1%+"b!"b! 2g*
2g*
 88--/;;J<V<V<_<_<abDJJ+i7E [[C&&zDKK'?dkkAYZ [[$s*J/(:I&&y)j2H:2UV
*E &&z:> C<KK&KK%'%KDM 5[DN%KDM%KDM%KDM LLR>(4;M;MV[2\1]!^_i{`KKMM
	
 KK&#$224	   &z2 r   c                 N  ^^ 0 n[        U R                  5       G	H  u  pg[        n[        U5       G	HH  u  pU	S:w  a  SnSX`R                  /XZ'   U
R                  n[        5       X'   [        X   l        [        USS5      n[        USS5      (       a"  UR                  (       a7  U R                  (       a&  U R                  (       a*  [        U[        5      (       a  UR                  X   l        M  [        USS5      n[        US	U R                   S
9u  pnXU
   l        XU
   l        [        U[        5      (       d	  UX   l        SX   l        [)        U
R*                  5      U-
  S:X  a/  [)        U5      S:  a   [)        [        US/ 5      5      S:X  a  Uc  GMh  [        U[,        5      (       d  [        U[,        5      (       a  GM  U R/                  XU R                   S   S9S-
  n[)        [        US/ 5      5      S:  a  [1        S UR2                   5       5      (       d  [1        S UR2                   5       5      (       dc  [5        US	SS9n[        U[6        5      (       a  SUR9                  SS5       S3nUX   l        U R/                  UX@R                   S   SS9nUS-   nOS=nn[        U[:        5      (       d   [        U[<        [>        [:        45      (       aD  [        U[>        5      (       a  SnU R/                  US-   X@R                   S   S9U-   nUS-   S-  nGO[        U
R                  [@        5      (       Ga#  / U RB                  U
'   / X   l        SX   l"        SnSn[        U[F        5      (       a)  [        URH                  [J        RL                  5      (       d<  [        USS5      (       Ga  [        URN                  [J        RL                  5      (       a  UU4S jn[        U[F        5      (       a  URH                  OURN                  n[Q        5       n[S        US S!9RU                  URW                  [Y        U5      5      5        UR[                  5       n[)        U5      U R\                  :  a  USU R\                   S"-   nUX   l/        U R/                  X   R^                  X@R                   S   S9n[a        U5      X   l1        [e        U
R                  Rf                  5      n[        U[h        5      (       a  UR2                  S   X   l5        O[        U[F        5      (       aq  / X   l6        [e        URo                  5       5      nURq                  SUS   S   Rs                  5       5        U H#  u  nnX   Rl                  Ru                  U5        M%     [        U5       GH  u  n n!U S:X  a  UOSnU R                  b"  XR                     RD                  S-   X   l"        TRw                  5       n"U"Ry                  [{        U
R*                  U!R|                  5       V#V$s0 s H  u  n#n$U$TU#   _M     sn$n#5        [{        U
R~                  U!R                  5       H`  u  n#n$U R                  (       a3  [        TU$5      =n%b$  [        TU#5      n&U"Ry                  U%TU&   05        MJ  U"Ry                  U$TU#   05        Mb     [        U!U"U R                  S#9u  n'n(n)[        U'U(U)U!U R                   U R                  U R                  U R                  S$9n*U
U*l        U"U*lF        U RB                  U
   Ru                  U*5        U*R                  UU"TU5      n+URy                  U+5        U) H  n,U, H  n-U UU-   lH        M     M     U+R                  5        HL  u  n.nn/US:w  d  M  U/U*R                  :X  d  M!  UU.-  n[        U
R                  [        5      (       d  MG  US%-  nMN     UUU S:  a  S&OS-   -  nU S:  a  US'-  n[        U[h        5      (       d,  U S:X  a&  X   R                  Ru                  UUS-  -
  5        GM  X   R                  Ru                  U5        GM     OU R                  (       dq  [        U[        5      (       a\  [        TU
R~                  S   5      u  n0nn1U0b  U0R                   S(U1 3nOU1 nU R/                  UX@R                   S   SS9nUnS=n=nnOCU R/                  XU R                   S)   S9nUS*-   n[)        U
R*                  5      U-
  S:  a  US+-  n[        UUU[        5      n2U2U:  a  U2n[        U
R                  [@        5      (       a  G	M5  [        WU5      X   l        G	MK     U H  n
[a        U5      S-   XZ   S'   M     G	M     U$ s  sn$n#f ),z'Compute the layer_widths for the layersr   r=   r$   num_ctrl_qubits
_directiveF	base_gateNr  )r    r0   paramsr   )fontsize皙?c              3   V   #    U  H  n[        U[        R                  5      v   M!     g 7fN)
isinstancenpndarray.0params     r   	<genexpr>5MatplotlibDrawer._get_layer_widths.<locals>.<genexpr>  s     U9%
5"** = =9s   ')c              3   B   #    U  H  n[        U[        5      v   M     g 7frP  )rQ  r   rT  s     r   rW  rX    s     Yye
5. A Ays   )ndigitsz$[rL   z]$T)rM  rV  {Gz?r
  r   z ()gHzG?	conditionc                   > [        U [        R                  5      (       a   [        R                  " U R
                  5      $ [        U [        5      (       a   [        R                  " U R
                  5      $  [        TU 5      u  pnUc  [        R                  " SU 35      $ [        R                  " UR
                  [        R                  " U5      5      $ ! [         a    [        R                  " STU     35      s $ f = f)zxLook up a classical-expression variable or register/bit in our
internal symbol table, and return an OQ3-like identifier.bit)rQ  r   Varr   
Identifiernamer   r)   r   SubscriptedIdentifierIntegerLiteral)varregister	bit_index	reg_indexouter_circuitr3  s       r   
lookup_var6MatplotlibDrawer._get_layer_widths.<locals>.lookup_var  s    
  *#txx88'*~~chh'? ?)#/@AA'*~~chh'? ?MAR$13B" >Y  (/'*~~I;6G'H H#&#<#< (s/A/A)/L$  $0 M (+~~HSM?6K'L LMs   7C &D ?D z  )indent...)r3  r   )r   r   r   r   gMbP?r<   g
ףp=
?r   r   r   zG?)M	enumerater   WIDr   opNodeDatar$  getattrlabelr   r   rQ  r	   ra  raw_gate_textr%   r   	gate_text	ctrl_text
param_textlenqargsr   _get_text_widthanyrL  r&   r   replacer   r   r   r
   r   
nest_depthr   targetr   Exprr\  r   r   visitacceptr   getvaluer   	expr_textint
expr_widthlistblocksr   indexsetjump_valuescases_specifierinsertcopy_empty_likeappendcopyupdatezipr   cargsr   r   r(   r,   r9   r   r   r  circ_numvaluesr   r)   r  )3r   r4  r3  rh  r.  r7  	layer_numlayer
widest_boxr   noderp  rH  	base_typeru  rv  rt  
ctrl_widthrw  raw_param_widthparam_widthraw_gate_width
gate_widthr  ri  r\  streamr  circuit_listcasesr  r   r  r   flow_wire_mapouterinnerin_regout_regr   r   
flow_nodesflow_drawerflow_widths
flow_layer	flow_noder$  flow_parentre  rg  	box_widths3     ``                                               r   r  "MatplotlibDrawer._get_layer_widths  s     )$++ 6IJ$U+ 6 "I&'4E4E%F"WW"**	(+	%")".?"CBe44XXT-@-@,,B1H1H46GGIO1#BT:	6HT[[73	m -6$),5$)!"g..4AIO1-/	* _61<I*GB"56!;!)b(++z)X/N/N
 ((TYHZ([^bb 
 Hb12Q6U299UUUYryyYYY!.r5!!DJ!"j11')**<*<S"*E)Fb%I
1;IO.&*&:&:"IE8JRV '; 'O #2D"8K477K/ b'**jVYX_D`.a.a!)Y77$'	,,%-y;;uCU -  ** # #14"74!?J  77/1D&&t,,.IO)12IO.!$J!$J"2|44BIItyy9Y9YK66:bllTXT]T];^;^: 2<B1M1MBIISUS_S_	!)$VD9??%,,\*-EF %+OO$5	y>DNN:(12BDNN(Ce(KI4=	1%)%9%9%O55y;;W\K] &: &
 69_	2 $(#7L ""i003599Q<	0#B5568	3 $R%7%7%9 : %++AuQx{/J/J/LM.3NK%O77>>{K /4 .7|-D)'7?1}#  ,,89BCTCT9U9`9`cd9dIO6 )1%,, 58

GNN4S4SLE5 !&x 64S -0

GNN,KLE5#//+;M5+Q!Q ^*:=%*P - 4 4fhw>O5P Q - 4 4eXe_5M N -L 6O#mDL`L`62
 '7""&#"&++*.*=*=!%'+'7'7	' 4805B2**4077D '2&C&C%}mY' %++K8*4J-7	@H	) 4 = .8 +5 >I=O=O=Q9E9k(B;+BZBZ3Z .% 7 $.dggu#=#=$2e$;N >R #nx!|QT&UU
 $a<*e3N  *"i88X]%O1188:XY>9Z[%O1188H[ .Ed --*R2I2I->}djjYZm-\*Ha+(0a	{%C
(1{
&*&:&:"IE8JRV '; 'O #2K?BBNBZ* &*%9%9!t{{47H &: &N "0$!6J4::81<"d*

JSI	z)!*J!$''=99,/,PIO)E ,F (+J!(;"1% K !7P Ks   )f!c           	      V   SnSUS'   U R                   (       a  SOSnU R                   (       a  SOSnSn[        U R                  5      * S-   =p[        U5       GH  u  p[	        U[
        5      (       a  US   U R                  ;  a  M0  UnX   nO>XR                  U R                  -   ;  a  MU  [        U R                  U5      u  pnUc  UOUn[        SXU R                  U R                  S	9n[	        U[        5      (       a  UOUn[	        U[        5      (       d  Ub  U R                  (       d  S
U-   S
-   nUU-  nUb  [	        U[
        5      (       a  SOUR                  nUS:  a  SOSnU R                  UX@R                  S   US9S-  nUU:  a  Un[	        U[        5      (       a  U* n	U	US.X+'   US==   S-  ss'   GMl  U R                  (       a)  Ub&  U R                  (       a'  [	        U[
        5      (       a  US==   S-  ss'   US-  nX-
  n	U	UUS.X;'   GM     SU-   US'   g)z6Get all the info for drawing bit/reg names and numbersr   r  z $|0\rangle$rK  z 0r$   Nr  )layoutr   rL   r-   r   )reg_remove_undergffffff?)r   
wire_label)r   r  re  g333333r  )r   rx  r   rn  rQ  r   r   r)   r   r*   r   r   r   sizerz  r   )r   r3  r5  r6  r.  longest_wire_label_widthinitial_qbitinitial_cbitidxposy_offiiwirere  indexrf  rg  r  initial_bitreg_sizer  
text_widths                         r   r  "MatplotlibDrawer._set_bit_reg_info  sJ    $%  	)*.*=*=2#22t4<<((1,,!(+HB$ 1227$,,.  ||dll::1B4==RV1W.Y%-%5	9'xt||HXHXJ +5T5*A*A,|K $&&(*:$BRBR :-3
+%J %D:K)L)LRZR_R_  %-qLqa$$	;;t+<O_ %    44+5($&&c",# )$)$ (('((Z>O-P-Pi(A-(1HCk", (#w ,@ !%'? ?	*r   c	                 H   Sn	U R                    GH  n
U	S-   n/ nU
 GH  nUb  SX   l        [        UR                  [        5      (       a  SOSnX   R
                  U-   U-   X   l        X   R                  S:  aV  X   R                  SX   R                    H&  nX   =R
                  [        U5      S-   -  sl        M(     X   R
                  nO)X   R
                  X   R                  -   nOSX   l        Un/ nUR                   H)  nUU R                  ;   d  M  UR                  UU   5        M+     / nUR                   Hu  nUU R                  ;   d  M  U R                  (       a;  [!        UU5      nUb  UR                  UU   5        MK  UR                  UU   5        Ma  UR                  UU   5        Mw     [        UR                  ["        5      nU Vs/ s H#  nU R%                  UUU   S   XM   S   UU5      PM%     snX   l        U Vs/ s H#  nU R%                  UUU   S   XM   S   UU5      PM%     snX   l        Uc  US   nUR                  XM   S   5        UX   l        [        UR                  [*        5      (       d  GMt  [-        UR                  R.                  S   5      S:X  d  GM  US-  nGM     SnU R0                  (       d  [3        S	 U
 5       5      (       a  SOSnU(       a  [5        U5      OSnUU-   U-   S-
  n	GM     U	S-   $ s  snf s  snf )
zFLoad all the coordinate info needed to place the gates on the drawing.r=   r$   NTr   Fr   next_x_indexc              3   P   #    U  H  n[        UR                  S S5      v   M     g7frI  FNrr  rp  rU  nds     r   rW  /MatplotlibDrawer._get_coords.<locals>.<genexpr>W        REbgbee\5AAE   $&)r   inside_flowrQ  rp  r   x_indexr  r$  r  r  ry  r   r  r  r   r   r(   r
   _plot_coordq_xyc_xyr   rx  r  r   allr  )r   r4  r3  rh  r7  r5  r6  r.  r  prev_x_indexr  curr_x_indexl_widthr  front_spacer$  r  q_indxsqargc_indxscargre  flow_opr  barrier_offset
max_lwidths                             r   r  MatplotlibDrawer._get_coords  s.    [[E'!+LG *26IO/ (2+..%'H'H!aK!.66ES O+
 !//!3%.%;%A%AB\IOD\D\%]E%O33s5zA~E3 &^"+/"9"9 #,/"9"9I<R<]<]"]27IO/*G  JJDt||+x~6 '
  JJDt||+++'7t'LH'3 'x/A B 'x~ >#NN8D>: ' %TWWm< &	( & $$#B,$*1-! &	(	$& &	( & $$#B,$*1-! &	(	$ &#,^#<L|1!45*1	' dgg|44477>>"-.!3$)] b N&& RERRRBXY  *1WaJ'*4~EILw !z aY	(	(s   *L*Lc                    SSK Jn  U(       d  gU R                  R                  U5      nSnSn	U(       a3  UR	                  S5      n
U
R                  S5      nU
R                  S5      n	U" 5       R                  UR                  SS5      5      nUb  UnU(       a  UR                  SSU5      nU	(       a  UR                  SSU	5      nU(       a  UR                  S	S
5      nX0R                  S   :X  a  SOSnSnU H  n XR                  U   U   -  nM     US:X  a  XS   -  nU$ ! [         a    XR                  S   U   -  n ML  f = f)z1Compute the width of a string in the default fontr   )LatexNodes2Textr
  r$   r   r   z$$rK  r]   rZ   r   r   r   )pylatexenc.latex2textr  _mathmode_regexsearchgroupcountlatex_to_textr|  r   r   KeyError)r   r&  r.  rM  rV  r  r  math_mode_matchnum_underscores
num_caretsmath_mode_textr   sum_textr   s                 r   rz   MatplotlibDrawer._get_text_width^  sL    	:..55d;
,2215N,2237O'--c2J ..t||D"/EF '.O<<R9D<<R4D <<S)D[[..AAA4OOA.q11  6"233H  4OOC0334s   >D%%EEc                    [        US-   5       GH  nUR                  5        H{  nUS   n	US   XvS   S-   -  -
  n
U R                  R                  US   S-
  U
U	SSS	U R                  S
   -  U R                  S   S[
        S9	  U R                  US   U
/X*/[        S9  M}     0 nUR                  5        H7  nUS   XvS   S-   -  -
  n
X;  a  SUS   US   S.X'   M(  X   S==   S-  ss'   M9     UR                  5        GHC  u  pU R                  (       a  US   b  U R                  R                  US   S-   US   S-   /U
S-
  U
S-   /U R                  S   [        S9  U R                  R                  US   S-   U
S-   [        US   R                  5      SSSU R                  S
   -  U R                  S   S[
        S9	  U R                  R                  US   S-
  U
US   SSS	U R                  S
   -  U R                  S   S[
        S9	  U R                  US   U
/X*/U R                  S   U R                  S   [        S9  GMF     US:  =(       a    X:  nUS:  nU(       d  U(       a  US   S-
  nU R                  US   -   S-   nU* US   S-   -  nUS-   * US   -  U-
  S-   nU(       a<  U R                  R                  UU/UU/U R                  S   U R                  [        S9  U(       a<  U R                  R                  UU/UU/U R                  S   U R                  [        S9  US    R                  US   S-
  U* US   S-   -  S!-   4S"US-   * US   S-   -  U R                  S#   U R                  S#   U R                  [         S$9nU R                  R#                  U5        GM     U R                  S%   (       a  [        U5       H  nU R                  S:  a5  UU R                  -  US   -   S&-   nUU R                  -  * US   S-   -  S'-   nOUUS   -   S&-   nS'nU R                  R                  UU[        US-   5      SSU R                  S(   U R                  S   S[
        S9	  M     gg))zJDraw the register names and numbers, wires, and vertical lines at the endsr$   r  r   r  r  皙?rightcenterg      ?r   tcThavarM  r   clip_onzorder)r  re  )valr  re  r  N333333?r   cc)r   r  leftbottom皙?cline)lclsr  r   g{Gz?r  r   	linewidthr  r   r  g      9r   xyr$  heightfcecr  r  r  g(\?r/   r   )ranger  r   r&  r   PORDER_TEXT_linePORDER_REGLINEitemsr   plotstrr  r   r   	RectanglePORDER_MASK	add_patch)r   r9  r:  r8  r5  r6  r.  fold_numqubitqubit_labelr   this_clbit_dictclbit
this_clbit
feedline_r
feedline_lxpos_lxpos_rypos1ypos2boxr  x_coordy_coords                           r   r'  !MatplotlibDrawer._draw_regs_wires  s    i!m,H$++-#L1#Jy-AA-E!FFj)C/!DKK$55++d+ &  
 

Ij115y
X .$ !O$++-#Jy-AA-E!FF+ &+L&9$)*$5*O& $&u-2- . "1!6!6!8##
:(>(JHHMM":.4i
6Kc6QRS!c'*"kk$/-	 "  HHMM!*-3CJz2778!#!$t{{4'8!8"kk$/ $* " 
 j)C/|,!DKK$55++d+ &  
 

z*A.I{{4({{7+)  A "9R #Q?9+?J!AJZ":.5i
&;;cA!	Yy%9A%=>"Q,9Y+?@8KaOHHMM("kk$/"&..- "  HHMM("kk$/"&..- "  M*44j)C/(i	>RUV>V1WZ]1]^!A)I*>*BC;;t$;;t$.." 5 C HHs#W -\ ;;w";/	::>'$**4y7LLtSG )TZZ 78Ii<PST<TUX\\G')J*??$FG"G	A&![[/++d+ &  
 0  r   c	                     U R                   R                  5        H\  n	U	 HS  n
XR                  -  nU
R                  UU
R                  UUUUUU
R
                  S9  U
R                  UUUUUUUU5        MU     M^     g)zKAdd the nodes from ControlFlowOps and their coordinates to the main circuit)r  N)r   r  r   r  r   r   _add_nodes_and_coords)r   r   r4  r3  rh  r7  r5  r6  r.  flow_drawersr  s              r   r   &MatplotlibDrawer._add_nodes_and_coords  s     !..557L++++''..!  + 8 8 ( 	 11! 	  , 8r   c
                 t   U R                  UUUUUUUU5        Sn
U GH  n/ nU
S-   nU GH6  nUR                  nU R                  X5        U	(       a  [        U5        [	        USS5      (       d  [        U[        5      (       a^  U Vs/ s H=  nU R                  X.   R                  UU   S   X^   S   U[        U[        5      5      PM?     nnU R                  XX4UU5        Sn[	        USS5      (       a7  [        UR                  5      nU H  n[        U[        5      (       d  M  Un  O   [        U[        5      (       a  U R                  XXH5        O[	        USS	5      (       a$  U R                   (       a  U R#                  XU5        O[        U[        5      (       a  U R%                  XU5        O['        X.   R(                  5      S:X  a$  UR*                  (       d  U R-                  XU5        OB[        U[.        5      (       d  U(       a  U R1                  XUU5        OU R3                  XU5        X.   R4                  (       a  GM   UR7                  X^   S   5        GM9     SnU R                   (       d  [9        S
 U 5       5      (       a  SOSnX(       a  [;        U5      OS-   U-   S-
  n
GM     gs  snf )zDraw the gates in the circuitr=   r$   r\  Nr   r   	modifiersrI  Fc              3   P   #    U  H  n[        UR                  S S5      v   M     g7fr  r  r  s     r   rW  -MatplotlibDrawer._draw_ops.<locals>.<genexpr>  r  r  )r   rp  _get_colorsprintrr  rQ  r   r  r  r
   
_conditionr   r$  r   r	   _measurer   _barrier_flow_op_gaterx  r  r  _gater   _control_gate_multiqubit_gater  r  r  r  )r   r   r4  r3  rh  r7  r5  r6  r.  r,  r  r  r  r  r  rp  r  cond_xymod_controlcanonical_modifiersmodifierr  s                         r   r(  MatplotlibDrawer._draw_ops6  s    	""		
 EG'!+L WW  1"I 2{D11ZL5Q5Q #.	 #.B ((%O33'OC0(.q1%&r=9 #.  	 OODXgW`a #2{D11*A",,*O'$7%h@@*2K! %8 b'**MM$=L Ru55**dyA  M22&&t	B --.!3DJJJJt	:  N33{&&t	;O ))$9E !222NN<#5a#89u z N&& RERRRBXY  (73w<J^[^__LQ 	s   AJ5c                    UR                   n[        [        USS5      SS5      nSnX!   R                  U R                  S   ;   a  U R                  S   X!   R                     nO9UR                  U R                  S   ;   a  U R                  S   UR                     nUb2  [        U[        5      (       a  UnU R                  S   nOUS   nUS   nO{U R                  S   S;   aJ  US	;   aD  U R                  S   U   n[        U[        5      (       a  UnU R                  S   nO)US   nUS   nOU R                  S
   nU R                  S   nU R                  S   S:X  a  U R                  S   nU R                  S   n	OUnUn	Un
XbU   l        XU   l        XrU   l	        U R                  S   X!   l
        XU   l        XU   l        g)z1Get all the colors needed for drawing the circuitrJ  Nra  dispcolgtr   r$   )iqpiqxziqp-darkziqx-dark)r   dcxswapgcbwr  r  r  )rp  rr  rt  r   ra  rQ  r  r  r  r7  r  scr  )r   r  r4  rp  	base_namer   r  r7  r  r  r>  s              r   r'  MatplotlibDrawer._get_colors  s    WWGBT:FDI	?((DKK	,BBKK	*9?+H+HIEWWI..KK	*2773E %%%[[&1X1X [[ $JJy ]
 P

 KK	*95E%%%[[&1X1XT"BT"B;;v$&T"BT"BBB$$$![[.	$$r   c                 
  ^^^ [        UR                  [        5      (       a  [        UR                  R                  [        R
                  5      (       a  UR                  R                  nO[        UR                  R                  [        5      (       a  UR                  R                  S4nOSUR                  R                  SUR                  R                  R                  -  S-
  4nOUR                  R                  nSn[        U R                  5      m/ n	[        U[        R
                  5      (       Ga  [        U5      R                  n
SnSn[        R                  " [        5      nU
 H   nU[!        XM5         R#                  U5        M"     U	R%                  UUU4S jUR'                  SS5       5       5        U R(                  (       a  U	R%                  UUU4S	 jU 5       5        OHU	R%                  UUU4S
 j[*        R,                  R/                  UR1                  5       5       5       5        S/[        U	5      -  nGOH[3        XpR4                  U R(                  5      u  pUS   n[7        US   5      nUS:g  =(       a#    U R(                  =(       a    [        U[8        5      nU R(                  (       dO  [        U[8        5      (       a:  [;        UR                  5       H   nU	R#                  TTUU      T-
     5        M"     OU R(                  (       aY  [        U[        5      (       aD  [!        XO5      nUb  U	R#                  TTU   T-
     5        O5U	R#                  TTU   T-
     5        OU	R#                  TTU   T-
     5        / n[=        X5       H  u  nnU(       d  US:X  a  U R>                  S   OU R>                  S   nUS   RA                  U[B        S-  UU R>                  S   U RD                  [F        S9nU RH                  RK                  U5        UR#                  U5        M     U(       d  g[M        X!   RN                  S S9n[M        US S9n[        UR                  [P        [R        [        45      (       a  US   US   S[T        -  S-   -
  4nUu  nn[        UR                  [V        5      (       a  US-  nU RH                  RY                  UUS[T        -  -
  USSU R>                  S   U R>                  S   S[Z        S9	  U R]                  UUU R>                  S   U R>                  S   S9  g) zAdd a conditional to a gater$   r-   Fz[expr]Tc              3   :   >#    U  H  nTTU   T-
     v   M     g 7frP   rU  r^  r0  first_clbitr3  s     r   rW  .MatplotlibDrawer._condition.<locals>.<genexpr>  s!     dLcSGHSMK$?@Lc   NrC  c              3   :   >#    U  H  nTTU   T-
     v   M     g 7frP  rC  )rU  re  r0  rE  r3  s     r   rW  rF    s"     dZch(:[(H IZcrG  c              3   :   >#    U  H  nTTU   T-
     v   M     g 7frP  rC  rD  s     r   rW  rF    s&       P HSMK78PrG  re   r   r  r   r   rX   r  radiusr  r  r  r  c                     U S   $ Nr$   rC  r  s    r   <lambda>-MatplotlibDrawer._condition.<locals>.<lambda>"  s    2a5r   keyc                     U S   $ rM  rC  rN  s    r   rO  rP  #  s    ber   r  gQ?r  r  topr   r  r  r  r  r  r  )/rQ  rp  r   r~  r   r  r   r  r\  rx  r   r   r   collectionsdefaultdictr  r(   r  extendpopr   	itertoolschainfrom_iterabler  r+   r   r  r   r  r  r   Circlero  r   PORDER_GATEr   r  minr  r   r   HIGr	   r&  r  r  )r   r  r4  r3  rh  r0  r.  r\  override_fccond_poscondition_bitsrs  	registersr^  val_bitscond_bit_regcond_bit_valr  re  xy_plotval_bitr  r  r  qubit_bclbit_bxposyposrE  s      ` `                      @r   r)  MatplotlibDrawer._condition  sK   
 dgg|,,$''..$))44 GGNN	DGGNNE22!WW^^Q/	!WW^^Q477>>3F3F-G!-KL	))I$,,'i++ 1;BBNEK#//5I%*=>?FFsK & OOdIMMZ^`bLcdddZcdd  (<<Y=M=M=OP   us8},H5iPTP`P`aOE$Q<Ly|,L! @$$@|->?  ##
<AR(S(S !2!23COOGH\#5F,G+,U$VW 4 !!ju&E&E+MH'OOGHX,>,L$MNOOGH\,B[,P$QR(>(L MNx2KGR&1W^T"UYIZBM*11Tz;;t$.." 2 C HHs#NN2 3  io**0@Ag#34 dgg+|DEEqz71:sT1A#BCG 
ddggw''CKD39[['++d# 	 
	
 	

7GD(9dkk'>R
Sr   c                    X!   R                   S   u  pVX!   R                  S   u  px[        X1R                  S   5      u  pnU R	                  XU5        U R
                  (       a  SOSnUS   R                  XVU[        -  -
  4[        S-  [        S-  SSSX!   R                  U R                  [        S9	nU R                  R                  U5        U R
                  (       a  S	OS
nU R                  R                  XUS[        -  -   /Xl[        -  -
  Xn[        -  -   /X!   R                  U R                  [        S9  U R
                  (       Ga  U R                  X!   R                   S   XxS[        -  -   /U R                   S   U R                   S   S9  US   R#                  US	[        -  -
  US[        -  -   4US	[        -  -   US[        -  -   4XxS-   44U R                   S   SS9nU R                  R%                  U5        U R&                  (       aV  U	bR  U R                  R)                  US-   US-   [+        U5      SSSU R                   S   -  U R                   S   S[,        S9	  gggU	b  U	R.                   SU 3nOU nU R                  R)                  UUS[        -  -
  USSU R                   S   U R                   S   S[,        S9	  g) z1Draw the measure symbol and the line to the clbitr   rX   rN  r   ffffff?   F)	r  r$  r  theta1theta2fillr  r  r  r  r  ffffff?r  r  r  rU  {Gz?N)r  r  r[   r   r  r  r  r   r  Tr  r   gzG?r  r   )r  r  r)   r  r-  r   Arcr`  ro  r7  r   r^  r   r  r
  r  r   Polygon
add_artistr   r&  r  r  ra  )r   r  r4  rh  r.  qxqycxcyre  r   rg  qy_adj1arcqy_adj2	arrowheadrs  s                    r   r*  MatplotlibDrawer._measure;  s   %%a(%%a(!2=**Q-!PY 	

4I. ..$D&**3&')9!!mm + 

 	3--#3dSj!C-m!34/$$mm 	 	
 JJ$$Q'$*_%;;t$;;w'	   "-088$*_b4#:o6$*_b4#:o6dO
 ;;t$ 9 I HH	*H$8IH	N 4;;t#44++d+ &  
 %9 ##==/9+6$+HHMMTCZU+kk$'"  
r   c                    [        X!   R                  5       GHX  u  pEUu  pgUS:X  a  UR                  R                  b  SnOSnU R                  R                  Xf/US-   U-   US-
  /U R                  SU R                  S   [        S9  US	   R                  US
[        -  -
  US-
  4S[        -  SU-   U R                  S   SSU R                  [        S9n	U R                  R                  U	5        US:X  d  M  UR                  R                  c  M  US[        -  -   n
U R                  R                  UU
UR                  R                  SSU R                  S   X!   R                   S[        S9	  GM[     g)zDraw a barrierr   Ngffffffֿr
  r  dashedr  )r  	linestyler   r  r   r  g333333?r<   bc)r  r$  r  r  r  alphar  r  r/   r  rT  r   Tr  )rn  r  rp  rs  r   r
  r   r   r  r  ro  r   PORDER_BARRIERr  r`  r&  r  )r   r  r4  r.  r   r  rl  rm  ypos_adjr  dir_yposs              r   r+  MatplotlibDrawer._barrier  sd   y334EAJDAv$''--3 HHMMh&s
3--"kk$'"   M*44C#I&s
3CiX~;;t$..% 5 	C HHs# Av$''--3$*,GGMM![[.#/,, &  
= 5r   c                    Uc  X!   R                   S   nUu  pV[        X!   R                  [        5      nUS   R	                  USU-  -
  US[
        -  -
  4U[
        X!   R                  X!   R                  U R                  [        S9nU R                  R                  U5        X!   R                  (       a  Un	X!   R                  (       a`  US[
        -  -   n	U R                  R                  UUS[
        -  -
  X!   R                  SSU R                  S	   X!   R                   S
["        S9	  U R                  R                  UU	X!   R                  SSU R                  S   X!   R$                  S
["        S9	  gg)zDraw a 1-qubit gateNr   r   r  r   rX   r  r  r   Tr  r   )r  r  r$  ro  r  r`  r  r  r   r^  r   r  ru  rw  r&  r   r>  r  r7  )
r   r  r4  r.  r  rl  rm  widr  	gate_yposs
             r   r-  MatplotlibDrawer._gate  sm   :%%a(B
)/''-&00sSy $s"23!!!!nn 1 
 	3?$$I)) 4#:-	39$O..![[/#/,, &  
 HHMM))T*o(("  
 %r   c                    UR                   nUc  X!   R                  n[        U[        5      (       a  U R	                  XBU   R
                  5        g[        U[        5      (       a  U R                  X[        U5        gX!   R                  n[        S U 5       5      n[        S U 5       5      n[        S U 5       5      n	U(       a/  [        S U 5       5      n
[        S U 5       5      n[        X5      n[        X!   R                  S-   [        5      n[        U5      [        U	5      -
  n[        U-   nUS   R                  US	U-  -
  US	[        -  -
  4UUX!   R                   X!   R"                  U R$                  [&        S
9nU R(                  R+                  U5        [-        U Vs/ s H  nUS   PM
     sn5       HV  u  nnU R(                  R/                  US-   S	U-  -
  U[1        U5      SSU R2                  S   X!   R4                  S[6        S9	  MX     U(       ay  [-        U Vs/ s H  nUS   PM
     sn5       HV  u  nnU R(                  R/                  W
S-   S	U-  -
  U[1        U5      SSU R2                  S   X!   R4                  S[6        S9	  MX     X!   R8                  (       a  US	U-  -   nX!   R:                  (       a[  USU-  -   nU R(                  R/                  US-   USU-  -   X!   R:                  SSU R2                  S   X!   R<                  S[6        S9	  U R(                  R/                  US-   UX!   R8                  SSU R2                  S   X!   R4                  S[6        S9	  ggs  snf s  snf )z(Draw a gate covering more than one qubitNc              3   *   #    U  H	  oS    v   M     g7fr   NrC  rU  r   s     r   rW  4MatplotlibDrawer._multiqubit_gate.<locals>.<genexpr>       $AQ4   c              3   *   #    U  H	  oS    v   M     g7fr$   NrC  rU  r   s     r   rW  r    r  r  c              3   *   #    U  H	  oS    v   M     g7fr  rC  r  s     r   rW  r         (RtRr  c              3   *   #    U  H	  oS    v   M     g7fr  rC  r  s     r   rW  r         +d!dr  c              3   *   #    U  H	  oS    v   M     g7fr  rC  r  s     r   rW  r    r  r  rm  r   r  r   r$   gQ?r  r  r   Tr  r  )\(?r  r   )rp  r  rQ  r   _swapr  r   _symmetric_gater  r_  r  r$  ro  absr`  r  r  r  r   r^  r   r  rn  r&  r  r   r7  r  ru  rw  r>  )r   r  r4  r.  r  rp  r  rl  rm  ypos_maxcxposcyposr  
qubit_spanr  r  r   r^  r   r  s                       r   r/  !MatplotlibDrawer._multiqubit_gate  sV   WW:%%B b(##JJrT?--. G$$  '9E##$$$$$$(R((+d++E+d++Et#D)/''$.4YX.
z!&00sSy $s"23!!!!nn 1 
 	3  r 2r!1r 23FCHHMMtcCi'CT*o(("  
 4 #4$84aQqT4$89QDL39,H![[.#/,, &  
 : ?$$sZ//I)) 3</	4K3<'O..![[/#/,, &  
 HHMMt))T*o(("  
 %5 !3 %9s   ,M4,M9c                    X!   R                   n[        S U 5       5      n[        S U 5       5      n[        S U 5       5      nX!   R                  S   [	        UR
                  [        5      (       d  [        OS-   nUn	X!   R                  SS  H  n
U
S:  d  M  X[        -   S	-   -  n	M     [        U5      [        U5      -
  n[        U-   nU R                  S
   S   S   U R                  S
   S   S   U R                  S
   S   S   U R                  S   /nSnXY-   nUS:  Ga  XR                  -  nXS   S-   -  nU R                  S:  a  XY-   U-
  OSn[	        UR
                  [        5      (       a  SnO[	        UR
                  [        5      (       a  SnO~[	        UR
                  [        5      (       a  SnO\[	        UR
                  [        5      (       a  SnO:[	        UR
                  [        5      (       a  SnO[!        SUR"                   35      e[	        UR
                  [        5      (       a/  SnSn[%        UR
                  R&                  S   5      S:X  a  S	OSnO1[	        UR
                  [        5      (       a  US-  nSnSnSnOSnSnSnUS   R)                  UU-
  US[        -  -
  U-
  4U	U-   USSXU   R*                  S-     U R,                  [.        S 9nU R0                  R3                  U5        U R0                  R5                  UU-
  U-
  US!-   U-
  US"S#U R                  S$   X!   R6                  S%[.        S&9	  U R0                  R5                  UU-
  U-   US!-   U-
  S'-
  X!   R8                  S"S#U R                  S(   X!   R6                  S%[.        S&9	  [	        UR
                  [        5      (       a  [;        X!   R<                  5      nS)U;   a  S*US+S -   S,-   nOR[;        X!   R<                  5      SS R?                  S-5      SS. n[%        U5      S:  a  S/US'   S-RA                  U5       n[%        URB                  5      S:X  a  S!OSnU R0                  R5                  UU-
  S-
  UU-
  U-
  US"S#U R                  S(   X!   R6                  S%[.        S&9	  [	        UR
                  [        5      (       a  S0OS1nUn[E        X!   R                  SS 5       GH  u  nn
U
S:  Ga  U R0                  RG                  UU-   S	-   U-
  UU-   S	-   U-
  /US[        -  -
  S-
  U-
  Xl-   S2-
  U-
  /XU   R*                  S-     S3S4[.        S59  U R0                  R5                  UU-   S'-   U-
  US!-   U-
  US"S#U R                  S$   X!   R6                  S%[.        S&9	  [	        UR
                  [        5      (       Ga
  X!   RH                  U   n[%        [;        U5      5      S:X  a  [;        U5      S   nOhS6[;        U5      ;   a  S6nOV[;        U5      SS RK                  S7S5      R?                  S-5      SS. n[%        U5      S:  a  S/US'   S8RA                  U5       n[%        URB                  5      S:X  a  S!OSnU R0                  R5                  UU-   S'-   U-
  UU-
  U-
  US"S#U R                  S(   X!   R6                  S%[.        S&9	  UU
S-   -  nGM     US-  nUS:  a  GM  gg)9z"Draw the box for a flow op circuitc              3   *   #    U  H	  oS    v   M     g7fr  rC  r  s     r   rW  1MatplotlibDrawer._flow_op_gate.<locals>.<genexpr>E  r  r  c              3   *   #    U  H	  oS    v   M     g7fr  rC  r  s     r   rW  r  F  r  r  c              3   *   #    U  H	  oS    v   M     g7fr  rC  r  s     r   rW  r  G  r  r  r   gRQȿr$   Nr
  r  r6  r   r   r   r  r  z  Ifz Whilez ForSwitchrK  zunhandled control-flow op: rv  r=   rX   r[  g{Gz?r   r  zround, pad=0.1noner1   )r  r$  r  boxstyler  r  r  r  r  r  r  r   Tr  r  r   r  zr(r2   rV   r\      rl  ElseCaseg)\(?r@   solidr   r  r  r  defaultrB   z, )&r  r_  r  r$  rQ  rp  r   ro  r  r`  r   r   r   r   r   r   RuntimeErrorra  rx  r  FancyBboxPatchr}  r   PORDER_FLOWr   r  r&  r  r  r  r  splitjoinry  rn  r
  r  r|  )r   r  r4  r.  r  rl  rm  r  if_widthr  ewidthr  r  colors
fold_levelend_xx_shifty_shift	flow_text	op_spacerexpr_spacerempty_default_spacerr  idx_sety_spacerelse_case_textewidth_incrr  jump_val	jump_texts                                 r   r,  MatplotlibDrawer._flow_op_gateB  s   _!!$$$$$$(R(( ?((+*TWWe:T:TsZ_`	o++AB/F|c\C//	 0 YX.
z!
 KK	"3'*KK	"3'*KK	"3'*KK	
 
 ck ::-G i$81$<=G26**q.D$w.cE$''8,,"	DGG[11$	DGGY//"	DGG\22$	DGGU++	"%@#LMM $''<00 	!.1$''..2D.E.JsPS$DGGU++ 	!'*$ 	"'*$ M*997ND39$4w$>?"66)D/44q89--" : 	C HHs# HHMMw*3(T*o(("  
 HHMMw,3(3.))U+o(("  
 $''9--io667 g%"WQr]2S8G ")/":":;AbAGGLRaPG7|a'%*
!$'!2 3G"%djj/Q"63C7NT)x''1![[/#/,, &  
 (2$''8'D'DV&N"K$-io.C.CAB.G$H &C<HHMM+c1G;TK=ORU=UX_=_`c	)D07:DMD<PSZ<Z[$t_%?%?!%CD"%")* "  HHMM{*S07: 30&!#!%T!2'o00 $* " 
 "$''<88#,?#>#>x#Hs8}-2(+Ha(8I&#h-7(1I ),Ha(;(C(CC(L(R(RSV(WXZYZ([I"9~1/4	!+/99Y+?*@I*-djj/Q*>3C ;.4w>$x/'9%%'%)[[%7"+/"4"4$(#. & 
 vz)] %I` !OJk ckkr   c                    UR                   nX!   R                  n[        USS5      n[        US S9n[	        US S9n	U(       a  UR
                  OUR
                  n
[        U5      U
-
  nU(       a  UR                  OUR                  nU R                  UU
UUX!   R                  X!   R                  X!   R                  UR                  S9  U R                  XX!   R                  S9  [        U[         5      (       d%  [        U["        [$        [&        [         45      (       a  U R)                  XXs5        gUS:X  ad  [        U[*        5      (       aO  U R,                  S	   S
   n[        U[.        5      (       a  UOUS   nU R1                  Xj   X2U   R                  US9  gUS:X  a  U R3                  XX6U
S S   5        g[        U[4        5      (       a!  U R7                  XjS X!   R                  5        gU R9                  XX6U
S 5        g)zDraw a controlled gaterJ  Nc                     U S   $ rM  rC  rN  s    r   rO  0MatplotlibDrawer._control_gate.<locals>.<lambda>      Ar   rQ  c                     U S   $ rM  rC  rN  s    r   rO  r    r  r   )r  r  r&  ry  r  r$   r6  r~  r   )r  ac)rp  r  rr  r_  r  rH  rx  
ctrl_state_set_ctrl_bitsr  r  rv  ry  r  r  rQ  r   r   r   r   r  r   r   r  _x_tgt_qubitr-  r   r  r/  )r   r  r4  r.  r1  rp  r  r  rj  qubit_trH  	num_qargsr  	tgt_colortgts                  r   r.  MatplotlibDrawer._control_gate  s   WW_!!BT2	b./b./9D+55"J\J\Go-	/:[++
!!!!**** 	 		
 	

7	(:(:
;b'""jVYPUW^<_&`&`  )G!^
9e < <I.x8I))S99)y|Cb194ASASX[\!^JJt	o6F3G3JK	8,,JJr*+Y_-?-?@ !!$9AQ>RSr   c	                    U(       aa  U V	s/ s H'  oR                   R                  U	5      R                  PM)     n
n	U
SU nXS n[        U5      n[	        U5      n[	        U5      U:  nUS R                  US5      SSS2   n[        U5       Hb  nUU   S:X  a  UOU R                  S   nSnU(       a%  W(       a  W
U   W:X  a  SnOU(       d  W
U   W:X  a  SnU R                  UU   UUXVUUS	9  Md     gs  sn	f )
zGDetermine which qubits are controls and whether they are open or closedNr   rd   r=   re   r   TF)r  r  r  r&  text_top)	r   find_bitr  r  r_  rjustr  r   _ctrl_qubit)r   r  rH  qbitr.  r  r  r&  ry  r  qlistctbitsr   	max_ctbit	min_ctbitrT  cstater   fc_open_closer  s                       r   r  MatplotlibDrawer._set_ctrl_bits   s
   
 FKLeU]]++E288eEL+O,F+,FFIFIf+	)C q>((#>ttD'A"()s"2BD8IMH58y0#HqY!6$HQ}X`   ( Ms   .C5c                    Uu  pUS   R                  X4[        S-  UUU R                  [        S9n
U R                  R                  U
5        SnUb>  UR                  S5      nUR                  S5      (       d  [        U5       H  nUS-  nM
     Uc  gU(       a  X[        -  -   OU	S[        -  -
  nU R                  R                  UUUS	S
U R                  S   US[        S9	  g)zFDraw a control circle and if top or bottom control, draw control labelr   rX   rJ  rp  N
z(cal)
r  r  rT  r   Tr  )r]  ro  r   r^  r   r  r  endswithr  r`  r&  r   r  )r   r  r.  r  r  r  r&  r  rl  rm  r  label_padding
text_linesr   	ctrl_yposs                  r   r  MatplotlibDrawer._ctrl_qubit;  s    
&--|:nn . 
 	3 D)J==++z*A!S(M +  3;D3..sSy@P	[[' 	 
	
r   c           	         U R                   nUu  pgUS   R                  Xg4[        S-  UUU[        S9nU R                  R                  U5        U R                  R                  Xf/US[        -  -
  US[        -  -   /UU[        S9  U R                  R                  US[        -  -
  US[        -  -   /Xw/UU[        S9  g)zDraw the cnot target symbolr   ru  rJ  r  r  N)r   r]  r`  r^  r   r  r
  PORDER_GATE_PLUS)	r   r  r.  r  r  r  rl  rm  r  s	            r   r  MatplotlibDrawer._x_tgt_qubita  s    MM	
&--|: . 
 	3 	LC#ItcCi/0# 	 	
 	C#ItcCi/0L# 	 	
r   c           
         UR                   nX!   R                  n[        US S9n[        US S9n[	        USS5      nX!   R
                  n	X!   R                  n
X!   R                  n[        U[        5      (       dK  [        U[        5      (       a6  UR                  nU R                  US   XIXS9  U R                  XxU[        S9  g[        U[        5      (       d   [        U[        [         [        45      (       a  [        U[        5      (       a  S	OUR                  n[        U[         5      (       a  S
OX!   R"                  nU R                  Xl   XIXS9  [        U[        [         45      (       d  U R                  XlS-      XIXS9  U R%                  UUUU
U SX!   R&                   S3S9  U R                  XxUS9  gg)z-Draw symmetric gates for cz, cu1, cp, and rzzc                     U S   $ rM  rC  rN  s    r   rO  2MatplotlibDrawer._symmetric_gate.<locals>.<lambda>  r  r   rQ  c                     U S   $ rM  rC  rN  s    r   rO  r    r  r   rJ  Nr=   )r  r  r  )r  r  r   r   r$   z (rV   )r  r&  r  )rp  r  r_  r  rr  r  r  r  rQ  r   rH  r  r  PORDER_LINE_PLUSr   r   r   ru  	_sidetextrw  )r   r  r4  r  r.  rp  r  rj  r  r  r  r  rH  ru  s                 r   r   MatplotlibDrawer._symmetric_gate  s   WW_!!b./b./BT2	___ "e$$Iu)E)E 00ORVY"DJJwB7GJH G$$
9vyRY>Z([([#-b'#:#:a@R@RO))Y??Y_E^E^IR0)rQi&))<==  a$7!8)r YNN!{"Y_%?%?$@B   JJwBJ/ )\r   c                 ~    U R                  US   US9  U R                  US   US9  U R                  US   US   US9  g)zDraw a Swap gater   r   r$   r  N)_swap_crossr  )r   r  r   s      r   r  MatplotlibDrawer._swap  sJ    Ae,Ae,

2a5"Q%E
*r   c                 h   Uu  p4U R                   R                  US[        -  -
  US[        -  -   /US[        -  -
  US[        -  -   /UU R                  [        S9  U R                   R                  US[        -  -
  US[        -  -   /US[        -  -   US[        -  -
  /UU R                  [        S9  g)zDraw the Swap cross symbolr  r  N)r   r
  ro  r   r  )r   r  r   rl  rm  s        r   r  MatplotlibDrawer._swap_cross  s    
D3Jtcz 12D3Jtcz 12mm# 	 	
 	D3Jtcz 12D3Jtcz 12mm# 	 	
r   c                     Uu  pgUS-   X!   R                   S-  -   nU R                  R                  UU[        -   USSU R                  S   US[
        S9	  g)	z%Draw the sidetext for symmetric gatesr  r-   r  rT  r   Tr  N)r$  r   r&  r`  r   r  )	r   r  r4  r  r  r&  rl  rm  xps	            r   r  MatplotlibDrawer._sidetext  sc    
 D[9?001443J[[' 	 
	
r   c           	         Uu  pgUu  pUc  U R                   S   OUn
Uc  SOUnUS:X  a  [        R                  " [        R                  " X-
  5      [        R                  " X-
  5      5      nS[        -  [        R
                  " U5      -  nS[        -  [        R                  " U5      -  nU R                  R                  Xm-   X-   /X~-   X-   /U
U R                  SUS9  U R                  R                  Xm-
  X-
  /X~-
  X-
  /U
U R                  SUS9  gU R                  R                  Xh/Xy/U
U R                  UUS9  g)zDraw a line from xy0 to xy1Nr  r  doubletrN  r  )
r   rR  arctan2r  ro  cossinr   r
  r   )r   xy0xy1r  r  r  x0y0x1y1	linecolorr  thetadxdys                  r   r  MatplotlibDrawer._line  s4   )+DKK%	!zGr		!JJrvvbgrw@EbffUm+BbffUm+BHHMM"'""'"--!   HHMM"'""'"--!   HHMM--#  r   c                     U R                   S:  a  U R                   O[        nX-  S-   nU(       d  XsS-
  -   U:  a
  XUS-
  -
  -  nX-  US   -   S-   nU(       d	  USU-  -  nOUS-  nX!U-  US   S-   -  -
  n	XS'   X4$ )	z$Get the coord positions for an indexr   r$   r  rv  r  r[   r  r  )r   INFINITE_FOLD)
r   r  y_indexr  r.  r  r   h_posx_posy_poss
             r   r  MatplotlibDrawer._plot_coord  s     "ZZ!^tzz" 5N3d:uqy))G:!66=S:%%ETMEd?y/Ca/GHH %,.!|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   )NNFT   NFNF   N)NFrP  )FN)F)NNrK  N)NNNrK  N)NN)NrK  )$__name__
__module____qualname____firstlineno____doc__recompiler  r   rE  r  r  r  rz  r'  r   r(  r'  r)  r*  r+  r-  r/  r,  r.  r  r  r  r  r  r  r  PORDER_LINEr  r  __static_attributes__rC  r   r   r9   r9   Z   s     =jj!:;O !]
~UnL\J@j k Z,\CJ#^ b`H2 hkTZN`*X+Z\|un%TP ^b6$
L
<!0F+
&
$ "&${ #Jr   r9   c                       \ rS rSrSrS rSrg)rq  i  z1Class containing drawing data on a per node basisc                 *   SU l         SU l        / U l        / U l        SU l        SU l        SU l        SU l        S=U l        =U l	        =U l
        =U l        =U l        U l        SU l        SU l        SU l        SU l        SU l        / U l        SU l        g )Nr
  r   rK  FrC  )r$  r  r  r  ru  rt  rv  rw  r  r  r  r>  r7  r  r}  r  r  r  r  r  r  )r   s    r   r   NodeData.__init__  s    
		  EFEE$'EDGEdgE$'  r   )r  r  rv  r  r  r  r  ru  r7  r  r  r  r  r}  rw  r  rt  r>  r  r$  r  N)r  r  r  r  r  r   r#  rC  r   r   rq  rq    s
    ;r   rq  )Rr  rV  rZ  r   ior   numpyrR  qiskit.circuitr   r   r   r   r   r	   r
   r   r   r   r   r   r   qiskit.circuit.controlflowr   qiskit.circuit.classicalr   "qiskit.circuit.annotated_operationr   r   qiskit.circuit.libraryr   %qiskit.circuit.library.standard_gatesr   r   r   r   r   r   qiskit.qasm3r   qiskit.qasm3.exporterr   qiskit.qasm3.printerr   qiskit.circuit.tools.pi_checkr   qiskit.utilsr    
_optionalsqiskit.visualization.styler!   $qiskit.visualization.circuit.qcstyler"   r#   _utilsr%   r&   r'   r(   r)   r*   r+   r,   utilsr.   ro  r`  r  r  r  r"  r  r  r^  r  r  r  HAS_MATPLOTLIBrequire_in_instanceHAS_PYLATEXr9   rq  rC  r   r   <module>r<     s    )   	      ; ) W -   . - 2 0 1 N	 	 	 / 
    ..++i i , /iX= r   