diff options
Diffstat (limited to 'grc/core/blocks')
-rw-r--r-- | grc/core/blocks/_build.py | 76 | ||||
-rw-r--r-- | grc/core/blocks/_flags.py | 16 | ||||
-rw-r--r-- | grc/core/blocks/block.py | 81 |
3 files changed, 91 insertions, 82 deletions
diff --git a/grc/core/blocks/_build.py b/grc/core/blocks/_build.py index ce3496d9c4..6db06040cf 100644 --- a/grc/core/blocks/_build.py +++ b/grc/core/blocks/_build.py @@ -17,8 +17,13 @@ from __future__ import absolute_import +import collections +import itertools import re +from ..Constants import ADVANCED_PARAM_TAB +from ..utils import to_list + from .block import Block from ._flags import Flags from ._templates import MakoTemplates @@ -35,17 +40,18 @@ def build(id, label='', category='', flags='', documentation='', cls.label = label or block_id.title() cls.category = [cat.strip() for cat in category.split('/') if cat.strip()] - cls.flags = Flags(flags) + cls.flags = Flags(to_list(flags)) if re.match(r'options$|variable|virtual', block_id): - cls.flags += Flags.NOT_DSP + Flags.DISABLE_BYPASS + cls.flags.set(Flags.NOT_DSP, Flags.DISABLE_BYPASS) cls.documentation = {'': documentation.strip('\n\t ').replace('\\\n', '')} - cls.asserts = [_single_mako_expr(a, block_id) for a in (asserts or [])] + cls.asserts = [_single_mako_expr(a, block_id) for a in to_list(asserts)] - cls.parameters_data = parameters or [] - cls.inputs_data = inputs or [] - cls.outputs_data = outputs or [] + cls.inputs_data = _build_ports(inputs, 'sink') if inputs else [] + cls.outputs_data = _build_ports(outputs, 'source') if outputs else [] + cls.parameters_data = _build_params(parameters or [], + bool(cls.inputs_data), bool(cls.outputs_data), cls.flags) cls.extra_data = kwargs templates = templates or {} @@ -62,6 +68,64 @@ def build(id, label='', category='', flags='', documentation='', return cls +def _build_ports(ports_raw, direction): + ports = [] + port_ids = set() + stream_port_ids = itertools.count() + + for i, port_params in enumerate(ports_raw): + port = port_params.copy() + port['direction'] = direction + + port_id = port.setdefault('id', str(next(stream_port_ids))) + if port_id in port_ids: + raise Exception('Port id "{}" already exists in {}s'.format(port_id, direction)) + port_ids.add(port_id) + + ports.append(port) + return ports + + +def _build_params(params_raw, have_inputs, have_outputs, flags): + params = [] + + def add_param(**data): + params.append(data) + + add_param(id='id', name='ID', dtype='id', hide='part') + + if not flags.not_dsp: + add_param(id='alias', name='Block Alias', dtype='string', + hide='part', category=ADVANCED_PARAM_TAB) + + if have_outputs or have_inputs: + add_param(id='affinity', name='Core Affinity', dtype='int_vector', + hide='part', category=ADVANCED_PARAM_TAB) + + if have_outputs: + add_param(id='minoutbuf', name='Min Output Buffer', dtype='int', + hide='part', value='0', category=ADVANCED_PARAM_TAB) + add_param(id='maxoutbuf', name='Max Output Buffer', dtype='int', + hide='part', value='0', category=ADVANCED_PARAM_TAB) + + base_params_n = {} + for param_data in params_raw: + param_id = param_data['id'] + if param_id in params: + raise Exception('Param id "{}" is not unique'.format(param_id)) + + base_key = param_data.get('base_key', None) + param_data_ext = base_params_n.get(base_key, {}).copy() + param_data_ext.update(param_data) + + add_param(**param_data_ext) + base_params_n[param_id] = param_data_ext + + add_param(id='comment', name='Comment', dtype='_multiline', hide='part', + value='', category=ADVANCED_PARAM_TAB) + return params + + def _single_mako_expr(value, block_id): if not value: return None diff --git a/grc/core/blocks/_flags.py b/grc/core/blocks/_flags.py index ffea2ad569..bbedd6a2d7 100644 --- a/grc/core/blocks/_flags.py +++ b/grc/core/blocks/_flags.py @@ -17,10 +17,8 @@ from __future__ import absolute_import -import six - -class Flags(six.text_type): +class Flags(object): THROTTLE = 'throttle' DISABLE_BYPASS = 'disable_bypass' @@ -28,12 +26,14 @@ class Flags(six.text_type): DEPRECATED = 'deprecated' NOT_DSP = 'not_dsp' + def __init__(self, flags): + self.data = set(flags) + def __getattr__(self, item): return item in self - def __add__(self, other): - if not isinstance(other, six.string_types): - return NotImplemented - return self.__class__(str(self) + other) + def __contains__(self, item): + return item in self.data - __iadd__ = __add__ + def set(self, *flags): + self.data.update(flags) diff --git a/grc/core/blocks/block.py b/grc/core/blocks/block.py index adc046936d..3a3de43fce 100644 --- a/grc/core/blocks/block.py +++ b/grc/core/blocks/block.py @@ -29,7 +29,6 @@ from six.moves import range from ._templates import MakoTemplates from ._flags import Flags -from ..Constants import ADVANCED_PARAM_TAB from ..base import Element from ..utils.descriptors import lazy_property @@ -63,82 +62,28 @@ class Block(Element): outputs_data = [] extra_data = {} + loaded_from = '(unknown)' - # region Init def __init__(self, parent): """Make a new block from nested data.""" super(Block, self).__init__(parent) - self.params = self._init_params() - self.sinks = self._init_ports(self.inputs_data, direction='sink') - self.sources = self._init_ports(self.outputs_data, direction='source') - - self.active_sources = [] # on rewrite - self.active_sinks = [] # on rewrite - - self.states = {'state': True} - - def _init_params(self): - is_dsp_block = not self.flags.not_dsp - has_inputs = bool(self.inputs_data) - has_outputs = bool(self.outputs_data) - - params = collections.OrderedDict() param_factory = self.parent_platform.make_param - - def add_param(id, **kwargs): - params[id] = param_factory(self, id=id, **kwargs) - - add_param(id='id', name='ID', dtype='id', - hide='none' if (self.key == 'options' or self.is_variable) else 'part') - - if is_dsp_block: - add_param(id='alias', name='Block Alias', dtype='string', - hide='part', category=ADVANCED_PARAM_TAB) - - if has_outputs or has_inputs: - add_param(id='affinity', name='Core Affinity', dtype='int_vector', - hide='part', category=ADVANCED_PARAM_TAB) - - if has_outputs: - add_param(id='minoutbuf', name='Min Output Buffer', dtype='int', - hide='part', value='0', category=ADVANCED_PARAM_TAB) - add_param(id='maxoutbuf', name='Max Output Buffer', dtype='int', - hide='part', value='0', category=ADVANCED_PARAM_TAB) - - base_params_n = {} - for param_data in self.parameters_data: - param_id = param_data['id'] - if param_id in params: - raise Exception('Param id "{}" is not unique'.format(param_id)) - - base_key = param_data.get('base_key', None) - param_data_ext = base_params_n.get(base_key, {}).copy() - param_data_ext.update(param_data) - - add_param(**param_data_ext) - base_params_n[param_id] = param_data_ext - - add_param(id='comment', name='Comment', dtype='_multiline', hide='part', - value='', category=ADVANCED_PARAM_TAB) - return params - - def _init_ports(self, ports_n, direction): - ports = [] port_factory = self.parent_platform.make_port - port_ids = set() - stream_port_ids = itertools.count() + self.params = collections.OrderedDict( + (data['id'], param_factory(parent=self, **data)) + for data in self.parameters_data + ) + if self.key == 'options' or self.is_variable: + self.params['id'].hide = 'part' - for i, port_data in enumerate(ports_n): - port_id = port_data.setdefault('id', str(next(stream_port_ids))) - if port_id in port_ids: - raise Exception('Port id "{}" already exists in {}s'.format(port_id, direction)) - port_ids.add(port_id) + self.sinks = [port_factory(parent=self, **params) for params in self.inputs_data] + self.sources = [port_factory(parent=self, **params) for params in self.outputs_data] - port = port_factory(parent=self, direction=direction, **port_data) - ports.append(port) - return ports - # endregion + self.active_sources = [] # on rewrite + self.active_sinks = [] # on rewrite + + self.states = {'state': True} # region Rewrite_and_Validation def rewrite(self): |