Exemple #1
0
    def __init__(self, tabor_device: TaborAWGRepresentation, channels: Tuple[int, int], identifier: str):
        super().__init__(identifier)
        self._device = weakref.ref(tabor_device)

        self._configuration_guard_count = 0
        self._is_in_config_mode = False

        if channels not in ((1, 2), (3, 4)):
            raise ValueError('Invalid channel pair: {}'.format(channels))
        self._channels = channels

        self._idle_segment = TaborSegment.from_sampled(voltage_to_uint16(voltage=np.zeros(192),
                                                                         output_amplitude=0.5,
                                                                         output_offset=0., resolution=14),
                                                       voltage_to_uint16(voltage=np.zeros(192),
                                                                         output_amplitude=0.5,
                                                                         output_offset=0., resolution=14),
                                                       None, None)
        self._idle_sequence_table = [(1, 1, 0), (1, 1, 0), (1, 1, 0)]

        self._known_programs = dict()  # type: Dict[str, TaborProgramMemory]
        self._current_program = None

        self._segment_lengths = None
        self._segment_capacity = None
        self._segment_hashes = None
        self._segment_references = None

        self._sequencer_tables = None
        self._advanced_sequence_table = None

        self._internal_paranoia_level = 0

        self.clear()
Exemple #2
0
    def test_sampled_segments(self):
        def my_gen(gen):
            alternating_on_off = itertools.cycle((np.ones(192), np.zeros(192)))
            chan_gen = gen
            while True:
                for _ in range(2):
                    yield next(chan_gen)
                yield next(alternating_on_off)[::2]
                yield np.zeros(192)[::2]

        with self.assertRaisesRegex(ValueError, "non integer length"):
            root_loop = LoopTests.get_test_loop(
                WaveformGenerator(waveform_data_generator=my_gen(
                    self.waveform_data_generator),
                                  duration_generator=itertools.repeat(1 / 200),
                                  num_channels=4))

            TaborProgram(root_loop, self.instr_props, ('A', 'B'), (None, None),
                         **self.program_entry_kwargs)

        root_loop = LoopTests.get_test_loop(
            WaveformGenerator(waveform_data_generator=my_gen(
                self.waveform_data_generator),
                              duration_generator=itertools.repeat(1),
                              num_channels=4))

        prog = TaborProgram(root_loop, self.instr_props, ('A', 'B'),
                            (None, None), **self.program_entry_kwargs)

        sampled, sampled_length = prog.get_sampled_segments()

        self.assertEqual(len(sampled), 3)

        prog = TaborProgram(root_loop, self.instr_props, ('A', 'B'),
                            ('C', None), **self.program_entry_kwargs)
        sampled, sampled_length = prog.get_sampled_segments()
        self.assertEqual(len(sampled), 6)

        iteroe = my_gen(self.waveform_data_generator)
        for i, sampled_seg in enumerate(sampled):
            data = [next(iteroe) for _ in range(4)]
            data = (voltage_to_uint16(data[0], 1., 0., 14),
                    voltage_to_uint16(data[1], 1., 0., 14), data[2], data[3])
            if i % 2 == 0:
                np.testing.assert_equal(sampled_seg.marker_a,
                                        np.ones(192, dtype=np.uint16)[::2])
            else:
                np.testing.assert_equal(sampled_seg.marker_a,
                                        np.zeros(192, dtype=np.uint16)[::2])
            np.testing.assert_equal(sampled_seg.marker_b,
                                    np.zeros(192, dtype=np.uint16)[::2])

            np.testing.assert_equal(sampled_seg.ch_a, data[0])
            np.testing.assert_equal(sampled_seg.ch_b, data[1])
Exemple #3
0
    def _channel_data(self, waveform: Waveform, time: np.ndarray, channel_idx: int):
        if self._channels[channel_idx] is None:
            return np.full_like(time, 8192, dtype=np.uint16)

        else:
            return voltage_to_uint16(
                self._voltage_transformations[channel_idx](
                    waveform.get_sampled(channel=self._channels[channel_idx],
                                         sample_times=time)),
                self._amplitudes[channel_idx],
                self._offsets[channel_idx],
                resolution=14)
Exemple #4
0
    def test_voltage_to_uint16(self):

        with self.assertRaises(ValueError):
            voltage_to_uint16(np.zeros(0), 0, 0, 0)

        linspace_voltage = np.linspace(0, 1, 128)
        with self.assertRaises(ValueError):
            voltage_to_uint16(linspace_voltage, 0.9, 0, 1)

        with self.assertRaises(ValueError):
            voltage_to_uint16(linspace_voltage, 1.1, -1, 1)

        expected_data = np.arange(0, 128, dtype=np.uint16)
        received_data = voltage_to_uint16(linspace_voltage, 0.5, 0.5, 7)

        self.assertTrue(np.all(expected_data == received_data))
Exemple #5
0
def _make_binary_waveform(waveform: QuPulseWaveform, time_array: np.ndarray,
                          channel: Optional[ChannelID],
                          marker_1: Optional[ChannelID],
                          marker_2: Optional[ChannelID],
                          voltage_transformation: Callable,
                          voltage_to_uint16_kwargs: dict) -> tek_awg.Waveform:
    def sample_channel(ch_id: Optional[ChannelID]):
        if ch_id is None:
            return np.zeros_like(time_array)
        else:
            return waveform.get_sampled(channel=ch_id, sample_times=time_array)

    channel_volts, marker_1_data, marker_2_data = map(
        sample_channel, (channel, marker_1, marker_2))
    channel_volts = voltage_transformation(channel_volts)
    channel_data = voltage_to_uint16(channel_volts, **voltage_to_uint16_kwargs)

    return tek_awg.Waveform(channel=channel_data,
                            marker_1=marker_1_data,
                            marker_2=marker_2_data)
Exemple #6
0
 def test_zero_level_14bit(self):
     zero_level = voltage_to_uint16(np.zeros(1), 0.5, 0., 14)
     self.assertEqual(zero_level, 8192)
Exemple #7
0
    def test_sampled_segments(self):
        def my_gen(gen):
            alternating_on_off = itertools.cycle((np.ones(192), np.zeros(192)))
            chan_gen = gen
            while True:
                for _ in range(2):
                    yield next(chan_gen)
                yield next(alternating_on_off)[::2]
                yield np.zeros(192)[::2]

        sample_rate = 10**9
        with self.assertRaises(TaborException):
            root_loop = LoopTests.get_test_loop(
                WaveformGenerator(waveform_data_generator=my_gen(
                    self.waveform_data_generator),
                                  duration_generator=itertools.repeat(12),
                                  num_channels=4))

            mcp = MultiChannelProgram(InstructionBlock(), tuple())
            mcp.programs[frozenset(('A', 'B', 'C', 'D'))] = root_loop
            TaborProgram(root_loop, self.instr_props, ('A', 'B'),
                         (None, None)).sampled_segments(
                             8000, (1., 1.), (0, 0),
                             (lambda x: x, lambda x: x))

        root_loop = LoopTests.get_test_loop(
            WaveformGenerator(waveform_data_generator=my_gen(
                self.waveform_data_generator),
                              duration_generator=itertools.repeat(192),
                              num_channels=4))

        mcp = MultiChannelProgram(InstructionBlock(), tuple())
        mcp.programs[frozenset(('A', 'B', 'C', 'D'))] = root_loop

        prog = TaborProgram(root_loop, self.instr_props, ('A', 'B'),
                            (None, None))

        sampled, sampled_length = prog.sampled_segments(
            sample_rate, (1., 1.), (0, 0), (lambda x: x, lambda x: x))

        self.assertEqual(len(sampled), 3)

        prog = TaborProgram(root_loop, self.instr_props, ('A', 'B'),
                            ('C', None))
        sampled, sampled_length = prog.sampled_segments(
            sample_rate, (1., 1.), (0, 0), (lambda x: x, lambda x: x))
        self.assertEqual(len(sampled), 6)

        iteroe = my_gen(self.waveform_data_generator)
        for i, sampled_seg in enumerate(sampled):
            data = [next(iteroe) for _ in range(4)]
            data = (voltage_to_uint16(data[0], 1., 0., 14),
                    voltage_to_uint16(data[1], 1., 0., 14), data[2], data[3])
            if i % 2 == 0:
                np.testing.assert_equal(sampled_seg.marker_a,
                                        np.ones(192, dtype=np.uint16)[::2])
            else:
                np.testing.assert_equal(sampled_seg.marker_a,
                                        np.zeros(192, dtype=np.uint16)[::2])
            np.testing.assert_equal(sampled_seg.marker_b,
                                    np.zeros(192, dtype=np.uint16)[::2])

            np.testing.assert_equal(sampled_seg.ch_a, data[0])
            np.testing.assert_equal(sampled_seg.ch_b, data[1])