Welcome to Keysight’s Quantum Control System

The Keysight’s Quantum Control System (QCS) library provides an interface to M5000 Series PXI modules and enables users to easily program quantum processors at different levels of abstraction. This includes control from the level of gates or circuits, as well as direct control of the arbitrary waveform generators (AWGs), downconverters, and digitizers.

Operating a quantum processor involves many different tasks, each with their own terminology and skillset. These tasks are most naturally defined relative to one of the following abstraction levels:

  1. Discrete operations (gates) applied to abstract qudits;

  2. Continuous operations (parametric gates using Hamiltonians) acting on abstract qudits; or

  3. Continuous-time voltages of physical instruments.

Keysight’s Quantum Control System enables us to work at each of these levels with a common interface to enable cutting-edge quantum processing.

Waveform programs

A simple program at the waveform level can be written in a few short lines:

import keysight.qcs as qcs

# define abstract channels for the two AWGs and two digitizers
awg = qcs.Channels(range(2), "awg")
dig = qcs.Channels(range(2), "dig")

# instantiate a program and add a waveform to play on the AWG channels
program = qcs.Program()

# create a Gaussian pulse with 50 ns duration, an amplitude of 20% of the channel's
# maximum and a frequency of 5 GHz:
gauss = qcs.RFWaveform(50e-9, qcs.GaussianEnvelope(), 0.2, 5e9)

# add this waveform to both channels
program.add_waveform(gauss, awg)

# add a wait period to the second channel followed by another pulse
program.add_waveform(qcs.Delay(200e-9), awg[1], new_layer=True)
program.add_waveform(gauss, awg[1])


# add a 500 ns acquisition on the digitizer channel after the AWG pulses
program.add_acquisition(500e-9, dig, new_layer=True)

program.draw()
keysight-logo-svg
Program
Program
Duration 800 ns
Layers 3
Targets 4
Repetitions
Layer #0
Layer #0
Duration 50 ns
Layer #1
Layer #1
Duration 250 ns
Layer #2
Layer #2
Duration 500 ns
awg 0
RFWaveform on ('awg', 0)

Parameters
Duration 50 ns
Amplitude 0.2
Frequency 5 GHz
Envelope GaussianEnvelope(2.0)
Instantaneous Phase 0 rad
Post-phase 0 rad
1
RFWaveform on ('awg', 1)

Parameters
Duration 50 ns
Amplitude 0.2
Frequency 5 GHz
Envelope GaussianEnvelope(2.0)
Instantaneous Phase 0 rad
Post-phase 0 rad
Delay on ('awg', 1)

Parameters
Duration 200 ns
RFWaveform on ('awg', 1)

Parameters
Duration 50 ns
Amplitude 0.2
Frequency 5 GHz
Envelope GaussianEnvelope(2.0)
Instantaneous Phase 0 rad
Post-phase 0 rad
dig 0
Acquisition on ('dig', 0)

Parameters
Duration 500 ns
1
Acquisition on ('dig', 1)

Parameters
Duration 500 ns

Quantum Circuits

Similarly, a simple quantum circuit program can be written as:

qudits1 = qcs.Qudits(range(2), "xy_qudits")
qudits2 = qcs.Qudits(2, "other")

program = qcs.Program()

program.add_gate(qcs.GATES.x, qudits1[0])
program.add_gate(qcs.GATES.cx, (qudits1[0], qudits2[0]))

program.add_gate(qcs.GATES.y, qudits2, new_layer=True)

program.add_gate(qcs.GATES.cx, (qudits1[1], qudits2[0]))

program.add_measurement(qudits1[1], new_layer=True)
program.add_measurement(qudits2, new_layer=True)

program.draw()
keysight-logo-svg
Program
Program
Duration undefined
Layers 6
Targets 3
Repetitions
Layer #0
Layer #0
Duration undefined
Layer #1
Layer #1
Duration undefined
Layer #2
Layer #2
Duration undefined
Layer #3
Layer #3
Duration undefined
Layer #4
Layer #4
Duration undefined
Layer #5
Layer #5
Duration undefined
xy_qudits 0
X
Gate X on ('xy_qudits', 0)

Matrix:
0 1
1 0
CX
Gate CX on (('xy_qudits', 0), ('other', 2))

Matrix:
1 0 0 0
0 1 0 0
0 0 0 1
0 0 1 0
1
CX
Gate CX on (('xy_qudits', 1), ('other', 2))

Matrix:
1 0 0 0
0 1 0 0
0 0 0 1
0 0 1 0
Measure on ('xy_qudits', 1)

Parameters
Dim 2
other 2
CX
Gate CX on (('other', 2), ('xy_qudits', 0))

Matrix:
1 0 0 0
0 1 0 0
0 0 0 1
0 0 1 0
Y
Gate Y on ('other', 2)

Matrix:
0 -1j
1j 0
CX
Gate CX on (('other', 2), ('xy_qudits', 1))

Matrix:
1 0 0 0
0 1 0 0
0 0 0 1
0 0 1 0
Measure on ('other', 2)

Parameters
Dim 2

Guides

The following pages provide a detailed guide for how to use the Keysight’s Quantum Control System framework. For a quick start, users can jump right to our Running a program on hardware tutorial. The tutorials introduce the basic types and show how the pieces fit together, and the applications show the full workflow for concrete applications.

Tutorials

Check out our collection of tutorials to understand the main functionalities offered by Keysight’s Quantum Control System.

Tutorials

Applications

Learn how to use Keysight’s Quantum Control System’s functionalities by looking at experimentally-relevant examples.

Experiments
On this page