Skip to content

Commit

Permalink
Refactor multi-qubit basic sequences to use registers of width > 1.
Browse files Browse the repository at this point in the history
  • Loading branch information
blakejohnson committed Apr 11, 2017
1 parent 5de37b0 commit c3ce57c
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 92 deletions.
100 changes: 43 additions & 57 deletions src/python/qgl2/basic_sequences/CRMin.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,10 @@
import numpy as np
from math import pi

@qgl2decl
def meas_all(qubits: qbit_list):
for q in qubits:
MEAS(q)

@qgl2decl
def doPiRabi():
# FIXME: No arguments allowed
controlQ = QRegister('q1')
targetQ = QRegister('q2')
qr = QRegister('q1', 'q2') # qr[0] is control, qr[1] is target
# FIXME: Better values!?
lengths = np.linspace(0, 4e-6, 11)
riseFall=40e-9
Expand All @@ -28,31 +22,28 @@ def doPiRabi():

# Sequence 1: Id(control), gaussian(l), measure both
for l in lengths:
init(controlQ)
init(targetQ)
Id(controlQ)
flat_top_gaussian_edge(controlQ, targetQ, riseFall, amp=amp, phase=phase, length=l)
Barrier("", (targetQ, controlQ))
meas_all([targetQ, controlQ])
init(qr)
Id(qr[0])
flat_top_gaussian_edge(qr[0], qr[1], riseFall, amp=amp, phase=phase, length=l)
Barrier("", (qr,))
MEAS(qr)

# Sequence 2: X(control), gaussian(l), X(control), measure both
for l in lengths:
init(controlQ)
init(targetQ)
X(controlQ)
flat_top_gaussian_edge(controlQ, targetQ, riseFall, amp=amp, phase=phase, length=l)
X(controlQ)
Barrier("", (targetQ, controlQ))
meas_all([targetQ, controlQ])
init(qr)
X(qr[0])
flat_top_gaussian_edge(qr[0], qr[1], riseFall, amp=amp, phase=phase, length=l)
X(qr[0])
Barrier("", (qr,))
MEAS(qr)

# Then do calRepeats calibration sequences
create_cal_seqs((targetQ, controlQ), calRepeats)
create_cal_seqs(qr, calRepeats)

@qgl2decl
def doEchoCRLen():
# FIXME: No arguments allowed
controlQ = QRegister('q1')
targetQ = QRegister('q2')
qr = QRegister('q1', 'q2') # qr[0] is control, qr[1] is target
# FIXME: Better values!?
lengths = np.linspace(0, 2e-6, 11)
riseFall=40e-9
Expand All @@ -62,34 +53,31 @@ def doEchoCRLen():

# Sequence1:
for l in lengths:
init(controlQ)
init(targetQ)
Id(controlQ)
echoCR(controlQ, targetQ, length=l, phase=phase,
init(qr)
Id(qr[0])
echoCR(qr[0], qr[1], length=l, phase=phase,
riseFall=riseFall)
Id(controlQ)
Barrier("", (targetQ, controlQ))
meas_all([targetQ, controlQ])
Id(qr[0])
Barrier("", (qr,))
MEAS(qr)

# Sequence 2
for l in lengths:
init(controlQ)
init(targetQ)
X(controlQ)
echoCR(controlQ, targetQ, length=l, phase=phase,
init(qr)
X(qr[0])
echoCR(qr[0], qr[1], length=l, phase=phase,
riseFall=riseFall)
X(controlQ)
Barrier("", (targetQ, controlQ))
meas_all([targetQ, controlQ])
X(qr[0])
Barrier("", (qr,))
MEAS(qr)

# Then do calRepeats calibration sequences
create_cal_seqs((targetQ, controlQ), calRepeats)
create_cal_seqs(qr, calRepeats)

@qgl2decl
def doEchoCRPhase():
# FIXME: No arguments allowed
controlQ = QRegister('q1')
targetQ = QRegister('q2')
qr = QRegister('q1', 'q2') # qr[0] is control, qr[1] is target
# FIXME: Better values!?
phases = np.linspace(0, pi/2, 11)
riseFall=40e-9
Expand All @@ -99,27 +87,25 @@ def doEchoCRPhase():

# Sequence 1
for ph in phases:
init(controlQ)
init(targetQ)
Id(controlQ)
echoCR(controlQ, targetQ, length=length, phase=ph,
init(qr)
Id(qr[0])
echoCR(qr[0], qr[1], length=length, phase=ph,
riseFall=riseFall)
X90(targetQ)
Id(controlQ)
Barrier("", (targetQ, controlQ))
meas_all([targetQ, controlQ])
X90(qr[1])
Id(qr[0])
Barrier("", (qr,))
MEAS(qr)

# Sequence 2
for ph in phases:
init(controlQ)
init(targetQ)
X(controlQ)
echoCR(controlQ, targetQ, length=length, phase=ph,
init(qr)
X(qr[0])
echoCR(qr[0], qr[1], length=length, phase=ph,
riseFall=riseFall)
X90(targetQ)
X(controlQ)
Barrier("", (targetQ, controlQ))
meas_all([targetQ, controlQ])
X90(qr[1])
X(qr[0])
Barrier("", (qr,))
MEAS(qr)

# Then do calRepeats calibration sequences
create_cal_seqs((targetQ, controlQ), calRepeats)
create_cal_seqs(qr, calRepeats)
4 changes: 2 additions & 2 deletions src/python/qgl2/basic_sequences/DecouplingMin.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def doHahnEcho(q:qbit, pulseSpacings, periods, calRepeats):
U90(q, phase=2*pi*periods/len(pulseSpacings)*k)
MEAS(q)

create_cal_seqs((q,), calRepeats)
create_cal_seqs(q, calRepeats)

@qgl2decl
def doCPMG(q:qbit, numPulses, pulseSpacing, calRepeats):
Expand All @@ -43,4 +43,4 @@ def doCPMG(q:qbit, numPulses, pulseSpacing, calRepeats):
MEAS(q)

# Tack on calibration
create_cal_seqs((q,), calRepeats)
create_cal_seqs(q, calRepeats)
3 changes: 2 additions & 1 deletion src/python/qgl2/basic_sequences/RabiMin.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,4 +87,5 @@ def doSwap(q:qbit, mq:qbit, delays):
MEAS(q)
MEAS(mq)

create_cal_seqs((mq, q), 2)
qr = QRegister(mq, q)
create_cal_seqs(qr, 2)
4 changes: 2 additions & 2 deletions src/python/qgl2/basic_sequences/T1T2Min.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def doInversionRecovery(q:qbit, delays, calRepeats):
MEAS(q)

# Tack on calibration
create_cal_seqs((q,), calRepeats)
create_cal_seqs(q, calRepeats)

@qgl2decl
def doRamsey(q:qbit, delays, TPPIFreq, calRepeats):
Expand All @@ -34,4 +34,4 @@ def doRamsey(q:qbit, delays, TPPIFreq, calRepeats):
MEAS(q)

# Tack on calibration
create_cal_seqs((q,), calRepeats)
create_cal_seqs(q, calRepeats)
16 changes: 7 additions & 9 deletions src/python/qgl2/basic_sequences/helpers.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
# Copyright 2016 by Raytheon BBN Technologies Corp. All Rights Reserved.

from qgl2.qgl2 import qgl2decl, qbit_list
from qgl2.qgl2 import qgl2decl, qbit_list, qbit
from qgl2.qgl1 import Id, X, MEAS, Barrier
from qgl2.util import init

from itertools import product

@qgl2decl
def create_cal_seqs(qubits: qbit_list, numRepeats):
def create_cal_seqs(qubits: qbit, numRepeats):
"""
Helper function to create a set of calibration sequences.
Parameters
----------
qubits : logical channels, e.g. (q1,) or (q1,q2) (tuple)
numRepeats = number of times to repeat calibration sequences (int)
qubits : a QRegister
numRepeats : number of times to repeat calibration sequences (int)
"""
# Make all combinations for qubit calibration states for n qubits and repeat

Expand All @@ -32,10 +32,8 @@ def create_cal_seqs(qubits: qbit_list, numRepeats):
for pulseSet in product(calSet, repeat=len(qubits)):
# Repeat each calibration numRepeats times
for _ in range(numRepeats):
for q in qubits:
init(q)
init(qubits)
for pulse, qubit in zip(pulseSet, qubits):
pulse(qubit)
Barrier("", qubits)
for q in qubits:
MEAS(q)
Barrier("", (qubits,))
MEAS(qubits)
42 changes: 21 additions & 21 deletions test/test_basic_mins.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,9 @@ def test_PiRabi(self):
qwait(),
Id(controlQ),
flat_top_gaussian(edge, riseFall, length=l, amp=amp, phase=phase),
Barrier("", (targetQ, controlQ)),
MEAS(targetQ),
MEAS(controlQ)
Barrier("", (controlQ, targetQ)),
MEAS(controlQ),
MEAS(targetQ)
]
# Seq2
for l in lengths:
Expand All @@ -143,13 +143,13 @@ def test_PiRabi(self):
X(controlQ),
flat_top_gaussian(edge, riseFall, length=l, amp=amp, phase=phase),
X(controlQ),
Barrier("", (targetQ, controlQ)),
MEAS(targetQ),
MEAS(controlQ)
Barrier("", (controlQ, targetQ)),
MEAS(controlQ),
MEAS(targetQ)
]

# Add calibration
calseq = get_cal_seqs_2qubits(targetQ, controlQ, calRepeats)
calseq = get_cal_seqs_2qubits(controlQ, targetQ, calRepeats)
expected_seq += calseq
expected_seq = testable_sequence(expected_seq)

Expand Down Expand Up @@ -181,9 +181,9 @@ def test_EchoCRLen(self):
echoCR(controlQ, targetQ, length=l, phase=phase,
riseFall=riseFall),
Id(controlQ),
Barrier("", (targetQ, controlQ)),
MEAS(targetQ),
MEAS(controlQ)
Barrier("", (controlQ, targetQ)),
MEAS(controlQ),
MEAS(targetQ)
]
# Seq2
for l in lengths:
Expand All @@ -194,13 +194,13 @@ def test_EchoCRLen(self):
echoCR(controlQ, targetQ, length=l, phase=phase,
riseFall=riseFall),
X(controlQ),
Barrier("", (targetQ, controlQ)),
MEAS(targetQ),
MEAS(controlQ)
Barrier("", (controlQ, targetQ)),
MEAS(controlQ),
MEAS(targetQ)
]

# Add calibration
cal_seqs = get_cal_seqs_2qubits(targetQ, controlQ, calRepeats)
cal_seqs = get_cal_seqs_2qubits(controlQ, targetQ, calRepeats)
expected_seq += cal_seqs
expected_seq = testable_sequence(expected_seq)

Expand Down Expand Up @@ -232,9 +232,9 @@ def test_EchoCRPhase(self):
riseFall=riseFall),
X90(targetQ),
Id(controlQ),
Barrier("", (targetQ, controlQ)),
MEAS(targetQ),
MEAS(controlQ)
Barrier("", (controlQ, targetQ)),
MEAS(controlQ),
MEAS(targetQ)
]

# Seq2
Expand All @@ -247,13 +247,13 @@ def test_EchoCRPhase(self):
riseFall=riseFall),
X90(targetQ),
X(controlQ),
Barrier("", (targetQ, controlQ)),
MEAS(targetQ),
MEAS(controlQ)
Barrier("", (controlQ, targetQ)),
MEAS(controlQ),
MEAS(targetQ)
]

# Add calibration
cal_seqs = get_cal_seqs_2qubits(targetQ, controlQ, calRepeats)
cal_seqs = get_cal_seqs_2qubits(controlQ, targetQ, calRepeats)
expected_seq += cal_seqs
expected_seq = testable_sequence(expected_seq)

Expand Down

0 comments on commit c3ce57c

Please sign in to comment.