commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] r3896 - in gnuradio/branches/developers/jcorgan/hier/g


From: jcorgan
Subject: [Commit-gnuradio] r3896 - in gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src: lib/runtime python/gnuradio/gr
Date: Mon, 30 Oct 2006 12:26:57 -0700 (MST)

Author: jcorgan
Date: 2006-10-30 12:26:57 -0700 (Mon, 30 Oct 2006)
New Revision: 3896

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_impl.cc
   
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2_impl.h
   
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
Log:
Work in progress.

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-10-30 03:58:35 UTC (rev 3895)
+++ 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2.cc
   2006-10-30 19:26:57 UTC (rev 3896)
@@ -26,6 +26,7 @@
 
 #include <gr_hier_block2.h>
 #include <gr_hier_block2_impl.h>
+#include <gr_io_signature.h>
 #include <iostream>
 
 gr_hier_block2_sptr gr_make_hier_block2(const std::string name, 
@@ -53,51 +54,43 @@
     d_impl->define_component(name, basic_block);
 }
 
-void gr_hier_block2::connect(const std::string from_name, int from_port, const 
std::string to_name, int to_port)
+void gr_hier_block2::connect(const std::string src_name, int src_port, const 
std::string dst_name, int dst_port)
 {
-    /* Need to validate the following:
+    gr_io_signature_sptr src_io_signature;
+    gr_io_signature_sptr dst_io_signature;
 
-       from_name is either "self-in" or a defined component (done)
-       to_name is either "self-out" or a defined component (done)
-       from_port is valid for from_name (done)
-       to_port is valid for to_name (done)
-       to_name:to_port is not already in use
-       from_name:from_port is same type as to_name:to_port
-    */
-
-    gr_basic_block_sptr from_block;
-    gr_basic_block_sptr to_block;
-    gr_io_signature_sptr from_io_signature;
-    gr_io_signature_sptr to_io_signature;
-
     // Check against our *input_signature* if we're wiring from one of our 
external inputs
-    if (from_name != "self-in") {
-       from_block = d_impl->lookup_component(from_name);
-       if (!from_block)
+    if (src_name != "self-in") {
+       gr_basic_block_sptr src_block = d_impl->lookup_component(src_name);
+       if (!src_block)
            throw std::invalid_argument("Undefined from name");
-       from_io_signature = from_block->output_signature();
+       src_io_signature = src_block->output_signature();
     }
-    else {
-       from_block = shared_from_this();
-       from_io_signature = input_signature();
-    }
+    else
+       src_io_signature = input_signature();
     
     // Check against our *output_signature* if we're wiring to one of our 
external outputs
-    if (to_name != "self-out") {
-       to_block = d_impl->lookup_component(to_name);
-       if (!to_block)
+    if (dst_name != "self-out") {
+       gr_basic_block_sptr dst_block = d_impl->lookup_component(dst_name);
+       if (!dst_block)
            throw std::invalid_argument("Undefined to name");
-       to_io_signature = to_block->output_signature();
+       dst_io_signature = dst_block->output_signature();
     }
-    else {
-       to_block = shared_from_this();
-       to_io_signature = output_signature();
-    }
+    else
+       dst_io_signature = output_signature();
     
     // Check port numbers are valid
-    d_impl->check_valid_port(from_io_signature, from_port);
-    d_impl->check_valid_port(to_io_signature, to_port);
+    d_impl->check_valid_port(src_io_signature, src_port);
+    d_impl->check_valid_port(dst_io_signature, dst_port);
 
     // Check destination port not already in use
-    d_impl->check_dest_not_used(from_block, from_port);
+    d_impl->check_dst_not_used(dst_name, dst_port);
+
+    // Make sure endpoints have the same stream size
+    if (src_io_signature->sizeof_stream_item(src_port) !=
+        dst_io_signature->sizeof_stream_item(dst_port))
+       throw std::invalid_argument("type mismatch");
+
+    gr_connection connection(gr_endpoint(src_name, src_port), 
gr_endpoint(dst_name, dst_port));
+    d_impl->d_connections.push_back(connection);
 }

Modified: 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2_impl.cc
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2_impl.cc
      2006-10-30 03:58:35 UTC (rev 3895)
+++ 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2_impl.cc
      2006-10-30 19:26:57 UTC (rev 3896)
@@ -81,7 +81,12 @@
        throw std::invalid_argument("port number exceeds max streams");
 }
 
-void gr_hier_block2_impl::check_dest_not_used(gr_basic_block_sptr dest_block, 
int port)
+void gr_hier_block2_impl::check_dst_not_used(const std::string name, int port)
 {
-    // NOP, QA should fail
+    for (std::vector<gr_connection>::const_iterator p = d_connections.begin();
+        p != d_connections.end(); p++) {
+
+       if (p->dst().name() == name && p->dst().port() == port)
+           throw std::invalid_argument("destination port in use");
+    }
 }

Modified: 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2_impl.h
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2_impl.h
       2006-10-30 03:58:35 UTC (rev 3895)
+++ 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2_impl.h
       2006-10-30 19:26:57 UTC (rev 3896)
@@ -27,6 +27,7 @@
 
 #include <gr_basic_block.h>
 #include <stdexcept>
+#include <iostream>
 
 // This beats the hell out of using pairs
 class gr_hier_component
@@ -43,6 +44,34 @@
     gr_basic_block_sptr basic_block() const { return d_basic_block; }
 };
 
+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) {}
+
+    std::string name() const { return d_name; }
+    int port() const { return d_port; }
+};
+
+class gr_connection
+{
+private:
+    gr_endpoint d_src;
+    gr_endpoint d_dst;
+    
+public:
+    gr_connection(gr_endpoint src, gr_endpoint dst)
+      : d_src(src), d_dst(dst) {}
+
+    gr_endpoint src() const { return d_src; }
+    gr_endpoint dst() const { return d_dst; }
+};
+
 class gr_hier_block2_impl
 {
 private:
@@ -54,15 +83,30 @@
     gr_hier_block2_impl &operator=(const gr_hier_block2_impl &rhs);
 
     std::vector<gr_hier_component> d_components;
-
+    std::vector<gr_connection> d_connections;
+    
     void define_component(const std::string &name, gr_basic_block_sptr 
basic_block);
     gr_basic_block_sptr lookup_component(const std::string &name);
     std::string lookup_component(gr_basic_block_sptr basic_block);
     void check_valid_port(gr_io_signature_sptr sig, int port);
-    void check_dest_not_used(gr_basic_block_sptr dest_block, int port);
+    void check_dst_not_used(const std::string name, int port);
                     
 public:
     ~gr_hier_block2_impl();
 };
 
+#if GR_HIER_BLOCK2_IMPL_DEBUG
+inline std::ostream &operator << (std::ostream &os, const gr_endpoint endpoint)
+{
+    os << endpoint.name() << ":" << endpoint.port();
+    return os;
+}
+
+inline std::ostream &operator << (std::ostream &os, const gr_connection 
connection)
+{
+    os << connection.src() << "->" << connection.dst();
+    return os;
+}
+#endif /* GR_HIER_BLOCK2_IMPL_DEBUG */
+
 #endif /* INCLUDED_GR_HIER_BLOCK2_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-10-30 03:58:35 UTC (rev 3895)
+++ 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
    2006-10-30 19:26:57 UTC (rev 3896)
@@ -160,6 +160,15 @@
        hblock.connect("nop1", 0, "self-out", 0);
        self.assertRaises(ValueError, lambda: hblock.connect("nop1", 0, 
"self-out", 0))
     
+    def test_017_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))
+
+       nop1 = gr.nop(gr.sizeof_char)
+       hblock.define_component("nop1", nop1)
+       self.assertRaises(ValueError, lambda: hblock.connect("nop1", 0, 
"self-out", 0))
     
+    
 if __name__ == "__main__":
     gr_unittest.main()





reply via email to

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