Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
117 commits
Select commit Hold shift + click to select a range
7e25940
add base qtensor implementation
Feb 26, 2026
8f65b5a
add additional operations
Feb 26, 2026
affb356
adjust build functions
Mar 1, 2026
c7dc6a5
add builders in QCO
Mar 1, 2026
efa7aff
add canonicalization for extract
Mar 1, 2026
3c3901e
add additional canonicalization
Mar 2, 2026
fd009b6
add tests for qtensor
Mar 2, 2026
8cefca0
copy tensor insertslice
Mar 2, 2026
78bf30b
add additional tests
Mar 2, 2026
596636c
add docstrings in QCOProgramBuilder
Mar 2, 2026
bb093a2
adjust builder functions in QCOProgramBuilder
Mar 2, 2026
b705471
add general canonicalization
Mar 2, 2026
4b310cd
fix wrong operation in folExtractAfterInsertSlice
Mar 2, 2026
b8cf644
adjust structure of qtensor dialect
Mar 2, 2026
34af394
adjust headers
Mar 3, 2026
85906f8
refactor dialect structure
Mar 3, 2026
bdd1753
fix issues in copied code
Mar 3, 2026
bd06b9d
smaller fixes
Mar 4, 2026
f905111
Merge remote-tracking branch 'upstream/main' into qtensor
Mar 4, 2026
5eea7b9
remove memref interface for now
Mar 4, 2026
9817a9b
remove duplicated code
Mar 4, 2026
a4c9713
add allocTensorOp
Mar 5, 2026
1f767de
fix some headers
Mar 5, 2026
0523a00
Merge remote-tracking branch 'upstream/main' into qtensor
Mar 5, 2026
6f2a2a5
add allocDeallocPair canonicalization
Mar 5, 2026
b1f18e6
fix linter issues
Mar 5, 2026
9dacf34
remove unused code
Mar 5, 2026
c30daaa
🎨 pre-commit fixes
pre-commit-ci[bot] Mar 5, 2026
511cfc0
more linter issue fixes
Mar 5, 2026
03bc636
update slice operations to newer version
Mar 7, 2026
a47cee6
update descriptions and docs to fit project style
Mar 7, 2026
6f8dcb6
remove useless functions
Mar 7, 2026
0750cc8
add fromTensor test
Mar 9, 2026
5865cc2
fix linter issue
Mar 9, 2026
092024c
smaller fixes
Mar 9, 2026
496425a
add source of copied parts
Mar 9, 2026
aca212d
adjust tablegen file
Mar 9, 2026
aa91580
add additional test for dynamic indices
Mar 9, 2026
edd2151
remove redundant dialect includes
Mar 9, 2026
8147bb1
address code rabbit suggestions
Mar 9, 2026
509205d
fix linter issues
Mar 9, 2026
45a457a
address more coderabbit suggestions
Mar 9, 2026
b9824b2
fix typo
Mar 9, 2026
892443a
rename test name
Mar 9, 2026
16541bb
separate tensor and qubit tracking
Mar 9, 2026
98befe5
Merge remote-tracking branch 'upstream/main' into qtensor
Mar 9, 2026
4c15542
fix linter issues
Mar 9, 2026
cdc77e8
address more coderabbit feedback
Mar 9, 2026
8473d1d
more coderabbit suggestions
Mar 9, 2026
5109e32
more coderabbit feedback
Mar 9, 2026
b2766ed
address review feedback
Mar 10, 2026
a108608
correct error message
Mar 10, 2026
c91e17d
use newer style of operation creation
Mar 10, 2026
840a0fb
add missing word
Mar 10, 2026
74ac8b7
fix name in CMakeLists
Mar 10, 2026
c6593d6
more coderabbit fixes
Mar 10, 2026
76459db
more coderabbit fixes
Mar 10, 2026
1d78b38
make strides optional and set default values
Mar 10, 2026
8cb17d9
remove conversion to tensor operations for insertOp and fromElementsOp
Mar 10, 2026
6c0885a
Merge remote-tracking branch 'upstream/main' into qtensor
Mar 10, 2026
df1f5d8
address coderabbit suggestions
Mar 10, 2026
7cc00fa
remove redundant tests
Mar 10, 2026
38d8d37
Apply suggestions from code review
li-mingbao Mar 12, 2026
7cf19f3
🎨 pre-commit fixes
pre-commit-ci[bot] Mar 12, 2026
b27e5d9
simplify implementation by only allowing dynamic size and offset
Mar 11, 2026
a1f86ad
adjust extractSlice and insertSlice operations
Mar 12, 2026
c248490
rename class names
Mar 12, 2026
8133739
refactor implementation
Mar 12, 2026
caa7784
rename builder function names
Mar 12, 2026
368b69c
add sameIndex function to check for identical index values
Mar 12, 2026
8e869d3
remove more redundant code
Mar 12, 2026
910a076
minor fixes
Mar 12, 2026
9a727a8
rearrange verifiers and add docstrings
Mar 12, 2026
7546009
clean up headers
Mar 12, 2026
4656a86
apply changes to tests
Mar 12, 2026
61eb098
rearrange tablegen file
Mar 12, 2026
3c4f5db
removed unused interface
Mar 12, 2026
97b8b1b
reorder results of extract and extractSliceOp
Mar 12, 2026
a19cc25
Merge remote-tracking branch 'upstream/main' into qtensor
Mar 12, 2026
9135e7a
remove redundant builder
Mar 12, 2026
21c8860
fix linter issues
Mar 12, 2026
ba96c3b
fix extractInsert fold
Mar 12, 2026
fdadc42
add additional tests and rename tests
Mar 12, 2026
aa532e8
fix linter issues
Mar 12, 2026
db886ad
clean up code a bit
Mar 13, 2026
a405300
Merge remote-tracking branch 'upstream/main' into qtensor
Mar 13, 2026
3d8d1c7
fix linter issues
Mar 13, 2026
fc615a4
address coderabbit comments
Mar 13, 2026
6195f23
address more coderabbit comments
Mar 13, 2026
a343e0f
fix typo
Mar 13, 2026
0c05031
Apply suggestions from code review
li-mingbao Mar 15, 2026
ff9f278
simplify code and use 1D tensor as type
Mar 15, 2026
bb6d65c
add qubit type constraint in tablegen to simplify verifiers
Mar 15, 2026
0027839
remove redundant headers
Mar 16, 2026
01bddad
Update CHANGELOG.md
Mar 16, 2026
7f41930
fix linter issues
Mar 16, 2026
0261825
apply coderabbit suggestions
Mar 16, 2026
60bb305
apply coderabbit feedback
Mar 16, 2026
b034a3b
fix linter issue
Mar 16, 2026
c05500a
Merge remote-tracking branch 'upstream/main' into qtensor
Mar 16, 2026
1937a75
fix grammar mistakes
Mar 16, 2026
d265531
Apply suggestions from code review
li-mingbao Mar 18, 2026
46d06a8
update the descriptions
Mar 18, 2026
6cc90e6
apply code review suggestions and simplify code
Mar 18, 2026
a8cbaf6
remove dead code
Mar 18, 2026
4799bb8
remove redundant helper function
Mar 18, 2026
d7bc3e2
add dynamic sizes for allocOp
Mar 18, 2026
7414ebd
apply coderabbit feedback
Mar 18, 2026
2a5a25c
address coderabbit comments and linter issues
Mar 18, 2026
2afb9e6
add back accidently removed functioN
Mar 18, 2026
b31cf8d
add additional tests at different indices and offsets
Mar 18, 2026
d16d34d
Merge branch 'main' into qtensor
denialhaag Mar 18, 2026
45ca236
Merge branch 'main' into qtensor
denialhaag Mar 19, 2026
2e7195b
Address the Rabbit's comments
denialhaag Mar 18, 2026
83c936a
Move dialect definition to separate TableGen file
denialhaag Mar 19, 2026
755a2ce
Fix generation of QTensorDialect.md
denialhaag Mar 19, 2026
86d631b
Address the Rabbit's new comments
denialhaag Mar 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ This project adheres to [Semantic Versioning], with the exception that minor rel
- ✨ Add conversions between Jeff and QCO ([#1479], [#1548], [#1565]) ([**@denialhaag**])
- ✨ Add a `place-and-route` pass for mapping circuits to architectures with restricted topologies ([#1537], [#1547], [#1568]) ([**@MatthiasReumann**])
- ✨ Add initial infrastructure for new QC and QCO MLIR dialects
([#1264], [#1330], [#1402], [#1428], [#1430], [#1436], [#1443], [#1446], [#1464], [#1465], [#1470], [#1471], [#1472], [#1474], [#1475], [#1506], [#1510], [#1513], [#1521], [#1548], [#1550], [#1554], [#1570])
([#1264], [#1330], [#1402], [#1428], [#1430], [#1436], [#1443], [#1446], [#1464], [#1465], [#1470], [#1471], [#1472], [#1474], [#1475], [#1506], [#1510], [#1513], [#1521], [#1542], [#1548], [#1550], [#1554], [#1570])
Comment thread
denialhaag marked this conversation as resolved.
([**@burgholzer**], [**@denialhaag**], [**@taminob**], [**@DRovara**], [**@li-mingbao**], [**@Ectras**], [**@MatthiasReumann**], [**@simon1hofmann**])

### Changed
Expand Down Expand Up @@ -343,6 +343,7 @@ _📚 Refer to the [GitHub Release Notes](https://github.com/munich-quantum-tool
[#1549]: https://github.com/munich-quantum-toolkit/core/pull/1549
[#1548]: https://github.com/munich-quantum-toolkit/core/pull/1548
[#1547]: https://github.com/munich-quantum-toolkit/core/pull/1547
[#1542]: https://github.com/munich-quantum-toolkit/core/pull/1542
[#1537]: https://github.com/munich-quantum-toolkit/core/pull/1537
[#1521]: https://github.com/munich-quantum-toolkit/core/pull/1521
[#1513]: https://github.com/munich-quantum-toolkit/core/pull/1513
Expand Down
7 changes: 7 additions & 0 deletions docs/mlir/QTensor.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
tocdepth: 3
---

```{include} Dialects/QTensorDialect.md
:heading-offset: 1
```
5 changes: 4 additions & 1 deletion docs/mlir/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ We define multiple dialects, each with its dedicated purpose:

- The {doc}`QCO dialect <QCO>` uses value semantics and is mainly designed for running optimizations.

Both dialects define various canonicalization and transformations that enable the compilation of quantum programs to native quantum hardware.
- The {doc}`QTensor dialect <QTensor>` adds support for one-dimensional tensors of qubits with linear typing and is used in the QCO dialect to represent collections of qubits such as registers.

These dialects define various canonicalization and transformations that enable the compilation of quantum programs to native quantum hardware.

For intercompatibility, we provide {doc}`conversions <Conversions>` between dialects.
So far, this comprises conversions between QC and QCO as well as from QC to QIR.
Expand All @@ -18,6 +20,7 @@ So far, this comprises conversions between QC and QCO as well as from QC to QIR.

QC
QCO
QTensor
Conversions
```

Expand Down
1 change: 1 addition & 0 deletions mlir/include/mlir/Dialect/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@

add_subdirectory(QC)
add_subdirectory(QCO)
add_subdirectory(QTensor)
208 changes: 203 additions & 5 deletions mlir/include/mlir/Dialect/QCO/Builder/QCOProgramBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,182 @@ class QCOProgramBuilder final : public ImplicitLocOpBuilder {
[[nodiscard]] ClassicalRegister
allocClassicalBitRegister(int64_t size, std::string name = "c") const;

//===--------------------------------------------------------------------===//
// QTensor operations
//===--------------------------------------------------------------------===//
Comment thread
li-mingbao marked this conversation as resolved.

/**
* @brief Allocate a qubit tensor
*
* @details
* Allocates a one-dimensional tensor of !qco.qubit types with the given size
* if the size is a constant, otherwise the tensor has dynamic size. The
* qubits are initialized in the |0> state. The resulting tensor is added to
* the tracking.
*
* @param size Number of qubits (must be positive)
* @return The allocated tensor
*
* @par Example:
* ```c++
* auto tensor = builder.qtensorAlloc(3);
* ```
* ```mlir
* %tensor = qtensor.alloc(%c3) : tensor<3x!qco.qubit>
* ```
Comment thread
coderabbitai[bot] marked this conversation as resolved.
*/
Value qtensorAlloc(const std::variant<int64_t, Value>& size);

/**
* @brief Allocate a qubit tensor from a list of qubit values
*
* @details
* Consumes the input qubits and creates a one-dimensional tensor of
* !qco.qubit types. The resulting tensor has a static size given by the
* number of input values. The consumed qubits are removed from the qubit
* tracking and the resulting tensor is added to the tracking.
*
* @param elements Inserted Qubits (must be valid/unconsumed)
* @return The allocated tensor
Comment thread
burgholzer marked this conversation as resolved.
*
* @par Example:
* ```c++
* auto tensor = builder.qtensorFromElements({q0, q1, q2});
* ```
* ```mlir
* %tensor = qtensor.from_elements %q0, %q1, %q2 : tensor<3x!qco.qubit>
* ```
*/
Value qtensorFromElements(ValueRange elements);

/**
* @brief Extract a qubit from a tensor
*
* @details
* Extracts a qubit from a one-dimensional tensor of qubits at the given index
* and returns the updated tensor and the extracted qubit. The extracted qubit
* is added to the qubit tracking and the tracking of the source tensor is
* updated.
*
* @param tensor Source tensor (must be valid/unconsumed)
* @param index The index from where the qubit is extracted
* @return Pair of (outTensor, extractedQubit)
*
* @par Example:
* ```c++
* auto [outTensor, q0] = builder.qtensorExtract(tensor, 0);
* ```
* ```mlir
* %outTensor, %q0 = qtensor.extract %tensor[%c0]: tensor<3x!qco.qubit>
* ```
*/
std::pair<Value, Value>
qtensorExtract(Value tensor, const std::variant<int64_t, Value>& index);

/**
* @brief Extract a qubit slice from a tensor
*
* @details
* Extracts a slice from a one-dimensional tensor of qubits at the given
* offset and size and returns the updated input tensor and the extracted
* tensor. The extracted tensor is added to the qubit tensor tracking and the
* tracking for the input tensor is updated.
*
* @param tensor Source tensor (must be valid/unconsumed)
* @param offset The offset from where the slice is extracted
* @param size The size of the extracted slice
* @return Pair of (outTensor, extractedSlice)
*
* @par Example:
* ```c++
* auto [outTensor, extractedSlice] = builder.qtensorExtractSlice(tensor, 0,
* 2);
* ```
* ```mlir
* %outTensor, %extractedSlice = qtensor.extract_slice %tensor[%c0][%c2]
* : tensor<3x!qco.qubit> to tensor<2x!qco.qubit>
* ```
*/
Comment thread
coderabbitai[bot] marked this conversation as resolved.
std::pair<Value, Value>
qtensorExtractSlice(Value tensor, const std::variant<int64_t, Value>& offset,
const std::variant<int64_t, Value>& size);

/**
* @brief Insert a qubit into a tensor
*
* @details
* Inserts a scalar qubit into the one-dimensional tensor of qubits at the
* given index. The inserted qubit is consumed and removed from the qubit
* tracking while the tracking for the source tensor is updated.
*
* @param scalar The scalar qubit that is inserted (must be valid/unconsumed)
* @param tensor The tensor where the qubit is inserted (must be
* valid/unconsumed)
* @param index The index into where the qubit is inserted
* @return The output tensor
*
* @par Example:
* ```c++
* auto outTensor = builder.qtensorInsert(q0, tensor, 0);
* ```
* ```mlir
* %outTensor = qtensor.insert %q0 into %tensor[%c0] : tensor<3x!qco.qubit>
* ```
*/
Value qtensorInsert(Value scalar, Value tensor,
const std::variant<int64_t, Value>& index);

/**
* @brief Insert a qubit slice into a tensor
*
* @details
* Inserts a one-dimensional tensor of qubits into another one-dimensional
* tensor of qubits at the given offset and size. The inserted tensor slice is
* consumed and removed from the tracking, while the tracking for the
* destination tensor is updated.
*
* @param sourceTensor The slice that is inserted (must be valid/unconsumed)
* @param destTensor The tensor where the slice is inserted (must be
* valid/unconsumed)
* @param offset The offset into where the slice is inserted
* @param size The size of the inserted slice
* @return The output tensor
*
* @par Example:
* ```c++
* auto outTensor = builder.qtensorInsertSlice(slicedTensor, tensor, 0, 2);
* ```
* ```mlir
* %outTensor = qtensor.insert_slice %slicedTensor into %tensor[%c0][%c2]
* : tensor<2x!qco.qubit> into tensor<3x!qco.qubit>
* ```
*/
Value qtensorInsertSlice(Value sourceTensor, Value destTensor,
const std::variant<int64_t, Value>& offset,
const std::variant<int64_t, Value>& size);

/**
* @brief Explicitly deallocate a tensor
*
* @details
* Validates and removes the tensor from tracking. Qubits or tensors of qubits
* that were extracted from the tensor but not inserted back again need to be
* deallocated separately. Optional; `finalize()` automatically deallocates
* all remaining tensors.
Comment thread
coderabbitai[bot] marked this conversation as resolved.
*
* @param tensor Tensor to deallocate (must be valid/unconsumed)
* @return Reference to this builder for method chaining
*
* @par Example:
* ```c++
* builder.qtensorDealloc(tensor);
* ```
* ```mlir
* qtensor.dealloc %tensor : tensor<3x!qco.qubit>
* ```
*/
QCOProgramBuilder& qtensorDealloc(Value tensor);
Comment thread
coderabbitai[bot] marked this conversation as resolved.

//===--------------------------------------------------------------------===//
// Measurement and Reset
//===--------------------------------------------------------------------===//
Expand Down Expand Up @@ -1055,7 +1231,7 @@ class QCOProgramBuilder final : public ImplicitLocOpBuilder {
* @brief Explicitly deallocate a qubit
*
* @details
* Validates and removes the qubit from tracking. Optional, finalize()
* Validates and removes the qubit from tracking. Optional; `finalize()`
* automatically deallocates all remaining qubits.
*
* @param qubit Qubit to deallocate (must be valid/unconsumed)
Expand Down Expand Up @@ -1124,10 +1300,10 @@ class QCOProgramBuilder final : public ImplicitLocOpBuilder {
* @brief Finalize the program and return the constructed module
*
* @details
* Automatically deallocates all remaining valid qubits, adds a return
* statement with exit code 0 (indicating successful execution), and
* transfers ownership of the module to the caller.
* The builder should not be used after calling this method.
* Automatically deallocates all remaining valid qubits and tensors of qubits,
* adds a return statement with exit code 0 (indicating successful execution),
* and transfers ownership of the module to the caller. The builder should not
* be used after calling this method.
*
* @return OwningOpRef containing the constructed quantum program module
*/
Expand Down Expand Up @@ -1176,5 +1352,27 @@ class QCOProgramBuilder final : public ImplicitLocOpBuilder {
/// When an operation consumes a qubit and produces a new one, the old value
/// is removed and the new output is added.
llvm::DenseSet<Value> validQubits;

/**
* @brief Validate that a tensor value is valid and unconsumed. This also
* checks if the tensor is one-dimensional and contains !qco.qubit as its
* values
* @param tensor Tensor value to validate
* @throws Aborts if tensor is not tracked (consumed or never created)
*/
void validateTensorValue(Value tensor) const;

/**
* @brief Update tracking when an operation consumes and produces a tensor
* @param inputTensor Input tensor being consumed (must be valid)
* @param outputTensor New output tensor being produced
*/
void updateTensorTracking(Value inputTensor, Value outputTensor);

/// Track valid (unconsumed) tensor SSA values for linear type enforcement.
/// Only values present in this set are valid for use in operations.
/// When an operation consumes a tensor and produces a new one, the old value
/// is removed and the new output is added.
llvm::DenseSet<Value> validTensors;
};
} // namespace mlir::qco
9 changes: 9 additions & 0 deletions mlir/include/mlir/Dialect/QTensor/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Copyright (c) 2023 - 2026 Chair for Design Automation, TUM
# Copyright (c) 2025 - 2026 Munich Quantum Software Company GmbH
# All rights reserved.
#
# SPDX-License-Identifier: MIT
#
# Licensed under the MIT License

add_subdirectory(IR)
11 changes: 11 additions & 0 deletions mlir/include/mlir/Dialect/QTensor/IR/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Copyright (c) 2023 - 2026 Chair for Design Automation, TUM
# Copyright (c) 2025 - 2026 Munich Quantum Software Company GmbH
# All rights reserved.
#
# SPDX-License-Identifier: MIT
#
# Licensed under the MIT License

add_mlir_dialect(QTensorOps qtensor)

add_mlir_doc(QTensorOps QTensorDialect Dialects/ -gen-dialect-doc -dialect=qtensor)
29 changes: 29 additions & 0 deletions mlir/include/mlir/Dialect/QTensor/IR/QTensorDialect.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
* Copyright (c) 2023 - 2026 Chair for Design Automation, TUM
* Copyright (c) 2025 - 2026 Munich Quantum Software Company GmbH
* All rights reserved.
*
* SPDX-License-Identifier: MIT
*
* Licensed under the MIT License
*/

#pragma once

#include <mlir/IR/Dialect.h>
#include <mlir/IR/OpDefinition.h>

#define DIALECT_NAME_QTensor "qtensor"

//===----------------------------------------------------------------------===//
// QTensor Dialect
//===----------------------------------------------------------------------===//

#include "mlir/Dialect/QTensor/IR/QTensorOpsDialect.h.inc" // IWYU pragma: export

//===----------------------------------------------------------------------===//
// Types
//===----------------------------------------------------------------------===//

#define GET_TYPEDEF_CLASSES
#include "mlir/Dialect/QTensor/IR/QTensorOpsTypes.h.inc" // IWYU pragma: export
30 changes: 30 additions & 0 deletions mlir/include/mlir/Dialect/QTensor/IR/QTensorDialect.td
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// Copyright (c) 2023 - 2026 Chair for Design Automation, TUM
// Copyright (c) 2025 - 2026 Munich Quantum Software Company GmbH
// All rights reserved.
//
// SPDX-License-Identifier: MIT
//
// Licensed under the MIT License

#ifndef MLIR_DIALECT_QTENSOR_IR_QTENSORDIALECT_TD
#define MLIR_DIALECT_QTENSOR_IR_QTENSORDIALECT_TD

include "mlir/IR/DialectBase.td"

def QTensorDialect : Dialect {
let name = "qtensor";

let summary = "The QTensor dialect for one-dimensional tensors of qubits with linear typing.";

let description = [{
The QTensor dialect is an adjusted variant of the standard tensor dialect of MLIR that supports linear typing for one-dimensional tensors of qubits.
In order to support linear typing, the extract operations of this dialect are modified so that they also return the updated tensor.
In addition, alloc/dealloc operations are added to the dialect to support the bulk allocation and deallocation of qubit tensors with linear types.
}];

let dependentDialects = ["::mlir::qco::QCODialect"];

let cppNamespace = "::mlir::qtensor";
}

#endif // MLIR_DIALECT_QTENSOR_IR_QTENSORDIALECT_TD
32 changes: 32 additions & 0 deletions mlir/include/mlir/Dialect/QTensor/IR/QTensorOps.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
* Copyright (c) 2023 - 2026 Chair for Design Automation, TUM
* Copyright (c) 2025 - 2026 Munich Quantum Software Company GmbH
* All rights reserved.
*
* SPDX-License-Identifier: MIT
*
* Licensed under the MIT License
*/

#pragma once

// Suppress warnings about ambiguous reversed operators in MLIR
// (see https://github.com/llvm/llvm-project/issues/45853)
#include <mlir/IR/OpDefinition.h>
#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wambiguous-reversed-operator"
#endif
#include <mlir/Interfaces/InferTypeOpInterface.h>
#ifdef __clang__
#pragma clang diagnostic pop
#endif

#include "mlir/Dialect/QCO/IR/QCODialect.h"
#include "mlir/Dialect/QTensor/IR/QTensorDialect.h"

#include <mlir/Bytecode/BytecodeOpInterface.h>
#include <mlir/Interfaces/SideEffectInterfaces.h>

#define GET_OP_CLASSES
#include "mlir/Dialect/QTensor/IR/QTensorOps.h.inc" // IWYU pragma: export
Loading
Loading