summaryrefslogtreecommitdiff
path: root/grc/core
diff options
context:
space:
mode:
Diffstat (limited to 'grc/core')
-rw-r--r--grc/core/blocks/_build.py76
-rw-r--r--grc/core/blocks/_flags.py16
-rw-r--r--grc/core/blocks/block.py81
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):