0

I want to use the BasisTranslator in Qiskit to process my circuit to base gates.

One of the constructor parameters for BasisTranslator is EquivalenceLibrary. I attempted creating a parameter-less EquivalenceLibrary() and pass it to a BasisTranslator, but the code fails, saying it cannot translate gates like MCT or CCX into the default basis.

TranspilerError: "Unable to map source basis {('mcx', 4), ('ccx', 3), ('x', 1), ('measure', 1), ('h', 1)} to target basis {'u2', 'snapshot', 'barrier', 'cx', 'u3', 'reset', 'u1', 'measure', 'delay'}

I would expect there is some default EquivalenceLibrary that the Transpiler uses when I attempt to run the circuit, since it runs both for simulators and actual hardware. How could I get such default EquivalenceLibrary?

3yakuya
  • 2,622
  • 4
  • 25
  • 40

1 Answers1

1

The easiest way is to leverage the session equivalence library that is included with qiskit (at qiskit.circuit.equivalence_library.SessionEquivalenceLibrary) which is a prebuilt equivalence library which includes all the standard library gates. You can use it with something like:

from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
from qiskit.transpiler.passes import BasisTranslator
from qiskit.circuit import QuantumCircuit
from qiskit.converters import circuit_to_dag, dag_to_circuit

basis_gates = ['u2', 'snapshot', 'barrier', 'cx', 'u3', 'reset', 'u1', 'measure', 'delay']
bt_pass = BasisTranslator(sel, basis_gates)

circuit = QuantumCircuit(3)
circuit.ccx(0, 1, 2)


dag_out = bt_pass.run(circuit_to_dag(circuit))
circuit_out = dag_to_circuit(dag_out)

(as a future note in qiskit-terra >=0.17.0, which will be released soon, you'll no longer need to convert to a dag here and call bt_pass(circuit) directly)

If you're interested in how to construct an equivalence library from scratch you can take a look at how the session equivalence library is built here: https://github.com/Qiskit/qiskit-terra/blob/0.16.4/qiskit/circuit/library/standard_gates/equivalence_library.py