mirror of https://github.com/Qiskit/qiskit.git
Saving circuit.layout after transpiling (#2736)
* from unittest.mock import patch * . * alternative to 2721 * test * remove subtest
This commit is contained in:
parent
4679413c91
commit
1f95361032
|
@ -99,6 +99,8 @@ class QuantumCircuit:
|
|||
# Parameter table tracks instructions with variable parameters.
|
||||
self._parameter_table = ParameterTable()
|
||||
|
||||
self.layout = None
|
||||
|
||||
def __str__(self):
|
||||
return str(self.draw(output='text'))
|
||||
|
||||
|
|
|
@ -139,6 +139,7 @@ class PassManager():
|
|||
|
||||
circuit = dag_to_circuit(dag)
|
||||
circuit.name = name
|
||||
circuit.layout = self.property_set['layout']
|
||||
return circuit
|
||||
|
||||
def draw(self, filename, style=None, raw=False):
|
||||
|
|
|
@ -70,12 +70,18 @@ class TestFakeBackendTranspiling(QiskitTestCase):
|
|||
See: https://github.com/Qiskit/qiskit-terra/issues/1711
|
||||
"""
|
||||
# build a circuit which works as-is on the coupling map, using the initial layout
|
||||
qr = QuantumRegister(3)
|
||||
qr = QuantumRegister(3, 'q')
|
||||
cr = ClassicalRegister(3)
|
||||
ancilla = QuantumRegister(13, 'ancilla')
|
||||
qc = QuantumCircuit(qr, cr)
|
||||
qc.cx(qr[2], qr[1])
|
||||
qc.cx(qr[2], qr[0])
|
||||
initial_layout = {0: qr[1], 2: qr[0], 15: qr[2]}
|
||||
final_layout = {0: qr[1], 1: ancilla[0], 2: qr[0], 3: ancilla[1], 4: ancilla[2],
|
||||
5: ancilla[3], 6: ancilla[4], 7: ancilla[5], 8: ancilla[6],
|
||||
9: ancilla[7], 10: ancilla[8], 11: ancilla[9], 12: ancilla[10],
|
||||
13: ancilla[11], 14: ancilla[12], 15: qr[2]}
|
||||
|
||||
backend = FakeRueschlikon()
|
||||
|
||||
for optimization_level in range(4):
|
||||
|
@ -83,6 +89,8 @@ class TestFakeBackendTranspiling(QiskitTestCase):
|
|||
optimization_level=optimization_level)
|
||||
qobj = assemble(qc_b)
|
||||
|
||||
self.assertEqual(qc_b.layout._p2v, final_layout)
|
||||
|
||||
compiled_ops = qobj.experiments[0].instructions
|
||||
for operation in compiled_ops:
|
||||
if operation.name == 'cx':
|
||||
|
@ -97,18 +105,24 @@ class TestFakeBackendTranspiling(QiskitTestCase):
|
|||
See: https://github.com/Qiskit/qiskit-terra/issues/2532
|
||||
"""
|
||||
# build a circuit which works as-is on the coupling map, using the initial layout
|
||||
qr = QuantumRegister(5)
|
||||
qr = QuantumRegister(5, 'q')
|
||||
cr = ClassicalRegister(2)
|
||||
ancilla = QuantumRegister(9, 'ancilla')
|
||||
qc = QuantumCircuit(qr, cr)
|
||||
qc.cx(qr[2], qr[4])
|
||||
initial_layout = {qr[2]: 11, qr[4]: 3, # map to [11, 3] connection
|
||||
qr[0]: 1, qr[1]: 5, qr[3]: 9}
|
||||
final_layout = {0: ancilla[0], 1: qr[0], 2: ancilla[1], 3: qr[4], 4: ancilla[2], 5: qr[1],
|
||||
6: ancilla[3], 7: ancilla[4], 8: ancilla[5], 9: qr[3], 10: ancilla[6],
|
||||
11: qr[2], 12: ancilla[7], 13: ancilla[8]}
|
||||
backend = FakeMelbourne()
|
||||
|
||||
for optimization_level in range(4):
|
||||
qc_b = transpile(qc, backend, initial_layout=initial_layout,
|
||||
optimization_level=optimization_level)
|
||||
|
||||
self.assertEqual(qc_b.layout._p2v, final_layout)
|
||||
|
||||
for gate, qubits, _ in qc_b:
|
||||
if gate.name == 'cx':
|
||||
for qubit in qubits:
|
||||
|
@ -122,20 +136,31 @@ class TestFakeBackendTranspiling(QiskitTestCase):
|
|||
See: https://github.com/Qiskit/qiskit-terra/issues/2503
|
||||
"""
|
||||
# build a circuit which works as-is on the coupling map, using the initial layout
|
||||
qr = QuantumRegister(3)
|
||||
qr = QuantumRegister(3, 'q')
|
||||
cr = ClassicalRegister(2)
|
||||
ancilla = QuantumRegister(17, 'ancilla')
|
||||
|
||||
qc = QuantumCircuit(qr, cr)
|
||||
qc.u3(0.1, 0.2, 0.3, qr[0])
|
||||
qc.u2(0.4, 0.5, qr[2])
|
||||
qc.barrier()
|
||||
qc.cx(qr[0], qr[2])
|
||||
initial_layout = [6, 7, 12]
|
||||
|
||||
final_layout = {0: ancilla[0], 1: ancilla[1], 2: ancilla[2], 3: ancilla[3], 4: ancilla[4],
|
||||
5: ancilla[5], 6: qr[0], 7: qr[1], 8: ancilla[6], 9: ancilla[7],
|
||||
10: ancilla[8], 11: ancilla[9], 12: qr[2], 13: ancilla[10], 14: ancilla[11],
|
||||
15: ancilla[12], 16: ancilla[13], 17: ancilla[14], 18: ancilla[15],
|
||||
19: ancilla[16]}
|
||||
|
||||
backend = FakePoughkeepsie()
|
||||
|
||||
for optimization_level in range(4):
|
||||
qc_b = transpile(qc, backend, initial_layout=initial_layout,
|
||||
optimization_level=optimization_level)
|
||||
|
||||
self.assertEqual(qc_b.layout._p2v, final_layout)
|
||||
|
||||
gate_0, qubits_0, _ = qc_b[0]
|
||||
gate_1, qubits_1, _ = qc_b[1]
|
||||
|
||||
|
|
Loading…
Reference in New Issue