§
    º³ÙgM"  ã                  ó,  — d Z ddlmZ ddlZddlmZ ddlmZmZmZ ddl	m
Z
 ddlmZ ddlmZmZ dd	lmZ dd
lmZmZ ddlmZmZmZ ddlmZ ddlmZ  G d„ dej        ¦  «        Z G d„ dee¬¦  «        Z G d„ de¦  «        Z  G d„ de¦  «        Z!dS )zBase transpiler passes.é    )ÚannotationsN)Úabstractmethod)ÚCallableÚHashableÚIterable)Ú	signature)ÚQuantumCircuit)Úcircuit_to_dagÚdag_to_circuit)Ú
DAGCircuit)ÚGenericPassÚPassManagerIR)ÚPropertySetÚRunStateÚPassManagerStateé   )ÚTranspilerError)ÚTranspileLayoutc                  ó.   — e Zd ZdZd„ Zed„ ¦   «         ZdS )ÚMetaPassz�Metaclass for transpiler passes.

    Enforces the creation of some fields in the pass while allowing passes to
    override ``__init__``.
    c                óŒ   — t          j        | g|¢R i |¤Ž}t          t                               | ||¦  «        ¦  «        |_        |S ©N)ÚtypeÚ__call__Úhashr   Ú_freeze_init_parametersÚ_hash)ÚclsÚargsÚkwargsÚpass_instances       úR/granary/edev/quantum/lib/python3.11/site-packages/qiskit/transpiler/basepasses.pyr   zMetaPass.__call__2   sI   € Ýœ cÐ;¨DÐ;Ð;Ð;°FÐ;Ð;ˆÝ"¥8×#CÒ#CÀCÈÈvÑ#VÔ#VÑWÔWˆÔØÐó    c                óÀ  — t          ¦   «         }t          | j        ¦  «        } |j        |g|¢R i |¤Ž}d| j        fg}|j                             ¦   «         D ]y\  }}||k    rŒt          |t          ¦  «        r&| 	                    |t          |¦  «        |f¦  «         ŒG| 	                    |t          |¦  «        t          |¦  «        f¦  «         Œzt          |¦  «        S )Nzclass_.__name__)Úobjectr   Ú__init__ÚbindÚ__name__Ú	argumentsÚitemsÚ
isinstancer   Úappendr   ÚreprÚ	frozenset)	Úclass_r   r    Ú
self_guardÚinit_signatureÚbound_signaturer)   ÚnameÚvalues	            r"   r   z MetaPass._freeze_init_parameters7   sì   € å‘X”Xˆ
Ý" 6¤?Ñ3Ô3ˆØ-˜.Ô-¨jÐJ¸4ÐJÐJÐJÀ6ÐJÐJˆØ'¨¬Ð9Ð:ˆ	Ø*Ô4×:Ò:Ñ<Ô<ð 	Cð 	C‰KˆD�%Ø˜
Ò"Ð"ØÝ˜%¥Ñ*Ô*ð CØ× Ò  $­¨U©¬°UÐ!;Ñ<Ô<Ð<Ð<à× Ò  $­¨U©¬µT¸%±[´[Ð!AÑBÔBÐBÐBÝ˜Ñ#Ô#Ð#r#   N)r(   Ú
__module__Ú__qualname__Ú__doc__r   Ústaticmethodr   © r#   r"   r   r      sH   € € € € € ðð ð$ð ð ð
 ð$ð $ñ „\ð$ð $ð $r#   r   c                  ó~   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zedd„¦   «         Ze	d„ ¦   «         Z
e	d	„ ¦   «         Z	 ddd„Zˆ xZS )ÚBasePassz!Base class for transpiler passes.c                ó~   •— t          ¦   «                              ¦   «          g | _        t          d ¦  «        | _        d S r   )Úsuperr&   Ú	preservesr   r   )ÚselfÚ	__class__s    €r"   r&   zBasePass.__init__J   s1   ø€ Ý‰Œ×ÒÑÔÐØ02ˆŒÝ˜$‘Z”ZˆŒ
ˆ
ˆ
r#   c                ó   — | j         S r   )r   ©r?   s    r"   Ú__hash__zBasePass.__hash__O   s
   € ØŒzÐr#   c                óB   — t          | ¦  «        t          |¦  «        k    S r   )r   )r?   Úothers     r"   Ú__eq__zBasePass.__eq__R   s   € õ
 �D‰zŒz�T %™[œ[Ò(Ð(r#   Údagr   c                ó   — t           ‚)zñRun a pass on the DAGCircuit. This is implemented by the pass developer.

        Args:
            dag: the dag on which the pass is run.

        Raises:
            NotImplementedError: when this is left unimplemented for a pass.
        )ÚNotImplementedError)r?   rG   s     r"   ÚrunzBasePass.runY   s
   € õ "Ð!r#   c                ó,   — t          | t          ¦  «        S )zÔCheck if the pass is a transformation pass.

        If the pass is a TransformationPass, that means that the pass can manipulate the DAG,
        but cannot modify the property set (but it can be read).
        )r+   ÚTransformationPassrB   s    r"   Úis_transformation_passzBasePass.is_transformation_passe   s   € õ ˜$Õ 2Ñ3Ô3Ð3r#   c                ó,   — t          | t          ¦  «        S )a  Check if the pass is an analysis pass.

        If the pass is an AnalysisPass, that means that the pass can analyze the DAG and write
        the results of that analysis in the property set. Modifications on the DAG are not allowed
        by this kind of pass.
        )r+   ÚAnalysisPassrB   s    r"   Úis_analysis_passzBasePass.is_analysis_passn   s   € õ ˜$¥Ñ-Ô-Ð-r#   NÚcircuitr	   Úproperty_setúPropertySet | dict | NoneÚreturnc                ó´  — d}t          |t          ¦  «        rt          |¦  «        }t          |t          ¦  «        r|| _        |                      t          |¦  «        ¦  «        }|}t          |t          ¦  «        r.|                     ¦   «          |                     | j        ¦  «         t          |t          ¦  «        rt          |d¬¦  «        }n|€| 
                    ¦   «         }| j        d         rQt          | j        d         | j        d         | j        d         t          |j        ¦  «        |j        ¬¦  «        |_        | j        d         �| j        d         |_        | j        d	         �| j        d	         |_        | j        d
         rHg }| j        d
         }|                     ¦   «         D ]}|                     ||         ¦  «         Œ||_        |S )an  Runs the pass on circuit.

        Args:
            circuit: The dag on which the pass is run.
            property_set: Input/output property set. An analysis pass
                might change the property set in-place.

        Returns:
            If on transformation pass, the resulting QuantumCircuit.
            If analysis pass, the input circuit.
        NF)Úcopy_operationsÚlayoutÚoriginal_qubit_indicesÚfinal_layout)Úinitial_layoutÚinput_qubit_mappingrY   Ú_input_qubit_countÚ_output_qubit_listÚclbit_write_latencyÚconditional_latencyÚnode_start_time)r+   Údictr   rR   rJ   r
   ÚclearÚupdater   r   Úcopyr   ÚlenÚqubitsÚ_layoutÚ_clbit_write_latencyÚ_conditional_latencyÚtopological_op_nodesr,   Ú_op_start_times)	r?   rQ   rR   Úproperty_set_ÚresultÚresult_circuitÚtopological_start_timesÚstart_timesÚdag_nodes	            r"   r   zBasePass.__call__x   sà  € ð  ˆÝ�l¥DÑ)Ô)ð 	6Ý'¨Ñ5Ô5ˆMå�m¥[Ñ1Ô1ð 	.à -ˆDÔà—’�.¨Ñ1Ô1Ñ2Ô2ˆà ˆå�l¥DÑ)Ô)ð 	3Ø×ÒÑ Ô Ð Ø×Ò Ô 1Ñ2Ô2Ð2å�f�jÑ)Ô)ð 	,Ý+¨FÀEÐJÑJÔJˆNˆNØˆ^Ø$Ÿ\š\™^œ^ˆNàÔ˜XÔ&ð 	Ý%4Ø#Ô0°Ô:Ø$(Ô$5Ð6NÔ$OØ!Ô.¨~Ô>Ý#& w¤~Ñ#6Ô#6Ø#1Ô#8ð&ñ &ô &ˆNÔ"ð ÔÐ2Ô3Ð?Ø26Ô2CÐDYÔ2ZˆNÔ/ØÔÐ2Ô3Ð?Ø26Ô2CÐDYÔ2ZˆNÔ/ØÔÐ.Ô/ð 	Eð ')Ð#ØÔ+Ð,=Ô>ˆKØ"×7Ò7Ñ9Ô9ð Fð F�Ø'×.Ò.¨{¸8Ô/DÑEÔEÐEÐEØ-DˆNÔ*àÐr#   )rG   r   r   )rQ   r	   rR   rS   rT   r	   )r(   r5   r6   r7   r&   rC   rF   r   rJ   ÚpropertyrM   rP   r   Ú__classcell__©r@   s   @r"   r;   r;   G   sÐ   ø€ € € € € Ø+Ð+ð ð  ð  ð  ð  ð
ð ð ð)ð )ð )ð ð	"ð 	"ð 	"ñ „^ð	"ð ð4ð 4ñ „Xð4ð ð.ð .ñ „Xð.ð 37ð;ð ;ð ;ð ;ð ;ð ;ð ;ð ;ð ;r#   r;   )Ú	metaclassc                  ó   — e Zd ZdZdS )rO   z/An analysis pass: change property set, not DAG.N)r(   r5   r6   r7   r9   r#   r"   rO   rO   ¶   s   € € € € € Ø9Ð9Ð9Ð9r#   rO   c                  ó4   ‡ — e Zd ZdZ	 ddˆ fd„Zdˆ fd„Zˆ xZS )rL   z4A transformation pass: change DAG, not property set.NÚpassmanager_irr   Ústater   Úcallbackr   rT   ú&tuple[PassManagerIR, PassManagerState]c                ó*  •— t          ¦   «                              |||¬¦  «        \  }}|j        j        t          j        k    rNt          |t          ¦  «        r|j        |_        n,t          d| j
        j        › dt          |¦  «        › �¦  «        ‚||fS )N)rx   ry   rz   z?Transformation passes should return a transformed dag.The pass z is returning a )r=   ÚexecuteÚworkflow_statusÚprevious_runr   ÚSUCCESSr+   r   Ú_calibrations_propr   r@   r(   r   )r?   rx   ry   rz   Únew_dagr@   s        €r"   r}   zTransformationPass.execute½   s±   ø€ õ ™œŸšØ)ØØð )ñ 
ô 
‰ˆ�ð Ô Ô-µÔ1AÒAÐAÝ˜'¥:Ñ.Ô.ð à-;Ô-N�Ô*Ð*å%ðYØ $¤Ô 7ðYð YÝIMÈgÉÌðYð Yñô ð ð
 ˜ˆ~Ðr#   Ú	run_stater   c                óÎ   •— t          ¦   «                              ||¦  «        }|t          j        k    r1|j        j                             t          | j        ¦  «        ¦  «         |S r   )	r=   Úupdate_statusr   r€   r~   Úcompleted_passesÚintersection_updateÚsetr>   )r?   ry   rƒ   r@   s      €r"   r…   z TransformationPass.update_statusÕ   sU   ø€ õ
 ‘”×%Ò% e¨YÑ7Ô7ˆØ�Ô(Ò(Ð(ØÔ!Ô2×FÒFÅsÈ4Ì>ÑGZÔGZÑ[Ô[Ð[Øˆr#   r   )rx   r   ry   r   rz   r   rT   r{   )ry   r   rƒ   r   rT   r   )r(   r5   r6   r7   r}   r…   rs   rt   s   @r"   rL   rL   º   sk   ø€ € € € € Ø>Ð>ð "ð	ð ð ð ð ð ð ð0ð ð ð ð ð ð ð ð ð r#   rL   )"r7   Ú
__future__r   Úabcr   Úcollections.abcr   r   r   Úinspectr   Úqiskit.circuitr	   Úqiskit.convertersr
   r   Úqiskit.dagcircuitr   Úqiskit.passmanager.base_tasksr   r   Ú%qiskit.passmanager.compilation_statusr   r   r   Ú
exceptionsr   rW   r   ÚABCMetar   r;   rO   rL   r9   r#   r"   ú<module>r”      sÆ  ðð Ð Ø "Ð "Ð "Ð "Ð "Ð "à 
€
€
€
Ø Ð Ð Ð Ð Ð Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø Ð Ð Ð Ð Ð à )Ð )Ð )Ð )Ð )Ð )Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø (Ð (Ð (Ð (Ð (Ð (Ø DÐ DÐ DÐ DÐ DÐ DÐ DÐ DØ YÐ YÐ YÐ YÐ YÐ YÐ YÐ YÐ YÐ Yà 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø #Ð #Ð #Ð #Ð #Ð #ð%$ð %$ð %$ð %$ð %$ˆsŒ{ñ %$ô %$ð %$ðPlð lð lð lð lˆ{ hð lñ lô lð lð^:ð :ð :ð :ð :�8ñ :ô :ð :ð#ð #ð #ð #ð #˜ñ #ô #ð #ð #ð #r#   