Source code for spynnaker.pyNN.models.neuron.key_space_tracker

# 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 pacman.utilities.algorithm_utilities import ElementAllocatorAlgorithm
from pacman.utilities.constants import FULL_MASK, BITS_IN_KEY


[docs]class KeySpaceTracker(ElementAllocatorAlgorithm): """ Tracks keys used to determine key overlap """ def __init__(self): super().__init__(0, FULL_MASK)
[docs] def allocate_keys(self, r_info): """ Allocate all the keys in the routing information NOTE assumes masks are all 1s followed by all 0s :param PartitionRoutingInfo r_info: The routing information to add """ for key_and_mask in r_info.keys_and_masks: key = key_and_mask.key mask = key_and_mask.mask n_keys = 2 ** self.count_trailing_0s(mask) self._allocate_elements(key, n_keys)
[docs] def is_allocated(self, key, n_keys): """ Determine if any of the keys in the mask are allocated NOTE assumes mask is all 1s followed by all 0s :param int key: The key at the start of the allocation :param int n_keys: The number of keys to check :rtype: bool """ index = self._find_slot(key) if index is None: return True space = self._check_allocation(index, key, n_keys) return space is None
[docs] @staticmethod def count_trailing_0s(mask): """ Count bitwise zeros at the LSB end of a number NOTE assumes a 32-bit number :param mask: The mask to be checked """ for i in range(BITS_IN_KEY): if mask & (1 << i): return i return 32