mimiqcircuits.decomposition.decompose

mimiqcircuits.decomposition.decompose(source, basis=None, wrap=False)[source]

Recursively decompose a circuit to a target basis.

Decomposes all operations in the source until they are terminal in the given basis. This is the main entry point for circuit decomposition.

Parameters:
  • source (Circuit | Instruction | Operation) – The circuit, instruction, or operation to decompose.

  • basis (DecompositionBasis | RewriteRule | None) – The target decomposition basis. If a RewriteRule is provided, it is wrapped in a RuleBasis. Defaults to CanonicalBasis.

  • wrap (bool) – If True, wrap non-terminal ops instead of flattening them into primitives. Gates become a GateCall to a GateDecl, shared between identical gates. Other operations, such as MeasureReset or MeasurePauli, become a Block holding their decomposition, whose gates are wrapped in turn. This produces a circuit with only terminal ops, GateCalls and Blocks.

Returns:

A new Circuit containing only terminal operations (and GateCalls and Blocks if wrap=True).

Return type:

Circuit

Example

>>> from mimiqcircuits import *
>>> from mimiqcircuits.decomposition import decompose, CanonicalBasis
>>> c = Circuit()
>>> c.push(GateH(), 0)
1-qubit circuit with 1 instruction:
└── H @ q[0]

>>> c.push(GateCCX(), 0, 1, 2)
3-qubit circuit with 2 instructions:
├── H @ q[0]
└── C₂X @ q[0:1], q[2]

>>> decomposed = decompose(c)
>>> # decomposed contains only GateU and GateCX

Using a specific basis:

>>> from mimiqcircuits.decomposition import CliffordTBasis
>>> decomposed = decompose(c, CliffordTBasis())

Using a rewrite rule directly:

>>> from mimiqcircuits.decomposition import ZYZRewrite
>>> decomposed = decompose(c, ZYZRewrite())