def get_snap_ct(c, fpgas = [], offset = -1, setup_snap = True): """ Read and return data from the corner turner. Both pols are returned. """ if len(fpgas) == 0: fpgas = c.ffpgas if setup_snap: corr_functions.write_masked_register(fpgas, register_fengine_control, debug_snap_select = snap_fengine_debug_select['ct_64']) snap_data = snap.snapshots_get(fpgas = fpgas, dev_names = snap_debug, wait_period = 3, offset = offset) rd = [] for ctr in range(0, len(snap_data['data'])): d = snap_data['data'][ctr] repeater = construct.GreedyRepeater(snap_fengine_debug_ct) up = repeater.parse(d) fdata_p0 = [] fdata_p1 = [] for a in up: p0 = [] p1 = [] p0.append(bin2fp(a['p00_r'], 4, 3) + (1j * bin2fp(a['p00_i'], 4, 3))) p0.append(bin2fp(a['p01_r'], 4, 3) + (1j * bin2fp(a['p01_i'], 4, 3))) p0.append(bin2fp(a['p02_r'], 4, 3) + (1j * bin2fp(a['p02_i'], 4, 3))) p0.append(bin2fp(a['p03_r'], 4, 3) + (1j * bin2fp(a['p03_i'], 4, 3))) p1.append(bin2fp(a['p10_r'], 4, 3) + (1j * bin2fp(a['p10_i'], 4, 3))) p1.append(bin2fp(a['p11_r'], 4, 3) + (1j * bin2fp(a['p11_i'], 4, 3))) p1.append(bin2fp(a['p12_r'], 4, 3) + (1j * bin2fp(a['p12_i'], 4, 3))) p1.append(bin2fp(a['p13_r'], 4, 3) + (1j * bin2fp(a['p13_i'], 4, 3))) fdata_p0.extend(p0) fdata_p1.extend(p1) rd.append([fdata_p0, fdata_p1]) return rd
def get_snap_coarse_fft(c, fpgas=[], pol=0, setup_snap=True): """ Read and return data from the coarse FFT. Returns a list of the data from only that polarisation. """ if len(fpgas) == 0: fpgas = c.ffpgas if setup_snap: corr_functions.write_masked_register( fpgas, register_fengine_control, debug_snap_select=snap_fengine_debug_select['coarse_72']) corr_functions.write_masked_register(fpgas, register_fengine_coarse_control, debug_pol_select=pol, debug_specify_chan=0) snap_data = snap.snapshots_get(fpgas=fpgas, dev_names=snap_debug, wait_period=3) rd = [] for ctr in range(0, len(snap_data['data'])): d = snap_data['data'][ctr] repeater = construct.GreedyRepeater(snap_fengine_debug_coarse_fft) up = repeater.parse(d) coarsed = [] for a in up: for b in range(0, 2): num = bin2fp(a['d%i_r' % b], 18, 17) + (1j * bin2fp(a['d%i_i' % b], 18, 17)) coarsed.append(num) rd.append(coarsed) return rd
def get_snap_quant(c, fpgas=None, offset=-1, wbc_compat=False, debug_data=None, setup_snap=True): """ Read and return data from the quantiser snapshot. Both pols are returned. """ if fpgas == None: fpgas = c.ffpgas if setup_snap: c.syslogger.debug( 'get_snap_quant: setting debug snapblock to quantiser output.') corr_functions.write_masked_register( fpgas, register_fengine_control, debug_snap_select=snap_fengine_debug_select['quant_16']) data = [] for fpga in fpgas: tempdata = _fpga_snap_quant(fpga=fpga, offset=offset, wbc_compat=wbc_compat, debug_data=debug_data) data.append(tempdata) return data
def get_snap_fine_fft(c, fpgas=[], offset=-1, setup_snap=True): if len(fpgas) == 0: fpgas = c.ffpgas if setup_snap: corr_functions.write_masked_register( fpgas, register_fengine_control, debug_snap_select=snap_fengine_debug_select['fine_128']) snap_data = snap.snapshots_get(fpgas=fpgas, dev_names=snap_debug, wait_period=3, offset=offset) rd = [] for ctr in range(0, len(snap_data['data'])): d = snap_data['data'][ctr] repeater = construct.GreedyRepeater(snap_fengine_debug_fine_fft) up = repeater.parse(d) fdata_p0 = [] fdata_p1 = [] for a in up: p0c = bin2fp(a['p0_r'], fine_fft_bitwidth, 17) + (1j * bin2fp(a['p0_i'], fine_fft_bitwidth, 17)) p1c = bin2fp(a['p1_r'], fine_fft_bitwidth, 17) + (1j * bin2fp(a['p1_i'], fine_fft_bitwidth, 17)) fdata_p0.append(p0c) fdata_p1.append(p1c) rd.append([fdata_p0, fdata_p1]) return rd
def get_snap_feng_10gbe(c, fpgas=[], offset=-1, man_trigger=False, man_valid=False): if len(fpgas) == 0: fpgas = c.ffpgas corr_functions.write_masked_register( fpgas, register_fengine_control, debug_snap_select=snap_fengine_debug_select['gbetx0_128']) snap_data = snap.snapshots_get(fpgas=fpgas, dev_names=snap_debug, wait_period=3, offset=offset, man_trig=man_trigger, man_valid=man_valid, circular_capture=False) rd = [] for ctr in range(0, len(snap_data['data'])): d = snap_data['data'][ctr] repeater = construct.GreedyRepeater(snap_fengine_gbe_tx) up = repeater.parse(d) for a in up: a['link_down'] = not a['link_up'] a['hdr_valid'] = False a['mrst'] = False a['sync'] = False rd.append(up) return rd
def get_snap_coarse_channel(c, fpgas = [], pol = 0, channel = -1, setup_snap = True): """ Get data from a specific coarse channel - straight out of the FFT into the snap block, NOT via the buffer block. Returns a list of the data from only that polarisation. """ if channel == -1: raise RuntimeError('Cannot get data from unspecified channel.') if len(fpgas) == 0: fpgas = c.ffpgas if setup_snap: corr_functions.write_masked_register(fpgas, register_fengine_control, debug_snap_select = snap_fengine_debug_select['coarse_72']) corr_functions.write_masked_register(fpgas, register_fengine_coarse_control, debug_pol_select = pol, debug_specify_chan = 1, debug_chan = channel >> 1) snap_data = snap.snapshots_get(fpgas = fpgas, dev_names = snap_debug, wait_period = 3) rd = [] for ctr in range(0, len(snap_data['data'])): d = snap_data['data'][ctr] repeater = construct.GreedyRepeater(snap_fengine_debug_coarse_fft) up = repeater.parse(d) coarsed = [] for a in up: if channel & 1: num = bin2fp(a['d1_r'], 18, 17) + (1j * bin2fp(a['d1_i'], 18, 17)) else: num = bin2fp(a['d0_r'], 18, 17) + (1j * bin2fp(a['d0_i'], 18, 17)) coarsed.append(num) rd.append(coarsed) return rd
def DONE_get_fine_fft_snap(correlator): # interpret the ant_string (ffpga_n, xfpga_n, fxaui_n, xxaui_n, feng_input) = correlator.get_ant_str_location(ant_str) # select the data from the fine fft fpga = correlator.ffpgas[ffpga_n] corr_functions.write_masked_register([fpga], register_fengine_fine_control, snap_data_select=0, quant_snap_select=0) data = fpga.snapshot_get(dev_name=fine_snap_name, man_trig=False, man_valid=False, wait_period=3, offset=-1, circular_capture=False, get_extra_val=False) unpacked = list( struct.unpack('>%iI' % (len(data['data']) / 4), data['data'])) # re-arrange the data sensibly - for FFT data it's complex 16.15 fixed point signed data # make the actual complex numbers d = [] for ctr in range(0, len(unpacked)): num = unpacked[ctr] numR = numpy.int16(num >> 16) numI = numpy.int16(num & 0x0000ffff) d.append(numR + (1j * numI)) return d
def channel_select(c, freq_hz = -1, specific_chan = -1, selectchan = True): """ Set the coarse channel based on a given center frequency, given in Hz. """ if not c.is_narrowband(): raise RuntimeError('This command cannot be run in the current mode.') if freq_hz != -1 and specific_chan != -1: raise RuntimeError('Specify a frequency in Hz OR a specific coarse channel, not both.') elif freq_hz == -1 and specific_chan == -1: raise RuntimeError('Specify frequency in Hz or specific coarse channel.') channel_bw = c.config['bandwidth'] coarse_chans = c.config['coarse_chans'] if specific_chan != -1: chan = specific_chan freq_hz = chan * channel_bw else: total_bw = c.config['rf_bandwidth'] chan = int(round(freq_hz / total_bw * coarse_chans)) if chan >= coarse_chans: raise RuntimeError('Coarse channel too large: %i >= %i' % (chan, coarse_chans)) chan_cf = chan * channel_bw if selectchan: try: corr_functions.write_masked_register(c.ffpgas, register_fengine_coarse_control, channel_select = chan) c.config['center_freq'] = chan_cf c.config['current_coarse_chan'] = chan c.spead_narrowband_issue() except: errmsg = 'Something bad happened trying to write the coarse channel select register.' c.syslogger.error(errmsg) raise RuntimeError(errmsg) return chan_cf, chan, freq_hz - chan_cf
def DONE_get_ct_snap(correlator, offset=-1): corr_functions.write_masked_register(correlator.ffpgas, register_fengine_fine_control, quant_snap_select=2) raw = snap.snapshots_get(correlator.ffpgas, dev_names=fine_snap_name, man_trig=False, man_valid=False, wait_period=3, offset=offset, circular_capture=False) chan_values = [] for index, d in enumerate(raw['data']): up = list(struct.unpack('>%iI' % (len(d) / 4), d)) values = [[], []] for value in up: # two freq channel values for the same freq-channel, both pols # will have to use the offset to get multiple freq channels p00 = value >> 24 p10 = (value >> 16) & 0xff p01 = (value >> 8) & 0xff p11 = value & 0xff def extract8bit(v8): r = (v8 & ((2**8) - (2**4))) >> 4 i = (v8 & ((2**4) - (2**0))) return r + (1j * i) values[0].append(value >> 24) values[0].append((value >> 8) & 0xff) values[1].append((value >> 16) & 0xff) values[1].append(value & 0xff) chan_values.append({'fpga_index': index, 'data': values}) return chan_values
def fft_shift_fine_set_all(correlator, shift = -1): """ Set the per-stage shift for the fine channelisation FFT on all correlator f-engines. """ if shift < 0: shift = correlator.config['fft_shift_fine'] corr_functions.write_masked_register(correlator.ffpgas, register_fengine_fine_control, fft_shift = shift) correlator.syslogger.info('Set fine FFT shift patterns on all F-engines to 0x%x.' % shift)
def get_snap_xaui(c, fpgas = [], offset = -1, man_trigger = False, man_valid = False, wait_period = 3): """ Read the XAUI data out of the general debug snap block. """ if len(fpgas) == 0: fpgas = c.ffpgas corr_functions.write_masked_register(fpgas, register_fengine_control, debug_snap_select = snap_fengine_debug_select['xaui_128']) snap_data = snap.snapshots_get(fpgas = fpgas, dev_names = snap_debug, wait_period = wait_period, offset = offset, man_trig = man_trigger, man_valid = man_valid, circular_capture = False) return snap_data
def fft_shift_fine_set_all(correlator, shift=-1): """ Set the per-stage shift for the fine channelisation FFT on all correlator f-engines. """ if shift < 0: shift = correlator.config['fft_shift_fine'] corr_functions.write_masked_register(correlator.ffpgas, register_fengine_fine_control, fft_shift=shift) correlator.syslogger.info( 'Set fine FFT shift patterns on all F-engines to 0x%x.' % shift)
def get_snap_quant(c, fpgas = None, offset = -1, wbc_compat = False, debug_data = None, setup_snap = True): """ Read and return data from the quantiser snapshot. Both pols are returned. """ if fpgas == None: fpgas = c.ffpgas if setup_snap: c.syslogger.debug('get_snap_quant: setting debug snapblock to quantiser output.') corr_functions.write_masked_register(fpgas, register_fengine_control, debug_snap_select = snap_fengine_debug_select['quant_16']) data = [] for fpga in fpgas: tempdata = _fpga_snap_quant(fpga = fpga, offset = offset, wbc_compat = wbc_compat, debug_data = debug_data) data.append(tempdata) return data
def get_snap_feng_10gbe(c, fpgas = [], offset = -1, man_trigger = False, man_valid = False): if len(fpgas) == 0: fpgas = c.ffpgas corr_functions.write_masked_register(fpgas, register_fengine_control, debug_snap_select = snap_fengine_debug_select['gbetx0_128']) snap_data = snap.snapshots_get(fpgas = fpgas, dev_names = snap_debug, wait_period = 3, offset = offset, man_trig = man_trigger, man_valid = man_valid, circular_capture = False) rd = [] for ctr in range(0, len(snap_data['data'])): d = snap_data['data'][ctr] repeater = construct.GreedyRepeater(snap_fengine_gbe_tx) up = repeater.parse(d) for a in up: a['link_down'] = not a['link_up'] a['hdr_valid'] = False a['mrst'] = False a['sync'] = False rd.append(up) return rd
def DONE_get_fine_fft_snap(correlator): # interpret the ant_string (ffpga_n, xfpga_n, fxaui_n, xxaui_n, feng_input) = correlator.get_ant_str_location(ant_str) # select the data from the fine fft fpga = correlator.ffpgas[ffpga_n] corr_functions.write_masked_register([fpga], register_fengine_fine_control, snap_data_select = 0, quant_snap_select = 0) data = fpga.snapshot_get(dev_name = fine_snap_name, man_trig = False, man_valid = False, wait_period = 3, offset = -1, circular_capture = False, get_extra_val = False) unpacked = list(struct.unpack('>%iI' % (len(data['data']) / 4), data['data'])) # re-arrange the data sensibly - for FFT data it's complex 16.15 fixed point signed data # make the actual complex numbers d = [] for ctr in range(0, len(unpacked)): num = unpacked[ctr] numR = numpy.int16(num >> 16) numI = numpy.int16(num & 0x0000ffff) d.append(numR + (1j * numI)) return d
def get_snap_ct(c, fpgas=[], offset=-1, setup_snap=True): """ Read and return data from the corner turner. Both pols are returned. """ if len(fpgas) == 0: fpgas = c.ffpgas if setup_snap: corr_functions.write_masked_register( fpgas, register_fengine_control, debug_snap_select=snap_fengine_debug_select['ct_64']) snap_data = snap.snapshots_get(fpgas=fpgas, dev_names=snap_debug, wait_period=3, offset=offset) rd = [] for ctr in range(0, len(snap_data['data'])): d = snap_data['data'][ctr] repeater = construct.GreedyRepeater(snap_fengine_debug_ct) up = repeater.parse(d) fdata_p0 = [] fdata_p1 = [] for a in up: p0 = [] p1 = [] p0.append( bin2fp(a['p00_r'], 4, 3) + (1j * bin2fp(a['p00_i'], 4, 3))) p0.append( bin2fp(a['p01_r'], 4, 3) + (1j * bin2fp(a['p01_i'], 4, 3))) p0.append( bin2fp(a['p02_r'], 4, 3) + (1j * bin2fp(a['p02_i'], 4, 3))) p0.append( bin2fp(a['p03_r'], 4, 3) + (1j * bin2fp(a['p03_i'], 4, 3))) p1.append( bin2fp(a['p10_r'], 4, 3) + (1j * bin2fp(a['p10_i'], 4, 3))) p1.append( bin2fp(a['p11_r'], 4, 3) + (1j * bin2fp(a['p11_i'], 4, 3))) p1.append( bin2fp(a['p12_r'], 4, 3) + (1j * bin2fp(a['p12_i'], 4, 3))) p1.append( bin2fp(a['p13_r'], 4, 3) + (1j * bin2fp(a['p13_i'], 4, 3))) fdata_p0.extend(p0) fdata_p1.extend(p1) rd.append([fdata_p0, fdata_p1]) return rd
def get_snap_fine_fft(c, fpgas = [], offset = -1, setup_snap = True): if len(fpgas) == 0: fpgas = c.ffpgas if setup_snap: corr_functions.write_masked_register(fpgas, register_fengine_control, debug_snap_select = snap_fengine_debug_select['fine_128']) snap_data = snap.snapshots_get(fpgas = fpgas, dev_names = snap_debug, wait_period = 3, offset = offset) rd = [] for ctr in range(0, len(snap_data['data'])): d = snap_data['data'][ctr] repeater = construct.GreedyRepeater(snap_fengine_debug_fine_fft) up = repeater.parse(d) fdata_p0 = [] fdata_p1 = [] for a in up: p0c = bin2fp(a['p0_r'], fine_fft_bitwidth, 17) + (1j * bin2fp(a['p0_i'], fine_fft_bitwidth, 17)) p1c = bin2fp(a['p1_r'], fine_fft_bitwidth, 17) + (1j * bin2fp(a['p1_i'], fine_fft_bitwidth, 17)) fdata_p0.append(p0c) fdata_p1.append(p1c) rd.append([fdata_p0, fdata_p1]) return rd
def get_snap_buffer_pfb(c, fpgas=[], pol=0, setup_snap=True, pfb=False): '''This DOESN'T EXIST in regular F-engines. Only in specific debug versions. ''' if len(fpgas) == 0: fpgas = c.ffpgas if setup_snap: if pfb: corr_functions.write_masked_register( fpgas, register_fengine_control, debug_snap_select=snap_fengine_debug_select['pfb_72']) else: corr_functions.write_masked_register( fpgas, register_fengine_control, debug_snap_select=snap_fengine_debug_select['buffer_72']) corr_functions.write_masked_register(fpgas, register_fengine_coarse_control, debug_pol_select=pol) snap_data = snap.snapshots_get(fpgas=fpgas, dev_names=snap_debug, wait_period=3) rd = [] for ctr in range(0, len(snap_data['data'])): d = snap_data['data'][ctr] repeater = construct.GreedyRepeater(snap_fengine_debug_coarse_fft) up = repeater.parse(d) coarsed = [] for a in up: num = bin2fp(a['d%i_r' % pol], 18, 17) + (1j * bin2fp(a['d%i_i' % pol], 18, 17)) coarsed.append(num) rd.append(coarsed) return rd
def get_snap_coarse_channel(c, fpgas=[], pol=0, channel=-1, setup_snap=True): """ Get data from a specific coarse channel - straight out of the FFT into the snap block, NOT via the buffer block. Returns a list of the data from only that polarisation. """ if channel == -1: raise RuntimeError('Cannot get data from unspecified channel.') if len(fpgas) == 0: fpgas = c.ffpgas if setup_snap: corr_functions.write_masked_register( fpgas, register_fengine_control, debug_snap_select=snap_fengine_debug_select['coarse_72']) corr_functions.write_masked_register(fpgas, register_fengine_coarse_control, debug_pol_select=pol, debug_specify_chan=1, debug_chan=channel >> 1) snap_data = snap.snapshots_get(fpgas=fpgas, dev_names=snap_debug, wait_period=3) rd = [] for ctr in range(0, len(snap_data['data'])): d = snap_data['data'][ctr] repeater = construct.GreedyRepeater(snap_fengine_debug_coarse_fft) up = repeater.parse(d) coarsed = [] for a in up: if channel & 1: num = bin2fp(a['d1_r'], 18, 17) + (1j * bin2fp(a['d1_i'], 18, 17)) else: num = bin2fp(a['d0_r'], 18, 17) + (1j * bin2fp(a['d0_i'], 18, 17)) coarsed.append(num) rd.append(coarsed) return rd
def get_snap_coarse_fft(c, fpgas = [], pol = 0, setup_snap = True): """ Read and return data from the coarse FFT. Returns a list of the data from only that polarisation. """ if len(fpgas) == 0: fpgas = c.ffpgas if setup_snap: corr_functions.write_masked_register(fpgas, register_fengine_control, debug_snap_select = snap_fengine_debug_select['coarse_72']) corr_functions.write_masked_register(fpgas, register_fengine_coarse_control, debug_pol_select = pol, debug_specify_chan = 0) snap_data = snap.snapshots_get(fpgas = fpgas, dev_names = snap_debug, wait_period = 3) rd = [] for ctr in range(0, len(snap_data['data'])): d = snap_data['data'][ctr] repeater = construct.GreedyRepeater(snap_fengine_debug_coarse_fft) up = repeater.parse(d) coarsed = [] for a in up: for b in range(0,2): num = bin2fp(a['d%i_r'%b], 18, 17) + (1j * bin2fp(a['d%i_i'%b], 18, 17)) coarsed.append(num) rd.append(coarsed) return rd
def get_snap_xaui(c, fpgas=[], offset=-1, man_trigger=False, man_valid=False, wait_period=3): """ Read the XAUI data out of the general debug snap block. """ if len(fpgas) == 0: fpgas = c.ffpgas corr_functions.write_masked_register( fpgas, register_fengine_control, debug_snap_select=snap_fengine_debug_select['xaui_128']) snap_data = snap.snapshots_get(fpgas=fpgas, dev_names=snap_debug, wait_period=wait_period, offset=offset, man_trig=man_trigger, man_valid=man_valid, circular_capture=False) return snap_data
def channel_select(c, freq_hz=-1, specific_chan=-1, selectchan=True): """ Set the coarse channel based on a given center frequency, given in Hz. """ if not c.is_narrowband(): raise RuntimeError('This command cannot be run in the current mode.') if freq_hz != -1 and specific_chan != -1: raise RuntimeError( 'Specify a frequency in Hz OR a specific coarse channel, not both.' ) elif freq_hz == -1 and specific_chan == -1: raise RuntimeError( 'Specify frequency in Hz or specific coarse channel.') channel_bw = c.config['bandwidth'] coarse_chans = c.config['coarse_chans'] if specific_chan != -1: chan = specific_chan freq_hz = chan * channel_bw else: total_bw = c.config['rf_bandwidth'] chan = int(round(freq_hz / total_bw * coarse_chans)) if chan >= coarse_chans: raise RuntimeError('Coarse channel too large: %i >= %i' % (chan, coarse_chans)) chan_cf = chan * channel_bw if selectchan: try: corr_functions.write_masked_register( c.ffpgas, register_fengine_coarse_control, channel_select=chan) c.config['center_freq'] = chan_cf c.config['current_coarse_chan'] = chan c.spead_narrowband_issue() except: errmsg = 'Something bad happened trying to write the coarse channel select register.' c.syslogger.error(errmsg) raise RuntimeError(errmsg) return chan_cf, chan, freq_hz - chan_cf
def DONE_get_ct_snap(correlator, offset = -1): corr_functions.write_masked_register(correlator.ffpgas, register_fengine_fine_control, quant_snap_select = 2) raw = snap.snapshots_get(correlator.ffpgas, dev_names = fine_snap_name, man_trig = False, man_valid = False, wait_period = 3, offset = offset, circular_capture = False) chan_values = [] for index, d in enumerate(raw['data']): up = list(struct.unpack('>%iI' % (len(d) / 4), d)) values = [[], []] for value in up: # two freq channel values for the same freq-channel, both pols # will have to use the offset to get multiple freq channels p00 = value >> 24 p10 = (value >> 16) & 0xff p01 = (value >> 8) & 0xff p11 = value & 0xff def extract8bit(v8): r = (v8 & ((2**8) - (2**4))) >> 4 i = (v8 & ((2**4) - (2**0))) return r + (1j * i) values[0].append(value >> 24) values[0].append((value >> 8) & 0xff) values[1].append((value >> 16) & 0xff) values[1].append(value & 0xff) chan_values.append({'fpga_index': index, 'data': values}) return chan_values
def get_snap_buffer_pfb(c, fpgas = [], pol = 0, setup_snap = True, pfb = False): '''This DOESN'T EXIST in regular F-engines. Only in specific debug versions. ''' if len(fpgas) == 0: fpgas = c.ffpgas if setup_snap: if pfb: corr_functions.write_masked_register(fpgas, register_fengine_control, debug_snap_select = snap_fengine_debug_select['pfb_72']) else: corr_functions.write_masked_register(fpgas, register_fengine_control, debug_snap_select = snap_fengine_debug_select['buffer_72']) corr_functions.write_masked_register(fpgas, register_fengine_coarse_control, debug_pol_select = pol) snap_data = snap.snapshots_get(fpgas = fpgas, dev_names = snap_debug, wait_period = 3) rd = [] for ctr in range(0, len(snap_data['data'])): d = snap_data['data'][ctr] repeater = construct.GreedyRepeater(snap_fengine_debug_coarse_fft) up = repeater.parse(d) coarsed = [] for a in up: num = bin2fp(a['d%i_r'%pol], 18, 17) + (1j * bin2fp(a['d%i_i'%pol], 18, 17)) coarsed.append(num) rd.append(coarsed) return rd