
    {	iǥ                     
   S r SSKrSSKrSSKJr  SSKJr  SSKJr  SSKJ	r	  SSK
r
SSKrSSKJrJrJrJr  SSKJrJrJrJrJrJrJr  SS	KJrJr  SS
KJr  SSKJ r   SSKJ!r!  SSK"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/  SSK0J1r1  SSK2J3r3J4r4J5r5J6r6J7r7J8r8J9r9J:r:J;r;J<r<J=r=J>r>  SSK?J@r@JArA  SSKBJCrCJDrDJErE   " S S5      rFSaS jrG0 S\H\R                  4_S\J_S\J_S\J_S\H\R                  4_S\H\R                  4_S \K\R                  4_S!\	_S"\M\R                  4_S#\H\R                  4_S$\H\R                  4_S%\H\R                  4_S&\H\R                  4_S'\H\R                  4_S(\K\R                  4_S)\K\R                  4_S*\H\R                  4_0 S+\H\R                  4_S,\K\R                  4_S-\K\R                  4_S.\1_S/\H\R                  4_S0\H\R                  4_S1\H\R                  4_S2\K\R                  4_S3\H\R                  4_S4\K\R                  4_S5\H\R                  4_S6\K\R                  4_S7\K\R                  4_S8\H\R                  4_S9\H\R                  4_S:\H\R                  4_S;\H\R                  4_E0 S<\J_S=\H\R                  4_S>\M\R                  4_S?\H\R                  4_S@\H\R                  4_SA\H\R                  4_SB\H\R                  4_SC\M\R                  4_SD\H\R                  4_SE\J_SF\K\R                  4_SG\J_SH\M\R                  4_SI\H\R                  4_SJ\H\R                  4_SK\K\R                  4_SL\H\R                  4_E\K\R                  4\O\H\R                  4\O\K\R                  4SM.ErPSN rQSO\\   SP\ SQ\>4SR jrRSaSS\4ST jjrSSU rTSV rUSW rVSX rWSY rX\R                  R                  \6R                  \R                  R                  \6R                  \R                  R                  \6R                  \R                  R                  \6R                  \R                  R                  \6R                  \R                  R                  \6R                  \R                  R                  \6R                  \R                  R                  \6R                  \R                  R                  \6R                  \R                  R                  \6R                  \R                  R                  \6R                  0rpSZ rq " S[ S\\5      rrS] rsS^ rtSaSO\\   S_\OSQ\\=   4S` jjrug)bz8
Compier to convert Qiskit control-flow to Aer backend.
    N)copy)List)warn)Executor)QuantumCircuitClbitClassicalRegisterParameterExpression)ExprUnaryBinaryVarValueExprVisitor	iter_vars)BoolUint)
Initialize)Options)Store)WhileLoopOp	ForLoopOpIfElseOpBreakLoopOpContinueLoopOpSwitchCaseOpCASE_DEFAULT)PassManager)	DecomposeAerError)
NoiseModel)AerUnaryExpr
AerUnaryOpAerBinaryExprAerBinaryOpAerUintValueAerBoolValueAerUintAerBoolAerCastAerVar
AerCircuit	AerConfig   )circuit_optypesCircuitHeader   )AerMarkAerJumpAerStorec                   p    \ rS rSrSrS rSS jrS r\SS j5       r	SS jr
S	 rS
 rS rS rS rS rSrg)AerCompilerB   zRAer Compiler to convert instructions of control-flow to mark and jump instructionsc                     SU l         g )N_last_flow_id)selfs    Z/home/james-whalen/.local/lib/python3.13/site-packages/qiskit_aer/backends/aer_compiler.py__init__AerCompiler.__init__E   s
        Nc                    [        U[        5      (       a  U/nUc  [        U5      S/-  nO[        U5      n[        U[        5      (       a  / n[	        U5       H  u  pVU R                  XcU   5      nU R                  XcU   5      (       aY  [        [        SS/5      /5      nUR                  U R                  USS5      5      nUR                  U5        [        U5      X5'   M  UR                  U5        M     Uc  U$ XC4$ Uc  U$ X4$ )a  compile a circuit that have control-flow instructions.

Args:
    circuits (QuantumCircuit or list): The QuantumCircuits to be compiled
    optypes (list): list of instruction type sets for each circuit
                    (default: None).

Returns:
    list: A list QuantumCircuit without control-flow
          if optypes is None.
    tuple: A tuple of a list of quantum circuits and list of
           compiled circuit optypes for each circuit if
           optypes kwarg is not None.
Nmarkjump)
isinstancer   lenlist	enumerate_inline_initialize_is_dynamicr   r   run_inline_circuitappendr0   )	r=   circuitsoptypescompiled_optypescompiled_circuitsidxcircuitpmcompiled_circs	            r>   compileAerCompiler.compileH   s    h// zH?"8}v5  $G}h%% " )( 311'C;PQ##Gc-BCC$i0@&A%BCB$&FF4+?+?t+T$UM &,,];,;M,J$)%,,W5 !4 (($66?O  rA   c                    [        U[        5      (       a  [        U;  a  U$ UR                   Hc  nUR                  n[        U[        5      (       d  M&  [        UR
                  S   [        5      (       a  [        UR
                  5      S:X  d  Mc    O   U$ UR                  5       n/ Ul        UR                   H  nUR                  UR                  UR                  pvn[        U[        5      (       af  [        UR
                  S   [        5      (       a  [        UR
                  5      S:X  a+  UR                  UR                  R                  5       XgSS9  M  UR                  XFU5        M     U$ )z=inline initialize.definition gates if statevector is not usedr   r/   T)inplace)rE   setr   data	operationparamscomplexrF   r   qubitsclbitscompose
definition	decompose_append)r=   circoptypedatuminstnew_circqargscargss           r>   rI   AerCompiler._inline_initializev   s   fc""z'?KYYE??D$
++A88c$++>NRS>S  K99;YYE!&%,,D$
++A88c$++>NRS>S   !:!:!<eTX Y  e4  rA   c                 .   [        U [        5      (       d  g[        [        [        [
        [        [        4n[        U[        5      (       a  [        UR                  U5      5      $ U R                   H   n[        UR                  U5      (       d  M     g   g)z:check whether a circuit contains control-flow instructionsFT)rE   r   r   r   r   r   r   r   rZ   boolintersectionr[   r\   )rS   rf   controlflow_typesinstructions       r>   rJ   AerCompiler._is_dynamic   s     '>22 
 fc""++,=>?? #<<K+//1BCC ( rA   c                    UR                  5       n[        R                  " UR                  UR                  5       Vs0 s H  ofU_M     nnUR
                   GH  n[        UR                  [        5      (       a4  UR                  5         U R                  XuU5        UR                  5         MW  [        UR                  [        5      (       a4  UR                  5         U R                  XuU5        UR                  5         M  [        UR                  [        5      (       a5  UR                  5         U R                  XrX5U5        UR                  5         M  [        UR                  [        5      (       a6  UR                  5         U R!                  XrX5U5        UR                  5         GMS  [        UR                  ["        5      (       aH  UR%                  ['        X5R(                  UR*                  5      UR                  UR                  5        GM  [        UR                  [,        5      (       aH  UR%                  ['        X%R(                  UR*                  5      UR                  UR                  5        GM!  [        UR                  [.        5      (       aS  UR%                  [1        UR(                  UR*                  UR                  5      UR                  UR                  5        GM  UR%                  U5        GM     U$ s  snf )a  convert control-flow instructions to mark and jump instructions

Args:
    circ (QuantumCircuit): The QuantumCircuit to be compiled
    continue_label (str): label name for continue.
    break_label (str): label name for break.
    bit_map (dict[Bit, Bit]): mapping of virtual bits in the current circuit to the bit they
        represent in the outermost circuit.

Returns:
    QuantumCircuit: QuantumCircuit without control-flow instructions
)copy_empty_like	itertoolschainr_   r`   r[   rE   r\   r   barrier_inline_for_loop_opr   _inline_while_loop_opr   _inline_if_else_opr   _inline_switch_case_opr   rd   r4   
num_qubits
num_clbitsr   r   r5   )r=   re   continue_labelbreak_labelbit_mapretbitrq   s           r>   rL   AerCompiler._inline_circuit   s    ""$'0szz3::'NO'N8'NO99K +//;;((7CK11;??**;WEK118<<''[W^_K11<@@++K[bcK11;??KH#**VYV`V` K11>BBNNNCNNKSZZY\YcYc K11599S^^S^^[=R=RSJJJJ K(G %H 
M Ps   Lc                    [        U[        5      (       a  U$ [        US   [        5      (       a  X!S      US   4$ [        US   [        5      (       a  U$ [        US   [        5      (       a  [        US   R
                  [        5      (       a)  [	        X!S   R
                     US   R                  5      nOv[        US   R
                  [        5      (       aB  [        US   R
                   Vs/ s H  oBU   PM	     snS9n[	        XQS   R                  5      nO[        SUS    S35      eX1S   4$ [        SUS   R                   S35      es  snf )z4Convert a condition tuple according to the wire map.r   r/   )bitsz2jump condition does not support this tyep of Var: .z jump condition does not support )	rE   r   r   r	   r   vartyper!   	__class__)r=   
cond_tupler   exprclbitregs         r>   _convert_jump_conditional%AerCompiler._convert_jump_conditional   sH   j$''
1u--qM*JqM::
1'899
1s++*Q-++U337a=#4#45z!}7I7IJJqM--/@AA'*UV-J[J[-\J[enJ[-\]31 2 23HTUWXY  Q-((9*Q-:Q:Q9RRSTUU .]s   1Ec                 J  ^ [        5       n[        U5       H  n[        UR                  [        5      (       a   UR                  TUR                     5        MB  [        UR                  [        5      (       d  Mc  UR                  U4S jUR                   5       5        M     U$ )Nc              3   .   >#    U  H
  nTU   v   M     g 7fN ).0r   r   s     r>   	<genexpr>4AerCompiler._list_clbit_from_expr.<locals>.<genexpr>   s     ;7C73<7s   )rZ   r   rE   r   r   addr	   update)r=   r   r   r   r   s    `   r>   _list_clbit_from_expr!AerCompiler._list_clbit_from_expr   sm    eT?C#''5))()CGG%677

;377;;	 #
 
rA   c                 J   UR                    Vs/ s H  oCU   PM	     nnUR                   Vs/ s H  ocU   PM	     nn[        U5      S:X  a  UR                   nUR                  R                  u  pn
[
        R                  " [        U
R                   UR                   5      [        U
R                  UR                  5      5       VVs0 s H
  u  pXU   _M     nnnU =R                  S-  sl        U R                  nSU 3nSnU S3nU H  nU SU 3nU R                  U
UUU5      nU	b  UR                  U	U05      nU H`  nUR                  UR                  UR                    Vs/ s H  nUU   PM
     snUR                   Vs/ s H  nUU   PM
     snS9UU5        Mb     UR                  [        U[        U5      [        U5      5      XW5        M     Ub0  UR                  [        U[        U5      [        U5      5      XW5        ggs  snf s  snf s  snnf s  snf s  snf )z1inline for_loop body while iterating its indexsetr   r/   loop_N_end_r_   r`   )r_   r`   rF   r\   r]   ru   rv   zipr<   rL   assign_parametersrM   replacer3   )r=   rq   parentr   qrj   crk   indexsetloop_parameterbodyinnerouterinner_bit_maploop_id	loop_nameinlined_bodyr   indexr~   rh   r   s                         r>   rx   AerCompiler._inline_for_loop_op  s   %0%7%78%7%78%0%7%78%7%78u:?MME)4)>)>)E)E&$ !*DKK!3!34DKK!3!34!
! 5>!! 	 
 	a$$G9%	"4(E ){!E73N//nkS`aL)+==~u>UV$LL>BkkJksc 2kJ>BkkJksc 2kJ !   % MM'.#e*c%jI5X   #MM'+s5z3u:FU $I 98

,  KJs   HHH'HH c                 @   U R                  UR                  R                  U5      nUR                  R                  u  nU =R                  S-  sl        U R                  nSU 3nU S3nU S3n	U S3n
[
        R                  " [        UR                  UR                  5      [        UR                  UR                  5      5       VVs0 s H
  u  pXU   _M     nnnU R                  UUU
U5      nUR                   Vs/ s H  oU   PM	     nnUR                   Vs/ s H  nUU   PM
     nn[        U5      S:X  a  UR                  n[        U[        5      (       a  U R                  X45      nO9[        US   [        5      (       a	  X4S      1nOUS    Vs1 s H  nUU   iM
     nn[!        U5      R#                  U5      [!        UR                  5      -
  nU R                  XC5      nUR%                  ['        U[        U5      [        U5      5      UU5        UR%                  [)        U	[        U5      [        U5      5      R+                  U5      UU5        UR%                  [)        U
[        U5      [        U5      5      UU5        UR%                  ['        U	[        U5      [        U5      5      UU5        U H`  nUR%                  UR-                  UR                   Vs/ s H  nUU   PM
     snUR                   Vs/ s H  nUU   PM
     snS9UU5        Mb     UR%                  [)        U[        U5      [        U5      5      UU5        UR%                  ['        U
[        U5      [        U5      5      UU5        gs  snnf s  snf s  snf s  snf s  snf s  snf )	z6inline while_loop body with jump and mark instructionsr/   while_	_continue_startr   r   r   N)r   r\   	conditionr]   r<   ru   rv   r   r_   r`   rL   rF   rE   r   r   r   rZ   unionrM   r3   r4   set_conditionalr   )r=   rq   r   r   condition_tupler   r   r   r~   loop_start_labelr   r   r   inline_bit_mapr   r   rj   r   rk   
mark_cargs	c_if_argsrh   r   s                          r>   ry   !AerCompiler._inline_while_loop_op+  sI   889N9N9X9XZab''..a$$WI&	%;i0'[/"4( !*DKK!3!34DKK!3!34!
! 5>!! 	 
 ++	
 &1%7%78%7%78%0%7%78%7%78u:?MMEot,,33GMJ*E22!!"456J.=a.@A.@'!*.@JAZ%%j1C8J8J4KK
22?L	gnc%j#j/JES]^$c%j#j/BRRS\]	

 	gk3u:s:GPZ[g.E
C
OLeU_` DMM;?;;G;CN3/;G;?;;G;CN3/;G    ! 	gnc%j#j/JES]^gk3u:s:GPZ[_
 98 B  HGs$   
N NNN#NNc                 	   UR                   R                  nUR                   R                  u  pxU =R                  S-  sl        U R                  n	SU	 3n
U
 S3nU
 S3nU(       a  U
 S3nOUnU R	                  Xe5      nUR
                   Vs/ s H  oU   PM	     nnUR                   Vs/ s H  nUU   PM
     nn[        U5      S:X  a  UR
                  n[        U5      S:X  a  UR
                  n[        U[        5      (       a  U R                  XV5      nO9[        US   [        5      (       a	  XVS      1nOUS    Vs1 s H  nUU   iM
     nn[        U5      R                  U5      [        UR                  5      -
  n[        R                  " [!        UR
                  UR
                  5      [!        UR                  UR                  5      5       VVs0 s H  u  nnUUU   _M     nnnUR#                  [%        U[        U5      [        U5      5      R'                  U5      UU5        UR#                  [%        U[        U5      [        U5      5      UU5        UR#                  [)        U[        U5      [        U5      5      UU5        U R+                  XrUU5      nUR,                   H`  nUR#                  UR/                  UR
                   Vs/ s H  nUU   PM
     snUR                   Vs/ s H  nUU   PM
     snS9UU5        Mb     U(       GaO  [        R                  " [!        UR
                  UR
                  5      [!        UR                  UR                  5      5       VVs0 s H  u  nnUUU   _M     nnnUR#                  [%        U[        U5      [        U5      5      UU5        UR#                  [)        U[        U5      [        U5      5      UU5        U R+                  XUU5      nUR,                   H`  nUR#                  UR/                  UR
                   Vs/ s H  nUU   PM
     snUR                   Vs/ s H  nUU   PM
     snS9UU5        Mb     UR#                  [)        U[        U5      [        U5      5      UU5        gs  snf s  snf s  snf s  snnf s  snf s  snf s  snnf s  snf s  snf )	zGinline true and false bodies of if_else with jump and mark instructionsr/   if__truer   _elser   r   N)r\   r   r]   r<   r   r_   r`   rF   rE   r   r   r   rZ   r   ru   rv   r   rM   r4   r   r3   rL   r[   r   )r=   rq   r~   r   r   r   r   	true_body
false_bodyif_idif_nameif_true_labelif_end_labelif_else_labelr   r   rj   r   rk   r   r   r   true_bit_mapchildrh   r   false_bit_maps                              r>   rz   AerCompiler._inline_if_else_oph  sS   %//99 + 5 5 < <	a""w-")5)!$'&iu-M(M22?L	%0%7%78%7%78%0%7%78%7%78u:?MME u:?MMEot,,33GMJ*E22!!"456J.=a.@A.@'!*.@JAZ%%j1C8J8J4KK
 !*I$$k&8&89I$$k&8&89!
!u 75>!! 	 
 	M3u:s:?OOPYZ	

 	gmSZZI5R\]gmSZZI5R\]$$Y\ZJJDMM9=E#L-E9=E#L-E      %.OO
));+=+=>
));+=+=>%%LE5 wu~%%   MM',E
C
OLeU_`MM'-US_MuV`a(([R_`E

LL>BkkJksc 2kJ>BkkJksc 2kJ !   # 	glCJJH%Q[\C 98 B
& FE  KJs6   R+RR"R'R-2R2.R7*R=	Sc                 x
   UR                   R                  5       nU =R                  S-  sl        U R                  nSU 3nUR                   V	s/ s H  oU	   PM	     n
n	UR                   Vs/ s H  oU   PM	     nn[        U
5      S:X  a  UR                  n
[        UR                   R                  [        5      (       a  XQR                   R                     1nOw[        UR                   R                  [        5      (       a&  U R                  XQR                   R                  5      nO(UR                   R                   Vs1 s H  oU   iM	     nn[        U5      R                  U5      [        UR                  5      -
  nU S3nSn[        R                  " S/ SQ5      n/ n[        U5       GH	  u  nnUb  [!        S5      eU" U S	U 3US    Vs/ s H7  nU["        :w  a(  U R%                  UR                   R                  U4U5      O/ PM9     sn[&        R(                  " [+        US   R                  UR                  5      [+        US   R                  UR                  5      5       VVs0 s H  u  nnUUU   _M     snnUS   S9nUR-                  U5        ["        US   ;   d  M  UR.                  nGM     Uc  UnU H  nUR0                   H  n[        U5      S:  d  M  [        US   [        5      (       aK  [3        [2        R4                  R6                  US   [9        US   US   R:                  5      [=        5       5      nUR-                  [?        UR.                  [        U
5      [        U5      5      RA                  U5      U
U5        M     M     UR-                  [?        U[        U
5      [        U5      5      X5        U GH  nUR-                  [C        UR.                  [        U
5      [        U5      5      X5        U RE                  URF                  X#URH                  5      nURJ                   Ht  nUR-                  URM                  UR                   Vs/ s H  nURH                  U   PM     snUR                   Vs/ s H  nURH                  U   PM     snS
9U
U5        Mv     UR-                  [?        U[        U
5      [        U5      5      X5        GM     UR-                  [C        U[        U
5      [        U5      5      X5        gs  sn	f s  snf s  snf s  snf s  snnf s  snf s  snf )z3inline switch cases with jump and mark instructionsr/   switch_r   r   NCaseData)label	args_listr   r   z'cases after the default are unreachabler   r   )'r\   cases_specifierr<   r_   r`   rF   rE   targetr   r   r   rZ   r   collections
namedtuplerH   r!   r   r   ru   rv   r   rM   r   r   r   OpEQUALr   r   r   r4   r   r3   rL   r   r   r[   r   )r=   rq   r~   r   r   r   cases	switch_idswitch_namer   rj   r   rk   target_clbitsr   switch_end_labelcase_default_labelr   case_data_listicase
switch_valr   r   	case_data	case_argsr   rh   r   s                                r>   r{   "AerCompiler._inline_switch_case_op  s   %%557a&&		{+%0%7%78%7%78%0%7%78%7%78u:?MMEk++22E::$%:%:%A%ABCM--44d;; 66w@U@U@\@\]M1<1F1F1M1MN1MAQZ1MMNZ%%m4s;;M;M7NN
)]$/!))*6_` 'GAt!-HII $Qqc* '+1g	 '.
 &5 66(2299:F  	  '.	 )2DGNNK,>,>?DGNNK,>,>?))u 75>)) !W'I* !!),tAw&%.__"7 (: %!1'I&00	y>A%!)A,55$*"IIOO%aL!)A,	!0A0AB F	%	 MM	US_M]]% " 1 ($ 	g0#e*c*oNPUb'IMM')//3u:s:OQVc((Y=N=NE 

LLBF++N+3	 1 1# 6+NBF++N+3	 1 1# 6+N !   # MM'"2CJJPRWd (  	g.E
C
OLe`m 98 O	X  ONs*   T-TT">T'/T,#T2T7r;   r   )__name__
__module____qualname____firstlineno____doc__r?   rV   rI   staticmethodrJ   rL   r   r   rx   ry   rz   r{   __static_attributes__r   rA   r>   r7   r7   B   sW    \ ,!\8  24lV.'VR;\zS]j^arA   r7   c                 4    [        5       R                  X5      $ )z7
compile a circuit that have control-flow instructions
)r7   rV   )rN   rO   s     r>   compile_circuitr     s     =  33rA   shotsmethoddevice	precisionmax_job_sizemax_shot_sizeenable_truncationexecutorzero_thresholdvalidation_thresholdmax_parallel_threadsmax_parallel_experimentsmax_parallel_shotsmax_memory_mbfusion_enablefusion_verbosefusion_max_qubitfusion_thresholdaccept_distributed_resultsmemorynoise_modelseed_simulatorcuStateVec_enableblocking_qubitsblocking_enablechunk_swap_buffer_qubitsbatched_shots_gpubatched_shots_gpu_max_qubitsshot_branching_enableshot_branching_sampling_enablenum_threads_per_devicestatevector_parallel_thresholdstatevector_sample_measure_opt%stabilizer_max_snapshot_probabilities#extended_stabilizer_sampling_method*extended_stabilizer_metropolis_mixing_time'extended_stabilizer_approximation_error+extended_stabilizer_norm_estimation_samples/extended_stabilizer_norm_estimation_repetitions&extended_stabilizer_parallel_threshold2extended_stabilizer_probabilities_snapshot_samples)matrix_product_state_truncation_threshold'matrix_product_state_max_bond_dimensionmps_sample_measure_algorithmmps_log_datamps_swap_directionchop_thresholdmps_parallel_thresholdmps_omp_threads
mps_lapack"tensor_network_num_sampling_qubits)use_cuTensorNet_autotuningparameterizations fusion_parallelization_thresholdtarget_gpusruntime_parameter_bind_enablec           	         Uc  U$ U [         ;  a  [        SU  35      e[        U[         U    5      (       a  U$ [         U    S   nU[        [        [
        [        4;   aC   U" U5      n[        U[         U    5      (       d   [        SU  SUR                   S3[        SS9  U$ [        SU  S	UR                  R                   S
[         U    S   R                   35      e! [         a     NHf = f)zvalidate backend.run argumentszinvalid argument: name=r   zA type of an option "z" should be zt but {v.__class__.__name__} was specified.Implicit cast for an argument has been deprecated as of qiskit-aer 0.12.1.   )
stacklevelzinvalid option type: name=z, type=z, expected=)BACKEND_RUN_ARG_TYPESr!   rE   intfloatrn   strr   r   DeprecationWarning	Exception	TypeErrorr   )kvexpected_typer   s       r>   _validate_optionr3  a  s   y%%0455!*1-..)!,Q/MeT3//	"Ca!6q!9::+A3l=;Q;Q:R Sa a '  J 
$QC ($$%[1Fq1I!1L1U1U0V	X   		s   AC 
C*)C*rN   backend_optionsreturnc                    [        S U  5       5      n[        S U  5       5      n[        5       nXEl        X5l        UR                  R                  5        H3  u  pg[        XV5      (       d  M  Uc  M  [        Xg5      n[        XVU5        M5     UR                  5        H3  u  pg[        XV5      (       d  M  Uc  M  [        Xg5      n[        XVU5        M5     U$ )zgenerates a configuration to run simulation.

Args:
    circuits: circuit(s) to be converted
    backend_options: backend options
    run_options: run options

Returns:
    AerConfig to run Aer
c              3   8   #    U  H  oR                   v   M     g 7fr   )r|   r   rS   s     r>   r   &generate_aer_config.<locals>.<genexpr>  s     @xG''x   c              3   8   #    U  H  oR                   v   M     g 7fr   )r}   r8  s     r>   r   r9    s     Bg))r:  )	maxr.   memory_slotsn_qubits__dict__itemshasattrr3  setattr)rN   r4  run_optionsr|   r=  configkeyvalues           r>   generate_aer_configrG    s     @x@@JBBBL[F& O%..446
6E$5$S0EF' 7 "'')
6E$5$S0EF' * MrA   rS   c                 $   U R                   nU R                  nSn/ n/ n[        U R                  [        5      (       a&  [        U R                  R                  5      S:  a  SnO[        U R                  5      nU R                   H*  nUR                  UR                  UR                  /5        M,     U R                   H*  n	UR                  U	R                  U	R                  /5        M,     [        S U R                   5       5      n
[        UUUUU R                  US9n[!        U R"                  5       VVs0 s H  u  pX_M	     nnn[!        U R$                  5       VVs0 s H  u  pX_M	     nnn['        5       nUR)                  U5        UUl         UUl        UUl        0 n[/        U 5       HE  nX4-   nUUR0                  R2                  4UUR                  '   UUR0                  R2                  -  nMG     Sn/ nU R                   GHt  nSnSn[5        UR6                  S5      (       a  UR6                  R8                  (       a  UR6                  R8                  u  nnSnSn[        U[:        5      (       a  SUU   -  nUS-  UU   -  nOOUR=                  5        H;  u  pUU;   d  M  USU-  -  nUU[?        U5      RA                  U5      -	  S-  U-  -  nM=     X4-   nURC                  S	US
 3S	US
 3SU5        US-  nUS-  nOL[5        UR6                  S5      (       a1  UR6                  RD                  (       a  UR6                  RD                  nU[G        U UUUUU
UUU5	      -  nUR                  US-
  5        GMw     UU4$ s  snnf s  snnf )z.assemble circuit object mapped to AER::Circuitr           c              3      #    U  H:  n[        UR                  S S5      =(       d    [        UR                  SS5      v   M<     g7f)condition_exprNr   )getattrr\   )r   rh   s     r>   r   #assemble_circuit.<locals>.<genexpr>  sA       !D 	 0$7 	64>>;5	6 s   AA)r>  
qreg_sizesr=  
creg_sizesnameglobal_phaser:   Nr   r/   0xXz==rK  )$r|   r}   rE   rQ  r
   rF   
parametersr+  qregsrM   rP  sizecregsanyr[   r1   rH   r_   r`   r-   
set_header
num_memoryglobal_phase_angle_iter_var_recursiver   widthrA  r\   r   r   r@  rG   r   bfuncrK  _assemble_op)rS   basis_gatesr|   rZ  extra_creg_idxrN  rO  rQ  qregcregis_conditionalheaderrR   qubitqubit_indicesr   clbit_indicesaer_circvar_heap_mapr   
memory_posnum_of_aer_ops	index_maprh   conditional_regconditional_exprctrl_regctrl_valmaskvals                                 r>   assemble_circuitrt    si    ##J##JNJJ7'')<==$$//014W112499dii01 499dii01    LL N \\!F 3<GNN2KL2KJCUZ2KML2;GNN2KL2KJCUZ2KML|H$H$H".HL"7+0
",chhnn!=SXX#((..( ,
 NI 4>>;//DNN4L4L!%!9!9HhDC(E**M(33!|h(??"/"5"5"7JE(S(T(^-A-A%-H!HA MRUUU #8 )9ONNRQx=Bs1g,oNaNaNT^^%5664>>;X;X#~~<<,

 
	
 	!+,I L Yo MLs   9N"Nc                     [        U [        5      (       a  [        U R                  5      $ [        U [        5      (       a
  [        5       $ [        SU R                   35      e)Nzunknown type: )rE   r   r)   r]  r   r*   r!   r   )	expr_types    r>   _assemble_typerw    sL    )T""y''	It	$	$y	(;(;'<=>>rA   c              #      #    U R                  5        S h  vN   U R                   HJ  nUR                  R                   H-  n[	        U[
        5      (       d  M  [        U5       S h  vN   M/     ML     g  N_ N7fr   )r   r[   r\   r]   rE   r   r\  )rS   rq   params      r>   r\  r\    s`       """|| **11E%00.u555 2 $ # 6s'   A:A6?A:A:(A8)A:8A:c                    U R                   n[        U 5       HX  nUR                  U:X  a-  [        [	        X"UR
                  R                  -   5      5      s  $ X#R
                  R                  -  nMZ     [        SU 35      e)Nz*Var is not registed in this circuit: uuid=)r}   r\  r   rG   ranger   r]  r!   )rS   var_uuidclbit_indexr   s       r>   _find_var_clbitsr~    sj    $$K"7+77hk+GHIIxx~~% , ?zJ
KKrA   c                 ~   [        U[        [        45      (       a+  U Vs/ s H  o R                  U5      R                  PM     sn$ [        U[
        5      (       a  U R                  U5      R                  /$ [        U[        R                  5      (       a  [        X5      $ [        SUR                   35      es  snf )Nzunknown clibt list: )rE   r	   rG   find_bitr   r   uuidUUIDr~  r!   r   )re   r   cbits      r>   _assemble_clbit_indicesr    s    !'.//678add#))a88	Au		a &&''	Atyy	!	!((-akk];<< 9s   $B:c                     U [         R                  R                  L a  [        R                  $ U [         R                  R
                  L a  [        R                  $ [        SU  35      eNzunknown op: )r   r   BIT_NOTr$   BitNot	LOGIC_NOTLogicNotr!   ops    r>   _assemble_unary_operatorr  #  sP    	UXX   	uxx!!	!"""bT*++rA   c                 D    U [         ;   a	  [         U    $ [        SU  35      er  )_BINARY_OP_MAPPINGr!   r  s    r>   _assemble_binary_operatorr  ;  s(    	!"%%bT*++rA   c                   B    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
rg)_AssembleExprImpliB  z3Convert from Expr objects to corresponding objects.c                     Xl         g r   rS   )r=   rS   s     r>   r?   _AssembleExprImpl.__init__E  s    rA   c                @   [        UR                  [        5      (       a*  [        UR                  R                  UR
                  5      $ [        UR                  [        5      (       a  [        UR
                  5      $ [        SUR                  R                   35      e)zreturn Aer's value types.z!invalid value type is specified: )
rE   r   r   r'   r]  rF  r   r(   r!   r   r=   nodes     r>   visit_value_AssembleExprImpl.visit_valueH  sl     dii&&		<<		4((

++>tyy?R?R>STUUrA   c                |    [        [        UR                  5      [        U R                  UR
                  5      5      $ r   )r,   rw  r   r  rS   r   r  s     r>   	visit_var_AssembleExprImpl.visit_varR  s+    nTYY/1HW[W_W_1`aarA   c                r    [        [        UR                  5      UR                  R	                  U 5      5      $ r   )r+   rw  r   operandacceptr  s     r>   
visit_cast_AssembleExprImpl.visit_castU  s'    ~dii0$,,2E2Ed2KLLrA   c                r    [        [        UR                  5      UR                  R	                  U 5      5      $ r   )r#   r  r  r  r  r  s     r>   visit_unary_AssembleExprImpl.visit_unaryX  s)    4TWW=t||?R?RSW?XYYrA   c                    [        [        UR                  5      UR                  R	                  U 5      UR
                  R	                  U 5      5      $ r   )r%   r  r  leftr  rightr  s     r>   visit_binary_AssembleExprImpl.visit_binary[  s?    %dgg.IIT"JJd#
 	
rA   c                2    [        SUR                   35      e)Nz unsupported expression is used: )r!   r   r  s     r>   visit_generic_AssembleExprImpl.visit_genericb  s    9$..9IJKKrA   r  N)r   r   r   r   r   r?   r  r  r  r  r  r  r   r   rA   r>   r  r  B  s-    =VbMZ
LrA   r  c                 .    US:  a  [        SU  S35      eg )Nr   zinstruction z does not support conditionalr    )	inst_namern  s     r>   _check_no_conditionalr  f  s$    !i[0MNOO rA   c	           
      D   UR                   n	UR                   V
s/ s H  oU
   PM	     nn
UR                   Vs/ s H  oU   PM	     nnU	R                  nU	R                  n[        U	S5      (       a  U	R                  OS nSn[        U5       HQ  u  nn[        U[        5      (       d  M  [        UR                  5      S:  d  M8  U(       d  [        U5      nSnSUU'   MS     U(       a  UR                  [        U 5      5      OS nUR                  S5      nUS:  a  USU nOUnSnUS;   Ga  Ub  UU;   Ga  US:  a  [!        UUS	-   [        U5       5      n[#        [        U5      S-
  5       H<  nUU-	  S-  S:X  d  M  UU   /nUR%                  S
UU/ UUU(       a  UOS
5        US-  nM>     UR%                  UUU/ UUU(       a  UOU5        [#        [        U5      S-
  5       H<  nUU-	  S-  S:X  d  M  UU   /nUR%                  S
UU/ UUU(       a  UOS
5        US-  nM>     U$ UR%                  XU/ UUU(       a  UOU5         U$ US:X  a0  U(       a  UR'                  XU5        U$ UR'                  X/ 5         U$ US:X  a  UR)                  X5        U$ US:X  a  UR+                  UUXo(       a  UOS5        U$ US:X  a#  UR-                  UUS   UUU(       a  UOS5        U$ US:X  a!  UR%                  X/ UUUU(       a  UOU5        U$ US:X  a  [/        X5        UR1                  UU5        U$ US:X  a  [/        X5        UR3                  UU5        U$ US:X  a   UR5                  UUUUU(       a  UOU5        U$ US:X  a  UR7                  UUUU5        U$ US;   a3  [/        X5        UR9                  XU	R:                  U(       a  UOU5        U$ US;   a4  [/        X5        UR=                  XUU	R:                  U(       a  UOU5        U$ US;   a  [/        X5        / n/ n/ nU	R                   H?  u  nnUR?                  U5        UR?                  US   5        UR?                  US   5        MA     URA                  UUUUUU	R:                  U(       a  UOU5        U$ US:X  a  [/        X5        URC                  UU5        U$ US:X  a  [/        X5        URE                  UU5        U$ US:X  a  [/        X5        URG                  UU5        U$ US:X  a  [/        X5        URI                  UU5        U$ US:X  a  [/        X5        URK                  UU5        U$ US:X  a  [/        X5        URM                  UU5        U$ US:X  a  URO                  UUS   UU5        U$ US:X  a  [/        X5        SnU$ US:X  a  URQ                  UUUU5        U$ US :X  a  [/        X5        URS                  UU5        U$ US!:X  a  URU                  X(       a  UOUUU5        U$ US";   a  [W        S#U 35      eUS$:X  a  [        U	RX                  RZ                  [\        5      (       d,  [W        S%U	RX                  RZ                  R^                   35      eURY                  U[a        X	RX                  RZ                  Rb                  5      U	RX                  Rd                  R                  [        U 5      5      5        SnU$ US&:X  a  [        U	RZ                  [\        5      (       d"  [W        S%U	RZ                  R^                   35      eURY                  U[a        X	RZ                  Rb                  5      U	Rd                  R                  [        U 5      5      5        SnU$ [W        S'U 35      es  sn
f s  snf )(Nr]   Fr   TrI  _or/   >:   hprstuxyzcpcucxcyczidrxryrzsxu1u2u3ccxcczcrxcrycrzcsxcu1cu2cu3ecrmcpmcrmcumcxmcymczrxxryyrzxrzzsdgtdgmcrxmcrymcrzmcsxmcu1mcu2mcu3swapsxdgcswapdelaymcswapmcphasemcx_grayr2   r  measureresetdiagonalunitarypauli
initializeroerrormultiplexerkraus>   
save_statesave_superopsave_unitarysave_cliffordsave_stabilizersave_statevectorsave_probabilitiessave_density_matrixsave_statevector_dictsave_probabilities_dictsave_matrix_product_state>   save_amplitudessave_amplitudes_sq)save_expvalsave_expval_varset_statevectorset_unitaryset_density_matrixset_stabilizerset_superopset_matrix_product_statesuperoprw   rD   rC   
qerror_loc)for_loop
while_loopif_elsezKcontrol-flow instructions must be converted to jump and mark instructions: 	aer_storezunsupported lvalue : storezunknown instruction: )3r\   r_   r`   rP  r   rA  r]   rH   rE   r
   rF   rT  r   r  r  findr*  r{  gater  r  r  r  r  r  r  r  r  r  _subtyper  rM   r  r  r  r  set_cliffordr	  r
  r  rD   rC   set_qerror_locr!   r  lvaluer   r   r  r   rvalue)re   ri  rh   rg  rh  rd  rn  ro  r`  r\   rf  r_   r   r`   rP  r   r]   copiedr   ry  aer_cond_exprctrl_state_pos	gate_namerl  
ctrl_statequbits_ipauliscoeff_realscoeff_imagsr  coeffs                                  r>   r_  r_  k  s;    I04<uE"F<04<uE"F<>>DOOE!(H!=!=Y4FFf%5e011c%:J:J6Ka6OfF1I & IY$++,=d,CD^bM YYt_N>*		N  	 9#;AT."23t9=>J3v;q=)!Oq(A- &q	{HMM#x_m+0%c;"a'N * MM)VVR-#(%i93v;q=)!Oq(A- &q	{HMM#x_m+0%c;"a'N *n a MM$O]#(%d4` ] 
	VV4X U VR0T S 
v/P O 
	&&/E5zZL K 
	O]"'Y	8H E 
dB$e$	0B  
	d4FF+z y 
	d4(t s 
	VV_mV[Uaefp o 
vvFl k 
  
 	d4F)*<*<ueRVWN M 
:	:d4  vy7I7ITY5_cdH G 
3	3d4%,,LE5MM% uQx(uQx( - 	E	
t c 
"	"d4  0^ ] 
	d4VV,X W 
%	%d4##FF3R Q 
!	!d4ff-L K 
	d4VV,F E 
+	+d4))&&9@ ? 
	O]K< ; 
	d46 5 
ffo}E2 1 
d4ff%, + 
	D/S`a( ' 
6	6\]a\bc
 	
 
	)//00#6629??3I3I3S3S2TUVVv6t__=S=S=W=WX --445Ft5LM	O  
)**C00293C3C3M3M2NOPPv6t=M=M=Q=QR ''../@/FG	I  .tf566C =<s
   ^^r`  c           	          Ub0  [        U5      n[        U  Vs/ s H  n[        X25      PM     sn6 u  pEO$[        U  Vs/ s H  n[        U5      PM     sn6 u  pE[        U5      [        U5      4$ s  snf s  snf )a  converts a list of Qiskit circuits into circuits mapped AER::Circuit

Args:
    circuits: circuit(s) to be converted
    basis_gates (list): supported gates to be converted

Returns:
    a list of circuits to be run on the Aer backends and
    a list of index mapping from Qiskit instructions to Aer operations of the circuits

Examples:

    .. code-block:: python

        from qiskit.circuit import QuantumCircuit
        from qiskit_aer.backends.aer_compiler import assemble_circuits
        # Create a circuit to be simulated
        qc = QuantumCircuit(2, 2)
        qc.h(0)
        qc.cx(0, 1)
        qc.measure_all()
        # Generate AerCircuit from the input circuit
        aer_qc_list, idx_maps = assemble_circuits(circuits=[qc])
)rZ   r   rt  rG   )rN   r`  basis_gates_setrS   aer_circuitsidx_mapss         r>   assemble_circuitsr'    s    2 k*!$HPQWw8Q"
h "%PX&YPXW'7'@PX&Y!ZtH~--	 R 'Zs
   A.A3r   )vr   r   ru   r   typingr   warningsr   concurrent.futuresr   r  numpynpqiskit.circuitr   r   r	   r
   qiskit.circuit.classical.exprr   r   r   r   r   r   r   qiskit.circuit.classical.typesr   r   qiskit.circuit.libraryr   qiskit.providers.optionsr   r   qiskit.circuit.controlflowr   r   r   r   r   r   r   qiskit.transpilerr   qiskit.transpiler.passesr   qiskit_aer.aererrorr!   qiskit_aer.noiser"   'qiskit_aer.backends.controller_wrappersr#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   backend_utilsr0   r1   !library.control_flow_instructionsr3   r4   r5   r7   r   r*  integerr,  rn   bool_r+  floatingrG   r)  r3  rG  rt  rw  r\  r~  r  r  r   BIT_ANDBitAndBIT_ORBitOrBIT_XORBitXor	LOGIC_ANDLogicAndLOGIC_ORLogicOrr   Equal	NOT_EQUALNotEqualLESSLess
LESS_EQUAL	LessEqualGREATERGreaterGREATER_EQUALGreaterEqualr  r  r  r  r_  r'  r   rA   r>   <module>rR     s[        '   X X a a a 5 - ,     * . ( '    : J JYa Yax49c2::9s9 s9 #	9
 S"**%9 c2::&9 $)9 9 ubkk*9 S"**-9 S"**-9 bjj 19 3

+9 c2::&9 dBHH%9  tRXX&!9" bjj)#9$ bjj)%9& !4"2'9( tRXX)9* J+9, sBJJ'-9. #rzz*/90 RZZ(192 bhh'394 bjj 1596 $)798 #S"**$599: dBHH-;9< %tRXX&6=9> sBJJ/?9@ %sBJJ&7A9B %sBJJ&7C9D ,c2::->E9F *CG9H 13

2CI9J .r{{/CK9L 2C3DM9N 6RZZ7HO9P -sBJJ.?Q9R 93

:KS9T 0%1EU9V .RZZ/@W9X #SY9Z T288$[9\ 3]9^ ubkk*_9` sBJJ/a9b RZZ(c9d 4"e9f )3

*;g9h $("2),bjj(9&*BHH%5q9 x@>"5<<\n \~?6L=, II{))
IIk''
II{))
II--
II++
IIOO[&&
II--
IINNK$$
II+//
II{**
II[55 ,!L !LHP
od .^ 4  .4  .SWXbSc  .rA   