§
    º³Ùgë  ã                  óº   — d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlZddl	m
Z
 ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ  G d„ de
¦  «        Zdd„ZdS )ú9Expand a gate in a circuit using its decomposition rules.é    )Úannotations)ÚSequence)ÚType)ÚfnmatchN)ÚTransformationPass)Úcontrol_flow)Ú	DAGOpNode)Ú
DAGCircuit)Úcircuit_to_dag)ÚInstructioné   )ÚHighLevelSynthesisc                  ó:   ‡ — e Zd ZdZ	 	 ddˆ fd
„Zdd„Zdd„Zˆ xZS )Ú	Decomposer   NFÚgates_to_decomposeúBstr | Type[Instruction] | Sequence[str | Type[Instruction]] | NoneÚapply_synthesisÚboolÚreturnÚNonec                ód   •— t          ¦   «                              ¦   «          || _        || _        dS )aM  
        Args:
            gates_to_decompose: optional subset of gates to be decomposed,
                identified by gate label, name or type. Defaults to all gates.
            apply_synthesis: If ``True``, run :class:`.HighLevelSynthesis` to synthesize operations
                that do not have a definition attached.
        N)ÚsuperÚ__init__r   r   )Úselfr   r   Ú	__class__s      €ú^/granary/edev/quantum/lib/python3.11/site-packages/qiskit/transpiler/passes/basis/decompose.pyr   zDecompose.__init__#   s1   ø€ õ 	‰Œ×ÒÑÔÐØ"4ˆÔØ.ˆÔÐÐó    Údagr   c                ó  — | j         rt          d¬¦  «        nd}|                     ¦   «         D �]Û}|                      |¦  «        sŒ|                     ¦   «         r8t          j        | j        |j        ¦  «        }| 	                    ||d¬¦  «         Œet          |j        dd¦  «        €D| j         r<t          |¦  «        }|                     |¦  «        }|                     ||d¬¦  «         Œ¿|j        j        j        }t          |¦  «        dk    rÉt          |j        ¦  «        t          |d	         j        ¦  «        cxk    rdk    r’n n�t          |j        ¦  «        t          |d	         j        ¦  «        cxk    rd	k    rXn nU|j        j        j        r|xj        |j        j        j        z  c_        | 	                    ||d	         j        d¬¦  «         �Œ¬t-          |j        j        ¦  «        }|                     ||¦  «         �ŒÝ|S )
zšRun the Decompose pass on `dag`.

        Args:
            dag: input dag.

        Returns:
            output dag where ``gate`` was expanded.
        F)Úqubits_initially_zeroNT)ÚinplaceÚ
definition)Úpropagate_conditioné   r   )r   r   Úop_nodesÚ_should_decomposeÚis_control_flowr	   Ú
map_blocksÚrunÚopÚsubstitute_nodeÚgetattrÚ_node_to_dagÚsubstitute_node_with_dagr#   ÚdataÚlenÚqargsÚqubitsÚcargsÚclbitsÚglobal_phaseÚ	operationr   )r   r   ÚhlsÚnodeÚdecompositionÚnode_as_dagÚsynthesizedÚrules           r   r*   zDecompose.run5   s  € ð BFÔAUÐ_Õ °uÐ=Ñ=Ô=Ð=Ð[_ˆð —L’L‘N”Nð  	Fñ  	FˆDà×)Ò)¨$Ñ/Ô/ð Øà×#Ò#Ñ%Ô%ð FÝ ,Ô 7¸¼À$Ä'Ñ JÔ J�Ø×#Ò# D¨-ÀÐ#ÑFÔFÐFÐFå˜œ ,°Ñ5Ô5Ð=àÔ'ð ^õ #/¨tÑ"4Ô"4�KØ"%§'¢'¨+Ñ"6Ô"6�KØ×0Ò0°°{ÐX\Ð0Ñ]Ô]Ð]øð ”wÔ)Ô.�õ ˜‘I”I ’N�NÝ˜DœJ™œ­3¨t°A¬w¬~Ñ+>Ô+>ÐCÐCÒCÐCÀ!ÒCÐCÐCÐCÐCÝ˜DœJ™œ­3¨t°A¬w¬~Ñ+>Ô+>ÐCÐCÒCÐCÀ!ÒCÐCÐCÐCÐCà”wÔ)Ô6ð LØÐ(Ô(¨D¬GÔ,>Ô,KÑKÐ(Ô(Ø×'Ò'¨¨d°1¬gÔ.?ÈÐ'ÑNÔNÐNÑNå$2°4´7Ô3EÑ$FÔ$F�MØ×0Ò0°°}ÑEÔEÐEÑEàˆ
r   r9   r
   c                óÆ  ‡— | j         €dS t          | j         t          ¦  «        s	| j         g}n| j         }d„ |D ¦   «         }d„ |D ¦   «         }t          ‰j        dd¦  «        �;‰j        j        dk    r+‰j        j        |v st          ˆfd„|D ¦   «         ¦  «        rdS ‰j        |v st          ˆfd„|D ¦   «         ¦  «        rdS t          ˆfd	„|D ¦   «         ¦  «        rdS d
S )zUCall a decomposition pass on this circuit to decompose one level (shallow decompose).NTc                ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS © )Ú
isinstanceÚstr)Ú.0Úss     r   ú
<listcomp>z/Decompose._should_decompose.<locals>.<listcomp>p   s'   € Ð?Ð?Ð?˜a­J°q½#Ñ,>Ô,>Ð?˜Ð?Ð?Ð?r   c                ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS r@   )rA   Útype)rC   Úgs     r   rE   z/Decompose._should_decompose.<locals>.<listcomp>q   s'   € ÐBÐBÐB ­j¸½DÑ.AÔ.AÐB˜!ÐBÐBÐBr   ÚlabelÚ c              3  óL   •K  — | ]}t          ‰j        j        |¦  «        V — Œd S ©N)r   r+   rI   ©rC   Úpr9   s     €r   ú	<genexpr>z.Decompose._should_decompose.<locals>.<genexpr>w   s1   øè è € Ð-^Ð-^ÈA­g°d´g´mÀQÑ.GÔ.GÐ-^Ð-^Ð-^Ð-^Ð-^Ð-^r   c              3  óB   •K  — | ]}t          ‰j        |¦  «        V — Œd S rL   )r   ÚnamerM   s     €r   rO   z.Decompose._should_decompose.<locals>.<genexpr>{   s@   øè è € ð '
ð '
Ø&'�G�D”I˜qÑ!Ô!ð'
ð '
ð '
ð '
ð '
ð '
r   c              3  óB   •K  — | ]}t          ‰j        |¦  «        V — Œd S rL   )rA   r+   )rC   r+   r9   s     €r   rO   z.Decompose._should_decompose.<locals>.<genexpr>   s/   øè è € ÐBÐB¨R•˜DœG RÑ(Ô(ÐBÐBÐBÐBÐBÐBr   F)r   rA   Úlistr-   r+   rI   ÚanyrQ   )r   r9   ÚgatesÚstrings_listÚgate_type_lists    `   r   r'   zDecompose._should_decomposef   s7  ø€ àÔ"Ð*Ø�4å˜$Ô1µ4Ñ8Ô8ð 	,ØÔ,Ð-ˆEˆEàÔ+ˆEà?Ð? 5Ð?Ñ?Ô?ˆØBÐB UÐBÑBÔBˆõ �D”G˜W dÑ+Ô+Ð7Ø”” Ò#Ð#à”” Ð&Ð&­#Ð-^Ð-^Ð-^Ð-^ÐQ]Ð-^Ñ-^Ô-^Ñ*^Ô*^Ð&ð �4ØŒY˜%ÐÐ¥3ð '
ð '
ð '
ð '
Ø+7ð'
ñ '
ô '
ñ $
ô $
Ðð �4ÝÐBÐBÐBÐB°>ÐBÑBÔBÑBÔBð 	Ø�4à�5r   )NF)r   r   r   r   r   r   )r   r   r   r   )r9   r
   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r*   r'   Ú__classcell__)r   s   @r   r   r       sy   ø€ € € € € ØCÐCð Ø %ð/ð /ð /ð /ð /ð /ð /ð$/ð /ð /ð /ðbð ð ð ð ð ð ð r   r   r9   r
   r   r   c                ó  — t          j        ¦   «         5  t          j        dt          ¬¦  «         t	          | j        dd ¦  «        �;| j                             ¦   «         }d |_        t          || j	        | j
        ¦  «        } d d d ¦  «         n# 1 swxY w Y   t          ¦   «         }|                     | j	        ¦  «         |                     | j
        ¦  «         |                     | j        | j	        | j
        ¦  «         |S )NÚignore)ÚcategoryÚ	condition)ÚwarningsÚcatch_warningsÚfilterwarningsÚDeprecationWarningr-   r+   Úcopyr`   r
   r2   r4   r   Ú
add_qubitsÚ
add_clbitsÚapply_operation_back)r9   r+   r   s      r   r.   r.   …   s  € õ
 
Ô	 Ñ	"Ô	"ð 9ð 9ÝÔ Õ3EÐFÑFÔFÐFÝ�4”7˜K¨Ñ.Ô.Ð:Ø”—’‘”ˆBØˆBŒLÝ˜R ¤¨T¬ZÑ8Ô8ˆDð9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9õ ‰,Œ,€CØ‡N‚N�4”:ÑÔÐØ‡N‚N�4”:ÑÔÐØ×Ò˜TœW d¤j°$´*Ñ=Ô=Ð=à€Js   ”A-BÂBÂB)r9   r
   r   r   )r[   Ú
__future__r   Úcollections.abcr   Útypingr   r   ra   Úqiskit.transpiler.basepassesr   Úqiskit.transpiler.passes.utilsr	   Úqiskit.dagcircuit.dagnoder
   Úqiskit.dagcircuit.dagcircuitr   Ú qiskit.converters.circuit_to_dagr   Úqiskit.circuit.instructionr   Ú	synthesisr   r   r.   r@   r   r   ú<module>rs      s/  ðð @Ð ?à "Ð "Ð "Ð "Ð "Ð "à $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø €€€à ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø /Ð /Ð /Ð /Ð /Ð /Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2à *Ð *Ð *Ð *Ð *Ð *ðbð bð bð bð bÐ"ñ bô bð bðJð ð ð ð ð r   