diff --git a/qiskit/converters/circuit_to_dag.py b/qiskit/converters/circuit_to_dag.py index 025ae8bf98a0..0d432ca947d9 100644 --- a/qiskit/converters/circuit_to_dag.py +++ b/qiskit/converters/circuit_to_dag.py @@ -7,8 +7,8 @@ """Helper function for converting a circuit to a dag""" -import copy - +from qiskit.circuit import Gate +from qiskit.circuit import Instruction from qiskit.dagcircuit.dagcircuit import DAGCircuit @@ -35,7 +35,33 @@ def circuit_to_dag(circuit): else: control = (instruction.control[0], instruction.control[1]) - instruction = copy.deepcopy(instruction) - dagcircuit.apply_operation_back(instruction, qargs, cargs, control) + def duplicate_instruction(inst): + """Create a fresh instruction from an input instruction.""" + if issubclass(inst.__class__, + Instruction) and inst.__class__ not in [ + Instruction, Gate]: + if inst.name == 'barrier': + new_inst = inst.__class__(inst.num_qubits) + elif inst.name == 'initialize': + params = getattr(inst, 'params', []) + new_inst = inst.__class__(params) + elif inst.name == 'snapshot': + label = inst.params[0] + snap_type = inst.params[1] + new_inst = inst.__class__(inst.num_qubits, inst.num_clbits, + label, snap_type) + else: + params = getattr(inst, 'params', []) + new_inst = inst.__class__(*params) + else: + new_inst = Instruction(name=inst.name, + num_qubits=inst.num_qubits, + num_clbits=inst.num_clbits, + params=inst.params) + new_inst.definition = inst.definition + return new_inst + + dagcircuit.apply_operation_back(duplicate_instruction(instruction), + qargs, cargs, control) return dagcircuit diff --git a/qiskit/converters/dag_to_circuit.py b/qiskit/converters/dag_to_circuit.py index 6b57e2c103c8..8ddd4726b0cb 100644 --- a/qiskit/converters/dag_to_circuit.py +++ b/qiskit/converters/dag_to_circuit.py @@ -6,11 +6,12 @@ # the LICENSE.txt file in the root directory of this source tree. """Helper function for converting a dag to a circuit""" -import copy import collections -from qiskit.circuit import QuantumCircuit from qiskit.circuit import ClassicalRegister +from qiskit.circuit import Instruction +from qiskit.circuit import Gate +from qiskit.circuit import QuantumCircuit from qiskit.circuit import QuantumRegister @@ -51,7 +52,34 @@ def dag_to_circuit(dag): else: control = (node.condition[0], node.condition[1]) - inst = copy.deepcopy(node.op) + def duplicate_instruction(inst): + """Create a fresh instruction from an input instruction.""" + if issubclass(inst.__class__, + Instruction) and inst.__class__ not in [ + Instruction, Gate]: + if inst.name == 'barrier': + new_inst = inst.__class__(inst.num_qubits) + elif inst.name == 'initialize': + params = getattr(inst, 'params', []) + new_inst = inst.__class__(params) + elif inst.name == 'snapshot': + label = inst.params[0] + snap_type = inst.params[1] + new_inst = inst.__class__(inst.num_qubits, + inst.num_clbits, + label, snap_type) + else: + params = getattr(inst, 'params', []) + new_inst = inst.__class__(*params) + else: + new_inst = Instruction(name=inst.name, + num_qubits=inst.num_qubits, + num_clbits=inst.num_clbits, + params=inst.params) + new_inst.definition = inst.definition + return new_inst + + inst = duplicate_instruction(node.op) inst.control = control circuit.append(inst, qubits, clbits)