[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r4034 - in gnuradio/branches/developers/jcorgan/hier:
From: |
jcorgan |
Subject: |
[Commit-gnuradio] r4034 - in gnuradio/branches/developers/jcorgan/hier: gnuradio-core/src/lib/runtime gnuradio-core/src/python/gnuradio/gr gnuradio-examples/c++/hier |
Date: |
Mon, 27 Nov 2006 14:58:20 -0700 (MST) |
Author: jcorgan
Date: 2006-11-27 14:58:20 -0700 (Mon, 27 Nov 2006)
New Revision: 4034
Modified:
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2.cc
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2.h
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.h
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_runtime_impl.cc
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.cc
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.h
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
gnuradio/branches/developers/jcorgan/hier/gnuradio-examples/c++/hier/Makefile.am
Log:
Work in progress. Flattening hierarchical blocks nearing completion.
Modified:
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2.cc
===================================================================
---
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2.cc
2006-11-27 05:24:04 UTC (rev 4033)
+++
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2.cc
2006-11-27 21:58:20 UTC (rev 4034)
@@ -65,6 +65,13 @@
}
void
+gr_hier_block2::flatten(gr_simple_flowgraph_sptr sfg, const std::string
&prefix)
+{
+ flatten_components(sfg, prefix);
+ flatten_edges(sfg, prefix);
+}
+
+void
gr_hier_block2::flatten_components(gr_simple_flowgraph_sptr sfg, const
std::string &prefix)
{
d_detail->flatten_components(sfg, prefix);
Modified:
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2.h
===================================================================
---
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2.h
2006-11-27 05:24:04 UTC (rev 4033)
+++
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2.h
2006-11-27 21:58:20 UTC (rev 4034)
@@ -40,15 +40,16 @@
class gr_hier_block2 : public gr_basic_block
{
private:
+ friend class gr_hier_block2_detail;
friend gr_hier_block2_sptr gr_make_hier_block2(const std::string &name,
gr_io_signature_sptr
input_signature,
gr_io_signature_sptr
output_signature);
+ gr_hier_block2_detail *d_detail;
+
+protected:
/*!
* \brief Private implementation details of gr_hier_block2
*/
- gr_hier_block2_detail *d_detail;
-
-protected:
gr_hier_block2(const std::string &name,
gr_io_signature_sptr input_signature,
gr_io_signature_sptr output_signature);
@@ -59,8 +60,9 @@
void define_component(const std::string &name, gr_basic_block_sptr
basic_block);
void connect(const std::string &src_name, int src_port,
const std::string &dst_name, int dst_port);
- void flatten_components(gr_simple_flowgraph_sptr sfg, const std::string
&prefix = "");
- void flatten_edges(gr_simple_flowgraph_sptr sfg, const std::string &prefix
= "");
+ void flatten(gr_simple_flowgraph_sptr sfg, const std::string &prefix = "");
+ void flatten_components(gr_simple_flowgraph_sptr sfg, const std::string
&prefix);
+ void flatten_edges(gr_simple_flowgraph_sptr sfg, const std::string
&prefix);
};
#endif /* INCLUDED_GR_HIER_BLOCK2_H */
Modified:
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
===================================================================
---
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
2006-11-27 05:24:04 UTC (rev 4033)
+++
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
2006-11-27 21:58:20 UTC (rev 4034)
@@ -148,15 +148,59 @@
throw std::invalid_argument("type mismatch");
}
+std::string
+gr_hier_block2_detail::prepend_prefix(const std::string &prefix, const
std::string &str)
+{
+ return prefix + ((prefix == "") ? "" : ".") + str;
+}
+
+gr_endpoint
+gr_hier_block2_detail::match_endpoint(const std::string &name, int port, bool
is_input)
+{
+ // FIXME: Incomplete. Need to resolve_endpoint on the match in case it is
+ // a hierarchical block.
+
+ for (gr_edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) {
+ if (is_input) {
+ if ((*p)->src_name() == name && (*p)->src_port() == port)
+ return gr_endpoint((*p)->dst_name(), (*p)->dst_port());
+ }
+ else {
+ if ((*p)->dst_name() == name && (*p)->dst_port() == port)
+ return gr_endpoint((*p)->src_name(), (*p)->src_port());
+ }
+ }
+}
+
+gr_endpoint
+gr_hier_block2_detail::resolve_endpoint(const std::string &name, int port,
+ const std::string &prefix, bool
is_input)
+{
+ gr_basic_block_sptr basic_block = lookup_block(name);
+
+ // Check if 'name' points to gr_block (leaf node)
+ gr_block_sptr block(boost::dynamic_pointer_cast<gr_block,
gr_basic_block>(basic_block));
+ if (block)
+ return gr_endpoint(prepend_prefix(prefix, name), port);
+
+ // Check if 'name' points to hierarchical block
+ gr_hier_block2_sptr
hier_block2(boost::dynamic_pointer_cast<gr_hier_block2,
gr_basic_block>(basic_block));
+ if (hier_block2) {
+ std::string child_prefix = prepend_prefix(prefix, name);
+ gr_endpoint match(hier_block2->d_detail->match_endpoint("self", port,
!is_input));
+ return gr_endpoint(prepend_prefix(child_prefix, match.name()),
match.port());
+ }
+
+ // Shouldn't ever get here
+ throw std::runtime_error("unable to resolve endpoint");
+}
+
void
gr_hier_block2_detail::flatten_components(gr_simple_flowgraph_sptr sfg, const
std::string &prefix)
{
- if (GR_HIER_BLOCK2_DETAIL_DEBUG)
- std::cout << "Flattening hierarchy with prefix: " << prefix <<
std::endl;
-
// 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(prefix + ((prefix == "") ? "":".") + p->first);
+ std::string name = prepend_prefix(prefix, p->first);
gr_basic_block_sptr basic_block = p->second;
gr_block_sptr block(boost::dynamic_pointer_cast<gr_block,
gr_basic_block>(basic_block));
@@ -172,4 +216,23 @@
void
gr_hier_block2_detail::flatten_edges(gr_simple_flowgraph_sptr sfg, const
std::string &prefix)
{
+ // Add my edges to the flow graph, resolving references to actual endpoints
+ for (gr_edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) {
+
+ // Connections to self get resolved/added by parent
+ if ((*p)->src_name() == "self" ||
+ (*p)->dst_name() == "self")
+ 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());
+ }
+
+ // Recurse hierarchical children
+ for (gr_hier_component_miter_t p = d_components.begin(); p !=
d_components.end(); p++) {
+ gr_hier_block2_sptr
hier_block2(boost::dynamic_pointer_cast<gr_hier_block2,
gr_basic_block>(p->second));
+ if (hier_block2)
+ hier_block2->flatten_edges(sfg, prepend_prefix(prefix, p->first));
+ }
}
Modified:
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.h
===================================================================
---
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.h
2006-11-27 05:24:04 UTC (rev 4033)
+++
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.h
2006-11-27 21:58:20 UTC (rev 4034)
@@ -52,10 +52,13 @@
void check_dst_not_used(const std::string name, int port);
void check_type_match(gr_io_signature_sptr src_sig, int src_port,
gr_io_signature_sptr dst_sig, int dst_port);
-
- void flatten_components(gr_simple_flowgraph_sptr sfg, const std::string
&prefix = "");
- void flatten_edges(gr_simple_flowgraph_sptr sfg, const std::string &prefix
= "");
-
+ std::string prepend_prefix(const std::string &prefix, const std::string
&str);
+ void flatten_components(gr_simple_flowgraph_sptr sfg, const std::string
&prefix);
+ void flatten_edges(gr_simple_flowgraph_sptr sfg, const std::string
&prefix);
+ 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);
+
public:
~gr_hier_block2_detail();
};
Modified:
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_runtime_impl.cc
===================================================================
---
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_runtime_impl.cc
2006-11-27 05:24:04 UTC (rev 4033)
+++
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_runtime_impl.cc
2006-11-27 21:58:20 UTC (rev 4034)
@@ -54,8 +54,7 @@
else
d_running = true;
- d_top_block->flatten_components(d_sfg);
- d_top_block->flatten_edges(d_sfg);
+ d_top_block->flatten(d_sfg);
}
void
Modified:
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.cc
===================================================================
---
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.cc
2006-11-27 05:24:04 UTC (rev 4033)
+++
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.cc
2006-11-27 21:58:20 UTC (rev 4034)
@@ -42,11 +42,9 @@
}
gr_edge::gr_edge(const std::string &src_name, int src_port, const std::string
&dst_name, int dst_port)
+ : d_src(src_name, src_port),
+ d_dst(dst_name, dst_port)
{
- d_src_name = src_name;
- d_dst_name = dst_name;
- d_src_port = src_port;
- d_dst_port = dst_port;
}
gr_edge::~gr_edge()
@@ -91,7 +89,11 @@
{
gr_block_sptr src_block = lookup_block(src_name);
gr_block_sptr dst_block = lookup_block(dst_name);
-
+
+ if (GR_SIMPLE_FLOWGRAPH_DETAIL_DEBUG)
+ std::cout << "Connecting " << src_name << ":" << src_port << "->"
+ << dst_name << ":" << dst_port << std::endl;
+
if (!src_block)
throw std::invalid_argument("unknown src name");
if (!dst_block)
Modified:
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.h
===================================================================
---
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.h
2006-11-27 05:24:04 UTC (rev 4033)
+++
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.h
2006-11-27 21:58:20 UTC (rev 4034)
@@ -31,6 +31,18 @@
typedef std::map<std::string, gr_block_sptr> gr_component_map_t;
typedef std::map<std::string, gr_block_sptr>::iterator gr_component_miter_t;
+class gr_endpoint
+{
+private:
+ std::string d_name;
+ int d_port;
+
+public:
+ gr_endpoint(const std::string &name, int port) { d_name = name; d_port =
port; }
+ const std::string &name() const { return d_name; }
+ int port() const { return d_port; }
+};
+
class gr_edge;
typedef boost::shared_ptr<gr_edge> gr_edge_sptr;
gr_edge_sptr gr_make_edge(const std::string &src_name, int src_port,
@@ -44,17 +56,15 @@
gr_edge(const std::string &name, int src_port,
const std::string &name, int dst_port);
- std::string d_src_name;
- std::string d_dst_name;
- int d_src_port;
- int d_dst_port;
+ gr_endpoint d_src;
+ gr_endpoint d_dst;
public:
~gr_edge();
- std::string src_name() const { return d_src_name; }
- std::string dst_name() const { return d_dst_name; }
- int src_port() const { return d_src_port; }
- int dst_port() const { return d_dst_port; }
+ 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(); }
+ int dst_port() const { return d_dst.port(); }
};
typedef std::vector<gr_edge_sptr> gr_edge_vector_t;
@@ -102,4 +112,11 @@
return os;
}
+inline std::ostream&
+operator <<(std::ostream &os, const gr_endpoint endp)
+{
+ os << endp.name() << ":" << endp.port();
+ return os;
+}
+
#endif /* INCLUDED_GR_SIMPLE_FLOWGRAPH_H */
Modified:
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
===================================================================
---
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
2006-11-27 05:24:04 UTC (rev 4033)
+++
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
2006-11-27 21:58:20 UTC (rev 4034)
@@ -41,7 +41,8 @@
hblock.define_component("src", gr.null_source(gr.sizeof_int))
self.assertRaises(ValueError,
lambda: hblock.define_component("src", gr.null_sink(gr.sizeof_int)))
-
+
+ """ This is probably not going to stay
def test_005_define_component_block_in_use(self):
hblock = gr.hier_block2("test_block",
gr.io_signature(1,1,gr.sizeof_int),
@@ -50,6 +51,7 @@
hblock.define_component("nop1", nop)
self.assertRaises(ValueError,
lambda: hblock.define_component("nop2", nop))
+ """
def test_006_connect_internal(self):
hblock = gr.hier_block2("test_block",
Modified:
gnuradio/branches/developers/jcorgan/hier/gnuradio-examples/c++/hier/Makefile.am
===================================================================
---
gnuradio/branches/developers/jcorgan/hier/gnuradio-examples/c++/hier/Makefile.am
2006-11-27 05:24:04 UTC (rev 4033)
+++
gnuradio/branches/developers/jcorgan/hier/gnuradio-examples/c++/hier/Makefile.am
2006-11-27 21:58:20 UTC (rev 4034)
@@ -36,7 +36,8 @@
noinst_HEADERS = \
dialtone.h \
- sink.h
+ sink.h \
+ source.h
dialtone_SOURCES = \
dialtone.cc \
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r4034 - in gnuradio/branches/developers/jcorgan/hier: gnuradio-core/src/lib/runtime gnuradio-core/src/python/gnuradio/gr gnuradio-examples/c++/hier,
jcorgan <=