Pulseblaster (-DDS)

Overview

This labscript device controls the Spincore Pulseblasers that do not have DDS outputs. The Pulseblaster is a programmable pulse generator that is the typical timing backbone of an experiment (ie it generates the pseudoclock timing pulses that control execution of other devices in the experiment). This labscript device inherits from the Pulseblaster device. The primary difference is the removal of code handling DDS outputs.

The labscript-suite currently supports a number of no-dds variants of the Pulseblaster device, each with different numbers of outputs and clock frequencies:

  • PulseBlaster_No_DDS: Has 24 digital outputs and a 100 MHz core clock frequency.

  • PulseBlasterUSB: Identical to the PulseBlaster_No_DDS device

  • PulseBlaster_SP2_24_100_32k: Has slightly lower clock_limit and clock_resolution than the standard device. Also supports 32k instructions instead of the standard 4k.

  • PulseBlasterESRPro200: Has a 200 MHz core clock frequency.

  • PulseBlasterESRPro500: Has a 500 MHz core clock frequency.

ESR-Pro PulseBlasters

The timing resolution of a normal PulseBlaster is one clock cycle, the minimum interval is typically limited to 5 clock cycles (or nine in the case of the external memory models like the 32k). The ESR-Pro series of PulseBlasters have the Short Pulse Feature, which allows for pulse lengths of 1-5 clock periods. This is controlled using the top three bits (21-23) according to the following table.

Short Pulse Control

SpinAPI Define

Bits 21-23

Clock Periods

Pulse Length (ns) at 500 MHz

-

000

-

All outputs low

ONE_PERIOD

001

1

2

TWO_PERIOD

010

2

4

THREE_PERIOD

011

3

6

FOUR_PERIOD

100

4

8

FIVE_PERIOD

101

5

10

ON

111

-

Short Pulse Disabled

Currently, the PulseBlaster labscript device does not use this functionality. However, in order to get any output at all, bits 21-23 must be set high manually.

Installation

Use of the Pulseblaster requires driver installation available from the manufacturer here. The corresponding python wrapper, spinapi is available via pip.

pip install -U spinapi

Usage

from labscript import *

from labscript_devices.PulseBlaster import PulseBlaster

PulseBlaster(name='pb',board_number=0,programming_scheme='pb_start/BRANCH')

Clockline(name='pb_clockline_fast', pseudoclock=pb.pseudoclock,connection='flag 0')
Clockline(name='pb_clockline_slow', pseudoclock=pb.pseudoclock,connection='flag 1')

DigitalOut(name='pb_0',parent_device=pb.direct_outputs,connection='flag 2')

start()

stop(1)

Detailed Documentation

labscript_devices.PulseBlaster_No_DDS

labscript_devices.PulseBlasterUSB

labscript_devices.PulseBlaster_SP2_24_100_32k

labscript_devices.PulseBlasterESRPro200

labscript_devices.PulseBlasterESRPro500

PulseBlaster_No_DDS

class labscript_devices.PulseBlaster_No_DDS.PulseBlaster_No_DDS(name, trigger_device=None, trigger_connection=None, board_number=0, firmware='', programming_scheme='pb_start/BRANCH', pulse_width='symmetric', max_instructions=4000, time_based_stop_workaround=False, time_based_stop_workaround_extra_time=0.5, **kwargs)[source]

Bases: labscript_devices.PulseBlaster.PulseBlaster

clock_limit = 8300000.0
clock_resolution = 2e-08
core_clock_freq = 100
description = 'generic DO only Pulseblaster'
generate_code(hdf5_file)[source]
n_flags = 24
write_pb_inst_to_h5(pb_inst, hdf5_file)[source]
class labscript_devices.PulseBlaster_No_DDS.PulseBlaster_No_DDS_Parser(path, device)[source]

Bases: labscript_devices.PulseBlaster.PulseBlasterParser

labscript_device_class_name = 'PulseBlaster_No_DDS'
num_dds = 0
num_flags = 24
class labscript_devices.PulseBlaster_No_DDS.PulseblasterNoDDSWorker(*args, **kwargs)[source]

Bases: blacs.tab_base_classes.Worker

abort_buffered()[source]
abort_transition_to_buffered()[source]
check_status()[source]
core_clock_freq = 100
init()[source]
program_manual(values)[source]
shutdown()[source]
start_run()[source]
transition_to_buffered(device_name, h5file, initial_values, fresh)[source]
transition_to_manual()[source]
class labscript_devices.PulseBlaster_No_DDS.Pulseblaster_No_DDS_Tab(*args, **kwargs)[source]

Bases: blacs.device_base_class.DeviceTab

get_child_from_connection_table(parent_device_name, port)[source]
initialise_GUI()[source]
labscript_device_class_name = 'PulseBlaster_No_DDS'
num_DO = 24
reset(*args, **kwargs)
start(*args, **kwargs)
start_run(*args, **kwargs)
status_monitor(*args, **kwargs)
stop(*args, **kwargs)

PulseBlasterUSB

class labscript_devices.PulseBlasterUSB.PulseBlasterUSB(name, trigger_device=None, trigger_connection=None, board_number=0, firmware='', programming_scheme='pb_start/BRANCH', pulse_width='symmetric', max_instructions=4000, time_based_stop_workaround=False, time_based_stop_workaround_extra_time=0.5, **kwargs)[source]

Bases: labscript_devices.PulseBlaster_No_DDS.PulseBlaster_No_DDS

clock_limit = 8300000.0
clock_resolution = 2e-08
core_clock_freq = 100.0
description = 'SpinCore PulseBlasterUSB'
n_flags = 24
class labscript_devices.PulseBlasterUSB.PulseBlasterUSBParser(path, device)[source]

Bases: labscript_devices.PulseBlaster_No_DDS.PulseBlaster_No_DDS_Parser

labscript_device_class_name = 'PulseBlasterUSB'
class labscript_devices.PulseBlasterUSB.PulseblasterUSBTab(*args, **kwargs)[source]

Bases: labscript_devices.PulseBlaster_No_DDS.Pulseblaster_No_DDS_Tab

labscript_device_class_name = 'PulseBlasterUSB'
num_DO = 24
class labscript_devices.PulseBlasterUSB.PulseblasterUSBWorker(*args, **kwargs)[source]

Bases: labscript_devices.PulseBlaster_No_DDS.PulseblasterNoDDSWorker

core_clock_freq = 100.0

PulseBlaster_SP2_24_100_32k

class labscript_devices.PulseBlaster_SP2_24_100_32k.PulseBlaster_SP2_24_100_32k(*args, **kwargs)[source]

Bases: labscript_devices.PulseBlaster_No_DDS.PulseBlaster_No_DDS

clock_limit = 5000000.0
clock_resolution = 1e-08
core_clock_freq = 100.0
description = 'SpinCore PulseBlaster-SP2-24-100-32k'
n_flags = 24
class labscript_devices.PulseBlaster_SP2_24_100_32k.PulseBlaster_SP2_24_100_32k_Parser(path, device)[source]

Bases: labscript_devices.PulseBlaster.PulseBlasterParser

labscript_device_class_name = 'PulseBlaster_SP2_24_100_32k'
num_dds = 0
num_flags = 24
class labscript_devices.PulseBlaster_SP2_24_100_32k.PulseBlaster_SP2_24_100_32k_Tab(*args, **kwargs)[source]

Bases: labscript_devices.PulseBlaster_No_DDS.Pulseblaster_No_DDS_Tab

labscript_device_class_name = 'PulseBlaster_SP2_24_100_32k'
num_DO = 24
class labscript_devices.PulseBlaster_SP2_24_100_32k.PulseBlaster_SP2_24_100_32k_Worker(*args, **kwargs)[source]

Bases: labscript_devices.PulseBlaster_No_DDS.PulseblasterNoDDSWorker

core_clock_freq = 100.0

PulseBlasterESRPro200

class labscript_devices.PulseBlasterESRPro200.PulseBlasterESRPro200(name, trigger_device=None, trigger_connection=None, board_number=0, firmware='', programming_scheme='pb_start/BRANCH', pulse_width='symmetric', max_instructions=4000, time_based_stop_workaround=False, time_based_stop_workaround_extra_time=0.5, **kwargs)[source]

Bases: labscript_devices.PulseBlaster_No_DDS.PulseBlaster_No_DDS

clock_limit = 200000000.0
clock_resolution = 5e-09
core_clock_freq = 200.0
description = 'SpinCore PulseBlaster ESR-PRO-200'
n_flags = 21
class labscript_devices.PulseBlasterESRPro200.PulseblasterESRPro200Parser(path, device)[source]

Bases: labscript_devices.PulseBlaster_No_DDS.PulseBlaster_No_DDS_Parser

labscript_device_class_name = 'PulseBlasterESRPro200'
num_dds = 0
num_flags = 21
class labscript_devices.PulseBlasterESRPro200.PulseblasterESRPro200Worker(*args, **kwargs)[source]

Bases: labscript_devices.PulseBlaster_No_DDS.PulseblasterNoDDSWorker

core_clock_freq = 200.0
class labscript_devices.PulseBlasterESRPro200.pulseblasteresrpro200(*args, **kwargs)[source]

Bases: labscript_devices.PulseBlaster_No_DDS.Pulseblaster_No_DDS_Tab

labscript_device_class_name = 'PulseBlasterESRPro200'
num_DO = 21

PulseBlasterESRPro500

class labscript_devices.PulseBlasterESRPro500.PulseBlasterESRPro500(name, trigger_device=None, trigger_connection=None, board_number=0, firmware='', programming_scheme='pb_start/BRANCH', pulse_width='symmetric', max_instructions=4000, time_based_stop_workaround=False, time_based_stop_workaround_extra_time=0.5, **kwargs)[source]

Bases: labscript_devices.PulseBlaster_No_DDS.PulseBlaster_No_DDS

clock_limit = 50000000.0
clock_resolution = 4e-09
core_clock_freq = 500.0
description = 'SpinCore PulseBlaster ESR-PRO-500'
n_flags = 21
class labscript_devices.PulseBlasterESRPro500.PulseblasterESRPro500Worker(*args, **kwargs)[source]

Bases: labscript_devices.PulseBlaster_No_DDS.PulseblasterNoDDSWorker

core_clock_freq = 500.0
class labscript_devices.PulseBlasterESRPro500.pulseblasteresrpro500(*args, **kwargs)[source]

Bases: labscript_devices.PulseBlaster_No_DDS.Pulseblaster_No_DDS_Tab

labscript_device_class_name = 'PulseBlasterESRPro500'
num_DO = 21