def write_to_waveform_memory( self, waveforms: Waveforms, indexes: list = None, validate: bool = True ) -> None: """Writes waveforms to the waveform memory. The waveforms must already be assigned in the sequencer program. Args: waveforms: Waveforms that should be uploaded. indexes: Specify a list of indexes that should be uploaded. If nothing is specified all available indexes in waveforms will be uploaded. (default = None) validate: Enable sanity check preformed by toolkit, based on the waveform descriptors on the device. Can be disabled for e.g. speed optimizations. Does not affect the checks happen in LabOne and or the firmware. (default = True) Raises: IndexError: The index of a waveform exceeds the one on the device and `validate` is True. RuntimeError: One of the waveforms index points to a filler(placeholder) and `validate` is True. """ waveform_info = None num_waveforms = None if validate: waveform_info = json.loads(self.waveform.descriptors()).get("waveforms", []) num_waveforms = len(waveform_info) with create_or_append_set_transaction(self._root): for waveform_index in waveforms.keys(): if indexes and waveform_index not in indexes: continue if num_waveforms is not None and waveform_index >= num_waveforms: raise IndexError( f"There are {num_waveforms} waveforms defined on the device " "but the passed waveforms specified one with index " f"{waveform_index}." ) if ( waveform_info and "__filler" in waveform_info[waveform_index]["name"] ): raise RuntimeError( f"The waveform at index {waveform_index} is only " "a filler and can not be overwritten" ) self.root.transaction.add( self.waveform.waves[waveform_index], waveforms.get_raw_vector( waveform_index, target_length=int(waveform_info[waveform_index]["length"]) if waveform_info else None, ), )
def test_dict_behavior(): waveform = Waveforms() wave1 = 1.0 * np.ones(1008) wave1_short = 1.0 * np.ones(500) wave2 = -1.0 * np.ones(1008) wave3 = -0.5 * np.ones(1008) marker = 0.0 * np.ones(1008) with pytest.raises(TypeError) as e_info: waveform[0] = 1 with pytest.raises(RuntimeError) as e_info: waveform[0] = (wave1, wave2, wave3, marker) # "standart" waveform waveform[0] = (wave1, wave2) assert all(waveform[0][0] == wave1) assert all(waveform[0][1] == wave2) assert waveform[0][2] == None assert len(waveform.get_raw_vector(0)) == 1008 * 2 # replace wave waveform[0] = (wave1, wave3) assert all(waveform[0][0] == wave1) assert all(waveform[0][1] == wave3) assert waveform[0][2] == None # replace wave waveform.assign_waveform(0, wave1, wave2) assert all(waveform[0][0] == wave1) assert all(waveform[0][1] == wave2) assert waveform[0][2] == None # delete wave assert 0 in waveform.keys() del waveform[0] assert 0 not in waveform.keys() # iter waveform[0] = (wave1, wave3) waveform[2] = (wave1, wave3) waveform[10] = (wave1, wave3) assert len(waveform) == 3 num_elements = 0 for _, element in waveform.items(): assert all(element[0] == wave1) assert all(element[1] == wave3) num_elements += 1 assert num_elements == len(waveform) # "standart" waveform with marker waveform[1] = (wave1, wave2, marker) assert all(waveform[1][0] == wave1) assert all(waveform[1][1] == wave2) assert all(waveform[1][2] == marker) assert len(waveform.get_raw_vector(1)) == 1008 * 3 # unequal length with pytest.raises(RuntimeError) as e_info: waveform[10] = (wave1_short, wave2) with pytest.raises(RuntimeError) as e_info: waveform[10] = (wave1, wave2, wave1_short) # invalid inputs with pytest.raises(RuntimeError) as e_info: waveform[10] = (0, 0, 0) # complex values waveform[10] = np.ones(1008, dtype=np.complex128) waveform[10] = (np.ones(1008, dtype=np.complex128), marker) waveform[10] = (np.ones(1008, dtype=np.complex128), None, marker) with pytest.raises(RuntimeError) as e_info: waveform[10] = (np.ones(1008, dtype=np.complex128), wave2, None)