commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] r3991 - gnuradio/branches/developers/jcorgan/hier/gnur


From: jcorgan
Subject: [Commit-gnuradio] r3991 - gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime
Date: Thu, 16 Nov 2006 01:04:14 -0700 (MST)

Author: jcorgan
Date: 2006-11-16 01:04:14 -0700 (Thu, 16 Nov 2006)
New Revision: 3991

Modified:
   
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_basic_block.cc
   
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_basic_block.h
   
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2.h
   
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/lib/runtime/gr_runtime_impl.cc
Log:
Work in progress. Hierarchical validation complete.

Modified: 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_basic_block.cc
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_basic_block.cc
   2006-11-16 00:17:52 UTC (rev 3990)
+++ 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_basic_block.cc
   2006-11-16 08:04:14 UTC (rev 3991)
@@ -26,7 +26,6 @@
 
 #include <gr_basic_block.h>
 #include <stdexcept>
-#include <iostream>
 
 static long s_next_id = 0;
 static long s_ncurrently_allocated = 0;

Modified: 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_basic_block.h
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_basic_block.h
    2006-11-16 00:17:52 UTC (rev 3990)
+++ 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_basic_block.h
    2006-11-16 08:04:14 UTC (rev 3991)
@@ -119,4 +119,10 @@
 
 long gr_basic_block_ncurrently_allocated();
 
+inline std::ostream &operator << (std::ostream &os, gr_basic_block_sptr 
basic_block)
+{
+    os << basic_block->name() << "(" << basic_block->unique_id() << ")";
+    return os;
+}
+
 #endif /* INCLUDED_GR_BASIC_BLOCK_H */

Modified: 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2.h
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2.h
    2006-11-16 00:17:52 UTC (rev 3990)
+++ 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2.h
    2006-11-16 08:04:14 UTC (rev 3991)
@@ -71,10 +71,4 @@
     virtual bool validate();
 };
 
-inline std::ostream &operator << (std::ostream &os, gr_basic_block_sptr 
basic_block)
-{
-    os << basic_block->name() << "(" << basic_block->unique_id() << ")";
-    return os;
-}
-
 #endif /* INCLUDED_GR_HIER_BLOCK2_H */

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-11-16 00:17:52 UTC (rev 3990)
+++ 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2_impl.cc
      2006-11-16 08:04:14 UTC (rev 3991)
@@ -119,12 +119,33 @@
        For hierarchical blocks, we get here.  To be valid, we must check:
                
        1. Each of our inputs and outputs are wired according to our external
-          connectivity.
-       2. Each actually connected (sub)component has its input ports 
contiguously assigned
-       3. Each actually connected (sub)component has between min and max 
number of inputs connected
-       4. Each actually connected (sub)component has its output ports 
contiguously assigned
-       5. Each actually connected (sub)component has between min and max 
number of outputs connected
+          connectivity. This is already checked by our base class.
+       2. Each actually connected (sub)component has between min and max 
number of inputs connected
+       3. Each actually connected (sub)component has its input ports 
contiguously assigned
+       4. Each actually connected (sub)component has between min and max 
number of outputs connected
+       5. Each actually connected (sub)component has its output ports 
contiguously assigned
     */
+
+    // Only process actually connected blocks...
+    gr_basic_block_vector_t blocks(get_connected_blocks());
+
+    if (GR_HIER_BLOCK2_IMPL_DEBUG)
+       std::cout << "Found " << blocks.size() << " connected blocks." << 
std::endl;
+
+    bool ok = true;
+    for (gr_basic_block_viter_t p = blocks.begin();
+        p != blocks.end(); p++) {
+
+       std::string name = get_name_by_block(*p);
+       if (GR_HIER_BLOCK2_IMPL_DEBUG)
+           std::cout << "Checking connectivity of child component " 
+                     << get_name_by_block(*p) << std::endl;
+
+       ok &= check_contiguity(*p, true);       // inputs
+       ok &= check_contiguity(*p, false);      // outputs
+    }
+
+    return ok;
 }
 
 bool
@@ -163,10 +184,6 @@
            if (block_iter == blocks.end())
                blocks.push_back(dst_block);
     }
-
-    if (GR_HIER_BLOCK2_IMPL_DEBUG)
-       std::cout << "Found " << blocks.size() << " connected blocks." << 
std::endl;
-
     return blocks;
 }
 
@@ -177,8 +194,8 @@
     if (name == "")
        throw std::invalid_argument("unknown child passed to parent");
 
-    ninputs = calc_input_connections(name).size();
-    noutputs = calc_output_connections(name).size();
+    ninputs = calc_connections(name, true).size();
+    noutputs = calc_connections(name, false).size();
 
     if (GR_HIER_BLOCK2_IMPL_DEBUG)
        std::cout << name << " has " << ninputs << " inputs and " 
@@ -186,29 +203,82 @@
 }
 
 gr_connection_vector_t
-gr_hier_block2_impl::calc_input_connections(std::string &name)
+gr_hier_block2_impl::calc_connections(const std::string &name, bool dir)
 {
     gr_connection_vector_t result;
     for (gr_connection_viter_t p = d_connections.begin();
          p != d_connections.end(); p++) {
 
-       if (p->dst().name() == name)
-           result.push_back(*p);
+       if (dir) {
+           if (p->dst().name() == name)
+               result.push_back(*p);
+       }
+       else {
+           if (p->src().name() == name)
+               result.push_back(*p);
+       }
     }
     
     return result;
 }
 
-gr_connection_vector_t
-gr_hier_block2_impl::calc_output_connections(std::string &name)
+bool
+gr_hier_block2_impl::check_contiguity(gr_basic_block_sptr block, bool dir)
 {
-    gr_connection_vector_t result;
-    for (gr_connection_viter_t p = d_connections.begin();
-         p != d_connections.end(); p++) {
+    gr_io_signature_sptr sig = 
+       dir ? block->input_signature() : block->output_signature();
+       
+    std::string name(get_name_by_block(block));
 
-       if (p->src().name() == name)
-           result.push_back(*p);
+    std::vector<int> used_ports;
+    calc_used_ports(calc_connections(name, dir), used_ports, dir);
+
+    int nports = used_ports.size();
+    int min_ports = sig->min_streams();
+    
+    if (GR_HIER_BLOCK2_IMPL_DEBUG)
+       std::cout << "Block " << block << " has " << nports 
+                 << " used " << (dir ? "inputs.":"outputs.") << std::endl;
+
+    // If none used, just make sure that's ok and exit
+    if (nports == 0) {
+       if (min_ports == 0)
+           return true;
+        else {
+           if (GR_HIER_BLOCK2_IMPL_DEBUG)
+               std::cout << "Block " << block << " needs " << min_ports 
+                         << (dir ? "inputs":"outputs") << ", only has "
+                         << nports << std::endl;
+           return false;
+       }
     }
-    
-    return result;
+
+    if (used_ports[nports-1]+1 != nports) {
+       for (int i = 0; i < nports; i++) {
+           if (used_ports[i] != i) {
+               if (GR_HIER_BLOCK2_IMPL_DEBUG)
+                   std::cout << "Block " << block << " missing " 
+                             << (dir ? "input ":"output ") 
+                             << i << std::endl;
+               
+               throw std::invalid_argument("block is missing input 
assignment");
+           }
+       }
+    }
+
+    return true;
 }
+
+void
+gr_hier_block2_impl::calc_used_ports(gr_connection_vector_t connections, 
+                                     std::vector<int> &used_ports, bool dir)
+{
+    for (gr_connection_viter_t p = connections.begin();
+        p != connections.end(); p++) {
+
+       if (dir == true)  // check inputs
+           used_ports.push_back(p->dst().port());
+       else              // check outputs
+           used_ports.push_back(p->src().port());
+    }    
+}

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-11-16 00:17:52 UTC (rev 3990)
+++ 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_hier_block2_impl.h
       2006-11-16 08:04:14 UTC (rev 3991)
@@ -96,8 +96,10 @@
     bool visit(gr_tree_visitor &visitor);
     bool validate();
     void get_child_topology(gr_basic_block_sptr child, int &ninputs, int 
&noutputs);
-    gr_connection_vector_t calc_input_connections(std::string &name);
-    gr_connection_vector_t calc_output_connections(std::string &name);
+    gr_connection_vector_t calc_connections(const std::string &name, bool dir);
+    void calc_used_ports(gr_connection_vector_t connections,
+                        std::vector<int> &used_ports, bool dir); // 
true=inputs, false=outputs
+    bool check_contiguity(gr_basic_block_sptr block, bool dir);
                                         
 public:
     ~gr_hier_block2_impl();

Modified: 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_runtime_impl.cc
===================================================================
--- 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_runtime_impl.cc
  2006-11-16 00:17:52 UTC (rev 3990)
+++ 
gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime/gr_runtime_impl.cc
  2006-11-16 08:04:14 UTC (rev 3991)
@@ -45,7 +45,11 @@
 {
 public:
     virtual bool visit(gr_basic_block_sptr block)
-       { return block->validate(); }
+    { 
+       if (GR_RUNTIME_IMPL_DEBUG)
+           std::cout << "Validating block: " << block << std::endl;
+       return block->validate(); 
+    }
 };
 
 void 





reply via email to

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