Quantum Compiler Collection Nicholas Boucher, Nathanael Cho, Juan Esteller, Brian Sapozhnikov
QCC is a python package supporting cross-compilation between different quantum assembly languages. The goal of QCC is to remove barriers for quantum developers by allowing applications to target arbitrary hardware without rewriting source code. Additionally, QCC aims to help developers identify the best hardware on which to run their code. Due to engineering differences, different quantum hardware excel in different areas; QCC can help developer to figure out and use the hardware that will give them the best results.
At this time, QCC's supported quantum assembly languages are QASM
and Quil
.
QCC is the final project for Harvard course ES170.
Installation of QCC requires two steps: installing the Python components and installing the Rigetti components.
In order to use any of the Python code in this repository, the package must be installed (preferably using pip
instead of easy_install
). After cloning the repository and cd
ing to the root of the repo, an example installation is:
pip install qcc/
If you are actively developing this package, be sure to install the package with the -e
editable flag. For example, from the root directory of this repository:
pip install -e qcc/
Note that the code for QCC is written in Python 3 and requires at Python 3.5 or newer.
QCC depends on a compilation tool built by Rigetti. As such, in order to use most of the functionality of QCC you must have the Rigetti Forest SDK installed.
QCC is typically invoked as a command line tool. After following the above installation instructions, the command qcc
will automatically be added to the current user's $PATH
. After this qcc
can be invoked system-wide from the command line. Note that if qcc was installed in a virtualenv
, that environment must be active on order for the qcc
command to work.
For example, running the following line from the command line will display help information:
qcc --help
The arguments to qcc
are as follows:
usage: qcc [-h] [--target TARGET] [--auto-target] [-m METRIC] [--profiles]
[--stats] [-v {1,2}] [-o OUTPUT_FILE]
source-file
These arguments are defined as follows:
- Required Arguments:
source-file
: The source file containing a program in a supported quantum assembly language.- Exactly one of:
target
: the specific hardware to target -- must be an option output fromlist
auto-target
: automatically select the optimal hardware for the source programprofiles
: like auto-target, but only prints statistics for each potential target instead of printing the cross-compiled codelist
: lists all hardwares available fortarget
- Optional Arguments:
metric
: allows the user to specify the metric chosen by auto-target. Possible options are:num_2_qubit_gates
andnum_insts
stats
: in addition to printing the output fortarget
, will also print the statistics for that target hardwareverbose
: specifies the level of verbosity in output -- possible values are1
and2
, where 1 is the default and 2 prints out more verbose outputo
: optionally specifies an output file instead of printing to STDOUThelp
: prints the help instructions
To run the test suite, simply run python test/run_tests.py
To add tests simply add the appropriate files, using the existing tests as examples.
Make sure to add __init__.py
files where appropriate to ensure correct discovery of test scripts.
All test script files should start match the form test*.py
.
All unittest
methods should start with test
and use assertions and other useful features of the unittest
package.
You can perform type checking for this codebase using mypy
with the following commands from the root repo directory:
pip install mypy
export MYPYPATH="./stubs"
mypy qcc/