From c424b24c42e646c6b51bcdd7076249091376164d Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Tue, 17 Dec 2024 14:35:34 +0000
Subject: [PATCH 01/44] initial attempt at CircBox handling

---
 pytket/extensions/qiskit/qiskit_convert.py | 37 ++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index 0a84eee1..3c5d5f9c 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -82,6 +82,7 @@
     Parameter,
     ParameterExpression,
     Reset,
+    IfElseOp,
 )
 from qiskit.circuit.library import (
     CRYGate,
@@ -478,6 +479,37 @@ def _build_circbox(instr: Instruction, circuit: QuantumCircuit) -> CircBox:
     subc.name = instr.name
     return CircBox(subc)
 
+from pytket.circuit.display import view_browser as draw
+
+
+# TODO refactor to reduce duplication
+def _pytket_boxes_from_IfElseOp(instr: Instruction) -> tuple[CircBox, CircBox]:
+    if_qc: QuantumCircuit = instr.params[0]
+    else_qc: QuantumCircuit = instr.params[1]
+
+    default_qreg_if  = QuantumRegister(if_qc.num_qubits, "q")
+    default_creg_if  = ClassicalRegister(if_qc.num_clbits, "c")
+    default_qreg_else  = QuantumRegister(else_qc.num_qubits, "q")
+    default_creg_else  = ClassicalRegister(else_qc.num_clbits, "c")
+
+    new_if_qc = QuantumCircuit(default_qreg_if, default_creg_if)
+    new_else_qc = QuantumCircuit(default_qreg_else, default_creg_else)
+
+    if_builder = CircuitBuilder(new_if_qc.qregs, new_if_qc.cregs)
+    if_builder.add_qiskit_data(new_if_qc)
+    if_circuit = if_builder.circuit()
+    if_circuit.name = "If"
+
+
+    else_builder = CircuitBuilder(new_else_qc.qregs, new_else_qc.cregs)
+    else_builder.add_qiskit_data(new_else_qc)
+    else_circuit = else_builder.circuit()
+    else_circuit.name = "Else"
+
+    return CircBox(if_circuit), CircBox(else_circuit)
+
+
+
 
 class CircuitBuilder:
     def __init__(
@@ -523,6 +555,11 @@ def add_qiskit_data(
 
             condition_kwargs = {}
             if instr.condition is not None:
+                if type(instr) is IfElseOp:
+                    if_box, else_box = _pytket_boxes_from_IfElseOp(instr)
+                    draw(if_box.get_circuit())
+                    draw(else_box.get_circuit())
+
                 condition_kwargs = _get_pytket_condition_kwargs(
                     instruction=instr,
                     cregmap=self.cregmap,

From 3b9189ae595b25b53deaaaa240f492cda108fe26 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Tue, 17 Dec 2024 14:36:10 +0000
Subject: [PATCH 02/44] add temporary if-else test

---
 if-else.py | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)
 create mode 100644 if-else.py

diff --git a/if-else.py b/if-else.py
new file mode 100644
index 00000000..037d6081
--- /dev/null
+++ b/if-else.py
@@ -0,0 +1,32 @@
+from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
+from qiskit.circuit import IfElseOp
+
+qubits = QuantumRegister(2)
+clbits = ClassicalRegister(2)
+circuit = QuantumCircuit(qubits, clbits)
+(q0, q1) = qubits
+(c0, c1) = clbits
+ 
+circuit.h(q0)
+circuit.measure(q0, c0)
+
+with circuit.if_test((c0, 1)) as else_:
+    circuit.h(q1)
+with else_:
+    circuit.x(q1)
+circuit.measure(q1, c1)
+
+#print(circuit)
+
+
+from pytket.extensions.qiskit import qiskit_to_tk
+for datum in (circuit.data):
+    instr, qargs, cargs = datum.operation, datum.qubits, datum.clbits
+    if type(instr) is IfElseOp:
+        if_qc: QuantumCircuit = instr.params[0]
+        #print(if_qc.qregs)
+        #print(if_qc)
+        #tkc = qiskit_to_tk(if_qc)
+        #print(tkc.get_commands())
+
+tkc = qiskit_to_tk(circuit)

From 692506f50f2827cefd03358b9f2479edf14baf80 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Tue, 17 Dec 2024 14:43:00 +0000
Subject: [PATCH 03/44] try adding data for conditional subcircuits

---
 pytket/extensions/qiskit/qiskit_convert.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index 3c5d5f9c..0eb2535d 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -496,13 +496,13 @@ def _pytket_boxes_from_IfElseOp(instr: Instruction) -> tuple[CircBox, CircBox]:
     new_else_qc = QuantumCircuit(default_qreg_else, default_creg_else)
 
     if_builder = CircuitBuilder(new_if_qc.qregs, new_if_qc.cregs)
-    if_builder.add_qiskit_data(new_if_qc)
+    if_builder.add_qiskit_data(if_qc)
     if_circuit = if_builder.circuit()
     if_circuit.name = "If"
 
 
     else_builder = CircuitBuilder(new_else_qc.qregs, new_else_qc.cregs)
-    else_builder.add_qiskit_data(new_else_qc)
+    else_builder.add_qiskit_data(else_qc)
     else_circuit = else_builder.circuit()
     else_circuit.name = "Else"
 

From 9be4d45abc164b4aa18906ca5f42f6087c2786b6 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Tue, 17 Dec 2024 14:46:28 +0000
Subject: [PATCH 04/44] add a proper test

---
 if-else.py                   | 32 --------------------------------
 tests/qiskit_convert_test.py | 19 +++++++++++++++++++
 2 files changed, 19 insertions(+), 32 deletions(-)
 delete mode 100644 if-else.py

diff --git a/if-else.py b/if-else.py
deleted file mode 100644
index 037d6081..00000000
--- a/if-else.py
+++ /dev/null
@@ -1,32 +0,0 @@
-from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
-from qiskit.circuit import IfElseOp
-
-qubits = QuantumRegister(2)
-clbits = ClassicalRegister(2)
-circuit = QuantumCircuit(qubits, clbits)
-(q0, q1) = qubits
-(c0, c1) = clbits
- 
-circuit.h(q0)
-circuit.measure(q0, c0)
-
-with circuit.if_test((c0, 1)) as else_:
-    circuit.h(q1)
-with else_:
-    circuit.x(q1)
-circuit.measure(q1, c1)
-
-#print(circuit)
-
-
-from pytket.extensions.qiskit import qiskit_to_tk
-for datum in (circuit.data):
-    instr, qargs, cargs = datum.operation, datum.qubits, datum.clbits
-    if type(instr) is IfElseOp:
-        if_qc: QuantumCircuit = instr.params[0]
-        #print(if_qc.qregs)
-        #print(if_qc)
-        #tkc = qiskit_to_tk(if_qc)
-        #print(tkc.get_commands())
-
-tkc = qiskit_to_tk(circuit)
diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index c3ca48da..6e7c1e11 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1189,3 +1189,22 @@ def test_nonregister_bits() -> None:
     c.rename_units({Bit(0): Bit(1)})
     with pytest.raises(NotImplementedError):
         tk_to_qiskit(c)
+
+
+def test_ifelseop_handling() -> None:
+    qubits = QuantumRegister(2)
+    clbits = ClassicalRegister(2)
+    circuit = QuantumCircuit(qubits, clbits)
+    (q0, q1) = qubits
+    (c0, c1) = clbits
+    
+    circuit.h(q0)
+    circuit.measure(q0, c0)
+
+    with circuit.if_test((c0, 1)) as else_:
+        circuit.h(q1)
+    with else_:
+        circuit.x(q1)
+    circuit.measure(q1, c1)
+
+    tkc = qiskit_to_tk(circuit)

From 80dddbee8b95eeddb025f25ae9e9926cc4cea832 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Tue, 17 Dec 2024 14:47:24 +0000
Subject: [PATCH 05/44] cleanup

---
 pytket/extensions/qiskit/qiskit_convert.py | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index 0eb2535d..ac93ab07 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -479,9 +479,6 @@ def _build_circbox(instr: Instruction, circuit: QuantumCircuit) -> CircBox:
     subc.name = instr.name
     return CircBox(subc)
 
-from pytket.circuit.display import view_browser as draw
-
-
 # TODO refactor to reduce duplication
 def _pytket_boxes_from_IfElseOp(instr: Instruction) -> tuple[CircBox, CircBox]:
     if_qc: QuantumCircuit = instr.params[0]
@@ -557,8 +554,8 @@ def add_qiskit_data(
             if instr.condition is not None:
                 if type(instr) is IfElseOp:
                     if_box, else_box = _pytket_boxes_from_IfElseOp(instr)
-                    draw(if_box.get_circuit())
-                    draw(else_box.get_circuit())
+                    print(if_box.get_circuit().get_commands())
+                    print(else_box.get_circuit().get_commands())
 
                 condition_kwargs = _get_pytket_condition_kwargs(
                     instruction=instr,

From e38ca3e03776ffba57525454b9bd26ab14dfd091 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Tue, 17 Dec 2024 14:48:03 +0000
Subject: [PATCH 06/44] add another TODO

---
 pytket/extensions/qiskit/qiskit_convert.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index ac93ab07..17e74dca 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -484,6 +484,7 @@ def _pytket_boxes_from_IfElseOp(instr: Instruction) -> tuple[CircBox, CircBox]:
     if_qc: QuantumCircuit = instr.params[0]
     else_qc: QuantumCircuit = instr.params[1]
 
+    # TODO handle non-simple register case?
     default_qreg_if  = QuantumRegister(if_qc.num_qubits, "q")
     default_creg_if  = ClassicalRegister(if_qc.num_clbits, "c")
     default_qreg_else  = QuantumRegister(else_qc.num_qubits, "q")

From 3843234e87e0c890e9bc3ee8f3b716f120248583 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Tue, 17 Dec 2024 14:58:57 +0000
Subject: [PATCH 07/44] formatting

---
 pytket/extensions/qiskit/qiskit_convert.py | 12 +++++-------
 tests/qiskit_convert_test.py               |  2 +-
 2 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index 17e74dca..a910d5b5 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -479,16 +479,17 @@ def _build_circbox(instr: Instruction, circuit: QuantumCircuit) -> CircBox:
     subc.name = instr.name
     return CircBox(subc)
 
+
 # TODO refactor to reduce duplication
 def _pytket_boxes_from_IfElseOp(instr: Instruction) -> tuple[CircBox, CircBox]:
     if_qc: QuantumCircuit = instr.params[0]
     else_qc: QuantumCircuit = instr.params[1]
 
     # TODO handle non-simple register case?
-    default_qreg_if  = QuantumRegister(if_qc.num_qubits, "q")
-    default_creg_if  = ClassicalRegister(if_qc.num_clbits, "c")
-    default_qreg_else  = QuantumRegister(else_qc.num_qubits, "q")
-    default_creg_else  = ClassicalRegister(else_qc.num_clbits, "c")
+    default_qreg_if = QuantumRegister(if_qc.num_qubits, "q")
+    default_creg_if = ClassicalRegister(if_qc.num_clbits, "c")
+    default_qreg_else = QuantumRegister(else_qc.num_qubits, "q")
+    default_creg_else = ClassicalRegister(else_qc.num_clbits, "c")
 
     new_if_qc = QuantumCircuit(default_qreg_if, default_creg_if)
     new_else_qc = QuantumCircuit(default_qreg_else, default_creg_else)
@@ -498,7 +499,6 @@ def _pytket_boxes_from_IfElseOp(instr: Instruction) -> tuple[CircBox, CircBox]:
     if_circuit = if_builder.circuit()
     if_circuit.name = "If"
 
-
     else_builder = CircuitBuilder(new_else_qc.qregs, new_else_qc.cregs)
     else_builder.add_qiskit_data(else_qc)
     else_circuit = else_builder.circuit()
@@ -507,8 +507,6 @@ def _pytket_boxes_from_IfElseOp(instr: Instruction) -> tuple[CircBox, CircBox]:
     return CircBox(if_circuit), CircBox(else_circuit)
 
 
-
-
 class CircuitBuilder:
     def __init__(
         self,
diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index 6e7c1e11..9155042a 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1197,7 +1197,7 @@ def test_ifelseop_handling() -> None:
     circuit = QuantumCircuit(qubits, clbits)
     (q0, q1) = qubits
     (c0, c1) = clbits
-    
+
     circuit.h(q0)
     circuit.measure(q0, c0)
 

From 09a0ca22bd0f1c1396c37d6c2e9a001e015ba905 Mon Sep 17 00:00:00 2001
From: Melf <cqc@melf.de>
Date: Tue, 17 Dec 2024 16:30:32 +0000
Subject: [PATCH 08/44] try if else with register from qiskit circuit

---
 pytket/extensions/qiskit/qiskit_convert.py | 23 +++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index a910d5b5..a1f028cf 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -481,25 +481,24 @@ def _build_circbox(instr: Instruction, circuit: QuantumCircuit) -> CircBox:
 
 
 # TODO refactor to reduce duplication
-def _pytket_boxes_from_IfElseOp(instr: Instruction) -> tuple[CircBox, CircBox]:
+def _pytket_boxes_from_IfElseOp(
+    qregs: list[QuantumRegister], cregs: list[ClassicalRegister], instr: Instruction
+) -> tuple[CircBox, CircBox]:
     if_qc: QuantumCircuit = instr.params[0]
     else_qc: QuantumCircuit = instr.params[1]
 
     # TODO handle non-simple register case?
-    default_qreg_if = QuantumRegister(if_qc.num_qubits, "q")
-    default_creg_if = ClassicalRegister(if_qc.num_clbits, "c")
-    default_qreg_else = QuantumRegister(else_qc.num_qubits, "q")
-    default_creg_else = ClassicalRegister(else_qc.num_clbits, "c")
+    # default_qreg_if = QuantumRegister(if_qc.num_qubits, "q")
+    # default_creg_if = ClassicalRegister(if_qc.num_clbits, "c")
+    # default_qreg_else = QuantumRegister(else_qc.num_qubits, "q")
+    # default_creg_else = ClassicalRegister(else_qc.num_clbits, "c")
 
-    new_if_qc = QuantumCircuit(default_qreg_if, default_creg_if)
-    new_else_qc = QuantumCircuit(default_qreg_else, default_creg_else)
-
-    if_builder = CircuitBuilder(new_if_qc.qregs, new_if_qc.cregs)
+    if_builder = CircuitBuilder(qregs, cregs)
     if_builder.add_qiskit_data(if_qc)
     if_circuit = if_builder.circuit()
     if_circuit.name = "If"
 
-    else_builder = CircuitBuilder(new_else_qc.qregs, new_else_qc.cregs)
+    else_builder = CircuitBuilder(qregs, cregs)
     else_builder.add_qiskit_data(else_qc)
     else_circuit = else_builder.circuit()
     else_circuit.name = "Else"
@@ -552,7 +551,9 @@ def add_qiskit_data(
             condition_kwargs = {}
             if instr.condition is not None:
                 if type(instr) is IfElseOp:
-                    if_box, else_box = _pytket_boxes_from_IfElseOp(instr)
+                    if_box, else_box = _pytket_boxes_from_IfElseOp(
+                        self.qregs, self.cregs, instr
+                    )
                     print(if_box.get_circuit().get_commands())
                     print(else_box.get_circuit().get_commands())
 

From 96d9efd9b9866eb1a2b9f79d18502302df489655 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Tue, 17 Dec 2024 23:05:19 +0000
Subject: [PATCH 09/44] minor cleanup

---
 pytket/extensions/qiskit/qiskit_convert.py | 6 ------
 tests/qiskit_convert_test.py               | 1 +
 2 files changed, 1 insertion(+), 6 deletions(-)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index 5cb241f9..42a3c0b7 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -487,12 +487,6 @@ def _pytket_boxes_from_IfElseOp(
     if_qc: QuantumCircuit = instr.params[0]
     else_qc: QuantumCircuit = instr.params[1]
 
-    # TODO handle non-simple register case?
-    # default_qreg_if = QuantumRegister(if_qc.num_qubits, "q")
-    # default_creg_if = ClassicalRegister(if_qc.num_clbits, "c")
-    # default_qreg_else = QuantumRegister(else_qc.num_qubits, "q")
-    # default_creg_else = ClassicalRegister(else_qc.num_clbits, "c")
-
     if_builder = CircuitBuilder(qregs, cregs)
     if_builder.add_qiskit_data(if_qc)
     if_circuit = if_builder.circuit()
diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index a8b1a32a..ca924f09 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1192,6 +1192,7 @@ def test_nonregister_bits() -> None:
     with pytest.raises(NotImplementedError):
         tk_to_qiskit(c)
 
+
 def test_ifelseop_handling() -> None:
     qubits = QuantumRegister(2)
     clbits = ClassicalRegister(2)

From 65186287c4a50f4971c56174a5d5d400e3f61da7 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Wed, 18 Dec 2024 00:02:03 +0000
Subject: [PATCH 10/44] more progress on circuit building (still gives
 RuntimeError)

---
 pytket/extensions/qiskit/qiskit_convert.py | 44 ++++++++++++++++++----
 1 file changed, 36 insertions(+), 8 deletions(-)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index 42a3c0b7..16188c3f 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -480,12 +480,11 @@ def _build_circbox(instr: Instruction, circuit: QuantumCircuit) -> CircBox:
     return CircBox(subc)
 
 
-# TODO refactor to reduce duplication
 def _pytket_boxes_from_IfElseOp(
-    qregs: list[QuantumRegister], cregs: list[ClassicalRegister], instr: Instruction
+    if_else_op: IfElseOp, qregs: list[QuantumRegister], cregs: list[ClassicalRegister]
 ) -> tuple[CircBox, CircBox]:
-    if_qc: QuantumCircuit = instr.params[0]
-    else_qc: QuantumCircuit = instr.params[1]
+    if_qc: QuantumCircuit = if_else_op.params[0]
+    else_qc: QuantumCircuit = if_else_op.params[1]
 
     if_builder = CircuitBuilder(qregs, cregs)
     if_builder.add_qiskit_data(if_qc)
@@ -500,6 +499,32 @@ def _pytket_boxes_from_IfElseOp(
     return CircBox(if_circuit), CircBox(else_circuit)
 
 
+def build_if_else_circuit(
+    if_else_op: IfElseOp,
+    qregs: list[QuantumRegister],
+    cregs: list[ClassicalRegister],
+    qubits: list[Qubit],
+    bits: list[Bit],
+) -> Circuit:
+    if_box, else_box = _pytket_boxes_from_IfElseOp(if_else_op, qregs, cregs)
+    circ_builder = CircuitBuilder(qregs, cregs)
+    circ = circ_builder.circuit()
+    circ.add_circbox(
+        if_box,
+        qubits,
+        bits,
+        if_else_op.condition[1],
+    )
+    circ.add_circbox(
+        else_box,
+        qubits,
+        bits,
+        # TODO negate condition properly
+        1 - if_else_op.condition[1],
+    )
+    return circ
+
+
 class CircuitBuilder:
     def __init__(
         self,
@@ -545,11 +570,14 @@ def add_qiskit_data(
             condition_kwargs = {}
             if instr.condition is not None:
                 if type(instr) is IfElseOp:
-                    if_box, else_box = _pytket_boxes_from_IfElseOp(
-                        self.qregs, self.cregs, instr
+                    if_else_circ = build_if_else_circuit(
+                        if_else_op=instr,
+                        qregs=self.qregs,
+                        cregs=self.cregs,
+                        qubits=qubits,
+                        bits=bits,
                     )
-                    print(if_box.get_circuit().get_commands())
-                    print(else_box.get_circuit().get_commands())
+                    self.tkc.append(if_else_circ)
 
                 condition_kwargs = _get_pytket_condition_kwargs(
                     instruction=instr,

From f87d814a2a5a78fcbbe88ef08a5cc8dfb18c9be1 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Wed, 18 Dec 2024 00:32:19 +0000
Subject: [PATCH 11/44] try to fix kwargs

---
 pytket/extensions/qiskit/qiskit_convert.py | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index 16188c3f..64bf42c1 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -76,13 +76,13 @@
     Clbit,
     ControlledGate,
     Gate,
+    IfElseOp,
     Instruction,
     InstructionSet,
     Measure,
     Parameter,
     ParameterExpression,
     Reset,
-    IfElseOp,
 )
 from qiskit.circuit.library import (
     CRYGate,
@@ -510,17 +510,17 @@ def build_if_else_circuit(
     circ_builder = CircuitBuilder(qregs, cregs)
     circ = circ_builder.circuit()
     circ.add_circbox(
-        if_box,
-        qubits,
-        bits,
-        if_else_op.condition[1],
+        circbox=if_box,
+        args=qubits,
+        condition_bits=bits,
+        condition_value=if_else_op.condition[1],
     )
     circ.add_circbox(
-        else_box,
-        qubits,
-        bits,
+        circbox=else_box,
+        args=qubits,
+        condition_bits=bits,
         # TODO negate condition properly
-        1 - if_else_op.condition[1],
+        condition_value=0,
     )
     return circ
 

From 816e2bdc86c79efe6ee2dadbea6501c17b9714d3 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Wed, 18 Dec 2024 00:57:01 +0000
Subject: [PATCH 12/44] update test

---
 tests/qiskit_convert_test.py | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index ca924f09..303d6047 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1193,6 +1193,9 @@ def test_nonregister_bits() -> None:
         tk_to_qiskit(c)
 
 
+from pytket.circuit.display import view_browser as draw
+
+
 def test_ifelseop_handling() -> None:
     qubits = QuantumRegister(2)
     clbits = ClassicalRegister(2)
@@ -1210,6 +1213,7 @@ def test_ifelseop_handling() -> None:
     circuit.measure(q1, c1)
 
     tkc = qiskit_to_tk(circuit)
+    assert tkc.n_gates_of_type(OpType.Conditional) == 2
 
 
 def test_range_preds_with_conditionals():

From 2ff1b6f694449a8f23c34a14e29a4dd9c5fb5e9d Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Wed, 18 Dec 2024 00:58:37 +0000
Subject: [PATCH 13/44] remove import

---
 tests/qiskit_convert_test.py | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index 303d6047..47525019 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1193,9 +1193,6 @@ def test_nonregister_bits() -> None:
         tk_to_qiskit(c)
 
 
-from pytket.circuit.display import view_browser as draw
-
-
 def test_ifelseop_handling() -> None:
     qubits = QuantumRegister(2)
     clbits = ClassicalRegister(2)

From ea62c0b20ef20557b501789e4595a6df3d68cecd Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Wed, 18 Dec 2024 11:36:56 +0000
Subject: [PATCH 14/44] push latest attempt

---
 pytket/extensions/qiskit/qiskit_convert.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index 64bf42c1..55df9d7e 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -511,7 +511,7 @@ def build_if_else_circuit(
     circ = circ_builder.circuit()
     circ.add_circbox(
         circbox=if_box,
-        args=qubits,
+        args=qubits + bits,
         condition_bits=bits,
         condition_value=if_else_op.condition[1],
     )

From 73dc681ec4a1fb9266066d3d397b3f53977b6d43 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Tue, 31 Dec 2024 10:41:40 +0000
Subject: [PATCH 15/44] naming fixes

---
 pytket/extensions/qiskit/qiskit_convert.py | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index 55df9d7e..0889d3d8 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -480,11 +480,11 @@ def _build_circbox(instr: Instruction, circuit: QuantumCircuit) -> CircBox:
     return CircBox(subc)
 
 
-def _pytket_boxes_from_IfElseOp(
+def _pytket_boxes_from_ifelseop(
     if_else_op: IfElseOp, qregs: list[QuantumRegister], cregs: list[ClassicalRegister]
 ) -> tuple[CircBox, CircBox]:
-    if_qc: QuantumCircuit = if_else_op.params[0]
-    else_qc: QuantumCircuit = if_else_op.params[1]
+    if_qc: QuantumCircuit = if_else_op.blocks[0]
+    else_qc: QuantumCircuit = if_else_op.blocks[1]
 
     if_builder = CircuitBuilder(qregs, cregs)
     if_builder.add_qiskit_data(if_qc)
@@ -506,7 +506,7 @@ def build_if_else_circuit(
     qubits: list[Qubit],
     bits: list[Bit],
 ) -> Circuit:
-    if_box, else_box = _pytket_boxes_from_IfElseOp(if_else_op, qregs, cregs)
+    if_box, else_box = _pytket_boxes_from_ifelseop(if_else_op, qregs, cregs)
     circ_builder = CircuitBuilder(qregs, cregs)
     circ = circ_builder.circuit()
     circ.add_circbox(

From d65a347292a0238499dde5a10abb6442543ec745 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Tue, 31 Dec 2024 11:27:53 +0000
Subject: [PATCH 16/44] a little more progress

---
 pytket/extensions/qiskit/qiskit_convert.py | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index 0889d3d8..a8446522 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -490,11 +490,13 @@ def _pytket_boxes_from_ifelseop(
     if_builder.add_qiskit_data(if_qc)
     if_circuit = if_builder.circuit()
     if_circuit.name = "If"
+    if_circuit.remove_blank_wires()
 
     else_builder = CircuitBuilder(qregs, cregs)
     else_builder.add_qiskit_data(else_qc)
     else_circuit = else_builder.circuit()
     else_circuit.name = "Else"
+    else_circuit.remove_blank_wires()
 
     return CircBox(if_circuit), CircBox(else_circuit)
 
@@ -509,9 +511,10 @@ def build_if_else_circuit(
     if_box, else_box = _pytket_boxes_from_ifelseop(if_else_op, qregs, cregs)
     circ_builder = CircuitBuilder(qregs, cregs)
     circ = circ_builder.circuit()
+
     circ.add_circbox(
         circbox=if_box,
-        args=qubits + bits,
+        args=qubits,
         condition_bits=bits,
         condition_value=if_else_op.condition[1],
     )
@@ -586,7 +589,7 @@ def add_qiskit_data(
                 )
 
             optype = None
-            if type(instr) not in (PauliEvolutionGate, UnitaryGate):
+            if type(instr) not in (PauliEvolutionGate, UnitaryGate, IfElseOp):
                 # Handling of PauliEvolutionGate and UnitaryGate below
                 optype = _optype_from_qiskit_instruction(instruction=instr)
 

From 52458ab1ed7e9c43392347cb563d24cddf56050c Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Tue, 31 Dec 2024 11:46:25 +0000
Subject: [PATCH 17/44] refactor: handle IfElseOp separately

---
 pytket/extensions/qiskit/qiskit_convert.py | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index 0ae7d590..ad257bd6 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -571,17 +571,7 @@ def add_qiskit_data(
             bits: list[Bit] = [self.cbmap[bit] for bit in cargs]
 
             condition_kwargs = {}
-            if instr.condition is not None:
-                if type(instr) is IfElseOp:
-                    if_else_circ = build_if_else_circuit(
-                        if_else_op=instr,
-                        qregs=self.qregs,
-                        cregs=self.cregs,
-                        qubits=qubits,
-                        bits=bits,
-                    )
-                    self.tkc.append(if_else_circ)
-
+            if instr.condition is not None and type(instr) is not IfElseOp:
                 condition_kwargs = _get_pytket_condition_kwargs(
                     instruction=instr,
                     cregmap=self.cregmap,
@@ -602,6 +592,16 @@ def add_qiskit_data(
                 # Append OpType found by stateprep helpers
                 _add_state_preparation(self.tkc, qubits, instr)
 
+            elif type(instr) is IfElseOp:
+                if_else_circ = build_if_else_circuit(
+                    if_else_op=instr,
+                    qregs=self.qregs,
+                    cregs=self.cregs,
+                    qubits=qubits,
+                    bits=bits,
+                )
+                self.tkc.append(if_else_circ)
+
             elif type(instr) is PauliEvolutionGate:
                 qpo = _qpo_from_peg(instr, qubits)
                 empty_circ = Circuit(len(qargs))

From 8e1edce8c1067e69369f1cf99bab8d72bb3eeb38 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Tue, 31 Dec 2024 12:32:09 +0000
Subject: [PATCH 18/44] make circuit builder function private

---
 pytket/extensions/qiskit/qiskit_convert.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index ad257bd6..9e4cb3e0 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -501,7 +501,7 @@ def _pytket_boxes_from_ifelseop(
     return CircBox(if_circuit), CircBox(else_circuit)
 
 
-def build_if_else_circuit(
+def _build_if_else_circuit(
     if_else_op: IfElseOp,
     qregs: list[QuantumRegister],
     cregs: list[ClassicalRegister],
@@ -580,7 +580,7 @@ def add_qiskit_data(
 
             optype = None
             if type(instr) not in (PauliEvolutionGate, UnitaryGate, IfElseOp):
-                # Handling of PauliEvolutionGate and UnitaryGate below
+                # Handling of PauliEvolutionGate UnitaryGate and IfElseOp below
                 optype = _optype_from_qiskit_instruction(instruction=instr)
 
             if optype == OpType.QControlBox:
@@ -593,7 +593,7 @@ def add_qiskit_data(
                 _add_state_preparation(self.tkc, qubits, instr)
 
             elif type(instr) is IfElseOp:
-                if_else_circ = build_if_else_circuit(
+                if_else_circ = _build_if_else_circuit(
                     if_else_op=instr,
                     qregs=self.qregs,
                     cregs=self.cregs,

From 4b382b0ff3af9cb5cd5e9604e33ae33f8749e62b Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Thu, 2 Jan 2025 13:13:40 +0000
Subject: [PATCH 19/44] add a test case for a single branch

---
 tests/qiskit_convert_test.py | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index 9c54f8a8..dd4bf602 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1193,7 +1193,7 @@ def test_nonregister_bits() -> None:
         tk_to_qiskit(c)
 
 
-def test_ifelseop_handling() -> None:
+def test_ifelseop_two_branches() -> None:
     qubits = QuantumRegister(2)
     clbits = ClassicalRegister(2)
     circuit = QuantumCircuit(qubits, clbits)
@@ -1213,6 +1213,26 @@ def test_ifelseop_handling() -> None:
     assert tkc.n_gates_of_type(OpType.Conditional) == 2
 
 
+from pytket.circuit.display import view_browser as draw
+
+
+def test_ifelseop_one_branch() -> None:
+    qubits = QuantumRegister(1)
+    clbits = ClassicalRegister(1)
+    circuit = QuantumCircuit(qubits, clbits)
+    (q0,) = qubits
+    (c0,) = clbits
+
+    circuit.h(q0)
+    circuit.measure(q0, c0)
+    with circuit.if_test((c0, 1)):
+        circuit.x(q0)
+    circuit.measure(q0, c0)
+
+    tket_circ = qiskit_to_tk(circuit)
+    draw(tket_circ)
+
+
 def test_range_preds_with_conditionals() -> None:
     # https://github.com/CQCL/pytket-qiskit/issues/375
     c = Circuit(1, 1)

From 4729114671abfb22fe7a8c5388eebf8776147eb7 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Thu, 2 Jan 2025 13:14:10 +0000
Subject: [PATCH 20/44] handle the single branch case

---
 pytket/extensions/qiskit/qiskit_convert.py | 33 ++++++++++++----------
 1 file changed, 18 insertions(+), 15 deletions(-)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index 9e4cb3e0..7c6933f6 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -482,9 +482,8 @@ def _build_circbox(instr: Instruction, circuit: QuantumCircuit) -> CircBox:
 
 def _pytket_boxes_from_ifelseop(
     if_else_op: IfElseOp, qregs: list[QuantumRegister], cregs: list[ClassicalRegister]
-) -> tuple[CircBox, CircBox]:
+) -> tuple[CircBox, Optional[CircBox]]:
     if_qc: QuantumCircuit = if_else_op.blocks[0]
-    else_qc: QuantumCircuit = if_else_op.blocks[1]
 
     if_builder = CircuitBuilder(qregs, cregs)
     if_builder.add_qiskit_data(if_qc)
@@ -492,13 +491,16 @@ def _pytket_boxes_from_ifelseop(
     if_circuit.name = "If"
     if_circuit.remove_blank_wires()
 
-    else_builder = CircuitBuilder(qregs, cregs)
-    else_builder.add_qiskit_data(else_qc)
-    else_circuit = else_builder.circuit()
-    else_circuit.name = "Else"
-    else_circuit.remove_blank_wires()
+    if len(if_else_op.blocks) == 2:
+        else_qc: QuantumCircuit = if_else_op.blocks[1]
+        else_builder = CircuitBuilder(qregs, cregs)
+        else_builder.add_qiskit_data(else_qc)
+        else_circuit = else_builder.circuit()
+        else_circuit.name = "Else"
+        else_circuit.remove_blank_wires()
+        return CircBox(if_circuit), CircBox(else_circuit)
 
-    return CircBox(if_circuit), CircBox(else_circuit)
+    return CircBox(if_circuit), None
 
 
 def _build_if_else_circuit(
@@ -518,13 +520,14 @@ def _build_if_else_circuit(
         condition_bits=bits,
         condition_value=if_else_op.condition[1],
     )
-    circ.add_circbox(
-        circbox=else_box,
-        args=qubits,
-        condition_bits=bits,
-        # TODO negate condition properly
-        condition_value=0,
-    )
+    if else_box is not None:
+        circ.add_circbox(
+            circbox=else_box,
+            args=qubits,
+            condition_bits=bits,
+            # TODO negate condition properly
+            condition_value=0,
+        )
     return circ
 
 

From f69aa0424e2336267d00aafb0ce1110e9c88c39d Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Thu, 2 Jan 2025 13:33:53 +0000
Subject: [PATCH 21/44] improve validation for single branch case

---
 tests/qiskit_convert_test.py | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index dd4bf602..42e5a7cb 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1230,7 +1230,25 @@ def test_ifelseop_one_branch() -> None:
     circuit.measure(q0, c0)
 
     tket_circ = qiskit_to_tk(circuit)
-    draw(tket_circ)
+    tket_circ.name = "test_circ"
+
+    expected_circ = Circuit()
+    expected_circ.name = "test_circ"
+    q1 = expected_circ.add_q_register("q1", 1)
+    c0_tk = expected_circ.add_c_register("c0", 1)
+    expected_circ.H(q1[0])
+    expected_circ.Measure(q1[0], c0_tk[0])
+    x_circ = Circuit()
+    x_circ.name = "If"
+    xq1 = x_circ.add_q_register("q1", 1)
+    x_circ.X(xq1[0])
+    expected_circ.add_circbox(
+        CircBox(x_circ), [q1[0]], condition_bits=[c0_tk[0]], condition_value=1
+    )
+
+    expected_circ.Measure(q1[0], c0_tk[0])
+
+    assert tket_circ == expected_circ
 
 
 def test_range_preds_with_conditionals() -> None:

From 8573082c58f04bb83c9957d4342a64293a7ce590 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Thu, 2 Jan 2025 13:42:31 +0000
Subject: [PATCH 22/44] fix import

---
 tests/qiskit_convert_test.py | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index 42e5a7cb..70263295 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1213,9 +1213,6 @@ def test_ifelseop_two_branches() -> None:
     assert tkc.n_gates_of_type(OpType.Conditional) == 2
 
 
-from pytket.circuit.display import view_browser as draw
-
-
 def test_ifelseop_one_branch() -> None:
     qubits = QuantumRegister(1)
     clbits = ClassicalRegister(1)

From 4d311f399a85e67b63119aeba134104261743368 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Thu, 2 Jan 2025 14:00:48 +0000
Subject: [PATCH 23/44] add some comments

---
 pytket/extensions/qiskit/qiskit_convert.py | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index 7c6933f6..8d452c4f 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -480,17 +480,23 @@ def _build_circbox(instr: Instruction, circuit: QuantumCircuit) -> CircBox:
     return CircBox(subc)
 
 
+# Used for handling of IfElseOp
+# docs -> https://docs.quantum.ibm.com/api/qiskit/qiskit.circuit.IfElseOp
+# Examples -> https://docs.quantum.ibm.com/guides/classical-feedforward-and-control-flow
 def _pytket_boxes_from_ifelseop(
     if_else_op: IfElseOp, qregs: list[QuantumRegister], cregs: list[ClassicalRegister]
 ) -> tuple[CircBox, Optional[CircBox]]:
+    # Extract the QuantumCircuit implementing true_body
     if_qc: QuantumCircuit = if_else_op.blocks[0]
 
     if_builder = CircuitBuilder(qregs, cregs)
     if_builder.add_qiskit_data(if_qc)
     if_circuit = if_builder.circuit()
     if_circuit.name = "If"
+    # Remove blank wires to ensure CircBox is the correct size.
     if_circuit.remove_blank_wires()
 
+    # The false_body arg is optional
     if len(if_else_op.blocks) == 2:
         else_qc: QuantumCircuit = if_else_op.blocks[1]
         else_builder = CircuitBuilder(qregs, cregs)
@@ -500,6 +506,8 @@ def _pytket_boxes_from_ifelseop(
         else_circuit.remove_blank_wires()
         return CircBox(if_circuit), CircBox(else_circuit)
 
+    # If no false_body is specified IfElseOp.blocks is of length 1.
+    # In this case we return a CircBox implementing true_body and None.
     return CircBox(if_circuit), None
 
 
@@ -510,7 +518,10 @@ def _build_if_else_circuit(
     qubits: list[Qubit],
     bits: list[Bit],
 ) -> Circuit:
+    # Get two CircBox objects which implement the true_body and false_body.
     if_box, else_box = _pytket_boxes_from_ifelseop(if_else_op, qregs, cregs)
+    # else_box can be None if no false_body is specified.
+
     circ_builder = CircuitBuilder(qregs, cregs)
     circ = circ_builder.circuit()
 
@@ -520,13 +531,14 @@ def _build_if_else_circuit(
         condition_bits=bits,
         condition_value=if_else_op.condition[1],
     )
+    # If we have an else_box defined, add it to the circuit
     if else_box is not None:
         circ.add_circbox(
             circbox=else_box,
             args=qubits,
             condition_bits=bits,
-            # TODO negate condition properly
-            condition_value=0,
+            # TODO: handle conditions over multiple bits/registers?
+            condition_value=not bool(if_else_op.condition[1]),
         )
     return circ
 

From eec8fe5dac2a1389d68b9738748965b78228e5a9 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Thu, 2 Jan 2025 15:20:34 +0000
Subject: [PATCH 24/44] add comments to test, change variable name

---
 tests/qiskit_convert_test.py | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index 70263295..88d6b8ee 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1226,9 +1226,11 @@ def test_ifelseop_one_branch() -> None:
         circuit.x(q0)
     circuit.measure(q0, c0)
 
-    tket_circ = qiskit_to_tk(circuit)
-    tket_circ.name = "test_circ"
+    tket_circ_if_else = qiskit_to_tk(circuit)
+    tket_circ_if_else.name = "test_circ"
 
+    # Manually build the expected pytket Circuit.
+    # Validate against tket_circ.
     expected_circ = Circuit()
     expected_circ.name = "test_circ"
     q1 = expected_circ.add_q_register("q1", 1)
@@ -1245,7 +1247,7 @@ def test_ifelseop_one_branch() -> None:
 
     expected_circ.Measure(q1[0], c0_tk[0])
 
-    assert tket_circ == expected_circ
+    assert tket_circ_if_else == expected_circ
 
 
 def test_range_preds_with_conditionals() -> None:

From 9d66595d66ed89f3d5c015525ca23f1e42f579de Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Thu, 2 Jan 2025 15:32:30 +0000
Subject: [PATCH 25/44] attempt to debug C.I. test case issue

---
 tests/qiskit_convert_test.py | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index 88d6b8ee..cf796679 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1214,8 +1214,8 @@ def test_ifelseop_two_branches() -> None:
 
 
 def test_ifelseop_one_branch() -> None:
-    qubits = QuantumRegister(1)
-    clbits = ClassicalRegister(1)
+    qubits = QuantumRegister(1, "q1")
+    clbits = ClassicalRegister(1, "c1")
     circuit = QuantumCircuit(qubits, clbits)
     (q0,) = qubits
     (c0,) = clbits
@@ -1225,16 +1225,17 @@ def test_ifelseop_one_branch() -> None:
     with circuit.if_test((c0, 1)):
         circuit.x(q0)
     circuit.measure(q0, c0)
-
+    print(circuit)
     tket_circ_if_else = qiskit_to_tk(circuit)
     tket_circ_if_else.name = "test_circ"
+    print(tket_circ_if_else.get_commands())
 
     # Manually build the expected pytket Circuit.
     # Validate against tket_circ.
     expected_circ = Circuit()
     expected_circ.name = "test_circ"
     q1 = expected_circ.add_q_register("q1", 1)
-    c0_tk = expected_circ.add_c_register("c0", 1)
+    c0_tk = expected_circ.add_c_register("c1", 1)
     expected_circ.H(q1[0])
     expected_circ.Measure(q1[0], c0_tk[0])
     x_circ = Circuit()

From 4b4b40a94ef0864267813a0173dc75ed50bcdbd6 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Thu, 2 Jan 2025 15:41:45 +0000
Subject: [PATCH 26/44] remove debug prints

---
 tests/qiskit_convert_test.py | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index cf796679..c126d10b 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1225,10 +1225,9 @@ def test_ifelseop_one_branch() -> None:
     with circuit.if_test((c0, 1)):
         circuit.x(q0)
     circuit.measure(q0, c0)
-    print(circuit)
+
     tket_circ_if_else = qiskit_to_tk(circuit)
     tket_circ_if_else.name = "test_circ"
-    print(tket_circ_if_else.get_commands())
 
     # Manually build the expected pytket Circuit.
     # Validate against tket_circ.

From 7950e77dc6e2df8b09d31bf97f3cd6c0b35707f2 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Thu, 2 Jan 2025 15:59:11 +0000
Subject: [PATCH 27/44] correct some comments

---
 pytket/extensions/qiskit/qiskit_convert.py | 2 +-
 tests/qiskit_convert_test.py               | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index 8d452c4f..e98643e1 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -595,7 +595,7 @@ def add_qiskit_data(
 
             optype = None
             if type(instr) not in (PauliEvolutionGate, UnitaryGate, IfElseOp):
-                # Handling of PauliEvolutionGate UnitaryGate and IfElseOp below
+                # Handling of PauliEvolutionGate, UnitaryGate and IfElseOp below
                 optype = _optype_from_qiskit_instruction(instruction=instr)
 
             if optype == OpType.QControlBox:
diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index c126d10b..ddd98ca5 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1230,7 +1230,7 @@ def test_ifelseop_one_branch() -> None:
     tket_circ_if_else.name = "test_circ"
 
     # Manually build the expected pytket Circuit.
-    # Validate against tket_circ.
+    # Validate against tket_circ_if_else.
     expected_circ = Circuit()
     expected_circ.name = "test_circ"
     q1 = expected_circ.add_q_register("q1", 1)

From 25bfcd5e1629caecd7a8d674d1dac30fc5964203 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Thu, 2 Jan 2025 17:36:04 +0000
Subject: [PATCH 28/44] update changelog

---
 docs/changelog.md | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/docs/changelog.md b/docs/changelog.md
index 8e56bfa6..51b758fc 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -4,6 +4,10 @@
 
 # Changelog
 
+## 0.63.0 (January 2025) - UNRELEASED
+
+- Support conversion of qiskit circuits containing `IfElseOp` in the {py:func}`qiskit_to_tk` converter.
+
 ## 0.62.0 (December 2024)
 
 - AerBackend now rejects circuits with too many qubits

From ae6cbfed507614c332525dc4294509cc6e6cd7e7 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Thu, 2 Jan 2025 18:03:44 +0000
Subject: [PATCH 29/44] Better varible names for testing

---
 tests/qiskit_convert_test.py | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index ddd98ca5..24e04196 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1233,19 +1233,19 @@ def test_ifelseop_one_branch() -> None:
     # Validate against tket_circ_if_else.
     expected_circ = Circuit()
     expected_circ.name = "test_circ"
-    q1 = expected_circ.add_q_register("q1", 1)
-    c0_tk = expected_circ.add_c_register("c1", 1)
-    expected_circ.H(q1[0])
-    expected_circ.Measure(q1[0], c0_tk[0])
+    q1_tk = expected_circ.add_q_register("q1", 1)
+    c1_tk = expected_circ.add_c_register("c1", 1)
+    expected_circ.H(q1_tk[0])
+    expected_circ.Measure(q1_tk[0], c1_tk[0])
     x_circ = Circuit()
     x_circ.name = "If"
     xq1 = x_circ.add_q_register("q1", 1)
     x_circ.X(xq1[0])
     expected_circ.add_circbox(
-        CircBox(x_circ), [q1[0]], condition_bits=[c0_tk[0]], condition_value=1
+        CircBox(x_circ), [q1_tk[0]], condition_bits=[c1_tk[0]], condition_value=1
     )
 
-    expected_circ.Measure(q1[0], c0_tk[0])
+    expected_circ.Measure(q1_tk[0], c1_tk[0])
 
     assert tket_circ_if_else == expected_circ
 

From e479c3e5b49925999171f507bdff58177aa83e95 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Thu, 2 Jan 2025 18:05:04 +0000
Subject: [PATCH 30/44] link to issue

---
 pytket/extensions/qiskit/qiskit_convert.py | 1 +
 tests/qiskit_convert_test.py               | 2 ++
 2 files changed, 3 insertions(+)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index e98643e1..fc3bed74 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -483,6 +483,7 @@ def _build_circbox(instr: Instruction, circuit: QuantumCircuit) -> CircBox:
 # Used for handling of IfElseOp
 # docs -> https://docs.quantum.ibm.com/api/qiskit/qiskit.circuit.IfElseOp
 # Examples -> https://docs.quantum.ibm.com/guides/classical-feedforward-and-control-flow
+# pytket-qiskit issue -> https://github.com/CQCL/pytket-qiskit/issues/415
 def _pytket_boxes_from_ifelseop(
     if_else_op: IfElseOp, qregs: list[QuantumRegister], cregs: list[ClassicalRegister]
 ) -> tuple[CircBox, Optional[CircBox]]:
diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index 24e04196..d6bb7b52 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1193,6 +1193,7 @@ def test_nonregister_bits() -> None:
         tk_to_qiskit(c)
 
 
+# https://github.com/CQCL/pytket-qiskit/issues/415
 def test_ifelseop_two_branches() -> None:
     qubits = QuantumRegister(2)
     clbits = ClassicalRegister(2)
@@ -1213,6 +1214,7 @@ def test_ifelseop_two_branches() -> None:
     assert tkc.n_gates_of_type(OpType.Conditional) == 2
 
 
+# https://github.com/CQCL/pytket-qiskit/issues/415
 def test_ifelseop_one_branch() -> None:
     qubits = QuantumRegister(1, "q1")
     clbits = ClassicalRegister(1, "c1")

From 83b50e71df5d04f8dfe14a422cce41898097243f Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Thu, 16 Jan 2025 13:36:18 +0000
Subject: [PATCH 31/44] extend test

---
 tests/qiskit_convert_test.py | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index 1676c045..ab273985 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1212,6 +1212,13 @@ def test_ifelseop_two_branches() -> None:
 
     tkc = qiskit_to_tk(circuit)
     assert tkc.n_gates_of_type(OpType.Conditional) == 2
+    if_cond, else_cond = tuple(tkc.commands_of_type(OpType.Conditional))
+
+    if_circ = if_cond.op.op.get_circuit()
+    else_circ = else_cond.op.op.get_circuit()
+
+    assert if_circ.n_gates == if_circ.n_gates_of_type(OpType.H) == 1
+    assert else_circ.n_gates == else_circ.n_gates_of_type(OpType.X) == 1
 
 
 # https://github.com/CQCL/pytket-qiskit/issues/415

From 84e7fc11f754392c528b9942647f04bd22d079b0 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Thu, 16 Jan 2025 13:50:27 +0000
Subject: [PATCH 32/44] expand test (annoying failure)

---
 tests/qiskit_convert_test.py | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index ab273985..91f6a06b 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1195,11 +1195,11 @@ def test_nonregister_bits() -> None:
 
 # https://github.com/CQCL/pytket-qiskit/issues/415
 def test_ifelseop_two_branches() -> None:
-    qubits = QuantumRegister(2)
-    clbits = ClassicalRegister(2)
-    circuit = QuantumCircuit(qubits, clbits)
-    (q0, q1) = qubits
-    (c0, c1) = clbits
+    qreg = QuantumRegister(2, "r")
+    creg = ClassicalRegister(2, "s")
+    circuit = QuantumCircuit(qreg, creg)
+    (q0, q1) = qreg
+    (c0, c1) = creg
 
     circuit.h(q0)
     circuit.measure(q0, c0)
@@ -1217,8 +1217,16 @@ def test_ifelseop_two_branches() -> None:
     if_circ = if_cond.op.op.get_circuit()
     else_circ = else_cond.op.op.get_circuit()
 
-    assert if_circ.n_gates == if_circ.n_gates_of_type(OpType.H) == 1
-    assert else_circ.n_gates == else_circ.n_gates_of_type(OpType.X) == 1
+    exp_if_circ = Circuit()
+    r = exp_if_circ.add_q_register("r", 1)
+    exp_if_circ.H(r[0])
+
+    exp_else_circ = Circuit()
+    s = exp_else_circ.add_q_register("s", 1)
+    exp_else_circ.H(s[0])
+
+    assert if_circ == exp_if_circ
+    assert else_circ == exp_else_circ
 
 
 # https://github.com/CQCL/pytket-qiskit/issues/415

From dd4a694cf03e66d5fbf9af46c6b46cb6e92424c8 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Thu, 16 Jan 2025 13:59:51 +0000
Subject: [PATCH 33/44] fix test inconsistency

---
 tests/qiskit_convert_test.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index 91f6a06b..3287be4a 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1222,8 +1222,8 @@ def test_ifelseop_two_branches() -> None:
     exp_if_circ.H(r[0])
 
     exp_else_circ = Circuit()
-    s = exp_else_circ.add_q_register("s", 1)
-    exp_else_circ.H(s[0])
+    r = exp_else_circ.add_q_register("r", 1)
+    exp_else_circ.X(r[0])
 
     assert if_circ == exp_if_circ
     assert else_circ == exp_else_circ

From ba3671dd9edbcbe5526c7e234e1b02ac8c6173a5 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Thu, 16 Jan 2025 14:06:20 +0000
Subject: [PATCH 34/44] add a gate counting test instead (passing)

---
 tests/qiskit_convert_test.py | 12 ++----------
 1 file changed, 2 insertions(+), 10 deletions(-)

diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index 3287be4a..31417309 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1217,16 +1217,8 @@ def test_ifelseop_two_branches() -> None:
     if_circ = if_cond.op.op.get_circuit()
     else_circ = else_cond.op.op.get_circuit()
 
-    exp_if_circ = Circuit()
-    r = exp_if_circ.add_q_register("r", 1)
-    exp_if_circ.H(r[0])
-
-    exp_else_circ = Circuit()
-    r = exp_else_circ.add_q_register("r", 1)
-    exp_else_circ.X(r[0])
-
-    assert if_circ == exp_if_circ
-    assert else_circ == exp_else_circ
+    assert if_circ.n_gates_of_type(OpType.H) == if_circ.n_gates == 1
+    assert else_circ.n_gates_of_type(OpType.X) == else_circ.n_gates == 1
 
 
 # https://github.com/CQCL/pytket-qiskit/issues/415

From aadfe5ea4b033b9249ff3e584b686d1d94422347 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Thu, 16 Jan 2025 14:39:41 +0000
Subject: [PATCH 35/44] raise error for register conditions

---
 pytket/extensions/qiskit/qiskit_convert.py | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index 6a7a9a89..3b2cf261 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -527,6 +527,13 @@ def _build_if_else_circuit(
     circ_builder = CircuitBuilder(qregs, cregs)
     circ = circ_builder.circuit()
 
+    # Coniditions must be on a single bit (for now)
+    assert len(if_else_op.condition) == 2
+    if not isinstance(if_else_op.condition[0], Clbit):
+        raise NotImplementedError(
+            "Handling of register conditions is not yet supported"
+        )
+
     circ.add_circbox(
         circbox=if_box,
         args=qubits,

From 72554e83817066531d97eaddba178bce4ab72d73 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Thu, 16 Jan 2025 14:39:52 +0000
Subject: [PATCH 36/44] add a test

---
 tests/qiskit_convert_test.py | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index 31417309..53c05dd3 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1259,6 +1259,27 @@ def test_ifelseop_one_branch() -> None:
     assert tket_circ_if_else == expected_circ
 
 
+def test_ifelseop_multi_bit_cond() -> None:
+    qreg = QuantumRegister(2, "q")
+    creg = ClassicalRegister(2, "c")
+    circuit = QuantumCircuit(creg, qreg)
+    (q0, q1) = qreg
+    (c0, c1) = creg
+
+    circuit.h(q0)
+    circuit.h(q1)
+    circuit.measure(q0, c0)
+    circuit.measure(q1, c1)
+    with circuit.if_test((creg, 2)):
+        circuit.x(q0)
+        circuit.x(q1)
+    circuit.measure(q0, c0)
+    circuit.measure(q1, c1)
+    # This currently gives an error as register exp not supported.
+    with pytest.raises(NotImplementedError):
+        qiskit_to_tk(circuit)
+
+
 def test_range_preds_with_conditionals() -> None:
     # https://github.com/CQCL/pytket-qiskit/issues/375
     c = Circuit(1, 1)

From cebf4ddd35537878f183193618c96adc7a025b0b Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Wed, 22 Jan 2025 16:05:50 +0000
Subject: [PATCH 37/44] clean up If-Else circuit building, error handling

---
 pytket/extensions/qiskit/qiskit_convert.py | 25 ++++++++++++++--------
 1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index 3b2cf261..8c6a270f 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -520,15 +520,17 @@ def _build_if_else_circuit(
     qubits: list[Qubit],
     bits: list[Bit],
 ) -> Circuit:
-    # Get two CircBox objects which implement the true_body and false_body.
-    if_box, else_box = _pytket_boxes_from_ifelseop(if_else_op, qregs, cregs)
-    # else_box can be None if no false_body is specified.
-
-    circ_builder = CircuitBuilder(qregs, cregs)
-    circ = circ_builder.circuit()
+    # Coniditions must be on a single bit (for now)
+    if len(bits) == 1:
+        # Get two CircBox objects which implement the true_body and false_body.
+        if_box, else_box = _pytket_boxes_from_ifelseop(if_else_op, qregs, cregs)
+        # else_box can be None if no false_body is specified.
+        circ_builder = CircuitBuilder(qregs, cregs)
+        circ = circ_builder.circuit()
+    else:
+        raise NotImplementedError("Conditions over multiple bits not yet supported.")
 
     # Coniditions must be on a single bit (for now)
-    assert len(if_else_op.condition) == 2
     if not isinstance(if_else_op.condition[0], Clbit):
         raise NotImplementedError(
             "Handling of register conditions is not yet supported"
@@ -542,13 +544,18 @@ def _build_if_else_circuit(
     )
     # If we have an else_box defined, add it to the circuit
     if else_box is not None:
+        if if_else_op.condition[1] not in {0, 1}:
+            raise ValueError(
+                "A bit must have condition value 0 or 1"
+                + f", got {if_else_op.condition[1]}"
+            )
         circ.add_circbox(
             circbox=else_box,
             args=qubits,
             condition_bits=bits,
             # TODO: handle conditions over multiple bits/registers?
-            condition_value=not bool(if_else_op.condition[1]),
-        )
+            condition_value=1 ^ if_else_op.condition[1],
+        ),
     return circ
 
 

From 16c3718b793870c4fa345a173ec571a7d6663ee1 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Wed, 22 Jan 2025 16:18:37 +0000
Subject: [PATCH 38/44] fix a pylint issue

---
 pytket/extensions/qiskit/qiskit_convert.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index 8c6a270f..76fe873f 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -520,7 +520,7 @@ def _build_if_else_circuit(
     qubits: list[Qubit],
     bits: list[Bit],
 ) -> Circuit:
-    # Coniditions must be on a single bit (for now)
+    # Coniditions must be on a single bit (for now) TODO: support multiple bits.
     if len(bits) == 1:
         # Get two CircBox objects which implement the true_body and false_body.
         if_box, else_box = _pytket_boxes_from_ifelseop(if_else_op, qregs, cregs)
@@ -549,13 +549,13 @@ def _build_if_else_circuit(
                 "A bit must have condition value 0 or 1"
                 + f", got {if_else_op.condition[1]}"
             )
+        # negated_value = 1 ^ if_else_op.condition[1]
         circ.add_circbox(
             circbox=else_box,
             args=qubits,
             condition_bits=bits,
-            # TODO: handle conditions over multiple bits/registers?
             condition_value=1 ^ if_else_op.condition[1],
-        ),
+        )
     return circ
 
 

From ce035c02dff4cb967312a1a08d368a52e163a7a0 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Wed, 22 Jan 2025 16:23:04 +0000
Subject: [PATCH 39/44] minor fixes

---
 pytket/extensions/qiskit/qiskit_convert.py | 2 --
 1 file changed, 2 deletions(-)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index 76fe873f..43e542fb 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -490,7 +490,6 @@ def _pytket_boxes_from_ifelseop(
 ) -> tuple[CircBox, Optional[CircBox]]:
     # Extract the QuantumCircuit implementing true_body
     if_qc: QuantumCircuit = if_else_op.blocks[0]
-
     if_builder = CircuitBuilder(qregs, cregs)
     if_builder.add_qiskit_data(if_qc)
     if_circuit = if_builder.circuit()
@@ -549,7 +548,6 @@ def _build_if_else_circuit(
                 "A bit must have condition value 0 or 1"
                 + f", got {if_else_op.condition[1]}"
             )
-        # negated_value = 1 ^ if_else_op.condition[1]
         circ.add_circbox(
             circbox=else_box,
             args=qubits,

From 1cbf960e696723f6c678e2c1d35adaf14e8b7cdf Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Wed, 22 Jan 2025 16:43:16 +0000
Subject: [PATCH 40/44] fix mypy issue

---
 tests/qiskit_convert_test.py | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index 59a82a6b..195a0e79 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -51,6 +51,7 @@
     Bit,
     CircBox,
     Circuit,
+    Conditional,
     CustomGateDef,
     Op,
     OpType,
@@ -1209,6 +1210,10 @@ def test_ifelseop_two_branches() -> None:
     assert tkc.n_gates_of_type(OpType.Conditional) == 2
     if_cond, else_cond = tuple(tkc.commands_of_type(OpType.Conditional))
 
+    # Some asserts to keep mypy happy
+    assert isinstance(if_cond.op, Conditional) and isinstance(else_cond.op, Conditional)
+    assert isinstance(if_cond.op.op, CircBox) and isinstance(else_cond.op.op, CircBox)
+
     if_circ = if_cond.op.op.get_circuit()
     else_circ = else_cond.op.op.get_circuit()
 

From dd5ce89e58203cf5620d549caf8534b3cc187aac Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Wed, 22 Jan 2025 16:43:35 +0000
Subject: [PATCH 41/44] fix a typo

---
 pytket/extensions/qiskit/qiskit_convert.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pytket/extensions/qiskit/qiskit_convert.py b/pytket/extensions/qiskit/qiskit_convert.py
index 43e542fb..c4e79a9a 100644
--- a/pytket/extensions/qiskit/qiskit_convert.py
+++ b/pytket/extensions/qiskit/qiskit_convert.py
@@ -314,7 +314,7 @@ def _all_bits_set(integer: int, n_bits: int) -> bool:
 
 
 def _get_controlled_tket_optype(c_gate: ControlledGate) -> OpType:
-    """Get a pytket contolled OpType from a qiskit ControlledGate."""
+    """Get a pytket controlled OpType from a qiskit ControlledGate."""
 
     # If the control state is not "all |1>", use QControlBox
     if not _all_bits_set(c_gate.ctrl_state, c_gate.num_ctrl_qubits):

From a40732db1d07c8eb190090cc3938db867b1c35b5 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Wed, 22 Jan 2025 17:03:18 +0000
Subject: [PATCH 42/44] add a validation test for two branch circuit

---
 tests/qiskit_convert_test.py | 54 +++++++++++++++++++++++-------------
 1 file changed, 35 insertions(+), 19 deletions(-)

diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index 195a0e79..aac45383 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -1191,34 +1191,50 @@ def test_nonregister_bits() -> None:
 
 # https://github.com/CQCL/pytket-qiskit/issues/415
 def test_ifelseop_two_branches() -> None:
-    qreg = QuantumRegister(2, "r")
-    creg = ClassicalRegister(2, "s")
+    qreg = QuantumRegister(1, "r")
+    creg = ClassicalRegister(1, "s")
     circuit = QuantumCircuit(qreg, creg)
-    (q0, q1) = qreg
-    (c0, c1) = creg
 
-    circuit.h(q0)
-    circuit.measure(q0, c0)
+    circuit.h(qreg[0])
+    circuit.measure(qreg[0], creg[0])
 
-    with circuit.if_test((c0, 1)) as else_:
-        circuit.h(q1)
+    with circuit.if_test((creg[0], 1)) as else_:
+        circuit.h(qreg[0])
     with else_:
-        circuit.x(q1)
-    circuit.measure(q1, c1)
+        circuit.x(qreg[0])
+    circuit.measure(qreg[0], creg[0])
 
     tkc = qiskit_to_tk(circuit)
-    assert tkc.n_gates_of_type(OpType.Conditional) == 2
-    if_cond, else_cond = tuple(tkc.commands_of_type(OpType.Conditional))
+    tkc.name = "test_circ"
+
+    # Manually build the expected pytket Circuit.
+    # Validate against tkc.
+    expected_circ = Circuit(name="test_circ")
+    r_reg = expected_circ.add_q_register("r", 1)
+    s_reg = expected_circ.add_c_register("s", 1)
+    expected_circ.H(r_reg[0])
+    expected_circ.Measure(r_reg[0], s_reg[0])
+
+    h_circ = Circuit()
+    h_reg = h_circ.add_q_register("r", 1)
+    h_circ.name = "If"
+    h_circ.H(h_reg[0])
+
+    x_circ = Circuit()
+    x_reg = x_circ.add_q_register("r", 1)
+    x_circ.name = "Else"
+    x_circ.X(x_reg[0])
 
-    # Some asserts to keep mypy happy
-    assert isinstance(if_cond.op, Conditional) and isinstance(else_cond.op, Conditional)
-    assert isinstance(if_cond.op.op, CircBox) and isinstance(else_cond.op.op, CircBox)
+    expected_circ.add_circbox(
+        CircBox(h_circ), [r_reg[0]], condition_bits=[s_reg[0]], condition_value=1
+    )
+    expected_circ.add_circbox(
+        CircBox(x_circ), [r_reg[0]], condition_bits=[s_reg[0]], condition_value=0
+    )
 
-    if_circ = if_cond.op.op.get_circuit()
-    else_circ = else_cond.op.op.get_circuit()
+    expected_circ.Measure(r_reg[0], s_reg[0])
 
-    assert if_circ.n_gates_of_type(OpType.H) == if_circ.n_gates == 1
-    assert else_circ.n_gates_of_type(OpType.X) == else_circ.n_gates == 1
+    assert expected_circ == tkc
 
 
 # https://github.com/CQCL/pytket-qiskit/issues/415

From 7bc58d5103e72ab8777e959cbae66bb09e530021 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Wed, 22 Jan 2025 17:04:55 +0000
Subject: [PATCH 43/44] fix import

---
 tests/qiskit_convert_test.py | 1 -
 1 file changed, 1 deletion(-)

diff --git a/tests/qiskit_convert_test.py b/tests/qiskit_convert_test.py
index aac45383..4886b530 100644
--- a/tests/qiskit_convert_test.py
+++ b/tests/qiskit_convert_test.py
@@ -51,7 +51,6 @@
     Bit,
     CircBox,
     Circuit,
-    Conditional,
     CustomGateDef,
     Op,
     OpType,

From 90c68e7e68cd383e0044193cceeaaebf4c691ff6 Mon Sep 17 00:00:00 2001
From: CalMacCQ <93673602+CalMacCQ@users.noreply.github.com>
Date: Wed, 22 Jan 2025 17:15:49 +0000
Subject: [PATCH 44/44] explain limitations in changelog

---
 docs/changelog.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/changelog.md b/docs/changelog.md
index 22900ecc..a29c105f 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -6,7 +6,7 @@
 
 ## 0.63.0 (January 2025) - UNRELEASED
 
-- Support conversion of qiskit circuits containing `IfElseOp` in the {py:func}`qiskit_to_tk` converter.
+- Support conversion of qiskit circuits containing `IfElseOp` in the {py:func}`qiskit_to_tk` converter. Note: Only conditions on a single bit are supported currently. Handling of more general conditions will be added in future.
 - Reject circuits containing nested conditionals when converting to qiskit.
 - Update pytket version requirement to 1.38.0. 
 - Add support for fractional gates on backends that support them.