ControlledGate#

class qiskit.circuit.ControlledGate(name, num_qubits, params, label=None, num_ctrl_qubits=1, definition=None, ctrl_state=None, base_gate=None)[source]#

Bases : Gate

Controlled unitary gate.

Create a new ControlledGate. In the new gate the first num_ctrl_qubits of the gate are the controls.

Paramètres:
  • name (str) – The name of the gate.

  • num_qubits (int) – The number of qubits the gate acts on.

  • params (list) – A list of parameters for the gate.

  • label (Optional[str]) – An optional label for the gate.

  • num_ctrl_qubits (Optional[int]) – Number of control qubits.

  • definition (Optional['QuantumCircuit']) – A list of gate rules for implementing this gate. The elements of the list are tuples of (Gate(), [qubit_list], [clbit_list]).

  • ctrl_state (Optional[Union[int, str]]) – The control state in decimal or as a bitstring (e.g. “111”). If specified as a bitstring the length must equal num_ctrl_qubits, MSB on left. If None, use 2**num_ctrl_qubits-1.

  • base_gate (Optional[Gate]) – Gate object to be controlled.

Lève:
  • CircuitError – If num_ctrl_qubits >= num_qubits.

  • CircuitError – ctrl_state < 0 or ctrl_state > 2**num_ctrl_qubits.

Examples:

Create a controlled standard gate and apply it to a circuit.

from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit.library.standard_gates import HGate

qr = QuantumRegister(3)
qc = QuantumCircuit(qr)
c3h_gate = HGate().control(2)
qc.append(c3h_gate, qr)
qc.draw('mpl')

(Source code)

../_images/qiskit-circuit-ControlledGate-1.png

Create a controlled custom gate and apply it to a circuit.

from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit.library.standard_gates import HGate

qc1 = QuantumCircuit(2)
qc1.x(0)
qc1.h(1)
custom = qc1.to_gate().control(2)

qc2 = QuantumCircuit(4)
qc2.append(custom, [0, 3, 1, 2])
qc2.draw('mpl')

(Source code)

../_images/qiskit-circuit-ControlledGate-2.png

Attributes

condition_bits#

Get Clbits in condition.

ctrl_state#

Return the control state of the gate as a decimal integer.

decompositions#

Get the decompositions of the instruction from the SessionEquivalenceLibrary.

definition#

Return definition in terms of other basic gates. If the gate has open controls, as determined from self.ctrl_state, the returned definition is conjugated with X without changing the internal _definition.

duration#

Get the duration.

label#

Return instruction label

name#

Get name of gate. If the gate has open controls the gate name will become:

<original_name_o<ctrl_state>

where <original_name> is the gate name for the default case of closed control qubits and <ctrl_state> is the integer value of the control state for the gate.

num_clbits#

Return the number of clbits.

num_ctrl_qubits#

Get number of control qubits.

Renvoie:

The number of control qubits for the gate.

Type renvoyé:

int

num_qubits#

Return the number of qubits.

params#

Get parameters from base_gate.

Renvoie:

List of gate parameters.

Type renvoyé:

list

Lève:

CircuitError – Controlled gate does not define a base gate

unit#

Get the time unit of duration.

Methods

add_decomposition(decomposition)#

Add a decomposition of the instruction to the SessionEquivalenceLibrary.

assemble()#

Assemble a QasmQobjInstruction

broadcast_arguments(qargs, cargs)#

Validation and handling of the arguments and its relationship.

For example, cx([q[0],q[1]], q[2]) means cx(q[0], q[2]); cx(q[1], q[2]). This method yields the arguments in the right grouping. In the given example:

in: [[q[0],q[1]], q[2]],[]
outs: [q[0], q[2]], []
      [q[1], q[2]], []

The general broadcasting rules are:

  • If len(qargs) == 1:

    [q[0], q[1]] -> [q[0]],[q[1]]
    
  • If len(qargs) == 2:

    [[q[0], q[1]], [r[0], r[1]]] -> [q[0], r[0]], [q[1], r[1]]
    [[q[0]], [r[0], r[1]]]       -> [q[0], r[0]], [q[0], r[1]]
    [[q[0], q[1]], [r[0]]]       -> [q[0], r[0]], [q[1], r[0]]
    
  • If len(qargs) >= 3:

    [q[0], q[1]], [r[0], r[1]],  ...] -> [q[0], r[0], ...], [q[1], r[1], ...]
    
Paramètres:
  • qargs (list) – List of quantum bit arguments.

  • cargs (list) – List of classical bit arguments.

Renvoie:

A tuple with single arguments.

Lève:

CircuitError – If the input is not valid. For example, the number of arguments does not match the gate expectation.

Type renvoyé:

Iterable[tuple[list, list]]

c_if(classical, val)#

Set a classical equality condition on this instruction between the register or cbit classical and value val.

Note

This is a setter method, not an additive one. Calling this multiple times will silently override any previously set condition; it does not stack.

control(num_ctrl_qubits=1, label=None, ctrl_state=None)#

Return controlled version of gate. See ControlledGate for usage.

Paramètres:
  • num_ctrl_qubits (int) – number of controls to add to gate (default: 1)

  • label (str | None) – optional gate label

  • ctrl_state (int | str | None) – The control state in decimal or as a bitstring (e.g. '111'). If None, use 2**num_ctrl_qubits-1.

Renvoie:

Controlled version of gate. This default algorithm uses num_ctrl_qubits-1 ancilla qubits so returns a gate of size num_qubits + 2*num_ctrl_qubits - 1.

Type renvoyé:

qiskit.circuit.ControlledGate

Lève:

QiskitError – unrecognized mode or invalid ctrl_state

copy(name=None)#

Copy of the instruction.

Paramètres:

name (str) – name to be given to the copied circuit, if None then the name stays the same.

Renvoie:

a copy of the current instruction, with the name updated if it was provided

Type renvoyé:

qiskit.circuit.Instruction

inverse()[source]#

Invert this gate by calling inverse on the base gate.

Type renvoyé:

ControlledGate

is_parameterized()#

Return True .IFF. instruction is parameterized else False

power(exponent)#

Creates a unitary gate as gate^exponent.

Paramètres:

exponent (float) – Gate^exponent

Renvoie:

To which to_matrix is self.to_matrix^exponent.

Type renvoyé:

qiskit.extensions.UnitaryGate

Lève:

CircuitError – If Gate is not unitary

qasm()#

Return a default OpenQASM string for the instruction.

Derived instructions may override this to print in a different format (e.g. measure q[0] -> c[0];).

Obsolète depuis la version 0.25.0: The method qiskit.circuit.instruction.Instruction.qasm() is deprecated as of qiskit-terra 0.25.0. It will be removed no earlier than 3 months after the release date. Correct exporting to OpenQASM 2 is the responsibility of a larger exporter; it cannot safely be done on an object-by-object basis without context. No replacement will be provided, because the premise is wrong.

repeat(n)#

Creates an instruction with gate repeated n amount of times.

Paramètres:

n (int) – Number of times to repeat the instruction

Renvoie:

Containing the definition.

Type renvoyé:

qiskit.circuit.Instruction

Lève:

CircuitError – If n < 1.

reverse_ops()#

For a composite instruction, reverse the order of sub-instructions.

This is done by recursively reversing all sub-instructions. It does not invert any gate.

Renvoie:

a new instruction with

sub-instructions reversed.

Type renvoyé:

qiskit.circuit.Instruction

soft_compare(other)#

Soft comparison between gates. Their names, number of qubits, and classical bit numbers must match. The number of parameters must match. Each parameter is compared. If one is a ParameterExpression then it is not taken into account.

Paramètres:

other (instruction) – other instruction.

Renvoie:

are self and other equal up to parameter expressions.

Type renvoyé:

bool

to_matrix()#

Return a Numpy.array for the gate unitary matrix.

Renvoie:

if the Gate subclass has a matrix definition.

Type renvoyé:

np.ndarray

Lève:

CircuitError – If a Gate subclass does not implement this method an exception will be raised when this base class method is called.

validate_parameter(parameter)#

Gate parameters should be int, float, or ParameterExpression