§
    º³Ùg<  ã                   ój   — d 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
 ddlmZ  G d„ de
¦  «        Zd	S )
zALAP Scheduling.é    )ÚDelayÚQubitÚMeasure)Ú
DAGCircuit)ÚTranspilerError)ÚBaseSchedulerTransform)Údeprecate_funcc                   óN   ‡ — e Zd ZdZ edd¬¦  «        ˆ fd„¦   «         Zd„ Zˆ xZS )ÚALAPSchedulea
  ALAP Scheduling pass, which schedules the **stop** time of instructions as late as possible.

    See :class:`~qiskit.transpiler.passes.scheduling.base_scheduler.BaseSchedulerTransform` for the
    detailed behavior of the control flow operation, i.e. ``c_if``.
    z�Instead, use :class:`~.ALAPScheduleAnalysis`, which is an analysis pass that requires a padding pass to later modify the circuit.z1.1.0)Úadditional_msgÚsincec                 ó:   •—  t          ¦   «         j        |i |¤Ž d S ©N)ÚsuperÚ__init__)ÚselfÚargsÚkwargsÚ	__class__s      €ú^/granary/edev/quantum/lib/python3.11/site-packages/qiskit/transpiler/passes/scheduling/alap.pyr   zALAPSchedule.__init__   s'   ø€ ð 	�‰ŒÔ˜$Ð) &Ð)Ð)Ð)Ð)Ð)ó    c                 ó
  ‡— t          |j        ¦  «        dk    s|j                             dd¦  «        €t          d¦  «        ‚| j        d         }t          ¦   «         }|j                             ¦   «         D ]}|                     |¦  «         Œ|j                             ¦   «         D ]}| 	                    |¦  «         Œd„ |j
        |j        z   D ¦   «         Št          t          |                     ¦   «         ¦  «        ¦  «        D �]}|                      ||¦  «        }t!          |j        | j        ¦  «        rŽt'          ˆfd„|j        D ¦   «         ¦  «        }|j        j        rZt'          ˆfd„|j        j        D ¦   «         ¦  «        }	t'          ||	|z
  ¦  «        }
|
|z   }|j        j        D ]}|| j        z   ‰|<   ŒnÀ|}
|
|z   }n¸|j        j        rt          d	|j        j        › d
�¦  «        ‚t!          |j        t0          ¦  «        rHt'          ˆfd„|j        |j        z   D ¦   «         ¦  «        }
|
|z   }|j        D ]}|
|| j        z
  z   ‰|<   Œn-t'          ˆfd„|j        |j        z   D ¦   «         ¦  «        }
|
|z   }|j        D ]m}|
‰|         z
  }|dk    rU|                      |                     |¦  «        j        ¦  «        r(|                     t?          ||¦  «        |gg d¬¦  «         |‰|<   Œn|                     |j        |j        |j        d¬¦  «         �Œt'          ‰                     ¦   «         ¦  «        }‰                      ¦   «         D ]{\  }}||z
  }|dk    rt!          |tB          ¦  «        sŒ&|                      |                     |¦  «        j        ¦  «        r(|                     t?          ||¦  «        |gg d¬¦  «         Œ||j        |_        |j"        |_"        |j#        |_#        ||_$        ||_%        |S )a[  Run the ALAPSchedule pass on `dag`.

        Args:
            dag (DAGCircuit): DAG to schedule.

        Returns:
            DAGCircuit: A scheduled DAG.

        Raises:
            TranspilerError: if the circuit is not mapped on physical qubits.
            TranspilerError: if conditional bit is added to non-supported instruction.
        é   ÚqNz,ALAP schedule runs on physical circuits onlyÚ	time_unitc                 ó   — i | ]}|d “ŒS )r   © )Ú.0r   s     r   ú
<dictcomp>z$ALAPSchedule.run.<locals>.<dictcomp>>   s   € Ð=Ð=Ð= �q˜!Ð=Ð=Ð=r   c              3   ó(   •K  — | ]}‰|         V — Œd S r   r   )r   r   Úidle_befores     €r   ú	<genexpr>z#ALAPSchedule.run.<locals>.<genexpr>J   s'   øè è € Ð=Ð=¨Q˜+ aœ.Ð=Ð=Ð=Ð=Ð=Ð=r   c              3   ó(   •K  — | ]}‰|         V — Œd S r   r   )r   Úcr!   s     €r   r"   z#ALAPSchedule.run.<locals>.<genexpr>M   s'   øè è € ÐMÐM°˜k¨!œnÐMÐMÐMÐMÐMÐMr   zConditional instruction z$ is not supported in ALAP scheduler.c              3   ó(   •K  — | ]}‰|         V — Œd S r   r   ©r   Úbitr!   s     €r   r"   z#ALAPSchedule.run.<locals>.<genexpr>r   ó(   øè è € ÐQÐQ°#˜[¨Ô-ÐQÐQÐQÐQÐQÐQr   c              3   ó(   •K  — | ]}‰|         V — Œd S r   r   r&   s     €r   r"   z#ALAPSchedule.run.<locals>.<genexpr>~   r(   r   r   F)Úcheck)&ÚlenÚqregsÚgetr   Úproperty_setr   ÚvaluesÚadd_qregÚcregsÚadd_cregÚqubitsÚclbitsÚreversedÚlistÚtopological_op_nodesÚ_get_node_durationÚ
isinstanceÚopÚCONDITIONAL_SUPPORTEDÚmaxÚqargsÚcondition_bitsÚconditional_latencyÚnamer   ÚcargsÚclbit_write_latencyÚ_delay_supportedÚfind_bitÚindexÚapply_operation_frontr   Úitemsr   ÚmetadataÚ_calibrations_propÚdurationÚunit)r   Údagr   Únew_dagÚqregÚcregÚnodeÚop_durationÚt0qÚt0cÚt0Út1Úclbitr'   ÚdeltaÚcircuit_durationÚbeforer!   s                    @r   ÚrunzALAPSchedule.run'   sd  ø€ õ ˆsŒy‰>Œ>˜QÒÐ #¤)§-¢-°°TÑ":Ô":Ð"BÝ!Ð"PÑQÔQÐQàÔ% kÔ2ˆ	Ý‘,”,ˆØ”I×$Ò$Ñ&Ô&ð 	#ð 	#ˆDØ×Ò˜TÑ"Ô"Ð"Ð"Ø”I×$Ò$Ñ&Ô&ð 	#ð 	#ˆDØ×Ò˜TÑ"Ô"Ð"Ð"à=Ð= S¤Z°#´*Ñ%<Ð=Ñ=Ô=ˆÝ�T #×":Ò":Ñ"<Ô"<Ñ=Ô=Ñ>Ô>ð H	Xñ H	XˆDØ×1Ò1°$¸Ñ<Ô<ˆKõ ˜$œ' 4Ô#=Ñ>Ô>ð 6*ÝÐ=Ð=Ð=Ð=°$´*Ð=Ñ=Ô=Ñ=Ô=�Ø”7Ô)ð *åÐMÐMÐMÐM°d´gÔ6LÐMÑMÔMÑMÔM�Cõ, ˜S #¨Ñ"3Ñ4Ô4�BØ˜kÑ)�BØ!%¤Ô!7ð Kð K˜Ø-/°$Ô2JÑ-J˜ EÑ*Ð*ðKð �BØ˜kÑ)�B�Bà”7Ô)ð Ý)Øe°4´7´<ÐeÐeÐeñô ð õ ˜dœg¥wÑ/Ô/ð *åÐQÐQÐQÐQ¸¼ÀdÄjÑ9PÐQÑQÔQÑQÔQ�BØ˜kÑ)�Bð "&¤ð [ð [˜Ø-/°;ÀÔAYÑ3YÑ-Z˜ EÑ*Ð*ð[õ ÐQÐQÐQÐQ¸¼ÀdÄjÑ9PÐQÑQÔQÑQÔQ�BØ˜kÑ)�Bà”zð &ð &�Ø˜[¨Ô-Ñ-�Ø˜1’9�9 ×!6Ò!6°s·|²|ÀCÑ7HÔ7HÔ7NÑ!OÔ!O�9Ø×1Ò1µ%¸¸yÑ2IÔ2IÈCÈ5ÐRTÐ\aÐ1ÑbÔbÐbØ#%�˜CÑ Ð à×)Ò)¨$¬'°4´:¸t¼zÐQVÐ)ÑWÔWÐWÑWå˜{×1Ò1Ñ3Ô3Ñ4Ô4ÐØ&×,Ò,Ñ.Ô.ð 	_ð 	_‰KˆC�Ø$ vÑ-ˆEØ˜A’I�I¥*¨Sµ%Ñ"8Ô"8�IØØ×$Ò$ S§\¢\°#Ñ%6Ô%6Ô%<Ñ=Ô=ð _Ø×-Ò-­e°E¸9Ñ.EÔ.EÈÀuÈbÐX]Ð-Ñ^Ô^Ð^øà”xˆŒØœ<ˆÔØ%(Ô%;ˆÔ"ð ,ˆÔØ ˆŒàˆr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r   rZ   Ú__classcell__)r   s   @r   r   r      sƒ   ø€ € € € € ðð ð €^ðVð ðñ ô ð*ð *ð *ð *ñô ð*ðrð rð rð rð rð rð rr   r   N)r^   Úqiskit.circuitr   r   r   Úqiskit.dagcircuitr   Úqiskit.transpiler.exceptionsr   Ú2qiskit.transpiler.passes.scheduling.base_schedulerr   Úqiskit.utils.deprecationr	   r   r   r   r   ú<module>re      s²   ðð Ð à 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø (Ð (Ð (Ð (Ð (Ð (Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø UÐ UÐ UÐ UÐ UÐ UØ 3Ð 3Ð 3Ð 3Ð 3Ð 3ðCð Cð Cð Cð CÐ)ñ Cô Cð Cð Cð Cr   