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 processor_id: ID of the processor in the chip
:type processor_id: int
:param clock_speed: \
The number of CPU cycles per second of the processor
:type clock_speed: int
:param is_monitor: Determines if the processor is considered the\
monitor processor, and so should not be otherwise allocated
:type is_monitor: bool
:param dtcm_available: Data Tightly Coupled Memory available
:type dtcm_available: int
: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
:return: ID of the processor
:rtype: int
"""
return self._processor_id
@property
def dtcm_available(self):
""" The amount of DTCM available on this processor
:return: 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
:return: the number of CPU cycles available on this processor
:rtype: int
"""
return self._clock_speed // 1000
@property
def clock_speed(self):
""" The clock speed of the processor in cycles per second
:return: The clock speed 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.
:return: True if the processor is the monitor, False otherwise
:rtype: bool
"""
return self._is_monitor
def __str__(self):
return "[CPU: id={}, clock_speed={} MHz, monitor={}]".format(
self._processor_id, (self._clock_speed // 1000000),
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]