diff --git a/qualtran/bloqs/basic_gates/y_gate.py b/qualtran/bloqs/basic_gates/y_gate.py index 48ee1e591..5212bb5ca 100644 --- a/qualtran/bloqs/basic_gates/y_gate.py +++ b/qualtran/bloqs/basic_gates/y_gate.py @@ -13,7 +13,7 @@ # limitations under the License. from functools import cached_property -from typing import cast, Dict, Iterable, List, Optional, Sequence, Tuple, TYPE_CHECKING, Union +from typing import Dict, Iterable, List, Optional, Sequence, Tuple, TYPE_CHECKING, Union import numpy as np from attrs import frozen @@ -30,7 +30,6 @@ DecomposeTypeError, Register, Signature, - Soquet, SoquetT, ) from qualtran.drawing import Circle, Text, TextBox, WireSymbol @@ -175,32 +174,12 @@ def wire_symbol( raise ValueError(f"Unknown register {reg}.") def get_ctrl_system(self, ctrl_spec: 'CtrlSpec') -> Tuple['Bloq', 'AddControlledT']: - from qualtran.bloqs.mcmt.specialized_ctrl import _MultiControlledFromSinglyControlled + from qualtran.bloqs.mcmt.specialized_ctrl import get_ctrl_system_1bit_cv_from_bloqs - if ctrl_spec != CtrlSpec(): - return super().get_ctrl_system(ctrl_spec) - - # controlled-CY - ctrl_cy = _MultiControlledFromSinglyControlled( - cvs=(1, 1), ctrl_bloq=self, ctrl_reg_name='ctrl' + return get_ctrl_system_1bit_cv_from_bloqs( + self, ctrl_spec, current_ctrl_bit=1, bloq_with_ctrl=self, ctrl_reg_name='ctrl' ) - def _adder( - bb: 'BloqBuilder', ctrl_soqs: Sequence['SoquetT'], in_soqs: dict[str, 'SoquetT'] - ) -> Tuple[Iterable['SoquetT'], Iterable['SoquetT']]: - (ctrl1,) = ctrl_soqs - ctrl2 = in_soqs.pop('ctrl') - target = in_soqs.pop('target') - - ctrl1 = cast(Soquet, ctrl1) - ctrl2 = cast(Soquet, ctrl2) - - [ctrl1, ctrl2], target = bb.add(ctrl_cy, ctrl=[ctrl1, ctrl2], target=target) - - return [ctrl1], [ctrl2, target] - - return ctrl_cy, _adder - @bloq_example def _cy_gate() -> CYGate: diff --git a/qualtran/bloqs/basic_gates/z_basis.py b/qualtran/bloqs/basic_gates/z_basis.py index 88be22228..599acfc89 100644 --- a/qualtran/bloqs/basic_gates/z_basis.py +++ b/qualtran/bloqs/basic_gates/z_basis.py @@ -341,32 +341,12 @@ def wire_symbol(self, reg: Optional[Register], idx: Tuple[int, ...] = tuple()) - raise ValueError(f'Unknown wire symbol register name: {reg.name}') def get_ctrl_system(self, ctrl_spec: 'CtrlSpec') -> Tuple['Bloq', 'AddControlledT']: - from qualtran.bloqs.mcmt.specialized_ctrl import _MultiControlledFromSinglyControlled + from qualtran.bloqs.mcmt.specialized_ctrl import get_ctrl_system_1bit_cv_from_bloqs - if ctrl_spec != CtrlSpec(): - return super().get_ctrl_system(ctrl_spec) - - # controlled-CZ - ctrl_cz = _MultiControlledFromSinglyControlled( - cvs=(1, 1), ctrl_bloq=self, ctrl_reg_name='q1' + return get_ctrl_system_1bit_cv_from_bloqs( + self, ctrl_spec, current_ctrl_bit=1, bloq_with_ctrl=self, ctrl_reg_name='q1' ) - def _adder( - bb: 'BloqBuilder', ctrl_soqs: Sequence['SoquetT'], in_soqs: dict[str, 'SoquetT'] - ) -> Tuple[Iterable['SoquetT'], Iterable['SoquetT']]: - (ctrl,) = ctrl_soqs - q1 = in_soqs.pop('q1') - q2 = in_soqs.pop('q2') - - ctrl = cast(Soquet, ctrl) - q1 = cast(Soquet, q1) - - [ctrl, q1], q2 = bb.add(ctrl_cz, q1=[ctrl, q1], q2=q2) - - return [ctrl], [q1, q2] - - return ctrl_cz, _adder - @bloq_example def _cz() -> CZ: