summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnuradio-runtime/lib/hier_block2_detail.cc40
-rw-r--r--gnuradio-runtime/lib/hier_block2_detail.h1
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);