From 90a43327c3c9db5baf1922c60c7a89cfcdde2301 Mon Sep 17 00:00:00 2001 From: David Bakker Date: Thu, 22 Oct 2026 11:21:47 +0200 Subject: [PATCH 1/3] added fix --- opensquirrel/passes/merger/two_qubit_gates_merger.py | 2 +- tests/passes/merger/test_two_qubit_gates_merger.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/opensquirrel/passes/merger/two_qubit_gates_merger.py b/opensquirrel/passes/merger/two_qubit_gates_merger.py index 1f8ce972..b340b0d3 100644 --- a/opensquirrel/passes/merger/two_qubit_gates_merger.py +++ b/opensquirrel/passes/merger/two_qubit_gates_merger.py @@ -181,4 +181,4 @@ def merge(self, ir: IR, qubit_register_size: int) -> None: else: statements.append(ir.statements[statement_indices.pop()]) - ir.statements = statements + ir.statements = list(filter(lambda x: not x.is_identity(), statements)) diff --git a/tests/passes/merger/test_two_qubit_gates_merger.py b/tests/passes/merger/test_two_qubit_gates_merger.py index 5402a88c..1859e422 100644 --- a/tests/passes/merger/test_two_qubit_gates_merger.py +++ b/tests/passes/merger/test_two_qubit_gates_merger.py @@ -296,3 +296,10 @@ def test_two_qubit_gates_merger_with_non_instructions( "Both should be either TwoQubitGate or SingleQubitGate." ) raise TypeError(msg) + + +def test_two_qubit_gates_merger_filters_out_identity_gates(merger: TwoQubitGatesMerger) -> None: + circuit = CircuitBuilder(2).SWAP(0, 1).SWAP(0, 1).to_circuit() + merger.merge(circuit.ir, circuit.qubit_register_size) + + assert len(circuit.ir.statements) == 0 From 8d068c5af0b9f6ace7f20b053a3f9fe5278d7e22 Mon Sep 17 00:00:00 2001 From: David Bakker Date: Thu, 22 Oct 2026 11:34:53 +0200 Subject: [PATCH 2/3] Don't filter out non-gates --- opensquirrel/passes/merger/two_qubit_gates_merger.py | 4 +++- tests/passes/merger/test_two_qubit_gates_merger.py | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/opensquirrel/passes/merger/two_qubit_gates_merger.py b/opensquirrel/passes/merger/two_qubit_gates_merger.py index b340b0d3..3df60c8b 100644 --- a/opensquirrel/passes/merger/two_qubit_gates_merger.py +++ b/opensquirrel/passes/merger/two_qubit_gates_merger.py @@ -181,4 +181,6 @@ def merge(self, ir: IR, qubit_register_size: int) -> None: else: statements.append(ir.statements[statement_indices.pop()]) - ir.statements = list(filter(lambda x: not x.is_identity(), statements)) + ir.statements = list( + filter(lambda statement: not (isinstance(statement, Gate) and statement.is_identity()), statements) + ) diff --git a/tests/passes/merger/test_two_qubit_gates_merger.py b/tests/passes/merger/test_two_qubit_gates_merger.py index 1859e422..8f6d56f0 100644 --- a/tests/passes/merger/test_two_qubit_gates_merger.py +++ b/tests/passes/merger/test_two_qubit_gates_merger.py @@ -179,7 +179,6 @@ def merger() -> TwoQubitGatesMerger: (CircuitBuilder(1).H(0).to_circuit(), CircuitBuilder(1).H(0).to_circuit()), (CircuitBuilder(2).CNOT(0, 1).to_circuit(), CircuitBuilder(2).CNOT(0, 1).to_circuit()), (CircuitBuilder(2).CNOT(0, 1).CNOT(1, 0).CNOT(0, 1).to_circuit(), CircuitBuilder(2).SWAP(0, 1).to_circuit()), - (CircuitBuilder(2).SWAP(0, 1).SWAP(0, 1).to_circuit(), CircuitBuilder(2).I(0).to_circuit()), (CircuitBuilder(2).SWAP(0, 1).CZ(0, 1).S(0).S(1).to_circuit(), CircuitBuilder(2).ISWAP(0, 1).to_circuit()), (CircuitBuilder(2).H(1).CNOT(0, 1).H(1).to_circuit(), CircuitBuilder(2).CZ(0, 1).to_circuit()), (CircuitBuilder(2).CV(0, 1).CV(0, 1).to_circuit(), CircuitBuilder(2).CNOT(0, 1).to_circuit()), From cbc0b4020a767a416893b53a363a0bcdecc18278 Mon Sep 17 00:00:00 2001 From: David Bakker Date: Thu, 22 Oct 2026 11:49:31 +0200 Subject: [PATCH 3/3] Process review comments; remove old checks --- .../passes/merger/two_qubit_gates_merger.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/opensquirrel/passes/merger/two_qubit_gates_merger.py b/opensquirrel/passes/merger/two_qubit_gates_merger.py index 3df60c8b..048b5c8e 100644 --- a/opensquirrel/passes/merger/two_qubit_gates_merger.py +++ b/opensquirrel/passes/merger/two_qubit_gates_merger.py @@ -167,20 +167,17 @@ def merge(self, ir: IR, qubit_register_size: int) -> None: """ graph = build_graph(ir) - if len(graph.nodes) == 1: - return - groups = group_gates(graph) statements = [] for group in groups: statement_indices, qubit_indices = group - if len(qubit_indices) == 2 and len(statement_indices) > 1: - merged_gate = _merge_gate_group(ir, group) - statements.append(merged_gate) + if len(qubit_indices) == 2: + statement = _merge_gate_group(ir, group) else: - statements.append(ir.statements[statement_indices.pop()]) + statement = ir.statements[statement_indices.pop()] + + if not (isinstance(statement, Gate) and statement.is_identity()): + statements.append(statement) - ir.statements = list( - filter(lambda statement: not (isinstance(statement, Gate) and statement.is_identity()), statements) - ) + ir.statements = statements