commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r4969 - in gnuradio/branches/developers/jcorgan/hier2/


From: jcorgan
Subject: [Commit-gnuradio] r4969 - in gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src: lib/runtime python/gnuradio/gr
Date: Thu, 12 Apr 2007 01:27:31 -0600 (MDT)

Author: jcorgan
Date: 2007-04-12 01:27:31 -0600 (Thu, 12 Apr 2007)
New Revision: 4969

Modified:
   
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2.cc
   
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2.h
   
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2.i
   
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
   
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.h
   
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.cc
   
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.h
   
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.i
   
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.cc
   
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.h
   
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/python/gnuradio/gr/hier_block2.py
   
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
   
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/python/gnuradio/gr/qa_simple_flowgraph.py
Log:
Work in progress.  Converted hier_block2 class to not use 'define_component'
anymore.  This considerable simplifies both the internal code as well as
the user interface, which is now very much like the existing gr.flow_graph 
API.

The code is failing QA at the moment (tracking down a segfault, and one
failure case in 'disconnect').  Also, none of the Python code that uses
hier_block2 has been converted.


Modified: 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2.cc
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2.cc
  2007-04-12 05:29:07 UTC (rev 4968)
+++ 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2.cc
  2007-04-12 07:27:31 UTC (rev 4969)
@@ -50,21 +50,15 @@
 }
 
 void 
-gr_hier_block2::define_component(const std::string &name, gr_basic_block_sptr 
block)
+gr_hier_block2::connect(gr_basic_block_sptr src, int src_port, 
+                        gr_basic_block_sptr dst, int dst_port)
 {
-    d_detail->define_component(name, block);
+    d_detail->connect(src, src_port, dst, dst_port);
 }
 
 void 
-gr_hier_block2::connect(const std::string &src_name, int src_port, 
-                        const std::string &dst_name, int dst_port)
+gr_hier_block2::disconnect(gr_basic_block_sptr src, int src_port, 
+                           gr_basic_block_sptr dst, int dst_port)
 {
-    d_detail->connect(src_name, src_port, dst_name, dst_port);
+    d_detail->disconnect(src, src_port, dst, dst_port);
 }
-
-void 
-gr_hier_block2::disconnect(const std::string &src_name, int src_port, 
-                           const std::string &dst_name, int dst_port)
-{
-    d_detail->disconnect(src_name, src_port, dst_name, dst_port);
-}

Modified: 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2.h
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2.h
   2007-04-12 05:29:07 UTC (rev 4968)
+++ 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2.h
   2007-04-12 07:27:31 UTC (rev 4969)
@@ -59,11 +59,10 @@
 public:
     virtual ~gr_hier_block2();
 
-    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 disconnect(const std::string &src_name, int src_port,
-                   const std::string &dst_name, int dst_port);
+    void connect(gr_basic_block_sptr src, int src_port, 
+                 gr_basic_block_sptr dst, int dst_port);
+    void disconnect(gr_basic_block_sptr src, int src_port,
+                   gr_basic_block_sptr dst, int dst_port);
 };
 
 #endif /* INCLUDED_GR_HIER_BLOCK2_H */

Modified: 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2.i
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2.i
   2007-04-12 05:29:07 UTC (rev 4968)
+++ 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2.i
   2007-04-12 07:27:31 UTC (rev 4969)
@@ -44,12 +44,10 @@
     ~gr_hier_block2 ();
 
     // Add a named block to the container
-    void define_component(const std::string &name, gr_basic_block_sptr 
basic_block)
+    void connect(gr_basic_block_sptr src, int src_port,
+                 gr_basic_block_sptr dst, int dst_port)
         throw (std::invalid_argument);
-    void connect(const std::string &src_name, int src_port,
-                 const std::string &dst_name, int dst_port)
+    void disconnect(gr_basic_block_sptr src, int src_port,
+                    gr_basic_block_sptr dst, int dst_port)
         throw (std::invalid_argument);
-    void disconnect(const std::string &src_name, int src_port,
-                    const std::string &dst_name, int dst_port)
-        throw (std::invalid_argument);
 };

Modified: 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
   2007-04-12 05:29:07 UTC (rev 4968)
+++ 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
   2007-04-12 07:27:31 UTC (rev 4969)
@@ -31,18 +31,9 @@
 
 #define GR_HIER_BLOCK2_DETAIL_DEBUG 1
 
-gr_hier_edge_sptr
-gr_make_hier_edge(const gr_hier_endpoint &src, const gr_hier_endpoint &dst)
-{
-  return gr_hier_edge_sptr(new gr_hier_edge(src, dst));
-}
-
-gr_hier_edge::~gr_hier_edge()
-{
-}
-
 gr_hier_block2_detail::gr_hier_block2_detail(gr_hier_block2 *owner) :
-  d_owner(owner)
+  d_owner(owner), 
+  d_fg(gr_make_simple_flowgraph())
 {
 }
 
@@ -51,139 +42,38 @@
   d_owner = 0; // Don't use delete, we didn't allocate
 }
 
-gr_basic_block_sptr
-gr_hier_block2_detail::lookup_block(const std::string &name)
-{
-  gr_hier_component_miter_t p = d_components.find(name);
-  if (p != d_components.end())
-    return p->second;
-  else
-    return gr_basic_block_sptr();
-}
 
 void 
-gr_hier_block2_detail::define_component(const std::string &name, 
gr_basic_block_sptr block)
+gr_hier_block2_detail::connect(gr_basic_block_sptr src, int src_port, 
+                               gr_basic_block_sptr dst, int dst_port)
 {
-  if (!block)
-    throw std::invalid_argument("null block passed");
+  d_fg->connect(src, src_port, dst, dst_port);
 
-  if (name == "self" || name == "NC")
-    throw std::invalid_argument("name is reserved");
-
-  if (name.find('.') != std::string::npos || 
-      name.find('/') != std::string::npos)
-    throw std::invalid_argument("illegal character in name");
-
-  if (!lookup_block(name))
-    d_components[name] = block;
-  else
-    throw std::invalid_argument("name already in use");
+  // TODO: connects to NC
 }
 
 void 
-gr_hier_block2_detail::connect(const std::string &src_name, int src_port, 
-                               const std::string &dst_name, int dst_port)
+gr_hier_block2_detail::disconnect(gr_basic_block_sptr src, int src_port, 
+                                  gr_basic_block_sptr dst, int dst_port)
 {
-  gr_io_signature_sptr src_io_signature;
-  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 != "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 != "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 endpoint types match
-  if (src_name != "NC" && dst_name != "NC")
-    check_type_match(src_io_signature, src_port, dst_io_signature, dst_port);
-
-  gr_hier_edge_sptr edge = gr_make_hier_edge(gr_hier_endpoint(src_name, 
src_port), gr_hier_endpoint(dst_name, dst_port));
-  d_edges.push_back(edge);
+  d_fg->disconnect(src, src_port, dst, dst_port);
 }
 
-void 
-gr_hier_block2_detail::disconnect(const std::string &src_name, int src_port, 
-                                  const std::string &dst_name, int dst_port)
+gr_endpoint
+gr_hier_block2_detail::match_endpoint(const gr_endpoint &endp, bool is_input)
 {
-  for (gr_hier_edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) {
-    if (((*p)->src().name() == src_name) && 
-        ((*p)->src().port() == src_port) && 
-        ((*p)->dst().name() == dst_name) && 
-        ((*p)->dst().port() == dst_port)) {
-      d_edges.erase(p);
-      return;
-    }
-  }
+  gr_basic_block_sptr self(d_owner);
 
-  throw std::invalid_argument("edge to disconnect not found");
-}
-
-void 
-gr_hier_block2_detail::check_valid_port(gr_io_signature_sptr sig, int port)
-{
-  if (port < 0)
-    throw std::invalid_argument("port number must not be negative");
-       
-  if (sig->max_streams() >= 0 && port >= sig->max_streams())
-    throw std::invalid_argument("port number exceeds max streams");
-}
-
-void 
-gr_hier_block2_detail::check_dst_not_used(const std::string name, int port)
-{
-  for (gr_hier_edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++)
-    if ((*p)->dst().name() == name && (*p)->dst().port() == port)
-      throw std::invalid_argument("destination port in use");
-}
-
-void 
-gr_hier_block2_detail::check_type_match(gr_io_signature_sptr src_sig, int 
src_port,
-                                        gr_io_signature_sptr dst_sig, int 
dst_port)
-{
-  if (src_sig->sizeof_stream_item(src_port) != 
dst_sig->sizeof_stream_item(dst_port))
-    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_hier_endpoint
-gr_hier_block2_detail::match_endpoint(const std::string &name, int port, bool 
is_input)
-{
-  for (gr_hier_edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) {
+  for (gr_edge_viter_t p = d_fg->d_detail->d_edges.begin(); p != 
d_fg->d_detail->d_edges.end(); p++) {
     if (is_input) {
-      if ((*p)->src().name() == name && (*p)->src().port() == port)
-       return resolve_endpoint((*p)->dst().name(), (*p)->dst().port(), "", 
!is_input);
+      if ((*p)->src().block() == self && 
+         (*p)->src().port() == endp.port())
+       return resolve_endpoint((*p)->dst(), !is_input);
     }
     else {
-      if ((*p)->dst().name() == name && (*p)->dst().port() == port)
-       return resolve_endpoint((*p)->src().name(), (*p)->src().port(), "", 
!is_input);
+      if ((*p)->dst().block() == self && 
+         (*p)->dst().port() == endp.port())
+       return resolve_endpoint((*p)->src(), !is_input);
     }
   }
 
@@ -191,74 +81,47 @@
   throw std::runtime_error("unable to match endpoint");
 }
 
-gr_hier_endpoint
-gr_hier_block2_detail::resolve_endpoint(const std::string &name, int port, 
-                                        const std::string &prefix, bool 
is_input)
+gr_endpoint
+gr_hier_block2_detail::resolve_endpoint(const gr_endpoint &endp, bool is_input)
 {
-  gr_basic_block_sptr basic_block = lookup_block(name);
+  // Check if endpoint is a leaf node
+  if (boost::dynamic_pointer_cast<gr_block, gr_basic_block>(endp.block()))
+    return endp;
+  
+  // Check if endpoint is a hierarchical block
+  gr_hier_block2_sptr hier_block2(boost::dynamic_pointer_cast<gr_hier_block2, 
gr_basic_block>(endp.block()));
+  if (hier_block2)
+    return hier_block2->d_detail->match_endpoint(endp, !is_input);
 
-  // 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_hier_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_hier_endpoint match(hier_block2->d_detail->match_endpoint("self", port, 
!is_input));
-    return gr_hier_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(gr_simple_flowgraph_sptr sfg, const std::string 
&prefix)
+gr_hier_block2_detail::flatten(gr_simple_flowgraph_sptr sfg)
 {
+  gr_basic_block_sptr self(d_owner);
+
   // Add my edges to the flow graph, resolving references to actual endpoints
-  for (gr_hier_edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) {
+  for (gr_edge_viter_t p = d_fg->d_detail->d_edges.begin(); p != 
d_fg->d_detail->d_edges.end(); p++) {
     // Connections to self get resolved/added by parent if actually connected
-    if ((*p)->src().name() == "self" || (*p)->dst().name() == "self")
+    if ((*p)->src().block() == self || 
+       (*p)->dst().block() == self)
       continue;
 
-    // Connections to "NC" are silently ignored
-    if ((*p)->src().name() == "NC" || (*p)->dst().name() == "NC")
-      continue;
+    // TODO: Silently ignore connections to "NC"
 
-    gr_hier_endpoint src_endp = resolve_endpoint((*p)->src().name(), 
(*p)->src().port(), prefix, true);
-    gr_hier_endpoint dst_endp = resolve_endpoint((*p)->dst().name(), 
(*p)->dst().port(), prefix, false);
-
-    // Note this will get simpler when we eventually do away with components 
in hier_block2's
-    // This converts a the two gr_hier_endpoints into the gr_endpoints that 
simple flow graphs know about
-    gr_block_sptr src_block(boost::dynamic_pointer_cast<gr_block, 
gr_basic_block>(lookup_block(src_endp.name())));
-    gr_block_sptr dst_block(boost::dynamic_pointer_cast<gr_block, 
gr_basic_block>(lookup_block(dst_endp.name())));
-    sfg->connect(src_block, src_endp.port(), dst_block, dst_endp.port());
+    gr_endpoint src_endp = resolve_endpoint((*p)->src(), true);
+    gr_endpoint dst_endp = resolve_endpoint((*p)->dst(), false);
+    sfg->connect(src_endp, dst_endp);
   }
 
+  gr_basic_block_vector_t blocks = d_fg->d_detail->calc_used_blocks();
+
   // 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));
+  for (gr_basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) {
+    gr_hier_block2_sptr 
hier_block2(boost::dynamic_pointer_cast<gr_hier_block2, gr_basic_block>(*p));
     if (hier_block2)
-      hier_block2->d_detail->flatten(sfg, prepend_prefix(prefix, p->first));
+      hier_block2->d_detail->flatten(sfg);
   }
 }
-
-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_hier_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/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.h
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.h
    2007-04-12 05:29:07 UTC (rev 4968)
+++ 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.h
    2007-04-12 07:27:31 UTC (rev 4969)
@@ -24,46 +24,7 @@
 #include <gr_hier_block2.h>
 #include <gr_simple_flowgraph_detail.h>
 #include <boost/utility.hpp>
-#include <map>
 
-typedef std::map<std::string, gr_basic_block_sptr> gr_hier_component_map_t;
-typedef std::map<std::string, gr_basic_block_sptr>::iterator 
gr_hier_component_miter_t;
-
-class gr_hier_endpoint
-{
-private:
-  std::string d_name;
-  int d_port;
-
-public:
-  gr_hier_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_hier_edge;
-typedef boost::shared_ptr<gr_hier_edge> gr_hier_edge_sptr;
-gr_hier_edge_sptr gr_make_hier_edge(const gr_hier_endpoint &src, const 
gr_hier_endpoint &dst);
-
-class gr_hier_edge
-{
-private:
-  friend gr_hier_edge_sptr gr_make_hier_edge(const gr_hier_endpoint &src, 
const gr_hier_endpoint &dst);
-  gr_hier_edge(const gr_hier_endpoint &src, const gr_hier_endpoint &dst) : 
d_src(src), d_dst(dst) { }
-
-  gr_hier_endpoint d_src;
-  gr_hier_endpoint d_dst;
-
-public:
-  ~gr_hier_edge();
-
-  const gr_hier_endpoint &src() const { return d_src; }
-  const gr_hier_endpoint &dst() const { return d_dst; }
-};
-
-typedef std::vector<gr_hier_edge_sptr> gr_hier_edge_vector_t;
-typedef std::vector<gr_hier_edge_sptr>::iterator gr_hier_edge_viter_t;
-
 class gr_hier_block2_detail : boost::noncopyable
 {
 private:
@@ -75,27 +36,18 @@
 
     // Private implementation data
     gr_hier_block2 *d_owner;
-    gr_hier_component_map_t d_components;
-    gr_hier_edge_vector_t d_edges;
+    gr_simple_flowgraph_sptr d_fg;
         
     // Private implementation methods
-    void define_component(const std::string &name, gr_basic_block_sptr block);
-    gr_basic_block_sptr lookup_block(const std::string &name);
-    void connect(const std::string &src_name, int src_port, 
-                 const std::string &dst_name, int dst_port);
-    void disconnect(const std::string &src_name, int src_port, 
-                    const std::string &dst_name, int dst_port);
-    void check_valid_port(gr_io_signature_sptr sig, int port);
-    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);
-    std::string prepend_prefix(const std::string &prefix, const std::string 
&str);
-    void flatten(gr_simple_flowgraph_sptr sfg, const std::string &prefix = "");
-    gr_hier_endpoint match_endpoint(const std::string &name, int port, bool 
is_input);
-    gr_hier_endpoint resolve_endpoint(const std::string &name, int port, 
-                                 const std::string &prefix, bool is_input);
-    std::vector<std::string> calc_used_components();
+    void connect(gr_basic_block_sptr src, int src_port, 
+                 gr_basic_block_sptr dst, int dst_port);
+    void disconnect(gr_basic_block_sptr, int src_port, 
+                    gr_basic_block_sptr, int dst_port);
 
+    void flatten(gr_simple_flowgraph_sptr sfg);
+    gr_endpoint match_endpoint(const gr_endpoint &endp, bool is_input);
+    gr_endpoint resolve_endpoint(const gr_endpoint &endp, bool is_input);
+
 public:
     ~gr_hier_block2_detail();
 };

Modified: 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.cc
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.cc
     2007-04-12 05:29:07 UTC (rev 4968)
+++ 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.cc
     2007-04-12 07:27:31 UTC (rev 4969)
@@ -53,6 +53,19 @@
 }
 
 void
+gr_simple_flowgraph::connect(const gr_endpoint &src, const gr_endpoint &dst)
+{
+  d_detail->connect(src, dst);
+}
+
+void
+gr_simple_flowgraph::disconnect(gr_basic_block_sptr src_block, int src_port,
+                               gr_basic_block_sptr dst_block, int dst_port)
+{
+  d_detail->disconnect(gr_endpoint(src_block, src_port), 
gr_endpoint(dst_block, dst_port));
+}
+
+void
 gr_simple_flowgraph::validate()
 {
   d_detail->validate();

Modified: 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.h
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.h
      2007-04-12 05:29:07 UTC (rev 4968)
+++ 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.h
      2007-04-12 07:27:31 UTC (rev 4969)
@@ -58,6 +58,7 @@
 {
 private:
   friend class gr_runtime_impl;
+  friend class gr_hier_block2_detail;
   friend gr_simple_flowgraph_sptr gr_make_simple_flowgraph();
   gr_simple_flowgraph();
 
@@ -68,6 +69,9 @@
 
   void connect(gr_basic_block_sptr src_block, int src_port,
               gr_basic_block_sptr dst_block, int dst_port);
+  void connect(const gr_endpoint &src, const gr_endpoint &dst);
+  void disconnect(gr_basic_block_sptr src_block, int src_port,
+                 gr_basic_block_sptr dst_block, int dst_port);
   void validate();
 };
 

Modified: 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.i
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.i
      2007-04-12 05:29:07 UTC (rev 4968)
+++ 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.i
      2007-04-12 07:27:31 UTC (rev 4969)
@@ -38,6 +38,9 @@
   void connect(gr_block_sptr src_block, int src_port,
               gr_block_sptr dst_block, int dst_port)
     throw (std::invalid_argument);
+  void disconnect(gr_block_sptr src_block, int src_port,
+                 gr_block_sptr dst_block, int dst_port)
+    throw (std::invalid_argument);
   void validate()
     throw (std::runtime_error);
 };

Modified: 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.cc
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.cc
      2007-04-12 05:29:07 UTC (rev 4968)
+++ 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.cc
      2007-04-12 07:27:31 UTC (rev 4969)
@@ -70,6 +70,22 @@
 }
 
 void
+gr_simple_flowgraph_detail::disconnect(const gr_endpoint &src, const 
gr_endpoint &dst)
+{
+  if (GR_SIMPLE_FLOWGRAPH_DETAIL_DEBUG)
+    std::cout << "SFG disconnecting " << src << "->" << dst << std::endl;
+
+  for (gr_edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) {
+    if ((*p)->src().block() == src.block() && (*p)->src().port() == src.port() 
&&
+       (*p)->dst().block() == dst.block() && (*p)->dst().port() == dst.port())
+      d_edges.erase(p);
+    return;
+  }
+
+  throw std::runtime_error("edge to disconnect not found");
+}
+
+void
 gr_simple_flowgraph_detail::check_valid_port(gr_io_signature_sptr sig, int 
port)
 {
   if (port < 0)

Modified: 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.h
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.h
       2007-04-12 05:29:07 UTC (rev 4968)
+++ 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.h
       2007-04-12 07:27:31 UTC (rev 4969)
@@ -57,6 +57,7 @@
 private:
   friend class gr_simple_flowgraph;
   friend class gr_runtime_impl;
+  friend class gr_hier_block2_detail;
   friend class topo_block_cmp;
     
   gr_simple_flowgraph_detail() : d_blocks(), d_edges() { }
@@ -67,6 +68,7 @@
     
   void reset();
   void connect(const gr_endpoint &src, const gr_endpoint &dst);
+  void disconnect(const gr_endpoint &src, const gr_endpoint &dst);
   void check_valid_port(gr_io_signature_sptr sig, int port);
   void check_dst_not_used(const gr_endpoint &dst);
   void check_type_match(const gr_endpoint &src, const gr_endpoint &dst);

Modified: 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/python/gnuradio/gr/hier_block2.py
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/python/gnuradio/gr/hier_block2.py
      2007-04-12 05:29:07 UTC (rev 4968)
+++ 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/python/gnuradio/gr/hier_block2.py
      2007-04-12 07:27:31 UTC (rev 4969)
@@ -38,13 +38,20 @@
     def __getattr__(self, name):
        return getattr(self._hb, name)
 
-    def define_component(self, name, comp):
-       return self._hb.define_component(name, comp.basic_block())
+    def connect(self, src, src_port, dst, dst_port):
+        return self._hb.connect(src.basic_block(), src_port,
+                                dst.basic_block(), dst_port)
 
+    def disconnect(self, src, src_port, dst, dst_port):
+        return self._hb.disconnect(src.basic_block(), src_port,
+                                  dst.basic_block(), dst_port)
+
+
 # This allows the 'run_locked' methods, which are defined in gr_runtime.i,
 # to release the Python global interpreter lock before calling the actual
 # method in gr.runtime
-
+#
+# This probably should be elsewhere but it works here
 class runtime(object):
     def __init__(self, top_block):
         if (isinstance(top_block, hier_block2)):

Modified: 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
   2007-04-12 05:29:07 UTC (rev 4968)
+++ 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
   2007-04-12 07:27:31 UTC (rev 4969)
@@ -20,176 +20,123 @@
        self.assertEqual(1, hblock.output_signature().max_streams())
        self.assertEqual(gr.sizeof_int, 
hblock.output_signature().sizeof_stream_item(0))
 
-    def test_002_define_component(self):
+    def test_001_connect_internal(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
-       hblock.define_component("src", gr.null_source(gr.sizeof_int))
-       hblock.define_component("dst", gr.null_sink(gr.sizeof_int))
+       nop1 = gr.nop(gr.sizeof_int)
+       nop2 = gr.nop(gr.sizeof_int)
+       hblock.connect(nop1, 0, nop2, 0)
 
-    def test_003_define_component_reserved_input(self):
+    def test_002_connect_input(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
-       self.assertRaises(ValueError, 
-           lambda: hblock.define_component("self", gr.nop(gr.sizeof_int)))
-        self.assertRaises(ValueError,
-            lambda: hblock.define_component("NC", gr.nop(gr.sizeof_int)))
+       nop1 = gr.nop(gr.sizeof_int)
+       hblock.connect(hblock, 0, nop1, 0)
 
-    def test_004_define_component_illegal_character(self):
+    def test_003_connect_output(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
-       self.assertRaises(ValueError, 
-           lambda: hblock.define_component("nop.1", gr.nop(gr.sizeof_int)))
-        self.assertRaises(ValueError,
-            lambda: hblock.define_component("nop/1", gr.nop(gr.sizeof_int)))
+       nop1 = gr.nop(gr.sizeof_int)
+       hblock.connect(nop1, 0, hblock, 0)
 
-    def test_005_define_component_name_in_use(self):
+    def test_004_connect_invalid_src_port_neg(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
-       hblock.define_component("src", gr.null_source(gr.sizeof_int))
+       nop1 = gr.nop(gr.sizeof_int)
        self.assertRaises(ValueError, 
-           lambda: hblock.define_component("src", gr.null_sink(gr.sizeof_int)))
+           lambda: hblock.connect(hblock, -1, nop1, 0))
 
-    def test_006_connect_internal(self):
+    def test_005_connect_invalid_src_port_exceeds(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
-       hblock.define_component("nop1", gr.nop(gr.sizeof_int))
-       hblock.define_component("nop2", gr.nop(gr.sizeof_int))
-       hblock.connect("nop1", 0, "nop2", 0)
-
-    def test_007_connect_input(self):
-       hblock = gr.hier_block2("test_block", 
-                               gr.io_signature(1,1,gr.sizeof_int), 
-                               gr.io_signature(1,1,gr.sizeof_int))
-       hblock.define_component("nop1", gr.nop(gr.sizeof_int))
-       hblock.connect("self", 0, "nop1", 0)
-
-    def test_008_connect_output(self):
-       hblock = gr.hier_block2("test_block", 
-                               gr.io_signature(1,1,gr.sizeof_int), 
-                               gr.io_signature(1,1,gr.sizeof_int))
-       hblock.define_component("nop1", gr.nop(gr.sizeof_int))
-       hblock.connect("nop1", 0, "self", 0)
-
-    def test_009_connect_unknown_src(self):
-       hblock = gr.hier_block2("test_block", 
-                               gr.io_signature(1,1,gr.sizeof_int), 
-                               gr.io_signature(1,1,gr.sizeof_int))
        nop1 = gr.nop(gr.sizeof_int)
-       hblock.define_component("nop1", nop1)
        self.assertRaises(ValueError, 
-           lambda: hblock.connect("nop2", 0, "self", 0))
+           lambda: hblock.connect(hblock, 1, nop1, 0))
 
-    def test_010_connect_unknown_dst(self):
+    def test_006_connect_invalid_dst_port_neg(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
-       hblock.define_component("nop1", gr.nop(gr.sizeof_int))
+       nop1 = gr.nop(gr.sizeof_int)
        self.assertRaises(ValueError, 
-           lambda: hblock.connect("self", 0, "nop2", 0))
-
-    def test_011_connect_invalid_src_port_neg(self):
+           lambda: hblock.connect(hblock, 0, nop1, -1))
+           
+    def test_007_connect_invalid_dst_port_exceeds(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
-       hblock.define_component("nop1", gr.nop(gr.sizeof_int))
+       nop1 = gr.null_sink(gr.sizeof_int)
        self.assertRaises(ValueError, 
-           lambda: hblock.connect("self", -1, "nop1", 0))
+           lambda: hblock.connect(hblock, 0, nop1, 1))
 
-    def test_012_connect_invalid_src_port_exceeds(self):
+    def test_008_connect_dst_port_in_use(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
-       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), 
-                               gr.io_signature(1,1,gr.sizeof_int))
-       hblock.define_component("nop1", gr.nop(gr.sizeof_int))
-       self.assertRaises(ValueError, 
-           lambda: hblock.connect("self", -1, "nop1", 0))
-
-    def test_014_connect_invalid_dst_port_exceeds(self):
-       hblock = gr.hier_block2("test_block", 
-                               gr.io_signature(1,1,gr.sizeof_int), 
-                               gr.io_signature(1,1,gr.sizeof_int))
-       hblock.define_component("nop1", gr.nop(gr.sizeof_int))
-       self.assertRaises(ValueError, 
-           lambda: hblock.connect("self", 1, "nop1", 0))
-
-    def test_015_connect_dst_port_in_use(self):
-       hblock = gr.hier_block2("test_block", 
-                               gr.io_signature(1,1,gr.sizeof_int), 
-                               gr.io_signature(1,1,gr.sizeof_int))
        nop1 = gr.nop(gr.sizeof_int)
-       hblock.define_component("nop1", nop1)
-       hblock.connect("nop1", 0, "self", 0);
+       hblock.connect(nop1, 0, hblock, 0);
        self.assertRaises(ValueError, 
-           lambda: hblock.connect("nop1", 0, "self", 0))
+           lambda: hblock.connect(nop1, 0, hblock, 0))
 
-    def test_016_connect_one_src_two_dst(self):
+    def test_009_connect_one_src_two_dst(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
-       hblock.define_component("src", gr.null_source(gr.sizeof_int))
-       hblock.define_component("dst1", gr.null_sink(gr.sizeof_int))
-       hblock.define_component("dst2", gr.null_sink(gr.sizeof_int))
-       hblock.connect("src", 0, "dst1", 0)
-       hblock.connect("src", 0, "dst2", 0)
+       src = gr.null_source(gr.sizeof_int)
+       dst1 = gr.null_sink(gr.sizeof_int)
+       dst2 = gr.null_sink(gr.sizeof_int)
+       hblock.connect(src, 0, dst1, 0)
+       hblock.connect(src, 0, dst2, 0)
 
-    def test_017_connect_type_mismatch(self):
+    def test_010_connect_type_mismatch(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
-       hblock.define_component("nop1", gr.nop(gr.sizeof_char))
+       nop1 = gr.nop(gr.sizeof_char)
        self.assertRaises(ValueError, 
-           lambda: hblock.connect("nop1", 0, "self", 0))
+           lambda: hblock.connect(nop1, 0, hblock, 0))
 
-    def test_018_check_topology(self):
+    def test_011_check_topology(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(0,0,gr.sizeof_int), 
                                gr.io_signature(0,0,gr.sizeof_int))
        hblock.check_topology(0, 0);
 
-    def test_019_disconnect(self):
+    def test_012_disconnect(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
-       hblock.define_component("nop1", gr.nop(gr.sizeof_int))
-       hblock.define_component("nop2", gr.nop(gr.sizeof_int))
-       hblock.connect("nop1", 0, "nop2", 0)
-        hblock.disconnect("nop1", 0, "nop2", 0)
+       nop1 = gr.nop(gr.sizeof_int)
+       nop2 = gr.nop(gr.sizeof_int)
+       hblock.connect(nop1, 0, nop2, 0)
+        hblock.disconnect(nop1, 0, nop2, 0)
 
-    def test_020_disconnect_unknown(self):
+    def dont_test_013_disconnect_not_connected(self):
        hblock = gr.hier_block2("test_block", 
                                gr.io_signature(1,1,gr.sizeof_int), 
                                gr.io_signature(1,1,gr.sizeof_int))
-       hblock.define_component("nop1", gr.nop(gr.sizeof_int))
-       hblock.define_component("nop2", gr.nop(gr.sizeof_int))
-       hblock.connect("nop1", 0, "nop2", 0)
+       nop1 = gr.nop(gr.sizeof_int)
+       nop2 = gr.nop(gr.sizeof_int)
+       nop3 = gr.nop(gr.sizeof_int)
+       hblock.connect(nop1, 0, nop2, 0)
        self.assertRaises(ValueError, 
-           lambda: hblock.disconnect("nop1", 0, "foo", 0))
+           lambda: hblock.disconnect(nop1, 0, nop3, 0))
 
-    def test_021_run(self):
+    def dont_test_014_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))
-        hblock.define_component("src", gr.vector_source_f(expected, False))
+        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)
+        hblock.connect(src, 0, sink1, 0)
+        hblock.connect(src, 0, sink2, 0)
         runtime = gr.runtime(hblock)
         runtime.run()
         actual1 = sink1.data()
@@ -197,45 +144,19 @@
         self.assertEquals(expected, actual1)
         self.assertEquals(expected, actual2)
 
-    def test_022_connect_disconnect(self):
+    def dont_test_015_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))
-        hblock.define_component("src", gr.vector_source_f(expected, False))
+        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)
-        hblock.disconnect("src", 0, "sink2", 0)
-        hblock.connect("NC", 0, "sink2", 0)
+        hblock.connect(src, 0, sink1, 0)
+        hblock.connect(src, 0, sink2, 0)
+        hblock.disconnect(src, 0, sink2, 0)
         runtime = gr.runtime(hblock)
         runtime.run()
 
-    def dont_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()

Modified: 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/python/gnuradio/gr/qa_simple_flowgraph.py
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/python/gnuradio/gr/qa_simple_flowgraph.py
      2007-04-12 05:29:07 UTC (rev 4968)
+++ 
gnuradio/branches/developers/jcorgan/hier2/gnuradio-core/src/python/gnuradio/gr/qa_simple_flowgraph.py
      2007-04-12 07:27:31 UTC (rev 4969)
@@ -114,6 +114,15 @@
        sfg.connect(nop1, 2, dst2, 0)
        self.assertRaises(RuntimeError,
            lambda: sfg.validate ())
+
+    def dont_test_013_disconnect(self):
+       sfg = gr.simple_flowgraph()
+       nop1 = gr.nop(gr.sizeof_int)
+       nop2 = gr.nop(gr.sizeof_int)
+       nop3 = gr.nop(gr.sizeof_int)
+       sfg.connect(nop1, 0, nop2, 0)
+       self.assertRaises(RuntimeError,
+           lambda: sfg.disconnect(nop1, 0, nop3, 0))
                                                                                
       
 if __name__ == "__main__":
     gr_unittest.main()





reply via email to

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