def dag_to_circuit(dag): """Build a ``QuantumCircuit`` object from a ``DAGCircuit``. Args: dag (DAGCircuit): the input dag. Return: QuantumCircuit: the circuit representing the input dag. """ circuit = QuantumCircuit() random_name = QuantumCircuit.cls_prefix() + \ str(''.join(random.choice(string.ascii_lowercase) for i in range(8))) circuit.name = dag.name or random_name for qreg in dag.qregs.values(): circuit.add_register(qreg) for creg in dag.cregs.values(): circuit.add_register(creg) graph = dag.multi_graph for node in nx.topological_sort(graph): n = graph.nodes[node] if n['type'] == 'op': op = deepcopy(n['op']) op.qargs = n['qargs'] op.cargs = n['cargs'] op.circuit = circuit if 'condition' in n and n['condition']: op = op.c_if(*n['condition']) circuit._attach(op) return circuit
def dag_to_circuit(dag): """Build a ``QuantumCircuit`` object from a ``DAGCircuit``. Args: dag (DAGCircuit): the input dag. Return: QuantumCircuit: the circuit representing the input dag. """ qregs = collections.OrderedDict() for qreg in dag.qregs.values(): qreg_tmp = QuantumRegister(qreg.size, name=qreg.name) qregs[qreg.name] = qreg_tmp cregs = collections.OrderedDict() for creg in dag.cregs.values(): creg_tmp = ClassicalRegister(creg.size, name=creg.name) cregs[creg.name] = creg_tmp name = dag.name or None circuit = QuantumCircuit(*qregs.values(), *cregs.values(), name=name) for node in dag.node_nums_in_topological_order(): n = dag.node(node) if n['type'] == 'op': qubits = [] for qubit in n['qargs']: qubits.append(qregs[qubit[0].name][qubit[1]]) clbits = [] for clbit in n['cargs']: clbits.append(cregs[clbit[0].name][clbit[1]]) # Get arguments for classical control (if any) if n['condition'] is None: control = None else: control = (n['condition'][0], n['condition'][1]) def duplicate_instruction(inst): """Create a fresh instruction from an input instruction.""" if inst.name == 'barrier': params = [inst.qargs] elif inst.name == 'snapshot': params = inst.params + [inst.qargs] else: params = inst.params + inst.qargs + inst.cargs new_inst = inst.__class__(*params) return new_inst inst = duplicate_instruction(n['op']) inst.control = control circuit._attach(inst) return circuit