def run(self, dag):
        """
        Flips the cx nodes to match the directed coupling map.
        Args:
            dag (DAGCircuit): DAG to map.
        Returns:
            DAGCircuit: The rearranged dag for the coupling map

        Raises:
            TranspilerError: If the circuit cannot be mapped just by flipping the
                cx nodes.
        """
        new_dag = DAGCircuit()

        if self.layout is None:
            # LegacySwap renames the register in the DAG and does not match the property set
            self.layout = Layout.generate_trivial_layout(*dag.qregs.values())

        for layer in dag.serial_layers():
            subdag = layer['graph']

            for cnot_node in subdag.named_nodes('cx', 'CX'):
                control = cnot_node.qargs[0]
                target = cnot_node.qargs[1]

                physical_q0 = self.layout[control]
                physical_q1 = self.layout[target]
                if self.coupling_map.distance(physical_q0, physical_q1) != 1:
                    raise TranspilerError('The circuit requires a connection between physical '
                                          'qubits %s and %s' % (physical_q0, physical_q1))

                if (physical_q0, physical_q1) not in self.coupling_map.get_edges():
                    # A flip needs to be done

                    # Create the involved registers
                    if control[0] not in subdag.qregs.values():
                        subdag.add_qreg(control[0])
                    if target[0] not in subdag.qregs.values():
                        subdag.add_qreg(target[0])

                    # Add H gates around
                    subdag.apply_operation_back(HGate(), [target], [])
                    subdag.apply_operation_back(HGate(), [control], [])
                    subdag.apply_operation_front(HGate(), [target], [])
                    subdag.apply_operation_front(HGate(), [control], [])

                    # Flips the CX
                    cnot_node.qargs[0], cnot_node.qargs[1] = target, control

            new_dag.extend_back(subdag)

        return new_dag
def run(self, dag):
        """
        Flips the cx nodes to match the directed coupling map.
        Args:
            dag (DAGCircuit): DAG to map.
        Returns:
            DAGCircuit: The rearranged dag for the coupling map

        Raises:
            TranspilerError: If the circuit cannot be mapped just by flipping the
                cx nodes.
        """
        new_dag = DAGCircuit()

        if self.layout is None:
            # LegacySwap renames the register in the DAG and does not match the property set
            self.layout = Layout.generate_trivial_layout(*dag.qregs.values())

        for layer in dag.serial_layers():
            subdag = layer['graph']

            for cnot_node in subdag.named_nodes('cx', 'CX'):
                control = cnot_node.qargs[0]
                target = cnot_node.qargs[1]

                physical_q0 = self.layout[control]
                physical_q1 = self.layout[target]
                if self.coupling_map.distance(physical_q0, physical_q1) != 1:
                    raise TranspilerError('The circuit requires a connection between physical '
                                          'qubits %s and %s' % (physical_q0, physical_q1))

                if (physical_q0, physical_q1) not in self.coupling_map.get_edges():
                    # A flip needs to be done

                    # Create the involved registers
                    if control[0] not in subdag.qregs.values():
                        subdag.add_qreg(control[0])
                    if target[0] not in subdag.qregs.values():
                        subdag.add_qreg(target[0])

                    # Add H gates around
                    subdag.apply_operation_back(HGate(), [target], [])
                    subdag.apply_operation_back(HGate(), [control], [])
                    subdag.apply_operation_front(HGate(), [target], [])
                    subdag.apply_operation_front(HGate(), [control], [])

                    # Flips the CX
                    cnot_node.qargs[0], cnot_node.qargs[1] = target, control

            new_dag.extend_back(subdag)

        return new_dag
def run ( self , dag ) : new_dag = DAGCircuit ( ) if self . layout is None : # LegacySwap renames the register in the DAG and does not match the property set self . layout = Layout . generate_trivial_layout ( * dag . qregs . values ( ) ) for layer in dag . serial_layers ( ) : subdag = layer [ 'graph' ] for cnot_node in subdag . named_nodes ( 'cx' , 'CX' ) : control = cnot_node . qargs [ 0 ] target = cnot_node . qargs [ 1 ] physical_q0 = self . layout [ control ] physical_q1 = self . layout [ target ] if self . coupling_map . distance ( physical_q0 , physical_q1 ) != 1 : raise TranspilerError ( 'The circuit requires a connection between physical ' 'qubits %s and %s' % ( physical_q0 , physical_q1 ) ) if ( physical_q0 , physical_q1 ) not in self . coupling_map . get_edges ( ) : # A flip needs to be done # Create the involved registers if control [ 0 ] not in subdag . qregs . values ( ) : subdag . add_qreg ( control [ 0 ] ) if target [ 0 ] not in subdag . qregs . values ( ) : subdag . add_qreg ( target [ 0 ] ) # Add H gates around subdag . apply_operation_back ( HGate ( ) , [ target ] , [ ] ) subdag . apply_operation_back ( HGate ( ) , [ control ] , [ ] ) subdag . apply_operation_front ( HGate ( ) , [ target ] , [ ] ) subdag . apply_operation_front ( HGate ( ) , [ control ] , [ ] ) # Flips the CX cnot_node . qargs [ 0 ] , cnot_node . qargs [ 1 ] = target , control new_dag . extend_back ( subdag ) return new_dag
Flips the cx nodes to match the directed coupling map.
        Args:
            dag (DAGCircuit): DAG to map.
        Returns:
            DAGCircuit: The rearranged dag for the coupling map

        Raises:
            TranspilerError: If the circuit cannot be mapped just by flipping the
                cx nodes.
Flips the cx nodes to match the directed coupling map . Args : dag ( DAGCircuit ) : DAG to map . Returns : DAGCircuit : The rearranged dag for the coupling map