summaryrefslogtreecommitdiff
path: root/gnuradio-core/src/lib/runtime
diff options
context:
space:
mode:
authorTim O'Shea <tim.oshea753@gmail.com>2012-12-10 19:56:54 -0500
committerTom Rondeau <trondeau@vt.edu>2012-12-12 14:16:51 -0500
commit74817aee3eda6a8878b14e016091277d978b8cb5 (patch)
tree1f0917fa907529079a06de4dcd26795a4da5455e /gnuradio-core/src/lib/runtime
parent60c60b02cd1f22d7d52fcc5da313635fd8dbed01 (diff)
1. msg passing logic fix for fan-in to hier block outputs and fan-out from hier block inputs
2. adding hier msg passing example
Diffstat (limited to 'gnuradio-core/src/lib/runtime')
-rw-r--r--gnuradio-core/src/lib/runtime/gr_flat_flowgraph.cc25
-rw-r--r--gnuradio-core/src/lib/runtime/gr_flat_flowgraph.h1
-rw-r--r--gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc7
3 files changed, 30 insertions, 3 deletions
diff --git a/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.cc b/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.cc
index c19863f347..9294a5dca2 100644
--- a/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.cc
+++ b/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.cc
@@ -362,6 +362,22 @@ gr_flat_flowgraph::make_block_vector(gr_basic_block_vector_t &blocks)
}
+void gr_flat_flowgraph::clear_endpoint(const gr_msg_endpoint &e, bool is_src){
+ for(size_t i=0; i<d_msg_edges.size(); i++){
+ if(is_src){
+ if(d_msg_edges[i].src() == e){
+ d_msg_edges.erase(d_msg_edges.begin() + i);
+ i--;
+ }
+ } else {
+ if(d_msg_edges[i].dst() == e){
+ d_msg_edges.erase(d_msg_edges.begin() + i);
+ i--;
+ }
+ }
+ }
+}
+
void gr_flat_flowgraph::replace_endpoint(const gr_msg_endpoint &e, const gr_msg_endpoint &r, bool is_src){
size_t n_replr(0);
if(GR_FLAT_FLOWGRAPH_DEBUG)
@@ -369,16 +385,19 @@ void gr_flat_flowgraph::replace_endpoint(const gr_msg_endpoint &e, const gr_msg_
for(size_t i=0; i<d_msg_edges.size(); i++){
if(is_src){
if(d_msg_edges[i].src() == e){
- d_msg_edges[i] = gr_msg_edge(r, d_msg_edges[i].dst() );
+ if(GR_FLAT_FLOWGRAPH_DEBUG)
+ std::cout << boost::format("gr_flat_flowgraph::replace_endpoint() flattening to ( %s, %s )\n") % r.block()% d_msg_edges[i].dst().block();
+ d_msg_edges.push_back( gr_msg_edge(r, d_msg_edges[i].dst() ) );
n_replr++;
}
} else {
if(d_msg_edges[i].dst() == e){
- d_msg_edges[i] = gr_msg_edge(d_msg_edges[i].src(), r );
+ if(GR_FLAT_FLOWGRAPH_DEBUG)
+ std::cout << boost::format("gr_flat_flowgraph::replace_endpoint() flattening to ( %s, %s )\n") % r.block()% d_msg_edges[i].dst().block();
+ d_msg_edges.push_back( gr_msg_edge(d_msg_edges[i].src(), r ) );
n_replr++;
}
}
}
-// std::cout << "n_repl = " << n_repl <<"\n";
}
diff --git a/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.h b/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.h
index 52f2023347..5c8268d7df 100644
--- a/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.h
+++ b/gnuradio-core/src/lib/runtime/gr_flat_flowgraph.h
@@ -58,6 +58,7 @@ public:
static gr_block_vector_t make_block_vector(gr_basic_block_vector_t &blocks);
void replace_endpoint(const gr_msg_endpoint &e, const gr_msg_endpoint &r, bool is_src);
+ void clear_endpoint(const gr_msg_endpoint &e, bool is_src);
private:
gr_flat_flowgraph();
diff --git a/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc b/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
index e70553ddc1..add6da0248 100644
--- a/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
+++ b/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
@@ -498,6 +498,8 @@ gr_hier_block2_detail::flatten_aux(gr_flat_flowgraph_sptr sfg) const
if (GR_HIER_BLOCK2_DETAIL_DEBUG)
std::cout << "Flattening msg connections: " << std::endl;
+
+ std::vector<std::pair<gr_msg_endpoint, bool> > resolved_endpoints;
for(q = msg_edges.begin(); q != msg_edges.end(); q++) {
if (GR_HIER_BLOCK2_DETAIL_DEBUG)
std::cout << boost::format(" flattening edge ( %s, %s, %d) -> ( %s, %s, %d)\n") % q->src().block() % q->src().port() % q->src().is_hier() % q->dst().block() % q->dst().port() % q->dst().is_hier();
@@ -509,6 +511,7 @@ gr_hier_block2_detail::flatten_aux(gr_flat_flowgraph_sptr sfg) const
if (GR_HIER_BLOCK2_DETAIL_DEBUG)
std::cout << boost::format(" resolve hier output (%s, %s)") % q->dst().block() % q->dst().port() << std::endl;
sfg->replace_endpoint( q->dst(), q->src(), true );
+ resolved_endpoints.push_back(std::pair<gr_msg_endpoint, bool>(q->dst(),true));
normal_connection = false;
}
@@ -516,6 +519,7 @@ gr_hier_block2_detail::flatten_aux(gr_flat_flowgraph_sptr sfg) const
if (GR_HIER_BLOCK2_DETAIL_DEBUG)
std::cout << boost::format(" resolve hier input (%s, %s)") % q->src().block() % q->src().port() << std::endl;
sfg->replace_endpoint( q->src(), q->dst(), false );
+ resolved_endpoints.push_back(std::pair<gr_msg_endpoint, bool>(q->src(),false));
normal_connection = false;
}
@@ -524,6 +528,9 @@ gr_hier_block2_detail::flatten_aux(gr_flat_flowgraph_sptr sfg) const
sfg->connect( q->src(), q->dst() );
}
}
+ for(std::vector<std::pair<gr_msg_endpoint, bool> >::iterator it = resolved_endpoints.begin(); it != resolved_endpoints.end(); it++){
+ sfg->clear_endpoint( (*it).first, (*it).second );
+ }
/* // connect primitive edges in the new fg
for(q = msg_edges.begin(); q != msg_edges.end(); q++) {