diff options
-rw-r--r-- | gnuradio-runtime/lib/hier_block2_detail.cc | 40 | ||||
-rw-r--r-- | gnuradio-runtime/lib/hier_block2_detail.h | 1 |
2 files changed, 41 insertions, 0 deletions
diff --git a/gnuradio-runtime/lib/hier_block2_detail.cc b/gnuradio-runtime/lib/hier_block2_detail.cc index 60910d0dd9..0d0ddf55ba 100644 --- a/gnuradio-runtime/lib/hier_block2_detail.cc +++ b/gnuradio-runtime/lib/hier_block2_detail.cc @@ -328,11 +328,45 @@ namespace gr { } void + hier_block2_detail::refresh_io_signature() + { + int min_inputs = d_owner->input_signature()->min_streams(); + int max_inputs = d_owner->input_signature()->max_streams(); + int min_outputs = d_owner->output_signature()->min_streams(); + int max_outputs = d_owner->output_signature()->max_streams(); + + if(max_inputs == io_signature::IO_INFINITE || + max_outputs == io_signature::IO_INFINITE || + (min_inputs != max_inputs) ||(min_outputs != max_outputs) ) { + std::stringstream msg; + msg << "Hierarchical blocks do not yet support arbitrary or" + << " variable numbers of inputs or outputs (" << d_owner->name() << ")"; + throw std::runtime_error(msg.str()); + } + + // Check for # input change + if ((signed)d_inputs.size() != max_inputs) + { + d_inputs.resize(max_inputs); + } + + // Check for # output change + if ((signed)d_outputs.size() != max_outputs) + { + d_outputs.resize(max_outputs); + d_min_output_buffer.resize(max_outputs, 0); + d_max_output_buffer.resize(max_outputs, 0); + } + } + + void hier_block2_detail::connect_input(int my_port, int port, basic_block_sptr block) { std::stringstream msg; + refresh_io_signature(); + if(my_port < 0 || my_port >= (signed)d_inputs.size()) { msg << "input port " << my_port << " out of range for " << block; throw std::invalid_argument(msg.str()); @@ -356,6 +390,8 @@ namespace gr { { std::stringstream msg; + refresh_io_signature(); + if(my_port < 0 || my_port >= (signed)d_outputs.size()) { msg << "output port " << my_port << " out of range for " << block; throw std::invalid_argument(msg.str()); @@ -376,6 +412,8 @@ namespace gr { { std::stringstream msg; + refresh_io_signature(); + if(my_port < 0 || my_port >= (signed)d_inputs.size()) { msg << "input port number " << my_port << " out of range for " << block; throw std::invalid_argument(msg.str()); @@ -399,6 +437,8 @@ namespace gr { { std::stringstream msg; + refresh_io_signature(); + if(my_port < 0 || my_port >= (signed)d_outputs.size()) { msg << "output port number " << my_port << " out of range for " << block; throw std::invalid_argument(msg.str()); diff --git a/gnuradio-runtime/lib/hier_block2_detail.h b/gnuradio-runtime/lib/hier_block2_detail.h index 8c38c3754a..a5584fe92a 100644 --- a/gnuradio-runtime/lib/hier_block2_detail.h +++ b/gnuradio-runtime/lib/hier_block2_detail.h @@ -71,6 +71,7 @@ namespace gr { endpoint_vector_t d_outputs; // Single internal endpoint per external output basic_block_vector_t d_blocks; + void refresh_io_signature(); void connect_input(int my_port, int port, basic_block_sptr block); void connect_output(int my_port, int port, basic_block_sptr block); void disconnect_input(int my_port, int port, basic_block_sptr block); |