§
    º³Ùg†   ã            
       ó6  — d Z ddlmZ ddlmZ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 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mZmZ ddlmZ ddlmZ ddl m!Z! ddl"m#Z#m$Z$  edddg¦  «        Z%	 ddede!deee#e$f                  dee%         fd„Z&dS )zŠLower gates to schedules. The relative timing within gates is respected. This
module handles the translation, but does not handle timing.
é    )Ú
namedtuple)ÚDictÚListÚOptionalÚUnion)ÚBarrier)ÚDelay)Úconvert_durations_to_dt)ÚMeasure)ÚQuantumCircuit)ÚQiskitError)ÚSchedule)Úinstructions)ÚAcquireChannelÚ
MemorySlotÚDriveChannel)Ú
PulseError)Úmeasure)ÚScheduleConfig)Ú	BackendV1Ú	BackendV2ÚCircuitPulseDefÚscheduleÚqubitsNÚcircuitÚschedule_configÚbackendÚreturnc           
      óô  ‡ ‡‡‡‡‡‡— ddl mŠ g }‰j        Ši Št          ‰ ‰j        d¬¦  «        Š dt
          t          t          f         dt          fˆˆ ˆˆˆfd„}d„ t          ‰ j	        ¦  «        D ¦   «         Šd	„ t          ‰ j
        ¦  «        D ¦   «         }‰ j        D �]¹}ˆfd
„|j	        D ¦   «         }t          ˆfd„|D ¦   «         ¦  «        r|                      |‰¦  «        ¦  «         t          |j        t           ¦  «        r*|                     t          |j        |¬¦  «        ¦  «         Œ“t          |j        t"          ¦  «        r|t%          |j        j        ¬¦  «        }|D ]9}	t(          fD ].}
|t+          j        |j        j         |
|	¦  «        ¬¦  «        z  }Œ/Œ:|                     t          ||¬¦  «        ¦  «         �Œ)t          |j        t.          ¦  «        rdt1          |¦  «        dk    r3t1          |j
        ¦  «        dk    rt3          d|› d|j
        › d�¦  «        ‚||j
        d                  ‰|d         <   �Œ§	 ‰ j        |j        j                 }|t7          |¦  «        t7          d„ |j        j        D ¦   «         ¦  «        f         } ‰|¦  «        }|                     t          ||¬¦  «        ¦  «         �Œ(# t:          $ r Y nw xY w	  ‰j        |j        |g|j        j        ¢R Ž } ‰|¦  «        }|                     t          ||¬¦  «        ¦  «         �Œˆ# t>          $ r&}t3          d|j        j        › d|› d�¦  «        |‚d}~ww xY w‰r|                      |‰¦  «        ¦  «         |S )aŠ  
    Return a list of Schedules and the qubits they operate on, for each element encountered in the
    input circuit.

    Without concern for the final schedule, extract and return a list of Schedules and the qubits
    they operate on, for each element encountered in the input circuit. Measures are grouped when
    possible, so ``qc.measure(q0, c0)`` or ``qc.measure(q1, c1)`` will generate a synchronous
    measurement pulse.

    Args:
        circuit: The quantum circuit to translate.
        schedule_config: Backend specific parameters used for building the Schedule.
        backend: Pass in the backend used to build the Schedule, the backend could be BackendV1
                 or BackendV2

    Returns:
        A list of CircuitPulseDefs: the pulse definition for each circuit element.

    Raises:
        QiskitError: If circuit uses a command that isn't defined in config.inst_map.
    r   )Útarget_qobj_transformF)Ú	dt_in_secÚinplaceÚqubit_mem_slotsr   c                 óœ  •— t          ¦   «         }i }t          ¦   «         j        ‰j                             ¦   «         v rÛt          t          |                      ¦   «         ¦  «        ¦  «        }d}|D ]¨}	 ‰j        t          ¦   «         j                 |f|f         } ‰|¦  «        }|                     t          |¦  «        g¬¦  «        }d„ |j	        D ¦   «         d         }|| |         k    rt          d¦  «        ‚||z  }| |= |||<   Œ™# t          $ r Y Œ¥w xY w| rt          |                      ¦   «         ¦  «        }|                      |¦  «         t          |‰
‰‰j        | ¬¦  «        }	 ‰|	¦  «        }	|	                     d„ |D ¦   «         ¬¦  «        }	||	z  }|                      ¦   «          t#          |d„ |j	        D ¦   «         ¬	¦  «        S )
z=Create a schedule to measure the qubits queued for measuring.© )Úchannelsc                 óF   — g | ]}t          |t          ¦  «        ¯|j        ‘ŒS r%   )Ú
isinstancer   Úindex©Ú.0Úchans     úO/granary/edev/quantum/lib/python3.11/site-packages/qiskit/scheduler/lowering.pyú
<listcomp>z=lower_gates.<locals>.get_measure_schedule.<locals>.<listcomp>X   s;   € ð &ð &ð &Ø'+ÅZÐPTÕV`ÑEaÔEað&Øœ
ð&ð &ð &ó    r   zJThe measurement calibration is not defined on the requested classical bits)r   r   Úinst_mapÚmeas_mapr#   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r%   )r   )r+   Úqubits     r-   r.   z=lower_gates.<locals>.get_measure_schedule.<locals>.<listcomp>r   s    € ÐNÐNÐN°E�.¨Ñ/Ô/ÐNÐNÐNr/   c                 óF   — g | ]}t          |t          ¦  «        ¯|j        ‘ŒS r%   )r(   r   r)   r*   s     r-   r.   z=lower_gates.<locals>.get_measure_schedule.<locals>.<listcomp>x   s)   € Ð^Ð^Ð^ 4½ZÈÍnÑ=]Ô=]Ð^�D”JÐ^Ð^Ð^r/   ©r   r   )r   r   ÚnameÚcalibrationsÚkeysÚtupleÚsortedÚfilterr   r&   ÚKeyErrorÚlistÚupdater   r1   ÚexcludeÚclearr   )r#   ÚschedÚacquire_excludesr   Úparamsr3   Úmeas_qÚ	acquire_qÚmem_slot_indexÚ
meas_schedr   r   r0   r   r    s             €€€€€r-   Úget_measure_schedulez)lower_gates.<locals>.get_measure_scheduleK   s3  ø€ å‘
”
ˆàÐÝ‰9Œ9Œ>˜WÔ1×6Ò6Ñ8Ô8Ð8Ð8Ý�6 /×"6Ò"6Ñ"8Ô"8Ñ9Ô9Ñ:Ô:ˆFØˆFØð ð �ðØ$Ô1µ'±)´)´.ÔAÀEÀ8ÈVÐBTÔU�FØ2Ð2°6Ñ:Ô:�FØ &§¢½ÀuÑ8MÔ8MÐ7N Ñ OÔ O�Ið&ð &Ø/8Ô/Að&ñ &ô &àô&�Nð &¨¸Ô)?Ò?Ð?Ý&ð;ñô ð ð ˜V‘O�EØ'¨Ð.Ø.<Ð$ UÑ+Ð+øÝð ð ð Ø�Dðøøøð ð 	 Ý˜/×.Ò.Ñ0Ô0Ñ1Ô1ˆFØ×"Ò"Ð#3Ñ4Ô4Ð4Ý ØØØ!Ø(Ô1Ø /ðñ ô ˆJð /Ð.¨zÑ:Ô:ˆJØ#×+Ò+ØNÐNÐ=MÐNÑNÔNð ,ñ ô ˆJð �ZÑˆEØ×ÒÑÔÐÝØØ^Ð^¨5¬>Ð^Ñ^Ô^ð
ñ 
ô 
ð 	
s   Á3BD	Ä	
DÄDc                 ó   — i | ]\  }}||“Œ	S r%   r%   ©r+   ÚidxÚbits      r-   ú
<dictcomp>zlower_gates.<locals>.<dictcomp>{   ó   € ÐHÐHÐH¡( # s�S˜#ÐHÐHÐHr/   c                 ó   — i | ]\  }}||“Œ	S r%   r%   rJ   s      r-   rM   zlower_gates.<locals>.<dictcomp>|   rN   r/   c                 ó    •— g | ]
}‰|         ‘ŒS r%   r%   )r+   r3   Úqubit_indicess     €r-   r.   zlower_gates.<locals>.<listcomp>   s   ø€ ÐLÐLÐL°�} UÔ+ÐLÐLÐLr/   c              3   ó    •K  — | ]}|‰v V — Œ	d S ©Nr%   )r+   Úqr#   s     €r-   ú	<genexpr>zlower_gates.<locals>.<genexpr>�   s(   øè è € Ð9Ð9¨ˆq�OÐ#Ð9Ð9Ð9Ð9Ð9Ð9r/   r5   )r6   )ÚdurationÚchannelé   zQubit 'z' or classical bit 'zI' errored because the circuit Measure instruction only takes one of each.c              3   óZ   K  — | ]&}t          |d d¦  «        r|nt          |¦  «        V — Œ'dS )Ú
parametersN)ÚgetattrÚfloat)r+   Úps     r-   rU   zlower_gates.<locals>.<genexpr>Ÿ   sQ   è è € ð ð à !õ ")¨¨L¸$Ñ!?Ô!?ÐM˜A˜AÅUÈ1ÁXÄXðð ð ð ð ð r/   zOperation 'z' on qubit(s) zx not supported by the backend command definition. Did you remember to transpile your input circuit for the same backend?N) Ú'qiskit.pulse.transforms.base_transformsr    r0   r
   Údtr   Úintr   Ú	enumerater   ÚclbitsÚdataÚanyÚappendr(   Ú	operationr   r	   r   r6   r   Ú
pulse_instrV   r   Úlenr   r7   r9   rC   r<   Úgetr   )r   r   r   Úcirc_pulse_defsrH   Úclbit_indicesÚinstructionÚinst_qubitsrA   r3   rW   Ú	gate_calsr   Úexr0   rQ   r#   r    s   ```           @@@@r-   Úlower_gatesrp   '   s  øøøøøøø€ ð4 NÐMÐMÐMÐMÐMà€OàÔ'€HØ€Oõ & g¸Ô9KÐUZÐ[Ñ[Ô[€Gð.
­dµ3½°8¬nð .
Åð .
ð .
ð .
ð .
ð .
ð .
ð .
ð .
ð .
ð .
ð` IÐH­i¸¼Ñ.GÔ.GÐHÑHÔH€MØHÐH­i¸¼Ñ.GÔ.GÐHÑHÔH€Mà”|ð 8ñ 8ˆØLÐLÐLÐL¸Ô9KÐLÑLÔLˆåÐ9Ð9Ð9Ð9¨[Ð9Ñ9Ô9Ñ9Ô9ð 	Jà×"Ò"Ð#7Ð#7¸Ñ#HÔ#HÑIÔIÐIå�kÔ+­WÑ5Ô5ð 1	Ø×"Ò"Ý¨Ô)>À{ÐSÑSÔSñô ð ð õ ˜Ô-­uÑ5Ô5ð -	Ý +Ô"7Ô"<Ð=Ñ=Ô=ˆEØ$ð ð �Ý ,˜~ð ð �GØ�ZÔ-Ø!,Ô!6Ô!?ÈÈÐQVÉÌðñ ô ñ �E�Eðð ×"Ò"¥?¸EÈ+Ð#VÑ#VÔ#VÑWÔWÐWÑWÝ˜Ô-­wÑ7Ô7ð %	Ý�;ÑÔ 1Ò$Ð$­¨[Ô-?Ñ)@Ô)@ÀAÒ)EÐ)EÝ!ð˜kð ð ¸{Ô?Qð ð ð ñô ð ð
 /<¸KÔ<NÈqÔ<QÔ.RˆO˜K¨œNÑ+Ñ+ðØ#Ô0°Ô1FÔ1KÔL�	Ø$å˜kÑ*Ô*Ýð ð à%0Ô%:Ô%Aðñ ô ñ ô ðô�ð 1Ð0°Ñ:Ô:�Ø×&Ò&¥ÀÐQ\Ð']Ñ']Ô']Ñ^Ô^Ð^ÙøÝð ð ð Ø�ðøøøðØ'˜8œ<ØÔ)¨;ðØ9DÔ9NÔ9Uðð ð �ð 1Ð0°Ñ:Ô:�Ø×&Ò&¥ÀÐQ\Ð']Ñ']Ô']Ñ^Ô^Ð^Ñ^øÝð ð ð Ý!ðI +Ô"7Ô"<ð Ið IÈKð Ið Ið Iñô ð ð	øøøøðøøøð ð FØ×ÒÐ3Ð3°OÑDÔDÑEÔEÐEàÐs,   ÉA>KË
KËKËAL%Ì%
MÌ/!MÍMrS   )'Ú__doc__Úcollectionsr   Útypingr   r   r   r   Úqiskit.circuit.barrierr   Úqiskit.circuit.delayr	   Úqiskit.circuit.durationr
   Úqiskit.circuit.measurer   Úqiskit.circuit.quantumcircuitr   Úqiskit.exceptionsr   Úqiskit.pulser   r   rg   Úqiskit.pulse.channelsr   r   r   Úqiskit.pulse.exceptionsr   Úqiskit.pulse.macrosr   Úqiskit.scheduler.configr   Úqiskit.providersr   r   r   rp   r%   r/   r-   ú<module>r€      sÊ  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .à *Ð *Ð *Ð *Ð *Ð *Ø &Ð &Ð &Ð &Ð &Ð &Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø *Ð *Ð *Ð *Ð *Ð *Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø )Ð )Ð )Ð )Ð )Ð )Ø !Ð !Ð !Ð !Ð !Ð !Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JØ .Ð .Ð .Ð .Ð .Ð .Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1à�*ØØ�Ðñô €ð 6:ðTð TØðTà#ðTð �e˜I yÐ0Ô1Ô2ðTð 
ˆ/Ôð	Tð Tð Tð Tð Tð Tr/   