Source code for spinn_front_end_common.interface.interface_functions.sdram_outgoing_partition_allocator

# Copyright (c) 2019 The University of Manchester
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from collections import defaultdict
from spinn_utilities.progress_bar import ProgressBar
from pacman.model.graphs.machine import SourceSegmentedSDRAMMachinePartition
from spinn_front_end_common.data import FecDataView
from spinn_front_end_common.utilities.exceptions import SpinnFrontEndException
from spinn_front_end_common.utilities.constants import SDRAM_EDGE_BASE_TAG


[docs]def sdram_outgoing_partition_allocator(): if FecDataView.has_transceiver(): transceiver = FecDataView.get_transceiver() virtual_usage = None else: # Ok if transceiver = None transceiver = None virtual_usage = defaultdict(int) progress_bar = ProgressBar( total_number_of_things_to_do=FecDataView.get_n_vertices(), string_describing_what_being_progressed=( "Allocating SDRAM for SDRAM outgoing egde partitions")) # Keep track of SDRAM tags used next_tag = defaultdict(lambda: SDRAM_EDGE_BASE_TAG) for vertex in FecDataView.iterate_vertices(): sdram_partitions = vertex.splitter.get_internal_sdram_partitions() for sdram_partition in sdram_partitions: # get placement, ones where the src is multiple, # you need to ask for the first pre vertex if isinstance( sdram_partition, SourceSegmentedSDRAMMachinePartition): placement = FecDataView.get_placement_of_vertex( next(iter(sdram_partition.pre_vertices))) else: placement = FecDataView.get_placement_of_vertex( sdram_partition.pre_vertex) # total sdram total_sdram = (sdram_partition.total_sdram_requirements()) # if bust, throw exception if total_sdram == 0: raise SpinnFrontEndException( "Cannot allocate SDRAM size of 0 for " f"partition {sdram_partition}") # allocate if transceiver is not None: tag = next_tag[placement.x, placement.y] next_tag[placement.x, placement.y] = tag + 1 sdram_base_address = transceiver.malloc_sdram( placement.x, placement.y, total_sdram, FecDataView.get_app_id(), tag) else: sdram_base_address = virtual_usage[ placement.x, placement.y] virtual_usage[placement.x, placement.y] += total_sdram # update sdram_partition.sdram_base_address = sdram_base_address progress_bar.update() progress_bar.end()