Source code for spinn_machine.processor

# Copyright (c) 2014 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 .exceptions import SpinnMachineInvalidParameterException

non_monitor = dict()
monitor = dict()


[docs]class Processor(object): """ A processor object included in a SpiNNaker chip. """ CLOCK_SPEED = 200 * 1000 * 1000 DTCM_AVAILABLE = 2 ** 16 __slots__ = ( "_processor_id", "_clock_speed", "_is_monitor", "_dtcm_available" ) def __init__(self, processor_id, clock_speed=CLOCK_SPEED, is_monitor=False, dtcm_available=DTCM_AVAILABLE): """ :param int processor_id: ID of the processor in the chip :param int clock_speed: The number of CPU cycles per second of the processor :param bool is_monitor: Determines if the processor is considered the monitor processor, and so should not be otherwise allocated :param int dtcm_available: Data Tightly Coupled Memory available :raise spinn_machine.exceptions.SpinnMachineInvalidParameterException: If the clock speed is negative """ if clock_speed < 0: raise SpinnMachineInvalidParameterException( "clock_speed", str(clock_speed), "Clock speed cannot be less than 0") self._processor_id = processor_id self._clock_speed = clock_speed self._is_monitor = is_monitor self._dtcm_available = dtcm_available @property def processor_id(self): """ The ID of the processor. :rtype: int """ return self._processor_id @property def dtcm_available(self): """ The amount of DTCM available on this processor. :rtype: int """ return self._dtcm_available @property def cpu_cycles_available(self): """ The number of CPU cycles available from this processor per ms. :rtype: int """ return self._clock_speed // 1000 @property def clock_speed(self): """ The clock speed of the processor in cycles per second. :rtype: int """ return self._clock_speed @property def is_monitor(self): """ Determines if the processor is the monitor, and therefore not to be allocated. .. warning:: Currently rejection processors are also marked as monitors. :rtype: bool """ return self._is_monitor def __str__(self): return ( f"[CPU: id={self._processor_id}, " f"clock_speed={self._clock_speed // 1000000} MHz, " f"monitor={self._is_monitor}]") def __repr__(self): return self.__str__()
[docs] @staticmethod def factory(processor_id, is_monitor=False): if is_monitor: if processor_id not in monitor: monitor[processor_id] = Processor( processor_id, is_monitor=is_monitor) return monitor[processor_id] else: if processor_id not in non_monitor: non_monitor[processor_id] = Processor( processor_id, is_monitor=is_monitor) return non_monitor[processor_id]