Source code for spinn_front_end_common.interface.interface_functions.chip_iobuf_extractor

from spinn_utilities.progress_bar import ProgressBar
from spinn_front_end_common.utilities.exceptions import ConfigurationException
import re
import os


ERROR_ENTRY = re.compile("\[ERROR\]\s+\((.*)\):\s+(.*)")
WARNING_ENTRY = re.compile("\[WARNING\]\s+\((.*)\):\s+(.*)")
ENTRY_FILE = 1
ENTRY_TEXT = 2


[docs]class ChipIOBufExtractor(object): """ Extract iobuf buffers from the machine, and separates lines based on\ their prefix """ __slots__ = [] def __call__( self, transceiver, has_ran, core_subsets, provenance_file_path): if not has_ran: raise ConfigurationException( "The simulation needs to have tried to run before asking for" "iobuf. Please fix and try again") return self._run_for_core_subsets( core_subsets, transceiver, provenance_file_path) def _run_for_core_subsets( self, core_subsets, transceiver, provenance_file_path): progress = ProgressBar( len(core_subsets), "Extracting IOBUF from the machine") error_entries = list() warn_entries = list() # extract iobuf io_buffers = list(transceiver.get_iobuf(core_subsets)) # write iobuf for iobuf in io_buffers: file_name = os.path.join( provenance_file_path, "iobuf_for_chip_{}_{}_processor_id_{}.txt".format( iobuf.x, iobuf.y, iobuf.p)) # set mode of the file based off if the file already exists mode = "w" if os.path.exists(file_name): mode = "a" # write iobuf to file. with open(file_name, mode) as writer: writer.write(iobuf.iobuf) # check iobuf for errors for io_buffer in progress.over(io_buffers): self._check_iobuf_for_error(io_buffer, error_entries, warn_entries) return error_entries, warn_entries def _check_iobuf_for_error(self, iobuf, error_entries, warn_entries): lines = iobuf.iobuf.split("\n") for line in lines: line = line.encode('ascii', 'ignore') self._add_value_if_match( ERROR_ENTRY, line, error_entries, iobuf.x, iobuf.y, iobuf.p) self._add_value_if_match( WARNING_ENTRY, line, warn_entries, iobuf.x, iobuf.y, iobuf.p) @staticmethod def _add_value_if_match(regex, line, entries, x, y, p): match = regex.match(line) if match: entries.append("{}, {}, {}: {} ({})".format( x, y, p, match.group(ENTRY_TEXT), match.group(ENTRY_FILE)))