diff options
author | Marcus Müller <marcus@hostalia.de> | 2018-08-23 19:31:42 +0200 |
---|---|---|
committer | Marcus Müller <marcus@hostalia.de> | 2018-08-23 19:31:42 +0200 |
commit | 75b4ae3d2a64cbf9b3dc473f5821aaf1997b4a6c (patch) | |
tree | 31b6bd0deaceba43b95cb2ee326ee5ab80ef774c | |
parent | 8c8f166d8383c39bdcacdf8ecf28cfd4eca4452f (diff) | |
parent | 3144094136393ceef099528117390b16f800da7d (diff) |
Merge branch 'tag_fix4'
This converts the floating point-based tag offset calculation to a
rational-numbers high precision approach.
It introduces a dependency on GMP (or MPIR, on Windows).
73 files changed, 387 insertions, 486 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index f6e1448ec3..382f1b5ebc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -507,6 +507,11 @@ list(APPEND GR_TEST_PYTHON_DIRS # installed code to import the same names, so we have to grab from the # binary directory first. +# gnuradio-runtime/include/gnuradio/block.h needs a define to tell it which +# multiprecision arithmetic library header to include +find_package(MPLIB) +add_definitions(${MPLIB_DEFINITIONS}) + ######################################################################## # Add subdirectories (in order of deps) ######################################################################## diff --git a/cmake/Modules/FindGMP.cmake b/cmake/Modules/FindGMP.cmake new file mode 100644 index 0000000000..8782334e80 --- /dev/null +++ b/cmake/Modules/FindGMP.cmake @@ -0,0 +1,45 @@ +include(FindPkgConfig) +pkg_check_modules(PC_GMP "gmp") + +set(GMP_DEFINITIONS ${PC_GMP_CFLAGS_OTHER}) + +find_path( + GMP_INCLUDE_DIR + NAMES gmpxx.h + HINTS ${PC_GMP_INCLUDEDIR} + PATHS ${CMAKE_INSTALL_PREFIX}/include + /usr/local/include + /usr/include +) +set(GMP_INCLUDE_DIRS ${GMP_INCLUDE_DIR}) +set(GMP_PC_ADD_CFLAGS "-I${GMP_INCLUDE_DIR}") + +find_library( + GMPXX_LIBRARY + NAMES gmpxx + HINTS ${PC_GMP_LIBDIR} + PATHS ${CMAKE_INSTALL_PREFIX}/lib + ${CMAKE_INSTALL_PREFIX}/lib64 + /usr/local/lib + /usr/local/lib64 + /usr/lib + /usr/lib64 +) + +find_library( + GMP_LIBRARY + NAMES gmp + HINTS ${PC_GMP_LIBDIR} + PATHS ${CMAKE_INSTALL_PREFIX}/lib + ${CMAKE_INSTALL_PREFIX}/lib64 + /usr/local/lib + /usr/local/lib64 + /usr/lib + /usr/lib64 +) +set(GMP_LIBRARIES ${GMPXX_LIBRARY} ${GMP_LIBRARY}) +set(GMP_PC_ADD_LIBS "-lgmpxx -lgmp") + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(GMP DEFAULT_MSG GMPXX_LIBRARY GMP_LIBRARY GMP_INCLUDE_DIR) +mark_as_advanced(GMPXX_LIBRARY GMP_LIBRARY GMP_INCLUDE_DIR) diff --git a/cmake/Modules/FindMPIR.cmake b/cmake/Modules/FindMPIR.cmake new file mode 100644 index 0000000000..647b3815a4 --- /dev/null +++ b/cmake/Modules/FindMPIR.cmake @@ -0,0 +1,45 @@ +include(FindPkgConfig) +pkg_check_modules(PC_MPIR "mpir >= 3.0") + +set(MPIR_DEFINITIONS ${PC_MPIR_CFLAGS_OTHER}) + +find_path( + MPIR_INCLUDE_DIR + NAMES mpirxx.h + HINTS ${PC_MPIR_INCLUDEDIR} + PATHS ${CMAKE_INSTALL_PREFIX}/include + /usr/local/include + /usr/include +) +set(MPIR_INCLUDE_DIRS ${MPIR_INCLUDE_DIR}) +set(MPIR_PC_ADD_CFLAGS "-I${MPIR_INCLUDE_DIR}") + +find_library( + MPIRXX_LIBRARY + NAMES mpirxx + HINTS ${PC_MPIR_LIBDIR} + PATHS ${CMAKE_INSTALL_PREFIX}/lib + ${CMAKE_INSTALL_PREFIX}/lib64 + /usr/local/lib + /usr/local/lib64 + /usr/lib + /usr/lib64 +) + +find_library( + MPIR_LIBRARY + NAMES mpir + HINTS ${PC_MPIR_LIBDIR} + PATHS ${CMAKE_INSTALL_PREFIX}/lib + ${CMAKE_INSTALL_PREFIX}/lib64 + /usr/local/lib + /usr/local/lib64 + /usr/lib + /usr/lib64 +) +set(MPIR_LIBRARIES ${MPIRXX_LIBRARY} ${MPIR_LIBRARY}) +set(MPIR_PC_ADD_LIBS "-lmpirxx -lmpir") + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(MPIR DEFAULT_MSG MPIRXX_LIBRARY MPIR_LIBRARY MPIR_INCLUDE_DIR) +mark_as_advanced(MPIRXX_LIBRARY MPIR_LIBRARY MPIR_INCLUDE_DIR) diff --git a/cmake/Modules/FindMPLIB.cmake b/cmake/Modules/FindMPLIB.cmake new file mode 100644 index 0000000000..2f4ec8c689 --- /dev/null +++ b/cmake/Modules/FindMPLIB.cmake @@ -0,0 +1,27 @@ +find_package(GMP) +find_package(MPIR) + +if(GMP_FOUND) + set(GR_MPLIB_GMP True) + set(MPLIB_DEFINITIONS "-DGR_MPLIB_GMP" ${GMP_DEFINITIONS}) + set(MPLIB_INCLUDE_DIR ${GMP_INCLUDE_DIR}) + set(MPLIB_LIBRARY ${GMP_LIBRARY}) + set(MPLIBXX_LIBRARY ${GMPXX_LIBRARY}) + set(MPLIB_PC_ADD_CFLAGS ${GMP_PC_ADD_CFLAGS}) + set(MPLIB_PC_ADD_LIBS ${GMP_PC_ADD_LIBS}) +else(GMP_FOUND) + set(GR_MPLIB_MPIR True) + set(MPLIB_DEFINITIONS "-DGR_MPLIB_MPIR" ${MPIR_DEFINITIONS}) + set(MPLIB_INCLUDE_DIR ${MPIR_INCLUDE_DIR}) + set(MPLIB_LIBRARY ${MPIR_LIBRARY}) + set(MPLIBXX_LIBRARY ${MPIRXX_LIBRARY}) + set(MPLIB_PC_ADD_CFLAGS ${MPIR_PC_ADD_CFLAGS}) + set(MPLIB_PC_ADD_LIBS ${MPIR_PC_ADD_LIBS}) +endif(GMP_FOUND) + +set(MPLIB_INCLUDE_DIRS ${MPLIB_INCLUDE_DIR}) +set(MPLIB_LIBRARIES ${MPLIBXX_LIBRARY} ${MPLIB_LIBRARY}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(MPLIB DEFAULT_MSG MPLIBXX_LIBRARY MPLIB_LIBRARY MPLIB_INCLUDE_DIR) +mark_as_advanced(MPLIBXX_LIBRARY MPLIB_LIBRARY MPLIB_INCLUDE_DIR) diff --git a/config.h.in b/config.h.in index e1f98cdac4..e3570941a7 100644 --- a/config.h.in +++ b/config.h.in @@ -36,5 +36,11 @@ #ifndef GR_RPCSERVER_THRIFT #cmakedefine GR_RPCSERVER_THRIFT #endif +#ifndef GR_MPLIB_GMP +#cmakedefine GR_MPLIB_GMP +#endif +#ifndef GR_MPLIB_MPIR +#cmakedefine GR_MPLIB_MPIR +#endif #endif /* GNURADIO_CONFIG_H */ diff --git a/gnuradio-runtime/CMakeLists.txt b/gnuradio-runtime/CMakeLists.txt index 51eb3b0f8b..47d690a77d 100644 --- a/gnuradio-runtime/CMakeLists.txt +++ b/gnuradio-runtime/CMakeLists.txt @@ -23,6 +23,8 @@ include(GrBoost) include(GrPython) +find_package(MPLIB REQUIRED) + ######################################################################## # Setup compatibility checks and defines ######################################################################## @@ -37,6 +39,7 @@ GR_REGISTER_COMPONENT("gnuradio-runtime" ENABLE_GNURADIO_RUNTIME Boost_FOUND ENABLE_VOLK PYTHONINTERP_FOUND + MPLIB_FOUND ) GR_SET_GLOBAL(GNURADIO_RUNTIME_INCLUDE_DIRS @@ -133,6 +136,9 @@ install(FILES set(PC_ADD_LIBS -llog4cpp) endif(ENABLE_GR_LOG AND HAVE_LOG4CPP) +set(PC_ADD_LIBS "${MPLIB_PC_ADD_LIBS} ${PC_ADD_LIBS}") +set(PC_ADD_CFLAGS ${MPLIB_PC_ADD_CFLAGS}) + ######################################################################## # Add subdirectories ######################################################################## diff --git a/gnuradio-runtime/gnuradio-runtime.pc.in b/gnuradio-runtime/gnuradio-runtime.pc.in index acd052d3c6..280adaddd1 100644 --- a/gnuradio-runtime/gnuradio-runtime.pc.in +++ b/gnuradio-runtime/gnuradio-runtime.pc.in @@ -8,4 +8,4 @@ Description: GNU Radio core runtime infrastructure Requires: Version: @LIBVER@ Libs: -L${libdir} -lgnuradio-runtime -lgnuradio-pmt @PC_ADD_LIBS@ -Cflags: -I${includedir} +Cflags: -I${includedir} @PC_ADD_CFLAGS@ diff --git a/gnuradio-runtime/include/gnuradio/block.h b/gnuradio-runtime/include/gnuradio/block.h index c3de303c3b..6fce9a9e72 100644 --- a/gnuradio-runtime/include/gnuradio/block.h +++ b/gnuradio-runtime/include/gnuradio/block.h @@ -23,10 +23,16 @@ #ifndef INCLUDED_GR_RUNTIME_BLOCK_H #define INCLUDED_GR_RUNTIME_BLOCK_H +#include <gnuradio/config.h> #include <gnuradio/api.h> #include <gnuradio/basic_block.h> #include <gnuradio/tags.h> #include <gnuradio/logger.h> +#ifdef GR_MPLIB_MPIR +#include <mpirxx.h> +#else +#include <gmpxx.h> +#endif namespace gr { @@ -281,10 +287,51 @@ namespace gr { void set_relative_rate(double relative_rate); /*! + * \brief Set the approximate output rate / input rate + * using its reciprocal + * + * This is a convenience function to avoid + * numerical problems with tag propagation that calling + * set_relative_rate(1.0/relative_rate) might introduce. + */ + void set_inverse_relative_rate(double inverse_relative_rate); + + /*! + * \brief Set the approximate output rate / input rate as an integer ratio + * + * Provide a hint to the buffer allocator and scheduler. + * The default relative_rate is interpolation / decimation = 1 / 1 + * + * decimators have relative_rates < 1.0 + * interpolators have relative_rates > 1.0 + */ + void set_relative_rate(uint64_t interpolation, uint64_t decimation); + + /*! * \brief return the approximate output rate / input rate */ double relative_rate() const { return d_relative_rate; } + /*! + * \brief return the numerator, or interpolation rate, of the + * approximate output rate / input rate + */ + uint64_t relative_rate_i() const { + return (uint64_t) d_mp_relative_rate.get_num().get_ui(); } + + /*! + * \brief return the denominator, or decimation rate, of the + * approximate output rate / input rate + */ + uint64_t relative_rate_d() const { + return (uint64_t) d_mp_relative_rate.get_den().get_ui(); } + + /*! + * \brief return a reference to the multiple precision rational + * represntation of the approximate output rate / input rate + */ + mpq_class &mp_relative_rate() { return d_mp_relative_rate; } + /* * The following two methods provide special case info to the * scheduler in the event that a block has a fixed input to output @@ -670,6 +717,7 @@ namespace gr { int d_unaligned; bool d_is_unaligned; double d_relative_rate; // approx output_rate / input_rate + mpq_class d_mp_relative_rate; block_detail_sptr d_detail; // implementation details unsigned d_history; unsigned d_attr_delay; // the block's sample delay diff --git a/gnuradio-runtime/include/gnuradio/block_gateway.h b/gnuradio-runtime/include/gnuradio/block_gateway.h index ef218ea662..28589f8f9f 100644 --- a/gnuradio-runtime/include/gnuradio/block_gateway.h +++ b/gnuradio-runtime/include/gnuradio/block_gateway.h @@ -177,10 +177,26 @@ namespace gr { return gr::block::set_relative_rate(relative_rate); } + void block__set_inverse_relative_rate(double inverse_relative_rate) { + return gr::block::set_inverse_relative_rate(inverse_relative_rate); + } + + void block__set_relative_rate(uint64_t interpolation, uint64_t decimation) { + return gr::block::set_relative_rate(interpolation, decimation); + } + double block__relative_rate(void) const { return gr::block::relative_rate(); } + uint64_t block__relative_rate_i(void) const { + return gr::block::relative_rate_i(); + } + + uint64_t block__relative_rate_d(void) const { + return gr::block::relative_rate_d(); + } + uint64_t block__nitems_read(unsigned int which_input) { return gr::block::nitems_read(which_input); } diff --git a/gnuradio-runtime/include/gnuradio/sync_decimator.h b/gnuradio-runtime/include/gnuradio/sync_decimator.h index 129abdca79..f6306f169a 100644 --- a/gnuradio-runtime/include/gnuradio/sync_decimator.h +++ b/gnuradio-runtime/include/gnuradio/sync_decimator.h @@ -51,7 +51,7 @@ namespace gr { void set_decimation(unsigned decimation) { d_decimation = decimation; - set_relative_rate(1.0 / decimation); + set_relative_rate(1, (uint64_t) decimation); } // gr::sync_decimator overrides these to assist work diff --git a/gnuradio-runtime/include/gnuradio/sync_interpolator.h b/gnuradio-runtime/include/gnuradio/sync_interpolator.h index bfe79f902e..58351a51ea 100644 --- a/gnuradio-runtime/include/gnuradio/sync_interpolator.h +++ b/gnuradio-runtime/include/gnuradio/sync_interpolator.h @@ -51,7 +51,7 @@ namespace gr { void set_interpolation(unsigned interpolation) { d_interpolation = interpolation; - set_relative_rate(1.0 * interpolation); + set_relative_rate((uint64_t) interpolation, 1); set_output_multiple(interpolation); } diff --git a/gnuradio-runtime/lib/CMakeLists.txt b/gnuradio-runtime/lib/CMakeLists.txt index 2e8312aaad..3482c69d3f 100644 --- a/gnuradio-runtime/lib/CMakeLists.txt +++ b/gnuradio-runtime/lib/CMakeLists.txt @@ -51,6 +51,7 @@ include_directories(${GNURADIO_RUNTIME_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR}/../include/ ${VOLK_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} + ${MPLIB_INCLUDE_DIRS} ) if(ENABLE_CTRLPORT_THRIFT) @@ -137,6 +138,7 @@ list(APPEND gnuradio_runtime_libs ${VOLK_LIBRARIES} ${Boost_LIBRARIES} ${LOG4CPP_LIBRARIES} + ${MPLIB_LIBRARIES} ) #Add libraries for winsock2.h on Windows diff --git a/gnuradio-runtime/lib/block.cc b/gnuradio-runtime/lib/block.cc index 86c4aa701f..7d364de32d 100644 --- a/gnuradio-runtime/lib/block.cc +++ b/gnuradio-runtime/lib/block.cc @@ -43,6 +43,7 @@ namespace gr { d_unaligned(0), d_is_unaligned(false), d_relative_rate (1.0), + d_mp_relative_rate(1.0), d_history(1), d_attr_delay(0), d_fixed_rate(false), @@ -172,10 +173,36 @@ namespace gr { void block::set_relative_rate(double relative_rate) { - if(relative_rate < 0.0) - throw std::invalid_argument("block::set_relative_rate"); + if(relative_rate <= 0.0) + throw std::invalid_argument("block::set_relative_rate: relative rate must be > 0.0"); d_relative_rate = relative_rate; + d_mp_relative_rate = mpq_class(relative_rate); + } + + void + block::set_inverse_relative_rate(double inverse_relative_rate) + { + if(inverse_relative_rate <= 0.0) + throw std::invalid_argument("block::set_inverse_relative_rate: inverse relative rate must be > 0.0"); + + mpq_class inv_rr_q(inverse_relative_rate); + set_relative_rate((uint64_t) inv_rr_q.get_den().get_ui(), + (uint64_t) inv_rr_q.get_num().get_ui()); + } + + void + block::set_relative_rate(uint64_t interpolation, uint64_t decimation) + { + if (interpolation < 1) + throw std::invalid_argument("block::set_relative_rate: interpolation rate cannot be 0"); + + if (decimation < 1) + throw std::invalid_argument("block::set_relative_rate: decimation rate cannot be 0"); + + d_mp_relative_rate = mpq_class(interpolation, decimation); + d_mp_relative_rate.canonicalize(); + d_relative_rate = d_mp_relative_rate.get_d(); } void diff --git a/gnuradio-runtime/lib/block_executor.cc b/gnuradio-runtime/lib/block_executor.cc index 754744449a..6152ff6765 100644 --- a/gnuradio-runtime/lib/block_executor.cc +++ b/gnuradio-runtime/lib/block_executor.cc @@ -94,8 +94,11 @@ namespace gr { static bool propagate_tags(block::tag_propagation_policy_t policy, block_detail *d, const std::vector<uint64_t> &start_nitems_read, double rrate, + mpq_class &mp_rrate, bool use_fp_rrate, std::vector<tag_t> &rtags, long block_id) { + static const mpq_class one_half(1, 2); + // Move tags downstream // if a sink, we don't need to move downstream if(d->sink_p()) { @@ -131,7 +134,7 @@ namespace gr { out_buf[o]->add_item_tag(*t); } } - else { + else if(use_fp_rrate) { for(t = rtags.begin(); t != rtags.end(); t++) { tag_t new_tag = *t; new_tag.offset = ((double)new_tag.offset * rrate) + 0.5; @@ -139,6 +142,16 @@ namespace gr { out_buf[o]->add_item_tag(new_tag); } } + else { + mpz_class offset; + for(t = rtags.begin(); t != rtags.end(); t++) { + tag_t new_tag = *t; + offset = new_tag.offset * mp_rrate + one_half; + new_tag.offset = offset.get_ui(); + for(int o = 0; o < d->noutputs(); o++) + out_buf[o]->add_item_tag(new_tag); + } + } } } break; @@ -159,10 +172,26 @@ namespace gr { out_buf = d->output(i); std::vector<tag_t>::iterator t; - for(t = rtags.begin(); t != rtags.end(); t++) { - tag_t new_tag = *t; - new_tag.offset = ((double)new_tag.offset * rrate) + 0.5; - out_buf->add_item_tag(new_tag); + if(rrate == 1.0) { + for(t = rtags.begin(); t != rtags.end(); t++) { + out_buf->add_item_tag(*t); + } + } + else if(use_fp_rrate) { + for(t = rtags.begin(); t != rtags.end(); t++) { + tag_t new_tag = *t; + new_tag.offset = ((double)new_tag.offset * rrate) + 0.5; + out_buf->add_item_tag(new_tag); + } + } + else { + mpz_class offset; + for(t = rtags.begin(); t != rtags.end(); t++) { + tag_t new_tag = *t; + offset = new_tag.offset * mp_rrate + one_half; + new_tag.offset = offset.get_ui(); + out_buf->add_item_tag(new_tag); + } } } } @@ -212,7 +241,6 @@ namespace gr { int max_noutput_items; int new_alignment = 0; int alignment_state = -1; - double rrate; block *m = d_block.get(); block_detail *d = m->detail().get(); @@ -321,10 +349,8 @@ namespace gr { noutput_items = min_available_space(d, m->output_multiple(), m->min_noutput_items()); if(ENABLE_LOGGING) { *d_log << " regular "; - if(m->relative_rate() >= 1.0) - *d_log << "1:" << m->relative_rate() << std::endl; - else - *d_log << 1.0/m->relative_rate() << ":1\n"; + *d_log << m->relative_rate_i() << ":" + << m->relative_rate_d() << std::endl; *d_log << " max_items_avail = " << max_items_avail << std::endl; *d_log << " noutput_items = " << noutput_items << std::endl; } @@ -490,6 +516,7 @@ namespace gr { // Now propagate the tags based on the new relative rate if(!propagate_tags(m->tag_propagation_policy(), d, d_start_nitems_read, m->relative_rate(), + m->mp_relative_rate(), m->update_rate(), d_returned_tags, m->unique_id())) goto were_done; @@ -505,9 +532,10 @@ namespace gr { // In the block constructor, use enable_update_rate(true). if(m->update_rate()) { //rrate = ((double)(m->nitems_written(0))) / ((double)m->nitems_read(0)); - rrate = (double)n / (double)d->consumed(); - if(rrate > 0) - m->set_relative_rate(rrate); + //if(rrate > 0.0) + // m->set_relative_rate(rrate); + if((n > 0) && (d->consumed() > 0)) + m->set_relative_rate((uint64_t)n, (uint64_t)d->consumed()); } if(d->d_produce_or > 0) // block produced something diff --git a/gnuradio-runtime/lib/single_threaded_scheduler.cc b/gnuradio-runtime/lib/single_threaded_scheduler.cc deleted file mode 100644 index a85f390a30..0000000000 --- a/gnuradio-runtime/lib/single_threaded_scheduler.cc +++ /dev/null @@ -1,366 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2004 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "single_threaded_scheduler.h" -#include <gnuradio/block.h> -#include <gnuradio/block_detail.h> -#include <gnuradio/buffer.h> -#include <boost/thread.hpp> -#include <boost/format.hpp> -#include <iostream> -#include <limits> -#include <assert.h> -#include <stdio.h> - -namespace gr { - - // must be defined to either 0 or 1 -#define ENABLE_LOGGING 0 - -#if (ENABLE_LOGGING) -#define LOG(x) do { x; } while(0) -#else -#define LOG(x) do {;} while(0) -#endif - - static int which_scheduler = 0; - - single_threaded_scheduler_sptr - make_single_threaded_scheduler(const std::vector<block_sptr> &blocks) - { - return single_threaded_scheduler_sptr - (new single_threaded_scheduler(blocks)); - } - - single_threaded_scheduler::single_threaded_scheduler(const std::vector<block_sptr> &blocks) - : d_blocks(blocks), d_enabled(true), d_log(0) - { - if(ENABLE_LOGGING) { - std::string name = str(boost::format("sst-%d.log") % which_scheduler++); - d_log = new std::ofstream(name.c_str()); - *d_log << "single_threaded_scheduler: " - << d_blocks.size () - << " blocks\n"; - } - } - - single_threaded_scheduler::~single_threaded_scheduler() - { - if(ENABLE_LOGGING) - delete d_log; - } - - void - single_threaded_scheduler::run() - { - // d_enabled = true; // KLUDGE - main_loop (); - } - - void - single_threaded_scheduler::stop() - { - if(0) - std::cout << "gr_singled_threaded_scheduler::stop() " - << this << std::endl; - d_enabled = false; - } - - inline static unsigned int - round_up(unsigned int n, unsigned int multiple) - { - return ((n + multiple - 1) / multiple) * multiple; - } - - inline static unsigned int - round_down(unsigned int n, unsigned int multiple) - { - return (n / multiple) * multiple; - } - - // - // Return minimum available write space in all our downstream - // buffers or -1 if we're output blocked and the output we're - // blocked on is done. - // - static int - min_available_space(block_detail *d, int output_multiple) - { - int min_space = std::numeric_limits<int>::max(); - - for(int i = 0; i < d->noutputs (); i++) { - buffer_sptr out_buf = d->output(i); - int n = round_down (out_buf->space_available (), output_multiple); - if(n == 0) { // We're blocked on output. - if(out_buf->done()) { // Downstream is done, therefore we're done. - return -1; - } - return 0; - } - min_space = std::min (min_space, n); - } - return min_space; - } - - void - single_threaded_scheduler::main_loop() - { - static const int DEFAULT_CAPACITY = 16; - - int noutput_items; - gr_vector_int ninput_items_required(DEFAULT_CAPACITY); - gr_vector_int ninput_items(DEFAULT_CAPACITY); - gr_vector_const_void_star input_items(DEFAULT_CAPACITY); - gr_vector_void_star output_items(DEFAULT_CAPACITY); - unsigned int bi; - unsigned int nalive; - int max_items_avail; - bool made_progress_last_pass; - bool making_progress; - - for(unsigned i = 0; i < d_blocks.size (); i++) - d_blocks[i]->detail()->set_done (false); // reset any done flags - - for(unsigned i = 0; i < d_blocks.size (); i++) // enable any drivers, etc. - d_blocks[i]->start(); - - bi = 0; - made_progress_last_pass = true; - making_progress = false; - - // Loop while there are still blocks alive - - nalive = d_blocks.size (); - while(d_enabled && nalive > 0) { - if(boost::this_thread::interruption_requested()) - break; - - block *m = d_blocks[bi].get (); - block_detail *d = m->detail().get (); - - LOG(*d_log << std::endl << m); - - if(d->done ()) - goto next_block; - - if(d->source_p ()) { - // Invoke sources as a last resort. As long as the previous - // pass made progress, don't call a source. - if(made_progress_last_pass) { - LOG(*d_log << " Skipping source\n"); - goto next_block; - } - - ninput_items_required.resize (0); - ninput_items.resize (0); - input_items.resize (0); - output_items.resize (d->noutputs ()); - - // determine the minimum available output space - noutput_items = min_available_space (d, m->output_multiple ()); - LOG(*d_log << " source\n noutput_items = " << noutput_items << std::endl); - if(noutput_items == -1) // we're done - goto were_done; - - if(noutput_items == 0) { // we're output blocked - LOG(*d_log << " BLKD_OUT\n"); - goto next_block; - } - - goto setup_call_to_work; // jump to common code - } - - else if(d->sink_p ()) { - ninput_items_required.resize (d->ninputs ()); - ninput_items.resize (d->ninputs ()); - input_items.resize (d->ninputs ()); - output_items.resize (0); - LOG(*d_log << " sink\n"); - - max_items_avail = 0; - for(int i = 0; i < d->ninputs (); i++) { - buffer_reader_sptr in_buf = d->input(i); - ninput_items[i] = in_buf->items_available(); - //if (ninput_items[i] == 0 && in_buf->done()) - if(ninput_items[i] < m->output_multiple() && in_buf->done()) - goto were_done; - - max_items_avail = std::max (max_items_avail, ninput_items[i]); - } - - // take a swag at how much output we can sink - noutput_items = (int) (max_items_avail * m->relative_rate ()); - noutput_items = round_down (noutput_items, m->output_multiple ()); - LOG(*d_log << " max_items_avail = " << max_items_avail << std::endl); - LOG(*d_log << " noutput_items = " << noutput_items << std::endl); - - if(noutput_items == 0) { // we're blocked on input - LOG(*d_log << " BLKD_IN\n"); - goto next_block; - } - - goto try_again; // Jump to code shared with regular case. - } - - else { - // do the regular thing - ninput_items_required.resize(d->ninputs ()); - ninput_items.resize(d->ninputs ()); - input_items.resize(d->ninputs ()); - output_items.resize(d->noutputs ()); - - max_items_avail = 0; - for(int i = 0; i < d->ninputs (); i++) { - ninput_items[i] = d->input(i)->items_available (); - max_items_avail = std::max(max_items_avail, ninput_items[i]); - } - - // determine the minimum available output space - noutput_items = min_available_space(d, m->output_multiple ()); - if(ENABLE_LOGGING){ - *d_log << " regular "; - if(m->relative_rate() >= 1.0) - *d_log << "1:" << m->relative_rate() << std::endl; - else - *d_log << 1.0/m->relative_rate() << ":1\n"; - *d_log << " max_items_avail = " << max_items_avail << std::endl; - *d_log << " noutput_items = " << noutput_items << std::endl; - } - if(noutput_items == -1) // we're done - goto were_done; - - if(noutput_items == 0) { // we're output blocked - LOG(*d_log << " BLKD_OUT\n"); - goto next_block; - } - -#if 0 - // Compute best estimate of noutput_items that we can really use. - noutput_items = - std::min((unsigned)noutput_items, - std::max((unsigned)m->output_multiple(), - round_up((unsigned)(max_items_avail * m->relative_rate()), - m->output_multiple()))); - - LOG(*d_log << " revised noutput_items = " << noutput_items << std::endl); -#endif - - try_again: - if(m->fixed_rate()) { - // try to work it forward starting with max_items_avail. - // We want to try to consume all the input we've got. - int reqd_noutput_items = m->fixed_rate_ninput_to_noutput(max_items_avail); - reqd_noutput_items = round_up(reqd_noutput_items, m->output_multiple()); - if(reqd_noutput_items > 0 && reqd_noutput_items <= noutput_items) - noutput_items = reqd_noutput_items; - } - - // ask the block how much input they need to produce noutput_items - m->forecast(noutput_items, ninput_items_required); - - // See if we've got sufficient input available - int i; - for(i = 0; i < d->ninputs (); i++) - if(ninput_items_required[i] > ninput_items[i]) // not enough - break; - - if(i < d->ninputs()) { // not enough input on input[i] - // if we can, try reducing the size of our output request - if(noutput_items > m->output_multiple ()){ - noutput_items /= 2; - noutput_items = round_up (noutput_items, m->output_multiple ()); - goto try_again; - } - - // We're blocked on input - buffer_reader_sptr in_buf = d->input(i); - LOG(*d_log << " BLKD_IN\n"); - if(in_buf->done()) // If the upstream block is done, we're done - goto were_done; - - // Is it possible to ever fulfill this request? - if(ninput_items_required[i] > in_buf->max_possible_items_available ()) { - // Nope, never going to happen... - std::cerr << "\nsched: <block " << m->name() - << " (" << m->unique_id() << ")>" - << " is requesting more input data\n" - << " than we can provide.\n" - << " ninput_items_required = " - << ninput_items_required[i] << "\n" - << " max_possible_items_available = " - << in_buf->max_possible_items_available() << "\n" - << " If this is a filter, consider reducing the number of taps.\n"; - goto were_done; - } - - goto next_block; - } - - // We've got enough data on each input to produce noutput_items. - // Finish setting up the call to work. - for(int i = 0; i < d->ninputs (); i++) - input_items[i] = d->input(i)->read_pointer(); - - setup_call_to_work: - - for(int i = 0; i < d->noutputs (); i++) - output_items[i] = d->output(i)->write_pointer(); - - // Do the actual work of the block - int n = m->general_work(noutput_items, ninput_items, - input_items, output_items); - LOG(*d_log << " general_work: noutput_items = " << noutput_items - << " result = " << n << std::endl); - - if(n == -1) // block is done - goto were_done; - - d->produce_each(n); // advance write pointers - if(n > 0) - making_progress = true; - - goto next_block; - } - assert(0); - - were_done: - LOG(*d_log << " were_done\n"); - d->set_done (true); - nalive--; - - next_block: - if(++bi >= d_blocks.size ()) { - bi = 0; - made_progress_last_pass = making_progress; - making_progress = false; - } - } - - for(unsigned i = 0; i < d_blocks.size(); i++) // disable any drivers, etc. - d_blocks[i]->stop(); - } - -} /* namespace gr */ diff --git a/gnuradio-runtime/swig/block.i b/gnuradio-runtime/swig/block.i index 6b364a417a..96205296ef 100644 --- a/gnuradio-runtime/swig/block.i +++ b/gnuradio-runtime/swig/block.i @@ -51,6 +51,8 @@ class gr::block : public gr::basic_block void set_output_multiple(int multiple); int output_multiple () const; double relative_rate () const; + uint64_t relative_rate_i () const; + uint64_t relative_rate_d () const; bool start(); bool stop(); diff --git a/gr-blocks/lib/annotator_1to1_impl.cc b/gr-blocks/lib/annotator_1to1_impl.cc index 04f9a2f458..a7d8ce9d3d 100644 --- a/gr-blocks/lib/annotator_1to1_impl.cc +++ b/gr-blocks/lib/annotator_1to1_impl.cc @@ -49,7 +49,7 @@ namespace gr { set_tag_propagation_policy(TPP_ONE_TO_ONE); d_tag_counter = 0; - set_relative_rate(1.0); + set_relative_rate(1, 1); } annotator_1to1_impl::~annotator_1to1_impl() diff --git a/gr-blocks/lib/annotator_raw_impl.cc b/gr-blocks/lib/annotator_raw_impl.cc index ea763c7658..ce15103822 100644 --- a/gr-blocks/lib/annotator_raw_impl.cc +++ b/gr-blocks/lib/annotator_raw_impl.cc @@ -50,7 +50,7 @@ namespace gr { d_itemsize(sizeof_stream_item) { set_tag_propagation_policy(TPP_ONE_TO_ONE); - set_relative_rate(1.0); + set_relative_rate(1, 1); } annotator_raw_impl::~annotator_raw_impl() diff --git a/gr-blocks/lib/deinterleave_impl.cc b/gr-blocks/lib/deinterleave_impl.cc index 9e18c35e58..d7fdbb8f8f 100644 --- a/gr-blocks/lib/deinterleave_impl.cc +++ b/gr-blocks/lib/deinterleave_impl.cc @@ -54,7 +54,7 @@ namespace gr { bool deinterleave_impl::check_topology(int ninputs, int noutputs) { - set_relative_rate(1.0/(double)noutputs); + set_relative_rate(1, (uint64_t)noutputs); d_noutputs = noutputs; return true; } diff --git a/gr-blocks/lib/interleave_impl.cc b/gr-blocks/lib/interleave_impl.cc index 3e5a8295bd..65a5cb69b7 100644 --- a/gr-blocks/lib/interleave_impl.cc +++ b/gr-blocks/lib/interleave_impl.cc @@ -48,7 +48,7 @@ namespace gr { bool interleave_impl::check_topology(int ninputs, int noutputs) { - set_relative_rate((double)ninputs); + set_relative_rate((uint64_t)ninputs, 1); d_ninputs = ninputs; set_output_multiple(d_blocksize * d_ninputs); return true; diff --git a/gr-blocks/lib/keep_m_in_n_impl.cc b/gr-blocks/lib/keep_m_in_n_impl.cc index a466761c0b..4784d3c1a2 100644 --- a/gr-blocks/lib/keep_m_in_n_impl.cc +++ b/gr-blocks/lib/keep_m_in_n_impl.cc @@ -66,7 +66,7 @@ namespace gr { } set_output_multiple(m); - set_relative_rate(static_cast<double>(d_m)/static_cast<double>(d_n)); + set_relative_rate(static_cast<uint64_t>(d_m), static_cast<uint64_t>(d_n)); } void @@ -80,14 +80,14 @@ namespace gr { { d_m = m; set_output_multiple(m); - set_relative_rate(static_cast<double>(d_m)/static_cast<double>(d_n)); + set_relative_rate(static_cast<uint64_t>(d_m), static_cast<uint64_t>(d_n)); } void keep_m_in_n_impl::set_n(int n) { d_n = n; - set_relative_rate(static_cast<double>(d_m)/static_cast<double>(d_n)); + set_relative_rate(static_cast<uint64_t>(d_m), static_cast<uint64_t>(d_n)); } void diff --git a/gr-blocks/lib/packed_to_unpacked_XX_impl.cc.t b/gr-blocks/lib/packed_to_unpacked_XX_impl.cc.t index de96135ce8..9478ce25c0 100644 --- a/gr-blocks/lib/packed_to_unpacked_XX_impl.cc.t +++ b/gr-blocks/lib/packed_to_unpacked_XX_impl.cc.t @@ -55,7 +55,7 @@ namespace gr { assert(bits_per_chunk <= BITS_PER_TYPE); assert(bits_per_chunk > 0); - set_relative_rate((1.0 * BITS_PER_TYPE) / bits_per_chunk); + set_relative_rate((uint64_t)BITS_PER_TYPE, (uint64_t)bits_per_chunk); } @NAME_IMPL@::~@NAME_IMPL@() diff --git a/gr-blocks/lib/repack_bits_bb_impl.cc b/gr-blocks/lib/repack_bits_bb_impl.cc index c20c99786a..a8185a95dc 100644 --- a/gr-blocks/lib/repack_bits_bb_impl.cc +++ b/gr-blocks/lib/repack_bits_bb_impl.cc @@ -55,7 +55,7 @@ namespace gr { throw std::invalid_argument("k and l must be in [1, 8]"); } - set_relative_rate((double) d_k / d_l); + set_relative_rate((uint64_t) d_k, (uint64_t) d_l); } void @@ -64,7 +64,7 @@ namespace gr { gr::thread::scoped_lock guard(d_setlock); d_k = k; d_l = l; - set_relative_rate((double) d_k / d_l); + set_relative_rate((uint64_t) d_k, (uint64_t) d_l); } repack_bits_bb_impl::~repack_bits_bb_impl() diff --git a/gr-blocks/lib/tagged_stream_multiply_length_impl.cc b/gr-blocks/lib/tagged_stream_multiply_length_impl.cc index e9699d28f5..266b967e69 100644 --- a/gr-blocks/lib/tagged_stream_multiply_length_impl.cc +++ b/gr-blocks/lib/tagged_stream_multiply_length_impl.cc @@ -45,7 +45,7 @@ namespace gr { d_itemsize(itemsize) { set_tag_propagation_policy(TPP_DONT); - set_relative_rate(1); + set_relative_rate(1, 1); message_port_register_in(pmt::intern("set_scalar")); set_msg_handler(pmt::intern("set_scalar"), boost::bind(&tagged_stream_multiply_length_impl::set_scalar_pmt, this, _1)); diff --git a/gr-blocks/lib/tagged_stream_mux_impl.cc b/gr-blocks/lib/tagged_stream_mux_impl.cc index ac2d1c2203..90587639ce 100644 --- a/gr-blocks/lib/tagged_stream_mux_impl.cc +++ b/gr-blocks/lib/tagged_stream_mux_impl.cc @@ -74,7 +74,7 @@ namespace gr { unsigned char *out = (unsigned char *) output_items[0]; int n_produced = 0; - set_relative_rate(ninput_items.size()); + set_relative_rate((uint64_t)ninput_items.size(), 1); for (unsigned int i = 0; i < input_items.size(); i++) { const unsigned char *in = (const unsigned char *) input_items[i]; diff --git a/gr-blocks/lib/test_tag_variable_rate_ff_impl.cc b/gr-blocks/lib/test_tag_variable_rate_ff_impl.cc index cca86ad832..cc9e1eeab9 100644 --- a/gr-blocks/lib/test_tag_variable_rate_ff_impl.cc +++ b/gr-blocks/lib/test_tag_variable_rate_ff_impl.cc @@ -52,7 +52,7 @@ namespace gr { d_update_once(update_once), d_update_step(update_step) { set_tag_propagation_policy(TPP_DONT); - set_relative_rate(0.5); + set_relative_rate(1, 2); d_accum = 0; d_rrate = 0.5; d_old_in = 0; diff --git a/gr-blocks/lib/unpacked_to_packed_XX_impl.cc.t b/gr-blocks/lib/unpacked_to_packed_XX_impl.cc.t index 8e06570740..c4e385deea 100644 --- a/gr-blocks/lib/unpacked_to_packed_XX_impl.cc.t +++ b/gr-blocks/lib/unpacked_to_packed_XX_impl.cc.t @@ -53,7 +53,7 @@ namespace gr { assert(bits_per_chunk <= BITS_PER_TYPE); assert(bits_per_chunk > 0); - set_relative_rate(bits_per_chunk/(1.0 * BITS_PER_TYPE)); + set_relative_rate((uint64_t)bits_per_chunk, (uint64_t)BITS_PER_TYPE); } @NAME_IMPL@::~@NAME_IMPL@() diff --git a/gr-channels/lib/sro_model_impl.cc b/gr-channels/lib/sro_model_impl.cc index 116d8e38d2..b8eb7fb195 100644 --- a/gr-channels/lib/sro_model_impl.cc +++ b/gr-channels/lib/sro_model_impl.cc @@ -56,8 +56,8 @@ namespace gr { d_noise(gr::analog::fastnoise_source_f::make(analog::GR_GAUSSIAN, std_dev_hz, noise_seed)), d_noise_seed(noise_seed) { - //set_relative_rate(1.0 / interp_ratio); - set_relative_rate(1.0); + //set_inverse_relative_rate(interp_ratio); + set_relative_rate(1, 1); } sro_model_impl::~sro_model_impl() diff --git a/gr-digital/lib/burst_shaper_XX_impl.cc.t b/gr-digital/lib/burst_shaper_XX_impl.cc.t index 0a60696b8e..45629d543c 100644 --- a/gr-digital/lib/burst_shaper_XX_impl.cc.t +++ b/gr-digital/lib/burst_shaper_XX_impl.cc.t @@ -84,7 +84,7 @@ namespace gr { d_down_phasing[i] = symbol * d_down_ramp[i]; } - //set_relative_rate(1.0); + //set_relative_rate(1, 1); set_tag_propagation_policy(TPP_DONT); } diff --git a/gr-digital/lib/clock_recovery_mm_cc_impl.cc b/gr-digital/lib/clock_recovery_mm_cc_impl.cc index fd05f24168..d3609763a4 100644 --- a/gr-digital/lib/clock_recovery_mm_cc_impl.cc +++ b/gr-digital/lib/clock_recovery_mm_cc_impl.cc @@ -66,7 +66,7 @@ namespace gr { throw std::out_of_range("Gains must be non-negative"); set_omega(omega); // also sets min and max omega - set_relative_rate(1.0 / omega); + set_inverse_relative_rate(omega); set_history(3); // ensure 2 extra input samples are available enable_update_rate(true); // fixes tag propagation through variable rate block } diff --git a/gr-digital/lib/clock_recovery_mm_ff_impl.cc b/gr-digital/lib/clock_recovery_mm_ff_impl.cc index 57578bca28..4a17f94b64 100644 --- a/gr-digital/lib/clock_recovery_mm_ff_impl.cc +++ b/gr-digital/lib/clock_recovery_mm_ff_impl.cc @@ -59,7 +59,7 @@ namespace gr { throw std::out_of_range("Gains must be non-negative"); set_omega(omega); // also sets min and max omega - set_relative_rate (1.0 / omega); + set_inverse_relative_rate (omega); enable_update_rate(true); // fixes tag propagation through variable rate block } diff --git a/gr-digital/lib/constellation_decoder_cb_impl.cc b/gr-digital/lib/constellation_decoder_cb_impl.cc index e8075d2225..fed6a30a27 100644 --- a/gr-digital/lib/constellation_decoder_cb_impl.cc +++ b/gr-digital/lib/constellation_decoder_cb_impl.cc @@ -45,7 +45,7 @@ namespace gr { d_constellation(constellation), d_dim(constellation->dimensionality()) { - set_relative_rate(1.0 / ((double)d_dim)); + set_relative_rate(1, (uint64_t)d_dim); } constellation_decoder_cb_impl::~constellation_decoder_cb_impl() diff --git a/gr-digital/lib/header_payload_demux_impl.cc b/gr-digital/lib/header_payload_demux_impl.cc index c6ec53ba35..6fa54d329f 100644 --- a/gr-digital/lib/header_payload_demux_impl.cc +++ b/gr-digital/lib/header_payload_demux_impl.cc @@ -142,9 +142,10 @@ namespace gr { throw std::invalid_argument("Items and symbol sizes must be at least 1."); } if (d_output_symbols) { - set_relative_rate(1.0 / (d_items_per_symbol + d_gi)); + set_relative_rate(1, (uint64_t)(d_items_per_symbol + d_gi)); } else { - set_relative_rate((double)d_items_per_symbol / (d_items_per_symbol + d_gi)); + set_relative_rate((uint64_t)d_items_per_symbol, + (uint64_t)(d_items_per_symbol + d_gi)); set_output_multiple(d_items_per_symbol); } if ((d_output_symbols || d_gi) && d_header_padding_items) { diff --git a/gr-digital/lib/ofdm_carrier_allocator_cvc_impl.cc b/gr-digital/lib/ofdm_carrier_allocator_cvc_impl.cc index 7df2caeb3b..d55790a5a3 100644 --- a/gr-digital/lib/ofdm_carrier_allocator_cvc_impl.cc +++ b/gr-digital/lib/ofdm_carrier_allocator_cvc_impl.cc @@ -125,7 +125,8 @@ namespace gr { d_symbols_per_set += d_occupied_carriers[i].size(); } set_tag_propagation_policy(TPP_DONT); - set_relative_rate((double) d_symbols_per_set / d_occupied_carriers.size()); + set_relative_rate((uint64_t) d_symbols_per_set, + (uint64_t) d_occupied_carriers.size()); } ofdm_carrier_allocator_cvc_impl::~ofdm_carrier_allocator_cvc_impl() diff --git a/gr-digital/lib/ofdm_chanest_vcvc_impl.cc b/gr-digital/lib/ofdm_chanest_vcvc_impl.cc index f27107f2db..70d49cab46 100644 --- a/gr-digital/lib/ofdm_chanest_vcvc_impl.cc +++ b/gr-digital/lib/ofdm_chanest_vcvc_impl.cc @@ -128,7 +128,8 @@ namespace gr { } set_output_multiple(d_n_data_syms); - set_relative_rate((double) d_n_data_syms / (d_n_data_syms + d_n_sync_syms)); + set_relative_rate((uint64_t) d_n_data_syms, + (uint64_t) (d_n_data_syms + d_n_sync_syms)); set_tag_propagation_policy(TPP_DONT); } diff --git a/gr-digital/lib/ofdm_cyclic_prefixer_impl.cc b/gr-digital/lib/ofdm_cyclic_prefixer_impl.cc index 9db7273e26..0ab2d2b951 100644 --- a/gr-digital/lib/ofdm_cyclic_prefixer_impl.cc +++ b/gr-digital/lib/ofdm_cyclic_prefixer_impl.cc @@ -50,7 +50,7 @@ namespace gr { d_down_flank((rolloff_len ? rolloff_len-1 : 0), 0), d_delay_line(0, 0) { - set_relative_rate(d_output_size); + set_relative_rate((uint64_t)d_output_size, 1); // Flank of length 1 would just be rectangular if (d_rolloff_len == 1) { diff --git a/gr-digital/lib/ofdm_frame_equalizer_vcvc_impl.cc b/gr-digital/lib/ofdm_frame_equalizer_vcvc_impl.cc index 1b0dee4055..0412ef77fe 100644 --- a/gr-digital/lib/ofdm_frame_equalizer_vcvc_impl.cc +++ b/gr-digital/lib/ofdm_frame_equalizer_vcvc_impl.cc @@ -77,7 +77,7 @@ namespace gr { if (d_fixed_frame_len) { set_output_multiple(d_fixed_frame_len); } - set_relative_rate(1.0); + set_relative_rate(1, 1); // Really, we have TPP_ONE_TO_ONE, but the channel state is not propagated set_tag_propagation_policy(TPP_DONT); } diff --git a/gr-digital/lib/ofdm_sampler_impl.cc b/gr-digital/lib/ofdm_sampler_impl.cc index 01fa24d9a9..d0c664cb2f 100644 --- a/gr-digital/lib/ofdm_sampler_impl.cc +++ b/gr-digital/lib/ofdm_sampler_impl.cc @@ -52,7 +52,7 @@ namespace gr { { GR_LOG_WARN(d_logger, "The gr::digital::ofdm_sampler block has been deprecated."); - set_relative_rate(1.0/(double) fft_length); // buffer allocator hint + set_relative_rate(1, (uint64_t)fft_length); // buffer allocator hint } ofdm_sampler_impl::~ofdm_sampler_impl() diff --git a/gr-digital/lib/ofdm_serializer_vcc_impl.cc b/gr-digital/lib/ofdm_serializer_vcc_impl.cc index 1398dcd2a1..fa31e97efd 100644 --- a/gr-digital/lib/ofdm_serializer_vcc_impl.cc +++ b/gr-digital/lib/ofdm_serializer_vcc_impl.cc @@ -115,7 +115,8 @@ namespace gr { for (unsigned i = 0; i < d_occupied_carriers.size(); i++) { d_symbols_per_set += d_occupied_carriers[i].size(); } - set_relative_rate((double) d_symbols_per_set / d_occupied_carriers.size()); + set_relative_rate((uint64_t) d_symbols_per_set, + (uint64_t) d_occupied_carriers.size()); set_tag_propagation_policy(TPP_DONT); } diff --git a/gr-digital/lib/packet_headergenerator_bb_impl.cc b/gr-digital/lib/packet_headergenerator_bb_impl.cc index 3dd2e0469b..a06227e8e2 100644 --- a/gr-digital/lib/packet_headergenerator_bb_impl.cc +++ b/gr-digital/lib/packet_headergenerator_bb_impl.cc @@ -65,7 +65,7 @@ namespace gr { { set_output_multiple(d_formatter->header_len()); // This is the worst case rate, because we don't know the true value, of course - set_relative_rate(d_formatter->header_len()); + set_relative_rate((uint64_t)d_formatter->header_len(), 1); set_tag_propagation_policy(TPP_DONT); } diff --git a/gr-digital/lib/pfb_clock_sync_ccf_impl.cc b/gr-digital/lib/pfb_clock_sync_ccf_impl.cc index 6ac39fbcfc..14f9701353 100644 --- a/gr-digital/lib/pfb_clock_sync_ccf_impl.cc +++ b/gr-digital/lib/pfb_clock_sync_ccf_impl.cc @@ -113,7 +113,7 @@ namespace gr { d_new_in = 0; d_last_out = 0; - set_relative_rate((float)d_osps/(float)d_sps); + set_relative_rate((uint64_t)d_osps, (uint64_t)d_sps); } pfb_clock_sync_ccf_impl::~pfb_clock_sync_ccf_impl() diff --git a/gr-digital/lib/pfb_clock_sync_fff_impl.cc b/gr-digital/lib/pfb_clock_sync_fff_impl.cc index 30ef526ad0..6fcd392796 100644 --- a/gr-digital/lib/pfb_clock_sync_fff_impl.cc +++ b/gr-digital/lib/pfb_clock_sync_fff_impl.cc @@ -105,7 +105,7 @@ namespace gr { set_taps(taps, d_taps, d_filters); set_taps(dtaps, d_dtaps, d_diff_filters); - set_relative_rate((float)d_osps/(float)d_sps); + set_relative_rate((uint64_t)d_osps, (uint64_t)d_sps); } pfb_clock_sync_fff_impl::~pfb_clock_sync_fff_impl() diff --git a/gr-digital/lib/protocol_formatter_bb_impl.cc b/gr-digital/lib/protocol_formatter_bb_impl.cc index fcf2f6609b..197914185f 100644 --- a/gr-digital/lib/protocol_formatter_bb_impl.cc +++ b/gr-digital/lib/protocol_formatter_bb_impl.cc @@ -51,7 +51,7 @@ namespace gr { set_output_multiple(d_format->header_nbytes()); // This is the worst case rate, because we don't know the true value, of course - set_relative_rate(d_format->header_nbytes()); + set_relative_rate((uint64_t)d_format->header_nbytes(), 1); set_tag_propagation_policy(TPP_DONT); } diff --git a/gr-dtv/lib/dvbt/dvbt_convolutional_deinterleaver_impl.cc b/gr-dtv/lib/dvbt/dvbt_convolutional_deinterleaver_impl.cc index 0358ada1ff..c04b433f7f 100644 --- a/gr-dtv/lib/dvbt/dvbt_convolutional_deinterleaver_impl.cc +++ b/gr-dtv/lib/dvbt/dvbt_convolutional_deinterleaver_impl.cc @@ -48,7 +48,7 @@ namespace gr { io_signature::make(1, 1, sizeof (unsigned char) * I * blocks)), d_blocks(blocks), d_I(I), d_M(M) { - set_relative_rate(1.0 / d_I * d_blocks); + set_relative_rate(1, (uint64_t)(d_I * d_blocks)); set_output_multiple(2); //The positions are shift registers (FIFOs) //of length i*M diff --git a/gr-dtv/lib/dvbt/dvbt_energy_descramble_impl.cc b/gr-dtv/lib/dvbt/dvbt_energy_descramble_impl.cc index 6b47814f8c..1cb020eb0d 100644 --- a/gr-dtv/lib/dvbt/dvbt_energy_descramble_impl.cc +++ b/gr-dtv/lib/dvbt/dvbt_energy_descramble_impl.cc @@ -72,7 +72,7 @@ namespace gr { io_signature::make(1, 1, sizeof (unsigned char))), d_reg(0xa9), d_index(0), d_search(0) { - set_relative_rate((double) (d_nblocks * d_bsize)); + set_relative_rate((uint64_t) (d_nblocks * d_bsize), 1); // Set output multiple of (2 search + 1 data = 3) at least (4 for now) set_output_multiple(4 * d_nblocks * d_bsize); diff --git a/gr-dtv/lib/dvbt/dvbt_energy_dispersal_impl.cc b/gr-dtv/lib/dvbt/dvbt_energy_dispersal_impl.cc index ff8042f2c8..d70ddf1f03 100644 --- a/gr-dtv/lib/dvbt/dvbt_energy_dispersal_impl.cc +++ b/gr-dtv/lib/dvbt/dvbt_energy_dispersal_impl.cc @@ -70,7 +70,7 @@ namespace gr { d_nblocks(nblocks), d_reg(0xa9) { - set_relative_rate(1.0/(double) (d_nblocks * d_npacks * d_psize)); + set_relative_rate(1, (uint64_t) (d_nblocks * d_npacks * d_psize)); } /* diff --git a/gr-dtv/lib/dvbt/dvbt_inner_coder_impl.cc b/gr-dtv/lib/dvbt/dvbt_inner_coder_impl.cc index e26c0eb8d9..cc740359e0 100644 --- a/gr-dtv/lib/dvbt/dvbt_inner_coder_impl.cc +++ b/gr-dtv/lib/dvbt/dvbt_inner_coder_impl.cc @@ -162,7 +162,8 @@ namespace gr { // Set relative rate out/in assert((d_noutput * d_k * d_m) % (d_ninput * 8 * d_n) == 0); - set_relative_rate((float)(d_ninput * 8 * d_n) / (float)d_noutput * d_k * d_m); + set_relative_rate((uint64_t)(d_ninput * 8 * d_n), + (uint64_t)(d_noutput * d_k * d_m)); // calculate in and out block sizes d_in_bs = (d_k * d_m) / 2; diff --git a/gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.cc b/gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.cc index 1a347d3d8d..6ad4463ffd 100644 --- a/gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.cc +++ b/gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.cc @@ -240,7 +240,7 @@ namespace gr { d_initial_acquisition(0), d_cp_start(0), \ d_to_consume(0), d_to_out(0), d_consumed(0), d_out(0) { - set_relative_rate(1.0 / (double) (d_cp_length + d_fft_length)); + set_relative_rate(1, (uint64_t) (d_cp_length + d_fft_length)); d_snr = pow(10, d_snr / 10.0); d_rho = d_snr / (d_snr + 1.0); diff --git a/gr-fec/lib/decoder_impl.cc b/gr-fec/lib/decoder_impl.cc index d570c4077a..bbb4f18772 100644 --- a/gr-fec/lib/decoder_impl.cc +++ b/gr-fec/lib/decoder_impl.cc @@ -49,7 +49,8 @@ namespace gr { d_input_item_size(input_item_size), d_output_item_size(output_item_size) { set_fixed_rate(true); - set_relative_rate((double)(my_decoder->get_output_size())/my_decoder->get_input_size()); + set_relative_rate((uint64_t)my_decoder->get_output_size(), + (uint64_t)my_decoder->get_input_size()); //want to guarantee you have enough to run at least one time... //remember! this is not a sync block... set_output_multiple does not diff --git a/gr-fec/lib/depuncture_bb_impl.cc b/gr-fec/lib/depuncture_bb_impl.cc index e388120bbf..22417e4f0f 100644 --- a/gr-fec/lib/depuncture_bb_impl.cc +++ b/gr-fec/lib/depuncture_bb_impl.cc @@ -74,7 +74,8 @@ namespace gr { d_puncholes = count_mask - count_pat; set_fixed_rate(true); - set_relative_rate((double)d_puncsize/(d_puncsize - d_puncholes)); + set_relative_rate((uint64_t)d_puncsize, + (uint64_t)(d_puncsize - d_puncholes)); set_output_multiple(d_puncsize); //set_msg_handler(boost::bind(&depuncture_bb_impl::catch_msg, this, _1)); } diff --git a/gr-fec/lib/encoder_impl.cc b/gr-fec/lib/encoder_impl.cc index dfa1f48592..ec5a818485 100644 --- a/gr-fec/lib/encoder_impl.cc +++ b/gr-fec/lib/encoder_impl.cc @@ -51,7 +51,8 @@ namespace gr { d_output_item_size(output_item_size) { set_fixed_rate(true); - set_relative_rate((double)my_encoder->get_output_size()/(double)my_encoder->get_input_size()); + set_relative_rate((uint64_t)my_encoder->get_output_size(), + (uint64_t)my_encoder->get_input_size()); set_output_multiple(my_encoder->get_output_size()); d_encoder = my_encoder; diff --git a/gr-fec/lib/puncture_bb_impl.cc b/gr-fec/lib/puncture_bb_impl.cc index 63633b2748..53808fb158 100644 --- a/gr-fec/lib/puncture_bb_impl.cc +++ b/gr-fec/lib/puncture_bb_impl.cc @@ -71,7 +71,8 @@ namespace gr { d_puncholes = count_mask - count_pat; set_fixed_rate(true); - set_relative_rate((double)(d_puncsize - d_puncholes)/d_puncsize); + set_relative_rate((uint64_t)(d_puncsize - d_puncholes), + (uint64_t)d_puncsize); set_output_multiple(d_puncsize - d_puncholes); //set_msg_handler(boost::bind(&puncture_bb_impl::catch_msg, this, _1)); } diff --git a/gr-fec/lib/puncture_ff_impl.cc b/gr-fec/lib/puncture_ff_impl.cc index 9a7c8f6dc2..abc3da541a 100644 --- a/gr-fec/lib/puncture_ff_impl.cc +++ b/gr-fec/lib/puncture_ff_impl.cc @@ -71,7 +71,8 @@ namespace gr { d_puncholes = count_mask - count_pat; set_fixed_rate(true); - set_relative_rate((double)(d_puncsize - d_puncholes)/d_puncsize); + set_relative_rate((uint64_t)(d_puncsize - d_puncholes), + (uint64_t)d_puncsize); set_output_multiple(d_puncsize - d_puncholes); //set_msg_handler(boost::bind(&puncture_ff_impl::catch_msg, this, _1)); } diff --git a/gr-filter/lib/fractional_interpolator_cc_impl.cc b/gr-filter/lib/fractional_interpolator_cc_impl.cc index 938c377cc8..2b7cc590bc 100644 --- a/gr-filter/lib/fractional_interpolator_cc_impl.cc +++ b/gr-filter/lib/fractional_interpolator_cc_impl.cc @@ -53,7 +53,7 @@ namespace gr { if(phase_shift < 0 || phase_shift > 1) throw std::out_of_range("phase shift ratio must be > 0 and < 1"); - set_relative_rate(1.0 / interp_ratio); + set_inverse_relative_rate(d_mu_inc); } fractional_interpolator_cc_impl::~fractional_interpolator_cc_impl() @@ -85,7 +85,7 @@ namespace gr { int oo = 0; // output index while(oo < noutput_items) { - out[oo++] = d_interp->interpolate(&in[ii], d_mu); + out[oo++] = d_interp->interpolate(&in[ii], (float)d_mu); double s = d_mu + d_mu_inc; double f = floor(s); @@ -102,25 +102,25 @@ namespace gr { float fractional_interpolator_cc_impl::mu() const { - return d_mu; + return (float)d_mu; } float fractional_interpolator_cc_impl::interp_ratio() const { - return d_mu_inc; + return (float)d_mu_inc; } void fractional_interpolator_cc_impl::set_mu(float mu) { - d_mu = mu; + d_mu = (double)mu; } void fractional_interpolator_cc_impl::set_interp_ratio(float interp_ratio) { - d_mu_inc = interp_ratio; + d_mu_inc = (double)interp_ratio; } } /* namespace filter */ diff --git a/gr-filter/lib/fractional_interpolator_cc_impl.h b/gr-filter/lib/fractional_interpolator_cc_impl.h index 786bccfbaf..215d49448b 100644 --- a/gr-filter/lib/fractional_interpolator_cc_impl.h +++ b/gr-filter/lib/fractional_interpolator_cc_impl.h @@ -33,8 +33,8 @@ namespace gr { : public fractional_interpolator_cc { private: - float d_mu; - float d_mu_inc; + double d_mu; + double d_mu_inc; mmse_fir_interpolator_cc *d_interp; public: diff --git a/gr-filter/lib/fractional_interpolator_ff_impl.cc b/gr-filter/lib/fractional_interpolator_ff_impl.cc index 60730aa6be..0d2c2b1082 100644 --- a/gr-filter/lib/fractional_interpolator_ff_impl.cc +++ b/gr-filter/lib/fractional_interpolator_ff_impl.cc @@ -53,7 +53,7 @@ namespace gr { if(phase_shift < 0 || phase_shift > 1) throw std::out_of_range("phase shift ratio must be > 0 and < 1"); - set_relative_rate(1.0 / interp_ratio); + set_inverse_relative_rate(d_mu_inc); } fractional_interpolator_ff_impl::~fractional_interpolator_ff_impl() @@ -85,7 +85,7 @@ namespace gr { int oo = 0; // output index while(oo < noutput_items) { - out[oo++] = d_interp->interpolate(&in[ii], d_mu); + out[oo++] = d_interp->interpolate(&in[ii], (float)d_mu); double s = d_mu + d_mu_inc; double f = floor(s); @@ -102,25 +102,25 @@ namespace gr { float fractional_interpolator_ff_impl::mu() const { - return d_mu; + return (float)d_mu; } float fractional_interpolator_ff_impl::interp_ratio() const { - return d_mu_inc; + return (float)d_mu_inc; } void fractional_interpolator_ff_impl::set_mu(float mu) { - d_mu = mu; + d_mu = (double)mu; } void fractional_interpolator_ff_impl::set_interp_ratio(float interp_ratio) { - d_mu_inc = interp_ratio; + d_mu_inc = (double)interp_ratio; } } /* namespace filter */ diff --git a/gr-filter/lib/fractional_interpolator_ff_impl.h b/gr-filter/lib/fractional_interpolator_ff_impl.h index 3b3047888f..c96873e7db 100644 --- a/gr-filter/lib/fractional_interpolator_ff_impl.h +++ b/gr-filter/lib/fractional_interpolator_ff_impl.h @@ -33,8 +33,8 @@ namespace gr { : public fractional_interpolator_ff { private: - float d_mu; - float d_mu_inc; + double d_mu; + double d_mu_inc; mmse_fir_interpolator_ff *d_interp; public: diff --git a/gr-filter/lib/fractional_resampler_cc_impl.cc b/gr-filter/lib/fractional_resampler_cc_impl.cc index 4d8def70cd..c4fabd4f9d 100644 --- a/gr-filter/lib/fractional_resampler_cc_impl.cc +++ b/gr-filter/lib/fractional_resampler_cc_impl.cc @@ -51,7 +51,7 @@ namespace gr { if(phase_shift < 0 || phase_shift > 1) throw std::out_of_range("phase shift ratio must be > 0 and < 1"); - set_relative_rate(1.0 / resamp_ratio); + set_inverse_relative_rate(d_mu_inc); message_port_register_in(pmt::intern("msg_in")); set_msg_handler(pmt::intern("msg_in"), boost::bind( &fractional_resampler_cc_impl::handle_msg, this, _1)); @@ -110,7 +110,7 @@ namespace gr { if(ninput_items.size() == 1) { while(oo < noutput_items) { - out[oo++] = d_resamp->interpolate(&in[ii], d_mu); + out[oo++] = d_resamp->interpolate(&in[ii], (float)d_mu); double s = d_mu + d_mu_inc; double f = floor(s); @@ -126,8 +126,8 @@ namespace gr { else { const float *rr = (const float*)input_items[1]; while(oo < noutput_items) { - out[oo++] = d_resamp->interpolate(&in[ii], d_mu); - d_mu_inc = rr[ii]; + out[oo++] = d_resamp->interpolate(&in[ii], (float)d_mu); + d_mu_inc = (double)rr[ii]; double s = d_mu + d_mu_inc; double f = floor(s); @@ -136,7 +136,7 @@ namespace gr { ii += incr; } - set_relative_rate(1.0 / d_mu_inc); + set_inverse_relative_rate(d_mu_inc); consume_each(ii); return noutput_items; } @@ -145,25 +145,25 @@ namespace gr { float fractional_resampler_cc_impl::mu() const { - return d_mu; + return (float)d_mu; } float fractional_resampler_cc_impl::resamp_ratio() const { - return d_mu_inc; + return (float)d_mu_inc; } void fractional_resampler_cc_impl::set_mu(float mu) { - d_mu = mu; + d_mu = (double)mu; } void fractional_resampler_cc_impl::set_resamp_ratio(float resamp_ratio) { - d_mu_inc = resamp_ratio; + d_mu_inc = (double)resamp_ratio; } } /* namespace filter */ diff --git a/gr-filter/lib/fractional_resampler_cc_impl.h b/gr-filter/lib/fractional_resampler_cc_impl.h index 8b7d9de317..811bedf633 100644 --- a/gr-filter/lib/fractional_resampler_cc_impl.h +++ b/gr-filter/lib/fractional_resampler_cc_impl.h @@ -33,8 +33,8 @@ namespace gr { : public fractional_resampler_cc { private: - float d_mu; - float d_mu_inc; + double d_mu; + double d_mu_inc; mmse_fir_interpolator_cc *d_resamp; public: diff --git a/gr-filter/lib/fractional_resampler_ff_impl.cc b/gr-filter/lib/fractional_resampler_ff_impl.cc index 6fcd7e53d3..9c427abfb0 100644 --- a/gr-filter/lib/fractional_resampler_ff_impl.cc +++ b/gr-filter/lib/fractional_resampler_ff_impl.cc @@ -51,7 +51,7 @@ namespace gr { if(phase_shift < 0 || phase_shift > 1) throw std::out_of_range("phase shift ratio must be > 0 and < 1"); - set_relative_rate(1.0 / resamp_ratio); + set_inverse_relative_rate(d_mu_inc); message_port_register_in(pmt::intern("msg_in")); set_msg_handler(pmt::intern("msg_in"), boost::bind( @@ -111,7 +111,7 @@ namespace gr { if(ninput_items.size() == 1) { while(oo < noutput_items) { - out[oo++] = d_resamp->interpolate(&in[ii], d_mu); + out[oo++] = d_resamp->interpolate(&in[ii], (float)d_mu); double s = d_mu + d_mu_inc; double f = floor(s); @@ -126,8 +126,8 @@ namespace gr { else { const float *rr = (const float*)input_items[1]; while(oo < noutput_items) { - out[oo++] = d_resamp->interpolate(&in[ii], d_mu); - d_mu_inc = rr[ii]; + out[oo++] = d_resamp->interpolate(&in[ii], (float)d_mu); + d_mu_inc = (double)rr[ii]; double s = d_mu + d_mu_inc; double f = floor(s); @@ -136,7 +136,7 @@ namespace gr { ii += incr; } - set_relative_rate(1.0 / d_mu_inc); + set_inverse_relative_rate(d_mu_inc); consume_each(ii); return noutput_items; } @@ -145,25 +145,25 @@ namespace gr { float fractional_resampler_ff_impl::mu() const { - return d_mu; + return (float)d_mu; } float fractional_resampler_ff_impl::resamp_ratio() const { - return d_mu_inc; + return (float)d_mu_inc; } void fractional_resampler_ff_impl::set_mu(float mu) { - d_mu = mu; + d_mu = (double)mu; } void fractional_resampler_ff_impl::set_resamp_ratio(float resamp_ratio) { - d_mu_inc = resamp_ratio; + d_mu_inc = (double)resamp_ratio; } } /* namespace filter */ diff --git a/gr-filter/lib/fractional_resampler_ff_impl.h b/gr-filter/lib/fractional_resampler_ff_impl.h index cccc1be4b3..15b0121c39 100644 --- a/gr-filter/lib/fractional_resampler_ff_impl.h +++ b/gr-filter/lib/fractional_resampler_ff_impl.h @@ -33,8 +33,8 @@ namespace gr { : public fractional_resampler_ff { private: - float d_mu; - float d_mu_inc; + double d_mu; + double d_mu_inc; mmse_fir_interpolator_ff *d_resamp; public: diff --git a/gr-filter/lib/pfb_decimator_ccf_impl.cc b/gr-filter/lib/pfb_decimator_ccf_impl.cc index 9d1d6f6139..8951820558 100644 --- a/gr-filter/lib/pfb_decimator_ccf_impl.cc +++ b/gr-filter/lib/pfb_decimator_ccf_impl.cc @@ -64,7 +64,7 @@ namespace gr { d_rotator[i] = gr_expj(i*d_chan*2*M_PI/d_rate); } - set_relative_rate(1.0/(float)decim); + set_relative_rate(1, (uint64_t)decim); if(d_use_fft_filters) { set_history(1); diff --git a/gr-filter/lib/rational_resampler_base_XXX_impl.cc.t b/gr-filter/lib/rational_resampler_base_XXX_impl.cc.t index 0b74e60969..4bf98d533e 100644 --- a/gr-filter/lib/rational_resampler_base_XXX_impl.cc.t +++ b/gr-filter/lib/rational_resampler_base_XXX_impl.cc.t @@ -61,7 +61,7 @@ namespace gr { if(decimation == 0) throw std::out_of_range("@IMPL_NAME@: decimation must be > 0"); - set_relative_rate(1.0 * interpolation / decimation); + set_relative_rate((uint64_t)interpolation, (uint64_t)decimation); set_output_multiple(1); std::vector<@TAP_TYPE@> dummy_taps; diff --git a/gr-trellis/lib/constellation_metrics_cf_impl.cc b/gr-trellis/lib/constellation_metrics_cf_impl.cc index 6aa7dce6c8..79dbe414bd 100644 --- a/gr-trellis/lib/constellation_metrics_cf_impl.cc +++ b/gr-trellis/lib/constellation_metrics_cf_impl.cc @@ -51,7 +51,7 @@ namespace gr { d_O(constellation->arity()), d_D(constellation->dimensionality()) { - set_relative_rate(1.0 * d_O / ((double) d_D)); + set_relative_rate((uint64_t)d_O, (uint64_t)d_D); set_output_multiple((int)d_O); } diff --git a/gr-trellis/lib/metrics_X_impl.cc.t b/gr-trellis/lib/metrics_X_impl.cc.t index 5e74e4b2fc..08dc2d1b17 100644 --- a/gr-trellis/lib/metrics_X_impl.cc.t +++ b/gr-trellis/lib/metrics_X_impl.cc.t @@ -50,7 +50,7 @@ namespace gr { io_signature::make(1, -1, sizeof (float))), d_O(O), d_D(D), d_TYPE(TYPE), d_TABLE(TABLE) { - set_relative_rate (1.0 * d_O / ((double) d_D)); + set_relative_rate ((uint64_t)d_O, (uint64_t)d_D); set_output_multiple ((int)d_O); } @@ -58,7 +58,7 @@ namespace gr { { gr::thread::scoped_lock guard(d_setlock); d_O = O; - set_relative_rate (1.0 * d_O / ((double) d_D)); + set_relative_rate ((uint64_t)d_O, (uint64_t)d_D); set_output_multiple ((int)d_O); } @@ -66,7 +66,7 @@ namespace gr { { gr::thread::scoped_lock guard(d_setlock); d_D = D; - set_relative_rate (1.0 * d_O / ((double) d_D)); + set_relative_rate ((uint64_t)d_O, (uint64_t)d_D); } void diff --git a/gr-trellis/lib/pccc_decoder_X_impl.cc.t b/gr-trellis/lib/pccc_decoder_X_impl.cc.t index aa19884712..14c169272a 100644 --- a/gr-trellis/lib/pccc_decoder_X_impl.cc.t +++ b/gr-trellis/lib/pccc_decoder_X_impl.cc.t @@ -69,7 +69,7 @@ namespace gr { d_repetitions(repetitions), d_SISO_TYPE(SISO_TYPE) { - set_relative_rate (1.0 / ((double) d_FSM1.O() * d_FSM2.O())); + set_relative_rate (1, (uint64_t)(d_FSM1.O() * d_FSM2.O())); set_output_multiple (d_blocklength); } diff --git a/gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t b/gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t index 5b3cdeeb62..fdde7a0e5d 100644 --- a/gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t +++ b/gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t @@ -79,7 +79,7 @@ namespace gr { d_scaling(scaling) { assert(d_FSMo.I() == d_FSMi.I()); - set_relative_rate (1.0 / ((double) d_D)); + set_relative_rate (1, (uint64_t) d_D); set_output_multiple (d_blocklength); } diff --git a/gr-trellis/lib/sccc_decoder_X_impl.cc.t b/gr-trellis/lib/sccc_decoder_X_impl.cc.t index d217bbccfb..9d8106b1ff 100644 --- a/gr-trellis/lib/sccc_decoder_X_impl.cc.t +++ b/gr-trellis/lib/sccc_decoder_X_impl.cc.t @@ -66,7 +66,7 @@ namespace gr { d_repetitions(repetitions), d_SISO_TYPE(SISO_TYPE) { - set_relative_rate(1.0 / ((double) d_FSMi.O())); + set_relative_rate(1, (uint64_t) d_FSMi.O()); set_output_multiple(d_blocklength); } diff --git a/gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t b/gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t index f66b1f37e7..2909b7b0b7 100644 --- a/gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t +++ b/gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t @@ -78,7 +78,7 @@ namespace gr { d_METRIC_TYPE(METRIC_TYPE), d_scaling(scaling) { - set_relative_rate(1.0 / ((double) d_D)); + set_relative_rate(1, (uint64_t) d_D); set_output_multiple(d_blocklength); } diff --git a/gr-trellis/lib/siso_combined_f_impl.cc b/gr-trellis/lib/siso_combined_f_impl.cc index 3b89684bf0..6c7a6c1d23 100644 --- a/gr-trellis/lib/siso_combined_f_impl.cc +++ b/gr-trellis/lib/siso_combined_f_impl.cc @@ -63,15 +63,15 @@ namespace gr { set_output_multiple(d_K*multiple); //what is the meaning of relative rate for a block with 2 inputs? - //set_relative_rate ( multiple / ((double) d_FSM.I()) ); + //set_relative_rate ((uint64_t) multiple, (uint64_t) d_FSM.I() ); // it turns out that the above gives problems in the scheduler, so // let's try (assumption O>I) - //set_relative_rate ( multiple / ((double) d_FSM.O()) ); + //set_relative_rate ((uint64_t) multiple, (uint64_t) d_FSM.O() ); // I am tempted to automate like this if(d_FSM.I() <= d_D) - set_relative_rate(multiple / ((double)d_D)); + set_relative_rate((uint64_t)multiple, (uint64_t)d_D); else - set_relative_rate(multiple / ((double)d_FSM.I())); + set_relative_rate((uint64_t)multiple, (uint64_t)d_FSM.I()); } diff --git a/gr-trellis/lib/siso_f_impl.cc b/gr-trellis/lib/siso_f_impl.cc index 2af5a21710..6ec6773ac5 100644 --- a/gr-trellis/lib/siso_f_impl.cc +++ b/gr-trellis/lib/siso_f_impl.cc @@ -61,15 +61,15 @@ namespace gr { set_output_multiple (d_K*multiple); //what is the meaning of relative rate for a block with 2 inputs? - //set_relative_rate ( multiple / ((double) d_FSM.I()) ); + //set_relative_rate ( (uint64_t) multiple, (uint64_t) d_FSM.I() ); // it turns out that the above gives problems in the scheduler, so // let's try (assumption O>I) - //set_relative_rate ( multiple / ((double) d_FSM.O()) ); + //set_relative_rate ( (uint64_t) multiple, (uint64_t) d_FSM.O() ); // I am tempted to automate like this if(d_FSM.I() <= d_FSM.O()) - set_relative_rate(multiple / ((double) d_FSM.O())); + set_relative_rate((uint64_t)multiple, (uint64_t)d_FSM.O()); else - set_relative_rate(multiple / ((double) d_FSM.I())); + set_relative_rate((uint64_t)multiple, (uint64_t)d_FSM.I()); } siso_f_impl::siso_f_impl(const fsm &FSM, int K, diff --git a/gr-trellis/lib/viterbi_X_impl.cc.t b/gr-trellis/lib/viterbi_X_impl.cc.t index 1d4864596e..c9592a299c 100644 --- a/gr-trellis/lib/viterbi_X_impl.cc.t +++ b/gr-trellis/lib/viterbi_X_impl.cc.t @@ -51,7 +51,7 @@ namespace gr { d_FSM(FSM), d_K(K), d_S0(S0), d_SK(SK)//, //d_trace(FSM.S()*K) { - set_relative_rate(1.0 / ((double)d_FSM.O())); + set_relative_rate(1, (uint64_t)d_FSM.O()); set_output_multiple(d_K); } @@ -59,7 +59,7 @@ namespace gr { { gr::thread::scoped_lock guard(d_setlock); d_FSM = FSM; - set_relative_rate(1.0 / ((double)d_FSM.O())); + set_relative_rate(1, (uint64_t)d_FSM.O()); } void @IMPL_NAME@::set_K(int K) diff --git a/gr-trellis/lib/viterbi_combined_XX_impl.cc.t b/gr-trellis/lib/viterbi_combined_XX_impl.cc.t index 722708bcd2..60ad731227 100644 --- a/gr-trellis/lib/viterbi_combined_XX_impl.cc.t +++ b/gr-trellis/lib/viterbi_combined_XX_impl.cc.t @@ -56,7 +56,7 @@ namespace gr { d_TABLE(TABLE), d_TYPE(TYPE)//, //d_trace(FSM.S()*K) { - set_relative_rate(1.0 / ((double)d_D)); + set_relative_rate(1, (uint64_t)d_D); set_output_multiple(d_K); } @@ -73,7 +73,7 @@ namespace gr { { gr::thread::scoped_lock guard(d_setlock); d_D = D; - set_relative_rate(1.0 / ((double)d_D)); + set_relative_rate(1, (uint64_t)d_D); } void @IMPL_NAME@::set_FSM(const fsm &FSM) |