PRISM-Q
██████╗ ██████╗ ██╗███████╗███╗ ███╗ ██████╗
██╔══██╗██╔══██╗██║██╔════╝████╗ ████║ ██╔═══██╗
██████╔╝██████╔╝██║███████╗██╔████╔██║█████╗██║ ██║
██╔═══╝ ██╔══██╗██║╚════██║██║╚██╔╝██║╚════╝██║▄▄ ██║
██║ ██║ ██║██║███████║██║ ╚═╝ ██║ ╚██████╔╝
╚═╝ ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═╝ ╚══▀▀═╝
A performance oriented quantum circuit simulator written in Rust.
Highlights
- simulation backends with automatic selection based on circuit structure
- OpenQASM 3.0 parser with backward-compatible 2.0 support
- Gate modifiers —
inv @,ctrl @,pow(k) @with arbitrary chaining - SIMD-optimized kernels — AVX2, FMA, and BMI2 with runtime feature detection
- Seven-stage fusion pipeline — gate cancellation, 1q/2q fusion, commutation-aware reordering, multi-gate batching, controlled-phase batching with PEXT lookup tables
- Shot-based sampling with deterministic or random seeding
- Rayon parallelism at 14+ qubits with auto-tuned chunking
- Subsystem decomposition — independent qubit groups simulated in parallel and merged via Kronecker product
Quick start
use run_qasm;
let qasm = r#"
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];
"#;
let result = run_qasm.unwrap;
println!;
// Bell state: ~50% |00⟩, ~50% |11⟩
Shot-based sampling
use ;
let circuit = parse.unwrap;
let result = run_shots.unwrap;
println!;
// 00: 512
// 11: 512
Backend dispatch
use ;
let circuit = parse.unwrap;
// Auto picks the optimal backend based on circuit properties
let auto = run_with.unwrap;
// Or choose explicitly
let stab = run_with.unwrap;
let mps = run_with.unwrap;
let sparse = run_with.unwrap;
Programmatic circuit construction
use CircuitBuilder;
let result = new
.h
.cx
.cx
.run
.unwrap;
CircuitBuilder supports fluent method chaining with 44 gate/control/execution methods. For lower-level access, use Circuit directly:
use ;
let mut c = new;
c.add_gate;
c.add_gate;
c.add_gate;
let result = run.unwrap;
Backends
| Backend | Best for | Scaling | Key property |
|---|---|---|---|
| Statevector | General circuits | O(2^n) | Full SIMD, tiled L2/L3 kernels |
| Stabilizer | Clifford-only | O(n^2) | SIMD-optimized, handles 5000+ qubits |
| Sparse | Few live amplitudes | O(k) | HashMap with parallel measurement |
| MPS | Low-entanglement / 1D | O(n chi^2) | Hybrid faer/Jacobi SVD |
| Product State | No entanglement | O(n) | Per-qubit, instant |
| Tensor Network | Low treewidth | Contraction-dependent | Greedy min-size heuristic |
| Factored | Partial entanglement | Dynamic | Tracks independent sub-states |
BackendKind::Auto selects at dispatch time: non-entangling circuits go to Product State, all-Clifford to Stabilizer, large circuits (>28q) to MPS, and everything else to Statevector.
Gates & OpenQASM support
15 single-qubit gates, 4 two-qubit gates, 6 controlled variants, 2 multi-controlled gates, 8 decomposed multi-instruction gates, and 3 IBM legacy gates — plus inv @, ctrl @, pow(k) @ modifiers with arbitrary chaining and user-defined gate definitions.
The complete list of supported gate keywords, language features, and modifiers is defined in the parser at src/circuit/openqasm.rs (see resolve_gate() and resolve_decomposed_gate()). Smoke tests in tests/smoke_openqasm.rs exercise each feature end-to-end.
Build & test
Parallelism
Rayon threading kicks in at 14+ qubits:
Defaults to logical core count. Set RAYON_NUM_THREADS to override.
Coverage
Requires rustup component add llvm-tools-preview and cargo install cargo-llvm-cov.
CI generates coverage on every push/PR and updates the badge automatically.
Benchmarks
# full suite
# gate-level microbenchmarks
# quick smoke test (fewer iterations)
Regression checks
# save baseline
# make changes, bench again
# compare (exits 1 on regression)
# markdown table for PRs
Profiling
Needs cargo install flamegraph:
SVGs go to bench_results/ (gitignored).
Roadmap
- Expanded OpenQASM 3.0 —
resetinstruction,forloop unrolling,defsubroutines - Expectation values —
<psi|O|psi>for Pauli strings (VQE/QAOA support) - Density matrix backend — mixed-state simulation for noise and decoherence modeling
- GPU acceleration — CUDA/Vulkan compute backend for large qubit counts
Architecture
See docs/architecture.md for the full picture — layered design, backend trait contract, SIMD strategy, and how to add a new backend.