diff --git a/tools/oneclick/prestudy/YAML/py_mm_lib/__init__.py b/tools/oneclick/prestudy/YAML/py_mm_lib/__init__.py index dd3198e65bcc892ec7981b2f6bd8d5a8e846953a..57077e7a7b946f626e75ecd897b86c513737f04f 100644 --- a/tools/oneclick/prestudy/YAML/py_mm_lib/__init__.py +++ b/tools/oneclick/prestudy/YAML/py_mm_lib/__init__.py @@ -18,3 +18,4 @@ from peripheral import PeripheralLibrary, Peripheral from system import System from documentation import Documentation from rom_system import RomSystem +from peripheral_lib import * diff --git a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral.py b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral.py index 36c8568826a322abcfb50b343c61d97c8543c102..dbdde7624268f51a9c780573a19ba0fc758d03af 100755 --- a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral.py +++ b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral.py @@ -32,360 +32,13 @@ from copy import deepcopy from math import ceil import logging import yaml -from constants import * +#from constants import * from common import c_word_w, c_nof_complex, ceil_pow2, ceil_log2 +from peripheral_lib import * logger = logging.getLogger('main.peripheral') -class BaseObject(object): - def __init__(self): - self.success = True - self._name = "" - self._prefix = "" - self._args = {} - - def update_args(self, args): - """ update self._args with all kv pairs in args """ - self._args.update(args) - - def _as_str(self, key, default=None): - """ look in settings for key, if available return value as string, - if key not available retur default """ - try: - val = str(self._args[key]) - return val - except KeyError: - return default - - def _as_int(self, key, default=None): - """ look in settings for key, if available return value as int if possible - otherwise return string, if key not available retur default """ - try: - val = int(self._args[key]) - return val - except ValueError: - return self._args[key] - except KeyError: - return default - - def set_kv(self, key, val): - """ set_kv() - if key in valid keys, update key with given value, if key not excists add it. - """ - if val is not None: - self._args[key] = val - return True - return False - - def get_kv(self, key, dtype=None): - """ get_kv() - return value for given key, if key in valid keys, else return None - """ - if key not in self._args: - logger.error("key not in arguments %s", key) - return None - if dtype == 'int': - return self._as_int(key) - if dtype == 'string': - return self._as_str(key) - return self._args[key] - - def name(self, val=None): - """ set/get name """ - if val is not None: - self._name = val - return - return self._name - - def prefix(self, val=None): - """ set/get prefix """ - if val is not None: - self._prefix = val - return - return self._prefix - - -class Field(BaseObject): - """ A field defines data at certain address or an array of addresses - """ - def __init__(self, name, settings=None): - super().__init__() - self.name(name) - self._valid_keys = ['number_of_fields', 'width', 'bit_offset', 'access_mode', 'side_effect', 'address_offset', - 'address_length', 'reset_value', 'software_value', 'radix', 'field_description'] - - self._args.update({'number_of_fields' : DEFAULT_NUMBER_OF_FIELDS, - 'width' : DEFAULT_WIDTH, - 'bit_offset' : DEFAULT_BIT_OFFSET, - 'access_mode' : DEFAULT_ACCESS_MODE, - 'side_effect' : DEFAULT_SIDE_EFFECT, - 'address_offset' : DEFAULT_ADDRESS_OFFSET, - 'address_length' : DEFAULT_ADDRESS_LENGTH, - 'reset_value' : RESET_VALUE, - 'software_value' : DEFAULT_SOFTWARE_VALUE, - 'radix' : DEFAULT_RADIX, - 'field_description': DEFAULT_DESCRIPTION}) - - if settings is not None: - for key, val in settings.items(): - if key in self._valid_keys: - if key == 'access_mode' and val.upper() not in VALID_ACCESS_MODES: - logger.error("Field.__init__(), Not a valid acces_mode '%s'", val) - self.success = False - elif key == 'side_effect' and val.upper() not in VALID_SIDE_EFFECTS: - logger.error("Field.__init__(), Not a valid side_effect '%s'", val) - self.success = False - else: - self.set_kv(key, val) - else: - logger.error("Field.__init__(), Not a valid key '%s'", key) - self.success = False - - def number_of_fields(self, val=None): - """ set/get number of fields """ - if val is not None: - self.set_kv('number_of_fields', val) - return - return self._as_int('number_of_fields') - - def width(self, val=None): - """ set/get width of field - val: if not None set width of field - return: actual width of field """ - if val is not None: - return self.set_kv('width', val) - return self._as_int('width') - - def bit_offset(self, val=None): - """ set/get bit_offset of field - val: if not None set bit_offset of field - return: actual bit_offset of field """ - if val is not None: - return self.set_kv('bit_offset', val) - return self._as_int('bit_offset') - - def access_mode(self, val=None): - """ set/get access_mode of field - val: if not None and a valid mode set access_mode of field - return: actual access_mode of field """ - if val is not None: - if val.upper() in VALID_ACCESS_MODES: - return self.set_kv('access_mode', val.upper()) - else: - logger.error("unknown access_mode '%s'", val) - self.success = False - return False - return self._as_str('access_mode').upper() - - def side_effect(self, val=None): - """ set/get side_effect of field - val: if not None and a valid side_effect set side_effect of field - return: actual side_effect of field """ - if val is not None: - if val.upper() in VALID_SIDE_EFFECTS: - return self.set_kv('side_effect', val.upper()) - else: - logger.error("unknown side_effect '%s'", val) - self.success = False - return False - return self._as_str('side_effect').upper() - - def address_offset(self, val=None): - """ set/get address offset of field - val: if not None set address offset of field - return: actual address offset of field """ - if val is not None: - return self.set_kv('address_offset', val) - return self._as_int('address_offset') - - def address_length(self, val=None): - """ set/get address length of field - val: if not None set address length of field - return: active address_length of field """ - if val is not None: - return self.set_kv('address_length', val) - return self._as_int('address_length') - - def reset_value(self, val=None): - """ set/get default hardware reset value of field - val: if not None set default value of field - return: active hardware reset value of field """ - if val is not None: - return self.set_kv('reset_value', val) - return self._as_int('reset_value') - - def software_value(self, val=None): - """ set/get software reset value of field - val: if not None set default value of field - return: active software reset value of field """ - if val is not None: - return self.set_kv('software_value', val) - return self._as_int('software_value') - - def radix(self, val=None): - """ set/get radix value of field - val: if not None set default value of field - return: active radix value of field """ - if val is not None: - if val.upper() in VALID_RADIXS: - return self.set_kv('radix', val.upper()) - else: - logger.error("unknown radix '%s'", val) - self.success = False - return False - return self._as_int('radix') - - def field_description(self, val=None): - """ set/get description of field - val: if not None set description of field - return: description of field """ - if val is not None: - return self.set_kv('field_description', val) - return self._as_str('field_discription') - - -class Register(BaseObject): - """ A register consists of Fields - """ - def __init__(self, name, fields=None, settings=None): - super().__init__() - self.name(name) - - self.fields = {} if fields is None else fields - - self._valid_keys = ['number_of_slaves', 'address_length', 'slave_discription'] - - self._args.update({'number_of_slaves' : DEFAULT_NUMBER_OF_SLAVES, - 'address_length' : DEFAULT_ADDRESS_LENGTH, - 'slave_discription': DEFAULT_DESCRIPTION}) - - self.update_address_length() - - def number_of_slaves(self, val=None): - """ set/get number of slaves """ - if val is not None: - self.set_kv('number_of_slaves', val) - return - return self._as_int('number_of_slaves') - - def add_field(self, name, settings): - """ add new Field to Register with given settings - """ - field = Field(name, settings) - if field.success: - self.fields[name] = field - self.update_address_length() - return True - return False - - def update_address_length(self): - """ update total address_length of Register - """ - if len(self.fields) == 0: - return - n_words = 0 - for field in self.fields.values(): - n_words += int(ceil(float(field.width()) / c_word_w)) - - self.set_kv('address_length', n_words) # ceil_pow2(n_words)) - - def address_length(self, val=None): - """ set/get address_length of register - val: if not None set address_length of register - return: address_length of register """ - if val is not None: - return self.set_kv('address_length', val) - return self._as_int('address_length', default=1) - - -class RAM(BaseObject): - """ A RAM is a Field that is repeated address_length times - """ - def __init__(self, name, fields=None, settings=None): - super().__init__() - self.name(name) - - self.fields = {} if fields is None else fields - - self._valid_keys = ['number_of_slaves'] - self._args.update({'number_of_slaves' : DEFAULT_NUMBER_OF_SLAVES}) - - def number_of_slaves(self, val=None): - """ set/get number of slaves """ - if val is not None: - self.set_kv('number_of_slaves', val) - return - return self._as_int('number_of_slaves') - - def add_field(self, name, settings): - """ add new Field to Register with given settings - """ - field = Field(name, settings) - if field.success: - self.fields[name] = Field(name, settings) - self.update_address_length() - return True - return False - - def update_address_length(self): - """ update total address_length of Register - """ - if len(self.fields) == 0: - return - n_words = 0 - for field in self.fields.values(): - n_words += int(ceil(float(field.width()) / c_word_w)) - - self.set_kv('address_length', n_words) # ceil_pow2(n_words)) - -# TODO: use BaseObject -class FIFO(object): - """ A FIFO is a specific set of Fields - """ - def __init__(self, name, settings): - self.number_offifos = 1 - fifo_fields = {} - fifo_fields["fifo_status"] = Field(name="fifo_status", - settings={ - 'width': 4, - 'mode': "RO", - 'offset': 0x0, - 'default': 0, - 'descr': "fifo status register. Bit 0: Fifo Full Bit 1: Fifo Empty" - }) - - fifo_fields["fifo_used_w"] = Field(name="fifo_used_w", - settings={ - 'width': 32, - 'mode': "RO", - 'offset': 0x4, - 'default': 0, - 'descr': "fifo used words register." - }) - - fifo_fields["fifo_read_reg"] = Field(name="fifo_read_reg", - settings={ - 'width': settings['width'], - 'mode': "RO", - 'offset': 0x8, - 'default': 0, - 'descr': "fifo read register." - }) - - fifo_fields["fifo_write_reg"] = Field(name="fifo_write_reg", - settings={ - 'width': settings['width'], - 'mode': "WO", - 'offset': 0xC, - 'default': 0, - 'descr': "fifo write register." - }) - - self.register = Register("FIFO Register", fifo_fields) - self.address_length = settings['address_length'] - - class Peripheral(BaseObject): """ A Peripheral consists of 1 or more MM slaves. The slave can be a Register, RAM or FIFO. diff --git a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/__init__.py b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..ea24ebc29d820884e67c5eaf2bea3568332257e9 --- /dev/null +++ b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/__init__.py @@ -0,0 +1,14 @@ +import os +import sys + +cwd = __file__[:__file__.rfind('/')] +print(cwd) + +sys.path.append(cwd) + +from constants import * +from base_object import BaseObject +from field import Field +from register import Register +from ram import RAM +from fifo import FIFO diff --git a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/base_object.py b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/base_object.py new file mode 100644 index 0000000000000000000000000000000000000000..b51708d570b39a00fe7b9beb123f58d15d557b33 --- /dev/null +++ b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/base_object.py @@ -0,0 +1,95 @@ +############################################################################### +# +# Copyright (C) 2016 +# ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# 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/>. +# +# Author Date +# HJ jan 2017 Original +# EK feb 2017 +# PD feb 2017 +# +############################################################################### +import logging + +logger = logging.getLogger('main.peripheral') + +class BaseObject(object): + def __init__(self): + self.success = True + self._name = "" + self._prefix = "" + self._args = {} + + def update_args(self, args): + """ update self._args with all kv pairs in args """ + self._args.update(args) + + def _as_str(self, key, default=None): + """ look in settings for key, if available return value as string, + if key not available retur default """ + try: + val = str(self._args[key]) + return val + except KeyError: + return default + + def _as_int(self, key, default=None): + """ look in settings for key, if available return value as int if possible + otherwise return string, if key not available retur default """ + try: + val = int(self._args[key]) + return val + except ValueError: + return self._args[key] + except KeyError: + return default + + def set_kv(self, key, val): + """ set_kv() + if key in valid keys, update key with given value, if key not excists add it. + """ + if val is not None: + self._args[key] = val + return True + return False + + def get_kv(self, key, dtype=None): + """ get_kv() + return value for given key, if key in valid keys, else return None + """ + if key not in self._args: + logger.error("key not in arguments %s", key) + return None + if dtype == 'int': + return self._as_int(key) + if dtype == 'string': + return self._as_str(key) + return self._args[key] + + def name(self, val=None): + """ set/get name """ + if val is not None: + self._name = val + return + return self._name + + def prefix(self, val=None): + """ set/get prefix """ + if val is not None: + self._prefix = val + return + return self._prefix diff --git a/tools/oneclick/prestudy/YAML/py_mm_lib/constants.py b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/constants.py similarity index 100% rename from tools/oneclick/prestudy/YAML/py_mm_lib/constants.py rename to tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/constants.py diff --git a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/field.py b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/field.py new file mode 100644 index 0000000000000000000000000000000000000000..35291a0a0a56f040174dec32f47e70f33369b914 --- /dev/null +++ b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/field.py @@ -0,0 +1,171 @@ +############################################################################### +# +# Copyright (C) 2016 +# ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# 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/>. +# +# Author Date +# HJ jan 2017 Original +# EK feb 2017 +# PD feb 2017 +# +############################################################################### + +import logging +from constants import * +from common import c_word_w, c_nof_complex, ceil_pow2, ceil_log2 +from base_object import BaseObject + +logger = logging.getLogger('main.perip.field') + + +class Field(BaseObject): + """ A field defines data at certain address or an array of addresses + """ + def __init__(self, name, settings=None): + super().__init__() + self.name(name) + self._valid_keys = ['number_of_fields', 'width', 'bit_offset', 'access_mode', 'side_effect', 'address_offset', + 'address_length', 'reset_value', 'software_value', 'radix', 'field_description'] + + self._args.update({'number_of_fields' : DEFAULT_NUMBER_OF_FIELDS, + 'width' : DEFAULT_WIDTH, + 'bit_offset' : DEFAULT_BIT_OFFSET, + 'access_mode' : DEFAULT_ACCESS_MODE, + 'side_effect' : DEFAULT_SIDE_EFFECT, + 'address_offset' : DEFAULT_ADDRESS_OFFSET, + 'address_length' : DEFAULT_ADDRESS_LENGTH, + 'reset_value' : RESET_VALUE, + 'software_value' : DEFAULT_SOFTWARE_VALUE, + 'radix' : DEFAULT_RADIX, + 'field_description': DEFAULT_DESCRIPTION}) + + if settings is not None: + for key, val in settings.items(): + if key in self._valid_keys: + if key == 'access_mode' and val.upper() not in VALID_ACCESS_MODES: + logger.error("Field.__init__(), Not a valid acces_mode '%s'", val) + self.success = False + elif key == 'side_effect' and val.upper() not in VALID_SIDE_EFFECTS: + logger.error("Field.__init__(), Not a valid side_effect '%s'", val) + self.success = False + else: + self.set_kv(key, val) + else: + logger.error("Field.__init__(), Not a valid key '%s'", key) + self.success = False + + def number_of_fields(self, val=None): + """ set/get number of fields """ + if val is not None: + self.set_kv('number_of_fields', val) + return + return self._as_int('number_of_fields') + + def width(self, val=None): + """ set/get width of field + val: if not None set width of field + return: actual width of field """ + if val is not None: + return self.set_kv('width', val) + return self._as_int('width') + + def bit_offset(self, val=None): + """ set/get bit_offset of field + val: if not None set bit_offset of field + return: actual bit_offset of field """ + if val is not None: + return self.set_kv('bit_offset', val) + return self._as_int('bit_offset') + + def access_mode(self, val=None): + """ set/get access_mode of field + val: if not None and a valid mode set access_mode of field + return: actual access_mode of field """ + if val is not None: + if val.upper() in VALID_ACCESS_MODES: + return self.set_kv('access_mode', val.upper()) + else: + logger.error("unknown access_mode '%s'", val) + self.success = False + return False + return self._as_str('access_mode').upper() + + def side_effect(self, val=None): + """ set/get side_effect of field + val: if not None and a valid side_effect set side_effect of field + return: actual side_effect of field """ + if val is not None: + if val.upper() in VALID_SIDE_EFFECTS: + return self.set_kv('side_effect', val.upper()) + else: + logger.error("unknown side_effect '%s'", val) + self.success = False + return False + return self._as_str('side_effect').upper() + + def address_offset(self, val=None): + """ set/get address offset of field + val: if not None set address offset of field + return: actual address offset of field """ + if val is not None: + return self.set_kv('address_offset', val) + return self._as_int('address_offset') + + def address_length(self, val=None): + """ set/get address length of field + val: if not None set address length of field + return: active address_length of field """ + if val is not None: + return self.set_kv('address_length', val) + return self._as_int('address_length') + + def reset_value(self, val=None): + """ set/get default hardware reset value of field + val: if not None set default value of field + return: active hardware reset value of field """ + if val is not None: + return self.set_kv('reset_value', val) + return self._as_int('reset_value') + + def software_value(self, val=None): + """ set/get software reset value of field + val: if not None set default value of field + return: active software reset value of field """ + if val is not None: + return self.set_kv('software_value', val) + return self._as_int('software_value') + + def radix(self, val=None): + """ set/get radix value of field + val: if not None set default value of field + return: active radix value of field """ + if val is not None: + if val.upper() in VALID_RADIXS: + return self.set_kv('radix', val.upper()) + else: + logger.error("unknown radix '%s'", val) + self.success = False + return False + return self._as_int('radix') + + def field_description(self, val=None): + """ set/get description of field + val: if not None set description of field + return: description of field """ + if val is not None: + return self.set_kv('field_description', val) + return self._as_str('field_discription') \ No newline at end of file diff --git a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/fifo.py b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/fifo.py new file mode 100644 index 0000000000000000000000000000000000000000..05366354d21cbe763d40bd36a006b13cee1d9728 --- /dev/null +++ b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/fifo.py @@ -0,0 +1,81 @@ +############################################################################### +# +# Copyright (C) 2016 +# ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# 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/>. +# +# Author Date +# HJ jan 2017 Original +# EK feb 2017 +# PD feb 2017 +# +############################################################################### + +from math import ceil +import logging +from constants import * +from common import c_word_w, c_nof_complex, ceil_pow2, ceil_log2 +from base_object import BaseObject +from field import Field +from register import Register + +logger = logging.getLogger('main.perip.fifo') + +# TODO: use BaseObject +class FIFO(object): + """ A FIFO is a specific set of Fields + """ + def __init__(self, name, settings): + self.number_offifos = 1 + fifo_fields = {} + fifo_fields["fifo_status"] = Field(name="fifo_status", + settings={ + 'width': 4, + 'mode': "RO", + 'offset': 0x0, + 'default': 0, + 'descr': "fifo status register. Bit 0: Fifo Full Bit 1: Fifo Empty" + }) + + fifo_fields["fifo_used_w"] = Field(name="fifo_used_w", + settings={ + 'width': 32, + 'mode': "RO", + 'offset': 0x4, + 'default': 0, + 'descr': "fifo used words register." + }) + + fifo_fields["fifo_read_reg"] = Field(name="fifo_read_reg", + settings={ + 'width': settings['width'], + 'mode': "RO", + 'offset': 0x8, + 'default': 0, + 'descr': "fifo read register." + }) + + fifo_fields["fifo_write_reg"] = Field(name="fifo_write_reg", + settings={ + 'width': settings['width'], + 'mode': "WO", + 'offset': 0xC, + 'default': 0, + 'descr': "fifo write register." + }) + + self.register = Register("FIFO Register", fifo_fields) + self.address_length = settings['address_length'] diff --git a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/ram.py b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/ram.py new file mode 100644 index 0000000000000000000000000000000000000000..def44030d0fad20e56663ac0070391eccbc25a79 --- /dev/null +++ b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/ram.py @@ -0,0 +1,74 @@ +############################################################################### +# +# Copyright (C) 2016 +# ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# 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/>. +# +# Author Date +# HJ jan 2017 Original +# EK feb 2017 +# PD feb 2017 +# +############################################################################### + +from math import ceil +import logging +from constants import * +from common import c_word_w, c_nof_complex, ceil_pow2, ceil_log2 +from base_object import BaseObject +from field import Field + +logger = logging.getLogger('main.perip.ram') + +class RAM(BaseObject): + """ A RAM is a Field that is repeated address_length times + """ + def __init__(self, name, fields=None, settings=None): + super().__init__() + self.name(name) + + self.fields = {} if fields is None else fields + + self._valid_keys = ['number_of_slaves'] + self._args.update({'number_of_slaves' : DEFAULT_NUMBER_OF_SLAVES}) + + def number_of_slaves(self, val=None): + """ set/get number of slaves """ + if val is not None: + self.set_kv('number_of_slaves', val) + return + return self._as_int('number_of_slaves') + + def add_field(self, name, settings): + """ add new Field to Register with given settings + """ + field = Field(name, settings) + if field.success: + self.fields[name] = Field(name, settings) + self.update_address_length() + return True + return False + + def update_address_length(self): + """ update total address_length of Register + """ + if len(self.fields) == 0: + return + n_words = 0 + for field in self.fields.values(): + n_words += int(ceil(float(field.width()) / c_word_w)) + + self.set_kv('address_length', n_words) diff --git a/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/register.py b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/register.py new file mode 100644 index 0000000000000000000000000000000000000000..9d29d9cc4186b9cfe35633fe057f549a0ede7c3f --- /dev/null +++ b/tools/oneclick/prestudy/YAML/py_mm_lib/peripheral_lib/register.py @@ -0,0 +1,87 @@ +############################################################################### +# +# Copyright (C) 2016 +# ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# 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/>. +# +# Author Date +# HJ jan 2017 Original +# EK feb 2017 +# PD feb 2017 +# +############################################################################### + +from math import ceil +import logging +from constants import * +from common import c_word_w, c_nof_complex, ceil_pow2, ceil_log2 +from base_object import BaseObject +from field import Field + +logger = logging.getLogger('main.perip.register') + +class Register(BaseObject): + """ A register consists of Fields + """ + def __init__(self, name, fields=None, settings=None): + super().__init__() + self.name(name) + + self.fields = {} if fields is None else fields + + self._valid_keys = ['number_of_slaves', 'address_length', 'slave_discription'] + + self._args.update({'number_of_slaves' : DEFAULT_NUMBER_OF_SLAVES, + 'address_length' : DEFAULT_ADDRESS_LENGTH, + 'slave_discription': DEFAULT_DESCRIPTION}) + + self.update_address_length() + + def number_of_slaves(self, val=None): + """ set/get number of slaves """ + if val is not None: + self.set_kv('number_of_slaves', val) + return + return self._as_int('number_of_slaves') + + def add_field(self, name, settings): + """ add new Field to Register with given settings + """ + field = Field(name, settings) + if field.success: + self.fields[name] = field + self.update_address_length() + return True + return False + + def update_address_length(self): + """ update total address_length of Register + """ + if len(self.fields) == 0: + return + n_words = 0 + for field in self.fields.values(): + n_words += int(ceil(float(field.width()) / c_word_w)) + + self.set_kv('address_length', n_words) # ceil_pow2(n_words)) + + def address_length(self, val=None): + """ set/get address_length of register + val: if not None set address_length of register + return: address_length of register """ + if val is not None: + return self.set_kv('address_length', val) + return self._as_int('address_length', default=1)