summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/gras_impl/output_buffer_queues.hpp1
-rw-r--r--python/gras/GRAS_Block.i18
-rw-r--r--tests/block_test.py63
3 files changed, 73 insertions, 9 deletions
diff --git a/lib/gras_impl/output_buffer_queues.hpp b/lib/gras_impl/output_buffer_queues.hpp
index d876aa7..6777fe2 100644
--- a/lib/gras_impl/output_buffer_queues.hpp
+++ b/lib/gras_impl/output_buffer_queues.hpp
@@ -59,6 +59,7 @@ struct OutputBufferQueues
GRAS_FORCE_INLINE T &front(const size_t i)
{
+ ASSERT(not _queues[i].empty());
return _queues[i].front();
}
diff --git a/python/gras/GRAS_Block.i b/python/gras/GRAS_Block.i
index ab92b26..ca43589 100644
--- a/python/gras/GRAS_Block.i
+++ b/python/gras/GRAS_Block.i
@@ -86,8 +86,8 @@ struct PyGILPhondler
%include <std_pair.i>
%include <std_vector.i>
-%template () std::pair<ptrdiff_t, size_t>;
-%template () std::vector<std::pair<ptrdiff_t, size_t> >;
+%template () std::pair<size_t, size_t>;
+%template () std::vector<std::pair<size_t, size_t> >;
////////////////////////////////////////////////////////////////////////
// Pull in the implementation goodies
@@ -139,6 +139,9 @@ struct BlockPython : Block
void notify_topology(const size_t num_inputs, const size_t num_outputs)
{
+ _input_items.resize(num_inputs);
+ _output_items.resize(num_outputs);
+
PyGILPhondler phil();
return this->_Py_notify_topology(num_inputs, num_outputs);
}
@@ -151,17 +154,15 @@ struct BlockPython : Block
const OutputItems &output_items
)
{
- _input_items.resize(input_items.size());
for (size_t i = 0; i < input_items.size(); i++)
{
- _input_items[i].first = ptrdiff_t(input_items[i].get());
+ _input_items[i].first = size_t(input_items[i].get());
_input_items[i].second = input_items[i].size();
}
- _output_items.resize(output_items.size());
for (size_t i = 0; i < output_items.size(); i++)
{
- _output_items[i].first = ptrdiff_t(output_items[i].get());
+ _output_items[i].first = size_t(output_items[i].get());
_output_items[i].second = output_items[i].size();
}
@@ -169,7 +170,7 @@ struct BlockPython : Block
return this->_Py_work(_input_items, _output_items);
}
- typedef std::vector<std::pair<ptrdiff_t, size_t> > IOPairVec;
+ typedef std::vector<std::pair<size_t, size_t> > IOPairVec;
IOPairVec _input_items;
IOPairVec _output_items;
@@ -218,9 +219,8 @@ def sig_to_dtype_sig(sig):
class Block(BlockPython):
def __init__(self, name='Block', in_sig=None, out_sig=None):
BlockPython.__init__(self, name)
- print 'BlockPython.__init__(self, name)'
self.set_input_signature(in_sig)
- self.set_output_signature(in_sig)
+ self.set_output_signature(out_sig)
def set_input_signature(self, sig):
self.__in_sig = sig_to_dtype_sig(sig)
diff --git a/tests/block_test.py b/tests/block_test.py
index b598b27..a6dccfc 100644
--- a/tests/block_test.py
+++ b/tests/block_test.py
@@ -19,9 +19,72 @@ class NullSink(gras.Block):
def work(self, ins, outs):
self.mark_done()
+class VectorSource(gras.Block):
+ def __init__(self, out_sig, vec):
+ gras.Block.__init__(self,
+ name='VectorSource',
+ in_sig=None,
+ out_sig=[out_sig],
+ )
+ self._vec = vec
+
+ def work(self, ins, outs):
+ print 'vector source work'
+ num = min(len(outs[0]), len(self._vec))
+ if num == 0:
+ self.mark_done()
+ return
+ #print 'outs[0][:num] is '
+ #print len(outs)
+ #print len(outs[0])
+ #print outs[0][0]
+ #print outs[0][:num]
+ outs[0][:num] = self._vec[:num]
+ self.produce(0, num)
+ self._vec = self._vec[num:]
+ #if not self._vec:
+ # self.mark_done()
+ print 'vector source work done'
+
+class VectorSink(gras.Block):
+ def __init__(self, in_sig):
+ gras.Block.__init__(self,
+ name='VectorSink',
+ in_sig=[in_sig],
+ out_sig=None,
+ )
+ self._vec = list()
+
+ def get_vector(self):
+ return self._vec
+
+ def work(self, ins, outs):
+ print 'vector sink work'
+ self._vec.extend(ins[0].copy())
+ self.consume(0, len(ins[0]))
+ print 'vector sink work done'
+
class BlockTest(unittest.TestCase):
+ def test_vector_blocks(self):
+ vec_source = VectorSource(numpy.uint32, [0, 9, 8, 7, 6])
+ vec_sink = VectorSink(numpy.uint32)
+
+ print 'make tb'
+ tb = gras.TopBlock()
+ print 'connect'
+ tb.connect(vec_source, vec_sink)
+ print 'run'
+ tb.run()
+ print 'done run'
+ tb = None
+
+ print vec_sink.get_vector()
+ vec_source = None
+ vec_sink = None
+
def test_make_block(self):
+ return
null_src = NullSource()
null_sink = NullSink()