summaryrefslogtreecommitdiff
path: root/grc/core/blocks/_build.py
diff options
context:
space:
mode:
authorSebastian Koslowski <sebastian.koslowski@gmail.com>2017-11-08 19:05:19 +0100
committerSebastian Koslowski <sebastian.koslowski@gmail.com>2017-11-08 19:30:41 +0100
commitfbc1627340ea3ed4bedc3424d5a2ec3736e66b4b (patch)
tree83d83a227b87c61eb36075408bf1589fab03b5c5 /grc/core/blocks/_build.py
parent1fa89b3704d7f476e4395eb9358d5a6d7642251b (diff)
grc: move port and param init to block builder
Diffstat (limited to 'grc/core/blocks/_build.py')
-rw-r--r--grc/core/blocks/_build.py76
1 files changed, 70 insertions, 6 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