From 5420f9d4624a4b7086e1c075ef49f6f1adaf9906 Mon Sep 17 00:00:00 2001 From: Tamino Bauknecht Date: Fri, 5 Sep 2025 18:29:01 +0200 Subject: [PATCH 01/12] old attempt --- .../mlir/Dialect/Common/IR/CommonTraits.td | 3 +++ .../mlir/Dialect/Common/IR/StdOps.td.inc | 24 +++++++++++++++++++ .../mlir/Dialect/MQTOpt/IR/MQTOptOps.td | 3 +++ .../mlir/Dialect/MQTRef/IR/MQTRefOps.td | 3 +++ 4 files changed, 33 insertions(+) diff --git a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td index 55849f726..eb01c2feb 100644 --- a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td +++ b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td @@ -37,6 +37,9 @@ def NoControl : NativeOpTrait<"NoControlTrait"> { let cppNamespace = "::mqt::ir::common"; } +def QcTypeId : NativeOpTrait<"QcTypeIdTrait"> { +} + def UniqueSizeDefinition : NativeOpTrait<"UniqueSizeDefinitionTrait"> { let cppNamespace = "::mqt::ir::common"; } diff --git a/mlir/include/mlir/Dialect/Common/IR/StdOps.td.inc b/mlir/include/mlir/Dialect/Common/IR/StdOps.td.inc index 675c4b992..e564d9874 100644 --- a/mlir/include/mlir/Dialect/Common/IR/StdOps.td.inc +++ b/mlir/include/mlir/Dialect/Common/IR/StdOps.td.inc @@ -20,6 +20,8 @@ def GPhaseOp : UnitaryOp<"gphase", [NoTarget, OneParameter]> { any input and output qubits. It might still be controlled by arbitrarily many qubits. }]; + + let qcType = 1; } def IOp : UnitaryOp<"i", [OneTarget, NoParameter]> { @@ -29,6 +31,8 @@ def IOp : UnitaryOp<"i", [OneTarget, NoParameter]> { This class represents an identity gate. It takes a qubit and a variadic list of positive/negative controls as an input. }]; + + let qcType = 2; } def BarrierOp : UnitaryOp<"barrier", [NoParameter, NoControl]> { @@ -38,6 +42,8 @@ def BarrierOp : UnitaryOp<"barrier", [NoParameter, NoControl]> { This class represents the barrier operation. It has a variadic number of input qubits and no control qubits. }]; + + let qcType = 3; } def HOp : UnitaryOp<"h", [OneTarget, NoParameter]> { @@ -47,6 +53,8 @@ def HOp : UnitaryOp<"h", [OneTarget, NoParameter]> { This class represents a Hadamard gate. It takes a qubit and a variadic list of positive/negative controls as an input. }]; + + let qcType = 4; } def XOp : UnitaryOp<"x", [OneTarget, NoParameter]> { @@ -56,6 +64,8 @@ def XOp : UnitaryOp<"x", [OneTarget, NoParameter]> { This class represents a Pauli-X gate. It takes a qubit and a variadic list of positive/negative controls as an input. }]; + + let qcType = 5; } def YOp : UnitaryOp<"y", [OneTarget, NoParameter]> { @@ -65,6 +75,8 @@ def YOp : UnitaryOp<"y", [OneTarget, NoParameter]> { This class represents a Pauli-Y gate. It takes a qubit and a variadic list of positive/negative controls as an input. }]; + + let qcType = 6; } def ZOp : UnitaryOp<"z", [OneTarget, NoParameter]> { @@ -74,6 +86,8 @@ def ZOp : UnitaryOp<"z", [OneTarget, NoParameter]> { This class represents a Pauli-Z gate. It takes a qubit and a variadic list of positive/negative controls as an input. }]; + + let qcType = 7; } def SOp : UnitaryOp<"s", [OneTarget, NoParameter]> { @@ -83,6 +97,8 @@ def SOp : UnitaryOp<"s", [OneTarget, NoParameter]> { This class represents an S gate. It takes a qubit as an input and a variadic list of positive/negative controls. }]; + + let qcType = 8; } def SdgOp : UnitaryOp<"sdg", [OneTarget, NoParameter]> { @@ -92,6 +108,9 @@ def SdgOp : UnitaryOp<"sdg", [OneTarget, NoParameter]> { This class represents an inverse S gate. It takes a qubit and a variadic list of positive/negative controls as an input. }]; + + let qcType = 8; + let isInverted = true; } def TOp : UnitaryOp<"t", [OneTarget, NoParameter]> { @@ -101,6 +120,8 @@ def TOp : UnitaryOp<"t", [OneTarget, NoParameter]> { This class represents a T gate. It takes a qubit and a variadic list of positive/negative controls as an input. }]; + + let qcType = 9; } def TdgOp : UnitaryOp<"tdg", [OneTarget, NoParameter]> { @@ -110,6 +131,9 @@ def TdgOp : UnitaryOp<"tdg", [OneTarget, NoParameter]> { This class represents an inverse T gate. It takes a qubit and a variadic list of positive/negative controls as an input. }]; + + let qcType = 9; + let isInverted = true; } def VOp : UnitaryOp<"v", [OneTarget, NoParameter]> { diff --git a/mlir/include/mlir/Dialect/MQTOpt/IR/MQTOptOps.td b/mlir/include/mlir/Dialect/MQTOpt/IR/MQTOptOps.td index 5b1d1d8cd..f87fdf618 100644 --- a/mlir/include/mlir/Dialect/MQTOpt/IR/MQTOptOps.td +++ b/mlir/include/mlir/Dialect/MQTOpt/IR/MQTOptOps.td @@ -120,6 +120,9 @@ class UnitaryOp traits = []> : ( $in_qubits^ )? ( `ctrl` $pos_ctrl_in_qubits^ )? ( `nctrl` $neg_ctrl_in_qubits^ )? custom(type($out_qubits), type($pos_ctrl_out_qubits), type($neg_ctrl_out_qubits)) }]; + + int qcType; + int isInverted; } include "mlir/Dialect/MQTOpt/IR/MQTOptStdOps.td" diff --git a/mlir/include/mlir/Dialect/MQTRef/IR/MQTRefOps.td b/mlir/include/mlir/Dialect/MQTRef/IR/MQTRefOps.td index d250a3f19..bf23b0fde 100644 --- a/mlir/include/mlir/Dialect/MQTRef/IR/MQTRefOps.td +++ b/mlir/include/mlir/Dialect/MQTRef/IR/MQTRefOps.td @@ -98,6 +98,9 @@ class UnitaryOp traits = []> : attr-dict $in_qubits ( `ctrl` $pos_ctrl_in_qubits^ )? ( `nctrl` $neg_ctrl_in_qubits^ )? }]; + + int qcType; + int isInverted; } include "mlir/Dialect/MQTRef/IR/MQTRefStdOps.td" From c466796e20bc924de6221579e06e5cadcd36552a Mon Sep 17 00:00:00 2001 From: Tamino Bauknecht Date: Thu, 18 Sep 2025 12:58:31 +0200 Subject: [PATCH 02/12] Revert "old attempt" This reverts commit a8a72c485e4a73c16100fcaf10da2da807b92e94. --- .../mlir/Dialect/Common/IR/CommonTraits.td | 3 --- .../mlir/Dialect/Common/IR/StdOps.td.inc | 24 ------------------- .../mlir/Dialect/MQTOpt/IR/MQTOptOps.td | 3 --- .../mlir/Dialect/MQTRef/IR/MQTRefOps.td | 3 --- 4 files changed, 33 deletions(-) diff --git a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td index eb01c2feb..55849f726 100644 --- a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td +++ b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td @@ -37,9 +37,6 @@ def NoControl : NativeOpTrait<"NoControlTrait"> { let cppNamespace = "::mqt::ir::common"; } -def QcTypeId : NativeOpTrait<"QcTypeIdTrait"> { -} - def UniqueSizeDefinition : NativeOpTrait<"UniqueSizeDefinitionTrait"> { let cppNamespace = "::mqt::ir::common"; } diff --git a/mlir/include/mlir/Dialect/Common/IR/StdOps.td.inc b/mlir/include/mlir/Dialect/Common/IR/StdOps.td.inc index e564d9874..675c4b992 100644 --- a/mlir/include/mlir/Dialect/Common/IR/StdOps.td.inc +++ b/mlir/include/mlir/Dialect/Common/IR/StdOps.td.inc @@ -20,8 +20,6 @@ def GPhaseOp : UnitaryOp<"gphase", [NoTarget, OneParameter]> { any input and output qubits. It might still be controlled by arbitrarily many qubits. }]; - - let qcType = 1; } def IOp : UnitaryOp<"i", [OneTarget, NoParameter]> { @@ -31,8 +29,6 @@ def IOp : UnitaryOp<"i", [OneTarget, NoParameter]> { This class represents an identity gate. It takes a qubit and a variadic list of positive/negative controls as an input. }]; - - let qcType = 2; } def BarrierOp : UnitaryOp<"barrier", [NoParameter, NoControl]> { @@ -42,8 +38,6 @@ def BarrierOp : UnitaryOp<"barrier", [NoParameter, NoControl]> { This class represents the barrier operation. It has a variadic number of input qubits and no control qubits. }]; - - let qcType = 3; } def HOp : UnitaryOp<"h", [OneTarget, NoParameter]> { @@ -53,8 +47,6 @@ def HOp : UnitaryOp<"h", [OneTarget, NoParameter]> { This class represents a Hadamard gate. It takes a qubit and a variadic list of positive/negative controls as an input. }]; - - let qcType = 4; } def XOp : UnitaryOp<"x", [OneTarget, NoParameter]> { @@ -64,8 +56,6 @@ def XOp : UnitaryOp<"x", [OneTarget, NoParameter]> { This class represents a Pauli-X gate. It takes a qubit and a variadic list of positive/negative controls as an input. }]; - - let qcType = 5; } def YOp : UnitaryOp<"y", [OneTarget, NoParameter]> { @@ -75,8 +65,6 @@ def YOp : UnitaryOp<"y", [OneTarget, NoParameter]> { This class represents a Pauli-Y gate. It takes a qubit and a variadic list of positive/negative controls as an input. }]; - - let qcType = 6; } def ZOp : UnitaryOp<"z", [OneTarget, NoParameter]> { @@ -86,8 +74,6 @@ def ZOp : UnitaryOp<"z", [OneTarget, NoParameter]> { This class represents a Pauli-Z gate. It takes a qubit and a variadic list of positive/negative controls as an input. }]; - - let qcType = 7; } def SOp : UnitaryOp<"s", [OneTarget, NoParameter]> { @@ -97,8 +83,6 @@ def SOp : UnitaryOp<"s", [OneTarget, NoParameter]> { This class represents an S gate. It takes a qubit as an input and a variadic list of positive/negative controls. }]; - - let qcType = 8; } def SdgOp : UnitaryOp<"sdg", [OneTarget, NoParameter]> { @@ -108,9 +92,6 @@ def SdgOp : UnitaryOp<"sdg", [OneTarget, NoParameter]> { This class represents an inverse S gate. It takes a qubit and a variadic list of positive/negative controls as an input. }]; - - let qcType = 8; - let isInverted = true; } def TOp : UnitaryOp<"t", [OneTarget, NoParameter]> { @@ -120,8 +101,6 @@ def TOp : UnitaryOp<"t", [OneTarget, NoParameter]> { This class represents a T gate. It takes a qubit and a variadic list of positive/negative controls as an input. }]; - - let qcType = 9; } def TdgOp : UnitaryOp<"tdg", [OneTarget, NoParameter]> { @@ -131,9 +110,6 @@ def TdgOp : UnitaryOp<"tdg", [OneTarget, NoParameter]> { This class represents an inverse T gate. It takes a qubit and a variadic list of positive/negative controls as an input. }]; - - let qcType = 9; - let isInverted = true; } def VOp : UnitaryOp<"v", [OneTarget, NoParameter]> { diff --git a/mlir/include/mlir/Dialect/MQTOpt/IR/MQTOptOps.td b/mlir/include/mlir/Dialect/MQTOpt/IR/MQTOptOps.td index f87fdf618..5b1d1d8cd 100644 --- a/mlir/include/mlir/Dialect/MQTOpt/IR/MQTOptOps.td +++ b/mlir/include/mlir/Dialect/MQTOpt/IR/MQTOptOps.td @@ -120,9 +120,6 @@ class UnitaryOp traits = []> : ( $in_qubits^ )? ( `ctrl` $pos_ctrl_in_qubits^ )? ( `nctrl` $neg_ctrl_in_qubits^ )? custom(type($out_qubits), type($pos_ctrl_out_qubits), type($neg_ctrl_out_qubits)) }]; - - int qcType; - int isInverted; } include "mlir/Dialect/MQTOpt/IR/MQTOptStdOps.td" diff --git a/mlir/include/mlir/Dialect/MQTRef/IR/MQTRefOps.td b/mlir/include/mlir/Dialect/MQTRef/IR/MQTRefOps.td index bf23b0fde..d250a3f19 100644 --- a/mlir/include/mlir/Dialect/MQTRef/IR/MQTRefOps.td +++ b/mlir/include/mlir/Dialect/MQTRef/IR/MQTRefOps.td @@ -98,9 +98,6 @@ class UnitaryOp traits = []> : attr-dict $in_qubits ( `ctrl` $pos_ctrl_in_qubits^ )? ( `nctrl` $neg_ctrl_in_qubits^ )? }]; - - int qcType; - int isInverted; } include "mlir/Dialect/MQTRef/IR/MQTRefStdOps.td" From d7aeca8b03d7c86c85e03f826f99436bd3567123 Mon Sep 17 00:00:00 2001 From: Tamino Bauknecht Date: Thu, 18 Sep 2025 23:56:56 +0200 Subject: [PATCH 03/12] test extraConcreteClassDeclaration --- mlir/include/mlir/Dialect/Common/IR/CommonTraits.td | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td index 55849f726..f4877dd75 100644 --- a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td +++ b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td @@ -17,6 +17,9 @@ include "mlir/Interfaces/SideEffectInterfaces.td" class TargetArity : ParamNativeOpTrait<"TargetArityTrait", !cast(N)> { let cppNamespace = "::mqt::ir::common"; + + let extraConcreteClassDeclaration = "int a();"; + let extraConcreteClassDefinition = "int $cppClass::a() { }"; } def NoTarget : TargetArity<0>; From 10eeee43131c44c8511684dffd47cacfa8342e5a Mon Sep 17 00:00:00 2001 From: Tamino Bauknecht Date: Thu, 18 Sep 2025 23:59:11 +0200 Subject: [PATCH 04/12] :sparkles: Add is{Single,Two}QubitOperation() to MQTOpt UnitaryInterface --- .../Dialect/MQTOpt/IR/MQTOptInterfaces.td | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/mlir/include/mlir/Dialect/MQTOpt/IR/MQTOptInterfaces.td b/mlir/include/mlir/Dialect/MQTOpt/IR/MQTOptInterfaces.td index 7562057fe..f856d0a1b 100644 --- a/mlir/include/mlir/Dialect/MQTOpt/IR/MQTOptInterfaces.td +++ b/mlir/include/mlir/Dialect/MQTOpt/IR/MQTOptInterfaces.td @@ -167,6 +167,35 @@ def UnitaryInterface : OpInterface<"UnitaryInterface"> { /*methodBody=*/ [{}], /*defaultImpl=*/ [{ return $_op->getName().getStringRef().split('.').second; + }]>, + InterfaceMethod< + /*desc=*/ "Check if operation operates on a single qubit.", + /*returnType=*/ "bool", + /*methodName=*/ "isSingleQubitOperation", + /*args=*/ (ins), + /*methodBody=*/ [{}], + /*defaultImpl=*/ [{ + auto&& inQubits = $_op.getInQubits(); + auto&& outQubits = $_op.getOutQubits(); + return inQubits.size() == 1 && outQubits.size() == 1 && !$_op.isControlled(); + }]>, + InterfaceMethod< + /*desc=*/ "Check if operation operates on exactly two qubits.", + /*returnType=*/ "bool", + /*methodName=*/ "isTwoQubitOperation", + /*args=*/ (ins), + /*methodBody=*/ [{}], + /*defaultImpl=*/ [{ + auto&& inQubits = $_op.getInQubits(); + auto&& inPosCtrlQubits = $_op.getPosCtrlInQubits(); + auto&& inNegCtrlQubits = $_op.getNegCtrlInQubits(); + auto&& outQubits = $_op.getOutQubits(); + auto&& outPosCtrlQubits = $_op.getPosCtrlInQubits(); + auto&& outNegCtrlQubits = $_op.getNegCtrlInQubits(); + + auto inQubitSize = inQubits.size() + inPosCtrlQubits.size() + inNegCtrlQubits.size(); + auto outQubitSize = outQubits.size() + outPosCtrlQubits.size() + outNegCtrlQubits.size(); + return inQubitSize == 2 && outQubitSize == 2; }]> ]; From 56af34597a056589d51176754dfe2b57920bcc78 Mon Sep 17 00:00:00 2001 From: Tamino Bauknecht Date: Fri, 19 Sep 2025 00:05:50 +0200 Subject: [PATCH 05/12] Revert "test extraConcreteClassDeclaration" This reverts commit 7149d691c404291f4c69c9a7e30ab2b3d773da8a. --- mlir/include/mlir/Dialect/Common/IR/CommonTraits.td | 3 --- 1 file changed, 3 deletions(-) diff --git a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td index f4877dd75..55849f726 100644 --- a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td +++ b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td @@ -17,9 +17,6 @@ include "mlir/Interfaces/SideEffectInterfaces.td" class TargetArity : ParamNativeOpTrait<"TargetArityTrait", !cast(N)> { let cppNamespace = "::mqt::ir::common"; - - let extraConcreteClassDeclaration = "int a();"; - let extraConcreteClassDefinition = "int $cppClass::a() { }"; } def NoTarget : TargetArity<0>; From c7a7160b117dd51ad6f4a4f966c26363463d3f96 Mon Sep 17 00:00:00 2001 From: Tamino Bauknecht Date: Fri, 19 Sep 2025 15:59:01 +0200 Subject: [PATCH 06/12] add non-parameterized matrix definition as template to TargetArityTrait --- mlir/include/mlir/Dialect/Common/IR/CommonTraits.h | 4 +++- mlir/include/mlir/Dialect/Common/IR/CommonTraits.td | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h index 23ec89ceb..34e3e8fda 100644 --- a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h +++ b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h @@ -10,13 +10,15 @@ #pragma once +#include #include #include #include #include namespace mqt::ir::common { -template class TargetArityTrait { +// TODO: via helper class (no default ctor) ensure that array is fully explicitly initialized +template X> class TargetArityTrait { public: template class Impl : public mlir::OpTrait::TraitBase { diff --git a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td index 55849f726..42118dd08 100644 --- a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td +++ b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td @@ -14,8 +14,11 @@ include "mlir/IR/EnumAttr.td" include "mlir/IR/DialectBase.td" include "mlir/Interfaces/SideEffectInterfaces.td" -class TargetArity - : ParamNativeOpTrait<"TargetArityTrait", !cast(N)> { +class TargetArity MatrixDefinition = []> + : ParamNativeOpTrait< + "TargetArityTrait", + !cast(N) # ", {" # !if(!empty(MatrixDefinition), "", !foldl(!cast(!head(MatrixDefinition)), !tail(MatrixDefinition), result, element, result # ", " # element)) # "}" + > { let cppNamespace = "::mqt::ir::common"; } From 4ed79f11a4568fdac22f267e8d96adafc9b9f193 Mon Sep 17 00:00:00 2001 From: Tamino Bauknecht Date: Fri, 19 Sep 2025 17:22:26 +0200 Subject: [PATCH 07/12] simplify list-to-string in trait --- mlir/include/mlir/Dialect/Common/IR/CommonTraits.td | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td index 42118dd08..aa7f8fd8b 100644 --- a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td +++ b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td @@ -17,7 +17,7 @@ include "mlir/Interfaces/SideEffectInterfaces.td" class TargetArity MatrixDefinition = []> : ParamNativeOpTrait< "TargetArityTrait", - !cast(N) # ", {" # !if(!empty(MatrixDefinition), "", !foldl(!cast(!head(MatrixDefinition)), !tail(MatrixDefinition), result, element, result # ", " # element)) # "}" + !cast(N) # ", {" # !interleave(MatrixDefinition, ", ") # "}" > { let cppNamespace = "::mqt::ir::common"; } From 30bae22e5f72121006e5cc1e9b581c44762c1dbe Mon Sep 17 00:00:00 2001 From: Tamino Bauknecht Date: Fri, 19 Sep 2025 17:58:03 +0200 Subject: [PATCH 08/12] working static definition matrix --- mlir/include/mlir/Dialect/Common/IR/CommonTraits.h | 5 ++++- mlir/include/mlir/Dialect/Common/IR/StdOps.td.inc | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h index 34e3e8fda..a5d838d09 100644 --- a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h +++ b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h @@ -18,7 +18,7 @@ namespace mqt::ir::common { // TODO: via helper class (no default ctor) ensure that array is fully explicitly initialized -template X> class TargetArityTrait { +template DefinitionMatrix> class TargetArityTrait { public: template class Impl : public mlir::OpTrait::TraitBase { @@ -31,6 +31,9 @@ template X> class TargetArity } return mlir::success(); } + + [[nodiscard]] static auto getDefinitionMatrix() { return DefinitionMatrix; } + [[nodiscard]] static auto getDefinitionMatrix(int x, int y) { return DefinitionMatrix[y * (1 << N) + x]; } }; }; diff --git a/mlir/include/mlir/Dialect/Common/IR/StdOps.td.inc b/mlir/include/mlir/Dialect/Common/IR/StdOps.td.inc index 675c4b992..564b70cad 100644 --- a/mlir/include/mlir/Dialect/Common/IR/StdOps.td.inc +++ b/mlir/include/mlir/Dialect/Common/IR/StdOps.td.inc @@ -22,7 +22,7 @@ def GPhaseOp : UnitaryOp<"gphase", [NoTarget, OneParameter]> { }]; } -def IOp : UnitaryOp<"i", [OneTarget, NoParameter]> { +def IOp : UnitaryOp<"i", [TargetArity<1, [1, 0, 0, 1]>, NoParameter]> { let summary = "I operation"; let description = [{ From 071ba0b473cdd5d2ba7d63c2778ff7c51d9c51cb Mon Sep 17 00:00:00 2001 From: Tamino Bauknecht Date: Fri, 19 Sep 2025 19:50:16 +0200 Subject: [PATCH 09/12] try to make it work with parameters --- .../mlir/Dialect/Common/IR/CommonTraits.h | 39 +++++++++++++++++-- .../mlir/Dialect/Common/IR/CommonTraits.td | 32 ++++++++++++++- .../mlir/Dialect/Common/IR/StdOps.td.inc | 2 +- 3 files changed, 67 insertions(+), 6 deletions(-) diff --git a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h index a5d838d09..7ccf0741a 100644 --- a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h +++ b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h @@ -11,14 +11,45 @@ #pragma once #include +#include #include #include #include #include +#include namespace mqt::ir::common { -// TODO: via helper class (no default ctor) ensure that array is fully explicitly initialized -template DefinitionMatrix> class TargetArityTrait { +struct DefinitionMatrixElement { + enum class Type { + Value, + ParameterIndex, + }; + enum class Transformation { + Identity, + Sin, + Cos, + }; + + double value; + Type type; + Transformation transformation = Transformation::Identity; + + double operator()() { + switch (transformation) { + case Transformation::Identity: + return value; + case Transformation::Sin: + return std::sin(value); + case Transformation::Cos: + return std::cos(value); + } + return value; + } +}; + +template + DefinitionMatrix> +class TargetArityTrait { public: template class Impl : public mlir::OpTrait::TraitBase { @@ -33,7 +64,9 @@ template DefinitionMatrix> cl } [[nodiscard]] static auto getDefinitionMatrix() { return DefinitionMatrix; } - [[nodiscard]] static auto getDefinitionMatrix(int x, int y) { return DefinitionMatrix[y * (1 << N) + x]; } + [[nodiscard]] static double getDefinitionMatrix(int x, int y) { + return DefinitionMatrix[y * (1 << N) + x](); + } }; }; diff --git a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td index aa7f8fd8b..1629d80a0 100644 --- a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td +++ b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td @@ -14,10 +14,38 @@ include "mlir/IR/EnumAttr.td" include "mlir/IR/DialectBase.td" include "mlir/Interfaces/SideEffectInterfaces.td" -class TargetArity MatrixDefinition = []> +class DecimalFraction { + int Before = BeforeSeparator; + int After = AfterSeparator; +} +class Int : DecimalFraction; + +class DefinitionElementType { + int id = Id; +} +def Value : DefinitionElementType<0>; +def ParameterIndex : DefinitionElementType<1>; + +class FunctionType { + int id = Id; +} + +def Identity : FunctionType<0>; +def Sin : FunctionType<1>; +def Cos : FunctionType<2>; + +class DefinitionElement { + DecimalFraction v = V; + DefinitionElementType t = T; + FunctionType f = F; +} + +class Value : DefinitionElement; + +class TargetArity MatrixDefinition = []> : ParamNativeOpTrait< "TargetArityTrait", - !cast(N) # ", {" # !interleave(MatrixDefinition, ", ") # "}" + !cast(N) # ", {" # !foldl("", MatrixDefinition, acc, var, "{ " # var.v.Before # "." # var.v.After # ", " # !cond(!eq(var.t, Value) : "mqt::ir::common::DefinitionMatrixElement::Type::Value") # ", " # !cond(!eq(var.f, Identity) : "mqt::ir::common::DefinitionMatrixElement::Transformation::Identity") # " }") # "}" > { let cppNamespace = "::mqt::ir::common"; } diff --git a/mlir/include/mlir/Dialect/Common/IR/StdOps.td.inc b/mlir/include/mlir/Dialect/Common/IR/StdOps.td.inc index 564b70cad..ebf57c77a 100644 --- a/mlir/include/mlir/Dialect/Common/IR/StdOps.td.inc +++ b/mlir/include/mlir/Dialect/Common/IR/StdOps.td.inc @@ -22,7 +22,7 @@ def GPhaseOp : UnitaryOp<"gphase", [NoTarget, OneParameter]> { }]; } -def IOp : UnitaryOp<"i", [TargetArity<1, [1, 0, 0, 1]>, NoParameter]> { +def IOp : UnitaryOp<"i", [TargetArity<1, [Value>, Value>, Value>, Value>]>, NoParameter]> { let summary = "I operation"; let description = [{ From d59ad46596d9ed0910c1a6b0f44d2deb32fc2c9b Mon Sep 17 00:00:00 2001 From: Tamino Bauknecht Date: Fri, 19 Sep 2025 20:09:28 +0200 Subject: [PATCH 10/12] maybe working parameterized definition matrix --- .../mlir/Dialect/Common/IR/CommonTraits.h | 35 ++++++++++++------- .../mlir/Dialect/Common/IR/CommonTraits.td | 2 +- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h index 7ccf0741a..481b2992d 100644 --- a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h +++ b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h @@ -35,21 +35,28 @@ struct DefinitionMatrixElement { Transformation transformation = Transformation::Identity; double operator()() { - switch (transformation) { - case Transformation::Identity: + if (type == Type::Value) { + switch (transformation) { + case Transformation::Identity: + return value; + case Transformation::Sin: + return std::sin(value); + case Transformation::Cos: + return std::cos(value); + } return value; - case Transformation::Sin: - return std::sin(value); - case Transformation::Cos: - return std::cos(value); + } else { + // TODO } - return value; } }; -template - DefinitionMatrix> -class TargetArityTrait { +template struct DefinitionMatrix { + static constexpr std::size_t MatrixSize = 1 << NumQubits; + std::array matrix; +}; + +template Matrix> class TargetArityTrait { public: template class Impl : public mlir::OpTrait::TraitBase { @@ -63,9 +70,11 @@ class TargetArityTrait { return mlir::success(); } - [[nodiscard]] static auto getDefinitionMatrix() { return DefinitionMatrix; } - [[nodiscard]] static double getDefinitionMatrix(int x, int y) { - return DefinitionMatrix[y * (1 << N) + x](); + [[nodiscard]] static auto getDefinitionMatrix() { return Matrix; } + [[nodiscard]] static double getDefinitionMatrix(mlir::Operation* op, int x, + int y) { + return 0.0; + // return Matrix[y * (1 << N) + x](); } }; }; diff --git a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td index 1629d80a0..550ec9a60 100644 --- a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td +++ b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.td @@ -45,7 +45,7 @@ class Value : DefinitionElement; class TargetArity MatrixDefinition = []> : ParamNativeOpTrait< "TargetArityTrait", - !cast(N) # ", {" # !foldl("", MatrixDefinition, acc, var, "{ " # var.v.Before # "." # var.v.After # ", " # !cond(!eq(var.t, Value) : "mqt::ir::common::DefinitionMatrixElement::Type::Value") # ", " # !cond(!eq(var.f, Identity) : "mqt::ir::common::DefinitionMatrixElement::Transformation::Identity") # " }") # "}" + !cast(N) # ", {{" # !foldl("", MatrixDefinition, acc, var, "[]([[maybe_unused]] mlir::ValueRange params) { return " # !cond(!eq(var.f, Identity) : "std::identity{}(") # !cond(!eq(var.t, Value) : var.v.Before # "." # var.v.After) # "); }") # "}}" > { let cppNamespace = "::mqt::ir::common"; } From 86a043a35f7e43dfa977fec6b1dcb3b4b9966f04 Mon Sep 17 00:00:00 2001 From: Tamino Bauknecht Date: Thu, 9 Oct 2025 13:09:02 +0200 Subject: [PATCH 11/12] cleanup --- .../mlir/Dialect/Common/IR/CommonTraits.h | 64 ++++++++----------- 1 file changed, 28 insertions(+), 36 deletions(-) diff --git a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h index 481b2992d..b271e4051 100644 --- a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h +++ b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h @@ -13,47 +13,35 @@ #include #include #include +#include #include #include #include #include namespace mqt::ir::common { -struct DefinitionMatrixElement { - enum class Type { - Value, - ParameterIndex, - }; - enum class Transformation { - Identity, - Sin, - Cos, - }; - double value; - Type type; - Transformation transformation = Transformation::Identity; +template struct DefinitionMatrix { + static constexpr std::size_t MatrixSize = 1 << NumQubits; + + template + using MatrixType = std::array; - double operator()() { - if (type == Type::Value) { - switch (transformation) { - case Transformation::Identity: - return value; - case Transformation::Sin: - return std::sin(value); - case Transformation::Cos: - return std::cos(value); - } - return value; - } else { - // TODO - } + MatrixType matrix; + + static constexpr std::size_t index(std::size_t x, std::size_t y) { + return (y * MatrixSize) + x; } -}; -template struct DefinitionMatrix { - static constexpr std::size_t MatrixSize = 1 << NumQubits; - std::array matrix; + constexpr MatrixType getMatrix(mlir::ValueRange params) { + // TODO? lazy-initialized cache + MatrixType result; + static_assert(result.size() == matrix.size()); + for (std::size_t i = 0; i < result.size(); ++i) { + result[i] = matrix[i](params); + } + return result; + } }; template Matrix> class TargetArityTrait { @@ -70,11 +58,15 @@ template Matrix> class TargetArityTrait { return mlir::success(); } - [[nodiscard]] static auto getDefinitionMatrix() { return Matrix; } - [[nodiscard]] static double getDefinitionMatrix(mlir::Operation* op, int x, - int y) { - return 0.0; - // return Matrix[y * (1 << N) + x](); + [[nodiscard]] static auto getDefinitionMatrix() { + return Matrix; + } + [[nodiscard]] static auto getDefinitionMatrix(mlir::Operation* op) { + auto concreteOp = mlir::cast(op); + return Matrix.getMatrix(concreteOp.getParams()); + } + [[nodiscard]] static double getDefinitionMatrixElement(mlir::Operation* op, std::size_t x, std::size_t y) { + return getDefinitionMatrix(op).at(DefinitionMatrix::index(x, y)); } }; }; From 200dc17e6f426fdc6cf350910821320d3e13768f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 9 Oct 2025 11:10:05 +0000 Subject: [PATCH 12/12] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mlir/include/mlir/Dialect/Common/IR/CommonTraits.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h index b271e4051..9009fb5db 100644 --- a/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h +++ b/mlir/include/mlir/Dialect/Common/IR/CommonTraits.h @@ -24,10 +24,10 @@ namespace mqt::ir::common { template struct DefinitionMatrix { static constexpr std::size_t MatrixSize = 1 << NumQubits; - template + template using MatrixType = std::array; - MatrixType matrix; + MatrixType matrix; static constexpr std::size_t index(std::size_t x, std::size_t y) { return (y * MatrixSize) + x; @@ -58,14 +58,14 @@ template Matrix> class TargetArityTrait { return mlir::success(); } - [[nodiscard]] static auto getDefinitionMatrix() { - return Matrix; - } + [[nodiscard]] static auto getDefinitionMatrix() { return Matrix; } [[nodiscard]] static auto getDefinitionMatrix(mlir::Operation* op) { auto concreteOp = mlir::cast(op); return Matrix.getMatrix(concreteOp.getParams()); } - [[nodiscard]] static double getDefinitionMatrixElement(mlir::Operation* op, std::size_t x, std::size_t y) { + [[nodiscard]] static double getDefinitionMatrixElement(mlir::Operation* op, + std::size_t x, + std::size_t y) { return getDefinitionMatrix(op).at(DefinitionMatrix::index(x, y)); } };