Source code for data_specification.utility_calls

"""
utility calls for interpreting bits of the dsg
"""

from .constants import APP_PTR_TABLE_HEADER_BYTE_SIZE
from .data_specification_generator import DataSpecificationGenerator
from spinn_storage_handlers import FileDataWriter

import tempfile
import os
import threading

# used to stop file conflicts
_lock_condition = threading.Condition()


[docs]def get_region_base_address_offset(app_data_base_address, region): """ Find the address of the of a given region for the dsg :param app_data_base_address: base address for the core :param region: the region id we're looking for """ return (app_data_base_address + APP_PTR_TABLE_HEADER_BYTE_SIZE + (region * 4))
[docs]def get_data_spec_and_file_writer_filename( processor_chip_x, processor_chip_y, processor_id, hostname, report_directory, write_text_specs, application_run_time_report_folder): """ Encapsulates the creation of the dsg writer and the file paths :param processor_chip_x: x-coordinate of the chip :type processor_chip_x: int :param processor_chip_y: y-coordinate of the chip :type processor_chip_y: int :param processor_id: The processor ID :type processor_id: int :param hostname: The hostname of the spinnaker machine :type hostname: str :param report_directory: the directory for the reports folder :type report_directory: file path :param write_text_specs:\ True if a textual version of the specification should be written :type write_text_specs: bool :param application_run_time_report_folder:\ The folder to contain the resulting specification files :type application_run_time_report_folder: str :return: the filename of the data writer and the data specification object :rtype: str, data_specification.DataSpecificationGenerator """ binary_file_path = get_data_spec_file_path( processor_chip_x, processor_chip_y, processor_id, hostname, application_run_time_report_folder) data_writer = FileDataWriter(binary_file_path) # check if text reports are needed and if so initialise the report # writer to send down to dsg report_writer = None if write_text_specs: new_report_directory = os.path.join( report_directory, "data_spec_text_files") # uses locks to stop multiple instances of this writing the same # folder at the same time (os breaks down and throws exception # otherwise) _lock_condition.acquire() if not os.path.exists(new_report_directory): os.mkdir(new_report_directory) _lock_condition.release() file_name = "{}_dataSpec_{}_{}_{}.txt" \ .format(hostname, processor_chip_x, processor_chip_y, processor_id) report_file_path = os.path.join(new_report_directory, file_name) report_writer = FileDataWriter(report_file_path) # build the file writer for the spec spec = DataSpecificationGenerator(data_writer, report_writer) return data_writer.filename, spec
[docs]def get_data_spec_file_path(processor_chip_x, processor_chip_y, processor_id, hostname, application_run_time_folder): """ Gets the file path for storing the dsg data :param processor_chip_x: The x-coordinate of a chip :type processor_chip_x: int :param processor_chip_y: The y-coordinate of a chip :type processor_chip_y: int :param processor_id: The processor ID :type processor_id: int :param hostname: The hostname of the spinnaker machine :type hostname: str :return: the filename of the data writer and the data specification object :rtype: str, data_specification.DataSpecificationGenerator """ if application_run_time_folder == "TEMP": application_run_time_folder = tempfile.gettempdir() binary_file_path = ( application_run_time_folder + os.sep + "{}_dataSpec_{}_{}_{}.dat".format( hostname, processor_chip_x, processor_chip_y, processor_id)) return binary_file_path