This release adds Python bindings to the JKQ QMAP project. Using the tool from Python is now as easy as calling
python
from jkq import qmap
qmap.compile(circ, arch, ...)
where `circ` is either a Qiskit `QuantumCircuit` object or the path to an input file (supporting various formats, such as `.qasm`, `.real`,...)
and `arch` is either one of the pre-defined architectures (see below) or the path to a file containing the number of qubits and a line-by-line enumeration of the qubit connections. (Note that circuits are still assumed to be already decomposed into 1- and 2-qubit gates.)
Architectures that are available per default (under `qmap.Arch.<...>`) include:
- IBM_QX4 (5 qubit, directed bow tie layout)
- IBM_QX5 (16 qubit, directed ladder layout)
- IBMQ_Yorktown (5 qubit, undirected bow tie layout)
- IBMQ_London (5 qubit, undirected T-shape layout)
- IBMQ_Bogota (5 qubit, undirected linear chain layout)
Whether the heuristic (*default*) or the exact mapper is used can be controlled by passing `method=qmap.Method.heuristic` or `method=qmap.Method.exact` to the `compile` function.
All available parameters are shown in the README.md.
Note that in order for the bindings to work the SMT Solver [Z3 >= 4.8.3](https://github.com/Z3Prover/z3) has to be installed on the system and the dynamic linker has to be able to find the library.
- Under Ubuntu 20.04 and newer: `sudo apt-get install z3`
- Under macOS: `brew install z3`
- Alternatively: `pip install z3-solver` and then append the corresponding path to the library path (LD_LIBRARY_PATH under Linux, DYLD_LIBRARY_PATH under macOS), e.g. via
bash
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(python -c "import z3; print(z3.__path__[0]+'/lib')")
- Download pre-built binaries from https://github.com/Z3Prover/z3/releases and copy the files to the respective system directories
- Build Z3 from source and install it to the system