commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] r4498 - in gnuradio/branches/developers/jcorgan/sfg/gn


From: jcorgan
Subject: [Commit-gnuradio] r4498 - in gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src: lib/runtime python/gnuradio/gr
Date: Sun, 18 Feb 2007 09:35:04 -0700 (MST)

Author: jcorgan
Date: 2007-02-18 09:35:04 -0700 (Sun, 18 Feb 2007)
New Revision: 4498

Modified:
   
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
   
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 03:20:14 UTC (rev 4497)
+++ 
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
     2007-02-18 16:35:04 UTC (rev 4498)
@@ -32,80 +32,82 @@
 #define GR_HIER_BLOCK2_DETAIL_DEBUG 1
 
 gr_hier_block2_detail::gr_hier_block2_detail(gr_hier_block2 *owner) :
-d_owner(owner)
+  d_owner(owner)
 {
 }
 
 gr_hier_block2_detail::~gr_hier_block2_detail()
 {
-    d_owner = 0; // Don't use delete, we didn't allocate
+  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();
+  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)
 {
-    if (!block)
-       throw std::invalid_argument("null block passed");
+  if (!block)
+    throw std::invalid_argument("null block passed");
 
-    if (name == "self")
-        throw std::invalid_argument("name is reserved");
+  if (name == "self" || name == "NC")
+    throw std::invalid_argument("name is reserved");
 
-    // TODO: reject names with '.' inside
-    
-    if (!lookup_block(name))
-        d_components[name] = block;
-    else
-        throw std::invalid_argument("name already in use");
+  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");
 }
 
 void 
 gr_hier_block2_detail::connect(const std::string &src_name, int src_port, 
                                const std::string &dst_name, int dst_port)
 {
-    gr_io_signature_sptr src_io_signature;
-    gr_io_signature_sptr dst_io_signature;
+  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 == "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 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();
+  }
     
-    // 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();
-    }
+  // 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();
+  }
     
-    // Check port numbers are valid
-    check_valid_port(src_io_signature, src_port);
-    check_valid_port(dst_io_signature, 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 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);
+  // Check endpoint types match
+  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));
+  d_edges.push_back(gr_make_edge(src_name, src_port, dst_name, dst_port));
 }
 
 void 
@@ -128,119 +130,119 @@
 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 (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");
+  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_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");
+  for (gr_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");
+  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;
+  return prefix + ((prefix == "") ? "" : ".") + str;
 }
 
 gr_endpoint
 gr_hier_block2_detail::match_endpoint(const std::string &name, int port, bool 
is_input)
 {
-    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 resolve_endpoint((*p)->dst_name(), (*p)->dst_port(), 
"", !is_input);
-           }
-        else {
-            if ((*p)->dst_name() == name && (*p)->dst_port() == port)
-                return resolve_endpoint((*p)->src_name(), (*p)->src_port(), 
"", !is_input);
-        }
+  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 resolve_endpoint((*p)->dst_name(), (*p)->dst_port(), "", 
!is_input);
     }
+    else {
+      if ((*p)->dst_name() == name && (*p)->dst_port() == port)
+       return resolve_endpoint((*p)->src_name(), (*p)->src_port(), "", 
!is_input);
+    }
+  }
 
-    // Should never get here
-    throw std::runtime_error("unable to match endpoint");
+  // Should never get here
+  throw std::runtime_error("unable to match endpoint");
 }
 
 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);
+  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 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());
-    }
+  // 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");
+  // 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)
 {
-    flatten_components(sfg, prefix);
-    flatten_edges(sfg, prefix);
+  flatten_components(sfg, prefix);
+  flatten_edges(sfg, prefix);
 }
 
 void
 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);
+  // 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);
 
-        gr_basic_block_sptr basic_block = p->second;
-        gr_block_sptr block(boost::dynamic_pointer_cast<gr_block, 
gr_basic_block>(basic_block));
-        if (block)     
-            sfg->define_component(name, block);
+    gr_basic_block_sptr basic_block = p->second;
+    gr_block_sptr block(boost::dynamic_pointer_cast<gr_block, 
gr_basic_block>(basic_block));
+    if (block) 
+      sfg->define_component(name, block);
 
-        gr_hier_block2_sptr 
hier_block2(boost::dynamic_pointer_cast<gr_hier_block2, 
gr_basic_block>(basic_block));
-        if (hier_block2)
-            hier_block2->d_detail->flatten_components(sfg, name);
-    }
+    gr_hier_block2_sptr 
hier_block2(boost::dynamic_pointer_cast<gr_hier_block2, 
gr_basic_block>(basic_block));
+    if (hier_block2)
+      hier_block2->d_detail->flatten_components(sfg, name);
+  }
 }
 
 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 actually 
connected
-        if ((*p)->src_name() == "self" || (*p)->dst_name() == "self")
-            continue;
+  // 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 actually connected
+    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());
-    }
+    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->d_detail->flatten_edges(sfg, prepend_prefix(prefix, 
p->first));
-    }
+  // 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->d_detail->flatten_edges(sfg, prepend_prefix(prefix, 
p->first));
+  }
 }

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 03:20:14 UTC (rev 4497)
+++ 
gnuradio/branches/developers/jcorgan/sfg/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
     2007-02-18 16:35:04 UTC (rev 4498)
@@ -33,11 +33,22 @@
                                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)))
 
-    def test_004_define_component_name_in_use(self):
+    def test_004_define_component_illegal_character(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)))
+
+    def test_005_define_component_name_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("src", gr.null_source(gr.sizeof_int))
        self.assertRaises(ValueError, 
            lambda: hblock.define_component("src", gr.null_sink(gr.sizeof_int)))





reply via email to

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