Source code for spinnman.utilities.appid_tracker
_MIN_APP_ID = 17
_MAX_APP_ID = 254
[docs]class AppIdTracker(object):
""" A tracker of AppId to make it easier to allocate new ids
"""
# Keep a class-global reference to the free id range, so ids are
# allocated globally
def __init__(
self, app_ids_in_use=None, min_app_id=_MIN_APP_ID,
max_app_id=_MAX_APP_ID):
"""
:param app_ids_in_use: The ids that are already in use
:type app_ids_in_use: list of int or None
:param min_app_id: The smallest app id to use
:type min_app_id: int
:param max_app_id: The largest app id to use
:type max_app_id: int
"""
self._free_ids = set(range(min_app_id, max_app_id))
if app_ids_in_use is not None:
self._free_ids.difference_update(app_ids_in_use)
self._min_app_id = min_app_id
self._max_app_id = max_app_id
[docs] def get_new_id(self):
""" Get a new unallocated id
:rtype: int
"""
return self._free_ids.pop()
[docs] def allocate_id(self, allocated_id):
""" Allocate a given id - raises KeyError if the id is not present
:param allocated_id: The id to allocate
"""
self._free_ids.remove(allocated_id)
[docs] def free_id(self, id_to_free):
""" Free a given id - raises KeyError if the id is out of range
:param id_to_free: The id to free
"""
if id_to_free < self._min_app_id or id_to_free > self._max_app_id:
raise KeyError("ID {} out of allowed range of {} to {}".format(
id_to_free, self._min_app_id, self._max_app_id))
self._free_ids.add(id_to_free)