def initialise(self, program=True, qdr_cal=True): """ Set up the correlator using the information in the config file. :return: """ # set up the F, X, B and filter handlers self.fops = FEngineOperations(self) self.xops = XEngineOperations(self) # self.bops = BEngineOperations(self) self.filtops = FilterOperations(self) # set up the filter boards if we need to if 'filter' in self.configd: try: self.filtops.initialise(program=program) except Exception as e: raise e # connect to the other hosts that make up this correlator THREADED_FPGA_FUNC(self.fhosts + self.xhosts, timeout=5, target_function='connect') igmp_version = self.configd['FxCorrelator'].get('igmp_version') if igmp_version is not None: self.logger.info('Setting FPGA hosts IGMP version to ' '%s' % igmp_version) THREADED_FPGA_FUNC( self.fhosts + self.xhosts, timeout=5, target_function=( 'set_igmp_version', (igmp_version, ), {})) # if we need to program the FPGAs, do so if program: self.logger.info('Programming FPGA hosts') fpgautils.program_fpgas([(host, host.boffile) for host in (self.fhosts + self.xhosts)], progfile=None, timeout=15) else: self.logger.info('Loading design information') THREADED_FPGA_FUNC(self.fhosts + self.xhosts, timeout=7, target_function='get_system_information') # remove test hardware from designs utils.disable_test_gbes(self) utils.remove_test_objects(self) if program: # cal the qdr on all boards if qdr_cal: self.qdr_calibrate() else: self.logger.info('Skipping QDR cal - are you sure you' ' want to do this?') # init the engines self.fops.initialise() self.xops.initialise() # are there beamformers? if self.found_beamformer: bengops.beng_initialise(self) # for fpga_ in self.fhosts: # fpga_.tap_arp_reload() # for fpga_ in self.xhosts: # fpga_.tap_arp_reload() # subscribe all the engines to the multicast groups self.fops.subscribe_to_multicast() self.xops.subscribe_to_multicast() post_mess_delay = 10 self.logger.info('post mess-with-the-switch delay of ' '%is' % post_mess_delay) time.sleep(post_mess_delay) # force a reset on the f-engines self.fops.sys_reset(sleeptime=1) # reset all counters on fhosts and xhosts self.fops.clear_status_all() self.xops.clear_status_all() # check to see if the f engines are receiving all their data if not self.fops.check_rx(): raise RuntimeError('The f-engines RX have a problem.') # start f-engine TX self.logger.info('Starting f-engine datastream') self.fops.tx_enable() # check that the F-engines are transmitting data correctly if not self.fops.check_tx(): raise RuntimeError('The f-engines TX have a problem.') # check that the X-engines are receiving data if not self.xops.check_rx(): raise RuntimeError('The x-engines RX have a problem.') # arm the vaccs on the x-engines self.xops.vacc_sync() # reset all counters on fhosts and xhosts self.fops.clear_status_all() self.xops.clear_status_all() # set an initialised flag self._initialised = True
def initialise(self, program=True, qdr_cal=True, require_epoch=False): """ Set up the correlator using the information in the config file. :param program: program the FPGA boards if True :param qdr_cal: perform QDR cal if True :param require_epoch: the synch epoch MUST be set before init if True :return: """ # check that the instrument's synch epoch has been set if require_epoch: if self.get_synch_time() == -1: raise RuntimeError('System synch epoch has not been set prior' ' to initialisation!') # set up the F, X, B and filter handlers self.fops = FEngineOperations(self) self.xops = XEngineOperations(self) self.bops = BEngineOperations(self) self.filtops = FilterOperations(self) self.speadops = SpeadOperations(self) # set up the filter boards if we need to if 'filter' in self.configd: try: self.filtops.initialise(program=program) except Exception as e: raise e # connect to the other hosts that make up this correlator THREADED_FPGA_FUNC(self.fhosts + self.xhosts, timeout=5, target_function='connect') igmp_version = self.configd['FxCorrelator'].get('igmp_version') if igmp_version is not None: self.logger.info('Setting FPGA hosts IGMP version ' 'to %s' % igmp_version) THREADED_FPGA_FUNC( self.fhosts + self.xhosts, timeout=5, target_function=('set_igmp_version', (igmp_version, ), {})) # if we need to program the FPGAs, do so if program: self.logger.info('Programming FPGA hosts') fpgautils.program_fpgas([(host, host.boffile) for host in (self.fhosts + self.xhosts)], progfile=None, timeout=15) else: self.logger.info('Loading design information') THREADED_FPGA_FUNC(self.fhosts + self.xhosts, timeout=10, target_function='get_system_information') # remove test hardware from designs utils.disable_test_gbes(self) utils.remove_test_objects(self) # run configuration on the parts of the instrument self.configure() # run post-programming initialisation self._initialise(program, qdr_cal) # reset all counters on fhosts and xhosts self.fops.clear_status_all() self.xops.clear_status_all() # set an initialised flag self._initialised = True