From 325fd907b4eb4dcd19ef0a900eba9e270c80a8bf Mon Sep 17 00:00:00 2001 From: kimxworrall Date: Mon, 17 Feb 2025 23:55:25 +0000 Subject: [PATCH 1/2] initialise and test qft dialect --- inconspiquous/dialects/__init__.py | 6 ++++ inconspiquous/dialects/qft.py | 40 +++++++++++++++++++++++++++ tests/filecheck/dialects/qft/ops.mlir | 5 ++++ 3 files changed, 51 insertions(+) create mode 100644 inconspiquous/dialects/qft.py create mode 100644 tests/filecheck/dialects/qft/ops.mlir diff --git a/inconspiquous/dialects/__init__.py b/inconspiquous/dialects/__init__.py index 354247b..7f87890 100644 --- a/inconspiquous/dialects/__init__.py +++ b/inconspiquous/dialects/__init__.py @@ -56,6 +56,11 @@ def get_qec(): return QEC + def get_qft(): + from inconspiquous.dialects.qft import QFT + + return QFT + def get_qref(): from inconspiquous.dialects.qref import Qref @@ -107,6 +112,7 @@ def get_varith(): "measurement": get_measurement, "prob": get_prob, "qec": get_qec, + "qft": get_qft, "qref": get_qref, "qubit": get_qubit, "qssa": get_qssa, diff --git a/inconspiquous/dialects/qft.py b/inconspiquous/dialects/qft.py new file mode 100644 index 0000000..64c24e7 --- /dev/null +++ b/inconspiquous/dialects/qft.py @@ -0,0 +1,40 @@ +from xdsl.dialects.builtin import IntAttr +from xdsl.ir import Dialect +from xdsl.irdl import irdl_attr_definition, ParameterDef +from xdsl.parser import AttrParser +from xdsl.printer import Printer + +from inconspiquous.gates import GateAttr + + +@irdl_attr_definition +class QFTAttr(GateAttr): + name = "qft.n" + + num_qubits: ParameterDef[IntAttr] + + @property + def num_qubits(self) -> int: + return self.num_qubits.data + + def __init__(self, num_qubits: int | IntAttr): + if not isinstance(num_qubits, IntAttr): + num_qubits = IntAttr(num_qubits) + + super().__init__((num_qubits,)) + + @classmethod + def parse_parameters(cls, parser: AttrParser) -> tuple[IntAttr]: + with parser.in_angle_brackets(): + num_qubits = parser.parse_integer(allow_negative=False, allow_boolean=False) + return (IntAttr.new(num_qubits),) + + def print_parameters(self, printer: Printer) -> None: + return self.num_qubits.print_parameter(printer) + + +QFT = Dialect( + "qft", + [], + [QFTAttr], +) diff --git a/tests/filecheck/dialects/qft/ops.mlir b/tests/filecheck/dialects/qft/ops.mlir new file mode 100644 index 0000000..ed33c0f --- /dev/null +++ b/tests/filecheck/dialects/qft/ops.mlir @@ -0,0 +1,5 @@ +// RUN: QUOPT_ROUNDTRIP + +"test.op"() {gate = #qft.n<5>} : () -> () + +// CHECK: "test.op"() {gate = #qft.n<5>} : () -> () From 75f72148d16b7f3ce6623483f99658ac9a8569b4 Mon Sep 17 00:00:00 2001 From: Kim Worrall Date: Wed, 5 Mar 2025 10:23:58 +0000 Subject: [PATCH 2/2] fix naming of qft gateattr paramater --- inconspiquous/dialects/qft.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/inconspiquous/dialects/qft.py b/inconspiquous/dialects/qft.py index 64c24e7..ea3b40a 100644 --- a/inconspiquous/dialects/qft.py +++ b/inconspiquous/dialects/qft.py @@ -11,11 +11,11 @@ class QFTAttr(GateAttr): name = "qft.n" - num_qubits: ParameterDef[IntAttr] + num_qubits_param: ParameterDef[IntAttr] @property def num_qubits(self) -> int: - return self.num_qubits.data + return self.num_qubits_param.data def __init__(self, num_qubits: int | IntAttr): if not isinstance(num_qubits, IntAttr): @@ -30,7 +30,7 @@ def parse_parameters(cls, parser: AttrParser) -> tuple[IntAttr]: return (IntAttr.new(num_qubits),) def print_parameters(self, printer: Printer) -> None: - return self.num_qubits.print_parameter(printer) + return self.num_qubits_param.print_parameter(printer) QFT = Dialect(