[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r4500 - in gnuradio/branches/developers/jcorgan/sfg/gn
From: |
jcorgan |
Subject: |
[Commit-gnuradio] r4500 - in gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src: lib/runtime python/gnuradio/gr |
Date: |
Sun, 18 Feb 2007 17:10:56 -0700 (MST) |
Author: jcorgan
Date: 2007-02-18 17:10:56 -0700 (Sun, 18 Feb 2007)
New Revision: 4500
Modified:
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.h
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.cc
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.h
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
Log:
Work in progress.
Modified:
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
===================================================================
---
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
2007-02-18 20:44:36 UTC (rev 4499)
+++
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
2007-02-19 00:10:56 UTC (rev 4500)
@@ -78,36 +78,40 @@
gr_io_signature_sptr dst_io_signature;
// Check against our *input_signature* if we're wiring from one of our
external inputs
- if (src_name == "self")
- src_io_signature = d_owner->input_signature();
- else {
- gr_basic_block_sptr src_block = lookup_block(src_name);
- if (!src_block)
- throw std::invalid_argument("undefined src name");
- src_io_signature = src_block->output_signature();
+ if (src_name != "NC") {
+ if (src_name == "self")
+ src_io_signature = d_owner->input_signature();
+ else {
+ gr_basic_block_sptr src_block = lookup_block(src_name);
+ if (!src_block)
+ throw std::invalid_argument("undefined src name");
+ src_io_signature = src_block->output_signature();
+ }
+
+ check_valid_port(src_io_signature, src_port);
}
-
+
// Check against our *output_signature* if we're wiring to one of our
external outputs
- if (dst_name == "self")
- dst_io_signature = d_owner->output_signature();
- else {
- gr_basic_block_sptr dst_block = lookup_block(dst_name);
- if (!dst_block)
- throw std::invalid_argument("undefined dst name");
- dst_io_signature = dst_block->input_signature();
+ if (dst_name != "NC") {
+ if (dst_name == "self")
+ dst_io_signature = d_owner->output_signature();
+ else {
+ gr_basic_block_sptr dst_block = lookup_block(dst_name);
+ if (!dst_block)
+ throw std::invalid_argument("undefined dst name");
+ dst_io_signature = dst_block->input_signature();
+ }
+
+ check_valid_port(dst_io_signature, dst_port);
+ check_dst_not_used(dst_name, dst_port);
}
-
- // Check port numbers are valid
- check_valid_port(src_io_signature, src_port);
- check_valid_port(dst_io_signature, dst_port);
- // Check destination port not already in use
- check_dst_not_used(dst_name, dst_port);
-
// Check endpoint types match
- check_type_match(src_io_signature, src_port, dst_io_signature, dst_port);
+ if (src_name != "NC" && dst_name != "NC")
+ check_type_match(src_io_signature, src_port, dst_io_signature, dst_port);
- d_edges.push_back(gr_make_edge(src_name, src_port, dst_name, dst_port));
+ gr_edge_sptr edge = gr_make_edge(src_name, src_port, dst_name, dst_port);
+ d_edges.push_back(edge);
}
void
@@ -211,10 +215,12 @@
gr_hier_block2_detail::flatten_components(gr_simple_flowgraph_sptr sfg, const
std::string &prefix)
{
// Add my non-hierarchical components to the simple flowgraph, then recurse
- for (gr_hier_component_miter_t p = d_components.begin(); p !=
d_components.end(); p++) {
- std::string name = prepend_prefix(prefix, p->first);
+ std::vector<std::string> names = calc_used_components();
- gr_basic_block_sptr basic_block = p->second;
+ for (std::vector<std::string>::iterator p = names.begin(); p != names.end();
p++) {
+ gr_basic_block_sptr basic_block = lookup_block(*p);
+ std::string name = prepend_prefix(prefix, *p);
+
gr_block_sptr block(boost::dynamic_pointer_cast<gr_block,
gr_basic_block>(basic_block));
if (block)
sfg->define_component(name, block);
@@ -234,6 +240,10 @@
if ((*p)->src_name() == "self" || (*p)->dst_name() == "self")
continue;
+ // Connections to "NC" are silently ignored
+ if ((*p)->src_name() == "NC" || (*p)->dst_name() == "NC")
+ continue;
+
gr_endpoint src_endp = resolve_endpoint((*p)->src_name(),
(*p)->src_port(), prefix, true);
gr_endpoint dst_endp = resolve_endpoint((*p)->dst_name(),
(*p)->dst_port(), prefix, false);
sfg->connect(src_endp.name(), src_endp.port(), dst_endp.name(),
dst_endp.port());
@@ -246,3 +256,21 @@
hier_block2->d_detail->flatten_edges(sfg, prepend_prefix(prefix,
p->first));
}
}
+
+std::vector<std::string>
+gr_hier_block2_detail::calc_used_components()
+{
+ std::vector<std::string> tmp, result;
+ std::insert_iterator<std::vector<std::string> > inserter(result,
result.begin());
+
+ for (gr_edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) {
+ if ((*p)->src_name() != "NC")
+ tmp.push_back((*p)->dst_name());
+ if ((*p)->dst_name() != "NC")
+ tmp.push_back((*p)->src_name());
+ }
+
+ sort(tmp.begin(), tmp.end());
+ unique_copy(tmp.begin(), tmp.end(), inserter);
+ return result;
+}
Modified:
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.h
===================================================================
---
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.h
2007-02-18 20:44:36 UTC (rev 4499)
+++
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.h
2007-02-19 00:10:56 UTC (rev 4500)
@@ -60,7 +60,8 @@
gr_endpoint match_endpoint(const std::string &name, int port, bool
is_input);
gr_endpoint resolve_endpoint(const std::string &name, int port,
const std::string &prefix, bool is_input);
-
+ std::vector<std::string> calc_used_components();
+
public:
~gr_hier_block2_detail();
};
Modified:
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.cc
===================================================================
---
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.cc
2007-02-18 20:44:36 UTC (rev 4499)
+++
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.cc
2007-02-19 00:10:56 UTC (rev 4500)
@@ -110,7 +110,7 @@
gr_block_sptr dst_block = lookup_block(dst_name);
if (GR_SIMPLE_FLOWGRAPH_DETAIL_DEBUG)
- std::cout << "Connecting " << src_name << ":" << src_port << "->"
+ std::cout << "SFG connecting " << src_name << ":" << src_port << "->"
<< dst_name << ":" << dst_port << std::endl;
if (!src_block)
@@ -185,7 +185,6 @@
std::insert_iterator<std::vector<int> > inserter(result, result.begin());
gr_edge_vector_t edges = calc_connections(name, check_inputs);
-
for (gr_edge_viter_t p = edges.begin(); p != edges.end(); p++) {
if (check_inputs == true)
tmp.push_back((*p)->dst_port());
@@ -472,6 +471,11 @@
// Find any blocks that are inputs or outputs
for (gr_edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) {
+
+ // Edges to "NC" are silently ignored
+ if ((*p)->src_name() == "NC" || (*p)->dst_name() == "NC")
+ continue;
+
if (lookup_block((*p)->src_name()) == block)
tmp.push_back(lookup_block((*p)->dst_name()));
if (lookup_block((*p)->dst_name()) == block)
Modified:
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.h
===================================================================
---
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.h
2007-02-18 20:44:36 UTC (rev 4499)
+++
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.h
2007-02-19 00:10:56 UTC (rev 4500)
@@ -25,6 +25,7 @@
#include <gr_block.h>
#include <map>
+#include <iostream>
#define GR_FIXED_BUFFER_SIZE (32*(1L<<10))
@@ -61,6 +62,9 @@
public:
~gr_edge();
+
+ gr_endpoint src() const { return d_src; }
+ gr_endpoint dst() const { return d_dst; }
const std::string src_name() const { return d_src.name(); }
const std::string dst_name() const { return d_dst.name(); }
int src_port() const { return d_src.port(); }
@@ -134,4 +138,19 @@
return os;
}
+inline std::ostream&
+operator <<(std::ostream &os, const gr_edge_sptr edge)
+{
+ os << edge->src() << "->" << edge->dst();
+ return os;
+}
+
+inline void
+enumerate_edges(gr_edge_vector_t &edges)
+{
+ std::cout << "Edge list has " << edges.size() << " elements" << std::endl;
+ for(gr_edge_viter_t p = edges.begin(); p != edges.end(); p++)
+ std::cout << *p << std::endl;
+}
+
#endif /* INCLUDED_GR_SIMPLE_FLOWGRAPH_H */
Modified:
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
===================================================================
---
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
2007-02-18 20:44:36 UTC (rev 4499)
+++
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
2007-02-19 00:10:56 UTC (rev 4500)
@@ -6,10 +6,10 @@
def setUp(self):
pass
-
+
def tearDown(self):
pass
-
+
def test_001_make(self):
hblock = gr.hier_block2("test_block",
gr.io_signature(1,1,gr.sizeof_int),
@@ -83,7 +83,7 @@
hblock.define_component("nop1", nop1)
self.assertRaises(ValueError,
lambda: hblock.connect("nop2", 0, "self", 0))
-
+
def test_010_connect_unknown_dst(self):
hblock = gr.hier_block2("test_block",
gr.io_signature(1,1,gr.sizeof_int),
@@ -107,7 +107,7 @@
hblock.define_component("nop1", gr.nop(gr.sizeof_int))
self.assertRaises(ValueError,
lambda: hblock.connect("self", 1, "nop1", 0))
-
+
def test_013_connect_invalid_dst_port_neg(self):
hblock = gr.hier_block2("test_block",
gr.io_signature(1,1,gr.sizeof_int),
@@ -133,7 +133,7 @@
hblock.connect("nop1", 0, "self", 0);
self.assertRaises(ValueError,
lambda: hblock.connect("nop1", 0, "self", 0))
-
+
def test_016_connect_one_src_two_dst(self):
hblock = gr.hier_block2("test_block",
gr.io_signature(1,1,gr.sizeof_int),
@@ -176,10 +176,10 @@
hblock.connect("nop1", 0, "nop2", 0)
self.assertRaises(ValueError,
lambda: hblock.disconnect("nop1", 0, "foo", 0))
-
+
def test_021_run(self):
expected = (1.0, 2.0, 3.0, 4.0)
-
+
hblock = gr.hier_block2("test_block",
gr.io_signature(0,0,0),
gr.io_signature(0,0,0))
@@ -197,9 +197,8 @@
self.assertEquals(expected, actual1)
self.assertEquals(expected, actual2)
- def test_022_run_and_disconnect(self):
+ def test_022_connect_disconnect(self):
expected = (1.0, 2.0, 3.0, 4.0)
-
hblock = gr.hier_block2("test_block",
gr.io_signature(0,0,0),
gr.io_signature(0,0,0))
@@ -210,15 +209,33 @@
hblock.define_component("sink2", sink2)
hblock.connect("src", 0, "sink1", 0)
hblock.connect("src", 0, "sink2", 0)
+ hblock.disconnect("src", 0, "sink2", 0)
+ hblock.connect("NC", 0, "sink2", 0)
runtime = gr.runtime(hblock)
+ runtime.run()
+
+ def test_023_run_and_disconnect(self):
+ expected = (1.0, 2.0, 3.0, 4.0)
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(0,0,0),
+ gr.io_signature(0,0,0))
+ hblock.define_component("src", gr.vector_source_f(expected, False))
+ sink1 = gr.vector_sink_f()
+ sink2 = gr.vector_sink_f()
+ hblock.define_component("sink1", sink1)
+ hblock.define_component("sink2", sink2)
+ hblock.connect("src", 0, "sink1", 0)
+ hblock.connect("src", 0, "sink2", 0)
+ runtime = gr.runtime(hblock)
runtime.start()
hblock.disconnect("src", 0, "sink2", 0)
+ hblock.connect("NC", 0, "sink2", 0)
runtime.restart()
runtime.wait()
actual1 = sink1.data()
actual2 = sink2.data()
self.assertEquals(expected, actual1)
self.assertEquals((), actual2)
-
+
if __name__ == "__main__":
gr_unittest.main()
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r4500 - in gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src: lib/runtime python/gnuradio/gr,
jcorgan <=