Skip to content

Commit 4c64841

Browse files
Merge pull request #101 from ColibrITD-SAS/feat-custom-basis
Feat custom basis
2 parents ec92366 + 9ef338e commit 4c64841

34 files changed

+1620
-408
lines changed

mpqp/core/circuit.py

+123-151
Large diffs are not rendered by default.

mpqp/core/instruction/barrier.py

+6
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,9 @@ def to_other_language(
3131
from qiskit.circuit.library import Barrier as QiskitBarrier
3232

3333
return QiskitBarrier(self.size)
34+
elif language == Language.QASM2:
35+
qubits = ",".join([f"q[{j}]" for j in self.targets])
36+
return "barrier " + qubits + ";"
37+
38+
def __repr__(self):
39+
return f"{type(self).__name__}({self.size})"

mpqp/core/instruction/breakpoint.py

+11
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
from __future__ import annotations
2+
from typing import Optional
3+
4+
from qiskit.circuit import Parameter
25

36
from mpqp.core.instruction import Instruction
7+
from mpqp.core.languages import Language
48

59

610
class Breakpoint(Instruction):
@@ -30,3 +34,10 @@ def __repr__(self) -> str:
3034
f"Breakpoint(targets={self.targets}, draw_circuit={self.draw_circuit},"
3135
f" enabled={self.enabled}, label={self.label})"
3236
)
37+
38+
def to_other_language(
39+
self,
40+
language: Language = Language.QISKIT,
41+
qiskit_parameters: Optional[set["Parameter"]] = None,
42+
) -> str:
43+
raise NotImplementedError(f"Error: {language} is not supported")

mpqp/core/instruction/gates/custom_gate.py

+42-4
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,49 @@ def to_other_language(
8383
language: Language = Language.QISKIT,
8484
qiskit_parameters: Optional[set["Parameter"]] = None,
8585
):
86-
from qiskit.quantum_info.operators import Operator as QiskitOperator
86+
if language == Language.QISKIT:
87+
from qiskit.quantum_info.operators import Operator as QiskitOperator
88+
89+
if qiskit_parameters is None:
90+
qiskit_parameters = set()
91+
return QiskitOperator(self.matrix)
92+
elif language == Language.QASM2:
93+
from mpqp.tools.circuit import replace_custom_gate
94+
from qiskit import QuantumCircuit, qasm2
95+
96+
nb_qubits = max(self.targets) + 1
97+
98+
qiskit_circ = QuantumCircuit(nb_qubits)
99+
instr = self.to_other_language(Language.QISKIT)
100+
if TYPE_CHECKING:
101+
from qiskit.quantum_info.operators import Operator as QiskitOperator
102+
103+
assert isinstance(instr, QiskitOperator)
104+
qiskit_circ.unitary(
105+
instr,
106+
list(reversed(self.targets)), # dang qiskit qubits order
107+
self.label,
108+
)
87109

88-
if qiskit_parameters is None:
89-
qiskit_parameters = set()
90-
return QiskitOperator(self.matrix)
110+
circuit, gphase = replace_custom_gate(qiskit_circ.data[0], nb_qubits)
111+
112+
qasm_str = qasm2.dumps(circuit)
113+
qasm_lines = qasm_str.splitlines()
114+
115+
instructions_only = [
116+
line
117+
for line in qasm_lines
118+
if not (
119+
line.startswith("qreg")
120+
or line.startswith("include")
121+
or line.startswith("creg")
122+
or line.startswith("OPENQASM")
123+
)
124+
]
125+
126+
return "\n".join(instructions_only), gphase
127+
else:
128+
raise NotImplementedError(f"Error: {language} is not supported")
91129

92130
def __repr__(self) -> str:
93131
label = ", " + self.label if self.label else ""

0 commit comments

Comments
 (0)