Documentation

Comprehensive guide to using QCanvas for quantum circuit conversion, simulation, and visualization. Everything you need to build quantum applications with confidence.

Try QCanvas Now
3+
Quantum Frameworks
OpenQASM 3.0
Standard Support
Real-time
Simulation
Educational
Platform

Overview

A next-generation quantum computing IDE that unifies Cirq, Qiskit, and PennyLane through OpenQASM 3.0. Write quantum code in any framework, compile to OpenQASM, simulate with multiple backends, and visualize results in real-time.

Framework Conversion

Convert between Qiskit, Cirq, and PennyLane seamlessly

Real-time Simulation

Execute quantum circuits with multiple backends

Interactive Visualization

Visualize quantum states and measurement results

Educational Platform

Learn quantum computing through guided examples

Project Mission

QCanvas addresses the critical standardization gap in multi-framework quantum programming by providing a universal intermediary that translates quantum circuits into the standardized OpenQASM 3.0 intermediate representation. This enables seamless integration, comparison, and execution of quantum circuits across different hardware platforms and software ecosystems.

Unification

Bridge the gap between quantum frameworks

Accessibility

Make quantum computing approachable for all

Innovation

Accelerate quantum software development

Getting Started

Get up and running with QCanvas in minutes. Learn the basics and start building quantum circuits.

Quick Start Guide

1

Access QCanvas

Navigate to the web application and create your account

2

Choose Framework

Select your preferred quantum framework (Qiskit, Cirq, PennyLane)

3

Create Circuit

Write or paste your quantum circuit code

4

Convert & Simulate

Convert between frameworks and run simulations

First Example

Bell State Circuit

# Qiskit Bell State
from qiskit import QuantumCircuit

qc = QuantumCircuit(2, 2)
qc.h(0)      # Hadamard on qubit 0
qc.cx(0, 1)  # CNOT gate
qc.measure_all()

print(qc)

This creates a quantum entanglement between two qubits, producing the famous Bell state |Φ⁺⟩ = (|00⟩ + |11⟩)/√2

Supported Frameworks

codeCreated with Sketch Beta.

Qiskit

IBM's comprehensive quantum computing framework

Circuit DesignIBM Quantum
codeCreated with Sketch Beta.

Cirq

Google's framework for near-term quantum devices

Noise ModelingGoogle AI
codeCreated with Sketch Beta.

PennyLane

Xanadu's quantum machine learning framework

ML IntegrationVariational

Learning Path

Basic quantum gates and circuits
Framework conversion concepts
Advanced algorithms and optimization
Noise modeling and error correction

Features

Comprehensive quantum computing tools for conversion, simulation, and visualization

Framework Conversion

Convert between Qiskit, Cirq, and PennyLane

AST-based parsing and intelligent gate mapping
OpenQASM 3.0 as universal intermediate representation
Circuit optimization levels 0-3
Validation and error reporting

Quantum Simulation

Multiple backends for accurate simulation

Statevector backend for exact simulation
Density matrix backend for noise modeling
Stabilizer backend for Clifford circuits
Configurable shot counts (1-10,000)

Visualization

Interactive charts and circuit diagrams

Real-time circuit visualization
Histogram plots for measurement results
State vector and probability displays
Export capabilities (JSON, CSV, PNG)

Educational Tools

Learning resources and guided examples

Pre-built example circuits
Framework comparison tutorials
Interactive learning modules
Beginner to advanced difficulty levels

Advanced Features

Web IDE

Professional code editor with syntax highlighting and IntelliSense

Security

Input validation, rate limiting, and secure API endpoints

Scalability

Docker deployment, load balancing, and high availability

Architecture

Modern, scalable architecture designed for quantum computing workflows

High-Level Architecture

Frontend (Next.js)          Backend (FastAPI)          Quantum Processing
├── React Components     ├── REST API Layer       ├── Quantum Converters
├── Code Editor          ├── WebSocket Manager    ├── Quantum Simulator
├── Visualization        ├── Service Layer        └── Circuit Optimizers
└── Real-time Updates    └── Database Layer

Frontend Layer

Next.js 14 with App Router
React 18 with TypeScript
Monaco Editor integration
Real-time WebSocket updates

Backend Layer

FastAPI with async support
PostgreSQL with SQLAlchemy
Redis caching layer
Pydantic data validation

Data Flow Architecture

Circuit Conversion Flow

User Input
API Request
Framework Parser
OpenQASM 3.0

Simulation Flow

QASM Code
Backend Selection
Circuit Execution
Results

API Reference

Complete REST API documentation for QCanvas platform integration

Conversion API

POST /api/converter/convertActive

Convert framework code to OpenQASM 3.0

{
  "source_code": "from qiskit import...",
  "source_framework": "qiskit",
  "conversion_type": "classic"
}
// Response includes: qasm_code, gates, depth, qubits
GET /api/healthHealth

Check API health status

Simulation API (QSim)

POST /api/simulator/executeActive

Execute OpenQASM 3.0 with QSim

{
  "qasm_code": "OPENQASM 3.0; ...",
  "backend": "cirq",  // cirq, qiskit, pennylane
  "shots": 1024
}
// Response includes: counts, metadata, probs
Response MetadataStats

execution_time, simulation_time, memory_usage, cpu_usage, fidelity

QSim Simulation Backends

Cirq

Google's quantum computing framework with statevector simulation

Shots:1 - 10,000
Best for:Near-term devices

Qiskit

IBM's comprehensive quantum SDK with QASM simulator backend

Shots:1 - 10,000
Best for:IBM Quantum

PennyLane

Xanadu's quantum ML framework with default.qubit device

Shots:1 - 10,000
Best for:QML & Variational

WebSocket API

Connection

ws://localhost:8000/ws

Real-time Updates

Live progress updates for long-running operations

Hybrid Execution API

Execute Python code with quantum circuits. Compile circuits, run simulations, and access results programmatically.

codeCreated with Sketch Beta.Available Functions

compile(circuit, framework=None)

Function

Compile a quantum circuit object to OpenQASM 3.0 format.

Parameters:

  • circuit - Circuit object from Cirq, Qiskit, or PennyLane
  • framework - Optional: "cirq", "qiskit", "pennylane" (auto-detected if not provided)

Returns:

str - OpenQASM 3.0 code

from qcanvas import compile
import cirq

q = cirq.LineQubit.range(2)
circuit = cirq.Circuit([
    cirq.H(q[0]),
    cirq.CNOT(q[0], q[1]),
    cirq.measure(q[0], q[1], key='result')
])

qasm = compile(circuit, framework="cirq")
print(qasm)

qsim.run(qasm_code, shots=1024, backend="cirq")

Function

Execute OpenQASM 3.0 code using QSim quantum simulator.

Parameters:

  • qasm_code - OpenQASM 3.0 code string
  • shots - Number of measurement shots (default: 1024, use 0 for exact statevector)
  • backend - "cirq", "qiskit", or "pennylane" (default: "cirq")

Returns:

SimulationResult - Result object with counts, probabilities, and metadata

import qsim

qasm = '''
OPENQASM 3.0;
include "stdgates.inc";
qubit[2] q;
bit[2] c;
h q[0];
cx q[0], q[1];
c[0] = measure q[0];
c[1] = measure q[1];
'''

result = qsim.run(qasm, shots=1000, backend="cirq")
print(result.counts)
print(result.probabilities)

compile_and_execute(circuit, framework=None, shots=1024, backend="cirq")

Convenience

Compile a circuit and execute it in a single call.

Parameters:

  • circuit - Circuit object from Cirq, Qiskit, or PennyLane
  • framework - Optional: auto-detected if not provided
  • shots - Number of measurement shots (default: 1024)
  • backend - Simulation backend (default: "cirq")

Returns:

SimulationResult - Result object with counts, probabilities, and metadata

from qcanvas import compile_and_execute
import cirq

q = cirq.LineQubit.range(2)
circuit = cirq.Circuit([
    cirq.H(q[0]),
    cirq.CNOT(q[0], q[1]),
    cirq.measure(q[0], q[1], key='result')
])

result = compile_and_execute(circuit, framework="cirq", shots=1000)
print(result.counts)
print(result.probabilities)

SimulationResult Attributes

The SimulationResult object returned by qsim.run() and compile_and_execute() provides comprehensive access to simulation data.

AttributeTypeDescriptionExample
countsDict[str, int]Measurement counts for each outcome{'00': 512, '11': 512}
probabilitiesDict[str, float]Probability of each measurement outcome{'00': 0.5, '11': 0.5}
statevectorList[complex]Full quantum statevector (only when shots=0)[0.707+0j, 0+0j, ...]
n_qubitsintNumber of qubits in the circuit2
shotsintNumber of measurement shots executed1000
backendstrBackend used for simulation"cirq"
execution_timestrTotal execution time (human-readable)"1.23ms"
simulation_timestrTime spent in quantum simulation"0.98ms"
memory_usagestrMemory consumed during simulation"45.2 MB"
cpu_usagestrCPU utilization during simulation"12.5%"
fidelityfloatSimulation fidelity as percentage100.0
metadataDict[str, Any]Additional backend-specific metadata{'gate_count': 5}

Printing Circuits

You can print circuit objects directly to visualize their structure in all supported frameworks.

codeCreated with Sketch Beta.
Cirq

import cirq

q = cirq.LineQubit.range(2)
circuit = cirq.Circuit([
    cirq.H(q[0]),
    cirq.CNOT(q[0], q[1]),
    cirq.measure(q[0], q[1])
])

print(circuit)
0: ───H───@───M───
           │
1: ────────X───M───

codeCreated with Sketch Beta.
Qiskit

from qiskit import QuantumCircuit

qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])

print(qc)
     ┌───┐     ┌─┐
q_0: ┤ H ├──■──┤M├
     └───┘ │ ┌┴┐└╥┘
q_1: ──────┼─┤M├─╫─
           │ └╥┘ ║
c: 2/══════╪══╬══╩═

codeCreated with Sketch Beta.
PennyLane

import pennylane as qml

dev = qml.device('default.qubit', wires=2)

@qml.qnode(dev)
def circuit():
    qml.Hadamard(wires=0)
    qml.CNOT(wires=[0, 1])
    return qml.expval(qml.PauliZ(0))

print(qml.draw(circuit)())
0: ──H──╭C──┤ ⟨Z⟩
1: ──────╰X──┤

Complete Workflow Example

import cirq
from qcanvas import compile, compile_and_execute
import qsim

# Step 1: Create circuit
q = cirq.LineQubit.range(2)
circuit = cirq.Circuit([
    cirq.H(q[0]),
    cirq.CNOT(q[0], q[1]),
    cirq.measure(q[0], q[1], key='result')
])

# Step 2: Print circuit (optional)
print("Circuit Structure:")
print(circuit)

# Step 3: Compile to QASM
qasm = compile(circuit, framework="cirq")
print("\nGenerated QASM:")
print(qasm)

# Step 4: Execute simulation
result = qsim.run(qasm, shots=1000, backend="cirq")

# Step 5: Access results
print("\nSimulation Results:")
print(f"  Counts: {result.counts}")
print(f"  Probabilities: {result.probabilities}")
print(f"  Execution time: {result.execution_time}")
print(f"  Qubits: {result.n_qubits}")
print(f"  Shots: {result.shots}")
print(f"  Backend: {result.backend}")

# Alternative: Compile and execute in one step
result2 = compile_and_execute(circuit, framework="cirq", shots=1000)
print(f"\nOne-step result: {result2.counts}")