Source code for guppyft.decompose._passes
from dataclasses import dataclass
from typing import Any, no_type_check
from guppylang import guppy
from guppylang.std.quantum import cx, h, qubit, t, tdg
from hugr import Hugr
from hugr.passes.composable import ComposablePass, PassResult, implement_pass_run
from hugr.passes.scope import PassScope
from hugr.std import _std_extensions
from guppyft.encode import ReplacementCompiler
@guppy
@no_type_check
def _toffoli_decomposition(ctrl0: qubit, ctrl1: qubit, target: qubit) -> None:
h(target)
cx(ctrl1, target)
tdg(target)
cx(ctrl0, target)
t(target)
cx(ctrl1, target)
tdg(target)
cx(ctrl0, target)
t(ctrl1)
t(target)
h(target)
cx(ctrl0, ctrl1)
t(ctrl0)
tdg(ctrl1)
cx(ctrl0, ctrl1)
[docs]
@dataclass(frozen=True)
class ToffoliDecomposer(ComposablePass):
"""Decomposes Toffoli gates into Clifford+T gates. Each Toffoli uses 7 T gates."""
[docs]
def run(self, hugr: Hugr[Any], *, inplace: bool = True) -> PassResult:
return implement_pass_run(
self,
hugr=hugr,
inplace=inplace,
copy_call=lambda _hugr: self._run_impl(_hugr),
)
def _run_impl(self, hugr: Hugr[Any]) -> PassResult:
compiler = ReplacementCompiler(
op_replacements={},
compound_op_replacements={
("tket.quantum", "Toffoli"): _toffoli_decomposition
},
extensions=_std_extensions(),
)
[module] = compiler.compile(hugr.to_package()).modules
return PassResult.for_pass(self, hugr=module, inplace=False, result=None)
[docs]
def with_scope(self, scope: PassScope) -> ComposablePass:
return self