commit-gnuradio
[Top][All Lists]
Advanced

[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()





reply via email to

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