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 thePulseBlaster_No_DDS
device
PulseBlaster_SP2_24_100_32k
: Has slightly lowerclock_limit
andclock_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.
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
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:
PulseBlaster
Instantiates a pseudoclock device.
- Parameters:
name (str) – python variable to assign to this device.
trigger_device (
DigitalOut
) – Sets the parent triggering output. IfNone
, this is considered the master pseudoclock.trigger_connection (str, optional) – Must be provided if
trigger_device
is provided. Specifies the channel of the parent device.**kwargs – Passed to
TriggerableDevice.__init__()
.
- clock_limit = 8300000.0
- clock_resolution = 2e-08
- core_clock_freq = 100
- description = 'generic DO only Pulseblaster'
Brief description of the device.
- generate_code(hdf5_file)[source]
Generate hardware instructions for device and children, then save to h5 file.
Will recursively call
generate_code
for all children devices.- Parameters:
hdf5_file (
h5py.File
) – Handle to shot file.
- n_flags = 24
- class labscript_devices.PulseBlaster_No_DDS.PulseBlaster_No_DDS_Parser(path, device)[source]
Bases:
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:
Worker
- core_clock_freq = 100
- class labscript_devices.PulseBlaster_No_DDS.Pulseblaster_No_DDS_Tab(*args, **kwargs)[source]
Bases:
DeviceTab
- 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:
PulseBlaster_No_DDS
Instantiates a pseudoclock device.
- Parameters:
name (str) – python variable to assign to this device.
trigger_device (
DigitalOut
) – Sets the parent triggering output. IfNone
, this is considered the master pseudoclock.trigger_connection (str, optional) – Must be provided if
trigger_device
is provided. Specifies the channel of the parent device.**kwargs – Passed to
TriggerableDevice.__init__()
.
- clock_limit = 8300000.0
- clock_resolution = 2e-08
- core_clock_freq = 100.0
- description = 'SpinCore PulseBlasterUSB'
Brief description of the device.
- n_flags = 24
- class labscript_devices.PulseBlasterUSB.PulseBlasterUSBParser(path, device)[source]
Bases:
PulseBlaster_No_DDS_Parser
- labscript_device_class_name = 'PulseBlasterUSB'
- class labscript_devices.PulseBlasterUSB.PulseblasterUSBTab(*args, **kwargs)[source]
Bases:
Pulseblaster_No_DDS_Tab
- labscript_device_class_name = 'PulseBlasterUSB'
- num_DO = 24
- class labscript_devices.PulseBlasterUSB.PulseblasterUSBWorker(*args, **kwargs)[source]
Bases:
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:
PulseBlaster_No_DDS
Instantiates a pseudoclock device.
- Parameters:
name (str) – python variable to assign to this device.
trigger_device (
DigitalOut
) – Sets the parent triggering output. IfNone
, this is considered the master pseudoclock.trigger_connection (str, optional) – Must be provided if
trigger_device
is provided. Specifies the channel of the parent device.**kwargs – Passed to
TriggerableDevice.__init__()
.
- clock_limit = 5000000.0
- clock_resolution = 1e-08
- core_clock_freq = 100.0
- description = 'SpinCore PulseBlaster-SP2-24-100-32k'
Brief description of the device.
- n_flags = 24
- class labscript_devices.PulseBlaster_SP2_24_100_32k.PulseBlaster_SP2_24_100_32k_Parser(path, device)[source]
Bases:
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:
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:
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:
PulseBlaster_No_DDS
Instantiates a pseudoclock device.
- Parameters:
name (str) – python variable to assign to this device.
trigger_device (
DigitalOut
) – Sets the parent triggering output. IfNone
, this is considered the master pseudoclock.trigger_connection (str, optional) – Must be provided if
trigger_device
is provided. Specifies the channel of the parent device.**kwargs – Passed to
TriggerableDevice.__init__()
.
- clock_limit = 200000000.0
- clock_resolution = 5e-09
- core_clock_freq = 200.0
- description = 'SpinCore PulseBlaster ESR-PRO-200'
Brief description of the device.
- n_flags = 21
- class labscript_devices.PulseBlasterESRPro200.PulseblasterESRPro200Parser(path, device)[source]
Bases:
PulseBlaster_No_DDS_Parser
- labscript_device_class_name = 'PulseBlasterESRPro200'
- num_dds = 0
- num_flags = 21
- class labscript_devices.PulseBlasterESRPro200.PulseblasterESRPro200Worker(*args, **kwargs)[source]
Bases:
PulseblasterNoDDSWorker
- core_clock_freq = 200.0
- class labscript_devices.PulseBlasterESRPro200.pulseblasteresrpro200(*args, **kwargs)[source]
Bases:
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:
PulseBlaster_No_DDS
Instantiates a pseudoclock device.
- Parameters:
name (str) – python variable to assign to this device.
trigger_device (
DigitalOut
) – Sets the parent triggering output. IfNone
, this is considered the master pseudoclock.trigger_connection (str, optional) – Must be provided if
trigger_device
is provided. Specifies the channel of the parent device.**kwargs – Passed to
TriggerableDevice.__init__()
.
- clock_limit = 50000000.0
- clock_resolution = 4e-09
- core_clock_freq = 500.0
- description = 'SpinCore PulseBlaster ESR-PRO-500'
Brief description of the device.
- n_flags = 21
- class labscript_devices.PulseBlasterESRPro500.PulseblasterESRPro500Worker(*args, **kwargs)[source]
Bases:
PulseblasterNoDDSWorker
- core_clock_freq = 500.0
- class labscript_devices.PulseBlasterESRPro500.pulseblasteresrpro500(*args, **kwargs)[source]
Bases:
Pulseblaster_No_DDS_Tab
- labscript_device_class_name = 'PulseBlasterESRPro500'
- num_DO = 21