commit-gnuradio
[Top][All Lists]
Advanced

[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           \





reply via email to

[Prev in Thread] Current Thread [Next in Thread]