[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r3991 - gnuradio/branches/developers/jcorgan/hier/gnuradio-core/src/lib/runtime,
jcorgan <=