1""" Module providing Translation between different universal quantum computers """ 2fromtypingimportAny 3fromabcimportABC,abstractmethod 4 5importqiskit 6fromqiskitimportqasm2 7fromqiskit.compilerimporttranspile 8fromqiskit.transpiler.passesimportRemoveBarriers 910fromquantum_launcher.exceptionsimportDependencyError11try:12importcirq13fromcirq.contrib.qasm_import.qasmimportcircuit_from_qasm14exceptImportErrorase:15raiseDependencyError(e,'cirq')frome1617
[docs]18classTranslation(ABC):19""" Translation layer for circuits written in different languages """20basis_gates:list[str]=[]21language:str='None'22circuit_object:type=type23language_name_mapping:dict[str,"Translation"]={}24circuit_class_mapping:dict[type,"Translation"]={}2526def__init_subclass__(cls):27Translation.language_name_mapping[cls.language]=cls()28Translation.circuit_class_mapping[cls.circuit_object]=cls()29
[docs]30@abstractmethod31defto_qasm(self,circuit:Any)->str:32""" Translation from given circuit into qasm (as a string) """
33
[docs]34@abstractmethod35deffrom_qasm(self,qasm:str)->Any:36""" Translation given in qasm (as a string) circuit into language specific object """
37
[docs]38@staticmethod39defget_translation(circuit:Any,language:str)->Any:40""" Transpiles circuit into given languages basis_gates, translates it to qasm, and from qasm into desired languages object. """41circuit_qasm_translator=Translation.circuit_class_mapping[circuit.__class__]42qasm_circuit_translator=Translation.language_name_mapping[language]43ifisinstance(circuit,qiskit.QuantumCircuit):44transpiled_circuit=transpile_circuit(circuit,qasm_circuit_translator.basis_gates)45else:46transpiled_circuit=circuit# Transpilation is usually not needed47qasm=circuit_qasm_translator.to_qasm(transpiled_circuit)48returnqasm_circuit_translator.from_qasm(qasm)
4950
[docs]51classCirqTranslation(Translation):52""" Translation class for Cirq """53basis_gates=['x','y','z','cx','h','rx','ry','rz']54language:str='cirq'55circuit_object=cirq.Circuit56
[docs]64classQiskitTranslation(Translation):65""" Translation class for Qiskit """66basis_gates=['x','y','z','cx','h','rx','ry','rz','u']67language:str='qiskit'68circuit_object=qiskit.QuantumCircuit69