Skip to content

✨ Add OpenQASM-to-QC translation#1780

Open
denialhaag wants to merge 46 commits into
mainfrom
open-qasm
Open

✨ Add OpenQASM-to-QC translation#1780
denialhaag wants to merge 46 commits into
mainfrom
open-qasm

Conversation

@denialhaag

@denialhaag denialhaag commented Jun 11, 2026

Copy link
Copy Markdown
Member

Description

This is a rebased version of #1671 after #1671 was automatically closed when #1751 was merged.

Original description by @J4MMlE:

Description

This PR adds a direct OpenQASM-to-QC translation that bypasses the qc::QuantumComputation.

The new flow reuses the existing parser and walks the AST directly to emit QC dialect ops. Skipping QuantumComputation removes an intermediate step and enables previously unsupported QASM3 features, such as gate modifiers, classical computations, and control flow structures.

What works

  • All standard gates plus Qiskit-style MCX variants
  • Gate modifiers: ctrl @, negctrl @, inv @, nested combinations
  • Register declarations, qubit/bit allocation
  • Measure, reset, barrier
  • if/else over quantum statements
  • Hardware qubits convert to qc.static
  • Broadcasting (register-width gate calls)

Current limitations

  • Gate parameters must be compile-time constants
  • pow modifier is unsupported (but will/should be once #1603 is merged)
  • Layout pragmas are unsupported (they have no equivalent in QC)

Checklist

  • The pull request only contains commits that are focused and relevant to this change.
  • I have added appropriate tests that cover the new/changed functionality.
  • I have updated the documentation to reflect these changes.
  • I have added entries to the changelog for any noteworthy additions, changes, fixes, or removals.
  • I have added migration instructions to the upgrade guide (if needed).
  • The changes follow the project's style guidelines and introduce no new warnings.
  • The changes are fully tested and pass the CI checks.
  • I have reviewed my own code changes.

@denialhaag denialhaag self-assigned this Jun 11, 2026
@denialhaag denialhaag added feature New feature or request MLIR Anything related to MLIR labels Jun 11, 2026
@denialhaag denialhaag added this to the MLIR Support milestone Jun 11, 2026
@codecov

codecov Bot commented Jun 11, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 81.43460% with 88 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
.../lib/Dialect/QC/Translation/TranslateQASM3ToQC.cpp 81.4% 88 Missing ⚠️

📢 Thoughts on this report? Let us know!

@denialhaag

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
mlir/lib/Dialect/QC/Translation/TranslateQASM3ToQC.cpp (1)

627-662: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Reject invalid operand counts before invoking the gate emitter.

Lines 627-662 check parameter arity, but never validate operand arity before the dispatch lambdas index q[0], q[1], or q.back(). That means too-few operands can trip assertions / out-of-bounds access, while too-many operands are silently ignored by single-target emitters. Please validate fixed-arity gates against their declared operand count and add explicit minimum-arity checks for the variadic mcx* / mcphase emitters before the broadcast loop.

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@mlir/lib/Dialect/QC/Translation/TranslateQASM3ToQC.cpp`:
- Around line 808-823: The current branch treats any qasm3::UnaryExpression as a
logical/bitwise not via an assert that is removed in release builds; update the
UnaryExpression handling to explicitly check unaryExpr->op and only proceed when
it equals qasm3::UnaryExpression::LogicalNot or BitwiseNot, otherwise throw
qasm3::CompilerError(debugInfo) (use the same debugInfo message pattern as other
errors). Keep the rest of the logic (casting operand to
qasm3::IndexedIdentifier, calling lookupBitValue, creating arith::XOrIOp via
builder) unchanged, but replace the assert with an explicit guard that throws
for unsupported ops.

In `@mlir/unittests/programs/qasm_programs.h`:
- Around line 357-358: Update the Doxygen comment for the ifNot declaration to
use present tense to match the file's style; change the sentence beginning
"Created a circuit with an if operation with a negated condition." to "Creates a
circuit with an if operation with a negated condition." so it consistently uses
"Creates" for the ifNot symbol.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 13850f71-e4cc-4e1a-b10c-66d2fd09ed29

📥 Commits

Reviewing files that changed from the base of the PR and between 39142e9 and ebafce2.

📒 Files selected for processing (4)
  • mlir/lib/Dialect/QC/Translation/TranslateQASM3ToQC.cpp
  • mlir/unittests/Dialect/QC/Translation/test_qasm3_translation.cpp
  • mlir/unittests/programs/qasm_programs.cpp
  • mlir/unittests/programs/qasm_programs.h

Comment thread mlir/lib/Dialect/QC/Translation/TranslateQASM3ToQC.cpp
Comment thread mlir/unittests/programs/qasm_programs.h Outdated
@denialhaag

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
mlir/lib/Dialect/QC/Translation/TranslateQASM3ToQC.cpp (3)

868-869: 🩺 Stability & Availability | 🟠 Major

Guard indexExpressions length before indexing [0] in TranslateQASM3ToQC.cpp

After only checking indices.size() <= 1, these helpers immediately read ...->indexExpressions[0] without ensuring the single IndexOperator actually contains exactly one indexExpression. Parser::parseIndexOperator can produce an empty indexExpressions vector (e.g., id[]), and TypeCheckPass doesn’t reject empty indexExpressions, so this can lead to out-of-bounds access.

Suggested guard pattern
-    const auto& indexExpression = id->indices[0]->indexExpressions[0];
+    const auto& indexExpressions = id->indices[0]->indexExpressions;
+    if (indexExpressions.size() != 1) {
+      throw qasm3::CompilerError("Only single-index expressions are supported.",
+                                 debugInfo);
+    }
+    const auto& indexExpression = indexExpressions[0];

Applies to: 868-869, 934-935, 967-968

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@mlir/lib/Dialect/QC/Translation/TranslateQASM3ToQC.cpp` around lines 868 -
869, Guard accesses into indexExpressions before reading [0]: in places that
read id->indices[0]->indexExpressions[0] (used with evaluatePositiveConstant and
debugInfo), check that id->indices.size() > 0 and that
id->indices[0]->indexExpressions.size() > 0 and handle the empty case (emit an
error via debugInfo or return/fail gracefully) to avoid out-of-bounds access;
similarly update the other occurrences that access indexExpressions[0] (same
pattern as above) and prefer early-return or diagnostic logging consistent with
surrounding helpers so callers like evaluatePositiveConstant aren’t passed an
invalid reference.

322-327: 🎯 Functional Correctness | 🟠 Major

QASM2 if (creg == N) hard-fails because translateCondition rejects BinaryExpression even in OpenQASM2 compat mode.

visitVersionDeclaration enables openQASM2CompatMode for OpenQASM2 (<3), but translateCondition (used to build the scf::IfOp condition) supports only IndexedIdentifier and unary !/~; any qasm3::BinaryExpression (e.g., creg == N / !=) immediately throws Register comparisons are not supported. openQASM2CompatMode is only applied to gate-call parsing (implicit leading c controls), not condition lowering (so measurement results in bitValues don’t help for these comparisons).
File: mlir/lib/Dialect/QC/Translation/TranslateQASM3ToQC.cpp (322-327, 832-836)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@mlir/lib/Dialect/QC/Translation/TranslateQASM3ToQC.cpp` around lines 322 -
327, visitVersionDeclaration sets openQASM2CompatMode for QASM2 but
translateCondition still rejects qasm3::BinaryExpression (e.g., creg == N),
causing hard failures; update translateCondition to accept BinaryExpression when
openQASM2CompatMode is true (function translateCondition) and handle
equality/inequality ops (==, !=) by resolving lhs/rhs via existing
bitValues/IndexedIdentifier logic (or valid Identifier→bit mapping) and
producing the appropriate boolean Value for scf::IfOp, reusing the same lowering
path as for IndexedIdentifier/unary ops; ensure the new branch validates operand
types (Identifier/IndexedIdentifier or integer literal), uses bitValues lookup
or index extraction, and emits the same error messages on unsupported forms.

566-588: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

ctrl/negctrl controls are forced to scalars before broadcast lowering.

  • In applyGateCallStatement, the modifier parsing consumes the would-be control operands and immediately rejects controls that resolve to SmallVector<Value> ("Control operand must be a qubit."), converting them into scalar Values in posControls/negControls.
  • Broadcast lowering then runs only over the remaining gateOperands (targets): broadcastWidth is computed from gateOperands, while posControls/negControls stay lane-invariant, so ctrl @ x q, r / negctrl @ x q, r can’t broadcast when q is a register (even though cx q, r supports lane-wise broadcasting via its operands).
  • The same scalar-only guard exists in the OpenQASM2 implicit-controls loop just below.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@mlir/lib/Dialect/QC/Translation/TranslateQASM3ToQC.cpp` around lines 566 -
588, The control parsing in applyGateCallStatement currently rejects and forces
controls to scalar Values (throwing "Control operand must be a qubit.") which
prevents lane-wise broadcasting; change the logic so posControls and negControls
can store either a scalar Value or a SmallVector<Value> (e.g. use a variant or
an existing container type), stop throwing on SmallVector<Value>, and push the
SmallVector into the corresponding control list instead of erroring; then update
subsequent broadcast-lowering logic that computes broadcastWidth from
gateOperands to consider control operands (posControls/negControls) as
potentially vector-shaped so broadcasting is applied consistently across
controls and targets (ensure evaluatePositiveConstant, numControls incrementing,
and uses of operands/gateOperands are adapted to handle the new scalar-or-vector
control representation).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@mlir/lib/Dialect/QC/Translation/TranslateQASM3ToQC.cpp`:
- Around line 868-869: Guard accesses into indexExpressions before reading [0]:
in places that read id->indices[0]->indexExpressions[0] (used with
evaluatePositiveConstant and debugInfo), check that id->indices.size() > 0 and
that id->indices[0]->indexExpressions.size() > 0 and handle the empty case (emit
an error via debugInfo or return/fail gracefully) to avoid out-of-bounds access;
similarly update the other occurrences that access indexExpressions[0] (same
pattern as above) and prefer early-return or diagnostic logging consistent with
surrounding helpers so callers like evaluatePositiveConstant aren’t passed an
invalid reference.
- Around line 322-327: visitVersionDeclaration sets openQASM2CompatMode for
QASM2 but translateCondition still rejects qasm3::BinaryExpression (e.g., creg
== N), causing hard failures; update translateCondition to accept
BinaryExpression when openQASM2CompatMode is true (function translateCondition)
and handle equality/inequality ops (==, !=) by resolving lhs/rhs via existing
bitValues/IndexedIdentifier logic (or valid Identifier→bit mapping) and
producing the appropriate boolean Value for scf::IfOp, reusing the same lowering
path as for IndexedIdentifier/unary ops; ensure the new branch validates operand
types (Identifier/IndexedIdentifier or integer literal), uses bitValues lookup
or index extraction, and emits the same error messages on unsupported forms.
- Around line 566-588: The control parsing in applyGateCallStatement currently
rejects and forces controls to scalar Values (throwing "Control operand must be
a qubit.") which prevents lane-wise broadcasting; change the logic so
posControls and negControls can store either a scalar Value or a
SmallVector<Value> (e.g. use a variant or an existing container type), stop
throwing on SmallVector<Value>, and push the SmallVector into the corresponding
control list instead of erroring; then update subsequent broadcast-lowering
logic that computes broadcastWidth from gateOperands to consider control
operands (posControls/negControls) as potentially vector-shaped so broadcasting
is applied consistently across controls and targets (ensure
evaluatePositiveConstant, numControls incrementing, and uses of
operands/gateOperands are adapted to handle the new scalar-or-vector control
representation).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 9b2114bd-5a19-4bff-9d74-2718c9b71a9d

📥 Commits

Reviewing files that changed from the base of the PR and between ebafce2 and 6a11e8f.

📒 Files selected for processing (2)
  • mlir/lib/Dialect/QC/Translation/TranslateQASM3ToQC.cpp
  • mlir/unittests/programs/qasm_programs.h

@denialhaag

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 14, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@mlir/lib/Dialect/QC/Translation/TranslateQASM3ToQC.cpp`:
- Around line 884-887: The current code relies on an assert to verify that an
unindexed register is single-bit, which is ineffective in release builds and can
lead to silently accepting invalid multi-bit classical conditions. Replace the
assert(regBits.size() == 1) with an explicit check using the declared width from
classicalRegisters: if the register width is not 1 (i.e., it is a multi-bit
register), throw a CompilerError describing that unindexed access to multi-bit
classical registers is not allowed. This ensures that multi-bit registers
without indices are properly rejected at compile time regardless of build
configuration.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 74f173b1-6219-4f80-b0b1-62ac861c9e92

📥 Commits

Reviewing files that changed from the base of the PR and between 6a11e8f and 40e31f7.

📒 Files selected for processing (4)
  • mlir/lib/Dialect/QC/Translation/TranslateQASM3ToQC.cpp
  • mlir/unittests/Dialect/QC/Translation/test_qasm3_translation.cpp
  • mlir/unittests/programs/qasm_programs.cpp
  • mlir/unittests/programs/qasm_programs.h

Comment thread mlir/lib/Dialect/QC/Translation/TranslateQASM3ToQC.cpp

@burgholzer burgholzer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This generally looks very good to me as a direct port of the QuantumComputation QASM Importer 🙌
I only have a couple of inline comments or requests for changes.
We should be able to merge this quickly.

A thought that came up while reviewing this: how much is the current architecture of the parser and the visitor implementation limiting us in terms of expanding the capabilities?
There are quite a few things from the OQ3 spec that we would want to support (loops being one of the most prominent ones).
Would it be interesting to define our own OpenQASM3 dialect (inspired by the qe-compiler one) that can directly parse in QASM files. And then we would write a conversion to MLIR standard dialects plus QC. Does that make sense? Is that overkill? To me it feels like this could generally make sense. What do you think?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since none of this depends on the old MQT Core IR anymore, I am wondering whether we should split the translation target into to separate ones, where the OpenQASM3 one no longer links against MQT::CoreIR.
This would mean that mqt-cc as an executable has no direct connection to the old IR anymore.
This is something that can be done here.

If we manage to (somehow) find a way to interface with Qiskit without the MQT Core IR, we may finally be able to disable RTTI and Exception handling for the MLIR part of the code base.
I suppose the easiest way to get close to feature parity would be to expose the QCProgramBuilder to Python and replicate the existing Qiskit conversion through that API.
This is something to be done in a separate PR 😌

@denialhaag denialhaag Jun 18, 2026

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since none of this depends on the old MQT Core IR anymore, I am wondering whether we should split the translation target into to separate ones, where the OpenQASM3 one no longer links against MQT::CoreIR.
This would mean that mqt-cc as an executable has no direct connection to the old IR anymore.
This is something that can be done here.

Good point! Done in 86bbf4b.

If we manage to (somehow) find a way to interface with Qiskit without the MQT Core IR, we may finally be able to disable RTTI and Exception handling for the MLIR part of the code base.
I suppose the easiest way to get close to feature parity would be to expose the QCProgramBuilder to Python and replicate the existing Qiskit conversion through that API.
This is something to be done in a separate PR 😌

I'll keep that in mind!

Comment on lines +36 to +37
[[nodiscard]] OwningOpRef<ModuleOp> translateQASM3ToQC(MLIRContext* context,
std::istream& input);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IIRC LLVM ships its own streams and recommends against using the stdlib ones. Worth checking.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I went with llvm::SourceMgr in a7a81b9. This is also used in Translation.h, which we should look into at some point.

Let me know what you think!

Comment on lines +383 to +393
void
visitInitialLayout(std::shared_ptr<qasm3::InitialLayout> layout) override {
throw qasm3::CompilerError("InitialLayout pragmas are not supported.",
layout->debugInfo);
}

void visitOutputPermutation(
std::shared_ptr<qasm3::OutputPermutation> perm) override {
throw qasm3::CompilerError("OutputPermutation pragmas are not supported.",
perm->debugInfo);
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think these should not be errors. The pragmas are informational for the most part. They are otherwise simply comments.
Just skipping them is fine.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point! Done in e8133ce.

Comment on lines +476 to +480
if (stmt->thenStatements.empty()) {
throw qasm3::CompilerError(
"If statements with empty then blocks are not supported.",
stmt->debugInfo);
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They are now! See cce8134.

}

if (it == gates.end()) {
throw qasm3::CompilerError("No OpenQASM 3 definition found for gate '" +

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
throw qasm3::CompilerError("No OpenQASM 3 definition found for gate '" +
throw qasm3::CompilerError("No definition found for gate '" +

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is actually semi-intentional to be in contrast with this error message:

throw qasm3::CompilerError(
"No MLIR definition found for gate '" + id + "'.", stmt->debugInfo);

@denialhaag

Copy link
Copy Markdown
Member Author

A thought that came up while reviewing this: how much is the current architecture of the parser and the visitor implementation limiting us in terms of expanding the capabilities?
There are quite a few things from the OQ3 spec that we would want to support (loops being one of the most prominent ones).
Would it be interesting to define our own OpenQASM3 dialect (inspired by the qe-compiler one) that can directly parse in QASM files. And then we would write a conversion to MLIR standard dialects plus QC. Does that make sense? Is that overkill? To me it feels like this could generally make sense. What do you think?

I will think about this a bit and respond tomorrow!

@denialhaag denialhaag requested a review from burgholzer June 18, 2026 00:19
@denialhaag

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@mlir/include/mlir/Dialect/QC/Translation/TranslateQASM3ToQC.h`:
- Around line 13-26: The function translateQASM3ToQC uses OwningOpRef<ModuleOp>
as its return type but the header does not directly include the definition of
OwningOpRef, relying instead on transitive includes from BuiltinOps.h. Add
`#include` <mlir/IR/OwningOpRef.h> to the include section at the top of the file
along with the other mlir includes to make this header self-contained and
explicit about its dependencies.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 4b5a8e6b-daab-46b3-96dc-c6efd737f14b

📥 Commits

Reviewing files that changed from the base of the PR and between 40e31f7 and 86bbf4b.

📒 Files selected for processing (7)
  • mlir/include/mlir/Dialect/QC/Translation/TranslateQASM3ToQC.h
  • mlir/lib/Dialect/QC/Translation/TranslateQASM3ToQC.cpp
  • mlir/tools/mqt-cc/CMakeLists.txt
  • mlir/tools/mqt-cc/mqt-cc.cpp
  • mlir/unittests/Dialect/QC/Translation/test_qasm3_translation.cpp
  • mlir/unittests/programs/qasm_programs.cpp
  • mlir/unittests/programs/qasm_programs.h
💤 Files with no reviewable changes (1)
  • mlir/tools/mqt-cc/CMakeLists.txt

Comment thread mlir/include/mlir/Dialect/QC/Translation/TranslateQASM3ToQC.h
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature New feature or request MLIR Anything related to MLIR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants