commit-gnuradio
[Top][All Lists]
Advanced

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

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


From: jcorgan
Subject: [Commit-gnuradio] r4012 - in gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src: lib/runtime python/gnuradio/gr
Date: Tue, 21 Nov 2006 13:22:13 -0700 (MST)

Author: jcorgan
Date: 2006-11-21 13:22:13 -0700 (Tue, 21 Nov 2006)
New Revision: 4012

Modified:
   
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.cc
   
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.h
   
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.i
   
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_simple_flowgraph.py
Log:
Work in progress.

Modified: 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.cc
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.cc
      2006-11-21 18:18:24 UTC (rev 4011)
+++ 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.cc
      2006-11-21 20:22:13 UTC (rev 4012)
@@ -60,3 +60,9 @@
 {
     d_detail->validate();
 }
+
+void
+gr_simple_flowgraph::setup_connections()
+{
+    d_detail->setup_connections();
+}

Modified: 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.h
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.h
       2006-11-21 18:18:24 UTC (rev 4011)
+++ 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.h
       2006-11-21 20:22:13 UTC (rev 4012)
@@ -48,6 +48,7 @@
     void connect(const std::string &src, int src_port, 
                 const std::string &dst, int dst_port);
     void validate();
+    void setup_connections();
 };
 
 #endif /* INCLUDED_GR_SIMPLE_FLOWGRAPH_H */

Modified: 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.i
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.i
       2006-11-21 18:18:24 UTC (rev 4011)
+++ 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph.i
       2006-11-21 20:22:13 UTC (rev 4012)
@@ -42,4 +42,6 @@
        throw (std::invalid_argument);
     void validate()
        throw (std::runtime_error);
+    void setup_connections()
+       throw (std::runtime_error);
 };

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-21 18:18:24 UTC (rev 4011)
+++ 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.cc
       2006-11-21 20:22:13 UTC (rev 4012)
@@ -27,6 +27,8 @@
 #include <gr_simple_flowgraph.h>
 #include <gr_simple_flowgraph_detail.h>
 #include <gr_io_signature.h>
+#include <gr_block_detail.h>
+#include <gr_buffer.h>
 #include <iostream>
 #include <stdexcept>
 
@@ -211,7 +213,104 @@
 {
     if (GR_SIMPLE_FLOWGRAPH_DETAIL_DEBUG)
        std::cout << "Checking " << (check_inputs ? "input " : "output ")
-                 << "contiguity..." << std::endl;
+                 << "contiguity...";
 
-    // Incomplete, do stuff here
+    gr_io_signature_sptr sig = 
+       check_inputs ? block->input_signature() : block->output_signature();
+
+    int nports = used_ports.size();
+    int min_ports = sig->min_streams();
+    
+    if (nports == 0) {
+       if (min_ports == 0) {
+           if (GR_SIMPLE_FLOWGRAPH_DETAIL_DEBUG)
+               std::cout << "ok." << std::endl;
+           return;
+       }
+       else {
+           if (GR_SIMPLE_FLOWGRAPH_DETAIL_DEBUG)
+               std::cout << "needs " << min_ports << ", only has " 
+                         << nports << std::endl;
+           
+           throw std::runtime_error("insufficient ports");
+       }
+    }
+
+    if (used_ports[nports-1]+1 != nports) {
+       for (int i = 0; i < nports; i++) {
+           if (used_ports[i] != i) {
+               if (GR_SIMPLE_FLOWGRAPH_DETAIL_DEBUG)
+                   std::cout << "missing " << (check_inputs ? "input ":"output 
")
+                             << i << std::endl;
+
+               throw std::runtime_error("missing input assignment");
+           }
+       }
+    }
+
+    if (GR_SIMPLE_FLOWGRAPH_DETAIL_DEBUG)
+       std::cout << "ok." << std::endl;
 }
+
+void
+gr_simple_flowgraph_detail::setup_connections()
+{
+    // Assign block details to component blocks
+    for (gr_component_miter_t p = d_components.begin(); p != 
d_components.end(); p++) {
+        if (GR_SIMPLE_FLOWGRAPH_DETAIL_DEBUG)
+           std::cout << "Assigning details to " << p->first << "..." << 
std::endl;
+
+       int ninputs = calc_used_ports(p->first, true).size();
+       int noutputs = calc_used_ports(p->first, false).size();
+       gr_block_detail_sptr detail = gr_make_block_detail(ninputs, noutputs);
+       for (int i = 0; i < noutputs; i++)
+           detail->set_output(i, allocate_buffer(p->first, i));
+       p->second->set_detail(detail);
+    }
+
+    // Connect inputs to outputs
+}
+
+gr_buffer_sptr
+gr_simple_flowgraph_detail::allocate_buffer(const std::string &name, int port)
+{
+    gr_block_sptr block = lookup_block(name);
+    int item_size = block->output_signature()->sizeof_stream_item(port);
+    int nitems = s_fixed_buffer_size/item_size;
+    
+    // Make sure there are at least twice the output_multiple no. of items
+    if (nitems < 2*block->output_multiple())   // Note: this means 
output_multiple()
+       nitems = 2*block->output_multiple();    // can't be changed by block 
dynamically
+
+    // If any downstream blocks are decimators and/or have a large 
output_multiple,
+    // ensure we have a buffer at least twice their decimation 
factor*output_multiple
+    gr_block_vector_t blocks = calc_downstream_blocks(name, port);
+    for (gr_block_viter_t p = blocks.begin(); p != blocks.end(); p++) {
+       int decimation = (int)(1.0/(*p)->relative_rate());
+       int multiple   = (*p)->output_multiple();
+       int history    = (*p)->history();
+       nitems = std::max(nitems, 2*(decimation*multiple+history));
+    }
+                                           
+    if (GR_SIMPLE_FLOWGRAPH_DETAIL_DEBUG)
+       std::cout << "Allocating buffer for port " << port << " with "
+                 << nitems << " items of size " << item_size << std::endl;
+        
+    return gr_make_buffer(nitems, item_size);
+}
+
+gr_block_vector_t
+gr_simple_flowgraph_detail::calc_downstream_blocks(const std::string &name, 
int port)
+{
+    gr_block_vector_t tmp, result;
+    std::insert_iterator<gr_block_vector_t> inserter(result, result.begin());
+               
+    for (gr_edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++)
+       if ((*p)->src_name() == name && (*p)->src_port() == port)
+           tmp.push_back(lookup_block((*p)->dst_name()));
+                                   
+    // Remove duplicates
+    sort(tmp.begin(), tmp.end());
+    unique_copy(tmp.begin(), tmp.end(), inserter);
+    return result;
+}

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-21 18:18:24 UTC (rev 4011)
+++ 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_simple_flowgraph_detail.h
        2006-11-21 20:22:13 UTC (rev 4012)
@@ -26,6 +26,8 @@
 #include <gr_block.h>
 #include <map>
 
+#define GR_FIXED_BUFFER_SIZE (32*(1L<<10))
+
 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;
 
@@ -66,6 +68,7 @@
 
     gr_component_map_t d_components;
     gr_edge_vector_t   d_edges;
+    static const unsigned int s_fixed_buffer_size = GR_FIXED_BUFFER_SIZE;
     
     void define_component(const std::string &name, gr_block_sptr block);    
     void connect(const std::string &src, int src_port, 
@@ -83,7 +86,10 @@
     void check_contiguity(gr_block_sptr block, 
                           const std::vector<int> &used_ports, 
                           bool check_inputs);
-                         
+    void setup_connections();
+    gr_buffer_sptr allocate_buffer(const std::string &name, int port);
+    gr_block_vector_t calc_downstream_blocks(const std::string &name, int 
port);
+    
 public:
     ~gr_simple_flowgraph_detail();
 };

Modified: 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/python/gnuradio/gr/qa_simple_flowgraph.py
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/python/gnuradio/gr/qa_simple_flowgraph.py
       2006-11-21 18:18:24 UTC (rev 4011)
+++ 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/python/gnuradio/gr/qa_simple_flowgraph.py
       2006-11-21 20:22:13 UTC (rev 4012)
@@ -155,6 +155,18 @@
        #self.assertRaises(RuntimeError,
        #    lambda: sfg.disconnect("src1", 0, "nop1", 1))
                                                                                
       
-    
+    def test_018_setup(self):
+       sfg = gr.simple_flowgraph()
+       sfg.define_component("src1", gr.null_source (gr.sizeof_int))
+       sfg.define_component("nop1", gr.nop (gr.sizeof_int))
+       sfg.define_component("dst1", gr.null_sink (gr.sizeof_int))
+       sfg.define_component("dst2", gr.null_sink (gr.sizeof_int))
+       sfg.connect("src1", 0, "nop1", 0)
+       sfg.connect("src1", 0, "nop1", 1)
+       sfg.connect("nop1", 0, "dst1", 0)
+       sfg.connect("nop1", 1, "dst2", 0)
+       sfg.validate ()
+       sfg.setup_connections()
+           
 if __name__ == "__main__":
     gr_unittest.main()





reply via email to

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