§
    ¹³Ùg`@  ã                  óÌ   — d 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
mZmZ ddlmZ ddlmZmZmZ dd	lmZ  G d
„ d¦  «        Z G d„ d¦  «        Zdd„Z G d„ d¦  «        ZdS )zVarious ways to divide a DAG into blocks of nodes, to split blocks of nodes
into smaller sub-blocks, and to consolidate blocks.é    )Úannotations)ÚIterableÚCallable)Ú
DAGDepNode)ÚQuantumCircuitÚCircuitInstructionÚClassicalRegisterÚBit)Úcondition_resourcesé   )Ú	DAGOpNodeÚ
DAGCircuitÚDAGDependency)ÚDAGCircuitErrorc                  óR   — e Zd ZdZdd„Zd„ Zdd„Zd	„ Zd
„ Zd„ Z	dd„Z
	 	 	 	 dd„ZdS )ÚBlockCollectoraÇ  This class implements various strategies of dividing a DAG (direct acyclic graph)
    into blocks of nodes that satisfy certain criteria. It works both with the
    :class:`~qiskit.dagcircuit.DAGCircuit` and
    :class:`~qiskit.dagcircuit.DAGDependency` representations of a DAG, where
    DagDependency takes into account commutativity between nodes.

    Collecting nodes from DAGDependency generally leads to more optimal results, but is
    slower, as it requires to construct a DAGDependency beforehand. Thus, DAGCircuit should
    be used with lower transpiler settings, and DAGDependency should be used with higher
    transpiler settings.

    In general, there are multiple ways to collect maximal blocks. The approaches used
    here are of the form 'starting from the input nodes of a DAG, greedily collect
    the largest block of nodes that match certain criteria'. For additional details,
    see https://github.com/Qiskit/qiskit-terra/issues/5775.
    ÚdagúDAGCircuit | DAGDependencyc                óÐ   — || _         d| _        d| _        d| _        t	          |t
          ¦  «        r	d| _        dS t	          |t          ¦  «        r	d| _        dS t          d¦  «        ‚)z§
        Args:
            dag (Union[DAGCircuit, DAGDependency]): The input DAG.

        Raises:
            DAGCircuitError: the input object is not a DAG.
        NFTz
not a DAG.)	r   Ú_pending_nodesÚ
_in_degreeÚ_collect_from_backÚ
isinstancer   Úis_dag_dependencyr   r   ©Úselfr   s     úV/granary/edev/quantum/lib/python3.11/site-packages/qiskit/dagcircuit/collect_blocks.pyÚ__init__zBlockCollector.__init__.   sr   € ð ˆŒØCGˆÔØDHˆŒØ"'ˆÔå�c�:Ñ&Ô&ð 	0Ø%*ˆDÔ"Ð"Ð"å˜�]Ñ+Ô+ð 	0Ø%)ˆDÔ"Ð"Ð"õ " ,Ñ/Ô/Ð/ó    c                óè   — g | _         i | _        |                      ¦   «         D ]N}t          |                      |¦  «        ¦  «        }|| j        |<   |dk    r| j                              |¦  «         ŒOdS )a+  For an efficient implementation, for every node we keep the number of its
        unprocessed immediate predecessors (called ``_in_degree``). This ``_in_degree``
        is set up at the start and updated throughout the algorithm.
        A node is leaf (or input) node iff its ``_in_degree`` is 0.
        When a node is (marked as) collected, the ``_in_degree`` of each of its immediate
        successor is updated by subtracting 1.
        Additionally, ``_pending_nodes`` explicitly keeps the list of nodes whose
        ``_in_degree`` is 0.
        r   N)r   r   Ú	_op_nodesÚlenÚ_direct_predsÚappend)r   ÚnodeÚdegs      r   Ú_setup_in_degreesz BlockCollector._setup_in_degreesE   s~   € ð !ˆÔØˆŒØ—N’NÑ$Ô$ð 	1ð 	1ˆDÝ�d×(Ò(¨Ñ.Ô.Ñ/Ô/ˆCØ$'ˆDŒO˜DÑ!Ø�aŠxˆxØÔ#×*Ò*¨4Ñ0Ô0Ð0øð		1ð 	1r   Úreturnú Iterable[DAGOpNode | DAGDepNode]c                ót   — | j         s| j                             ¦   «         S | j                             ¦   «         S )zReturns DAG nodes.)r   r   Úop_nodesÚ	get_nodes©r   s    r   r!   zBlockCollector._op_nodesW   s5   € àÔ%ð 	(Ø”8×$Ò$Ñ&Ô&Ð&à”8×%Ò%Ñ'Ô'Ð'r   c                ój  ‡ — ‰ j         sO‰ j        r$d„ ‰ j                             |¦  «        D ¦   «         S d„ ‰ j                             |¦  «        D ¦   «         S ‰ j        r+ˆ fd„‰ j                             |j        ¦  «        D ¦   «         S ˆ fd„‰ j                             |j        ¦  «        D ¦   «         S )zêReturns direct predecessors of a node. This function takes into account the
        direction of collecting blocks, that is node's predecessors when collecting
        backwards are the direct successors of a node in the DAG.
        c                ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS © ©r   r   ©Ú.0Úpreds     r   ú
<listcomp>z0BlockCollector._direct_preds.<locals>.<listcomp>e   ó)   € ÐbÐbÐb ÅjÐQUÕW`ÑFaÔFaÐb˜ÐbÐbÐbr   c                ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS r0   r1   r2   s     r   r5   z0BlockCollector._direct_preds.<locals>.<listcomp>g   ó)   € ÐdÐdÐd Í
ÐSWÕYbÑHcÔHcÐd˜ÐdÐdÐdr   c                óD   •— g | ]}‰j                              |¦  «        ‘ŒS r0   ©r   Úget_node©r3   Úpred_idr   s     €r   r5   z0BlockCollector._direct_preds.<locals>.<listcomp>j   ó9   ø€ ð ð ð àð ”H×%Ò% gÑ.Ô.ðð ð r   c                óD   •— g | ]}‰j                              |¦  «        ‘ŒS r0   r:   r<   s     €r   r5   z0BlockCollector._direct_preds.<locals>.<listcomp>o   r>   r   )r   r   r   Ú
successorsÚpredecessorsÚdirect_successorsÚnode_idÚdirect_predecessors©r   r%   s   ` r   r#   zBlockCollector._direct_preds^   sé   ø€ ð
 Ô%ð 	ØÔ&ð eØbÐb¨¬×)<Ò)<¸TÑ)BÔ)BÐbÑbÔbÐbàdÐd¨¬×)>Ò)>¸tÑ)DÔ)DÐdÑdÔdÐdàÔ&ð 	ðð ð ð à#'¤8×#=Ò#=¸d¼lÑ#KÔ#Kðñ ô ð ð
ð ð ð à#'¤8×#?Ò#?ÀÄÑ#MÔ#Mðñ ô ð r   c                ój  ‡ — ‰ j         sO‰ j        r$d„ ‰ j                             |¦  «        D ¦   «         S d„ ‰ j                             |¦  «        D ¦   «         S ‰ j        r+ˆ fd„‰ j                             |j        ¦  «        D ¦   «         S ˆ fd„‰ j                             |j        ¦  «        D ¦   «         S )zèReturns direct successors of a node. This function takes into account the
        direction of collecting blocks, that is node's successors when collecting
        backwards are the direct predecessors of a node in the DAG.
        c                ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS r0   r1   ©r3   Úsuccs     r   r5   z0BlockCollector._direct_succs.<locals>.<listcomp>{   r8   r   c                ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS r0   r1   rH   s     r   r5   z0BlockCollector._direct_succs.<locals>.<listcomp>}   r6   r   c                óD   •— g | ]}‰j                              |¦  «        ‘ŒS r0   r:   ©r3   Úsucc_idr   s     €r   r5   z0BlockCollector._direct_succs.<locals>.<listcomp>€   r>   r   c                óD   •— g | ]}‰j                              |¦  «        ‘ŒS r0   r:   rL   s     €r   r5   z0BlockCollector._direct_succs.<locals>.<listcomp>…   r>   r   )r   r   r   rA   r@   rD   rC   rB   rE   s   ` r   Ú_direct_succszBlockCollector._direct_succst   sé   ø€ ð
 Ô%ð 	ØÔ&ð cØdÐd¨¬×)>Ò)>¸tÑ)DÔ)DÐdÑdÔdÐdàbÐb¨¬×)<Ò)<¸TÑ)BÔ)BÐbÑbÔbÐbàÔ&ð 	ðð ð ð à#'¤8×#?Ò#?ÀÄÑ#MÔ#Mðñ ô ð ð
ð ð ð à#'¤8×#=Ò#=¸d¼lÑ#KÔ#Kðñ ô ð r   c                ó2   — t          | j        ¦  «        dk    S )z5Returns whether there are uncollected (pending) nodesr   )r"   r   r-   s    r   Ú_have_uncollected_nodesz&BlockCollector._have_uncollected_nodesŠ   s   € å�4Ô&Ñ'Ô'¨!Ò+Ð+r   Ú	filter_fnr   úlist[DAGOpNode | DAGDepNode]c                ó\  — g }| j         }g | _         |r™g }|D ]�} ||¦  «        ri|                     |¦  «         |                      |¦  «        D ]=}| j        |xx         dz  cc<   | j        |         dk    r|                     |¦  «         Œ>Œv| j                              |¦  «         Œ‘|}|°™|S )a�  Iteratively collects the largest block of input nodes (that is, nodes with
        ``_in_degree`` equal to 0) that match a given filtering function.
        Examples of this include collecting blocks of swap gates,
        blocks of linear gates (CXs and SWAPs), blocks of Clifford gates, blocks of single-qubit gates,
        blocks of two-qubit gates, etc.  Here 'iteratively' means that once a node is collected,
        the ``_in_degree`` of each of its immediate successor is decreased by 1, allowing more nodes
        to become input and to be eligible for collecting into the current block.
        Returns the block of collected nodes.
        r   r   )r   r$   rO   r   )r   rR   Úcurrent_blockÚunprocessed_pending_nodesÚnew_pending_nodesr%   Úsucs          r   Úcollect_matching_blockz%BlockCollector.collect_matching_blockŽ   sú   € ð ˆØ$(Ô$7Ð!Ø ˆÔð (ð 	:Ø "ÐØ1ð 
5ð 
5�Ø�9˜T‘?”?ð 	5Ø!×(Ò(¨Ñ.Ô.Ð.ð  $×1Ò1°$Ñ7Ô7ð :ð :˜Øœ¨Ð,Ð,Ô,°Ñ1Ð,Ð,Ñ,Øœ?¨3Ô/°1Ò4Ð4Ø-×4Ò4°SÑ9Ô9Ð9øð:ð
 Ô'×.Ò.¨tÑ4Ô4Ð4Ð4Ø(9Ð%ð (ð 	:ð Ðr   Té   Fc                óL  ‡‡— ˆfd„}|| _         |                      ¦   «          g }|                      ¦   «         rU|                      |¦  «         |                      ‰¦  «        }|r|                     |¦  «         |                      ¦   «         °U|r+g }	|D ]$}
|	                     t          |
¦  «        ¦  «         Œ%|	}|r=g }	|D ]6}
|	                     t          ¦   «                              |
¦  «        ¦  «         Œ7|	}| j         rd„ |ddd…         D ¦   «         }ˆfd„|D ¦   «         }|S )at  Collects all blocks that match a given filtering function filter_fn.
        This iteratively finds the largest block that does not match filter_fn,
        then the largest block that matches filter_fn, and so on, until no more uncollected
        nodes remain. Intuitively, finding larger blocks of non-matching nodes helps to
        find larger blocks of matching nodes later on.

        After the blocks are collected, they can be optionally refined. The option
        ``split_blocks`` allows to split collected blocks into sub-blocks over disjoint
        qubit subsets. The option ``split_layers`` allows to split collected blocks
        into layers of non-overlapping instructions. The option ``min_block_size``
        specifies the minimum number of gates in the block for the block to be collected.

        By default, blocks are collected in the direction from the inputs towards the outputs
        of the circuit. The option ``collect_from_back`` allows to change this direction,
        that is collect blocks from the outputs towards the inputs of the circuit.

        Returns the list of matching blocks only.
        c                ó   •—  ‰| ¦  «         S )z"Returns the opposite of filter_fn.r0   )r%   rR   s    €r   Únot_filter_fnzABlockCollector.collect_all_matching_blocks.<locals>.not_filter_fnÌ   s   ø€ à �y ‘”Ð&Ð&r   c                ó$   — g | ]}|d d d…         ‘ŒS )Néÿÿÿÿr0   )r3   Úblocks     r   r5   z>BlockCollector.collect_all_matching_blocks.<locals>.<listcomp>ï   s"   € ÐNÐNÐN¨u˜u T T r Tœ{ÐNÐNÐNr   Nr_   c                ó:   •— g | ]}t          |¦  «        ‰k    ¯|‘ŒS r0   )r"   )r3   r`   Úmin_block_sizes     €r   r5   z>BlockCollector.collect_all_matching_blocks.<locals>.<listcomp>ò   s)   ø€ Ð^Ð^Ð^ UÅÀUÁÄÈ~ÒA]ÐA]˜5ÐA]ÐA]ÐA]r   )	r   r'   rQ   rY   r$   ÚextendÚsplit_block_into_layersÚBlockSplitterÚrun)r   rR   Úsplit_blocksrb   Úsplit_layersÚcollect_from_backr]   Úmatching_blocksÚmatching_blockÚ
tmp_blocksr`   s    ` `       r   Úcollect_all_matching_blocksz*BlockCollector.collect_all_matching_blocks±   s�  øø€ ð6	'ð 	'ð 	'ð 	'ð 	'ð
 #4ˆÔØ×ÒÑ Ô Ð ð ?AˆØ×*Ò*Ñ,Ô,ð 	7Ø×'Ò'¨Ñ6Ô6Ð6Ø!×8Ò8¸ÑCÔCˆNØð 7Ø×&Ò& ~Ñ6Ô6Ð6ð	 ×*Ò*Ñ,Ô,ð 	7ð ð 	)ØˆJØ(ð Bð B�Ø×!Ò!Õ"9¸%Ñ"@Ô"@ÑAÔAÐAÐAØ(ˆOð ð 	)ØˆJØ(ð >ð >�Ø×!Ò!¥-¡/¤/×"5Ò"5°eÑ"<Ô"<Ñ=Ô=Ð=Ð=Ø(ˆOð Ô"ð 	OØNÐN¸ÈÈÈ"ÈÔ8MÐNÑNÔNˆOð _Ð^Ð^Ð^¨oÐ^Ñ^Ô^ˆàÐr   N)r   r   )r(   r)   )rR   r   r(   rS   )TrZ   FF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r'   r!   r#   rO   rQ   rY   rm   r0   r   r   r   r      s¿   € € € € € ðð ð"0ð 0ð 0ð 0ð.1ð 1ð 1ð$(ð (ð (ð (ðð ð ð,ð ð ð,,ð ,ð ,ð!ð !ð !ð !ðL ØØØðCð Cð Cð Cð Cð Cr   r   c                  ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )re   z‡Splits a block of nodes into sub-blocks over disjoint qubits.
    The implementation is based on the Disjoint Set Union data structure.c                ó"   — i | _         i | _        d S ©N)ÚleaderÚgroupr-   s    r   r   zBlockSplitter.__init__û   s   € ØˆŒØˆŒ
ˆ
ˆ
r   c                óÐ   — || j         vr|| j         |<   g | j        |<   |S | j         |         |k    r|S |                      | j         |         ¦  «        | j         |<   | j         |         S )zFind in DSU.)ru   rv   Úfind_leader)r   Úindexs     r   rx   zBlockSplitter.find_leaderÿ   sq   € à˜œÐ#Ð#Ø!&ˆDŒK˜ÑØ "ˆDŒJ�uÑØˆLØŒ;�uÔ Ò&Ð&ØˆLØ!×-Ò-¨d¬k¸%Ô.@ÑAÔAˆŒ�EÑØŒ{˜5Ô!Ð!r   c                ó†  — |                       |¦  «        }|                       |¦  «        }||k    rdS t          | j        |         ¦  «        t          | j        |         ¦  «        k     r||}}|| j        |<   | j        |                              | j        |         ¦  «         | j        |                              ¦   «          dS )zUnion in DSU.N)rx   r"   rv   ru   rc   Úclear)r   Úindex1Úindex2Úleader1Úleader2s        r   Úunion_leaderszBlockSplitter.union_leaders
  s·   € à×"Ò" 6Ñ*Ô*ˆØ×"Ò" 6Ñ*Ô*ˆØ�gÒÐØˆFÝˆtŒz˜'Ô"Ñ#Ô#¥c¨$¬*°WÔ*=Ñ&>Ô&>Ò>Ð>Ø&¨�WˆGà&ˆŒ�GÑØŒ
�7Ô×"Ò" 4¤:¨gÔ#6Ñ7Ô7Ð7ØŒ
�7Ô×!Ò!Ñ#Ô#Ð#Ð#Ð#r   c                ón  — |D ]j}|j         }|sŒ|d         }|dd…         D ]}|                      ||¦  «         Œ| j        |                      |¦  «                                      |¦  «         Œkg }| j                             ¦   «         D ]+\  }}||k    r |                     | j        |         ¦  «         Œ,|S )z;Splits block of nodes into sub-blocks over disjoint qubits.r   r   N)Úqargsr€   rv   rx   r$   ru   Úitems)r   r`   r%   ÚindicesÚfirstry   ÚblocksÚitems           r   rf   zBlockSplitter.run  sÖ   € àð 	=ð 	=ˆDØ”jˆGØð ØØ˜A”JˆEØ    œð 1ð 1�Ø×"Ò" 5¨%Ñ0Ô0Ð0Ð0ØŒJ�t×'Ò'¨Ñ.Ô.Ô/×6Ò6°tÑ<Ô<Ð<Ð<àˆØœ;×,Ò,Ñ.Ô.ð 	1ð 	1‰KˆE�4Ø˜Š}ˆ}Ø—’˜dœj¨Ô/Ñ0Ô0Ð0øàˆr   N)rn   ro   rp   rq   r   rx   r€   rf   r0   r   r   re   re   ÷   s\   € € € € € ðMð Mðð ð ð	"ð 	"ð 	"ð$ð $ð $ðð ð ð ð r   re   r`   rS   c                óð  ‡— i Šg }| D ]í}t          |j        ¦  «        }|                     |j        ¦  «         t	          |j        dd¦  «        }|�'|                     t          |¦  «        j        ¦  «         t          ˆfd„|D ¦   «         ¦  «        }t          |¦  «        |k    r(| 
                    g ¦  «         t          |¦  «        |k    °(|D ]
}|dz   ‰|<   Œ||          
                    |¦  «         Œî|S )zSplits a block of nodes into sub-blocks of non-overlapping instructions
    (or, in other words, into depth-1 sub-blocks).
    Ú
_conditionNc              3  óD   •K  — | ]}‰                      |d ¦  «        V — ŒdS )r   N)Úget)r3   ÚbitÚ
bit_depthss     €r   ú	<genexpr>z*split_block_into_layers.<locals>.<genexpr>9  s1   øè è € ÐCÐC°3˜
Ÿš s¨AÑ.Ô.ÐCÐCÐCÐCÐCÐCr   r   )Úsetr‚   ÚupdateÚcargsÚgetattrÚopr   ÚclbitsÚmaxr"   r$   )r`   Úlayersr%   Úcur_bitsÚcondÚ	cur_depthrŒ   r�   s          @r   rd   rd   *  s  ø€ ð "$€JØ13€Fàð 'ð 'ˆÝ�t”z‘?”?ˆØ�Š˜œ
Ñ#Ô#Ð#å�t”w ¨dÑ3Ô3ˆØÐØ�OŠOÕ/°Ñ5Ô5Ô<Ñ=Ô=Ð=åÐCÐCÐCÐC¸(ÐCÑCÔCÑCÔCˆ	Ý�&‰kŒk˜YÒ&Ð&Ø�MŠM˜"ÑÔÐõ �&‰kŒk˜YÒ&Ð&ð ð 	,ð 	,ˆCØ'¨!™mˆJ�s‰OˆOØˆyÔ× Ò  Ñ&Ô&Ð&Ð&à€Mr   c                  ó   — e Zd ZdZd„ Zd„ ZdS )ÚBlockCollapserzýThis class implements various strategies of consolidating blocks of nodes
     in a DAG (direct acyclic graph). It works both with the
    :class:`~qiskit.dagcircuit.DAGCircuit` and
    :class:`~qiskit.dagcircuit.DAGDependency` DAG representations.
    c                ó   — || _         dS )zZ
        Args:
            dag (Union[DAGCircuit, DAGDependency]): The input DAG.
        N)r   r   s     r   r   zBlockCollapser.__init__K  s   € ð ˆŒˆˆr   c           	     ó¶  ‡— d„ t          | j        j        ¦  «        D ¦   «         Š‰                     d„ t          | j        j        ¦  «        D ¦   «         ¦  «         |D �]õ}t          ¦   «         }t          ¦   «         }t          ¦   «         }|D ]«}|                     |j        ¦  «         |                     |j        ¦  «         t          |j	        dd¦  «        }|�]|                     t          |¦  «        j        ¦  «         t          |d         t          ¦  «        r|                     |d         ¦  «         Œ¬t          |ˆfd„¬¦  «        }	t          |ˆfd„¬¦  «        }
t          |	|
¦  «        }|D ]}|                     |¦  «         Œd	„ t          |	¦  «        D ¦   «         }|                     d
„ t          |
¦  «        D ¦   «         ¦  «         |D ]W}|                     t%          |j	        |j        |j        ¦  «        ¦  «        }t          |j	        dd¦  «        }|�
 |j        |Ž  ŒX ||¦  «        }| j                             |||d¬¦  «         �Œ÷| j        S )z«For each block, constructs a quantum circuit containing instructions in the block,
        then uses collapse_fn to collapse this circuit into a single operation.
        c                ó   — i | ]\  }}||“Œ	S r0   r0   ©r3   ÚidxÚwires      r   ú
<dictcomp>z8BlockCollapser.collapse_to_operation.<locals>.<dictcomp>W  s   € ÐRÐRÐR©)¨#¨t˜D #ÐRÐRÐRr   c                ó   — i | ]\  }}||“Œ	S r0   r0   rŸ   s      r   r¢   z8BlockCollapser.collapse_to_operation.<locals>.<dictcomp>X  s   € Ð WÐ WÐ W©y¨s°D  sÐ WÐ WÐ Wr   r‰   Nr   c                ó   •— ‰|          S rt   r0   ©ÚxÚglobal_index_maps    €r   ú<lambda>z6BlockCollapser.collapse_to_operation.<locals>.<lambda>n  ó   ø€ Ð=MÈaÔ=P€ r   )Úkeyc                ó   •— ‰|          S rt   r0   r¥   s    €r   r¨   z6BlockCollapser.collapse_to_operation.<locals>.<lambda>o  r©   r   c                ó   — i | ]\  }}||“Œ	S r0   r0   ©r3   ÚixÚqbs      r   r¢   z8BlockCollapser.collapse_to_operation.<locals>.<dictcomp>x  s   € ÐJÐJÐJ¡v r¨2˜B ÐJÐJÐJr   c                ó   — i | ]\  }}||“Œ	S r0   r0   r­   s      r   r¢   z8BlockCollapser.collapse_to_operation.<locals>.<dictcomp>y  s   € Ð OÐ OÐ O©F¨B°  RÐ OÐ OÐ Or   F)Úcycle_check)Ú	enumerater   Úqubitsr�   r”   r�   r‚   r‘   r’   r“   r   r   r	   ÚaddÚsortedr   Úadd_registerr$   r   Úc_ifÚreplace_block_with_op)r   r†   Úcollapse_fnr`   Ú
cur_qubitsÚ
cur_clbitsÚ
cur_clregsr%   r˜   Úsorted_qubitsÚsorted_clbitsÚqcÚregÚwire_pos_mapÚinstructionsr“   r§   s                   @r   Úcollapse_to_operationz$BlockCollapser.collapse_to_operationS  sy  ø€ ð SÐRµyÀÄÄÑ7QÔ7QÐRÑRÔRÐØ×ÒÐ WÐ W½IÀdÄhÄoÑ<VÔ<VÐ WÑ WÔ WÑXÔXÐXàð ,	Wñ ,	WˆEõ ™œˆJÝ™œˆJõ ™œˆJàð 0ð 0�Ø×!Ò! $¤*Ñ-Ô-Ð-Ø×!Ò! $¤*Ñ-Ô-Ð-Ý˜tœw¨°dÑ;Ô;�ØÐ#Ø×%Ò%Õ&9¸$Ñ&?Ô&?Ô&FÑGÔGÐGÝ! $ q¤'Õ+<Ñ=Ô=ð 0Ø"Ÿš t¨A¤wÑ/Ô/Ð/øõ # :Ð3PÐ3PÐ3PÐ3PÐQÑQÔQˆMÝ" :Ð3PÐ3PÐ3PÐ3PÐQÑQÔQˆMå ¨}Ñ=Ô=ˆBð "ð %ð %�Ø—’ Ñ$Ô$Ð$Ð$ð KÐJµ¸=Ñ1IÔ1IÐJÑJÔJˆLØ×ÒÐ OÐ OµiÀÑ6NÔ6NÐ OÑ OÔ OÑPÔPÐPàð -ð -�Ø!ŸyšyÕ);¸D¼GÀTÄZÐQUÔQ[Ñ)\Ô)\Ñ]Ô]�Ý˜tœw¨°dÑ;Ô;�ØÐ#Ø%�LÔ% tÐ,Ð,øð �˜R‘”ˆBð ŒH×*Ò*¨5°"°lÐPUÐ*ÑVÔVÐVÑVØŒxˆr   N)rn   ro   rp   rq   r   rÃ   r0   r   r   r›   r›   D  s<   € € € € € ðð ðð ð ð4ð 4ð 4ð 4ð 4r   r›   N)r`   rS   )rq   Ú
__future__r   Úcollections.abcr   r   Úqiskit.dagcircuitr   Úqiskit.circuitr   r   r	   r
   Úqiskit.circuit.controlflowr   Ú r   r   r   Ú
exceptionsr   r   re   rd   r›   r0   r   r   ú<module>rË      s[  ðð7ð 7à "Ð "Ð "Ð "Ð "Ð "à .Ð .Ð .Ð .Ð .Ð .Ð .Ð .à (Ð (Ð (Ð (Ð (Ð (à UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UØ :Ð :Ð :Ð :Ð :Ð :Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'ðXð Xð Xð Xð Xñ Xô Xð Xðv0ð 0ð 0ð 0ð 0ñ 0ô 0ð 0ðfð ð ð ð4Cð Cð Cð Cð Cñ Cô Cð Cð Cð Cr   