Source code for spinn_front_end_common.interface.interface_functions.locate_executable_start_type

# Copyright (c) 2017-2019 The University of Manchester
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

from spinn_utilities.progress_bar import ProgressBar
from spinn_machine import CoreSubsets
from pacman.model.graphs.machine import MachineVertex
from spinn_front_end_common.abstract_models import AbstractHasAssociatedBinary
from spinn_front_end_common.utilities.utility_objs import ExecutableType


[docs]class LocateExecutableStartType(object): def __call__( self, graph, placements, executable_finder, graph_mapper=None): if not graph.vertices: return [ExecutableType.NO_APPLICATION], {} binary_start_types = dict() binary_to_start_type = dict() progress = ProgressBar( graph.n_vertices, "Finding executable start types") for vertex in progress.over(graph.vertices): # try to locate binary type, but possible it doesn't have one placement_binary_start_type = None binary_name = None if isinstance(vertex, AbstractHasAssociatedBinary): placement_binary_start_type = vertex.get_binary_start_type() binary_name = vertex.get_binary_file_name() elif graph_mapper is not None: associated_vertex = ( graph_mapper.get_application_vertex(vertex)) if isinstance(associated_vertex, AbstractHasAssociatedBinary): placement_binary_start_type = \ associated_vertex.get_binary_start_type() binary_name = associated_vertex.get_binary_file_name() # check for vertices with no associated binary, if so, ignore if placement_binary_start_type is not None: # update core subset with location of the vertex on the machine if placement_binary_start_type not in binary_start_types: binary_start_types[placement_binary_start_type] = \ CoreSubsets() if isinstance(vertex, MachineVertex): self._add_vertex_to_subset( vertex, placements, binary_start_types[placement_binary_start_type]) elif graph_mapper is not None: machine_verts = graph_mapper.get_machine_vertices(vertex) for machine_vertex in machine_verts: self._add_vertex_to_subset( machine_vertex, placements, binary_start_types[placement_binary_start_type]) # add to the binary to start type map if binary_name is not None: binary_path = executable_finder.get_executable_path( binary_name) binary_to_start_type[binary_path] = ( placement_binary_start_type) # only got apps with no binary, such as external devices. # return no app if not binary_start_types: return [ExecutableType.NO_APPLICATION], {} return binary_start_types, binary_to_start_type @staticmethod def _add_vertex_to_subset(machine_vertex, placements, core_subsets): placement = placements.get_placement_of_vertex(machine_vertex) core_subsets.add_processor(x=placement.x, y=placement.y, processor_id=placement.p)