
    z	i9                     ^    S r SSK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\5      rg	)
-Unrolls instructions with custom definitions.    )QiskitError)TransformationPass)control_flow)ControlledGateControlFlowOp)circuit_to_dagc                   6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )UnrollCustomDefinitions   r   c                 R   > [         TU ]  5         Xl        X l        X0l        X@l        g)a  Unrolls instructions with custom definitions.

Args:
    equivalence_library (EquivalenceLibrary): The equivalence library
        which will be used by the BasisTranslator pass. (Instructions in
        this library will not be unrolled by this pass.)
    basis_gates (Optional[list[str]]): Target basis names to unroll to, e.g. ``['u3', 'cx']``.
        Ignored if ``target`` is also specified.
    target (Optional[Target]): The :class:`~.Target` object corresponding to the compilation
        target. When specified, any argument specified for ``basis_gates`` is ignored.
     min_qubits (int): The minimum number of qubits for operations in the input
         dag to translate.
N)super__init__
_equiv_lib_basis_gates_target_min_qubits)selfequivalence_librarybasis_gatestarget
min_qubits	__class__s        r/home/james-whalen/.local/lib/python3.13/site-packages/qiskit/transpiler/passes/basis/unroll_custom_definitions.pyr    UnrollCustomDefinitions.__init__   s&     	-'%    c                   ^ U R                   c  U R                  c  T$ 1 SknU R                  c  U[        U R                   5      -  nTR                  5        GH  n[	        UR
                  [        5      (       a=  TR                  U[        R                  " U R                  UR
                  5      5        M`  [        UR
                  SS5      (       a  M~  [        UR                  5      U R                  :  a  M  [	        UR
                  [        5      =(       a    UR
                  R                   nU(       d  U R                  bL  U R                  R#                  UR
                  R$                  ['        U4S jUR                   5       5      S9nOUR$                  U;   nU(       d*  U R(                  R+                  UR
                  5      (       a  GM}   [        UR
                  SS5      nUc9  [/        S
[1        U R                   5       SUR
                  R$                   S35      e[3        USS9nU R                  U5      n	TR5                  X95        GM      T$ ! [,         a!  n[/        SUR$                   S	U 35      UeSnAff = f)a  Run the UnrollCustomDefinitions pass on `dag`.

Args:
    dag (DAGCircuit): input dag

Raises:
    QiskitError: if unable to unroll given the basis due to undefined
    decomposition rules (such as a bad basis) or excessive recursion.

Returns:
    DAGCircuit: output unrolled dag
N>   delayresetstorebarriermeasuresnapshot
_directiveFc              3   Z   >#    U  H   nTR                  U5      R                  v   M"     g 7f)N)find_bitindex).0xdags     r   	<genexpr>.UnrollCustomDefinitions.run.<locals>.<genexpr>V   s     #N:aCLLO$9$9:s   (+)operation_nameqargs
definitionzError decomposing node z: z.Cannot unroll the circuit to the given basis, z. Instruction z> not found in equivalence library and no rule found to expand.)copy_operations)r   r   setop_nodes
isinstanceopr   substitute_noder   
map_blocksrungetattrlenr.   r   r   
_open_ctrlinstruction_supportednametupler   	has_entry	TypeErrorr   strr	   substitute_node_with_dag)
r   r*   device_instsnodecontrolled_gate_open_ctrlinst_supportedunrollederrdecompositionunrolled_dags
    `        r   r7   UnrollCustomDefinitions.run.   s    $)=JT<<C 1 122LLLND$''=11## ++DHHdgg> twwe444::!1!11(2477N(K(bPTPWPWPbPb%,<<+%)\\%G%G'+ww||##N4::#NN &H &N
 &*YY,%>N!T__%>%>tww%G%GY"477L$? !DSIZIZE[D\ ]##'77<<. 133  +8UKM88M2L((<S #V 
  Y!$;DII;b"NOUXXYs   I
J%JJ)r   r   r   r   )NNr   )	__name__
__module____qualname____firstlineno____doc__r   r7   __static_attributes____classcell__)r   s   @r   r   r      s    7&*@ @r   r   N)rO   qiskit.exceptionsr   qiskit.transpiler.basepassesr   qiskit.transpiler.passes.utilsr   qiskit.circuitr   r    qiskit.converters.circuit_to_dagr	   r    r   r   <module>rX      s(    4 ) ; 7 8 ;X0 Xr   