diff --git a/qiskit/circuit/__init__.py b/qiskit/circuit/__init__.py index 0608765a1248..af306bb32b93 100644 --- a/qiskit/circuit/__init__.py +++ b/qiskit/circuit/__init__.py @@ -220,6 +220,7 @@ from .controlledgate import ControlledGate from .instruction import Instruction from .instructionset import InstructionSet +from .circuit_element import CircuitElement from .barrier import Barrier from .delay import Delay from .measure import Measure diff --git a/qiskit/circuit/instructionset.py b/qiskit/circuit/instructionset.py index 263800ddc7e2..bdec5450375a 100644 --- a/qiskit/circuit/instructionset.py +++ b/qiskit/circuit/instructionset.py @@ -16,6 +16,7 @@ from qiskit.circuit.exceptions import CircuitError from .instruction import Instruction from .classicalregister import Clbit +from .circuit_element import CircuitElement class InstructionSet: @@ -46,7 +47,7 @@ def __getitem__(self, i): def add(self, gate, qargs, cargs): """Add an instruction and its context (where it is attached).""" - if not isinstance(gate, Instruction): + if not isinstance(gate, CircuitElement): raise CircuitError("attempt to add non-Instruction" + " to InstructionSet") self.instructions.append(gate) self.qargs.append(qargs) diff --git a/qiskit/circuit/quantumcircuit.py b/qiskit/circuit/quantumcircuit.py index 2ca6e5ead696..a67d9ae1a2bb 100644 --- a/qiskit/circuit/quantumcircuit.py +++ b/qiskit/circuit/quantumcircuit.py @@ -56,6 +56,7 @@ from .delay import Delay from .measure import Measure from .reset import Reset +from .circuit_element import CircuitElement try: import pygments @@ -1124,7 +1125,7 @@ def cbit_argument_conversion(self, clbit_representation: ClbitSpecifier) -> List def append( self, - instruction: Instruction, + instruction: CircuitElement, qargs: Optional[Sequence[QubitSpecifier]] = None, cargs: Optional[Sequence[ClbitSpecifier]] = None, ) -> InstructionSet: @@ -1144,7 +1145,7 @@ def append( CircuitError: if object passed is neither subclass nor an instance of Instruction """ # Convert input to instruction - if not isinstance(instruction, Instruction) and not hasattr(instruction, "to_instruction"): + if not isinstance(instruction, CircuitElement) and not hasattr(instruction, "to_instruction"): if issubclass(instruction, Instruction): raise CircuitError( "Object is a subclass of Instruction, please add () to " @@ -1154,7 +1155,7 @@ def append( raise CircuitError( "Object to append must be an Instruction or have a to_instruction() method." ) - if not isinstance(instruction, Instruction) and hasattr(instruction, "to_instruction"): + if not isinstance(instruction, CircuitElement) and hasattr(instruction, "to_instruction"): instruction = instruction.to_instruction() # Make copy of parameterized gate instances @@ -1172,7 +1173,7 @@ def append( return instructions def _append( - self, instruction: Instruction, qargs: Sequence[Qubit], cargs: Sequence[Clbit] + self, instruction: CircuitElement, qargs: Sequence[Qubit], cargs: Sequence[Clbit] ) -> Instruction: """Append an instruction to the end of the circuit, modifying the circuit in place. @@ -1189,8 +1190,8 @@ def _append( CircuitError: if the gate is of a different shape than the wires it is being attached to. """ - if not isinstance(instruction, Instruction): - raise CircuitError("object is not an Instruction.") + if not isinstance(instruction, CircuitElement): + raise CircuitError("object is not a CircuitElement.") # do some compatibility checks self._check_dups(qargs) diff --git a/qiskit/quantum_info/operators/symplectic/clifford.py b/qiskit/quantum_info/operators/symplectic/clifford.py index 13dd35acec0d..809fd08c678e 100644 --- a/qiskit/quantum_info/operators/symplectic/clifford.py +++ b/qiskit/quantum_info/operators/symplectic/clifford.py @@ -16,7 +16,7 @@ import numpy as np from qiskit.exceptions import QiskitError -from qiskit.circuit import QuantumCircuit, Instruction +from qiskit.circuit import QuantumCircuit, Instruction, CircuitElement from qiskit.circuit.library.standard_gates import IGate, XGate, YGate, ZGate, HGate, SGate from qiskit.quantum_info.operators.base_operator import BaseOperator from qiskit.quantum_info.operators.operator import Operator @@ -27,7 +27,7 @@ from .clifford_circuits import _append_circuit -class Clifford(BaseOperator, AdjointMixin): +class Clifford(BaseOperator, AdjointMixin, CircuitElement): """An N-qubit unitary operator from the Clifford group. **Representation** @@ -525,6 +525,24 @@ def _pad_with_identity(self, clifford, qargs): return padded + # These implement the required methods of the CircuitElement mixin + + @property + def name(self): + return 'clifford' + + @property + def num_params(self): + return 1 + + @property + def num_clbits(self): + return 0 + + @property + def params(self): + return (self._table,) + # Update docstrings for API docs generate_apidocs(Clifford)