Fork me on GitHub

ARTIQ (Advanced Real-Time Infrastructure for Quantum physics) is a next-generation control system for quantum information experiments. It is being developed in partnership with the Ion Storage Group at NIST, and its applicability reaches beyond ion trapping.

Modern research on quantum information systems poses particular challenges to the control system:


ARTIQ features a high-level programming language, based on Python, that helps describing complex experiments. It is compiled and executed on dedicated FPGA hardware with nanosecond timing resolution and sub-microsecond latency.

The time-critical code (a kernel) running on the FPGA (the core device) is easily interfaced with Python code on the computer using a remote procedure call (RPC) mechanism.

The FPGA design is highly portable so that it can adapt to different laboratory setups and resist hardware obsolescence.

ARTIQ drivers for non-realtime devices can be run on remote machines with different operating systems.

The project also includes a graphical user interface, an experiment scheduling system, and databases for experiments, devices, parameters and results.

Technologies employed include Python, Migen, MiSoC/mor1kx, LLVM and llvmlite.

Open source

Another goal of ARTIQ is to streamline and simplify the design flow of quantum physics instrumentation by promoting design reuse through the development of platform-independent, open-source hardware and software.

Our aim is to provide a control system suitable for the challenges of modern quantum information research, which is based on modular, parameterized and open components that allow physicists to rapidly design and deploy new experiments.

A taste of the programming language

Timing language basics

trigger.sync()               # wait for trigger input
start = now_mu()             # capture trigger time
for i in range(3):
    dds.pulse(900*MHz, 7*us) # first pulse 5 µs after trigger
at_mu(start) # re-reference time-line
dds.pulse(200*MHz, 11*us)    # exactly 1 ms after trigger


with sequential:
    with parallel:
        a.pulse(100*MHz, 10*us)
        b.pulse(200*MHz, 20*us)
    with parallel:
        c.pulse(300*MHz, 30*us)
        d.pulse(400*MHz, 20*us)

Organize experiment components and reuse code

class Experiment(EnvExperiment):
    def build(self):
        self.ion1 = Ion(...)
        self.ion2 = Ion(...)
        self.transporter = Transporter(...)

    def run(self):
        with parallel:

Is ARTIQ right for my lab?

It's easy to find out by yourself! The core device is based on the resource-efficient MiSoC system-on-chip design, and you can use a limited version of ARTIQ with the small and low-cost Pipistrello board. Feel free to send feedback to the mailing list! See the manual for instructions. Note that Windows is not currently supported with the Pipistrello due to problems with the Windows PPP stack.