wisq is a powerful and flexible compiler for quantum circuits. It is especially well-suited for targeting fault-tolerant devices using the surface code. The full_ft
mode optimizes the input circuit, then maps the circuit qubits to the architecture and routes two-qubit gates (including distillation-based T gates). wisq also provides a dedicated circuit optimization mode opt
that can optimize circuits over arbitrary gate sets by invoking GUOQ [1] with different arguments.
wisq requires Python 3.8, Java 21 or later, and gcc.
Once the above requirements are satisfied, the wisq
command line tool can be painlessly installed via pip:
pip install wisq
To test the installation, try the example command:
wisq wisq-circuits/3_17_13.qasm -ap 1e-10 -ot 10
If everything is working properly, the tool should run for about 10 seconds before outputting a compiled result into the file out.json
. (See below for how to interpret this output)
To extend or modify wisq, you can clone the Github repo and build from the package from source. For example, using uv for package management, this might look like:
git clone https://github.com/qqq-wisc/wisq.git
cd wisq
uv venv
source .venv/bin/activate
uv pip install build
python -m build --sdist
uv pip install -e .
cd src/wisq
To extend or modify the circuit optimization (GUOQ [1]/QUESO [3]) component of wisq, you will need to clone the GUOQ repository, make your changes, build, and copy the new JAR to lib
. The Python component of GUOQ can be directly modified here in src/wisq/resynth.py
.
For example, the circuit optimization phase of wisq can be extended to handle new gate sets in this manner.
wisq takes circuits in the OpenQASM 2 format as input. The compiler passes that are applied, and consequently the final output, depends on the compiler mode. This is configured with the --mode
flag. The three modes are
opt
: Optimize the input circuit and write the result to a QASM filescmr
: Apply a mapping and routing pass only and output a schedule to a JSON file.full_ft
(default): The composition of the above; optimize the input circuit, then apply mapping and routing to the result.
The table below summarizes the compiler modes.
Flag | Description | Input | Output |
---|---|---|---|
--mode opt |
optimization only | QASM | QASM |
--mode scmr |
mapping/routing only | QASM | JSON |
--mode full_ft (or no mode specified) |
optimization + mapping/routing | QASM | JSON |
In modes that apply mapping and routing, the resulting JSON object has two keys: "map", representing the qubit map and "steps", which is a list of time steps. Each step is a list of parallel gates and the paths along which they are routed.
wisq includes an array of additional configuration options which can be viewed with the wisq --help
command. Below we provide a few examples to highlight some of these options.
Let's revisit the installation test command.
wisq wisq-circuits/3_17_13.qasm -ap 1e-10 -ot 10
Here, we run the default full_ft
compiler mode with some configuration of the optimization. We set an approximation distance
of 10-10 with the -ap
flag and a timeout for the optimization pass with the -ot
flag.
We can target a compact architecture with less routing space using the -arch
flag (see also Custom Architectures)
wisq wisq-circuits/3_17_13.qasm --mode scmr -arch compact_layout
The optimization pass can also be configured with different optimization objectives and gate sets.
wisq wisq-circuits/3_17_13.qasm --mode opt -obj TOTAL -tg IBM -aa advanced_args.json
Here we set the optimization objective to minimize total gate with the obj
flag and set the target gate set to the native gates on IBM machines with the -tg
flag.
Additionally, we use the -aa
flag and the file advanced_args.json
to pass more advanced arguments to the optimizer. The possible entries in one of these advanced arguments files can be viewed with the command wisq --guoq-help
.
wisq allows users to specify a custom architecture for mapping and routing. The format for specifying an architecture is
{"height" : GRID_HEIGHT, "width" : GRID_WIDTH, "alg_qubits" : ALG_INDEX_LIST, "magic_states" : MS_INDEX_LIST}
where
- GRID_HEIGHT and GRID_WIDTH are integers;
- ALG_INDEX_LIST and MS_VERTEX_LIST are lists of integers indicating which grid positions are available for algorithmic qubits and which are reserved for magic states.
To pass in a custom architecture, use the flag -arch PATH
where PATH is the path to a file in the above format.
A few example circuits are included in the circuits
directory. Additional benchmarks
can be found at this repo.
wisq implements the techniques proposed in the following papers:
[1] Amanda Xu, Abtin Molavi, Swamit Tannu, Aws Albarghouthi. "Optimizing Quantum Circuits, Fast and Slow," International Conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS),2025
[2] Abtin Molavi, Amanda Xu, Swamit Tannu, Aws Albarghouthi. "Dependency-Aware Compilation for Surface Code Quantum Architectures"
[3] Amanda Xu, Abtin Molavi, Lauren Pick, Swamit Tannu, Aws Albarghouthi. Synthesizing quantum-circuit optimizers. Proceedings of the ACM on Programming Languages. Volume 7, PLDI, 2023. https://doi.org/10.1145/3591254