diff options
author | Tim O'Shea <tim.oshea753@gmail.com> | 2012-12-10 19:56:54 -0500 |
---|---|---|
committer | Tom Rondeau <trondeau@vt.edu> | 2012-12-12 14:16:51 -0500 |
commit | 74817aee3eda6a8878b14e016091277d978b8cb5 (patch) | |
tree | 1f0917fa907529079a06de4dcd26795a4da5455e /gnuradio-core/src/lib/runtime | |
parent | 60c60b02cd1f22d7d52fcc5da313635fd8dbed01 (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.cc | 25 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_flat_flowgraph.h | 1 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc | 7 |
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++) { |