Source code for ttheom.circuit.transform_circ
from numpy import pi
from qiskit import QuantumCircuit, transpile
from qiskit.transpiler import Target
from qiskit.circuit import Delay, Parameter
from ..tt.TTs import TTs
[docs]
def transform(qc: QuantumCircuit, TTs: TTs):
"""transform a quantum circuit into a circuit consisting of
'rx', 'ry', and 'xx_plus_yy'
args:
qc (qiskit.QuantumCircuit):
quantum circuit to be transformed
TTs (TTs): class for MPS and MPO
returns:
qiskit.QuantumCircuit: quantum circuit consisting of
elemental gates defined in TTs
"""
propDict = {}
for qubitIdx, pulse in TTs.pulse:
if len(qubitIdx) == 1:
prop = {tuple(qubitIdx): None}
else:
prop = {tuple(qubitIdx): None,
(qubitIdx[1], qubitIdx[0]): None}
for eGate in pulse.elementalGates():
name = eGate.name
if name not in propDict.keys():
propDict[name] = prop
else:
for k, v in prop.items():
propDict[name][k] = v
isAdded = {}
for k in propDict.keys():
isAdded[k] = False
tgt = Target()
numQubit = qc.num_qubits
dur = Parameter('dur')
for i in range (numQubit):
propDelay = {(i, ): None}
tgt.add_instruction(Delay(dur), propDelay)
for _, pulse in TTs.pulse:
for eGate in pulse.elementalGates():
key = eGate.name
if not isAdded[key]:
tgt.add_instruction(eGate, propDict[key])
isAdded[key] = True
return transpile(qc, target=tgt, optimization_level=1)
[docs]
def scheduling(qc:QuantumCircuit):
"""padding delay for synchronization
scheduling method: ALAP
args:
qc (qiskit.QuantumCircuit):
quantum circuit to be transformed
returns:
qcNew (qiskit.QuantumCircuit):
quantum circuit with delay
"""
# align in reverse order for ALAP
lastTimes = [0] * qc.num_qubits
qcReverse = QuantumCircuit(qc.num_qubits)
for ope, qargs, cargs in reversed(qc.data):
qubitIdx = [q._index for q in qargs]
startTime = max([lastTimes[q] for q in qubitIdx])
for q in qubitIdx:
timeDiff = startTime - lastTimes[q]
if timeDiff > 0:
qcReverse.delay(timeDiff, q)
qcReverse.append(ope, qubitIdx)
dur = int(ope.params[0])
for q in qubitIdx:
lastTimes[q] = startTime + dur
timeMax = max(lastTimes)
for q in range(qc.num_qubits):
timeDiff = timeMax - lastTimes[q]
if timeDiff > 0:
qcReverse.delay(timeDiff, q)
# align in original order
qcNew = QuantumCircuit(qc.num_qubits)
for ope, qargs, cargs in reversed(qcReverse.data):
qubitIdx = [q._index for q in qargs]
qcNew.append(ope, qubitIdx)
return qcNew