Skip to content

Commit

Permalink
Merge pull request #983 from qiboteam/channel-native-decoupling
Browse files Browse the repository at this point in the history
Separate channels from natives
  • Loading branch information
alecandido authored Aug 16, 2024
2 parents 4b5b7d7 + 2171caa commit 50faccf
Show file tree
Hide file tree
Showing 17 changed files with 317 additions and 358 deletions.
3 changes: 2 additions & 1 deletion doc/source/getting-started/experiment.rst
Original file line number Diff line number Diff line change
Expand Up @@ -216,8 +216,9 @@ We leave to the dedicated tutorial a full explanation of the experiment, but her
platform = create_platform("dummy")

qubit = platform.qubits[0]
natives = platform.parameters.native_gates.single_qubit[0]
# define the pulse sequence
sequence = qubit.native_gates.MZ.create_sequence()
sequence = natives.MZ.create_sequence()

# define a sweeper for a frequency scan
sweeper = Sweeper(
Expand Down
30 changes: 18 additions & 12 deletions doc/source/main-documentation/qibolab.rst
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,11 @@ Now we can create a simple sequence (again, without explicitly giving any qubit

ps = PulseSequence()
qubit = platform.qubits[0]
ps.concatenate(qubit.native_gates.RX.create_sequence())
ps.concatenate(qubit.native_gates.RX.create_sequence(phi=np.pi / 2))
natives = platform.parameters.native_gates.single_qubit[0]
ps.concatenate(natives.RX.create_sequence())
ps.concatenate(natives.RX.create_sequence(phi=np.pi / 2))
ps.append((qubit.probe.name, Delay(duration=200)))
ps.concatenate(qubit.native_gates.MZ.create_sequence())
ps.concatenate(natives.MZ.create_sequence())

Now we can execute the sequence on hardware:

Expand Down Expand Up @@ -335,15 +336,16 @@ Typical experiments may include both pre-defined pulses and new ones:

from qibolab.pulses import Rectangular

natives = platform.parameters.native_gates.single_qubit[0]
sequence = PulseSequence()
sequence.concatenate(platform.qubits[0].native_gates.RX.create_sequence())
sequence.concatenate(natives.RX.create_sequence())
sequence.append(
(
"some_channel",
Pulse(duration=10, amplitude=0.5, relative_phase=0, envelope=Rectangular()),
)
)
sequence.concatenate(platform.qubits[0].native_gates.MZ.create_sequence())
sequence.concatenate(natives.MZ.create_sequence())

results = platform.execute([sequence], options=options)

Expand Down Expand Up @@ -414,15 +416,17 @@ A tipical resonator spectroscopy experiment could be defined with:

from qibolab.sweeper import Parameter, Sweeper, SweeperType

natives = platform.parameters.native_gates.single_qubit

sequence = PulseSequence()
sequence.concatenate(
platform.qubits[0].native_gates.MZ.create_sequence()
natives[0].MZ.create_sequence()
) # readout pulse for qubit 0 at 4 GHz
sequence.concatenate(
platform.qubits[1].native_gates.MZ.create_sequence()
natives[1].MZ.create_sequence()
) # readout pulse for qubit 1 at 5 GHz
sequence.concatenate(
platform.qubits[2].native_gates.MZ.create_sequence()
natives[2].MZ.create_sequence()
) # readout pulse for qubit 2 at 6 GHz

sweeper = Sweeper(
Expand Down Expand Up @@ -459,10 +463,11 @@ For example:
from qibolab.pulses import PulseSequence, Delay

qubit = platform.qubits[0]
natives = platform.parameters.native_gates.single_qubit[0]
sequence = PulseSequence()
sequence.concatenate(qubit.native_gates.RX.create_sequence())
sequence.concatenate(natives.RX.create_sequence())
sequence.append((qubit.probe.name, Delay(duration=sequence.duration)))
sequence.concatenate(qubit.native_gates.MZ.create_sequence())
sequence.concatenate(natives.MZ.create_sequence())

sweeper_freq = Sweeper(
parameter=Parameter.frequency,
Expand Down Expand Up @@ -555,11 +560,12 @@ Let's now delve into a typical use case for result objects within the qibolab fr
.. testcode:: python

qubit = platform.qubits[0]
natives = platform.parameters.native_gates.single_qubit[0]

sequence = PulseSequence()
sequence.concatenate(qubit.native_gates.RX.create_sequence())
sequence.concatenate(natives.RX.create_sequence())
sequence.append((qubit.probe.name, Delay(duration=sequence.duration)))
sequence.concatenate(qubit.native_gates.MZ.create_sequence())
sequence.concatenate(natives.MZ.create_sequence())

options = ExecutionParameters(
nshots=1000,
Expand Down
13 changes: 8 additions & 5 deletions doc/source/tutorials/calibration.rst
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ around the pre-defined frequency.
platform = create_platform("dummy")

qubit = platform.qubits[0]
sequence = qubit.native_gates.MZ.create_sequence()
natives = platform.parameters.native_gates.single_qubit[0]
sequence = natives.MZ.create_sequence()

# allocate frequency sweeper
sweeper = Sweeper(
Expand Down Expand Up @@ -124,6 +125,7 @@ complex pulse sequence. Therefore with start with that:
platform = create_platform("dummy")

qubit = platform.qubits[0]
natives = platform.parameters.native_gates.single_qubit[0]

# create pulse sequence and add pulses
sequence = PulseSequence(
Expand All @@ -135,7 +137,7 @@ complex pulse sequence. Therefore with start with that:
(qubit.probe.name, Delay(duration=sequence.duration)),
]
)
sequence.concatenate(qubit.native_gates.MZ.create_sequence())
sequence.concatenate(natives.MZ.create_sequence())

# allocate frequency sweeper
sweeper = Sweeper(
Expand Down Expand Up @@ -226,15 +228,16 @@ and its impact on qubit states in the IQ plane.
platform = create_platform("dummy")

qubit = platform.qubits[0]
natives = platform.parameters.native_gates.single_qubit[0]

# create pulse sequence 1 and add pulses
one_sequence = PulseSequence()
one_sequence.concatenate(qubit.native_gates.RX.create_sequence())
one_sequence.concatenate(natives.RX.create_sequence())
one_sequence.append((qubit.probe.name, Delay(duration=one_sequence.duration)))
one_sequence.concatenate(qubit.native_gates.MZ.create_sequence())
one_sequence.concatenate(natives.MZ.create_sequence())

# create pulse sequence 2 and add pulses
zero_sequence = qubit.native_gates.MZ.create_sequence()
zero_sequence = natives.MZ.create_sequence()

options = ExecutionParameters(
nshots=1000,
Expand Down
2 changes: 1 addition & 1 deletion doc/source/tutorials/compiler.rst
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ The following example shows how to modify the compiler in order to execute a cir
# define a compiler rule that translates X to the pi-pulse
def x_rule(gate, qubit):
"""X gate applied with a single pi-pulse."""
return qubit.native_gates.RX.create_sequence()
return qubit.RX.create_sequence()


# the empty dictionary is needed because the X gate does not require any virtual Z-phases
Expand Down
Loading

0 comments on commit 50faccf

Please sign in to comment.