From a4d160c9f402be417d1295939777478db003527f Mon Sep 17 00:00:00 2001
From: Anurudh Peduri <anurudhp97@gmail.com>
Date: Sat, 2 Nov 2024 19:40:13 +0100
Subject: [PATCH] simplify ctrl sys for CZ, CY

---
 qualtran/bloqs/basic_gates/y_gate.py  | 29 ++++-----------------------
 qualtran/bloqs/basic_gates/z_basis.py | 26 +++---------------------
 2 files changed, 7 insertions(+), 48 deletions(-)

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: