# UnitaryGate

*class *`qiskit.extensions.UnitaryGate(data, label=None)`

Bases: `Gate`

Class quantum gates specified by a unitary matrix.

**Example**

We can create a unitary gate from a unitary matrix then add it to a quantum circuit. The matrix can also be directly applied to the quantum circuit, see `QuantumCircuit.unitary()`

.

```
from qiskit import QuantumCircuit
from qiskit.extensions import UnitaryGate
matrix = [[0, 0, 0, 1],
[0, 0, 1, 0],
[1, 0, 0, 0],
[0, 1, 0, 0]]
gate = UnitaryGate(matrix)
circuit = QuantumCircuit(2)
circuit.append(gate, [0, 1])
```

Create a gate from a numeric unitary matrix.

**Parameters**

**data**(*matrix or**Operator*) – unitary operator.**label**(*str*(opens in a new tab)) – unitary name for backend [Default: None].

**Raises**

**ExtensionError** – if input data is not an N-qubit unitary operator.

## Attributes

### condition_bits

Get Clbits in condition.

### decompositions

Get the decompositions of the instruction from the SessionEquivalenceLibrary.

### definition

Return definition in terms of other basic gates.

### duration

Get the duration.

### label

Return instruction label

### name

Return the name.

### num_clbits

Return the number of clbits.

### num_qubits

Return the number of qubits.

### params

return instruction params.

### unit

Get the time unit of duration.

## Methods

### add_decomposition

`add_decomposition(decomposition)`

Add a decomposition of the instruction to the SessionEquivalenceLibrary.

### adjoint

`adjoint()`

Return the adjoint of the unitary.

### assemble

`assemble()`

Assemble a QasmQobjInstruction

### broadcast_arguments

`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], ...]`

**Parameters**

**qargs**(*list*(opens in a new tab)) – List of quantum bit arguments.**cargs**(*list*(opens in a new tab)) – List of classical bit arguments.

**Returns**

A tuple with single arguments.

**Raises**

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

**Return type**

*Iterable*(opens in a new tab)[tuple(opens in a new tab)[list(opens in a new tab), list(opens in a new tab)]]

### c_if

`c_if(classical, val)`

Set a classical equality condition on this instruction between the register or cbit `classical`

and value `val`

.

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

### conjugate

`conjugate()`

Return the conjugate of the unitary.

### control

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

Return controlled version of gate

**Parameters**

**num_ctrl_qubits**(*int*(opens in a new tab)) – number of controls to add to gate (default=1)**label**(*str*(opens in a new tab)) – optional gate label**ctrl_state**(*int*(opens in a new tab)*or**str*(opens in a new tab)*or None*) – The control state in decimal or as a bit string (e.g. ‘1011’). If None, use 2**num_ctrl_qubits-1.

**Returns**

controlled version of gate.

**Return type**

**Raises**

**QiskitError**– Invalid ctrl_state.**ExtensionError**– Non-unitary controlled unitary.

### copy

`copy(name=None)`

Copy of the instruction.

**Parameters**

**name** (*str*(opens in a new tab)) – name to be given to the copied circuit, if `None`

then the name stays the same.

**Returns**

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

**Return type**

### inverse

`inverse()`

Return the adjoint of the unitary.

### is_parameterized

`is_parameterized()`

Return True .IFF. instruction is parameterized else False

### power

`power(exponent)`

Creates a unitary gate as gate^exponent.

**Parameters**

**exponent** (*float*(opens in a new tab)) – Gate^exponent

**Returns**

To which to_matrix is self.to_matrix^exponent.

**Return type**

**Raises**

**CircuitError** – If Gate is not unitary

### qasm

`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];`

).

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

`repeat(n)`

Creates an instruction with gate repeated n amount of times.

**Parameters**

**n** (*int*(opens in a new tab)) – Number of times to repeat the instruction

**Returns**

Containing the definition.

**Return type**

**Raises**

**CircuitError** – If n < 1.

### reverse_ops

`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.

**Returns**

**a new instruction with**

sub-instructions reversed.

**Return type**

### soft_compare

`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.

**Parameters**

**other** (*instruction*) – other instruction.

**Returns**

are self and other equal up to parameter expressions.

**Return type**

### to_matrix

`to_matrix()`

Return a Numpy.array for the gate unitary matrix.

**Returns**

if the Gate subclass has a matrix definition.

**Return type**

np.ndarray

**Raises**

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

### transpose

`transpose()`

Return the transpose of the unitary.

### validate_parameter

`validate_parameter(parameter)`

Unitary gate parameter has to be an ndarray.