import numpy as np
from qcodes import Parameter
from qcodes.utils.validators import Numbers
from qtt.instrument_drivers.virtualAwg.awgs.common import (AwgCommon,
AwgCommonError)
try:
from qcodes.instrument_drivers.Keysight.M3201A import Keysight_M3201A
except ImportError:
Keysight_M3201A = None # type: ignore
[docs]class KeysightM3202A_AWG(AwgCommon):
def __init__(self, awg):
super().__init__('Keysight_M3201A', channel_numbers=[1, 2, 3, 4], marker_numbers=[1])
if not Keysight_M3201A:
raise AwgCommonError('The Keysight SD drivers can not be found!')
if type(awg).__name__ is not self._awg_name:
raise AwgCommonError('The AWG does not correspond with {}'.format(self._awg_name))
self.__settings = [Parameter(name='enabled_outputs', initial_value=0b0000,
set_cmd=None),
Parameter(name='amplitude', unit='Volt', initial_value=1.0,
vals=Numbers(0.0, 1.5), set_cmd=None),
Parameter(name='offset', unit='seconds', initial_value=0.0,
vals=Numbers(0.0, 2.0), set_cmd=None),
Parameter(name='wave_shape', initial_value=6,
set_cmd=None),
Parameter(name='delay', unit='seconds', initial_value=0,
vals=Numbers(0, 10), set_cmd=None),
Parameter(name='auto_trigger', unit='', initial_value=0,
set_cmd=None),
Parameter(name='cycles', initial_value=0,
set_cmd=None),
Parameter(name='prescaler', initial_value=10,
set_cmd=None)]
self.__awg = awg
@property
def fetch_awg(self):
return self.__awg
[docs] def run(self):
bit_mask = self.retrieve_setting('enabled_outputs')
self.__awg.awg_start_multiple(bit_mask)
[docs] def stop(self):
bit_mask = 0b1111
self.__awg.awg_stop_multiple(bit_mask)
[docs] def reset(self):
self.__awg.awg.resetAWG()
[docs] def enable_outputs(self, channels=None):
if not channels:
channels = self._channel_numbers
if not all([ch in self._channel_numbers for ch in channels]):
raise AwgCommonError("Invalid channel numbers {}".format(channels))
bit_mask = self.retrieve_setting('enabled_outputs')
for channel in channels:
bit_mask = bit_mask | 0b1 << (channel - 1)
self.change_setting('enabled_outputs', bit_mask)
[docs] def disable_outputs(self, channels=None):
if not channels:
channels = self._channel_numbers
if not all([ch in self._channel_numbers for ch in channels]):
raise AwgCommonError("Invalid channel numbers {}".format(channels))
bit_mask = self.retrieve_setting('enabled_outputs')
for channel in channels:
bit_mask = bit_mask ^ 0b1 << (channel - 1)
self.change_setting('enabled_outputs', bit_mask)
[docs] def change_setting(self, name, value):
index = next(i for i, p in enumerate(self.__settings) if p.name == name)
self.__settings[index].set(value)
[docs] def retrieve_setting(self, name):
index = next(i for i, p in enumerate(self.__settings) if p.name == name)
return self.__settings[index].get()
[docs] def update_running_mode(self, mode):
raise NotImplementedError
[docs] def retrieve_running_mode(self):
raise NotImplementedError
[docs] def update_sampling_rate(self, sampling_rate):
raise ValueError('The sample rate can only be set via the prescaler!')
[docs] def retrieve_sampling_rate(self):
prescaler = self.retrieve_setting('prescaler')
if prescaler == 0:
return 1e9
elif prescaler == 1:
return 2e8
else:
return 1e8 / prescaler
[docs] def update_gain(self, gain):
self.change_setting('amplitude', gain)
[docs] def retrieve_gain(self):
return self.retrieve_setting('amplitude')