From 5718f9d77e8a1ab9affc85cc99b76f396ffecd68 Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Fri, 26 Sep 2025 21:20:06 +0200 Subject: [PATCH 1/8] Make CircuitBuilder work in interactive environments --- opensquirrel/circuit_builder.py | 8 +++++++- opensquirrel/passes/router/general_router.py | 4 +++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/opensquirrel/circuit_builder.py b/opensquirrel/circuit_builder.py index 1cd550ce..f703a630 100644 --- a/opensquirrel/circuit_builder.py +++ b/opensquirrel/circuit_builder.py @@ -12,6 +12,7 @@ from opensquirrel.ir import IR, AsmDeclaration, Bit, BitLike, Instruction, Qubit, QubitLike from opensquirrel.register_manager import BitRegister, QubitRegister, RegisterManager +_builder_dynamic_attributes = tuple(default_instruction_set + ['asm']) class CircuitBuilder: """ @@ -42,8 +43,13 @@ def __init__(self, qubit_register_size: int, bit_register_size: int = 0) -> None self.register_manager = RegisterManager(QubitRegister(qubit_register_size), BitRegister(bit_register_size)) self.ir = IR() + def __dir__(self): + return super().__dir__() + list(_builder_dynamic_attributes) + def __getattr__(self, attr: Any) -> Callable[..., Self]: - return partial(self._add_statement, attr) + if attr in _builder_dynamic_attributes: + return partial(self._add_statement, attr) + return super.__getattr__(attr) def _check_qubit_out_of_bounds_access(self, qubit: QubitLike) -> None: """Throw error if qubit index is outside the qubit register range. diff --git a/opensquirrel/passes/router/general_router.py b/opensquirrel/passes/router/general_router.py index 8fb756b6..73831492 100644 --- a/opensquirrel/passes/router/general_router.py +++ b/opensquirrel/passes/router/general_router.py @@ -5,7 +5,9 @@ class Router(ABC): - def __init__(self, **kwargs: Any) -> None: ... + def __init__(self, **kwargs: Any) -> None: + """ Router class to map a quantum algorithm on the specific topology """ + ... @abstractmethod def route(self, ir: IR) -> IR: From 17d7449c97cec03ac6ad302cd63e11d1c85a09d6 Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Fri, 26 Sep 2025 21:27:32 +0200 Subject: [PATCH 2/8] make comment general --- opensquirrel/passes/router/general_router.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opensquirrel/passes/router/general_router.py b/opensquirrel/passes/router/general_router.py index 73831492..b8fec0ea 100644 --- a/opensquirrel/passes/router/general_router.py +++ b/opensquirrel/passes/router/general_router.py @@ -6,7 +6,7 @@ class Router(ABC): def __init__(self, **kwargs: Any) -> None: - """ Router class to map a quantum algorithm on the specific topology """ + """ Generic router class """ ... @abstractmethod From 3e6222a6299f8cccbad6a43ecbb49bd47791c096 Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Fri, 26 Sep 2025 21:33:19 +0200 Subject: [PATCH 3/8] ci --- opensquirrel/circuit_builder.py | 5 +++-- opensquirrel/passes/router/general_router.py | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/opensquirrel/circuit_builder.py b/opensquirrel/circuit_builder.py index f703a630..237638eb 100644 --- a/opensquirrel/circuit_builder.py +++ b/opensquirrel/circuit_builder.py @@ -12,7 +12,8 @@ from opensquirrel.ir import IR, AsmDeclaration, Bit, BitLike, Instruction, Qubit, QubitLike from opensquirrel.register_manager import BitRegister, QubitRegister, RegisterManager -_builder_dynamic_attributes = tuple(default_instruction_set + ['asm']) +_builder_dynamic_attributes = (*default_instruction_set, "asm") + class CircuitBuilder: """ @@ -43,7 +44,7 @@ def __init__(self, qubit_register_size: int, bit_register_size: int = 0) -> None self.register_manager = RegisterManager(QubitRegister(qubit_register_size), BitRegister(bit_register_size)) self.ir = IR() - def __dir__(self): + def __dir__(self) -> list[str]: return super().__dir__() + list(_builder_dynamic_attributes) def __getattr__(self, attr: Any) -> Callable[..., Self]: diff --git a/opensquirrel/passes/router/general_router.py b/opensquirrel/passes/router/general_router.py index b8fec0ea..fd0cb596 100644 --- a/opensquirrel/passes/router/general_router.py +++ b/opensquirrel/passes/router/general_router.py @@ -7,7 +7,6 @@ class Router(ABC): def __init__(self, **kwargs: Any) -> None: """ Generic router class """ - ... @abstractmethod def route(self, ir: IR) -> IR: From e698016b082a6ab37555472b1a4d50439532c408 Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Fri, 26 Sep 2025 21:35:29 +0200 Subject: [PATCH 4/8] ci --- opensquirrel/circuit_builder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opensquirrel/circuit_builder.py b/opensquirrel/circuit_builder.py index 237638eb..49081101 100644 --- a/opensquirrel/circuit_builder.py +++ b/opensquirrel/circuit_builder.py @@ -45,9 +45,9 @@ def __init__(self, qubit_register_size: int, bit_register_size: int = 0) -> None self.ir = IR() def __dir__(self) -> list[str]: - return super().__dir__() + list(_builder_dynamic_attributes) + return super().__dir__() + list(_builder_dynamic_attributes) # type: ignore - def __getattr__(self, attr: Any) -> Callable[..., Self]: + def __getattr__(self, attr: Any) -> Any: if attr in _builder_dynamic_attributes: return partial(self._add_statement, attr) return super.__getattr__(attr) From c1c401992fe195a981739b08e961dab3dfa7c024 Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Fri, 26 Sep 2025 22:17:33 +0200 Subject: [PATCH 5/8] ci --- opensquirrel/circuit_builder.py | 1 - 1 file changed, 1 deletion(-) diff --git a/opensquirrel/circuit_builder.py b/opensquirrel/circuit_builder.py index 49081101..ff4bcc34 100644 --- a/opensquirrel/circuit_builder.py +++ b/opensquirrel/circuit_builder.py @@ -1,6 +1,5 @@ from __future__ import annotations -from collections.abc import Callable from copy import deepcopy from functools import partial from typing import Any From 9699aed0a2991e0e440b711b4eefaa6c2bac47ac Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Fri, 26 Sep 2025 22:21:48 +0200 Subject: [PATCH 6/8] ci --- opensquirrel/circuit_builder.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/opensquirrel/circuit_builder.py b/opensquirrel/circuit_builder.py index ff4bcc34..b534c739 100644 --- a/opensquirrel/circuit_builder.py +++ b/opensquirrel/circuit_builder.py @@ -46,10 +46,11 @@ def __init__(self, qubit_register_size: int, bit_register_size: int = 0) -> None def __dir__(self) -> list[str]: return super().__dir__() + list(_builder_dynamic_attributes) # type: ignore - def __getattr__(self, attr: Any) -> Any: + def __getattr__(self, attr: str) -> Any: if attr in _builder_dynamic_attributes: return partial(self._add_statement, attr) - return super.__getattr__(attr) + # Default behaviour + return self.__getattribute__(attr) def _check_qubit_out_of_bounds_access(self, qubit: QubitLike) -> None: """Throw error if qubit index is outside the qubit register range. From 9d5a556d6b483a3d57fb87cae212b672a78cb58c Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Fri, 26 Sep 2025 22:27:44 +0200 Subject: [PATCH 7/8] ruff --- opensquirrel/passes/router/general_router.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opensquirrel/passes/router/general_router.py b/opensquirrel/passes/router/general_router.py index fd0cb596..80c3ff7e 100644 --- a/opensquirrel/passes/router/general_router.py +++ b/opensquirrel/passes/router/general_router.py @@ -6,7 +6,7 @@ class Router(ABC): def __init__(self, **kwargs: Any) -> None: - """ Generic router class """ + """Generic router class""" @abstractmethod def route(self, ir: IR) -> IR: From f1fed487279477c143d4dca99c5c3ed30243f291 Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Fri, 26 Sep 2025 22:36:32 +0200 Subject: [PATCH 8/8] fix test --- tests/test_circuit_builder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_circuit_builder.py b/tests/test_circuit_builder.py index 7642abad..7a36a820 100644 --- a/tests/test_circuit_builder.py +++ b/tests/test_circuit_builder.py @@ -65,7 +65,7 @@ def test_measure_index_error(self) -> None: def test_unknown_instruction(self) -> None: builder = CircuitBuilder(3) - with pytest.raises(ValueError, match="unknown instruction 'unknown'"): + with pytest.raises(AttributeError, match="has no attribute 'unknown'"): builder.unknown(0) def test_wrong_number_of_arguments(self) -> None: