summaryrefslogtreecommitdiff
path: root/tests/demo_blocks.py
blob: 855040241d9a1a9bbecba9a82591adf4d54c44a3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# Copyright (C) by Josh Blum. See LICENSE.txt for licensing information.

import gras
import numpy
from PMC import *

class NullSource(gras.Block):
    def __init__(self, out_sig):
        gras.Block.__init__(self, 'NullSource', out_sig=[out_sig])

    def work(self, ins, outs):
        outs[0][:] = numpy.zeros(len(outs[0]))
        self.produce(0, len(outs[0]))

class NullSink(gras.Block):
    def __init__(self, in_sig):
        gras.Block.__init__(self, 'NullSink', in_sig=[in_sig])

    def work(self, ins, outs):
        self.consume(0, len(ins[0]))

class VectorSource(gras.Block):
    def __init__(self, out_sig, vec):
        gras.Block.__init__(self, name='VectorSource', out_sig=[out_sig])
        self._vec = vec

    def work(self, ins, outs):
        num = min(len(outs[0]), len(self._vec))
        outs[0][:num] = self._vec[:num]
        self.produce(0, num)
        self._vec = self._vec[num:]
        if not self._vec:
            self.mark_done()

class VectorSink(gras.Block):
    def __init__(self, in_sig):
        gras.Block.__init__(self, name='VectorSink', in_sig=[in_sig])
        self._vec = list()

    def get_vector(self):
        return tuple(self._vec)

    def work(self, ins, outs):
        self._vec.extend(ins[0].copy())
        self.consume(0, len(ins[0]))

class Add2X(gras.Block):
    def __init__(self, sig):
        gras.Block.__init__(self,
            name = "Add2X",
            in_sig = [sig, sig],
            out_sig = [sig],
        )

    def work(self, ins, outs):
        nitems = min(*map(len, (ins[0], ins[1], outs[0])))
        outs[0][:nitems] = ins[0][:nitems] + ins[1][:nitems]
        self.consume(0, nitems)
        self.consume(1, nitems)
        self.produce(0, nitems)

class TagSource(gras.Block):
    def __init__(self, values):
        gras.Block.__init__(self,
            name = "TagSource",
            out_sig = [numpy.uint8],
        )
        self._values = values

    def work(self, ins, outs):
        offset = self.get_produced(0)
        tag = gras.Tag(offset, PMC_M(self._values[0]))
        self.post_output_tag(0, tag)
        self.produce(0, len(outs[0]))
        self._values = self._values[1:]
        if not self._values:
            self.mark_done()

class TagSink(gras.Block):
    def __init__(self):
        gras.Block.__init__(self,
            name = "TagSink",
            in_sig = [numpy.uint8],
        )
        self._values = list()

    def get_values(self):
        return tuple(self._values)

    def work(self, ins, outs):
        max_read = self.get_consumed(0) + len(ins[0])
        for tag in self.get_input_tags(0):
            if tag.offset < max_read:
                self._values.append(tag.object())
        self.consume(0, len(ins[0]))