Github messages for voidlinux
 help / color / mirror / Atom feed
* Re: [WIP] gnuradio: update to 3.8.0
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-13678@inbox.vuxu.org>
@ 2019-12-29 13:23 ` voidlinux-github
  2020-01-02 21:02 ` voidlinux-github
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 5+ messages in thread
From: voidlinux-github @ 2019-12-29 13:23 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 161 bytes --]

New comment by luzpaz on void-packages repository

https://github.com/void-linux/void-packages/pull/13678#issuecomment-569505214

Comment:
Any progress so far ?

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [WIP] gnuradio: update to 3.8.0
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-13678@inbox.vuxu.org>
  2019-12-29 13:23 ` [WIP] gnuradio: update to 3.8.0 voidlinux-github
@ 2020-01-02 21:02 ` voidlinux-github
  2020-01-02 21:25 ` [PR PATCH] [Updated] " voidlinux-github
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 5+ messages in thread
From: voidlinux-github @ 2020-01-02 21:02 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 277 bytes --]

New comment by abenson on void-packages repository

https://github.com/void-linux/void-packages/pull/13678#issuecomment-570347709

Comment:
Looks like several of the broken have been updated. Fixing/updating the ones I can, and waiting for a tagged release from `gnuradio-rds`

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PR PATCH] [Updated] [WIP] gnuradio: update to 3.8.0
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-13678@inbox.vuxu.org>
  2019-12-29 13:23 ` [WIP] gnuradio: update to 3.8.0 voidlinux-github
  2020-01-02 21:02 ` voidlinux-github
@ 2020-01-02 21:25 ` voidlinux-github
  2020-01-06 23:48 ` voidlinux-github
  2020-02-10  4:14 ` [PR PATCH] [Closed]: " voidlinux-github
  4 siblings, 0 replies; 5+ messages in thread
From: voidlinux-github @ 2020-01-02 21:25 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 328 bytes --]

There is an updated pull request by abenson against master on the void-packages repository

https://github.com/abenson/void-packages gnuradio_3.8.0
https://github.com/void-linux/void-packages/pull/13678

[WIP] gnuradio: update to 3.8.0


A patch file from https://github.com/void-linux/void-packages/pull/13678.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-gnuradio_3.8.0-13678.patch --]
[-- Type: text/x-diff, Size: 370795 bytes --]

From 1c9e1fdb3c438d79bbfc47ac9711267b6e5336c3 Mon Sep 17 00:00:00 2001
From: Andrew Benson <abenson+void@gmail.com>
Date: Wed, 14 Aug 2019 17:10:56 -0500
Subject: [PATCH 1/7] New package: mpir-3.0.0

---
 common/shlibs         |  2 ++
 srcpkgs/mpir-devel    |  1 +
 srcpkgs/mpir/template | 24 ++++++++++++++++++++++++
 3 files changed, 27 insertions(+)
 create mode 120000 srcpkgs/mpir-devel
 create mode 100644 srcpkgs/mpir/template

diff --git a/common/shlibs b/common/shlibs
index 611abc88b12..712264cdec8 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3709,3 +3709,5 @@ libnvpair.so.1 zfs-0.8.2_1
 libjsonnet.so.0 jsonnet-0.14.0_2
 libjsonnet++.so.0 jsonnet-0.14.0_2
 libigdgmm.so.12 intel-gmmlib-19.3.4_1
+libmpir.so.23 mpir-3.0.0_1
+libmpirxx.so.8 mpir-3.0.0_1
diff --git a/srcpkgs/mpir-devel b/srcpkgs/mpir-devel
new file mode 120000
index 00000000000..a316ff20552
--- /dev/null
+++ b/srcpkgs/mpir-devel
@@ -0,0 +1 @@
+mpir
\ No newline at end of file
diff --git a/srcpkgs/mpir/template b/srcpkgs/mpir/template
new file mode 100644
index 00000000000..2b35d50eec8
--- /dev/null
+++ b/srcpkgs/mpir/template
@@ -0,0 +1,24 @@
+# Template file for 'mpir'
+pkgname=mpir
+version=3.0.0
+revision=1
+build_style=gnu-configure
+configure_args="--enable-cxx"
+hostmakedepends="m4 yasm"
+short_desc="Multiple Precision Integers and Rationals"
+maintainer="Andrew Benson <abenson+void@gmail.com>"
+license="LGPL-3.0-or-later"
+homepage="http://mpir.org"
+distfiles="${homepage}/mpir-${version}.tar.bz2"
+checksum=52f63459cf3f9478859de29e00357f004050ead70b45913f2c2269d9708675bb
+
+mpir-devel_package() {
+	short_desc+=" - development files"
+	depends="${sourcepkg}>=${version}_${revision}"
+	pkg_install() {
+		vmove usr/include
+		vmove usr/share
+		vmove "usr/lib/*.a"
+		vmove "usr/lib/*.so"
+	}
+}

From 0d41278cc023a85dfd56c62b74a3737da4409950 Mon Sep 17 00:00:00 2001
From: Andrew Benson <abenson+void@gmail.com>
Date: Wed, 14 Aug 2019 16:49:08 -0500
Subject: [PATCH 2/7] volk: update to 2.1.0.

---
 common/shlibs         | 19 ++++++++++++++++++-
 srcpkgs/volk/template | 15 ++++++++-------
 2 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/common/shlibs b/common/shlibs
index 712264cdec8..fe785751f0d 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -3083,7 +3083,7 @@ libarcan_shmif_server.so.0.11 arcan-0.5.4.3_1
 libarcan_tui.so.0.11 arcan-0.5.4.3_1
 liblwipv6.so.2 lwipv6-1.5a_1
 libpipewire-0.2.so.1 libpipewire-0.2.2_1
-libvolk.so.1.4 volk-1.4_1
+libvolk.so.2.0 volk-2.0.0_1
 libgnuradio-runtime-3.7.13.5.so.0.0.0 gnuradio-3.7.13.5_1
 libgnuradio-pmt-3.7.13.5.so.0.0.0 gnuradio-3.7.13.5_1
 libgnuradio-blocks-3.7.13.5.so.0.0.0 gnuradio-3.7.13.5_1
@@ -3105,6 +3105,23 @@ libgnuradio-fcd-3.7.13.5.so.0.0.0 gnuradio-3.7.13.5_1
 libgnuradio-wavelet-3.7.13.5.so.0.0.0 gnuradio-3.7.13.5_1
 libgnuradio-wxgui-3.7.13.5.so.0.0.0 gnuradio-3.7.13.5_1
 libgnuradio-uhd-3.7.13.5.so.0.0.0 gnuradio-3.7.13.5_1
+libvolk.so.2.1 volk-2.1.0_1
+libgnuradio-runtime.so.3.8.0 gnuradio-3.8.0.0_1
+libgnuradio-pmt.so.3.8.0 gnuradio-3.8.0.0_1
+libgnuradio-blocks.so.3.8.0 gnuradio-3.8.0.0_1
+libgnuradio-audio.so.3.8.0 gnuradio-3.8.0.0_1
+libgnuradio-fec.so.3.8.0 gnuradio-3.8.0.0_1
+libgnuradio-fft.so.3.8.0 gnuradio-3.8.0.0_1
+libgnuradio-filter.so.3.8.0 gnuradio-3.8.0.0_1
+libgnuradio-analog.so.3.8.0 gnuradio-3.8.0.0_1
+libgnuradio-digital.so.3.8.0 gnuradio-3.8.0.0_1
+libgnuradio-dtv.so.3.8.0 gnuradio-3.8.0.0_1
+libgnuradio-channels.so.3.8.0 gnuradio-3.8.0.0_1
+libgnuradio-trellis.so.3.8.0 gnuradio-3.8.0.0_1
+libgnuradio-video-sdl.so.3.8.0 gnuradio-3.8.0.0_1
+libgnuradio-vocoder.so.3.8.0 gnuradio-3.8.0.0_1
+libgnuradio-wavelet.so.3.8.0 gnuradio-3.8.0.0_1
+libgnuradio-uhd.so.3.8.0 gnuradio-3.8.0.0_1
 libgnuradio-osmosdr-0.1.4.so.0.0.0 gnuradio-osmosdr-0.1.4_1
 libflann_cpp.so.1.9 flann-1.9.1_1
 libflann.so.1.9 flann-1.9.1_1
diff --git a/srcpkgs/volk/template b/srcpkgs/volk/template
index abcb263cb0b..a95eb127f14 100644
--- a/srcpkgs/volk/template
+++ b/srcpkgs/volk/template
@@ -1,18 +1,19 @@
 # Template file for 'volk'
 pkgname=volk
-version=1.4
-revision=4
+version=2.1.0
+revision=1
 build_style=cmake
-hostmakedepends="pkg-config python-cheetah git python-Mako
- python-six"
-makedepends="boost-devel python-cheetah python-devel
- python-Mako python-six"
+hostmakedepends="pkg-config python3-cheetah3 git python3-Mako
+ python3-six"
+makedepends="boost-devel python3-cheetah3 python3-devel
+ python3-Mako python3-six"
 short_desc="Vector-Optimized Library of Kernels"
 maintainer="Andrew Benson <abenson+void@gmail.com>"
 license="GPL-3.0-or-later"
 homepage="http://libvolk.org/"
 distfiles="https://github.com/gnuradio/volk/archive/v${version}.tar.gz"
-checksum=32131ba17846850c07270bc5897dd2de7130ec02ca029875a36966335120e7bf
+checksum=fe422f10b880d10cb72bdd1a3362a0f65d2d6d655dd1296459773c89fae51781
+nocross="not complete for arm"
 
 case "$XBPS_TARGET_MACHINE" in
 	armv6l*)

From bc74a02dfb1b1aaa35ecc433884b3ccdcd615397 Mon Sep 17 00:00:00 2001
From: Andrew Benson <abenson+void@gmail.com>
Date: Wed, 14 Aug 2019 16:49:11 -0500
Subject: [PATCH 3/7] gnuradio: update to 3.8.0.0.

---
 srcpkgs/gnuradio/template | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/srcpkgs/gnuradio/template b/srcpkgs/gnuradio/template
index d450b7674be..fd2d51920c9 100644
--- a/srcpkgs/gnuradio/template
+++ b/srcpkgs/gnuradio/template
@@ -1,23 +1,24 @@
 # Template file for 'gnuradio'
 pkgname=gnuradio
-version=3.7.13.5
-revision=2
+version=3.8.0.0
+revision=1
 build_style=cmake
-nocross="relies on volk, which is not complete for arm"
 conf_files="/etc/gnuradio/conf.d/*"
-configure_args="-DENABLE_INTERNAL_VOLK=OFF"
-pycompile_module="gnuradio grc_gnuradio pmt"
-hostmakedepends="pkg-config doxygen swig python-cheetah python-lxml
- python-numpy python-Sphinx"
+configure_args="-DENABLE_INTERNAL_VOLK=OFF -DGR_PYTHON_DIR=${py3_sitelib}"
+pycompile_module="gnuradio pmt"
+hostmakedepends="pkg-config doxygen swig python3-Mako python3-Sphinx
+ python3-cairo python3-numpy python3-yaml"
 makedepends="SDL-devel boost-devel fftw-devel gsl-devel jack-devel libgsm-devel
- libusb-devel pygtk-devel volk-devel wxPython-devel uhd-devel python-devel"
-depends="pygtk python-cheetah python-lxml python-numpy"
+ libusb-devel volk-devel uhd-devel gtk+3-devel python3-devel python3-gobject-devel
+ log4cpp-devel gmpxx-devel mpir-devel"
+depends="python3-cheetah3 python3-numpy python3-Mako python3-gobject python3-yaml"
 short_desc="Framework for software defined radio"
 maintainer="Andrew Benson <abenson+void@gmail.com>"
 license="GPL-3.0-or-later"
 homepage="https://www.gnuradio.org"
 distfiles="https://github.com/gnuradio/gnuradio/archive/v${version}.tar.gz"
-checksum=9afcd0e4499160bce17c8c5c100f461791ad26b4bcb967d956fb9567e74dd57f
+checksum=03fd01f0b27033befb91709b3d56f95e0869b5fb8bc71bec2662266a3f0dedf5
+nocross="relies on volk, which is not complete for arm"
 
 if [ "$CROSS_BUILD" ]; then
 	nocross="https://build.voidlinux.org/builders/armv7l_builder/builds/7596/steps/shell_3/logs/stdio"
@@ -25,7 +26,6 @@ fi
 
 post_install() {
 	rm ${DESTDIR}/usr/share/gnuradio/examples/audio/dial_tone \
-		${DESTDIR}/usr/share/gnuradio/examples/fcd/fcd_nfm_rx \
 		${DESTDIR}/usr/share/gnuradio/examples/uhd/tags_demo
 	vinstall grc/scripts/freedesktop/gnuradio-grc.desktop 644 \
 		usr/share/applications

From 41449b493c20ac43411aa052814da2ea16bcf4f3 Mon Sep 17 00:00:00 2001
From: Andrew Benson <abenson+void@gmail.com>
Date: Wed, 4 Sep 2019 21:19:55 -0500
Subject: [PATCH 4/7] gqrx: rebuild for gnuradio

---
 srcpkgs/gqrx/template | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/srcpkgs/gqrx/template b/srcpkgs/gqrx/template
index 9fbb38c9392..968d118506d 100644
--- a/srcpkgs/gqrx/template
+++ b/srcpkgs/gqrx/template
@@ -1,7 +1,7 @@
 # Template file for 'gqrx'
 pkgname=gqrx
 version=2.11.5
-revision=5
+revision=6
 wrksrc="gqrx-sdr-${version}"
 build_style=cmake
 configure_args="$(vopt_if gr_audio -DLINUX_AUDIO_BACKEND=Gr-audio)

From 42c1fb9af7c30051226d9a4bc832acc53581642d Mon Sep 17 00:00:00 2001
From: Andrew Benson <abenson+void@gmail.com>
Date: Wed, 4 Sep 2019 21:19:55 -0500
Subject: [PATCH 5/7] gnuradio-osmosdr: update to 0.1.5.

---
 srcpkgs/gnuradio-osmosdr/template | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/srcpkgs/gnuradio-osmosdr/template b/srcpkgs/gnuradio-osmosdr/template
index 83603dd207d..7c27426de2d 100644
--- a/srcpkgs/gnuradio-osmosdr/template
+++ b/srcpkgs/gnuradio-osmosdr/template
@@ -1,19 +1,19 @@
 # Template file for 'gnuradio-osmosdr'
 pkgname=gnuradio-osmosdr
-version=0.1.4
-revision=6
+version=0.1.5
+revision=1
 wrksrc="gr-osmosdr-${version}"
 build_style=cmake
 pycompile_module="osmosdr"
 hostmakedepends="pkg-config python-cheetah swig"
 makedepends="boost-devel gnuradio-devel libairspy-devel libhackrf-devel librtlsdr-devel
- python-devel uhd-devel"
+ python3-devel uhd-devel log4cpp-devel gmp-devel mpir-devel SoapySDR-devel"
 short_desc="GNU Radio source block for rtlsdr, hackrf and airspy"
 maintainer="bra1nwave <brainwave@openmailbox.org>"
 license="GPL-3.0-or-later"
 homepage="https://sdr.osmocom.org/trac/"
 distfiles="https://github.com/osmocom/gr-osmosdr/archive/v${version}.tar.gz"
-checksum=bcf9a9b1760e667c41a354e8cd41ef911d0929d5e4a18e0594ccb3320d735066
+checksum=a5820e80465d895a9b4b73e0ff01924d6b612a9a390bbd3488177379a9539d00
 
 gnuradio-osmosdr-devel_package() {
 	short_desc+=" - development files"

From 0f2da46b1a311f581ac8268ee90f4f782f052524 Mon Sep 17 00:00:00 2001
From: Andrew Benson <abenson+void@gmail.com>
Date: Wed, 4 Sep 2019 21:19:56 -0500
Subject: [PATCH 6/7] gnuradio-nrsc5: rebuild for gnuradio

---
 srcpkgs/gnuradio-nrsc5/patches/py3.8.patch | 13121 +++++++++++++++++++
 srcpkgs/gnuradio-nrsc5/template            |     6 +-
 2 files changed, 13125 insertions(+), 2 deletions(-)
 create mode 100644 srcpkgs/gnuradio-nrsc5/patches/py3.8.patch

diff --git a/srcpkgs/gnuradio-nrsc5/patches/py3.8.patch b/srcpkgs/gnuradio-nrsc5/patches/py3.8.patch
new file mode 100644
index 00000000000..902a0de4355
--- /dev/null
+++ b/srcpkgs/gnuradio-nrsc5/patches/py3.8.patch
@@ -0,0 +1,13121 @@
+https://github.com/argilo/gr-nrsc5/commit/4f5fe69e69dd2dcef99582f7d4393660f78308bf.patch
+
+From 4f5fe69e69dd2dcef99582f7d4393660f78308bf Mon Sep 17 00:00:00 2001
+From: Clayton Smith <argilo@gmail.com>
+Date: Sat, 27 Jul 2019 10:34:29 -0400
+Subject: [PATCH] GNU Radio 3.8 support.
+
+---
+ CMakeLists.txt                                |  147 +-
+ README.md                                     |    1 -
+ apps/CMakeLists.txt                           |    3 +-
+ apps/hd_tx_hackrf.grc                         | 2679 -------------
+ apps/hd_tx_hackrf.py                          |  157 -
+ apps/hd_tx_rtl_file.grc                       | 1908 +++-------
+ apps/hd_tx_rtl_file.py                        |   52 +-
+ apps/hd_tx_usrp.grc                           | 3333 +++++------------
+ apps/hd_tx_usrp.py                            |   90 +-
+ cmake/Modules/CMakeParseArgumentsCopy.cmake   |    2 +-
+ cmake/Modules/FindCppUnit.cmake               |   39 -
+ cmake/Modules/FindGnuradioRuntime.cmake       |   36 -
+ cmake/Modules/GrMiscUtils.cmake               |  528 ---
+ cmake/Modules/GrPlatform.cmake                |   62 -
+ cmake/Modules/GrPython.cmake                  |  241 --
+ cmake/Modules/GrSwig.cmake                    |  256 --
+ cmake/Modules/GrTest.cmake                    |  143 -
+ cmake/Modules/UseSWIG.cmake                   |  304 --
+ cmake/Modules/nrsc5Config.cmake               |    5 +-
+ .../Modules/targetConfig.cmake.in             |   40 +-
+ docs/CMakeLists.txt                           |    3 +-
+ docs/doxygen/CMakeLists.txt                   |    3 +-
+ docs/doxygen/Doxyfile.in                      |   10 +-
+ docs/doxygen/Doxyfile.swig_doc.in             |    8 +-
+ docs/doxygen/doxyxml/__init__.py              |    6 +-
+ docs/doxygen/doxyxml/base.py                  |   21 +-
+ docs/doxygen/doxyxml/doxyindex.py             |   11 +-
+ docs/doxygen/doxyxml/generated/__init__.py    |    1 +
+ docs/doxygen/doxyxml/generated/compound.py    |    8 +-
+ .../doxyxml/generated/compoundsuper.py        |   40 +-
+ docs/doxygen/doxyxml/generated/index.py       |    6 +-
+ docs/doxygen/doxyxml/generated/indexsuper.py  |   21 +-
+ docs/doxygen/doxyxml/text.py                  |    8 +-
+ docs/doxygen/swig_doc.py                      |   26 +-
+ grc/CMakeLists.txt                            |   27 +-
+ grc/nrsc5_hdc_encoder.block.yml               |   33 +
+ grc/nrsc5_hdc_encoder.xml                     |   31 -
+ grc/nrsc5_l1_fm_encoder_mp1.block.yml         |   26 +
+ grc/nrsc5_l1_fm_encoder_mp1.xml               |   23 -
+ grc/nrsc5_l1_fm_encoder_mp11.block.yml        |   34 +
+ grc/nrsc5_l1_fm_encoder_mp11.xml              |   33 -
+ grc/nrsc5_l1_fm_encoder_mp2.block.yml         |   30 +
+ grc/nrsc5_l1_fm_encoder_mp2.xml               |   28 -
+ grc/nrsc5_l1_fm_encoder_mp3.block.yml         |   30 +
+ grc/nrsc5_l1_fm_encoder_mp3.xml               |   28 -
+ grc/nrsc5_l1_fm_encoder_mp5.block.yml         |   34 +
+ grc/nrsc5_l1_fm_encoder_mp5.xml               |   33 -
+ grc/nrsc5_l1_fm_encoder_mp5_ms1.block.yml     |   46 +
+ grc/nrsc5_l1_fm_encoder_mp5_ms1.xml           |   48 -
+ grc/nrsc5_l1_fm_encoder_mp6.block.yml         |   30 +
+ grc/nrsc5_l1_fm_encoder_mp6.xml               |   28 -
+ grc/nrsc5_l1_fm_encoder_mp6_ms1.block.yml     |   42 +
+ grc/nrsc5_l1_fm_encoder_mp6_ms1.xml           |   43 -
+ grc/nrsc5_l2_encoder.block.yml                |   44 +
+ grc/nrsc5_l2_encoder.xml                      |   71 -
+ grc/nrsc5_psd_encoder.block.yml               |   31 +
+ grc/nrsc5_psd_encoder.xml                     |   31 -
+ grc/nrsc5_sis_encoder.block.yml               |   24 +
+ grc/nrsc5_sis_encoder.xml                     |   20 -
+ include/nrsc5/CMakeLists.txt                  |    9 +-
+ include/nrsc5/api.h                           |    3 +-
+ include/nrsc5/hdc_encoder.h                   |    1 -
+ include/nrsc5/l1_fm_encoder.h                 |    1 -
+ include/nrsc5/l2_encoder.h                    |    1 -
+ include/nrsc5/psd_encoder.h                   |    1 -
+ include/nrsc5/sis_encoder.h                   |    1 -
+ lib/CMakeLists.txt                            |   64 +-
+ lib/hdc_encoder_impl.cc                       |    1 +
+ lib/hdc_encoder_impl.h                        |    1 +
+ lib/l1_fm_encoder_impl.cc                     |    1 +
+ lib/l1_fm_encoder_impl.h                      |    1 +
+ lib/l2_encoder_impl.cc                        |    1 +
+ lib/l2_encoder_impl.h                         |    1 +
+ lib/psd_encoder_impl.cc                       |    1 +
+ lib/qa_nrsc5.cc                               |   36 -
+ lib/qa_nrsc5.h                                |   38 -
+ lib/sis_encoder_impl.cc                       |    1 +
+ lib/test_nrsc5.cc                             |   48 -
+ python/CMakeLists.txt                         |    7 +-
+ python/__init__.py                            |    7 +-
+ python/build_utils.py                         |  226 --
+ python/qa_hdc_encoder.py                      |   14 +-
+ python/qa_l1_fm_encoder.py                    |   14 +-
+ python/qa_l2_encoder.py                       |   14 +-
+ python/qa_psd_encoder.py                      |   14 +-
+ python/qa_sis_encoder.py                      |   14 +-
+ swig/CMakeLists.txt                           |   15 +-
+ swig/nrsc5_swig.i                             |   15 +-
+ 88 files changed, 2112 insertions(+), 9485 deletions(-)
+ delete mode 100644 apps/hd_tx_hackrf.grc
+ delete mode 100755 apps/hd_tx_hackrf.py
+ delete mode 100644 cmake/Modules/FindCppUnit.cmake
+ delete mode 100644 cmake/Modules/FindGnuradioRuntime.cmake
+ delete mode 100644 cmake/Modules/GrMiscUtils.cmake
+ delete mode 100644 cmake/Modules/GrPlatform.cmake
+ delete mode 100644 cmake/Modules/GrPython.cmake
+ delete mode 100644 cmake/Modules/GrSwig.cmake
+ delete mode 100644 cmake/Modules/GrTest.cmake
+ delete mode 100644 cmake/Modules/UseSWIG.cmake
+ rename python/build_utils_codes.py => cmake/Modules/targetConfig.cmake.in (52%)
+ create mode 100644 grc/nrsc5_hdc_encoder.block.yml
+ delete mode 100644 grc/nrsc5_hdc_encoder.xml
+ create mode 100644 grc/nrsc5_l1_fm_encoder_mp1.block.yml
+ delete mode 100644 grc/nrsc5_l1_fm_encoder_mp1.xml
+ create mode 100644 grc/nrsc5_l1_fm_encoder_mp11.block.yml
+ delete mode 100644 grc/nrsc5_l1_fm_encoder_mp11.xml
+ create mode 100644 grc/nrsc5_l1_fm_encoder_mp2.block.yml
+ delete mode 100644 grc/nrsc5_l1_fm_encoder_mp2.xml
+ create mode 100644 grc/nrsc5_l1_fm_encoder_mp3.block.yml
+ delete mode 100644 grc/nrsc5_l1_fm_encoder_mp3.xml
+ create mode 100644 grc/nrsc5_l1_fm_encoder_mp5.block.yml
+ delete mode 100644 grc/nrsc5_l1_fm_encoder_mp5.xml
+ create mode 100644 grc/nrsc5_l1_fm_encoder_mp5_ms1.block.yml
+ delete mode 100644 grc/nrsc5_l1_fm_encoder_mp5_ms1.xml
+ create mode 100644 grc/nrsc5_l1_fm_encoder_mp6.block.yml
+ delete mode 100644 grc/nrsc5_l1_fm_encoder_mp6.xml
+ create mode 100644 grc/nrsc5_l1_fm_encoder_mp6_ms1.block.yml
+ delete mode 100644 grc/nrsc5_l1_fm_encoder_mp6_ms1.xml
+ create mode 100644 grc/nrsc5_l2_encoder.block.yml
+ delete mode 100644 grc/nrsc5_l2_encoder.xml
+ create mode 100644 grc/nrsc5_psd_encoder.block.yml
+ delete mode 100644 grc/nrsc5_psd_encoder.xml
+ create mode 100644 grc/nrsc5_sis_encoder.block.yml
+ delete mode 100644 grc/nrsc5_sis_encoder.xml
+ delete mode 100644 lib/qa_nrsc5.cc
+ delete mode 100644 lib/qa_nrsc5.h
+ delete mode 100644 lib/test_nrsc5.cc
+ delete mode 100644 python/build_utils.py
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 1beb55f..dd5c257 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -1,6 +1,7 @@
+-# Copyright 2011,2012,2014,2016 Free Software Foundation, Inc.
++# Copyright 2011,2012,2014,2016,2018 Free Software Foundation, Inc.
+ #
+-# This file is part of GNU Radio
++# This file was generated by gr_modtool, a tool from the GNU Radio framework
++# This file is a part of gr-nrsc5
+ #
+ # 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
+@@ -20,94 +21,86 @@
+ ########################################################################
+ # Project setup
+ ########################################################################
+-cmake_minimum_required(VERSION 2.6)
++cmake_minimum_required(VERSION 3.8)
+ project(gr-nrsc5 CXX C)
+ enable_testing()
+ 
+-#install to PyBOMBS target prefix if defined
++# Install to PyBOMBS target prefix if defined
+ if(DEFINED ENV{PYBOMBS_PREFIX})
+     set(CMAKE_INSTALL_PREFIX $ENV{PYBOMBS_PREFIX})
+     message(STATUS "PyBOMBS installed GNU Radio. Setting CMAKE_INSTALL_PREFIX to $ENV{PYBOMBS_PREFIX}")
+ endif()
+ 
+-#select the release build type by default to get optimization flags
++# Select the release build type by default to get optimization flags
+ if(NOT CMAKE_BUILD_TYPE)
+    set(CMAKE_BUILD_TYPE "Release")
+    message(STATUS "Build type not specified: defaulting to release.")
+ endif(NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "")
+ 
+-#make sure our local CMake Modules path comes first
++# Make sure our local CMake Modules path comes first
+ list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_SOURCE_DIR}/cmake/Modules)
+ 
+ # Set the version information here
+-set(VERSION_INFO_MAJOR_VERSION 1)
+-set(VERSION_INFO_API_COMPAT    0)
+-set(VERSION_INFO_MINOR_VERSION 0)
+-set(VERSION_INFO_MAINT_VERSION git)
++set(VERSION_MAJOR 1)
++set(VERSION_API    0)
++set(VERSION_ABI 0)
++set(VERSION_PATCH git)
+ 
+-# Set cmake policies.
+-# This will suppress developer warnings during the cmake process that can occur
+-# if a newer cmake version than the minimum is used.
++cmake_policy(SET CMP0011 NEW)
+ 
+-if(POLICY CMP0026)
+-    cmake_policy(SET CMP0026 OLD)
+-endif()
+-if(POLICY CMP0043)
+-    cmake_policy(SET CMP0043 OLD)
+-endif()
+-if(POLICY CMP0045)
+-    cmake_policy(SET CMP0045 OLD)
+-endif()
+-if(POLICY CMP0046)
+-    cmake_policy(SET CMP0046 OLD)
+-endif()
++# Enable generation of compile_commands.json for code completion engines
++set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
+ 
+ ########################################################################
+ # Compiler specific setup
+ ########################################################################
+-if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
++if((CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR
++    CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
++    AND NOT WIN32)
+     #http://gcc.gnu.org/wiki/Visibility
+     add_definitions(-fvisibility=hidden)
+ endif()
+ 
+-########################################################################
+-# Find boost
+-########################################################################
+-if(UNIX AND EXISTS "/usr/lib64")
+-    list(APPEND BOOST_LIBRARYDIR "/usr/lib64") #fedora 64-bit fix
+-endif(UNIX AND EXISTS "/usr/lib64")
+-set(Boost_ADDITIONAL_VERSIONS
+-    "1.35.0" "1.35" "1.36.0" "1.36" "1.37.0" "1.37" "1.38.0" "1.38" "1.39.0" "1.39"
+-    "1.40.0" "1.40" "1.41.0" "1.41" "1.42.0" "1.42" "1.43.0" "1.43" "1.44.0" "1.44"
+-    "1.45.0" "1.45" "1.46.0" "1.46" "1.47.0" "1.47" "1.48.0" "1.48" "1.49.0" "1.49"
+-    "1.50.0" "1.50" "1.51.0" "1.51" "1.52.0" "1.52" "1.53.0" "1.53" "1.54.0" "1.54"
+-    "1.55.0" "1.55" "1.56.0" "1.56" "1.57.0" "1.57" "1.58.0" "1.58" "1.59.0" "1.59"
+-    "1.60.0" "1.60" "1.61.0" "1.61" "1.62.0" "1.62" "1.63.0" "1.63" "1.64.0" "1.64"
+-    "1.65.0" "1.65" "1.66.0" "1.66" "1.67.0" "1.67" "1.68.0" "1.68" "1.69.0" "1.69"
+-)
+-find_package(Boost "1.35" COMPONENTS filesystem system)
+-
+-if(NOT Boost_FOUND)
+-    message(FATAL_ERROR "Boost required to compile nrsc5")
+-endif()
++IF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
++    SET(CMAKE_CXX_STANDARD 11)
++ELSEIF(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
++    SET(CMAKE_CXX_STANDARD 11)
++ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
++    SET(CMAKE_CXX_STANDARD 11)
++ELSE()
++    message(WARNING "C++ standard could not be set because compiler is not GNU, Clang or MSVC.")
++ENDIF()
++
++IF(CMAKE_C_COMPILER_ID STREQUAL "GNU")
++    SET(CMAKE_C_STANDARD 11)
++ELSEIF(CMAKE_C_COMPILER_ID MATCHES "Clang")
++    SET(CMAKE_C_STANDARD 11)
++ELSEIF(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
++    SET(CMAKE_C_STANDARD 11)
++ELSE()
++    message(WARNING "C standard could not be set because compiler is not GNU, Clang or MSVC.")
++ENDIF()
+ 
+ ########################################################################
+ # Install directories
+ ########################################################################
++find_package(Gnuradio "3.8" REQUIRED COMPONENTS blocks fec)
++find_package(GSL)
++include(GrVersion)
++
+ include(GrPlatform) #define LIB_SUFFIX
+-set(GR_RUNTIME_DIR      bin)
+-set(GR_LIBRARY_DIR      lib${LIB_SUFFIX})
++
++if(NOT CMAKE_MODULES_DIR)
++  set(CMAKE_MODULES_DIR lib${LIB_SUFFIX}/cmake)
++endif(NOT CMAKE_MODULES_DIR)
++
+ set(GR_INCLUDE_DIR      include/nrsc5)
+-set(GR_DATA_DIR         share)
++set(GR_CMAKE_DIR        ${CMAKE_MODULES_DIR}/nrsc5)
+ set(GR_PKG_DATA_DIR     ${GR_DATA_DIR}/${CMAKE_PROJECT_NAME})
+-set(GR_DOC_DIR          ${GR_DATA_DIR}/doc)
+ set(GR_PKG_DOC_DIR      ${GR_DOC_DIR}/${CMAKE_PROJECT_NAME})
+-set(GR_CONF_DIR         etc)
+ set(GR_PKG_CONF_DIR     ${GR_CONF_DIR}/${CMAKE_PROJECT_NAME}/conf.d)
+-set(GR_LIBEXEC_DIR      libexec)
+ set(GR_PKG_LIBEXEC_DIR  ${GR_LIBEXEC_DIR}/${CMAKE_PROJECT_NAME})
+-set(GRC_BLOCKS_DIR      ${GR_PKG_DATA_DIR}/grc/blocks)
+ 
+ ########################################################################
+ # On Apple only, set install name and use rpath correctly, if not already set
+@@ -132,54 +125,17 @@ endif(APPLE)
+ ########################################################################
+ # Find gnuradio build dependencies
+ ########################################################################
+-find_package(CppUnit)
+ find_package(Doxygen)
+ 
+-# Search for GNU Radio and its components and versions. Add any
+-# components required to the list of GR_REQUIRED_COMPONENTS (in all
+-# caps such as FILTER or FFT) and change the version to the minimum
+-# API compatible version required.
+-set(GR_REQUIRED_COMPONENTS RUNTIME FEC PMT)
+-find_package(Gnuradio "3.7.2" REQUIRED)
+-list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_SOURCE_DIR}/cmake/Modules)
+-include(GrVersion)
+-
+-if(NOT CPPUNIT_FOUND)
+-    message(FATAL_ERROR "CppUnit required to compile nrsc5")
+-endif()
+-
+ ########################################################################
+ # Setup doxygen option
+ ########################################################################
+ if(DOXYGEN_FOUND)
+-	option(ENABLE_DOXYGEN "Build docs using Doxygen" ON)
++    option(ENABLE_DOXYGEN "Build docs using Doxygen" ON)
+ else(DOXYGEN_FOUND)
+-	option(ENABLE_DOXYGEN "Build docs using Doxygen" OFF)
++    option(ENABLE_DOXYGEN "Build docs using Doxygen" OFF)
+ endif(DOXYGEN_FOUND)
+ 
+-########################################################################
+-# Setup the include and linker paths
+-########################################################################
+-include_directories(
+-    ${CMAKE_SOURCE_DIR}/lib
+-    ${CMAKE_SOURCE_DIR}/include
+-    ${CMAKE_BINARY_DIR}/lib
+-    ${CMAKE_BINARY_DIR}/include
+-    ${Boost_INCLUDE_DIRS}
+-    ${CPPUNIT_INCLUDE_DIRS}
+-    ${GNURADIO_ALL_INCLUDE_DIRS}
+-)
+-
+-link_directories(
+-    ${Boost_LIBRARY_DIRS}
+-    ${CPPUNIT_LIBRARY_DIRS}
+-    ${GNURADIO_RUNTIME_LIBRARY_DIRS}
+-)
+-
+-# Set component parameters
+-set(GR_NRSC5_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include CACHE INTERNAL "" FORCE)
+-set(GR_NRSC5_SWIG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/swig CACHE INTERNAL "" FORCE)
+-
+ ########################################################################
+ # Create uninstall target
+ ########################################################################
+@@ -226,18 +182,15 @@ endif()
+ ########################################################################
+ add_subdirectory(include/nrsc5)
+ add_subdirectory(lib)
++add_subdirectory(apps)
++add_subdirectory(docs)
+ add_subdirectory(swig)
+ add_subdirectory(python)
+ add_subdirectory(grc)
+-add_subdirectory(apps)
+-add_subdirectory(docs)
+ 
+ ########################################################################
+ # Install cmake search helper for this library
+ ########################################################################
+-if(NOT CMAKE_MODULES_DIR)
+-  set(CMAKE_MODULES_DIR lib${LIB_SUFFIX}/cmake)
+-endif(NOT CMAKE_MODULES_DIR)
+ 
+ install(FILES cmake/Modules/nrsc5Config.cmake
+     DESTINATION ${CMAKE_MODULES_DIR}/nrsc5
+diff --git a/README.md b/README.md
+index 366f5a7..c11286a 100644
+--- a/README.md
++++ b/README.md
+@@ -84,7 +84,6 @@ The output bytes map to symbols as follows:
+ Several sample flowgraphs are available in the apps folder:
+ 
+ * hd_tx_usrp.grc, hd_tx_usrp.py: tested on a USRP B200
+-* hd_tx_hackrf.grc, hd_tx_hackrf.py: tested on a HackRF One
+ * hd_tx_rtl_file.grc, hd_tx_rtl_file.py: produces an output file in the format used by https://github.com/theori-io/nrsc5/
+ 
+ These flowgraphs read a WAV file named sample.wav, which must be encoded at 44,100 samples per second. The license for the supplied sample.wav file is as follows:
+diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt
+index c837d77..408bf6a 100644
+--- a/apps/CMakeLists.txt
++++ b/apps/CMakeLists.txt
+@@ -1,6 +1,7 @@
+ # Copyright 2011 Free Software Foundation, Inc.
+ #
+-# This file is part of GNU Radio
++# This file was generated by gr_modtool, a tool from the GNU Radio framework
++# This file is a part of gr-nrsc5
+ #
+ # 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
+diff --git a/apps/hd_tx_hackrf.grc b/apps/hd_tx_hackrf.grc
+deleted file mode 100644
+index 7f93279..0000000
+--- a/apps/hd_tx_hackrf.grc
++++ /dev/null
+@@ -1,2679 +0,0 @@
+-<?xml version='1.0' encoding='utf-8'?>
+-<?grc format='1' created='3.7.12'?>
+-<flow_graph>
+-  <timestamp>Fri Sep 16 01:35:53 2016</timestamp>
+-  <block>
+-    <key>options</key>
+-    <param>
+-      <key>author</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>window_size</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>category</key>
+-      <value>[GRC Hier Blocks]</value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>description</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(8, 12)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>generate_options</key>
+-      <value>no_gui</value>
+-    </param>
+-    <param>
+-      <key>hier_block_src_path</key>
+-      <value>.:</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>hd_tx_hackrf</value>
+-    </param>
+-    <param>
+-      <key>max_nouts</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>qt_qss_theme</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>realtime_scheduling</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>run_command</key>
+-      <value>{python} -u {filename}</value>
+-    </param>
+-    <param>
+-      <key>run_options</key>
+-      <value>prompt</value>
+-    </param>
+-    <param>
+-      <key>run</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>thread_safe_setters</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>title</key>
+-      <value></value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>variable</key>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(8, 164)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>freq</value>
+-    </param>
+-    <param>
+-      <key>value</key>
+-      <value>95.7e6</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>variable</key>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(8, 100)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>samp_rate</value>
+-    </param>
+-    <param>
+-      <key>value</key>
+-      <value>2000000</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>analog_sig_source_x</key>
+-    <param>
+-      <key>amp</key>
+-      <value>0.1</value>
+-    </param>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>freq</key>
+-      <value>1000</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(896, 584)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>analog_sig_source_x_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>offset</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>float</value>
+-    </param>
+-    <param>
+-      <key>samp_rate</key>
+-      <value>50000</value>
+-    </param>
+-    <param>
+-      <key>waveform</key>
+-      <value>analog.GR_COS_WAVE</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>analog_wfm_tx</key>
+-    <param>
+-      <key>audio_rate</key>
+-      <value>50000</value>
+-    </param>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(640, 584)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>analog_wfm_tx_0</value>
+-    </param>
+-    <param>
+-      <key>max_dev</key>
+-      <value>75e3</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>fh</key>
+-      <value>-1.0</value>
+-    </param>
+-    <param>
+-      <key>quad_rate</key>
+-      <value>200000</value>
+-    </param>
+-    <param>
+-      <key>tau</key>
+-      <value>75e-6</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_add_xx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(424, 472)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_add_xx_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_inputs</key>
+-      <value>2</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_conjugate_cc</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(624, 376)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_conjugate_cc_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_keep_m_in_n</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(952, 340)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_keep_m_in_n_0</value>
+-    </param>
+-    <param>
+-      <key>m</key>
+-      <value>2160</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>n</key>
+-      <value>4096</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>offset</key>
+-      <value>0</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_multiply_const_vxx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>const</key>
+-      <value>0.001</value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(248, 468)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_multiply_const_vxx_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_multiply_const_vxx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>const</key>
+-      <value>0.1</value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(104, 612)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_multiply_const_vxx_1</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_multiply_xx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(816, 360)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_multiply_xx_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_inputs</key>
+-      <value>2</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_repeat</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(1104, 244)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_repeat_0</value>
+-    </param>
+-    <param>
+-      <key>interp</key>
+-      <value>2</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>2048</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_stream_to_vector</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(696, 252)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_stream_to_vector_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_items</key>
+-      <value>2048</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_vector_source_x</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(952, 428)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_vector_source_x_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>repeat</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>tags</key>
+-      <value>[]</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>vector</key>
+-      <value>[math.sin(math.pi / 2 * i / 112) for i in range(112)] + [1] * (2048-112) + [math.cos(math.pi / 2 * i / 112) for i in range(112)]</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_vector_to_stream</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(1104, 356)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_vector_to_stream_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_items</key>
+-      <value>2048</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_vector_to_stream</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(288, 252)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_vector_to_stream_1</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>byte</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_items</key>
+-      <value>1048576</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_wavfile_source</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>file</key>
+-      <value>sample.wav</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(328, 16)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_wavfile_source_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>nchan</key>
+-      <value>2</value>
+-    </param>
+-    <param>
+-      <key>repeat</key>
+-      <value>True</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>digital_chunks_to_symbols_xx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>dimension</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(472, 244)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>digital_chunks_to_symbols_xx_0</value>
+-    </param>
+-    <param>
+-      <key>in_type</key>
+-      <value>byte</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_ports</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>out_type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>symbol_table</key>
+-      <value>-1-1j, -1+1j, 1-1j, 1+1j, 0</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>fft_vxx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>fft_size</key>
+-      <value>2048</value>
+-    </param>
+-    <param>
+-      <key>forward</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(880, 224)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>fft_vxx_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>nthreads</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>shift</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>window</key>
+-      <value>window.rectangular(2048)</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>import</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(8, 236)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>import_0</value>
+-    </param>
+-    <param>
+-      <key>import</key>
+-      <value>import math</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>low_pass_filter</key>
+-    <param>
+-      <key>beta</key>
+-      <value>6.76</value>
+-    </param>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>cutoff_freq</key>
+-      <value>80000</value>
+-    </param>
+-    <param>
+-      <key>decim</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>fir_filter_ccf</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(264, 568)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>gain</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>low_pass_filter_0</value>
+-    </param>
+-    <param>
+-      <key>interp</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>samp_rate</key>
+-      <value>samp_rate</value>
+-    </param>
+-    <param>
+-      <key>width</key>
+-      <value>20000</value>
+-    </param>
+-    <param>
+-      <key>win</key>
+-      <value>firdes.WIN_HAMMING</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>nrsc5_hdc_encoder</key>
+-    <param>
+-      <key>bitrate</key>
+-      <value>64000</value>
+-    </param>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>channels</key>
+-      <value>2</value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(512, 16)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>nrsc5_hdc_encoder_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>nrsc5_l1_fm_encoder_mp1</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(888, 48)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>nrsc5_l1_fm_encoder_mp1_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>nrsc5_l2_encoder</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>first_prog</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>size</key>
+-      <value>146176</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(696, 32)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>nrsc5_l2_encoder_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_progs</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>nrsc5_sis_encoder</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(688, 108)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>nrsc5_sis_encoder_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>short_name</key>
+-      <value>ABCD</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>nrsc5_psd_encoder</key>
+-    <param>
+-      <key>artist</key>
+-      <value>Artist</value>
+-    </param>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(488, 92)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>nrsc5_psd_encoder_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>prog_num</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>title</key>
+-      <value>Title</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>osmosdr_sink</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>ant0</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain0</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>bw0</key>
+-      <value>1.5e6</value>
+-    </param>
+-    <param>
+-      <key>corr0</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq0</key>
+-      <value>freq</value>
+-    </param>
+-    <param>
+-      <key>if_gain0</key>
+-      <value>40</value>
+-    </param>
+-    <param>
+-      <key>gain0</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant10</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain10</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw10</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr10</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq10</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain10</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain10</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant11</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain11</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw11</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr11</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq11</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain11</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain11</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant12</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain12</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw12</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr12</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq12</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain12</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain12</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant13</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain13</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw13</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr13</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq13</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain13</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain13</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant14</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain14</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw14</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr14</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq14</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain14</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain14</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant15</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain15</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw15</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr15</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq15</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain15</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain15</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant16</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain16</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw16</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr16</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq16</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain16</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain16</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant17</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain17</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw17</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr17</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq17</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain17</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain17</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant18</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain18</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw18</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr18</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq18</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain18</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain18</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant19</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain19</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw19</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr19</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq19</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain19</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain19</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant1</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain1</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw1</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr1</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq1</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain1</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain1</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant20</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain20</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw20</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr20</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq20</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain20</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain20</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant21</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain21</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw21</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr21</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq21</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain21</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain21</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant22</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain22</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw22</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr22</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq22</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain22</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain22</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant23</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain23</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw23</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr23</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq23</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain23</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain23</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant24</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain24</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw24</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr24</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq24</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain24</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain24</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant25</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain25</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw25</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr25</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq25</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain25</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain25</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant26</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain26</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw26</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr26</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq26</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain26</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain26</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant27</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain27</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw27</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr27</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq27</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain27</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain27</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant28</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain28</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw28</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr28</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq28</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain28</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain28</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant29</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain29</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw29</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr29</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq29</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain29</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain29</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant2</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain2</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw2</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr2</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq2</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain2</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain2</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant30</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain30</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw30</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr30</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq30</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain30</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain30</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant31</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain31</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw31</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr31</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq31</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain31</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain31</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant3</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain3</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw3</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr3</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq3</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain3</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain3</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant4</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain4</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw4</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr4</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq4</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain4</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain4</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant5</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain5</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw5</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr5</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq5</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain5</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain5</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant6</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain6</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw6</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr6</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq6</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain6</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain6</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant7</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain7</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw7</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr7</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq7</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain7</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain7</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant8</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain8</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw8</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr8</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq8</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain8</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain8</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>ant9</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bb_gain9</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>bw9</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>corr9</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>freq9</key>
+-      <value>100e6</value>
+-    </param>
+-    <param>
+-      <key>if_gain9</key>
+-      <value>20</value>
+-    </param>
+-    <param>
+-      <key>gain9</key>
+-      <value>10</value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>args</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(536, 440)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>osmosdr_sink_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>fc32</value>
+-    </param>
+-    <param>
+-      <key>clock_source0</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>time_source0</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>clock_source1</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>time_source1</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>clock_source2</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>time_source2</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>clock_source3</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>time_source3</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>clock_source4</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>time_source4</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>clock_source5</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>time_source5</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>clock_source6</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>time_source6</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>clock_source7</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>time_source7</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>nchan</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>num_mboards</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>sample_rate</key>
+-      <value>samp_rate</value>
+-    </param>
+-    <param>
+-      <key>sync</key>
+-      <value></value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>rational_resampler_xxx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>decim</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>fbw</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(448, 592)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>rational_resampler_xxx_0</value>
+-    </param>
+-    <param>
+-      <key>interp</key>
+-      <value>samp_rate / 200000</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>taps</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>ccc</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>rational_resampler_xxx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>decim</key>
+-      <value>49</value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>fbw</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(432, 352)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>rational_resampler_xxx_1</value>
+-    </param>
+-    <param>
+-      <key>interp</key>
+-      <value>125</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>taps</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>ccc</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>rational_resampler_xxx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>decim</key>
+-      <value>243</value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>fbw</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(240, 352)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>rational_resampler_xxx_2</value>
+-    </param>
+-    <param>
+-      <key>interp</key>
+-      <value>256</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>taps</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>ccc</value>
+-    </param>
+-  </block>
+-  <connection>
+-    <source_block_id>analog_sig_source_x_0</source_block_id>
+-    <sink_block_id>analog_wfm_tx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>analog_wfm_tx_0</source_block_id>
+-    <sink_block_id>rational_resampler_xxx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_add_xx_0</source_block_id>
+-    <sink_block_id>osmosdr_sink_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_conjugate_cc_0</source_block_id>
+-    <sink_block_id>rational_resampler_xxx_1</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_keep_m_in_n_0</source_block_id>
+-    <sink_block_id>blocks_multiply_xx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>1</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_multiply_const_vxx_0</source_block_id>
+-    <sink_block_id>blocks_add_xx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_multiply_const_vxx_1</source_block_id>
+-    <sink_block_id>blocks_add_xx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>1</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_multiply_xx_0</source_block_id>
+-    <sink_block_id>blocks_conjugate_cc_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_repeat_0</source_block_id>
+-    <sink_block_id>blocks_vector_to_stream_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_stream_to_vector_0</source_block_id>
+-    <sink_block_id>fft_vxx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_vector_source_x_0</source_block_id>
+-    <sink_block_id>blocks_multiply_xx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_vector_to_stream_0</source_block_id>
+-    <sink_block_id>blocks_keep_m_in_n_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_vector_to_stream_1</source_block_id>
+-    <sink_block_id>digital_chunks_to_symbols_xx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_wavfile_source_0</source_block_id>
+-    <sink_block_id>nrsc5_hdc_encoder_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_wavfile_source_0</source_block_id>
+-    <sink_block_id>nrsc5_hdc_encoder_0</sink_block_id>
+-    <source_key>1</source_key>
+-    <sink_key>1</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>digital_chunks_to_symbols_xx_0</source_block_id>
+-    <sink_block_id>blocks_stream_to_vector_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>fft_vxx_0</source_block_id>
+-    <sink_block_id>blocks_repeat_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>low_pass_filter_0</source_block_id>
+-    <sink_block_id>blocks_multiply_const_vxx_1</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>nrsc5_hdc_encoder_0</source_block_id>
+-    <sink_block_id>nrsc5_l2_encoder_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>nrsc5_l1_fm_encoder_mp1_0</source_block_id>
+-    <sink_block_id>blocks_vector_to_stream_1</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>nrsc5_l2_encoder_0</source_block_id>
+-    <sink_block_id>nrsc5_l1_fm_encoder_mp1_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>nrsc5_sis_encoder_0</source_block_id>
+-    <sink_block_id>nrsc5_l1_fm_encoder_mp1_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>1</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>nrsc5_psd_encoder_0</source_block_id>
+-    <sink_block_id>nrsc5_l2_encoder_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>1</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>rational_resampler_xxx_0</source_block_id>
+-    <sink_block_id>low_pass_filter_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>rational_resampler_xxx_1</source_block_id>
+-    <sink_block_id>rational_resampler_xxx_2</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>rational_resampler_xxx_2</source_block_id>
+-    <sink_block_id>blocks_multiply_const_vxx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-</flow_graph>
+diff --git a/apps/hd_tx_hackrf.py b/apps/hd_tx_hackrf.py
+deleted file mode 100755
+index ab96f73..0000000
+--- a/apps/hd_tx_hackrf.py
++++ /dev/null
+@@ -1,157 +0,0 @@
+-#!/usr/bin/env python2
+-# -*- coding: utf-8 -*-
+-##################################################
+-# GNU Radio Python Flow Graph
+-# Title: Hd Tx Hackrf
+-# Generated: Sun Oct 15 00:11:49 2017
+-##################################################
+-
+-from gnuradio import analog
+-from gnuradio import blocks
+-from gnuradio import digital
+-from gnuradio import eng_notation
+-from gnuradio import fft
+-from gnuradio import filter
+-from gnuradio import gr
+-from gnuradio.eng_option import eng_option
+-from gnuradio.fft import window
+-from gnuradio.filter import firdes
+-from optparse import OptionParser
+-import math
+-import nrsc5
+-import osmosdr
+-import time
+-
+-
+-class hd_tx_hackrf(gr.top_block):
+-
+-    def __init__(self):
+-        gr.top_block.__init__(self, "Hd Tx Hackrf")
+-
+-        ##################################################
+-        # Variables
+-        ##################################################
+-        self.samp_rate = samp_rate = 2000000
+-        self.freq = freq = 95.7e6
+-
+-        ##################################################
+-        # Blocks
+-        ##################################################
+-        self.rational_resampler_xxx_2 = filter.rational_resampler_ccc(
+-                interpolation=256,
+-                decimation=243,
+-                taps=None,
+-                fractional_bw=None,
+-        )
+-        self.rational_resampler_xxx_1 = filter.rational_resampler_ccc(
+-                interpolation=125,
+-                decimation=49,
+-                taps=None,
+-                fractional_bw=None,
+-        )
+-        self.rational_resampler_xxx_0 = filter.rational_resampler_ccc(
+-                interpolation=samp_rate / 200000,
+-                decimation=1,
+-                taps=None,
+-                fractional_bw=None,
+-        )
+-        self.osmosdr_sink_0 = osmosdr.sink( args="numchan=" + str(1) + " " + '' )
+-        self.osmosdr_sink_0.set_sample_rate(samp_rate)
+-        self.osmosdr_sink_0.set_center_freq(freq, 0)
+-        self.osmosdr_sink_0.set_freq_corr(0, 0)
+-        self.osmosdr_sink_0.set_gain(0, 0)
+-        self.osmosdr_sink_0.set_if_gain(40, 0)
+-        self.osmosdr_sink_0.set_bb_gain(0, 0)
+-        self.osmosdr_sink_0.set_antenna('', 0)
+-        self.osmosdr_sink_0.set_bandwidth(1.5e6, 0)
+-
+-        self.nrsc5_sis_encoder_0 = nrsc5.sis_encoder('ABCD')
+-        self.nrsc5_psd_encoder_0 = nrsc5.psd_encoder(0, 'Title', 'Artist')
+-        self.nrsc5_l2_encoder_0 = nrsc5.l2_encoder(1, 0, 146176)
+-        self.nrsc5_l1_fm_encoder_mp1_0 = nrsc5.l1_fm_encoder(1)
+-        self.nrsc5_hdc_encoder_0 = nrsc5.hdc_encoder(2, 64000)
+-        self.low_pass_filter_0 = filter.fir_filter_ccf(1, firdes.low_pass(
+-        	1, samp_rate, 80000, 20000, firdes.WIN_HAMMING, 6.76))
+-        self.fft_vxx_0 = fft.fft_vcc(2048, False, (window.rectangular(2048)), True, 1)
+-        self.digital_chunks_to_symbols_xx_0 = digital.chunks_to_symbols_bc((-1-1j, -1+1j, 1-1j, 1+1j, 0), 1)
+-        self.blocks_wavfile_source_0 = blocks.wavfile_source('sample.wav', True)
+-        self.blocks_vector_to_stream_1 = blocks.vector_to_stream(gr.sizeof_char*1, 1048576)
+-        self.blocks_vector_to_stream_0 = blocks.vector_to_stream(gr.sizeof_gr_complex*1, 2048)
+-        self.blocks_vector_source_x_0 = blocks.vector_source_c([math.sin(math.pi / 2 * i / 112) for i in range(112)] + [1] * (2048-112) + [math.cos(math.pi / 2 * i / 112) for i in range(112)], True, 1, [])
+-        self.blocks_stream_to_vector_0 = blocks.stream_to_vector(gr.sizeof_gr_complex*1, 2048)
+-        self.blocks_repeat_0 = blocks.repeat(gr.sizeof_gr_complex*2048, 2)
+-        self.blocks_multiply_xx_0 = blocks.multiply_vcc(1)
+-        self.blocks_multiply_const_vxx_1 = blocks.multiply_const_vcc((0.1, ))
+-        self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vcc((0.001, ))
+-        self.blocks_keep_m_in_n_0 = blocks.keep_m_in_n(gr.sizeof_gr_complex, 2160, 4096, 0)
+-        self.blocks_conjugate_cc_0 = blocks.conjugate_cc()
+-        self.blocks_add_xx_0 = blocks.add_vcc(1)
+-        self.analog_wfm_tx_0 = analog.wfm_tx(
+-        	audio_rate=50000,
+-        	quad_rate=200000,
+-        	tau=75e-6,
+-        	max_dev=75e3,
+-        	fh=-1.0,
+-        )
+-        self.analog_sig_source_x_0 = analog.sig_source_f(50000, analog.GR_COS_WAVE, 1000, 0.1, 0)
+-
+-        ##################################################
+-        # Connections
+-        ##################################################
+-        self.connect((self.analog_sig_source_x_0, 0), (self.analog_wfm_tx_0, 0))
+-        self.connect((self.analog_wfm_tx_0, 0), (self.rational_resampler_xxx_0, 0))
+-        self.connect((self.blocks_add_xx_0, 0), (self.osmosdr_sink_0, 0))
+-        self.connect((self.blocks_conjugate_cc_0, 0), (self.rational_resampler_xxx_1, 0))
+-        self.connect((self.blocks_keep_m_in_n_0, 0), (self.blocks_multiply_xx_0, 1))
+-        self.connect((self.blocks_multiply_const_vxx_0, 0), (self.blocks_add_xx_0, 0))
+-        self.connect((self.blocks_multiply_const_vxx_1, 0), (self.blocks_add_xx_0, 1))
+-        self.connect((self.blocks_multiply_xx_0, 0), (self.blocks_conjugate_cc_0, 0))
+-        self.connect((self.blocks_repeat_0, 0), (self.blocks_vector_to_stream_0, 0))
+-        self.connect((self.blocks_stream_to_vector_0, 0), (self.fft_vxx_0, 0))
+-        self.connect((self.blocks_vector_source_x_0, 0), (self.blocks_multiply_xx_0, 0))
+-        self.connect((self.blocks_vector_to_stream_0, 0), (self.blocks_keep_m_in_n_0, 0))
+-        self.connect((self.blocks_vector_to_stream_1, 0), (self.digital_chunks_to_symbols_xx_0, 0))
+-        self.connect((self.blocks_wavfile_source_0, 0), (self.nrsc5_hdc_encoder_0, 0))
+-        self.connect((self.blocks_wavfile_source_0, 1), (self.nrsc5_hdc_encoder_0, 1))
+-        self.connect((self.digital_chunks_to_symbols_xx_0, 0), (self.blocks_stream_to_vector_0, 0))
+-        self.connect((self.fft_vxx_0, 0), (self.blocks_repeat_0, 0))
+-        self.connect((self.low_pass_filter_0, 0), (self.blocks_multiply_const_vxx_1, 0))
+-        self.connect((self.nrsc5_hdc_encoder_0, 0), (self.nrsc5_l2_encoder_0, 0))
+-        self.connect((self.nrsc5_l1_fm_encoder_mp1_0, 0), (self.blocks_vector_to_stream_1, 0))
+-        self.connect((self.nrsc5_l2_encoder_0, 0), (self.nrsc5_l1_fm_encoder_mp1_0, 0))
+-        self.connect((self.nrsc5_psd_encoder_0, 0), (self.nrsc5_l2_encoder_0, 1))
+-        self.connect((self.nrsc5_sis_encoder_0, 0), (self.nrsc5_l1_fm_encoder_mp1_0, 1))
+-        self.connect((self.rational_resampler_xxx_0, 0), (self.low_pass_filter_0, 0))
+-        self.connect((self.rational_resampler_xxx_1, 0), (self.rational_resampler_xxx_2, 0))
+-        self.connect((self.rational_resampler_xxx_2, 0), (self.blocks_multiply_const_vxx_0, 0))
+-
+-    def get_samp_rate(self):
+-        return self.samp_rate
+-
+-    def set_samp_rate(self, samp_rate):
+-        self.samp_rate = samp_rate
+-        self.osmosdr_sink_0.set_sample_rate(self.samp_rate)
+-        self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.samp_rate, 80000, 20000, firdes.WIN_HAMMING, 6.76))
+-
+-    def get_freq(self):
+-        return self.freq
+-
+-    def set_freq(self, freq):
+-        self.freq = freq
+-        self.osmosdr_sink_0.set_center_freq(self.freq, 0)
+-
+-
+-def main(top_block_cls=hd_tx_hackrf, options=None):
+-
+-    tb = top_block_cls()
+-    tb.start()
+-    try:
+-        raw_input('Press Enter to quit: ')
+-    except EOFError:
+-        pass
+-    tb.stop()
+-    tb.wait()
+-
+-
+-if __name__ == '__main__':
+-    main()
+diff --git a/apps/hd_tx_rtl_file.grc b/apps/hd_tx_rtl_file.grc
+index 2994383..92f5351 100644
+--- a/apps/hd_tx_rtl_file.grc
++++ b/apps/hd_tx_rtl_file.grc
+@@ -1,1420 +1,488 @@
+-<?xml version='1.0' encoding='utf-8'?>
+-<?grc format='1' created='3.7.12'?>
+-<flow_graph>
+-  <timestamp>Fri Sep 16 01:35:53 2016</timestamp>
+-  <block>
+-    <key>options</key>
+-    <param>
+-      <key>author</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>window_size</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>category</key>
+-      <value>[GRC Hier Blocks]</value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>description</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(8, 12)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>generate_options</key>
+-      <value>no_gui</value>
+-    </param>
+-    <param>
+-      <key>hier_block_src_path</key>
+-      <value>.:</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>hd_tx_rtl_file</value>
+-    </param>
+-    <param>
+-      <key>max_nouts</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>qt_qss_theme</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>realtime_scheduling</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>run_command</key>
+-      <value>{python} -u {filename}</value>
+-    </param>
+-    <param>
+-      <key>run_options</key>
+-      <value>run</value>
+-    </param>
+-    <param>
+-      <key>run</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>thread_safe_setters</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>title</key>
+-      <value></value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_add_const_vxx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>const</key>
+-      <value>127.5</value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(600, 564)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_add_const_vxx_0_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>float</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_complex_to_float</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(296, 552)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_complex_to_float_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_conjugate_cc</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(624, 376)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_conjugate_cc_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_file_sink</key>
+-    <param>
+-      <key>append</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>file</key>
+-      <value>hd-generated.raw</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(904, 548)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_file_sink_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>byte</value>
+-    </param>
+-    <param>
+-      <key>unbuffered</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_float_to_uchar</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(744, 568)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_float_to_uchar_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_interleave</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>blocksize</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(472, 552)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_interleave_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>float</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_streams</key>
+-      <value>2</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_keep_m_in_n</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(952, 340)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_keep_m_in_n_0</value>
+-    </param>
+-    <param>
+-      <key>m</key>
+-      <value>2160</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>n</key>
+-      <value>4096</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>offset</key>
+-      <value>0</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_multiply_const_vxx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>const</key>
+-      <value>0.5</value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(264, 372)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_multiply_const_vxx_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_multiply_xx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(816, 360)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_multiply_xx_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_inputs</key>
+-      <value>2</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_repeat</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(1104, 244)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_repeat_0</value>
+-    </param>
+-    <param>
+-      <key>interp</key>
+-      <value>2</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>2048</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_stream_to_vector</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(696, 252)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_stream_to_vector_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_items</key>
+-      <value>2048</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_vector_source_x</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(952, 428)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_vector_source_x_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>repeat</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>tags</key>
+-      <value>[]</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>vector</key>
+-      <value>[math.sin(math.pi / 2 * i / 112) for i in range(112)] + [1] * (2048-112) + [math.cos(math.pi / 2 * i / 112) for i in range(112)]</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_vector_to_stream</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(1104, 356)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_vector_to_stream_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_items</key>
+-      <value>2048</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_vector_to_stream</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(288, 252)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_vector_to_stream_1</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>byte</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_items</key>
+-      <value>1048576</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_wavfile_source</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>file</key>
+-      <value>sample.wav</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(328, 16)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_wavfile_source_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>nchan</key>
+-      <value>2</value>
+-    </param>
+-    <param>
+-      <key>repeat</key>
+-      <value>False</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>digital_chunks_to_symbols_xx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>dimension</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(472, 244)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>digital_chunks_to_symbols_xx_0</value>
+-    </param>
+-    <param>
+-      <key>in_type</key>
+-      <value>byte</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_ports</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>out_type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>symbol_table</key>
+-      <value>-1-1j, -1+1j, 1-1j, 1+1j, 0</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>fft_vxx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>fft_size</key>
+-      <value>2048</value>
+-    </param>
+-    <param>
+-      <key>forward</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(880, 224)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>fft_vxx_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>nthreads</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>shift</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>window</key>
+-      <value>window.rectangular(2048)</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>import</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(8, 196)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>import_0</value>
+-    </param>
+-    <param>
+-      <key>import</key>
+-      <value>import math</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>nrsc5_hdc_encoder</key>
+-    <param>
+-      <key>bitrate</key>
+-      <value>64000</value>
+-    </param>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>channels</key>
+-      <value>2</value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(512, 16)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>nrsc5_hdc_encoder_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>nrsc5_l1_fm_encoder_mp1</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(888, 48)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>nrsc5_l1_fm_encoder_mp1_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>nrsc5_l2_encoder</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>first_prog</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>size</key>
+-      <value>146176</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(696, 32)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>nrsc5_l2_encoder_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_progs</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>nrsc5_sis_encoder</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(688, 108)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>nrsc5_sis_encoder_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>short_name</key>
+-      <value>ABCD</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>nrsc5_psd_encoder</key>
+-    <param>
+-      <key>artist</key>
+-      <value>Artist</value>
+-    </param>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(488, 92)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>nrsc5_psd_encoder_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>prog_num</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>title</key>
+-      <value>Title</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>rational_resampler_xxx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>decim</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>fbw</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(432, 352)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>rational_resampler_xxx_1</value>
+-    </param>
+-    <param>
+-      <key>interp</key>
+-      <value>2</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>taps</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>ccc</value>
+-    </param>
+-  </block>
+-  <connection>
+-    <source_block_id>blocks_add_const_vxx_0_0</source_block_id>
+-    <sink_block_id>blocks_float_to_uchar_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_complex_to_float_0</source_block_id>
+-    <sink_block_id>blocks_interleave_0</sink_block_id>
+-    <source_key>1</source_key>
+-    <sink_key>1</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_complex_to_float_0</source_block_id>
+-    <sink_block_id>blocks_interleave_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_conjugate_cc_0</source_block_id>
+-    <sink_block_id>rational_resampler_xxx_1</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_float_to_uchar_0</source_block_id>
+-    <sink_block_id>blocks_file_sink_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_interleave_0</source_block_id>
+-    <sink_block_id>blocks_add_const_vxx_0_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_keep_m_in_n_0</source_block_id>
+-    <sink_block_id>blocks_multiply_xx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>1</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_multiply_const_vxx_0</source_block_id>
+-    <sink_block_id>blocks_complex_to_float_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_multiply_xx_0</source_block_id>
+-    <sink_block_id>blocks_conjugate_cc_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_repeat_0</source_block_id>
+-    <sink_block_id>blocks_vector_to_stream_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_stream_to_vector_0</source_block_id>
+-    <sink_block_id>fft_vxx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_vector_source_x_0</source_block_id>
+-    <sink_block_id>blocks_multiply_xx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_vector_to_stream_0</source_block_id>
+-    <sink_block_id>blocks_keep_m_in_n_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_vector_to_stream_1</source_block_id>
+-    <sink_block_id>digital_chunks_to_symbols_xx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_wavfile_source_0</source_block_id>
+-    <sink_block_id>nrsc5_hdc_encoder_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_wavfile_source_0</source_block_id>
+-    <sink_block_id>nrsc5_hdc_encoder_0</sink_block_id>
+-    <source_key>1</source_key>
+-    <sink_key>1</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>digital_chunks_to_symbols_xx_0</source_block_id>
+-    <sink_block_id>blocks_stream_to_vector_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>fft_vxx_0</source_block_id>
+-    <sink_block_id>blocks_repeat_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>nrsc5_hdc_encoder_0</source_block_id>
+-    <sink_block_id>nrsc5_l2_encoder_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>nrsc5_l1_fm_encoder_mp1_0</source_block_id>
+-    <sink_block_id>blocks_vector_to_stream_1</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>nrsc5_l2_encoder_0</source_block_id>
+-    <sink_block_id>nrsc5_l1_fm_encoder_mp1_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>nrsc5_sis_encoder_0</source_block_id>
+-    <sink_block_id>nrsc5_l1_fm_encoder_mp1_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>1</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>nrsc5_psd_encoder_0</source_block_id>
+-    <sink_block_id>nrsc5_l2_encoder_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>1</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>rational_resampler_xxx_1</source_block_id>
+-    <sink_block_id>blocks_multiply_const_vxx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-</flow_graph>
++options:
++  parameters:
++    author: ''
++    category: '[GRC Hier Blocks]'
++    cmake_opt: ''
++    comment: ''
++    copyright: ''
++    description: ''
++    gen_cmake: 'On'
++    gen_linking: dynamic
++    generate_options: no_gui
++    hier_block_src_path: '.:'
++    id: hd_tx_rtl_file
++    max_nouts: '0'
++    output_language: python
++    placement: (0,0)
++    qt_qss_theme: ''
++    realtime_scheduling: ''
++    run: 'True'
++    run_command: '{python} -u {filename}'
++    run_options: prompt
++    sizing_mode: fixed
++    thread_safe_setters: ''
++    title: ''
++    window_size: ''
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [8, 12]
++    rotation: 0
++    state: enabled
++
++blocks:
++- name: blocks_add_const_vxx_0_0
++  id: blocks_add_const_vxx
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    const: '127.5'
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    type: float
++    vlen: '1'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [576, 548.0]
++    rotation: 0
++    state: enabled
++- name: blocks_complex_to_float_0
++  id: blocks_complex_to_float
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    vlen: '1'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [272, 536.0]
++    rotation: 0
++    state: enabled
++- name: blocks_conjugate_cc_0
++  id: blocks_conjugate_cc
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [624, 424.0]
++    rotation: 180
++    state: enabled
++- name: blocks_file_sink_0
++  id: blocks_file_sink
++  parameters:
++    affinity: ''
++    alias: ''
++    append: 'False'
++    comment: ''
++    file: hd-generated.raw
++    type: byte
++    unbuffered: 'False'
++    vlen: '1'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [880, 532.0]
++    rotation: 0
++    state: enabled
++- name: blocks_float_to_uchar_0
++  id: blocks_float_to_uchar
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [720, 552.0]
++    rotation: 0
++    state: enabled
++- name: blocks_interleave_0
++  id: blocks_interleave
++  parameters:
++    affinity: ''
++    alias: ''
++    blocksize: '1'
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    num_streams: '2'
++    type: float
++    vlen: '1'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [448, 536.0]
++    rotation: 0
++    state: enabled
++- name: blocks_keep_m_in_n_0
++  id: blocks_keep_m_in_n
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    m: '2160'
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    n: '4096'
++    offset: '0'
++    type: complex
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [952, 420.0]
++    rotation: 180
++    state: enabled
++- name: blocks_multiply_const_vxx_0
++  id: blocks_multiply_const_vxx
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    const: '0.5'
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    type: complex
++    vlen: '1'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [272, 420.0]
++    rotation: 180
++    state: enabled
++- name: blocks_multiply_xx_0
++  id: blocks_multiply_xx
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    num_inputs: '2'
++    type: complex
++    vlen: '1'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [816, 408.0]
++    rotation: 180
++    state: enabled
++- name: blocks_repeat_0
++  id: blocks_repeat
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    interp: '2'
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    type: complex
++    vlen: '2048'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [1104, 244]
++    rotation: 0
++    state: enabled
++- name: blocks_stream_to_vector_0
++  id: blocks_stream_to_vector
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    num_items: '2048'
++    type: complex
++    vlen: '1'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [696, 256.0]
++    rotation: 0
++    state: enabled
++- name: blocks_vector_source_x_0
++  id: blocks_vector_source_x
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    repeat: 'True'
++    tags: '[]'
++    type: complex
++    vector: '[math.sin(math.pi / 2 * i / 112) for i in range(112)] + [1] * (2048-112)
++      + [math.cos(math.pi / 2 * i / 112) for i in range(112)]'
++    vlen: '1'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [952, 340.0]
++    rotation: 180
++    state: enabled
++- name: blocks_vector_to_stream_0
++  id: blocks_vector_to_stream
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    num_items: '2048'
++    type: complex
++    vlen: '1'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [1104, 440.0]
++    rotation: 180
++    state: enabled
++- name: blocks_vector_to_stream_1
++  id: blocks_vector_to_stream
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    num_items: '1048576'
++    type: byte
++    vlen: '1'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [288, 256.0]
++    rotation: 0
++    state: enabled
++- name: blocks_wavfile_source_0
++  id: blocks_wavfile_source
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    file: sample.wav
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    nchan: '2'
++    repeat: 'True'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [896, 56.0]
++    rotation: 180
++    state: enabled
++- name: digital_chunks_to_symbols_xx_0
++  id: digital_chunks_to_symbols_xx
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    dimension: '1'
++    in_type: byte
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    num_ports: '1'
++    out_type: complex
++    symbol_table: (-1-1j, -1+1j, 1-1j, 1+1j, 0)
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [472, 256.0]
++    rotation: 0
++    state: enabled
++- name: fft_vxx_0
++  id: fft_vxx
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    fft_size: '2048'
++    forward: 'False'
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    nthreads: '1'
++    shift: 'True'
++    type: complex
++    window: window.rectangular(2048)
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [880, 220.0]
++    rotation: 0
++    state: enabled
++- name: import_0
++  id: import
++  parameters:
++    alias: ''
++    comment: ''
++    imports: import math
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [8, 236]
++    rotation: 0
++    state: enabled
++- name: nrsc5_hdc_encoder_0
++  id: nrsc5_hdc_encoder
++  parameters:
++    affinity: ''
++    alias: ''
++    bitrate: '64000'
++    channels: '2'
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [728, 56.0]
++    rotation: 180
++    state: enabled
++- name: nrsc5_l1_fm_encoder_mp1_0
++  id: nrsc5_l1_fm_encoder_mp1
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [288, 88.0]
++    rotation: 180
++    state: enabled
++- name: nrsc5_l2_encoder_0
++  id: nrsc5_l2_encoder
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    first_prog: '0'
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    num_progs: '1'
++    size: '146176'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [528, 68.0]
++    rotation: 180
++    state: enabled
++- name: nrsc5_psd_encoder_0
++  id: nrsc5_psd_encoder
++  parameters:
++    affinity: ''
++    alias: ''
++    artist: Artist
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    prog_num: '0'
++    title: Title
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [728, 132.0]
++    rotation: 180
++    state: enabled
++- name: nrsc5_sis_encoder_0
++  id: nrsc5_sis_encoder
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    short_name: ABCD
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [528, 148.0]
++    rotation: 180
++    state: enabled
++- name: rational_resampler_xxx_1
++  id: rational_resampler_xxx
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    decim: '1'
++    fbw: '0'
++    interp: '2'
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    taps: ''
++    type: ccc
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [440, 396.0]
++    rotation: 180
++    state: enabled
++
++connections:
++- [blocks_add_const_vxx_0_0, '0', blocks_float_to_uchar_0, '0']
++- [blocks_complex_to_float_0, '0', blocks_interleave_0, '0']
++- [blocks_complex_to_float_0, '1', blocks_interleave_0, '1']
++- [blocks_conjugate_cc_0, '0', rational_resampler_xxx_1, '0']
++- [blocks_float_to_uchar_0, '0', blocks_file_sink_0, '0']
++- [blocks_interleave_0, '0', blocks_add_const_vxx_0_0, '0']
++- [blocks_keep_m_in_n_0, '0', blocks_multiply_xx_0, '1']
++- [blocks_multiply_const_vxx_0, '0', blocks_complex_to_float_0, '0']
++- [blocks_multiply_xx_0, '0', blocks_conjugate_cc_0, '0']
++- [blocks_repeat_0, '0', blocks_vector_to_stream_0, '0']
++- [blocks_stream_to_vector_0, '0', fft_vxx_0, '0']
++- [blocks_vector_source_x_0, '0', blocks_multiply_xx_0, '0']
++- [blocks_vector_to_stream_0, '0', blocks_keep_m_in_n_0, '0']
++- [blocks_vector_to_stream_1, '0', digital_chunks_to_symbols_xx_0, '0']
++- [blocks_wavfile_source_0, '0', nrsc5_hdc_encoder_0, '0']
++- [blocks_wavfile_source_0, '1', nrsc5_hdc_encoder_0, '1']
++- [digital_chunks_to_symbols_xx_0, '0', blocks_stream_to_vector_0, '0']
++- [fft_vxx_0, '0', blocks_repeat_0, '0']
++- [nrsc5_hdc_encoder_0, '0', nrsc5_l2_encoder_0, '0']
++- [nrsc5_l1_fm_encoder_mp1_0, '0', blocks_vector_to_stream_1, '0']
++- [nrsc5_l2_encoder_0, '0', nrsc5_l1_fm_encoder_mp1_0, '0']
++- [nrsc5_psd_encoder_0, '0', nrsc5_l2_encoder_0, '1']
++- [nrsc5_sis_encoder_0, '0', nrsc5_l1_fm_encoder_mp1_0, '1']
++- [rational_resampler_xxx_1, '0', blocks_multiply_const_vxx_0, '0']
++
++metadata:
++  file_format: 1
+diff --git a/apps/hd_tx_rtl_file.py b/apps/hd_tx_rtl_file.py
+index 41d19b1..77e7eb0 100755
+--- a/apps/hd_tx_rtl_file.py
++++ b/apps/hd_tx_rtl_file.py
+@@ -1,25 +1,28 @@
+-#!/usr/bin/env python2
++#!/usr/bin/env python3
+ # -*- coding: utf-8 -*-
+-##################################################
++
++#
++# SPDX-License-Identifier: GPL-3.0
++#
+ # GNU Radio Python Flow Graph
+ # Title: Hd Tx Rtl File
+-# Generated: Sun Oct 15 00:14:13 2017
+-##################################################
++# GNU Radio version: 3.8.0.0-rc2
+ 
+ from gnuradio import blocks
+ from gnuradio import digital
+-from gnuradio import eng_notation
+ from gnuradio import fft
+-from gnuradio import filter
+-from gnuradio import gr
+-from gnuradio.eng_option import eng_option
+ from gnuradio.fft import window
++from gnuradio import filter
+ from gnuradio.filter import firdes
+-from optparse import OptionParser
++from gnuradio import gr
++import sys
++import signal
++from argparse import ArgumentParser
++from gnuradio.eng_arg import eng_float, intx
++from gnuradio import eng_notation
+ import math
+ import nrsc5
+ 
+-
+ class hd_tx_rtl_file(gr.top_block):
+ 
+     def __init__(self):
+@@ -32,23 +35,22 @@ def __init__(self):
+                 interpolation=2,
+                 decimation=1,
+                 taps=None,
+-                fractional_bw=None,
+-        )
++                fractional_bw=None)
+         self.nrsc5_sis_encoder_0 = nrsc5.sis_encoder('ABCD')
+         self.nrsc5_psd_encoder_0 = nrsc5.psd_encoder(0, 'Title', 'Artist')
+         self.nrsc5_l2_encoder_0 = nrsc5.l2_encoder(1, 0, 146176)
+         self.nrsc5_l1_fm_encoder_mp1_0 = nrsc5.l1_fm_encoder(1)
+         self.nrsc5_hdc_encoder_0 = nrsc5.hdc_encoder(2, 64000)
+-        self.fft_vxx_0 = fft.fft_vcc(2048, False, (window.rectangular(2048)), True, 1)
++        self.fft_vxx_0 = fft.fft_vcc(2048, False, window.rectangular(2048), True, 1)
+         self.digital_chunks_to_symbols_xx_0 = digital.chunks_to_symbols_bc((-1-1j, -1+1j, 1-1j, 1+1j, 0), 1)
+-        self.blocks_wavfile_source_0 = blocks.wavfile_source('sample.wav', False)
++        self.blocks_wavfile_source_0 = blocks.wavfile_source('sample.wav', True)
+         self.blocks_vector_to_stream_1 = blocks.vector_to_stream(gr.sizeof_char*1, 1048576)
+         self.blocks_vector_to_stream_0 = blocks.vector_to_stream(gr.sizeof_gr_complex*1, 2048)
+         self.blocks_vector_source_x_0 = blocks.vector_source_c([math.sin(math.pi / 2 * i / 112) for i in range(112)] + [1] * (2048-112) + [math.cos(math.pi / 2 * i / 112) for i in range(112)], True, 1, [])
+         self.blocks_stream_to_vector_0 = blocks.stream_to_vector(gr.sizeof_gr_complex*1, 2048)
+         self.blocks_repeat_0 = blocks.repeat(gr.sizeof_gr_complex*2048, 2)
+         self.blocks_multiply_xx_0 = blocks.multiply_vcc(1)
+-        self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vcc((0.5, ))
++        self.blocks_multiply_const_vxx_0 = blocks.multiply_const_cc(0.5)
+         self.blocks_keep_m_in_n_0 = blocks.keep_m_in_n(gr.sizeof_gr_complex, 2160, 4096, 0)
+         self.blocks_interleave_0 = blocks.interleave(gr.sizeof_float*1, 1)
+         self.blocks_float_to_uchar_0 = blocks.float_to_uchar()
+@@ -56,7 +58,9 @@ def __init__(self):
+         self.blocks_file_sink_0.set_unbuffered(False)
+         self.blocks_conjugate_cc_0 = blocks.conjugate_cc()
+         self.blocks_complex_to_float_0 = blocks.complex_to_float(1)
+-        self.blocks_add_const_vxx_0_0 = blocks.add_const_vff((127.5, ))
++        self.blocks_add_const_vxx_0_0 = blocks.add_const_ff(127.5)
++
++
+ 
+         ##################################################
+         # Connections
+@@ -87,10 +91,24 @@ def __init__(self):
+         self.connect((self.rational_resampler_xxx_1, 0), (self.blocks_multiply_const_vxx_0, 0))
+ 
+ 
+-def main(top_block_cls=hd_tx_rtl_file, options=None):
+ 
++def main(top_block_cls=hd_tx_rtl_file, options=None):
+     tb = top_block_cls()
++
++    def sig_handler(sig=None, frame=None):
++        tb.stop()
++        tb.wait()
++        sys.exit(0)
++
++    signal.signal(signal.SIGINT, sig_handler)
++    signal.signal(signal.SIGTERM, sig_handler)
++
+     tb.start()
++    try:
++        input('Press Enter to quit: ')
++    except EOFError:
++        pass
++    tb.stop()
+     tb.wait()
+ 
+ 
+diff --git a/apps/hd_tx_usrp.grc b/apps/hd_tx_usrp.grc
+index fc6fc4e..8e34368 100644
+--- a/apps/hd_tx_usrp.grc
++++ b/apps/hd_tx_usrp.grc
+@@ -1,2487 +1,846 @@
+-<?xml version='1.0' encoding='utf-8'?>
+-<?grc format='1' created='3.7.12'?>
+-<flow_graph>
+-  <timestamp>Fri Sep 16 01:35:53 2016</timestamp>
+-  <block>
+-    <key>options</key>
+-    <param>
+-      <key>author</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>window_size</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>category</key>
+-      <value>[GRC Hier Blocks]</value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>description</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(8, 12)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>generate_options</key>
+-      <value>no_gui</value>
+-    </param>
+-    <param>
+-      <key>hier_block_src_path</key>
+-      <value>.:</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>hd_tx_usrp</value>
+-    </param>
+-    <param>
+-      <key>max_nouts</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>qt_qss_theme</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>realtime_scheduling</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>run_command</key>
+-      <value>{python} -u {filename}</value>
+-    </param>
+-    <param>
+-      <key>run_options</key>
+-      <value>prompt</value>
+-    </param>
+-    <param>
+-      <key>run</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>thread_safe_setters</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>title</key>
+-      <value></value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>variable</key>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(8, 164)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>freq</value>
+-    </param>
+-    <param>
+-      <key>value</key>
+-      <value>95.7e6</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>variable</key>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(8, 100)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>samp_rate</value>
+-    </param>
+-    <param>
+-      <key>value</key>
+-      <value>2000000</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>analog_sig_source_x</key>
+-    <param>
+-      <key>amp</key>
+-      <value>0.1</value>
+-    </param>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>freq</key>
+-      <value>1000</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(896, 584)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>analog_sig_source_x_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>offset</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>float</value>
+-    </param>
+-    <param>
+-      <key>samp_rate</key>
+-      <value>50000</value>
+-    </param>
+-    <param>
+-      <key>waveform</key>
+-      <value>analog.GR_COS_WAVE</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>analog_wfm_tx</key>
+-    <param>
+-      <key>audio_rate</key>
+-      <value>50000</value>
+-    </param>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(640, 584)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>analog_wfm_tx_0</value>
+-    </param>
+-    <param>
+-      <key>max_dev</key>
+-      <value>75e3</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>fh</key>
+-      <value>-1.0</value>
+-    </param>
+-    <param>
+-      <key>quad_rate</key>
+-      <value>200000</value>
+-    </param>
+-    <param>
+-      <key>tau</key>
+-      <value>75e-6</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_add_xx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(424, 472)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_add_xx_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_inputs</key>
+-      <value>2</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_conjugate_cc</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(624, 376)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_conjugate_cc_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_keep_m_in_n</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(952, 340)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_keep_m_in_n_0</value>
+-    </param>
+-    <param>
+-      <key>m</key>
+-      <value>2160</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>n</key>
+-      <value>4096</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>offset</key>
+-      <value>0</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_multiply_const_vxx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>const</key>
+-      <value>0.001</value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(248, 468)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_multiply_const_vxx_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_multiply_const_vxx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>const</key>
+-      <value>0.1</value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(104, 612)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_multiply_const_vxx_1</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_multiply_xx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(816, 360)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_multiply_xx_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_inputs</key>
+-      <value>2</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_repeat</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(1104, 244)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_repeat_0</value>
+-    </param>
+-    <param>
+-      <key>interp</key>
+-      <value>2</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>2048</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_stream_to_vector</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(696, 252)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_stream_to_vector_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_items</key>
+-      <value>2048</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_vector_source_x</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(952, 428)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_vector_source_x_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>repeat</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>tags</key>
+-      <value>[]</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>vector</key>
+-      <value>[math.sin(math.pi / 2 * i / 112) for i in range(112)] + [1] * (2048-112) + [math.cos(math.pi / 2 * i / 112) for i in range(112)]</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_vector_to_stream</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(1104, 356)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_vector_to_stream_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_items</key>
+-      <value>2048</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_vector_to_stream</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(288, 252)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_vector_to_stream_1</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>byte</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_items</key>
+-      <value>1048576</value>
+-    </param>
+-    <param>
+-      <key>vlen</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>blocks_wavfile_source</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>file</key>
+-      <value>sample.wav</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(328, 16)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>blocks_wavfile_source_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>nchan</key>
+-      <value>2</value>
+-    </param>
+-    <param>
+-      <key>repeat</key>
+-      <value>True</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>digital_chunks_to_symbols_xx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>dimension</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(472, 244)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>digital_chunks_to_symbols_xx_0</value>
+-    </param>
+-    <param>
+-      <key>in_type</key>
+-      <value>byte</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_ports</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>out_type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>symbol_table</key>
+-      <value>-1-1j, -1+1j, 1-1j, 1+1j, 0</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>fft_vxx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>fft_size</key>
+-      <value>2048</value>
+-    </param>
+-    <param>
+-      <key>forward</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(880, 224)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>fft_vxx_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>complex</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>nthreads</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>shift</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>window</key>
+-      <value>window.rectangular(2048)</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>import</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(8, 236)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>import_0</value>
+-    </param>
+-    <param>
+-      <key>import</key>
+-      <value>import math</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>low_pass_filter</key>
+-    <param>
+-      <key>beta</key>
+-      <value>6.76</value>
+-    </param>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>cutoff_freq</key>
+-      <value>80000</value>
+-    </param>
+-    <param>
+-      <key>decim</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>fir_filter_ccf</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(264, 568)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>gain</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>low_pass_filter_0</value>
+-    </param>
+-    <param>
+-      <key>interp</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>samp_rate</key>
+-      <value>samp_rate</value>
+-    </param>
+-    <param>
+-      <key>width</key>
+-      <value>20000</value>
+-    </param>
+-    <param>
+-      <key>win</key>
+-      <value>firdes.WIN_HAMMING</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>nrsc5_hdc_encoder</key>
+-    <param>
+-      <key>bitrate</key>
+-      <value>64000</value>
+-    </param>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>channels</key>
+-      <value>2</value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(512, 16)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>nrsc5_hdc_encoder_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>nrsc5_l1_fm_encoder_mp1</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(888, 48)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>nrsc5_l1_fm_encoder_mp1_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>nrsc5_l2_encoder</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>first_prog</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>size</key>
+-      <value>146176</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(696, 32)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>nrsc5_l2_encoder_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>num_progs</key>
+-      <value>1</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>nrsc5_sis_encoder</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(688, 108)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>nrsc5_sis_encoder_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>short_name</key>
+-      <value>ABCD</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>nrsc5_psd_encoder</key>
+-    <param>
+-      <key>artist</key>
+-      <value>Artist</value>
+-    </param>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(488, 92)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>nrsc5_psd_encoder_0</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>prog_num</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>title</key>
+-      <value>Title</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>rational_resampler_xxx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>decim</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>fbw</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(448, 592)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>rational_resampler_xxx_0</value>
+-    </param>
+-    <param>
+-      <key>interp</key>
+-      <value>samp_rate / 200000</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>taps</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>ccc</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>rational_resampler_xxx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>decim</key>
+-      <value>49</value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>fbw</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(432, 352)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>rational_resampler_xxx_1</value>
+-    </param>
+-    <param>
+-      <key>interp</key>
+-      <value>125</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>taps</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>ccc</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>rational_resampler_xxx</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>decim</key>
+-      <value>243</value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>fbw</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(240, 352)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>180</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>rational_resampler_xxx_2</value>
+-    </param>
+-    <param>
+-      <key>interp</key>
+-      <value>256</value>
+-    </param>
+-    <param>
+-      <key>maxoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>minoutbuf</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>taps</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>ccc</value>
+-    </param>
+-  </block>
+-  <block>
+-    <key>uhd_usrp_sink</key>
+-    <param>
+-      <key>alias</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>ant0</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw0</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq0</key>
+-      <value>freq</value>
+-    </param>
+-    <param>
+-      <key>norm_gain0</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain0</key>
+-      <value>70</value>
+-    </param>
+-    <param>
+-      <key>ant10</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw10</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq10</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain10</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain10</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant11</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw11</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq11</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain11</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain11</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant12</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw12</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq12</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain12</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain12</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant13</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw13</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq13</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain13</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain13</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant14</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw14</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq14</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain14</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain14</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant15</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw15</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq15</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain15</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain15</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant16</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw16</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq16</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain16</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain16</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant17</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw17</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq17</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain17</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain17</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant18</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw18</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq18</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain18</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain18</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant19</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw19</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq19</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain19</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain19</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant1</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw1</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq1</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain1</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain1</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant20</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw20</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq20</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain20</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain20</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant21</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw21</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq21</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain21</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain21</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant22</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw22</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq22</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain22</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain22</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant23</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw23</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq23</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain23</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain23</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant24</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw24</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq24</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain24</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain24</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant25</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw25</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq25</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain25</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain25</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant26</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw26</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq26</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain26</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain26</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant27</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw27</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq27</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain27</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain27</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant28</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw28</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq28</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain28</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain28</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant29</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw29</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq29</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain29</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain29</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant2</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw2</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq2</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain2</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain2</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant30</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw30</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq30</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain30</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain30</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant31</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw31</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq31</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain31</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain31</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant3</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw3</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq3</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain3</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain3</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant4</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw4</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq4</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain4</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain4</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant5</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw5</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq5</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain5</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain5</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant6</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw6</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq6</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain6</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain6</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant7</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw7</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq7</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain7</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain7</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant8</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw8</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq8</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain8</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain8</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>ant9</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>bw9</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>center_freq9</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>norm_gain9</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>gain9</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>clock_rate</key>
+-      <value>0.0</value>
+-    </param>
+-    <param>
+-      <key>comment</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>affinity</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>dev_addr</key>
+-      <value>""</value>
+-    </param>
+-    <param>
+-      <key>dev_args</key>
+-      <value>"send_frame_size=65536,num_send_frames=128"</value>
+-    </param>
+-    <param>
+-      <key>_enabled</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>_coordinate</key>
+-      <value>(528, 440)</value>
+-    </param>
+-    <param>
+-      <key>_rotation</key>
+-      <value>0</value>
+-    </param>
+-    <param>
+-      <key>id</key>
+-      <value>uhd_usrp_sink_0</value>
+-    </param>
+-    <param>
+-      <key>type</key>
+-      <value>fc32</value>
+-    </param>
+-    <param>
+-      <key>clock_source0</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>sd_spec0</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>time_source0</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>clock_source1</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>sd_spec1</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>time_source1</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>clock_source2</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>sd_spec2</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>time_source2</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>clock_source3</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>sd_spec3</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>time_source3</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>clock_source4</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>sd_spec4</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>time_source4</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>clock_source5</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>sd_spec5</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>time_source5</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>clock_source6</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>sd_spec6</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>time_source6</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>clock_source7</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>sd_spec7</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>time_source7</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>nchan</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>num_mboards</key>
+-      <value>1</value>
+-    </param>
+-    <param>
+-      <key>samp_rate</key>
+-      <value>samp_rate</value>
+-    </param>
+-    <param>
+-      <key>hide_cmd_port</key>
+-      <value>False</value>
+-    </param>
+-    <param>
+-      <key>hide_lo_controls</key>
+-      <value>True</value>
+-    </param>
+-    <param>
+-      <key>stream_args</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>stream_chans</key>
+-      <value>[]</value>
+-    </param>
+-    <param>
+-      <key>sync</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>len_tag_name</key>
+-      <value></value>
+-    </param>
+-    <param>
+-      <key>otw</key>
+-      <value></value>
+-    </param>
+-  </block>
+-  <connection>
+-    <source_block_id>analog_sig_source_x_0</source_block_id>
+-    <sink_block_id>analog_wfm_tx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>analog_wfm_tx_0</source_block_id>
+-    <sink_block_id>rational_resampler_xxx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_add_xx_0</source_block_id>
+-    <sink_block_id>uhd_usrp_sink_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_conjugate_cc_0</source_block_id>
+-    <sink_block_id>rational_resampler_xxx_1</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_keep_m_in_n_0</source_block_id>
+-    <sink_block_id>blocks_multiply_xx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>1</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_multiply_const_vxx_0</source_block_id>
+-    <sink_block_id>blocks_add_xx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_multiply_const_vxx_1</source_block_id>
+-    <sink_block_id>blocks_add_xx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>1</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_multiply_xx_0</source_block_id>
+-    <sink_block_id>blocks_conjugate_cc_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_repeat_0</source_block_id>
+-    <sink_block_id>blocks_vector_to_stream_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_stream_to_vector_0</source_block_id>
+-    <sink_block_id>fft_vxx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_vector_source_x_0</source_block_id>
+-    <sink_block_id>blocks_multiply_xx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_vector_to_stream_0</source_block_id>
+-    <sink_block_id>blocks_keep_m_in_n_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_vector_to_stream_1</source_block_id>
+-    <sink_block_id>digital_chunks_to_symbols_xx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_wavfile_source_0</source_block_id>
+-    <sink_block_id>nrsc5_hdc_encoder_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>blocks_wavfile_source_0</source_block_id>
+-    <sink_block_id>nrsc5_hdc_encoder_0</sink_block_id>
+-    <source_key>1</source_key>
+-    <sink_key>1</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>digital_chunks_to_symbols_xx_0</source_block_id>
+-    <sink_block_id>blocks_stream_to_vector_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>fft_vxx_0</source_block_id>
+-    <sink_block_id>blocks_repeat_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>low_pass_filter_0</source_block_id>
+-    <sink_block_id>blocks_multiply_const_vxx_1</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>nrsc5_hdc_encoder_0</source_block_id>
+-    <sink_block_id>nrsc5_l2_encoder_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>nrsc5_l1_fm_encoder_mp1_0</source_block_id>
+-    <sink_block_id>blocks_vector_to_stream_1</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>nrsc5_l2_encoder_0</source_block_id>
+-    <sink_block_id>nrsc5_l1_fm_encoder_mp1_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>nrsc5_sis_encoder_0</source_block_id>
+-    <sink_block_id>nrsc5_l1_fm_encoder_mp1_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>1</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>nrsc5_psd_encoder_0</source_block_id>
+-    <sink_block_id>nrsc5_l2_encoder_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>1</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>rational_resampler_xxx_0</source_block_id>
+-    <sink_block_id>low_pass_filter_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>rational_resampler_xxx_1</source_block_id>
+-    <sink_block_id>rational_resampler_xxx_2</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-  <connection>
+-    <source_block_id>rational_resampler_xxx_2</source_block_id>
+-    <sink_block_id>blocks_multiply_const_vxx_0</sink_block_id>
+-    <source_key>0</source_key>
+-    <sink_key>0</sink_key>
+-  </connection>
+-</flow_graph>
++options:
++  parameters:
++    author: ''
++    category: '[GRC Hier Blocks]'
++    cmake_opt: ''
++    comment: ''
++    copyright: ''
++    description: ''
++    gen_cmake: 'On'
++    gen_linking: dynamic
++    generate_options: no_gui
++    hier_block_src_path: '.:'
++    id: hd_tx_usrp
++    max_nouts: '0'
++    output_language: python
++    placement: (0,0)
++    qt_qss_theme: ''
++    realtime_scheduling: ''
++    run: 'True'
++    run_command: '{python} -u {filename}'
++    run_options: prompt
++    sizing_mode: fixed
++    thread_safe_setters: ''
++    title: ''
++    window_size: ''
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [8, 12]
++    rotation: 0
++    state: enabled
++
++blocks:
++- name: freq
++  id: variable
++  parameters:
++    comment: ''
++    value: 87.5e6
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [8, 164]
++    rotation: 0
++    state: enabled
++- name: samp_rate
++  id: variable
++  parameters:
++    comment: ''
++    value: '2000000'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [8, 100]
++    rotation: 0
++    state: enabled
++- name: analog_sig_source_x_0
++  id: analog_sig_source_x
++  parameters:
++    affinity: ''
++    alias: ''
++    amp: '0.1'
++    comment: ''
++    freq: '1000'
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    offset: '0'
++    phase: '0'
++    samp_rate: '50000'
++    type: float
++    waveform: analog.GR_COS_WAVE
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [1152, 644.0]
++    rotation: 180
++    state: enabled
++- name: analog_wfm_tx_0
++  id: analog_wfm_tx
++  parameters:
++    affinity: ''
++    alias: ''
++    audio_rate: '50000'
++    comment: ''
++    fh: '-1.0'
++    max_dev: 75e3
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    quad_rate: '200000'
++    tau: 75e-6
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [896, 652.0]
++    rotation: 180
++    state: enabled
++- name: blocks_add_xx_0
++  id: blocks_add_xx
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    num_inputs: '2'
++    type: complex
++    vlen: '1'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [424, 544.0]
++    rotation: 0
++    state: enabled
++- name: blocks_conjugate_cc_0
++  id: blocks_conjugate_cc
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [624, 424.0]
++    rotation: 180
++    state: enabled
++- name: blocks_keep_m_in_n_0
++  id: blocks_keep_m_in_n
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    m: '2160'
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    n: '4096'
++    offset: '0'
++    type: complex
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [952, 420.0]
++    rotation: 180
++    state: enabled
++- name: blocks_multiply_const_vxx_0
++  id: blocks_multiply_const_vxx
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    const: '0.001'
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    type: complex
++    vlen: '1'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [248, 540.0]
++    rotation: 0
++    state: enabled
++- name: blocks_multiply_const_vxx_1
++  id: blocks_multiply_const_vxx
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    const: '0.1'
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    type: complex
++    vlen: '1'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [368, 684.0]
++    rotation: 180
++    state: enabled
++- name: blocks_multiply_xx_0
++  id: blocks_multiply_xx
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    num_inputs: '2'
++    type: complex
++    vlen: '1'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [816, 408.0]
++    rotation: 180
++    state: enabled
++- name: blocks_repeat_0
++  id: blocks_repeat
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    interp: '2'
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    type: complex
++    vlen: '2048'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [1104, 244]
++    rotation: 0
++    state: enabled
++- name: blocks_stream_to_vector_0
++  id: blocks_stream_to_vector
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    num_items: '2048'
++    type: complex
++    vlen: '1'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [696, 256.0]
++    rotation: 0
++    state: enabled
++- name: blocks_vector_source_x_0
++  id: blocks_vector_source_x
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    repeat: 'True'
++    tags: '[]'
++    type: complex
++    vector: '[math.sin(math.pi / 2 * i / 112) for i in range(112)] + [1] * (2048-112)
++      + [math.cos(math.pi / 2 * i / 112) for i in range(112)]'
++    vlen: '1'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [952, 340.0]
++    rotation: 180
++    state: enabled
++- name: blocks_vector_to_stream_0
++  id: blocks_vector_to_stream
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    num_items: '2048'
++    type: complex
++    vlen: '1'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [1104, 440.0]
++    rotation: 180
++    state: enabled
++- name: blocks_vector_to_stream_1
++  id: blocks_vector_to_stream
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    num_items: '1048576'
++    type: byte
++    vlen: '1'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [288, 256.0]
++    rotation: 0
++    state: enabled
++- name: blocks_wavfile_source_0
++  id: blocks_wavfile_source
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    file: sample.wav
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    nchan: '2'
++    repeat: 'True'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [896, 56.0]
++    rotation: 180
++    state: enabled
++- name: digital_chunks_to_symbols_xx_0
++  id: digital_chunks_to_symbols_xx
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    dimension: '1'
++    in_type: byte
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    num_ports: '1'
++    out_type: complex
++    symbol_table: (-1-1j, -1+1j, 1-1j, 1+1j, 0)
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [472, 256.0]
++    rotation: 0
++    state: enabled
++- name: fft_vxx_0
++  id: fft_vxx
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    fft_size: '2048'
++    forward: 'False'
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    nthreads: '1'
++    shift: 'True'
++    type: complex
++    window: window.rectangular(2048)
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [880, 220.0]
++    rotation: 0
++    state: enabled
++- name: import_0
++  id: import
++  parameters:
++    alias: ''
++    comment: ''
++    imports: import math
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [8, 236]
++    rotation: 0
++    state: enabled
++- name: low_pass_filter_0
++  id: low_pass_filter
++  parameters:
++    affinity: ''
++    alias: ''
++    beta: '6.76'
++    comment: ''
++    cutoff_freq: '80000'
++    decim: '1'
++    gain: '1'
++    interp: '1'
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    samp_rate: samp_rate
++    type: fir_filter_ccf
++    width: '20000'
++    win: firdes.WIN_HAMMING
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [528, 636.0]
++    rotation: 180
++    state: enabled
++- name: nrsc5_hdc_encoder_0
++  id: nrsc5_hdc_encoder
++  parameters:
++    affinity: ''
++    alias: ''
++    bitrate: '64000'
++    channels: '2'
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [728, 56.0]
++    rotation: 180
++    state: enabled
++- name: nrsc5_l1_fm_encoder_mp1_0
++  id: nrsc5_l1_fm_encoder_mp1
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [288, 88.0]
++    rotation: 180
++    state: enabled
++- name: nrsc5_l2_encoder_0
++  id: nrsc5_l2_encoder
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    first_prog: '0'
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    num_progs: '1'
++    size: '146176'
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [528, 68.0]
++    rotation: 180
++    state: enabled
++- name: nrsc5_psd_encoder_0
++  id: nrsc5_psd_encoder
++  parameters:
++    affinity: ''
++    alias: ''
++    artist: Artist
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    prog_num: '0'
++    title: Title
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [728, 132.0]
++    rotation: 180
++    state: enabled
++- name: nrsc5_sis_encoder_0
++  id: nrsc5_sis_encoder
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    short_name: ABCD
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [528, 148.0]
++    rotation: 180
++    state: enabled
++- name: rational_resampler_xxx_0
++  id: rational_resampler_xxx
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    decim: '1'
++    fbw: '0'
++    interp: samp_rate // 200000
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    taps: ''
++    type: ccc
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [704, 660.0]
++    rotation: 180
++    state: enabled
++- name: rational_resampler_xxx_1
++  id: rational_resampler_xxx
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    decim: '49'
++    fbw: '0'
++    interp: '125'
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    taps: ''
++    type: ccc
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [432, 396.0]
++    rotation: 180
++    state: enabled
++- name: rational_resampler_xxx_2
++  id: rational_resampler_xxx
++  parameters:
++    affinity: ''
++    alias: ''
++    comment: ''
++    decim: '243'
++    fbw: '0'
++    interp: '256'
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    taps: ''
++    type: ccc
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [240, 396.0]
++    rotation: 180
++    state: enabled
++- name: uhd_usrp_sink_0
++  id: uhd_usrp_sink
++  parameters:
++    affinity: ''
++    alias: ''
++    ant0: TX/RX
++    ant1: ''
++    ant10: ''
++    ant11: ''
++    ant12: ''
++    ant13: ''
++    ant14: ''
++    ant15: ''
++    ant16: ''
++    ant17: ''
++    ant18: ''
++    ant19: ''
++    ant2: ''
++    ant20: ''
++    ant21: ''
++    ant22: ''
++    ant23: ''
++    ant24: ''
++    ant25: ''
++    ant26: ''
++    ant27: ''
++    ant28: ''
++    ant29: ''
++    ant3: ''
++    ant30: ''
++    ant31: ''
++    ant4: ''
++    ant5: ''
++    ant6: ''
++    ant7: ''
++    ant8: ''
++    ant9: ''
++    bw0: '0'
++    bw1: '0'
++    bw10: '0'
++    bw11: '0'
++    bw12: '0'
++    bw13: '0'
++    bw14: '0'
++    bw15: '0'
++    bw16: '0'
++    bw17: '0'
++    bw18: '0'
++    bw19: '0'
++    bw2: '0'
++    bw20: '0'
++    bw21: '0'
++    bw22: '0'
++    bw23: '0'
++    bw24: '0'
++    bw25: '0'
++    bw26: '0'
++    bw27: '0'
++    bw28: '0'
++    bw29: '0'
++    bw3: '0'
++    bw30: '0'
++    bw31: '0'
++    bw4: '0'
++    bw5: '0'
++    bw6: '0'
++    bw7: '0'
++    bw8: '0'
++    bw9: '0'
++    center_freq0: freq
++    center_freq1: '0'
++    center_freq10: '0'
++    center_freq11: '0'
++    center_freq12: '0'
++    center_freq13: '0'
++    center_freq14: '0'
++    center_freq15: '0'
++    center_freq16: '0'
++    center_freq17: '0'
++    center_freq18: '0'
++    center_freq19: '0'
++    center_freq2: '0'
++    center_freq20: '0'
++    center_freq21: '0'
++    center_freq22: '0'
++    center_freq23: '0'
++    center_freq24: '0'
++    center_freq25: '0'
++    center_freq26: '0'
++    center_freq27: '0'
++    center_freq28: '0'
++    center_freq29: '0'
++    center_freq3: '0'
++    center_freq30: '0'
++    center_freq31: '0'
++    center_freq4: '0'
++    center_freq5: '0'
++    center_freq6: '0'
++    center_freq7: '0'
++    center_freq8: '0'
++    center_freq9: '0'
++    clock_rate: '0.0'
++    clock_source0: ''
++    clock_source1: ''
++    clock_source2: ''
++    clock_source3: ''
++    clock_source4: ''
++    clock_source5: ''
++    clock_source6: ''
++    clock_source7: ''
++    comment: ''
++    dev_addr: '""'
++    dev_args: ''
++    gain0: '70'
++    gain1: '0'
++    gain10: '0'
++    gain11: '0'
++    gain12: '0'
++    gain13: '0'
++    gain14: '0'
++    gain15: '0'
++    gain16: '0'
++    gain17: '0'
++    gain18: '0'
++    gain19: '0'
++    gain2: '0'
++    gain20: '0'
++    gain21: '0'
++    gain22: '0'
++    gain23: '0'
++    gain24: '0'
++    gain25: '0'
++    gain26: '0'
++    gain27: '0'
++    gain28: '0'
++    gain29: '0'
++    gain3: '0'
++    gain30: '0'
++    gain31: '0'
++    gain4: '0'
++    gain5: '0'
++    gain6: '0'
++    gain7: '0'
++    gain8: '0'
++    gain9: '0'
++    len_tag_name: ''
++    lo_export0: 'False'
++    lo_export1: 'False'
++    lo_export10: 'False'
++    lo_export11: 'False'
++    lo_export12: 'False'
++    lo_export13: 'False'
++    lo_export14: 'False'
++    lo_export15: 'False'
++    lo_export16: 'False'
++    lo_export17: 'False'
++    lo_export18: 'False'
++    lo_export19: 'False'
++    lo_export2: 'False'
++    lo_export20: 'False'
++    lo_export21: 'False'
++    lo_export22: 'False'
++    lo_export23: 'False'
++    lo_export24: 'False'
++    lo_export25: 'False'
++    lo_export26: 'False'
++    lo_export27: 'False'
++    lo_export28: 'False'
++    lo_export29: 'False'
++    lo_export3: 'False'
++    lo_export30: 'False'
++    lo_export31: 'False'
++    lo_export4: 'False'
++    lo_export5: 'False'
++    lo_export6: 'False'
++    lo_export7: 'False'
++    lo_export8: 'False'
++    lo_export9: 'False'
++    lo_source0: internal
++    lo_source1: internal
++    lo_source10: internal
++    lo_source11: internal
++    lo_source12: internal
++    lo_source13: internal
++    lo_source14: internal
++    lo_source15: internal
++    lo_source16: internal
++    lo_source17: internal
++    lo_source18: internal
++    lo_source19: internal
++    lo_source2: internal
++    lo_source20: internal
++    lo_source21: internal
++    lo_source22: internal
++    lo_source23: internal
++    lo_source24: internal
++    lo_source25: internal
++    lo_source26: internal
++    lo_source27: internal
++    lo_source28: internal
++    lo_source29: internal
++    lo_source3: internal
++    lo_source30: internal
++    lo_source31: internal
++    lo_source4: internal
++    lo_source5: internal
++    lo_source6: internal
++    lo_source7: internal
++    lo_source8: internal
++    lo_source9: internal
++    maxoutbuf: '0'
++    minoutbuf: '0'
++    nchan: '1'
++    norm_gain0: 'False'
++    norm_gain1: 'False'
++    norm_gain10: 'False'
++    norm_gain11: 'False'
++    norm_gain12: 'False'
++    norm_gain13: 'False'
++    norm_gain14: 'False'
++    norm_gain15: 'False'
++    norm_gain16: 'False'
++    norm_gain17: 'False'
++    norm_gain18: 'False'
++    norm_gain19: 'False'
++    norm_gain2: 'False'
++    norm_gain20: 'False'
++    norm_gain21: 'False'
++    norm_gain22: 'False'
++    norm_gain23: 'False'
++    norm_gain24: 'False'
++    norm_gain25: 'False'
++    norm_gain26: 'False'
++    norm_gain27: 'False'
++    norm_gain28: 'False'
++    norm_gain29: 'False'
++    norm_gain3: 'False'
++    norm_gain30: 'False'
++    norm_gain31: 'False'
++    norm_gain4: 'False'
++    norm_gain5: 'False'
++    norm_gain6: 'False'
++    norm_gain7: 'False'
++    norm_gain8: 'False'
++    norm_gain9: 'False'
++    num_mboards: '1'
++    otw: ''
++    samp_rate: samp_rate
++    sd_spec0: ''
++    sd_spec1: ''
++    sd_spec2: ''
++    sd_spec3: ''
++    sd_spec4: ''
++    sd_spec5: ''
++    sd_spec6: ''
++    sd_spec7: ''
++    show_lo_controls: 'False'
++    stream_args: ''
++    stream_chans: '[]'
++    sync: sync
++    time_source0: ''
++    time_source1: ''
++    time_source2: ''
++    time_source3: ''
++    time_source4: ''
++    time_source5: ''
++    time_source6: ''
++    time_source7: ''
++    type: fc32
++  states:
++    bus_sink: false
++    bus_source: false
++    bus_structure: null
++    coordinate: [528, 500.0]
++    rotation: 0
++    state: enabled
++
++connections:
++- [analog_sig_source_x_0, '0', analog_wfm_tx_0, '0']
++- [analog_wfm_tx_0, '0', rational_resampler_xxx_0, '0']
++- [blocks_add_xx_0, '0', uhd_usrp_sink_0, '0']
++- [blocks_conjugate_cc_0, '0', rational_resampler_xxx_1, '0']
++- [blocks_keep_m_in_n_0, '0', blocks_multiply_xx_0, '1']
++- [blocks_multiply_const_vxx_0, '0', blocks_add_xx_0, '0']
++- [blocks_multiply_const_vxx_1, '0', blocks_add_xx_0, '1']
++- [blocks_multiply_xx_0, '0', blocks_conjugate_cc_0, '0']
++- [blocks_repeat_0, '0', blocks_vector_to_stream_0, '0']
++- [blocks_stream_to_vector_0, '0', fft_vxx_0, '0']
++- [blocks_vector_source_x_0, '0', blocks_multiply_xx_0, '0']
++- [blocks_vector_to_stream_0, '0', blocks_keep_m_in_n_0, '0']
++- [blocks_vector_to_stream_1, '0', digital_chunks_to_symbols_xx_0, '0']
++- [blocks_wavfile_source_0, '0', nrsc5_hdc_encoder_0, '0']
++- [blocks_wavfile_source_0, '1', nrsc5_hdc_encoder_0, '1']
++- [digital_chunks_to_symbols_xx_0, '0', blocks_stream_to_vector_0, '0']
++- [fft_vxx_0, '0', blocks_repeat_0, '0']
++- [low_pass_filter_0, '0', blocks_multiply_const_vxx_1, '0']
++- [nrsc5_hdc_encoder_0, '0', nrsc5_l2_encoder_0, '0']
++- [nrsc5_l1_fm_encoder_mp1_0, '0', blocks_vector_to_stream_1, '0']
++- [nrsc5_l2_encoder_0, '0', nrsc5_l1_fm_encoder_mp1_0, '0']
++- [nrsc5_psd_encoder_0, '0', nrsc5_l2_encoder_0, '1']
++- [nrsc5_sis_encoder_0, '0', nrsc5_l1_fm_encoder_mp1_0, '1']
++- [rational_resampler_xxx_0, '0', low_pass_filter_0, '0']
++- [rational_resampler_xxx_1, '0', rational_resampler_xxx_2, '0']
++- [rational_resampler_xxx_2, '0', blocks_multiply_const_vxx_0, '0']
++
++metadata:
++  file_format: 1
+diff --git a/apps/hd_tx_usrp.py b/apps/hd_tx_usrp.py
+index 45c7145..37426ab 100755
+--- a/apps/hd_tx_usrp.py
++++ b/apps/hd_tx_usrp.py
+@@ -1,27 +1,30 @@
+-#!/usr/bin/env python2
++#!/usr/bin/env python3
+ # -*- coding: utf-8 -*-
+-##################################################
++
++#
++# SPDX-License-Identifier: GPL-3.0
++#
+ # GNU Radio Python Flow Graph
+ # Title: Hd Tx Usrp
+-# Generated: Sun Oct 15 00:12:12 2017
+-##################################################
++# GNU Radio version: 3.8.0.0-rc2
+ 
+ from gnuradio import analog
+ from gnuradio import blocks
+ from gnuradio import digital
+-from gnuradio import eng_notation
+ from gnuradio import fft
++from gnuradio.fft import window
+ from gnuradio import filter
++from gnuradio.filter import firdes
+ from gnuradio import gr
++import sys
++import signal
++from argparse import ArgumentParser
++from gnuradio.eng_arg import eng_float, intx
++from gnuradio import eng_notation
+ from gnuradio import uhd
+-from gnuradio.eng_option import eng_option
+-from gnuradio.fft import window
+-from gnuradio.filter import firdes
+-from optparse import OptionParser
++import time
+ import math
+ import nrsc5
+-import time
+-
+ 
+ class hd_tx_usrp(gr.top_block):
+ 
+@@ -32,47 +35,55 @@ def __init__(self):
+         # Variables
+         ##################################################
+         self.samp_rate = samp_rate = 2000000
+-        self.freq = freq = 95.7e6
++        self.freq = freq = 87.5e6
+ 
+         ##################################################
+         # Blocks
+         ##################################################
+         self.uhd_usrp_sink_0 = uhd.usrp_sink(
+-        	",".join(("", "send_frame_size=65536,num_send_frames=128")),
+-        	uhd.stream_args(
+-        		cpu_format="fc32",
+-        		channels=range(1),
+-        	),
++            ",".join(("", '')),
++            uhd.stream_args(
++                cpu_format="fc32",
++                args='',
++                channels=[],
++            ),
++            '',
+         )
+-        self.uhd_usrp_sink_0.set_samp_rate(samp_rate)
+         self.uhd_usrp_sink_0.set_center_freq(freq, 0)
+         self.uhd_usrp_sink_0.set_gain(70, 0)
++        self.uhd_usrp_sink_0.set_antenna('TX/RX', 0)
++        self.uhd_usrp_sink_0.set_samp_rate(samp_rate)
++        self.uhd_usrp_sink_0.set_time_unknown_pps(uhd.time_spec())
+         self.rational_resampler_xxx_2 = filter.rational_resampler_ccc(
+                 interpolation=256,
+                 decimation=243,
+                 taps=None,
+-                fractional_bw=None,
+-        )
++                fractional_bw=None)
+         self.rational_resampler_xxx_1 = filter.rational_resampler_ccc(
+                 interpolation=125,
+                 decimation=49,
+                 taps=None,
+-                fractional_bw=None,
+-        )
++                fractional_bw=None)
+         self.rational_resampler_xxx_0 = filter.rational_resampler_ccc(
+-                interpolation=samp_rate / 200000,
++                interpolation=samp_rate // 200000,
+                 decimation=1,
+                 taps=None,
+-                fractional_bw=None,
+-        )
++                fractional_bw=None)
+         self.nrsc5_sis_encoder_0 = nrsc5.sis_encoder('ABCD')
+         self.nrsc5_psd_encoder_0 = nrsc5.psd_encoder(0, 'Title', 'Artist')
+         self.nrsc5_l2_encoder_0 = nrsc5.l2_encoder(1, 0, 146176)
+         self.nrsc5_l1_fm_encoder_mp1_0 = nrsc5.l1_fm_encoder(1)
+         self.nrsc5_hdc_encoder_0 = nrsc5.hdc_encoder(2, 64000)
+-        self.low_pass_filter_0 = filter.fir_filter_ccf(1, firdes.low_pass(
+-        	1, samp_rate, 80000, 20000, firdes.WIN_HAMMING, 6.76))
+-        self.fft_vxx_0 = fft.fft_vcc(2048, False, (window.rectangular(2048)), True, 1)
++        self.low_pass_filter_0 = filter.fir_filter_ccf(
++            1,
++            firdes.low_pass(
++                1,
++                samp_rate,
++                80000,
++                20000,
++                firdes.WIN_HAMMING,
++                6.76))
++        self.fft_vxx_0 = fft.fft_vcc(2048, False, window.rectangular(2048), True, 1)
+         self.digital_chunks_to_symbols_xx_0 = digital.chunks_to_symbols_bc((-1-1j, -1+1j, 1-1j, 1+1j, 0), 1)
+         self.blocks_wavfile_source_0 = blocks.wavfile_source('sample.wav', True)
+         self.blocks_vector_to_stream_1 = blocks.vector_to_stream(gr.sizeof_char*1, 1048576)
+@@ -81,8 +92,8 @@ def __init__(self):
+         self.blocks_stream_to_vector_0 = blocks.stream_to_vector(gr.sizeof_gr_complex*1, 2048)
+         self.blocks_repeat_0 = blocks.repeat(gr.sizeof_gr_complex*2048, 2)
+         self.blocks_multiply_xx_0 = blocks.multiply_vcc(1)
+-        self.blocks_multiply_const_vxx_1 = blocks.multiply_const_vcc((0.1, ))
+-        self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vcc((0.001, ))
++        self.blocks_multiply_const_vxx_1 = blocks.multiply_const_cc(0.1)
++        self.blocks_multiply_const_vxx_0 = blocks.multiply_const_cc(0.001)
+         self.blocks_keep_m_in_n_0 = blocks.keep_m_in_n(gr.sizeof_gr_complex, 2160, 4096, 0)
+         self.blocks_conjugate_cc_0 = blocks.conjugate_cc()
+         self.blocks_add_xx_0 = blocks.add_vcc(1)
+@@ -93,7 +104,9 @@ def __init__(self):
+         	max_dev=75e3,
+         	fh=-1.0,
+         )
+-        self.analog_sig_source_x_0 = analog.sig_source_f(50000, analog.GR_COS_WAVE, 1000, 0.1, 0)
++        self.analog_sig_source_x_0 = analog.sig_source_f(50000, analog.GR_COS_WAVE, 1000, 0.1, 0, 0)
++
++
+ 
+         ##################################################
+         # Connections
+@@ -130,8 +143,8 @@ def get_samp_rate(self):
+ 
+     def set_samp_rate(self, samp_rate):
+         self.samp_rate = samp_rate
+-        self.uhd_usrp_sink_0.set_samp_rate(self.samp_rate)
+         self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.samp_rate, 80000, 20000, firdes.WIN_HAMMING, 6.76))
++        self.uhd_usrp_sink_0.set_samp_rate(self.samp_rate)
+ 
+     def get_freq(self):
+         return self.freq
+@@ -141,12 +154,21 @@ def set_freq(self, freq):
+         self.uhd_usrp_sink_0.set_center_freq(self.freq, 0)
+ 
+ 
+-def main(top_block_cls=hd_tx_usrp, options=None):
+ 
++def main(top_block_cls=hd_tx_usrp, options=None):
+     tb = top_block_cls()
++
++    def sig_handler(sig=None, frame=None):
++        tb.stop()
++        tb.wait()
++        sys.exit(0)
++
++    signal.signal(signal.SIGINT, sig_handler)
++    signal.signal(signal.SIGTERM, sig_handler)
++
+     tb.start()
+     try:
+-        raw_input('Press Enter to quit: ')
++        input('Press Enter to quit: ')
+     except EOFError:
+         pass
+     tb.stop()
+diff --git a/cmake/Modules/CMakeParseArgumentsCopy.cmake b/cmake/Modules/CMakeParseArgumentsCopy.cmake
+index 7ce4c49..66016cb 100644
+--- a/cmake/Modules/CMakeParseArgumentsCopy.cmake
++++ b/cmake/Modules/CMakeParseArgumentsCopy.cmake
+@@ -58,7 +58,7 @@
+ # the new option.
+ # E.g. my_install(TARGETS foo DESTINATION OPTIONAL) would result in
+ # MY_INSTALL_DESTINATION set to "OPTIONAL", but MY_INSTALL_DESTINATION would
+-# be empty and MY_INSTALL_OPTIONAL would be set to TRUE therefor.
++# be empty and MY_INSTALL_OPTIONAL would be set to TRUE therefore.
+ 
+ #=============================================================================
+ # Copyright 2010 Alexander Neundorf <neundorf@kde.org>
+diff --git a/cmake/Modules/FindCppUnit.cmake b/cmake/Modules/FindCppUnit.cmake
+deleted file mode 100644
+index f93ade3..0000000
+--- a/cmake/Modules/FindCppUnit.cmake
++++ /dev/null
+@@ -1,39 +0,0 @@
+-# http://www.cmake.org/pipermail/cmake/2006-October/011446.html
+-# Modified to use pkg config and use standard var names
+-
+-#
+-# Find the CppUnit includes and library
+-#
+-# This module defines
+-# CPPUNIT_INCLUDE_DIR, where to find tiff.h, etc.
+-# CPPUNIT_LIBRARIES, the libraries to link against to use CppUnit.
+-# CPPUNIT_FOUND, If false, do not try to use CppUnit.
+-
+-INCLUDE(FindPkgConfig)
+-PKG_CHECK_MODULES(PC_CPPUNIT "cppunit")
+-
+-FIND_PATH(CPPUNIT_INCLUDE_DIRS
+-    NAMES cppunit/TestCase.h
+-    HINTS ${PC_CPPUNIT_INCLUDE_DIR}
+-    ${CMAKE_INSTALL_PREFIX}/include
+-    PATHS
+-    /usr/local/include
+-    /usr/include
+-)
+-
+-FIND_LIBRARY(CPPUNIT_LIBRARIES
+-    NAMES cppunit
+-    HINTS ${PC_CPPUNIT_LIBDIR}
+-    ${CMAKE_INSTALL_PREFIX}/lib
+-    ${CMAKE_INSTALL_PREFIX}/lib64
+-    PATHS
+-    ${CPPUNIT_INCLUDE_DIRS}/../lib
+-    /usr/local/lib
+-    /usr/lib
+-)
+-
+-LIST(APPEND CPPUNIT_LIBRARIES ${CMAKE_DL_LIBS})
+-
+-INCLUDE(FindPackageHandleStandardArgs)
+-FIND_PACKAGE_HANDLE_STANDARD_ARGS(CPPUNIT DEFAULT_MSG CPPUNIT_LIBRARIES CPPUNIT_INCLUDE_DIRS)
+-MARK_AS_ADVANCED(CPPUNIT_LIBRARIES CPPUNIT_INCLUDE_DIRS)
+diff --git a/cmake/Modules/FindGnuradioRuntime.cmake b/cmake/Modules/FindGnuradioRuntime.cmake
+deleted file mode 100644
+index afed684..0000000
+--- a/cmake/Modules/FindGnuradioRuntime.cmake
++++ /dev/null
+@@ -1,36 +0,0 @@
+-INCLUDE(FindPkgConfig)
+-PKG_CHECK_MODULES(PC_GNURADIO_RUNTIME gnuradio-runtime)
+-
+-if(PC_GNURADIO_RUNTIME_FOUND)
+-  # look for include files
+-  FIND_PATH(
+-    GNURADIO_RUNTIME_INCLUDE_DIRS
+-    NAMES gnuradio/top_block.h
+-    HINTS $ENV{GNURADIO_RUNTIME_DIR}/include
+-          ${PC_GNURADIO_RUNTIME_INCLUDE_DIRS}
+-          ${CMAKE_INSTALL_PREFIX}/include
+-    PATHS /usr/local/include
+-          /usr/include
+-    )
+-
+-  # look for libs
+-  FIND_LIBRARY(
+-    GNURADIO_RUNTIME_LIBRARIES
+-    NAMES gnuradio-runtime
+-    HINTS $ENV{GNURADIO_RUNTIME_DIR}/lib
+-          ${PC_GNURADIO_RUNTIME_LIBDIR}
+-          ${CMAKE_INSTALL_PREFIX}/lib/
+-          ${CMAKE_INSTALL_PREFIX}/lib64/
+-    PATHS /usr/local/lib
+-          /usr/local/lib64
+-          /usr/lib
+-          /usr/lib64
+-    )
+-
+-  set(GNURADIO_RUNTIME_FOUND ${PC_GNURADIO_RUNTIME_FOUND})
+-endif(PC_GNURADIO_RUNTIME_FOUND)
+-
+-INCLUDE(FindPackageHandleStandardArgs)
+-# do not check GNURADIO_RUNTIME_INCLUDE_DIRS, is not set when default include path us used.
+-FIND_PACKAGE_HANDLE_STANDARD_ARGS(GNURADIO_RUNTIME DEFAULT_MSG GNURADIO_RUNTIME_LIBRARIES)
+-MARK_AS_ADVANCED(GNURADIO_RUNTIME_LIBRARIES GNURADIO_RUNTIME_INCLUDE_DIRS)
+diff --git a/cmake/Modules/GrMiscUtils.cmake b/cmake/Modules/GrMiscUtils.cmake
+deleted file mode 100644
+index 5bad57c..0000000
+--- a/cmake/Modules/GrMiscUtils.cmake
++++ /dev/null
+@@ -1,528 +0,0 @@
+-# Copyright 2010-2011,2014 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.
+-
+-if(DEFINED __INCLUDED_GR_MISC_UTILS_CMAKE)
+-    return()
+-endif()
+-set(__INCLUDED_GR_MISC_UTILS_CMAKE TRUE)
+-
+-########################################################################
+-# Set global variable macro.
+-# Used for subdirectories to export settings.
+-# Example: include and library paths.
+-########################################################################
+-function(GR_SET_GLOBAL var)
+-    set(${var} ${ARGN} CACHE INTERNAL "" FORCE)
+-endfunction(GR_SET_GLOBAL)
+-
+-########################################################################
+-# Set the pre-processor definition if the condition is true.
+-#  - def the pre-processor definition to set and condition name
+-########################################################################
+-function(GR_ADD_COND_DEF def)
+-    if(${def})
+-        add_definitions(-D${def})
+-    endif(${def})
+-endfunction(GR_ADD_COND_DEF)
+-
+-########################################################################
+-# Check for a header and conditionally set a compile define.
+-#  - hdr the relative path to the header file
+-#  - def the pre-processor definition to set
+-########################################################################
+-function(GR_CHECK_HDR_N_DEF hdr def)
+-    include(CheckIncludeFileCXX)
+-    CHECK_INCLUDE_FILE_CXX(${hdr} ${def})
+-    GR_ADD_COND_DEF(${def})
+-endfunction(GR_CHECK_HDR_N_DEF)
+-
+-########################################################################
+-# Include subdirectory macro.
+-# Sets the CMake directory variables,
+-# includes the subdirectory CMakeLists.txt,
+-# resets the CMake directory variables.
+-#
+-# This macro includes subdirectories rather than adding them
+-# so that the subdirectory can affect variables in the level above.
+-# This provides a work-around for the lack of convenience libraries.
+-# This way a subdirectory can append to the list of library sources.
+-########################################################################
+-macro(GR_INCLUDE_SUBDIRECTORY subdir)
+-    #insert the current directories on the front of the list
+-    list(INSERT _cmake_source_dirs 0 ${CMAKE_CURRENT_SOURCE_DIR})
+-    list(INSERT _cmake_binary_dirs 0 ${CMAKE_CURRENT_BINARY_DIR})
+-
+-    #set the current directories to the names of the subdirs
+-    set(CMAKE_CURRENT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${subdir})
+-    set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${subdir})
+-
+-    #include the subdirectory CMakeLists to run it
+-    file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+-    include(${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt)
+-
+-    #reset the value of the current directories
+-    list(GET _cmake_source_dirs 0 CMAKE_CURRENT_SOURCE_DIR)
+-    list(GET _cmake_binary_dirs 0 CMAKE_CURRENT_BINARY_DIR)
+-
+-    #pop the subdir names of the front of the list
+-    list(REMOVE_AT _cmake_source_dirs 0)
+-    list(REMOVE_AT _cmake_binary_dirs 0)
+-endmacro(GR_INCLUDE_SUBDIRECTORY)
+-
+-########################################################################
+-# Check if a compiler flag works and conditionally set a compile define.
+-#  - flag the compiler flag to check for
+-#  - have the variable to set with result
+-########################################################################
+-macro(GR_ADD_CXX_COMPILER_FLAG_IF_AVAILABLE flag have)
+-    include(CheckCXXCompilerFlag)
+-    CHECK_CXX_COMPILER_FLAG(${flag} ${have})
+-    if(${have})
+-      if(${CMAKE_VERSION} VERSION_GREATER "2.8.4")
+-        STRING(FIND "${CMAKE_CXX_FLAGS}" "${flag}" flag_dup)
+-        if(${flag_dup} EQUAL -1)
+-          set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}")
+-          set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}")
+-        endif(${flag_dup} EQUAL -1)
+-      endif(${CMAKE_VERSION} VERSION_GREATER "2.8.4")
+-    endif(${have})
+-endmacro(GR_ADD_CXX_COMPILER_FLAG_IF_AVAILABLE)
+-
+-########################################################################
+-# Generates the .la libtool file
+-# This appears to generate libtool files that cannot be used by auto*.
+-# Usage GR_LIBTOOL(TARGET [target] DESTINATION [dest])
+-# Notice: there is not COMPONENT option, these will not get distributed.
+-########################################################################
+-function(GR_LIBTOOL)
+-    if(NOT DEFINED GENERATE_LIBTOOL)
+-        set(GENERATE_LIBTOOL OFF) #disabled by default
+-    endif()
+-
+-    if(GENERATE_LIBTOOL)
+-        include(CMakeParseArgumentsCopy)
+-        CMAKE_PARSE_ARGUMENTS(GR_LIBTOOL "" "TARGET;DESTINATION" "" ${ARGN})
+-
+-        find_program(LIBTOOL libtool)
+-        if(LIBTOOL)
+-            include(CMakeMacroLibtoolFile)
+-            CREATE_LIBTOOL_FILE(${GR_LIBTOOL_TARGET} /${GR_LIBTOOL_DESTINATION})
+-        endif(LIBTOOL)
+-    endif(GENERATE_LIBTOOL)
+-
+-endfunction(GR_LIBTOOL)
+-
+-########################################################################
+-# Do standard things to the library target
+-# - set target properties
+-# - make install rules
+-# Also handle gnuradio custom naming conventions w/ extras mode.
+-########################################################################
+-function(GR_LIBRARY_FOO target)
+-    #parse the arguments for component names
+-    include(CMakeParseArgumentsCopy)
+-    CMAKE_PARSE_ARGUMENTS(GR_LIBRARY "" "RUNTIME_COMPONENT;DEVEL_COMPONENT" "" ${ARGN})
+-
+-    #set additional target properties
+-    set_target_properties(${target} PROPERTIES SOVERSION ${LIBVER})
+-
+-    #install the generated files like so...
+-    install(TARGETS ${target}
+-        LIBRARY DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT} # .so/.dylib file
+-        ARCHIVE DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_DEVEL_COMPONENT}   # .lib file
+-        RUNTIME DESTINATION ${GR_RUNTIME_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT} # .dll file
+-    )
+-
+-    #extras mode enabled automatically on linux
+-    if(NOT DEFINED LIBRARY_EXTRAS)
+-        set(LIBRARY_EXTRAS ${LINUX})
+-    endif()
+-
+-    #special extras mode to enable alternative naming conventions
+-    if(LIBRARY_EXTRAS)
+-
+-        #create .la file before changing props
+-        GR_LIBTOOL(TARGET ${target} DESTINATION ${GR_LIBRARY_DIR})
+-
+-        #give the library a special name with ultra-zero soversion
+-        set_target_properties(${target} PROPERTIES OUTPUT_NAME ${target}-${LIBVER} SOVERSION "0.0.0")
+-        set(target_name lib${target}-${LIBVER}.so.0.0.0)
+-
+-        #custom command to generate symlinks
+-        add_custom_command(
+-            TARGET ${target}
+-            POST_BUILD
+-            COMMAND ${CMAKE_COMMAND} -E create_symlink ${target_name} ${CMAKE_CURRENT_BINARY_DIR}/lib${target}.so
+-            COMMAND ${CMAKE_COMMAND} -E create_symlink ${target_name} ${CMAKE_CURRENT_BINARY_DIR}/lib${target}-${LIBVER}.so.0
+-            COMMAND ${CMAKE_COMMAND} -E touch ${target_name} #so the symlinks point to something valid so cmake 2.6 will install
+-        )
+-
+-        #and install the extra symlinks
+-        install(
+-            FILES
+-            ${CMAKE_CURRENT_BINARY_DIR}/lib${target}.so
+-            ${CMAKE_CURRENT_BINARY_DIR}/lib${target}-${LIBVER}.so.0
+-            DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT}
+-        )
+-
+-    endif(LIBRARY_EXTRAS)
+-endfunction(GR_LIBRARY_FOO)
+-
+-########################################################################
+-# Create a dummy custom command that depends on other targets.
+-# Usage:
+-#   GR_GEN_TARGET_DEPS(unique_name target_deps <target1> <target2> ...)
+-#   ADD_CUSTOM_COMMAND(<the usual args> ${target_deps})
+-#
+-# Custom command cant depend on targets, but can depend on executables,
+-# and executables can depend on targets. So this is the process:
+-########################################################################
+-function(GR_GEN_TARGET_DEPS name var)
+-    file(
+-        WRITE ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp.in
+-        "int main(void){return 0;}\n"
+-    )
+-    execute_process(
+-        COMMAND ${CMAKE_COMMAND} -E copy_if_different
+-        ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp.in
+-        ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp
+-    )
+-    add_executable(${name} ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp)
+-    if(ARGN)
+-        add_dependencies(${name} ${ARGN})
+-    endif(ARGN)
+-
+-    if(CMAKE_CROSSCOMPILING)
+-        set(${var} "DEPENDS;${name}" PARENT_SCOPE) #cant call command when cross
+-    else()
+-        set(${var} "DEPENDS;${name};COMMAND;${name}" PARENT_SCOPE)
+-    endif()
+-endfunction(GR_GEN_TARGET_DEPS)
+-
+-########################################################################
+-# Control use of gr_logger
+-# Usage:
+-#   GR_LOGGING()
+-#
+-# Will set ENABLE_GR_LOG to 1 by default.
+-# Can manually set with -DENABLE_GR_LOG=0|1
+-########################################################################
+-function(GR_LOGGING)
+-  find_package(Log4cpp)
+-
+-  OPTION(ENABLE_GR_LOG "Use gr_logger" ON)
+-  if(ENABLE_GR_LOG)
+-    # If gr_logger is enabled, make it usable
+-    add_definitions( -DENABLE_GR_LOG )
+-
+-    # also test LOG4CPP; if we have it, use this version of the logger
+-    # otherwise, default to the stdout/stderr model.
+-    if(LOG4CPP_FOUND)
+-      SET(HAVE_LOG4CPP True CACHE INTERNAL "" FORCE)
+-      add_definitions( -DHAVE_LOG4CPP )
+-    else(not LOG4CPP_FOUND)
+-      SET(HAVE_LOG4CPP False CACHE INTERNAL "" FORCE)
+-      SET(LOG4CPP_INCLUDE_DIRS "" CACHE INTERNAL "" FORCE)
+-      SET(LOG4CPP_LIBRARY_DIRS "" CACHE INTERNAL "" FORCE)
+-      SET(LOG4CPP_LIBRARIES "" CACHE INTERNAL "" FORCE)
+-    endif(LOG4CPP_FOUND)
+-
+-    SET(ENABLE_GR_LOG ${ENABLE_GR_LOG} CACHE INTERNAL "" FORCE)
+-
+-  else(ENABLE_GR_LOG)
+-    SET(HAVE_LOG4CPP False CACHE INTERNAL "" FORCE)
+-    SET(LOG4CPP_INCLUDE_DIRS "" CACHE INTERNAL "" FORCE)
+-    SET(LOG4CPP_LIBRARY_DIRS "" CACHE INTERNAL "" FORCE)
+-    SET(LOG4CPP_LIBRARIES "" CACHE INTERNAL "" FORCE)
+-  endif(ENABLE_GR_LOG)
+-
+-  message(STATUS "ENABLE_GR_LOG set to ${ENABLE_GR_LOG}.")
+-  message(STATUS "HAVE_LOG4CPP set to ${HAVE_LOG4CPP}.")
+-  message(STATUS "LOG4CPP_LIBRARIES set to ${LOG4CPP_LIBRARIES}.")
+-
+-endfunction(GR_LOGGING)
+-
+-########################################################################
+-# Run GRCC to compile .grc files into .py files.
+-#
+-# Usage: GRCC(filename, directory)
+-#    - filenames: List of file name of .grc file
+-#    - directory: directory of built .py file - usually in
+-#                 ${CMAKE_CURRENT_BINARY_DIR}
+-#    - Sets PYFILES: output converted GRC file names to Python files.
+-########################################################################
+-function(GRCC)
+-  # Extract directory from list of args, remove it for the list of filenames.
+-  list(GET ARGV -1 directory)
+-  list(REMOVE_AT ARGV -1)
+-  set(filenames ${ARGV})
+-  file(MAKE_DIRECTORY ${directory})
+-
+-  SET(GRCC_COMMAND ${CMAKE_SOURCE_DIR}/gr-utils/python/grcc)
+-
+-  # GRCC uses some stuff in grc and gnuradio-runtime, so we force
+-  # the known paths here
+-  list(APPEND PYTHONPATHS
+-    ${CMAKE_SOURCE_DIR}
+-    ${CMAKE_SOURCE_DIR}/gnuradio-runtime/python
+-    ${CMAKE_SOURCE_DIR}/gnuradio-runtime/lib/swig
+-    ${CMAKE_BINARY_DIR}/gnuradio-runtime/lib/swig
+-    )
+-
+-  if(WIN32)
+-    #SWIG generates the python library files into a subdirectory.
+-    #Therefore, we must append this subdirectory into PYTHONPATH.
+-    #Only do this for the python directories matching the following:
+-    foreach(pydir ${PYTHONPATHS})
+-      get_filename_component(name ${pydir} NAME)
+-      if(name MATCHES "^(swig|lib|src)$")
+-        list(APPEND PYTHONPATHS ${pydir}/${CMAKE_BUILD_TYPE})
+-      endif()
+-    endforeach(pydir)
+-  endif(WIN32)
+-
+-  file(TO_NATIVE_PATH "${PYTHONPATHS}" pypath)
+-
+-  if(UNIX)
+-    list(APPEND pypath "$PYTHONPATH")
+-    string(REPLACE ";" ":" pypath "${pypath}")
+-    set(ENV{PYTHONPATH} ${pypath})
+-  endif(UNIX)
+-
+-  if(WIN32)
+-    list(APPEND pypath "%PYTHONPATH%")
+-    string(REPLACE ";" "\\;" pypath "${pypath}")
+-    #list(APPEND environs "PYTHONPATH=${pypath}")
+-    set(ENV{PYTHONPATH} ${pypath})
+-  endif(WIN32)
+-
+-  foreach(f ${filenames})
+-    execute_process(
+-      COMMAND ${GRCC_COMMAND} -d ${directory} ${f}
+-      )
+-    string(REPLACE ".grc" ".py" pyfile "${f}")
+-    string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}" pyfile "${pyfile}")
+-    list(APPEND pyfiles ${pyfile})
+-  endforeach(f)
+-
+-  set(PYFILES ${pyfiles} PARENT_SCOPE)
+-endfunction(GRCC)
+-
+-########################################################################
+-# Check if HAVE_PTHREAD_SETSCHEDPARAM and HAVE_SCHED_SETSCHEDULER
+-#  should be defined
+-########################################################################
+-macro(GR_CHECK_LINUX_SCHED_AVAIL)
+-set(CMAKE_REQUIRED_LIBRARIES -lpthread)
+-    CHECK_CXX_SOURCE_COMPILES("
+-        #include <pthread.h>
+-        int main(){
+-            pthread_t pthread;
+-            pthread_setschedparam(pthread,  0, 0);
+-            return 0;
+-        } " HAVE_PTHREAD_SETSCHEDPARAM
+-    )
+-    GR_ADD_COND_DEF(HAVE_PTHREAD_SETSCHEDPARAM)
+-
+-    CHECK_CXX_SOURCE_COMPILES("
+-        #include <sched.h>
+-        int main(){
+-            pid_t pid;
+-            sched_setscheduler(pid, 0, 0);
+-            return 0;
+-        } " HAVE_SCHED_SETSCHEDULER
+-    )
+-    GR_ADD_COND_DEF(HAVE_SCHED_SETSCHEDULER)
+-endmacro(GR_CHECK_LINUX_SCHED_AVAIL)
+-
+-########################################################################
+-# Macros to generate source and header files from template
+-########################################################################
+-macro(GR_EXPAND_X_H component root)
+-
+-  include(GrPython)
+-
+-  file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
+-"#!${PYTHON_EXECUTABLE}
+-
+-import sys, os, re
+-sys.path.append('${GR_RUNTIME_PYTHONPATH}')
+-sys.path.append('${CMAKE_SOURCE_DIR}/python')
+-os.environ['srcdir'] = '${CMAKE_CURRENT_SOURCE_DIR}'
+-os.chdir('${CMAKE_CURRENT_BINARY_DIR}')
+-
+-if __name__ == '__main__':
+-    import build_utils
+-    root, inp = sys.argv[1:3]
+-    for sig in sys.argv[3:]:
+-        name = re.sub ('X+', sig, root)
+-        d = build_utils.standard_dict2(name, sig, '${component}')
+-        build_utils.expand_template(d, inp)
+-")
+-
+-  #make a list of all the generated headers
+-  unset(expanded_files_h)
+-  foreach(sig ${ARGN})
+-    string(REGEX REPLACE "X+" ${sig} name ${root})
+-    list(APPEND expanded_files_h ${CMAKE_CURRENT_BINARY_DIR}/${name}.h)
+-  endforeach(sig)
+-  unset(name)
+-
+-  #create a command to generate the headers
+-  add_custom_command(
+-    OUTPUT ${expanded_files_h}
+-    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}.h.t
+-    COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
+-    ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
+-    ${root} ${root}.h.t ${ARGN}
+-  )
+-
+-  #install rules for the generated headers
+-  list(APPEND generated_includes ${expanded_files_h})
+-
+-endmacro(GR_EXPAND_X_H)
+-
+-macro(GR_EXPAND_X_CC_H component root)
+-
+-  include(GrPython)
+-
+-  file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
+-"#!${PYTHON_EXECUTABLE}
+-
+-import sys, os, re
+-sys.path.append('${GR_RUNTIME_PYTHONPATH}')
+-sys.path.append('${CMAKE_SOURCE_DIR}/python')
+-os.environ['srcdir'] = '${CMAKE_CURRENT_SOURCE_DIR}'
+-os.chdir('${CMAKE_CURRENT_BINARY_DIR}')
+-
+-if __name__ == '__main__':
+-    import build_utils
+-    root, inp = sys.argv[1:3]
+-    for sig in sys.argv[3:]:
+-        name = re.sub ('X+', sig, root)
+-        d = build_utils.standard_impl_dict2(name, sig, '${component}')
+-        build_utils.expand_template(d, inp)
+-")
+-
+-  #make a list of all the generated files
+-  unset(expanded_files_cc)
+-  unset(expanded_files_h)
+-  foreach(sig ${ARGN})
+-    string(REGEX REPLACE "X+" ${sig} name ${root})
+-    list(APPEND expanded_files_cc ${CMAKE_CURRENT_BINARY_DIR}/${name}.cc)
+-    list(APPEND expanded_files_h  ${CMAKE_CURRENT_BINARY_DIR}/${name}.h)
+-  endforeach(sig)
+-  unset(name)
+-
+-  #create a command to generate the source files
+-  add_custom_command(
+-    OUTPUT ${expanded_files_cc}
+-    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}.cc.t
+-    COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
+-    ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
+-    ${root} ${root}.cc.t ${ARGN}
+-  )
+-
+-  #create a command to generate the header files
+-  add_custom_command(
+-    OUTPUT ${expanded_files_h}
+-    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}.h.t
+-    COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
+-    ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
+-    ${root} ${root}.h.t ${ARGN}
+-  )
+-
+-  #make source files depends on headers to force generation
+-  set_source_files_properties(${expanded_files_cc}
+-    PROPERTIES OBJECT_DEPENDS "${expanded_files_h}"
+-  )
+-
+-  #install rules for the generated files
+-  list(APPEND generated_sources ${expanded_files_cc})
+-  list(APPEND generated_headers ${expanded_files_h})
+-
+-endmacro(GR_EXPAND_X_CC_H)
+-
+-macro(GR_EXPAND_X_CC_H_IMPL component root)
+-
+-  include(GrPython)
+-
+-  file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
+-"#!${PYTHON_EXECUTABLE}
+-
+-import sys, os, re
+-sys.path.append('${GR_RUNTIME_PYTHONPATH}')
+-sys.path.append('${CMAKE_SOURCE_DIR}/python')
+-os.environ['srcdir'] = '${CMAKE_CURRENT_SOURCE_DIR}'
+-os.chdir('${CMAKE_CURRENT_BINARY_DIR}')
+-
+-if __name__ == '__main__':
+-    import build_utils
+-    root, inp = sys.argv[1:3]
+-    for sig in sys.argv[3:]:
+-        name = re.sub ('X+', sig, root)
+-        d = build_utils.standard_dict(name, sig, '${component}')
+-        build_utils.expand_template(d, inp, '_impl')
+-")
+-
+-  #make a list of all the generated files
+-  unset(expanded_files_cc_impl)
+-  unset(expanded_files_h_impl)
+-  unset(expanded_files_h)
+-  foreach(sig ${ARGN})
+-    string(REGEX REPLACE "X+" ${sig} name ${root})
+-    list(APPEND expanded_files_cc_impl ${CMAKE_CURRENT_BINARY_DIR}/${name}_impl.cc)
+-    list(APPEND expanded_files_h_impl ${CMAKE_CURRENT_BINARY_DIR}/${name}_impl.h)
+-    list(APPEND expanded_files_h ${CMAKE_CURRENT_BINARY_DIR}/../include/gnuradio/${component}/${name}.h)
+-  endforeach(sig)
+-  unset(name)
+-
+-  #create a command to generate the _impl.cc files
+-  add_custom_command(
+-    OUTPUT ${expanded_files_cc_impl}
+-    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}_impl.cc.t
+-    COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
+-    ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
+-    ${root} ${root}_impl.cc.t ${ARGN}
+-  )
+-
+-  #create a command to generate the _impl.h files
+-  add_custom_command(
+-    OUTPUT ${expanded_files_h_impl}
+-    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}_impl.h.t
+-    COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
+-    ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
+-    ${root} ${root}_impl.h.t ${ARGN}
+-  )
+-
+-  #make _impl.cc source files depend on _impl.h to force generation
+-  set_source_files_properties(${expanded_files_cc_impl}
+-    PROPERTIES OBJECT_DEPENDS "${expanded_files_h_impl}"
+-  )
+-
+-  #make _impl.h source files depend on headers to force generation
+-  set_source_files_properties(${expanded_files_h_impl}
+-    PROPERTIES OBJECT_DEPENDS "${expanded_files_h}"
+-  )
+-
+-  #install rules for the generated files
+-  list(APPEND generated_sources ${expanded_files_cc_impl})
+-  list(APPEND generated_headers ${expanded_files_h_impl})
+-
+-endmacro(GR_EXPAND_X_CC_H_IMPL)
+diff --git a/cmake/Modules/GrPlatform.cmake b/cmake/Modules/GrPlatform.cmake
+deleted file mode 100644
+index 00a53d0..0000000
+--- a/cmake/Modules/GrPlatform.cmake
++++ /dev/null
+@@ -1,62 +0,0 @@
+-# Copyright 2011 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.
+-
+-if(DEFINED __INCLUDED_GR_PLATFORM_CMAKE)
+-    return()
+-endif()
+-set(__INCLUDED_GR_PLATFORM_CMAKE TRUE)
+-
+-########################################################################
+-# Setup additional defines for OS types
+-########################################################################
+-if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+-    set(LINUX TRUE)
+-endif()
+-
+-if(NOT CMAKE_CROSSCOMPILING AND LINUX AND EXISTS "/etc/debian_version")
+-    set(DEBIAN TRUE)
+-endif()
+-
+-if(NOT CMAKE_CROSSCOMPILING AND LINUX AND EXISTS "/etc/redhat-release")
+-    set(REDHAT TRUE)
+-endif()
+-
+-if(NOT CMAKE_CROSSCOMPILING AND LINUX AND EXISTS "/etc/slackware-version")
+-    set(SLACKWARE TRUE)
+-endif()
+-
+-########################################################################
+-# when the library suffix should be 64 (applies to redhat linux family)
+-########################################################################
+-if (REDHAT OR SLACKWARE)
+-    set(LIB64_CONVENTION TRUE)
+-endif()
+-
+-if(NOT DEFINED LIB_SUFFIX AND LIB64_CONVENTION AND CMAKE_SYSTEM_PROCESSOR MATCHES "64$")
+-    set(LIB_SUFFIX 64)
+-endif()
+-
+-########################################################################
+-# Detect /lib versus /lib64
+-########################################################################
+-if (CMAKE_INSTALL_LIBDIR MATCHES lib64)
+-    set(LIB_SUFFIX 64)
+-endif()
+-
+-set(LIB_SUFFIX ${LIB_SUFFIX} CACHE STRING "lib directory suffix")
+diff --git a/cmake/Modules/GrPython.cmake b/cmake/Modules/GrPython.cmake
+deleted file mode 100644
+index 06e061e..0000000
+--- a/cmake/Modules/GrPython.cmake
++++ /dev/null
+@@ -1,241 +0,0 @@
+-# Copyright 2010-2011 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.
+-
+-if(DEFINED __INCLUDED_GR_PYTHON_CMAKE)
+-    return()
+-endif()
+-set(__INCLUDED_GR_PYTHON_CMAKE TRUE)
+-
+-########################################################################
+-# Setup the python interpreter:
+-# This allows the user to specify a specific interpreter,
+-# or finds the interpreter via the built-in cmake module.
+-########################################################################
+-#this allows the user to override PYTHON_EXECUTABLE
+-if(PYTHON_EXECUTABLE)
+-
+-    set(PYTHONINTERP_FOUND TRUE)
+-
+-#otherwise if not set, try to automatically find it
+-else(PYTHON_EXECUTABLE)
+-
+-    #use the built-in find script
+-    find_package(PythonInterp 2)
+-
+-    #and if that fails use the find program routine
+-    if(NOT PYTHONINTERP_FOUND)
+-        find_program(PYTHON_EXECUTABLE NAMES python python2 python2.7 python2.6 python2.5)
+-        if(PYTHON_EXECUTABLE)
+-            set(PYTHONINTERP_FOUND TRUE)
+-        endif(PYTHON_EXECUTABLE)
+-    endif(NOT PYTHONINTERP_FOUND)
+-
+-endif(PYTHON_EXECUTABLE)
+-
+-if (CMAKE_CROSSCOMPILING)
+-    set(QA_PYTHON_EXECUTABLE "/usr/bin/python")
+-else (CMAKE_CROSSCOMPILING)
+-    set(QA_PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE})
+-endif(CMAKE_CROSSCOMPILING)
+-
+-#make the path to the executable appear in the cmake gui
+-set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE} CACHE FILEPATH "python interpreter")
+-set(QA_PYTHON_EXECUTABLE ${QA_PYTHON_EXECUTABLE} CACHE FILEPATH "python interpreter for QA tests")
+-
+-#make sure we can use -B with python (introduced in 2.6)
+-if(PYTHON_EXECUTABLE)
+-    execute_process(
+-        COMMAND ${PYTHON_EXECUTABLE} -B -c ""
+-        OUTPUT_QUIET ERROR_QUIET
+-        RESULT_VARIABLE PYTHON_HAS_DASH_B_RESULT
+-    )
+-    if(PYTHON_HAS_DASH_B_RESULT EQUAL 0)
+-        set(PYTHON_DASH_B "-B")
+-    endif()
+-endif(PYTHON_EXECUTABLE)
+-
+-########################################################################
+-# Check for the existence of a python module:
+-# - desc a string description of the check
+-# - mod the name of the module to import
+-# - cmd an additional command to run
+-# - have the result variable to set
+-########################################################################
+-macro(GR_PYTHON_CHECK_MODULE desc mod cmd have)
+-    message(STATUS "")
+-    message(STATUS "Python checking for ${desc}")
+-    execute_process(
+-        COMMAND ${PYTHON_EXECUTABLE} -c "
+-#########################################
+-try:
+-    import ${mod}
+-    assert ${cmd}
+-except ImportError, AssertionError: exit(-1)
+-except: pass
+-#########################################"
+-        RESULT_VARIABLE ${have}
+-    )
+-    if(${have} EQUAL 0)
+-        message(STATUS "Python checking for ${desc} - found")
+-        set(${have} TRUE)
+-    else(${have} EQUAL 0)
+-        message(STATUS "Python checking for ${desc} - not found")
+-        set(${have} FALSE)
+-    endif(${have} EQUAL 0)
+-endmacro(GR_PYTHON_CHECK_MODULE)
+-
+-########################################################################
+-# Sets the python installation directory GR_PYTHON_DIR
+-########################################################################
+-if(NOT DEFINED GR_PYTHON_DIR)
+-execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "
+-from distutils import sysconfig
+-print sysconfig.get_python_lib(plat_specific=True, prefix='')
+-" OUTPUT_VARIABLE GR_PYTHON_DIR OUTPUT_STRIP_TRAILING_WHITESPACE
+-)
+-endif()
+-file(TO_CMAKE_PATH ${GR_PYTHON_DIR} GR_PYTHON_DIR)
+-
+-########################################################################
+-# Create an always-built target with a unique name
+-# Usage: GR_UNIQUE_TARGET(<description> <dependencies list>)
+-########################################################################
+-function(GR_UNIQUE_TARGET desc)
+-    file(RELATIVE_PATH reldir ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+-    execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import re, hashlib
+-unique = hashlib.md5('${reldir}${ARGN}').hexdigest()[:5]
+-print(re.sub('\\W', '_', '${desc} ${reldir} ' + unique))"
+-    OUTPUT_VARIABLE _target OUTPUT_STRIP_TRAILING_WHITESPACE)
+-    add_custom_target(${_target} ALL DEPENDS ${ARGN})
+-endfunction(GR_UNIQUE_TARGET)
+-
+-########################################################################
+-# Install python sources (also builds and installs byte-compiled python)
+-########################################################################
+-function(GR_PYTHON_INSTALL)
+-    include(CMakeParseArgumentsCopy)
+-    CMAKE_PARSE_ARGUMENTS(GR_PYTHON_INSTALL "" "DESTINATION;COMPONENT" "FILES;PROGRAMS" ${ARGN})
+-
+-    ####################################################################
+-    if(GR_PYTHON_INSTALL_FILES)
+-    ####################################################################
+-        install(${ARGN}) #installs regular python files
+-
+-        #create a list of all generated files
+-        unset(pysrcfiles)
+-        unset(pycfiles)
+-        unset(pyofiles)
+-        foreach(pyfile ${GR_PYTHON_INSTALL_FILES})
+-            get_filename_component(pyfile ${pyfile} ABSOLUTE)
+-            list(APPEND pysrcfiles ${pyfile})
+-
+-            #determine if this file is in the source or binary directory
+-            file(RELATIVE_PATH source_rel_path ${CMAKE_CURRENT_SOURCE_DIR} ${pyfile})
+-            string(LENGTH "${source_rel_path}" source_rel_path_len)
+-            file(RELATIVE_PATH binary_rel_path ${CMAKE_CURRENT_BINARY_DIR} ${pyfile})
+-            string(LENGTH "${binary_rel_path}" binary_rel_path_len)
+-
+-            #and set the generated path appropriately
+-            if(${source_rel_path_len} GREATER ${binary_rel_path_len})
+-                set(pygenfile ${CMAKE_CURRENT_BINARY_DIR}/${binary_rel_path})
+-            else()
+-                set(pygenfile ${CMAKE_CURRENT_BINARY_DIR}/${source_rel_path})
+-            endif()
+-            list(APPEND pycfiles ${pygenfile}c)
+-            list(APPEND pyofiles ${pygenfile}o)
+-
+-            #ensure generation path exists
+-            get_filename_component(pygen_path ${pygenfile} PATH)
+-            file(MAKE_DIRECTORY ${pygen_path})
+-
+-        endforeach(pyfile)
+-
+-        #the command to generate the pyc files
+-        add_custom_command(
+-            DEPENDS ${pysrcfiles} OUTPUT ${pycfiles}
+-            COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_BINARY_DIR}/python_compile_helper.py ${pysrcfiles} ${pycfiles}
+-        )
+-
+-        #the command to generate the pyo files
+-        add_custom_command(
+-            DEPENDS ${pysrcfiles} OUTPUT ${pyofiles}
+-            COMMAND ${PYTHON_EXECUTABLE} -O ${CMAKE_BINARY_DIR}/python_compile_helper.py ${pysrcfiles} ${pyofiles}
+-        )
+-
+-        #create install rule and add generated files to target list
+-        set(python_install_gen_targets ${pycfiles} ${pyofiles})
+-        install(FILES ${python_install_gen_targets}
+-            DESTINATION ${GR_PYTHON_INSTALL_DESTINATION}
+-            COMPONENT ${GR_PYTHON_INSTALL_COMPONENT}
+-        )
+-
+-    ####################################################################
+-    elseif(GR_PYTHON_INSTALL_PROGRAMS)
+-    ####################################################################
+-        file(TO_NATIVE_PATH ${PYTHON_EXECUTABLE} pyexe_native)
+-
+-        if (CMAKE_CROSSCOMPILING)
+-           set(pyexe_native "/usr/bin/env python")
+-        endif()
+-
+-        foreach(pyfile ${GR_PYTHON_INSTALL_PROGRAMS})
+-            get_filename_component(pyfile_name ${pyfile} NAME)
+-            get_filename_component(pyfile ${pyfile} ABSOLUTE)
+-            string(REPLACE "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" pyexefile "${pyfile}.exe")
+-            list(APPEND python_install_gen_targets ${pyexefile})
+-
+-            get_filename_component(pyexefile_path ${pyexefile} PATH)
+-            file(MAKE_DIRECTORY ${pyexefile_path})
+-
+-            add_custom_command(
+-                OUTPUT ${pyexefile} DEPENDS ${pyfile}
+-                COMMAND ${PYTHON_EXECUTABLE} -c
+-                "import re; R=re.compile('^\#!.*$\\n',flags=re.MULTILINE); open('${pyexefile}','w').write('\#!${pyexe_native}\\n'+R.sub('',open('${pyfile}','r').read()))"
+-                COMMENT "Shebangin ${pyfile_name}"
+-                VERBATIM
+-            )
+-
+-            #on windows, python files need an extension to execute
+-            get_filename_component(pyfile_ext ${pyfile} EXT)
+-            if(WIN32 AND NOT pyfile_ext)
+-                set(pyfile_name "${pyfile_name}.py")
+-            endif()
+-
+-            install(PROGRAMS ${pyexefile} RENAME ${pyfile_name}
+-                DESTINATION ${GR_PYTHON_INSTALL_DESTINATION}
+-                COMPONENT ${GR_PYTHON_INSTALL_COMPONENT}
+-            )
+-        endforeach(pyfile)
+-
+-    endif()
+-
+-    GR_UNIQUE_TARGET("pygen" ${python_install_gen_targets})
+-
+-endfunction(GR_PYTHON_INSTALL)
+-
+-########################################################################
+-# Write the python helper script that generates byte code files
+-########################################################################
+-file(WRITE ${CMAKE_BINARY_DIR}/python_compile_helper.py "
+-import sys, py_compile
+-files = sys.argv[1:]
+-srcs, gens = files[:len(files)/2], files[len(files)/2:]
+-for src, gen in zip(srcs, gens):
+-    py_compile.compile(file=src, cfile=gen, doraise=True)
+-")
+diff --git a/cmake/Modules/GrSwig.cmake b/cmake/Modules/GrSwig.cmake
+deleted file mode 100644
+index 33f37d2..0000000
+--- a/cmake/Modules/GrSwig.cmake
++++ /dev/null
+@@ -1,256 +0,0 @@
+-# Copyright 2010-2011 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.
+-
+-if(DEFINED __INCLUDED_GR_SWIG_CMAKE)
+-    return()
+-endif()
+-set(__INCLUDED_GR_SWIG_CMAKE TRUE)
+-
+-include(GrPython)
+-
+-########################################################################
+-# Builds a swig documentation file to be generated into python docstrings
+-# Usage: GR_SWIG_MAKE_DOCS(output_file input_path input_path....)
+-#
+-# Set the following variable to specify extra dependent targets:
+-#   - GR_SWIG_DOCS_SOURCE_DEPS
+-#   - GR_SWIG_DOCS_TARGET_DEPS
+-########################################################################
+-function(GR_SWIG_MAKE_DOCS output_file)
+-    if(ENABLE_DOXYGEN)
+-
+-        #setup the input files variable list, quote formated
+-        set(input_files)
+-        unset(INPUT_PATHS)
+-        foreach(input_path ${ARGN})
+-            if(IS_DIRECTORY ${input_path}) #when input path is a directory
+-                file(GLOB input_path_h_files ${input_path}/*.h)
+-            else() #otherwise its just a file, no glob
+-                set(input_path_h_files ${input_path})
+-            endif()
+-            list(APPEND input_files ${input_path_h_files})
+-            set(INPUT_PATHS "${INPUT_PATHS} \"${input_path}\"")
+-        endforeach(input_path)
+-
+-        #determine the output directory
+-        get_filename_component(name ${output_file} NAME_WE)
+-        get_filename_component(OUTPUT_DIRECTORY ${output_file} PATH)
+-        set(OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY}/${name}_swig_docs)
+-        make_directory(${OUTPUT_DIRECTORY})
+-
+-        #generate the Doxyfile used by doxygen
+-        configure_file(
+-            ${CMAKE_SOURCE_DIR}/docs/doxygen/Doxyfile.swig_doc.in
+-            ${OUTPUT_DIRECTORY}/Doxyfile
+-        @ONLY)
+-
+-        #Create a dummy custom command that depends on other targets
+-        include(GrMiscUtils)
+-        GR_GEN_TARGET_DEPS(_${name}_tag tag_deps ${GR_SWIG_DOCS_TARGET_DEPS})
+-
+-        #call doxygen on the Doxyfile + input headers
+-        add_custom_command(
+-            OUTPUT ${OUTPUT_DIRECTORY}/xml/index.xml
+-            DEPENDS ${input_files} ${GR_SWIG_DOCS_SOURCE_DEPS} ${tag_deps}
+-            COMMAND ${DOXYGEN_EXECUTABLE} ${OUTPUT_DIRECTORY}/Doxyfile
+-            COMMENT "Generating doxygen xml for ${name} docs"
+-        )
+-
+-        #call the swig_doc script on the xml files
+-        add_custom_command(
+-            OUTPUT ${output_file}
+-            DEPENDS ${input_files} ${stamp-file} ${OUTPUT_DIRECTORY}/xml/index.xml
+-            COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
+-                ${CMAKE_SOURCE_DIR}/docs/doxygen/swig_doc.py
+-                ${OUTPUT_DIRECTORY}/xml
+-                ${output_file}
+-            COMMENT "Generating python docstrings for ${name}"
+-            WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/docs/doxygen
+-        )
+-
+-    else(ENABLE_DOXYGEN)
+-        file(WRITE ${output_file} "\n") #no doxygen -> empty file
+-    endif(ENABLE_DOXYGEN)
+-endfunction(GR_SWIG_MAKE_DOCS)
+-
+-########################################################################
+-# Build a swig target for the common gnuradio use case. Usage:
+-# GR_SWIG_MAKE(target ifile ifile ifile...)
+-#
+-# Set the following variables before calling:
+-#   - GR_SWIG_FLAGS
+-#   - GR_SWIG_INCLUDE_DIRS
+-#   - GR_SWIG_LIBRARIES
+-#   - GR_SWIG_SOURCE_DEPS
+-#   - GR_SWIG_TARGET_DEPS
+-#   - GR_SWIG_DOC_FILE
+-#   - GR_SWIG_DOC_DIRS
+-########################################################################
+-macro(GR_SWIG_MAKE name)
+-    set(ifiles ${ARGN})
+-
+-    # Shimming this in here to take care of a SWIG bug with handling
+-    # vector<size_t> and vector<unsigned int> (on 32-bit machines) and
+-    # vector<long unsigned int> (on 64-bit machines). Use this to test
+-    # the size of size_t, then set SIZE_T_32 if it's a 32-bit machine
+-    # or not if it's 64-bit. The logic in gr_type.i handles the rest.
+-    INCLUDE(CheckTypeSize)
+-    CHECK_TYPE_SIZE("size_t" SIZEOF_SIZE_T)
+-    CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
+-    if(${SIZEOF_SIZE_T} EQUAL ${SIZEOF_UINT})
+-      list(APPEND GR_SWIG_FLAGS -DSIZE_T_32)
+-    endif(${SIZEOF_SIZE_T} EQUAL ${SIZEOF_UINT})
+-
+-    #do swig doc generation if specified
+-    if(GR_SWIG_DOC_FILE)
+-        set(GR_SWIG_DOCS_SOURCE_DEPS ${GR_SWIG_SOURCE_DEPS})
+-        list(APPEND GR_SWIG_DOCS_TARGET_DEPS ${GR_SWIG_TARGET_DEPS})
+-        GR_SWIG_MAKE_DOCS(${GR_SWIG_DOC_FILE} ${GR_SWIG_DOC_DIRS})
+-        add_custom_target(${name}_swig_doc DEPENDS ${GR_SWIG_DOC_FILE})
+-        list(APPEND GR_SWIG_TARGET_DEPS ${name}_swig_doc ${GR_RUNTIME_SWIG_DOC_FILE})
+-    endif()
+-
+-    #append additional include directories
+-    find_package(PythonLibs 2)
+-    list(APPEND GR_SWIG_INCLUDE_DIRS ${PYTHON_INCLUDE_PATH}) #deprecated name (now dirs)
+-    list(APPEND GR_SWIG_INCLUDE_DIRS ${PYTHON_INCLUDE_DIRS})
+-
+-    #prepend local swig directories
+-    list(INSERT GR_SWIG_INCLUDE_DIRS 0 ${CMAKE_CURRENT_SOURCE_DIR})
+-    list(INSERT GR_SWIG_INCLUDE_DIRS 0 ${CMAKE_CURRENT_BINARY_DIR})
+-
+-    #determine include dependencies for swig file
+-    execute_process(
+-        COMMAND ${PYTHON_EXECUTABLE}
+-            ${CMAKE_BINARY_DIR}/get_swig_deps.py
+-            "${ifiles}" "${GR_SWIG_INCLUDE_DIRS}"
+-        OUTPUT_STRIP_TRAILING_WHITESPACE
+-        OUTPUT_VARIABLE SWIG_MODULE_${name}_EXTRA_DEPS
+-        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+-    )
+-
+-    #Create a dummy custom command that depends on other targets
+-    include(GrMiscUtils)
+-    GR_GEN_TARGET_DEPS(_${name}_swig_tag tag_deps ${GR_SWIG_TARGET_DEPS})
+-    set(tag_file ${CMAKE_CURRENT_BINARY_DIR}/${name}.tag)
+-    add_custom_command(
+-        OUTPUT ${tag_file}
+-        DEPENDS ${GR_SWIG_SOURCE_DEPS} ${tag_deps}
+-        COMMAND ${CMAKE_COMMAND} -E touch ${tag_file}
+-    )
+-
+-    #append the specified include directories
+-    include_directories(${GR_SWIG_INCLUDE_DIRS})
+-    list(APPEND SWIG_MODULE_${name}_EXTRA_DEPS ${tag_file})
+-
+-    #setup the swig flags with flags and include directories
+-    set(CMAKE_SWIG_FLAGS -fvirtual -modern -keyword -w511 -module ${name} ${GR_SWIG_FLAGS})
+-    foreach(dir ${GR_SWIG_INCLUDE_DIRS})
+-        list(APPEND CMAKE_SWIG_FLAGS "-I${dir}")
+-    endforeach(dir)
+-
+-    #set the C++ property on the swig .i file so it builds
+-    set_source_files_properties(${ifiles} PROPERTIES CPLUSPLUS ON)
+-
+-    #setup the actual swig library target to be built
+-    include(UseSWIG)
+-    SWIG_ADD_MODULE(${name} python ${ifiles})
+-    if(APPLE)
+-      set(PYTHON_LINK_OPTIONS "-undefined dynamic_lookup")
+-    else()
+-      set(PYTHON_LINK_OPTIONS ${PYTHON_LIBRARIES})
+-    endif(APPLE)
+-    SWIG_LINK_LIBRARIES(${name} ${PYTHON_LINK_OPTIONS} ${GR_SWIG_LIBRARIES})
+-    if(${name} STREQUAL "runtime_swig")
+-        SET_TARGET_PROPERTIES(${SWIG_MODULE_runtime_swig_REAL_NAME} PROPERTIES DEFINE_SYMBOL "gnuradio_runtime_EXPORTS")
+-    endif(${name} STREQUAL "runtime_swig")
+-
+-endmacro(GR_SWIG_MAKE)
+-
+-########################################################################
+-# Install swig targets generated by GR_SWIG_MAKE. Usage:
+-# GR_SWIG_INSTALL(
+-#   TARGETS target target target...
+-#   [DESTINATION destination]
+-#   [COMPONENT component]
+-# )
+-########################################################################
+-macro(GR_SWIG_INSTALL)
+-
+-    include(CMakeParseArgumentsCopy)
+-    CMAKE_PARSE_ARGUMENTS(GR_SWIG_INSTALL "" "DESTINATION;COMPONENT" "TARGETS" ${ARGN})
+-
+-    foreach(name ${GR_SWIG_INSTALL_TARGETS})
+-        install(TARGETS ${SWIG_MODULE_${name}_REAL_NAME}
+-            DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
+-            COMPONENT ${GR_SWIG_INSTALL_COMPONENT}
+-        )
+-
+-        include(GrPython)
+-        GR_PYTHON_INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${name}.py
+-            DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
+-            COMPONENT ${GR_SWIG_INSTALL_COMPONENT}
+-        )
+-
+-        GR_LIBTOOL(
+-            TARGET ${SWIG_MODULE_${name}_REAL_NAME}
+-            DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
+-        )
+-
+-    endforeach(name)
+-
+-endmacro(GR_SWIG_INSTALL)
+-
+-########################################################################
+-# Generate a python file that can determine swig dependencies.
+-# Used by the make macro above to determine extra dependencies.
+-# When you build C++, CMake figures out the header dependencies.
+-# This code essentially performs that logic for swig includes.
+-########################################################################
+-file(WRITE ${CMAKE_BINARY_DIR}/get_swig_deps.py "
+-
+-import os, sys, re
+-
+-i_include_matcher = re.compile('%(include|import)\\s*[<|\"](.*)[>|\"]')
+-h_include_matcher = re.compile('#(include)\\s*[<|\"](.*)[>|\"]')
+-include_dirs = sys.argv[2].split(';')
+-
+-def get_swig_incs(file_path):
+-    if file_path.endswith('.i'): matcher = i_include_matcher
+-    else: matcher = h_include_matcher
+-    file_contents = open(file_path, 'r').read()
+-    return matcher.findall(file_contents, re.MULTILINE)
+-
+-def get_swig_deps(file_path, level):
+-    deps = [file_path]
+-    if level == 0: return deps
+-    for keyword, inc_file in get_swig_incs(file_path):
+-        for inc_dir in include_dirs:
+-            inc_path = os.path.join(inc_dir, inc_file)
+-            if not os.path.exists(inc_path): continue
+-            deps.extend(get_swig_deps(inc_path, level-1))
+-            break #found, we dont search in lower prio inc dirs
+-    return deps
+-
+-if __name__ == '__main__':
+-    ifiles = sys.argv[1].split(';')
+-    deps = sum([get_swig_deps(ifile, 3) for ifile in ifiles], [])
+-    #sys.stderr.write(';'.join(set(deps)) + '\\n\\n')
+-    print(';'.join(set(deps)))
+-")
+diff --git a/cmake/Modules/GrTest.cmake b/cmake/Modules/GrTest.cmake
+deleted file mode 100644
+index 62caab4..0000000
+--- a/cmake/Modules/GrTest.cmake
++++ /dev/null
+@@ -1,143 +0,0 @@
+-# Copyright 2010-2011 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.
+-
+-if(DEFINED __INCLUDED_GR_TEST_CMAKE)
+-    return()
+-endif()
+-set(__INCLUDED_GR_TEST_CMAKE TRUE)
+-
+-########################################################################
+-# Add a unit test and setup the environment for a unit test.
+-# Takes the same arguments as the ADD_TEST function.
+-#
+-# Before calling set the following variables:
+-# GR_TEST_TARGET_DEPS  - built targets for the library path
+-# GR_TEST_LIBRARY_DIRS - directories for the library path
+-# GR_TEST_PYTHON_DIRS  - directories for the python path
+-# GR_TEST_ENVIRONS  - other environment key/value pairs
+-########################################################################
+-function(GR_ADD_TEST test_name)
+-
+-        #Ensure that the build exe also appears in the PATH.
+-        list(APPEND GR_TEST_TARGET_DEPS ${ARGN})
+-
+-        #In the land of windows, all libraries must be in the PATH.
+-        #Since the dependent libraries are not yet installed,
+-        #we must manually set them in the PATH to run tests.
+-        #The following appends the path of a target dependency.
+-        foreach(target ${GR_TEST_TARGET_DEPS})
+-            get_target_property(location ${target} LOCATION)
+-            if(location)
+-                get_filename_component(path ${location} PATH)
+-                string(REGEX REPLACE "\\$\\(.*\\)" ${CMAKE_BUILD_TYPE} path ${path})
+-                list(APPEND GR_TEST_LIBRARY_DIRS ${path})
+-            endif(location)
+-        endforeach(target)
+-
+-    if(WIN32)
+-        #SWIG generates the python library files into a subdirectory.
+-        #Therefore, we must append this subdirectory into PYTHONPATH.
+-        #Only do this for the python directories matching the following:
+-        foreach(pydir ${GR_TEST_PYTHON_DIRS})
+-            get_filename_component(name ${pydir} NAME)
+-            if(name MATCHES "^(swig|lib|src)$")
+-                list(APPEND GR_TEST_PYTHON_DIRS ${pydir}/${CMAKE_BUILD_TYPE})
+-            endif()
+-        endforeach(pydir)
+-    endif(WIN32)
+-
+-    file(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR} srcdir)
+-    file(TO_NATIVE_PATH "${GR_TEST_LIBRARY_DIRS}" libpath) #ok to use on dir list?
+-    file(TO_NATIVE_PATH "${GR_TEST_PYTHON_DIRS}" pypath) #ok to use on dir list?
+-
+-    set(environs "VOLK_GENERIC=1" "GR_DONT_LOAD_PREFS=1" "srcdir=${srcdir}")
+-    list(APPEND environs ${GR_TEST_ENVIRONS})
+-
+-    #http://www.cmake.org/pipermail/cmake/2009-May/029464.html
+-    #Replaced this add test + set environs code with the shell script generation.
+-    #Its nicer to be able to manually run the shell script to diagnose problems.
+-    #ADD_TEST(${ARGV})
+-    #SET_TESTS_PROPERTIES(${test_name} PROPERTIES ENVIRONMENT "${environs}")
+-
+-    if(UNIX)
+-        set(LD_PATH_VAR "LD_LIBRARY_PATH")
+-        if(APPLE)
+-            set(LD_PATH_VAR "DYLD_LIBRARY_PATH")
+-        endif()
+-
+-        set(binpath "${CMAKE_CURRENT_BINARY_DIR}:$PATH")
+-        list(APPEND libpath "$${LD_PATH_VAR}")
+-        list(APPEND pypath "$PYTHONPATH")
+-
+-        #replace list separator with the path separator
+-        string(REPLACE ";" ":" libpath "${libpath}")
+-        string(REPLACE ";" ":" pypath "${pypath}")
+-        list(APPEND environs "PATH=${binpath}" "${LD_PATH_VAR}=${libpath}" "PYTHONPATH=${pypath}")
+-
+-        #generate a bat file that sets the environment and runs the test
+-	if (CMAKE_CROSSCOMPILING)
+-                set(SHELL "/bin/sh")
+-        else(CMAKE_CROSSCOMPILING)
+-                find_program(SHELL sh)
+-        endif(CMAKE_CROSSCOMPILING)
+-        set(sh_file ${CMAKE_CURRENT_BINARY_DIR}/${test_name}_test.sh)
+-        file(WRITE ${sh_file} "#!${SHELL}\n")
+-        #each line sets an environment variable
+-        foreach(environ ${environs})
+-            file(APPEND ${sh_file} "export ${environ}\n")
+-        endforeach(environ)
+-        #load the command to run with its arguments
+-        foreach(arg ${ARGN})
+-            file(APPEND ${sh_file} "${arg} ")
+-        endforeach(arg)
+-        file(APPEND ${sh_file} "\n")
+-
+-        #make the shell file executable
+-        execute_process(COMMAND chmod +x ${sh_file})
+-
+-        add_test(${test_name} ${SHELL} ${sh_file})
+-
+-    endif(UNIX)
+-
+-    if(WIN32)
+-        list(APPEND libpath ${DLL_PATHS} "%PATH%")
+-        list(APPEND pypath "%PYTHONPATH%")
+-
+-        #replace list separator with the path separator (escaped)
+-        string(REPLACE ";" "\\;" libpath "${libpath}")
+-        string(REPLACE ";" "\\;" pypath "${pypath}")
+-        list(APPEND environs "PATH=${libpath}" "PYTHONPATH=${pypath}")
+-
+-        #generate a bat file that sets the environment and runs the test
+-        set(bat_file ${CMAKE_CURRENT_BINARY_DIR}/${test_name}_test.bat)
+-        file(WRITE ${bat_file} "@echo off\n")
+-        #each line sets an environment variable
+-        foreach(environ ${environs})
+-            file(APPEND ${bat_file} "SET ${environ}\n")
+-        endforeach(environ)
+-        #load the command to run with its arguments
+-        foreach(arg ${ARGN})
+-            file(APPEND ${bat_file} "${arg} ")
+-        endforeach(arg)
+-        file(APPEND ${bat_file} "\n")
+-
+-        add_test(${test_name} ${bat_file})
+-    endif(WIN32)
+-
+-endfunction(GR_ADD_TEST)
+diff --git a/cmake/Modules/UseSWIG.cmake b/cmake/Modules/UseSWIG.cmake
+deleted file mode 100644
+index b7e3e05..0000000
+--- a/cmake/Modules/UseSWIG.cmake
++++ /dev/null
+@@ -1,304 +0,0 @@
+-# - SWIG module for CMake
+-# Defines the following macros:
+-#   SWIG_ADD_MODULE(name language [ files ])
+-#     - Define swig module with given name and specified language
+-#   SWIG_LINK_LIBRARIES(name [ libraries ])
+-#     - Link libraries to swig module
+-# All other macros are for internal use only.
+-# To get the actual name of the swig module,
+-# use: ${SWIG_MODULE_${name}_REAL_NAME}.
+-# Set Source files properties such as CPLUSPLUS and SWIG_FLAGS to specify
+-# special behavior of SWIG. Also global CMAKE_SWIG_FLAGS can be used to add
+-# special flags to all swig calls.
+-# Another special variable is CMAKE_SWIG_OUTDIR, it allows one to specify
+-# where to write all the swig generated module (swig -outdir option)
+-# The name-specific variable SWIG_MODULE_<name>_EXTRA_DEPS may be used
+-# to specify extra dependencies for the generated modules.
+-# If the source file generated by swig need some special flag you can use
+-# set_source_files_properties( ${swig_generated_file_fullname}
+-#        PROPERTIES COMPILE_FLAGS "-bla")
+-
+-
+-#=============================================================================
+-# Copyright 2004-2009 Kitware, Inc.
+-# Copyright 2009 Mathieu Malaterre <mathieu.malaterre@gmail.com>
+-#
+-# Distributed under the OSI-approved BSD License (the "License");
+-# see accompanying file Copyright.txt for details.
+-#
+-# This software is distributed WITHOUT ANY WARRANTY; without even the
+-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+-# See the License for more information.
+-#=============================================================================
+-# (To distribute this file outside of CMake, substitute the full
+-#  License text for the above reference.)
+-
+-set(SWIG_CXX_EXTENSION "cxx")
+-set(SWIG_EXTRA_LIBRARIES "")
+-
+-set(SWIG_PYTHON_EXTRA_FILE_EXTENSION "py")
+-
+-#
+-# For given swig module initialize variables associated with it
+-#
+-macro(SWIG_MODULE_INITIALIZE name language)
+-  string(TOUPPER "${language}" swig_uppercase_language)
+-  string(TOLOWER "${language}" swig_lowercase_language)
+-  set(SWIG_MODULE_${name}_LANGUAGE "${swig_uppercase_language}")
+-  set(SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG "${swig_lowercase_language}")
+-
+-  set(SWIG_MODULE_${name}_REAL_NAME "${name}")
+-  if("${SWIG_MODULE_${name}_LANGUAGE}" STREQUAL "UNKNOWN")
+-    message(FATAL_ERROR "SWIG Error: Language \"${language}\" not found")
+-  elseif("${SWIG_MODULE_${name}_LANGUAGE}" STREQUAL "PYTHON")
+-    # when swig is used without the -interface it will produce in the module.py
+-    # a 'import _modulename' statement, which implies having a corresponding
+-    # _modulename.so (*NIX), _modulename.pyd (Win32).
+-    set(SWIG_MODULE_${name}_REAL_NAME "_${name}")
+-  elseif("${SWIG_MODULE_${name}_LANGUAGE}" STREQUAL "PERL")
+-    set(SWIG_MODULE_${name}_EXTRA_FLAGS "-shadow")
+-  endif()
+-endmacro()
+-
+-#
+-# For a given language, input file, and output file, determine extra files that
+-# will be generated. This is internal swig macro.
+-#
+-
+-macro(SWIG_GET_EXTRA_OUTPUT_FILES language outfiles generatedpath infile)
+-  set(${outfiles} "")
+-  get_source_file_property(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename
+-    ${infile} SWIG_MODULE_NAME)
+-  if(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename STREQUAL "NOTFOUND")
+-    get_filename_component(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename "${infile}" NAME_WE)
+-  endif()
+-  foreach(it ${SWIG_${language}_EXTRA_FILE_EXTENSION})
+-    set(${outfiles} ${${outfiles}}
+-      "${generatedpath}/${SWIG_GET_EXTRA_OUTPUT_FILES_module_basename}.${it}")
+-  endforeach()
+-endmacro()
+-
+-#
+-# Take swig (*.i) file and add proper custom commands for it
+-#
+-macro(SWIG_ADD_SOURCE_TO_MODULE name outfiles infile)
+-  set(swig_full_infile ${infile})
+-  get_filename_component(swig_source_file_path "${infile}" PATH)
+-  get_filename_component(swig_source_file_name_we "${infile}" NAME_WE)
+-  get_source_file_property(swig_source_file_generated ${infile} GENERATED)
+-  get_source_file_property(swig_source_file_cplusplus ${infile} CPLUSPLUS)
+-  get_source_file_property(swig_source_file_flags ${infile} SWIG_FLAGS)
+-  if("${swig_source_file_flags}" STREQUAL "NOTFOUND")
+-    set(swig_source_file_flags "")
+-  endif()
+-  set(swig_source_file_fullname "${infile}")
+-  if(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_SOURCE_DIR}")
+-    string(REGEX REPLACE
+-      "^${CMAKE_CURRENT_SOURCE_DIR}" ""
+-      swig_source_file_relative_path
+-      "${swig_source_file_path}")
+-  else()
+-    if(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_BINARY_DIR}")
+-      string(REGEX REPLACE
+-        "^${CMAKE_CURRENT_BINARY_DIR}" ""
+-        swig_source_file_relative_path
+-        "${swig_source_file_path}")
+-      set(swig_source_file_generated 1)
+-    else()
+-      set(swig_source_file_relative_path "${swig_source_file_path}")
+-      if(swig_source_file_generated)
+-        set(swig_source_file_fullname "${CMAKE_CURRENT_BINARY_DIR}/${infile}")
+-      else()
+-        set(swig_source_file_fullname "${CMAKE_CURRENT_SOURCE_DIR}/${infile}")
+-      endif()
+-    endif()
+-  endif()
+-
+-  set(swig_generated_file_fullname
+-    "${CMAKE_CURRENT_BINARY_DIR}")
+-  if(swig_source_file_relative_path)
+-    set(swig_generated_file_fullname
+-      "${swig_generated_file_fullname}/${swig_source_file_relative_path}")
+-  endif()
+-  # If CMAKE_SWIG_OUTDIR was specified then pass it to -outdir
+-  if(CMAKE_SWIG_OUTDIR)
+-    set(swig_outdir ${CMAKE_SWIG_OUTDIR})
+-  else()
+-    set(swig_outdir ${CMAKE_CURRENT_BINARY_DIR})
+-  endif()
+-  SWIG_GET_EXTRA_OUTPUT_FILES(${SWIG_MODULE_${name}_LANGUAGE}
+-    swig_extra_generated_files
+-    "${swig_outdir}"
+-    "${infile}")
+-  set(swig_generated_file_fullname
+-    "${swig_generated_file_fullname}/${swig_source_file_name_we}")
+-  # add the language into the name of the file (i.e. TCL_wrap)
+-  # this allows for the same .i file to be wrapped into different languages
+-  set(swig_generated_file_fullname
+-    "${swig_generated_file_fullname}${SWIG_MODULE_${name}_LANGUAGE}_wrap")
+-
+-  if(swig_source_file_cplusplus)
+-    set(swig_generated_file_fullname
+-      "${swig_generated_file_fullname}.${SWIG_CXX_EXTENSION}")
+-  else()
+-    set(swig_generated_file_fullname
+-      "${swig_generated_file_fullname}.c")
+-  endif()
+-
+-  # Shut up some warnings from poor SWIG code generation that we
+-  # can do nothing about, when this flag is available
+-  include(CheckCXXCompilerFlag)
+-  check_cxx_compiler_flag("-Wno-unused-but-set-variable" HAVE_WNO_UNUSED_BUT_SET_VARIABLE)
+-  if(HAVE_WNO_UNUSED_BUT_SET_VARIABLE)
+-    set_source_files_properties(${swig_generated_file_fullname}
+-      PROPERTIES COMPILE_FLAGS "-Wno-unused-but-set-variable")
+-  endif(HAVE_WNO_UNUSED_BUT_SET_VARIABLE)
+-
+-  get_directory_property(cmake_include_directories INCLUDE_DIRECTORIES)
+-  set(swig_include_dirs)
+-  foreach(it ${cmake_include_directories})
+-    set(swig_include_dirs ${swig_include_dirs} "-I${it}")
+-  endforeach()
+-
+-  set(swig_special_flags)
+-  # default is c, so add c++ flag if it is c++
+-  if(swig_source_file_cplusplus)
+-    set(swig_special_flags ${swig_special_flags} "-c++")
+-  endif()
+-  set(swig_extra_flags)
+-  if(SWIG_MODULE_${name}_EXTRA_FLAGS)
+-    set(swig_extra_flags ${swig_extra_flags} ${SWIG_MODULE_${name}_EXTRA_FLAGS})
+-  endif()
+-
+-  # hack to work around CMake bug in add_custom_command with multiple OUTPUT files
+-
+-  file(RELATIVE_PATH reldir ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+-  execute_process(
+-    COMMAND ${PYTHON_EXECUTABLE} -c "import re, hashlib
+-unique = hashlib.md5('${reldir}${ARGN}').hexdigest()[:5]
+-print(re.sub('\\W', '_', '${name} ${reldir} ' + unique))"
+-    OUTPUT_VARIABLE _target OUTPUT_STRIP_TRAILING_WHITESPACE
+-  )
+-
+-  file(
+-    WRITE ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp.in
+-   "int main(void){return 0;}\n"
+-  )
+-
+-  # create dummy dependencies
+-  add_custom_command(
+-    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp
+-    COMMAND ${CMAKE_COMMAND} -E copy
+-        ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp.in
+-        ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp
+-    DEPENDS "${swig_source_file_fullname}" ${SWIG_MODULE_${name}_EXTRA_DEPS}
+-    COMMENT ""
+-  )
+-
+-  # create the dummy target
+-  add_executable(${_target} ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp)
+-
+-  # add a custom command to the dummy target
+-  add_custom_command(
+-    TARGET ${_target}
+-    # Let's create the ${swig_outdir} at execution time, in case dir contains $(OutDir)
+-    COMMAND ${CMAKE_COMMAND} -E make_directory ${swig_outdir}
+-    COMMAND "${SWIG_EXECUTABLE}"
+-    ARGS "-${SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG}"
+-    ${swig_source_file_flags}
+-    ${CMAKE_SWIG_FLAGS}
+-    -outdir ${swig_outdir}
+-    ${swig_special_flags}
+-    ${swig_extra_flags}
+-    ${swig_include_dirs}
+-    -o "${swig_generated_file_fullname}"
+-    "${swig_source_file_fullname}"
+-    COMMENT "Swig source"
+-  )
+-
+-  #add dummy independent dependencies from the _target to each file
+-  #that will be generated by the SWIG command above
+-
+-  set(${outfiles} "${swig_generated_file_fullname}" ${swig_extra_generated_files})
+-
+-  foreach(swig_gen_file ${${outfiles}})
+-    add_custom_command(
+-      OUTPUT ${swig_gen_file}
+-      COMMAND "${CMAKE_COMMAND}" -E touch_nocreate "${swig_gen_file}"
+-      DEPENDS ${_target}
+-      COMMENT "dummy command to show ${_target} dependency of ${swig_gen_file}"
+-    )
+-  endforeach()
+-
+-  set_source_files_properties(
+-    ${outfiles} PROPERTIES GENERATED 1
+-  )
+-
+-endmacro()
+-
+-#
+-# Create Swig module
+-#
+-macro(SWIG_ADD_MODULE name language)
+-  SWIG_MODULE_INITIALIZE(${name} ${language})
+-  set(swig_dot_i_sources)
+-  set(swig_other_sources)
+-  foreach(it ${ARGN})
+-    if(${it} MATCHES ".*\\.i$")
+-      set(swig_dot_i_sources ${swig_dot_i_sources} "${it}")
+-    else()
+-      set(swig_other_sources ${swig_other_sources} "${it}")
+-    endif()
+-  endforeach()
+-
+-  set(swig_generated_sources)
+-  foreach(it ${swig_dot_i_sources})
+-    SWIG_ADD_SOURCE_TO_MODULE(${name} swig_generated_source ${it})
+-    set(swig_generated_sources ${swig_generated_sources} "${swig_generated_source}")
+-  endforeach()
+-  get_directory_property(swig_extra_clean_files ADDITIONAL_MAKE_CLEAN_FILES)
+-  set_directory_properties(PROPERTIES
+-    ADDITIONAL_MAKE_CLEAN_FILES "${swig_extra_clean_files};${swig_generated_sources}")
+-  add_library(${SWIG_MODULE_${name}_REAL_NAME}
+-    MODULE
+-    ${swig_generated_sources}
+-    ${swig_other_sources})
+-  string(TOLOWER "${language}" swig_lowercase_language)
+-  if ("${swig_lowercase_language}" STREQUAL "java")
+-    if (APPLE)
+-        # In java you want:
+-        #      System.loadLibrary("LIBRARY");
+-        # then JNI will look for a library whose name is platform dependent, namely
+-        #   MacOS  : libLIBRARY.jnilib
+-        #   Windows: LIBRARY.dll
+-        #   Linux  : libLIBRARY.so
+-        set_target_properties (${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".jnilib")
+-      endif ()
+-  endif ()
+-  if ("${swig_lowercase_language}" STREQUAL "python")
+-    # this is only needed for the python case where a _modulename.so is generated
+-    set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES PREFIX "")
+-    # Python extension modules on Windows must have the extension ".pyd"
+-    # instead of ".dll" as of Python 2.5.  Older python versions do support
+-    # this suffix.
+-    # http://docs.python.org/whatsnew/ports.html#SECTION0001510000000000000000
+-    # <quote>
+-    # Windows: .dll is no longer supported as a filename extension for extension modules.
+-    # .pyd is now the only filename extension that will be searched for.
+-    # </quote>
+-    if(WIN32 AND NOT CYGWIN)
+-      set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".pyd")
+-    endif()
+-  endif ()
+-endmacro()
+-
+-#
+-# Like TARGET_LINK_LIBRARIES but for swig modules
+-#
+-macro(SWIG_LINK_LIBRARIES name)
+-  if(SWIG_MODULE_${name}_REAL_NAME)
+-    target_link_libraries(${SWIG_MODULE_${name}_REAL_NAME} ${ARGN})
+-  else()
+-    message(SEND_ERROR "Cannot find Swig library \"${name}\".")
+-  endif()
+-endmacro()
+diff --git a/cmake/Modules/nrsc5Config.cmake b/cmake/Modules/nrsc5Config.cmake
+index 2cd34a4..0911a25 100644
+--- a/cmake/Modules/nrsc5Config.cmake
++++ b/cmake/Modules/nrsc5Config.cmake
+@@ -22,9 +22,10 @@ FIND_LIBRARY(
+           /usr/local/lib64
+           /usr/lib
+           /usr/lib64
+-)
++          )
++
++include("${CMAKE_CURRENT_LIST_DIR}/nrsc5Target.cmake")
+ 
+ INCLUDE(FindPackageHandleStandardArgs)
+ FIND_PACKAGE_HANDLE_STANDARD_ARGS(NRSC5 DEFAULT_MSG NRSC5_LIBRARIES NRSC5_INCLUDE_DIRS)
+ MARK_AS_ADVANCED(NRSC5_LIBRARIES NRSC5_INCLUDE_DIRS)
+-
+diff --git a/python/build_utils_codes.py b/cmake/Modules/targetConfig.cmake.in
+similarity index 52%
+rename from python/build_utils_codes.py
+rename to cmake/Modules/targetConfig.cmake.in
+index 9ea96ba..79e4a28 100644
+--- a/python/build_utils_codes.py
++++ b/cmake/Modules/targetConfig.cmake.in
+@@ -1,5 +1,4 @@
+-#
+-# Copyright 2004 Free Software Foundation, Inc.
++# Copyright 2018 Free Software Foundation, Inc.
+ #
+ # This file is part of GNU Radio
+ #
+@@ -17,36 +16,11 @@
+ # 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.
+-#
+-
+-def i_code (code3):
+-    return code3[0]
+-
+-def o_code (code3):
+-    if len (code3) >= 2:
+-        return code3[1]
+-    else:
+-        return code3[0]
+-
+-def tap_code (code3):
+-    if len (code3) >= 3:
+-        return code3[2]
+-    else:
+-        return code3[0]
+-
+-def i_type (code3):
+-    return char_to_type[i_code (code3)]
+-
+-def o_type (code3):
+-    return char_to_type[o_code (code3)]
+-
+-def tap_type (code3):
+-    return char_to_type[tap_code (code3)]
+ 
++include(CMakeFindDependencyMacro)
+ 
+-char_to_type = {}
+-char_to_type['s'] = 'short'
+-char_to_type['i'] = 'int'
+-char_to_type['f'] = 'float'
+-char_to_type['c'] = 'gr_complex'
+-char_to_type['b'] = 'unsigned char'
++set(target_deps "@TARGET_DEPENDENCIES@")
++foreach(dep IN LISTS target_deps)
++    find_dependency(${dep})
++endforeach()
++include("${CMAKE_CURRENT_LIST_DIR}/@TARGET@Targets.cmake")
+diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt
+index f16fbf6..2c318ee 100644
+--- a/docs/CMakeLists.txt
++++ b/docs/CMakeLists.txt
+@@ -1,6 +1,7 @@
+ # Copyright 2011 Free Software Foundation, Inc.
+ #
+-# This file is part of GNU Radio
++# This file was generated by gr_modtool, a tool from the GNU Radio framework
++# This file is a part of gr-nrsc5
+ #
+ # 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
+diff --git a/docs/doxygen/CMakeLists.txt b/docs/doxygen/CMakeLists.txt
+index 1b44799..d5d98b8 100644
+--- a/docs/doxygen/CMakeLists.txt
++++ b/docs/doxygen/CMakeLists.txt
+@@ -1,6 +1,7 @@
+ # Copyright 2011 Free Software Foundation, Inc.
+ #
+-# This file is part of GNU Radio
++# This file was generated by gr_modtool, a tool from the GNU Radio framework
++# This file is a part of gr-nrsc5
+ #
+ # 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
+diff --git a/docs/doxygen/Doxyfile.in b/docs/doxygen/Doxyfile.in
+index 3ad1a67..20dfc97 100644
+--- a/docs/doxygen/Doxyfile.in
++++ b/docs/doxygen/Doxyfile.in
+@@ -654,8 +654,8 @@ WARN_LOGFILE           =
+ # directories like "/usr/src/myproject". Separate the files or directories
+ # with spaces.
+ 
+-INPUT                  = @top_srcdir@ \
+-                         @top_builddir@
++INPUT                  = "@top_srcdir@" \
++                         "@top_builddir@"
+ 
+ # This tag can be used to specify the character encoding of the source files
+ # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+@@ -791,7 +791,7 @@ INPUT_FILTER           =
+ # info on how filters are used. If FILTER_PATTERNS is empty or if
+ # non of the patterns match the file name, INPUT_FILTER is applied.
+ 
+-FILTER_PATTERNS        = *.py=@top_srcdir@/doc/doxygen/other/doxypy.py
++FILTER_PATTERNS        = *.py="@top_srcdir@"/doc/doxygen/other/doxypy.py
+ 
+ # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+ # INPUT_FILTER) will be used to filter the input files when producing source
+@@ -946,7 +946,7 @@ HTML_STYLESHEET        =
+ # user-defined cascading style sheet that is included after the standard
+ # style sheets created by doxygen. Using this option one can overrule
+ # certain style aspects. This is preferred over using HTML_STYLESHEET
+-# since it does not replace the standard style sheet and is therefor more
++# since it does not replace the standard style sheet and is therefore more
+ # robust against future updates. Doxygen will copy the style sheet file to
+ # the output directory.
+ 
+@@ -990,7 +990,7 @@ HTML_COLORSTYLE_GAMMA  = 80
+ # page will contain the date and time when the page was generated. Setting
+ # this to NO can help when comparing the output of multiple runs.
+ 
+-HTML_TIMESTAMP         = YES
++HTML_TIMESTAMP         = NO
+ 
+ # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+ # documentation will contain sections that can be hidden and shown after the
+diff --git a/docs/doxygen/Doxyfile.swig_doc.in b/docs/doxygen/Doxyfile.swig_doc.in
+index 19e17dc..cbe06d6 100644
+--- a/docs/doxygen/Doxyfile.swig_doc.in
++++ b/docs/doxygen/Doxyfile.swig_doc.in
+@@ -54,7 +54,7 @@ PROJECT_LOGO           =
+ # If a relative path is entered, it will be relative to the location
+ # where doxygen was started. If left blank the current directory will be used.
+ 
+-OUTPUT_DIRECTORY       = @OUTPUT_DIRECTORY@
++OUTPUT_DIRECTORY       = "@OUTPUT_DIRECTORY@"
+ 
+ # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+ # 4096 sub-directories (in 2 levels) under the output directory of each output
+@@ -121,7 +121,7 @@ INLINE_INHERITED_MEMB  = NO
+ # path before files name in the file list and in the header files. If set
+ # to NO the shortest path that makes the file name unique will be used.
+ 
+-FULL_PATH_NAMES        = YES
++FULL_PATH_NAMES        = NO
+ 
+ # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+ # can be used to strip a user-defined part of the path. Stripping is
+@@ -913,7 +913,7 @@ HTML_STYLESHEET        =
+ # user-defined cascading style sheet that is included after the standard
+ # style sheets created by doxygen. Using this option one can overrule
+ # certain style aspects. This is preferred over using HTML_STYLESHEET
+-# since it does not replace the standard style sheet and is therefor more
++# since it does not replace the standard style sheet and is therefore more
+ # robust against future updates. Doxygen will copy the style sheet file to
+ # the output directory.
+ 
+@@ -957,7 +957,7 @@ HTML_COLORSTYLE_GAMMA  = 80
+ # page will contain the date and time when the page was generated. Setting
+ # this to NO can help when comparing the output of multiple runs.
+ 
+-HTML_TIMESTAMP         = YES
++HTML_TIMESTAMP         = NO
+ 
+ # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+ # documentation will contain sections that can be hidden and shown after the
+diff --git a/docs/doxygen/doxyxml/__init__.py b/docs/doxygen/doxyxml/__init__.py
+index 5cd0b3c..5145b54 100644
+--- a/docs/doxygen/doxyxml/__init__.py
++++ b/docs/doxygen/doxyxml/__init__.py
+@@ -1,7 +1,8 @@
+ #
+ # Copyright 2010 Free Software Foundation, Inc.
+ #
+-# This file is part of GNU Radio
++# This file was generated by gr_modtool, a tool from the GNU Radio framework
++# This file is a part of gr-nrsc5
+ #
+ # 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
+@@ -63,8 +64,9 @@
+ u'Outputs the vital aadvark statistics.'
+ 
+ """
++from __future__ import unicode_literals
+ 
+-from doxyindex import DoxyIndex, DoxyFunction, DoxyParam, DoxyClass, DoxyFile, DoxyNamespace, DoxyGroup, DoxyFriend, DoxyOther
++from .doxyindex import DoxyIndex, DoxyFunction, DoxyParam, DoxyClass, DoxyFile, DoxyNamespace, DoxyGroup, DoxyFriend, DoxyOther
+ 
+ def _test():
+     import os
+diff --git a/docs/doxygen/doxyxml/base.py b/docs/doxygen/doxyxml/base.py
+index e8f026a..4404c97 100644
+--- a/docs/doxygen/doxyxml/base.py
++++ b/docs/doxygen/doxyxml/base.py
+@@ -1,7 +1,8 @@
+ #
+ # Copyright 2010 Free Software Foundation, Inc.
+ #
+-# This file is part of GNU Radio
++# This file was generated by gr_modtool, a tool from the GNU Radio framework
++# This file is a part of gr-nrsc5
+ #
+ # 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
+@@ -24,24 +25,26 @@
+ Classes based upon this are used to make more user-friendly interfaces
+ to the doxygen xml docs than the generated classes provide.
+ """
++from __future__ import print_function
++from __future__ import unicode_literals
+ 
+ import os
+ import pdb
+ 
+ from xml.parsers.expat import ExpatError
+ 
+-from generated import compound
++from .generated import compound
+ 
+ 
+ class Base(object):
+ 
+-    class Duplicate(StandardError):
++    class Duplicate(Exception):
+         pass
+ 
+-    class NoSuchMember(StandardError):
++    class NoSuchMember(Exception):
+         pass
+ 
+-    class ParsingError(StandardError):
++    class ParsingError(Exception):
+         pass
+ 
+     def __init__(self, parse_data, top=None):
+@@ -94,7 +97,7 @@ def get_cls(self, mem):
+         for cls in self.mem_classes:
+             if cls.can_parse(mem):
+                 return cls
+-        raise StandardError(("Did not find a class for object '%s'." \
++        raise Exception(("Did not find a class for object '%s'." \
+                                  % (mem.get_name())))
+ 
+     def convert_mem(self, mem):
+@@ -102,11 +105,11 @@ def convert_mem(self, mem):
+             cls = self.get_cls(mem)
+             converted = cls.from_parse_data(mem, self.top)
+             if converted is None:
+-                raise StandardError('No class matched this object.')
++                raise Exception('No class matched this object.')
+             self.add_ref(converted)
+             return converted
+-        except StandardError, e:
+-            print e
++        except Exception as e:
++            print(e)
+ 
+     @classmethod
+     def includes(cls, inst):
+diff --git a/docs/doxygen/doxyxml/doxyindex.py b/docs/doxygen/doxyxml/doxyindex.py
+index 78e8153..30baf12 100644
+--- a/docs/doxygen/doxyxml/doxyindex.py
++++ b/docs/doxygen/doxyxml/doxyindex.py
+@@ -1,7 +1,8 @@
+ #
+ # Copyright 2010 Free Software Foundation, Inc.
+ #
+-# This file is part of GNU Radio
++# This file was generated by gr_modtool, a tool from the GNU Radio framework
++# This file is a part of gr-nrsc5
+ #
+ # 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
+@@ -22,12 +23,14 @@
+ Classes providing more user-friendly interfaces to the doxygen xml
+ docs than the generated classes provide.
+ """
++from __future__ import absolute_import
++from __future__ import unicode_literals
+ 
+ import os
+ 
+-from generated import index
+-from base import Base
+-from text import description
++from .generated import index
++from .base import Base
++from .text import description
+ 
+ class DoxyIndex(Base):
+     """
+diff --git a/docs/doxygen/doxyxml/generated/__init__.py b/docs/doxygen/doxyxml/generated/__init__.py
+index 3982397..23095c1 100644
+--- a/docs/doxygen/doxyxml/generated/__init__.py
++++ b/docs/doxygen/doxyxml/generated/__init__.py
+@@ -5,3 +5,4 @@
+ resultant classes are not very friendly to navigate so the rest of the
+ doxyxml module processes them further.
+ """
++from __future__ import unicode_literals
+diff --git a/docs/doxygen/doxyxml/generated/compound.py b/docs/doxygen/doxyxml/generated/compound.py
+index 1522ac2..acfa0dd 100644
+--- a/docs/doxygen/doxyxml/generated/compound.py
++++ b/docs/doxygen/doxyxml/generated/compound.py
+@@ -3,15 +3,17 @@
+ """
+ Generated Mon Feb  9 19:08:05 2009 by generateDS.py.
+ """
++from __future__ import absolute_import
++from __future__ import unicode_literals
++
+ 
+-from string import lower as str_lower
+ from xml.dom import minidom
+ from xml.dom import Node
+ 
+ import sys
+ 
+-import compoundsuper as supermod
+-from compoundsuper import MixedContainer
++from . import compoundsuper as supermod
++from .compoundsuper import MixedContainer
+ 
+ 
+ class DoxygenTypeSub(supermod.DoxygenType):
+diff --git a/docs/doxygen/doxyxml/generated/compoundsuper.py b/docs/doxygen/doxyxml/generated/compoundsuper.py
+index 6255dda..6e984e1 100644
+--- a/docs/doxygen/doxyxml/generated/compoundsuper.py
++++ b/docs/doxygen/doxyxml/generated/compoundsuper.py
+@@ -4,12 +4,17 @@
+ # Generated Thu Jun 11 18:44:25 2009 by generateDS.py.
+ #
+ 
++from __future__ import print_function
++from __future__ import unicode_literals
++
+ import sys
+-import getopt
+-from string import lower as str_lower
++
+ from xml.dom import minidom
+ from xml.dom import Node
+ 
++import six
++
++
+ #
+ # User methods
+ #
+@@ -19,9 +24,9 @@
+ 
+ try:
+     from generatedssuper import GeneratedsSuper
+-except ImportError, exp:
++except ImportError as exp:
+ 
+-    class GeneratedsSuper:
++    class GeneratedsSuper(object):
+         def format_string(self, input_data, input_name=''):
+             return input_data
+         def format_integer(self, input_data, input_name=''):
+@@ -64,7 +69,7 @@ def showIndent(outfile, level):
+         outfile.write('    ')
+ 
+ def quote_xml(inStr):
+-    s1 = (isinstance(inStr, basestring) and inStr or
++    s1 = (isinstance(inStr, six.string_types) and inStr or
+           '%s' % inStr)
+     s1 = s1.replace('&', '&amp;')
+     s1 = s1.replace('<', '&lt;')
+@@ -72,7 +77,7 @@ def quote_xml(inStr):
+     return s1
+ 
+ def quote_attrib(inStr):
+-    s1 = (isinstance(inStr, basestring) and inStr or
++    s1 = (isinstance(inStr, six.string_types) and inStr or
+           '%s' % inStr)
+     s1 = s1.replace('&', '&amp;')
+     s1 = s1.replace('<', '&lt;')
+@@ -102,7 +107,7 @@ def quote_python(inStr):
+             return '"""%s"""' % s1
+ 
+ 
+-class MixedContainer:
++class MixedContainer(object):
+     # Constants for category:
+     CategoryNone = 0
+     CategoryText = 1
+@@ -4221,7 +4226,7 @@ def buildAttributes(self, attrs):
+         if attrs.get('lineno'):
+             try:
+                 self.lineno = int(attrs.get('lineno').value)
+-            except ValueError, exp:
++            except ValueError as exp:
+                 raise ValueError('Bad integer attribute (lineno): %s' % exp)
+         if attrs.get('refkind'):
+             self.refkind = attrs.get('refkind').value
+@@ -4504,12 +4509,12 @@ def buildAttributes(self, attrs):
+         if attrs.get('endline'):
+             try:
+                 self.endline = int(attrs.get('endline').value)
+-            except ValueError, exp:
++            except ValueError as exp:
+                 raise ValueError('Bad integer attribute (endline): %s' % exp)
+         if attrs.get('startline'):
+             try:
+                 self.startline = int(attrs.get('startline').value)
+-            except ValueError, exp:
++            except ValueError as exp:
+                 raise ValueError('Bad integer attribute (startline): %s' % exp)
+         if attrs.get('refid'):
+             self.refid = attrs.get('refid').value
+@@ -4627,17 +4632,17 @@ def buildAttributes(self, attrs):
+         if attrs.get('bodystart'):
+             try:
+                 self.bodystart = int(attrs.get('bodystart').value)
+-            except ValueError, exp:
++            except ValueError as exp:
+                 raise ValueError('Bad integer attribute (bodystart): %s' % exp)
+         if attrs.get('line'):
+             try:
+                 self.line = int(attrs.get('line').value)
+-            except ValueError, exp:
++            except ValueError as exp:
+                 raise ValueError('Bad integer attribute (line): %s' % exp)
+         if attrs.get('bodyend'):
+             try:
+                 self.bodyend = int(attrs.get('bodyend').value)
+-            except ValueError, exp:
++            except ValueError as exp:
+                 raise ValueError('Bad integer attribute (bodyend): %s' % exp)
+         if attrs.get('bodyfile'):
+             self.bodyfile = attrs.get('bodyfile').value
+@@ -6778,12 +6783,12 @@ def buildAttributes(self, attrs):
+         if attrs.get('rows'):
+             try:
+                 self.rows = int(attrs.get('rows').value)
+-            except ValueError, exp:
++            except ValueError as exp:
+                 raise ValueError('Bad integer attribute (rows): %s' % exp)
+         if attrs.get('cols'):
+             try:
+                 self.cols = int(attrs.get('cols').value)
+-            except ValueError, exp:
++            except ValueError as exp:
+                 raise ValueError('Bad integer attribute (cols): %s' % exp)
+     def buildChildren(self, child_, nodeName_):
+         if child_.nodeType == Node.ELEMENT_NODE and \
+@@ -7108,7 +7113,7 @@ def buildAttributes(self, attrs):
+         if attrs.get('level'):
+             try:
+                 self.level = int(attrs.get('level').value)
+-            except ValueError, exp:
++            except ValueError as exp:
+                 raise ValueError('Bad integer attribute (level): %s' % exp)
+     def buildChildren(self, child_, nodeName_):
+         if child_.nodeType == Node.TEXT_NODE:
+@@ -8283,7 +8288,7 @@ def buildChildren(self, child_, nodeName_):
+ """
+ 
+ def usage():
+-    print USAGE_TEXT
++    print(USAGE_TEXT)
+     sys.exit(1)
+ 
+ 
+@@ -8339,4 +8344,3 @@ def main():
+     main()
+     #import pdb
+     #pdb.run('main()')
+-
+diff --git a/docs/doxygen/doxyxml/generated/index.py b/docs/doxygen/doxyxml/generated/index.py
+index 7a70e14..0c63512 100644
+--- a/docs/doxygen/doxyxml/generated/index.py
++++ b/docs/doxygen/doxyxml/generated/index.py
+@@ -3,14 +3,16 @@
+ """
+ Generated Mon Feb  9 19:08:05 2009 by generateDS.py.
+ """
++from __future__ import absolute_import
++from __future__ import unicode_literals
+ 
+ from xml.dom import minidom
+ 
+ import os
+ import sys
+-import compound
++from . import compound
+ 
+-import indexsuper as supermod
++from . import indexsuper as supermod
+ 
+ class DoxygenTypeSub(supermod.DoxygenType):
+     def __init__(self, version=None, compound=None):
+diff --git a/docs/doxygen/doxyxml/generated/indexsuper.py b/docs/doxygen/doxyxml/generated/indexsuper.py
+index a991530..11312db 100644
+--- a/docs/doxygen/doxyxml/generated/indexsuper.py
++++ b/docs/doxygen/doxyxml/generated/indexsuper.py
+@@ -4,12 +4,16 @@
+ # Generated Thu Jun 11 18:43:54 2009 by generateDS.py.
+ #
+ 
++from __future__ import print_function
++from __future__ import unicode_literals
++
+ import sys
+-import getopt
+-from string import lower as str_lower
++
+ from xml.dom import minidom
+ from xml.dom import Node
+ 
++import six
++
+ #
+ # User methods
+ #
+@@ -19,9 +23,9 @@
+ 
+ try:
+     from generatedssuper import GeneratedsSuper
+-except ImportError, exp:
++except ImportError as exp:
+ 
+-    class GeneratedsSuper:
++    class GeneratedsSuper(object):
+         def format_string(self, input_data, input_name=''):
+             return input_data
+         def format_integer(self, input_data, input_name=''):
+@@ -64,7 +68,7 @@ def showIndent(outfile, level):
+         outfile.write('    ')
+ 
+ def quote_xml(inStr):
+-    s1 = (isinstance(inStr, basestring) and inStr or
++    s1 = (isinstance(inStr, six.string_types) and inStr or
+           '%s' % inStr)
+     s1 = s1.replace('&', '&amp;')
+     s1 = s1.replace('<', '&lt;')
+@@ -72,7 +76,7 @@ def quote_xml(inStr):
+     return s1
+ 
+ def quote_attrib(inStr):
+-    s1 = (isinstance(inStr, basestring) and inStr or
++    s1 = (isinstance(inStr, six.string_types) and inStr or
+           '%s' % inStr)
+     s1 = s1.replace('&', '&amp;')
+     s1 = s1.replace('<', '&lt;')
+@@ -102,7 +106,7 @@ def quote_python(inStr):
+             return '"""%s"""' % s1
+ 
+ 
+-class MixedContainer:
++class MixedContainer(object):
+     # Constants for category:
+     CategoryNone = 0
+     CategoryText = 1
+@@ -462,7 +466,7 @@ def buildChildren(self, child_, nodeName_):
+ """
+ 
+ def usage():
+-    print USAGE_TEXT
++    print(USAGE_TEXT)
+     sys.exit(1)
+ 
+ 
+@@ -520,4 +524,3 @@ def main():
+     main()
+     #import pdb
+     #pdb.run('main()')
+-
+diff --git a/docs/doxygen/doxyxml/text.py b/docs/doxygen/doxyxml/text.py
+index 629edd1..e7066ba 100644
+--- a/docs/doxygen/doxyxml/text.py
++++ b/docs/doxygen/doxyxml/text.py
+@@ -1,7 +1,8 @@
+ #
+ # Copyright 2010 Free Software Foundation, Inc.
+ #
+-# This file is part of GNU Radio
++# This file was generated by gr_modtool, a tool from the GNU Radio framework
++# This file is a part of gr-nrsc5
+ #
+ # 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
+@@ -21,12 +22,13 @@
+ """
+ Utilities for extracting text from generated classes.
+ """
++from __future__ import unicode_literals
+ 
+ def is_string(txt):
+     if isinstance(txt, str):
+         return True
+     try:
+-        if isinstance(txt, unicode):
++        if isinstance(txt, str):
+             return True
+     except NameError:
+         pass
+@@ -49,7 +51,7 @@ def description_bit(obj):
+     elif is_string(obj):
+         return obj
+     else:
+-        raise StandardError('Expecting a string or something with content, content_ or value attribute')
++        raise Exception('Expecting a string or something with content, content_ or value attribute')
+     # If this bit is a paragraph then add one some line breaks.
+     if hasattr(obj, 'name') and obj.name == 'para':
+         result += "\n\n"
+diff --git a/docs/doxygen/swig_doc.py b/docs/doxygen/swig_doc.py
+index d3536db..c127b9e 100644
+--- a/docs/doxygen/swig_doc.py
++++ b/docs/doxygen/swig_doc.py
+@@ -1,7 +1,8 @@
+ #
+ # Copyright 2010-2012 Free Software Foundation, Inc.
+ #
+-# This file is part of GNU Radio
++# This file was generated by gr_modtool, a tool from the GNU Radio framework
++# This file is a part of gr-nrsc5
+ #
+ # 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
+@@ -26,6 +27,7 @@
+ python docstrings.
+ 
+ """
++from __future__ import unicode_literals
+ 
+ import sys, time
+ 
+@@ -79,13 +81,15 @@ def includes(cls, item):
+ 
+ def utoascii(text):
+     """
+-    Convert unicode text into ascii and escape quotes.
++    Convert unicode text into ascii and escape quotes and backslashes.
+     """
+     if text is None:
+         return ''
+     out = text.encode('ascii', 'replace')
+-    out = out.replace('"', '\\"')
+-    return out
++    # swig will require us to replace blackslash with 4 backslashes
++    out = out.replace(b'\\', b'\\\\\\\\')
++    out = out.replace(b'"', b'\\"').decode('ascii')
++    return str(out)
+ 
+ 
+ def combine_descriptions(obj):
+@@ -135,7 +139,7 @@ def make_entry(obj, name=None, templ="{description}", description=None, params=[
+     return entry_templ.format(
+         name=name,
+         docstring=docstring,
+-    )
++        )
+ 
+ 
+ def make_func_entry(func, name=None, description=None, params=None):
+@@ -226,12 +230,12 @@ def make_block2_entry(di, block):
+     # the make function.
+     output = []
+     output.append(make_class_entry(
+-        block, description=description,
+-        ignored_methods=['make'], params=make_func.params))
++            block, description=description,
++            ignored_methods=['make'], params=make_func.params))
+     makename = block.name() + '::make'
+     output.append(make_func_entry(
+-        make_func, name=makename, description=description,
+-        params=make_func.params))
++            make_func, name=makename, description=description,
++            params=make_func.params))
+     return "\n\n".join(output)
+ 
+ def make_swig_interface_file(di, swigdocfilename, custom_output=None):
+@@ -301,7 +305,7 @@ def make_swig_interface_file(di, swigdocfilename, custom_output=None):
+ 
+     output = "\n\n".join(output)
+ 
+-    swig_doc = file(swigdocfilename, 'w')
++    swig_doc = open(swigdocfilename, 'w')
+     swig_doc.write(output)
+     swig_doc.close()
+ 
+@@ -309,7 +313,7 @@ def make_swig_interface_file(di, swigdocfilename, custom_output=None):
+     # Parse command line options and set up doxyxml.
+     err_msg = "Execute using: python swig_doc.py xml_path outputfilename"
+     if len(sys.argv) != 3:
+-        raise StandardError(err_msg)
++        raise Exception(err_msg)
+     xml_path = sys.argv[1]
+     swigdocfilename = sys.argv[2]
+     di = DoxyIndex(xml_path)
+diff --git a/grc/CMakeLists.txt b/grc/CMakeLists.txt
+index 1b5c801..8bc75e4 100644
+--- a/grc/CMakeLists.txt
++++ b/grc/CMakeLists.txt
+@@ -1,6 +1,7 @@
+ # Copyright 2011 Free Software Foundation, Inc.
+ #
+-# This file is part of GNU Radio
++# This file was generated by gr_modtool, a tool from the GNU Radio framework
++# This file is a part of gr-nrsc5
+ #
+ # 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
+@@ -18,16 +19,16 @@
+ # Boston, MA 02110-1301, USA.
+ 
+ install(FILES
+-    nrsc5_l1_fm_encoder_mp1.xml
+-    nrsc5_l1_fm_encoder_mp2.xml
+-    nrsc5_l1_fm_encoder_mp3.xml
+-    nrsc5_l1_fm_encoder_mp11.xml
+-    nrsc5_l1_fm_encoder_mp5.xml
+-    nrsc5_l1_fm_encoder_mp5_ms1.xml
+-    nrsc5_l1_fm_encoder_mp6.xml
+-    nrsc5_l1_fm_encoder_mp6_ms1.xml
+-    nrsc5_sis_encoder.xml
+-    nrsc5_l2_encoder.xml
+-    nrsc5_hdc_encoder.xml
+-    nrsc5_psd_encoder.xml DESTINATION share/gnuradio/grc/blocks
++    nrsc5_hdc_encoder.block.yml
++    nrsc5_l1_fm_encoder_mp1.block.yml
++    nrsc5_l1_fm_encoder_mp2.block.yml
++    nrsc5_l1_fm_encoder_mp3.block.yml
++    nrsc5_l1_fm_encoder_mp11.block.yml
++    nrsc5_l1_fm_encoder_mp5.block.yml
++    nrsc5_l1_fm_encoder_mp5_ms1.block.yml
++    nrsc5_l1_fm_encoder_mp6.block.yml
++    nrsc5_l1_fm_encoder_mp6_ms1.block.yml
++    nrsc5_l2_encoder.block.yml
++    nrsc5_psd_encoder.block.yml
++    nrsc5_sis_encoder.block.yml DESTINATION share/gnuradio/grc/blocks
+ )
+diff --git a/grc/nrsc5_hdc_encoder.block.yml b/grc/nrsc5_hdc_encoder.block.yml
+new file mode 100644
+index 0000000..520dcbe
+--- /dev/null
++++ b/grc/nrsc5_hdc_encoder.block.yml
+@@ -0,0 +1,33 @@
++# auto-generated by grc.converter
++
++id: nrsc5_hdc_encoder
++label: HDC Encoder
++category: '[NRSC-5]'
++
++parameters:
++-   id: channels
++    label: Channels
++    dtype: int
++    default: 2
++-   id: bitrate
++    label: Bitrate
++    dtype: int
++    default: 64000
++
++inputs:
++-   domain: stream
++    dtype: float
++    multiplicity: ${ channels }
++
++outputs:
++-   domain: stream
++    dtype: byte
++asserts:
++- ${ 1 <= channels <= 2 }
++- ${ 0 < bitrate }
++
++templates:
++    imports: import nrsc5
++    make: nrsc5.hdc_encoder(${channels}, ${bitrate})
++
++file_format: 1
+diff --git a/grc/nrsc5_hdc_encoder.xml b/grc/nrsc5_hdc_encoder.xml
+deleted file mode 100644
+index b4e472e..0000000
+--- a/grc/nrsc5_hdc_encoder.xml
++++ /dev/null
+@@ -1,31 +0,0 @@
+-<?xml version="1.0"?>
+-<block>
+-  <name>HDC Encoder</name>
+-  <key>nrsc5_hdc_encoder</key>
+-  <category>[NRSC-5]</category>
+-  <import>import nrsc5</import>
+-  <make>nrsc5.hdc_encoder($channels, $bitrate)</make>
+-  <param>
+-    <name>Channels</name>
+-    <key>channels</key>
+-    <value>2</value>
+-    <type>int</type>
+-  </param>
+-  <param>
+-    <name>Bitrate</name>
+-    <key>bitrate</key>
+-    <value>64000</value>
+-    <type>int</type>
+-  </param>
+-  <check>1 &lt;= $channels &lt;= 2</check>
+-  <check>0 &lt; $bitrate</check>
+-  <sink>
+-    <name>in</name>
+-    <type>float</type>
+-    <nports>$channels</nports>
+-  </sink>
+-  <source>
+-    <name>out</name>
+-    <type>byte</type>
+-  </source>
+-</block>
+diff --git a/grc/nrsc5_l1_fm_encoder_mp1.block.yml b/grc/nrsc5_l1_fm_encoder_mp1.block.yml
+new file mode 100644
+index 0000000..2b69d4c
+--- /dev/null
++++ b/grc/nrsc5_l1_fm_encoder_mp1.block.yml
+@@ -0,0 +1,26 @@
++# auto-generated by grc.converter
++
++id: nrsc5_l1_fm_encoder_mp1
++label: 'Layer 1 FM encoder: MP1'
++category: '[NRSC-5]'
++
++inputs:
++-   label: p1
++    domain: stream
++    dtype: byte
++    vlen: 146176
++-   label: pids
++    domain: stream
++    dtype: byte
++    vlen: 80
++
++outputs:
++-   domain: stream
++    dtype: byte
++    vlen: 1048576
++
++templates:
++    imports: import nrsc5
++    make: nrsc5.l1_fm_encoder(1)
++
++file_format: 1
+diff --git a/grc/nrsc5_l1_fm_encoder_mp1.xml b/grc/nrsc5_l1_fm_encoder_mp1.xml
+deleted file mode 100644
+index 46714a7..0000000
+--- a/grc/nrsc5_l1_fm_encoder_mp1.xml
++++ /dev/null
+@@ -1,23 +0,0 @@
+-<?xml version="1.0"?>
+-<block>
+-  <name>Layer 1 FM encoder: MP1</name>
+-  <key>nrsc5_l1_fm_encoder_mp1</key>
+-  <category>[NRSC-5]</category>
+-  <import>import nrsc5</import>
+-  <make>nrsc5.l1_fm_encoder(1)</make>
+-  <sink>
+-    <name>p1</name>
+-    <type>byte</type>
+-    <vlen>146176</vlen>
+-  </sink>
+-  <sink>
+-    <name>pids</name>
+-    <type>byte</type>
+-    <vlen>80</vlen>
+-  </sink>
+-  <source>
+-    <name>out</name>
+-    <type>byte</type>
+-    <vlen>1048576</vlen>
+-  </source>
+-</block>
+diff --git a/grc/nrsc5_l1_fm_encoder_mp11.block.yml b/grc/nrsc5_l1_fm_encoder_mp11.block.yml
+new file mode 100644
+index 0000000..8c109f3
+--- /dev/null
++++ b/grc/nrsc5_l1_fm_encoder_mp11.block.yml
+@@ -0,0 +1,34 @@
++# auto-generated by grc.converter
++
++id: nrsc5_l1_fm_encoder_mp11
++label: 'Layer 1 FM encoder: MP11'
++category: '[NRSC-5]'
++
++inputs:
++-   label: p1
++    domain: stream
++    dtype: byte
++    vlen: 146176
++-   label: p3
++    domain: stream
++    dtype: byte
++    vlen: 4608
++-   label: p4
++    domain: stream
++    dtype: byte
++    vlen: 4608
++-   label: pids
++    domain: stream
++    dtype: byte
++    vlen: 80
++
++outputs:
++-   domain: stream
++    dtype: byte
++    vlen: 1048576
++
++templates:
++    imports: import nrsc5
++    make: nrsc5.l1_fm_encoder(11)
++
++file_format: 1
+diff --git a/grc/nrsc5_l1_fm_encoder_mp11.xml b/grc/nrsc5_l1_fm_encoder_mp11.xml
+deleted file mode 100644
+index cba0837..0000000
+--- a/grc/nrsc5_l1_fm_encoder_mp11.xml
++++ /dev/null
+@@ -1,33 +0,0 @@
+-<?xml version="1.0"?>
+-<block>
+-  <name>Layer 1 FM encoder: MP11</name>
+-  <key>nrsc5_l1_fm_encoder_mp11</key>
+-  <category>[NRSC-5]</category>
+-  <import>import nrsc5</import>
+-  <make>nrsc5.l1_fm_encoder(11)</make>
+-  <sink>
+-    <name>p1</name>
+-    <type>byte</type>
+-    <vlen>146176</vlen>
+-  </sink>
+-  <sink>
+-    <name>p3</name>
+-    <type>byte</type>
+-    <vlen>4608</vlen>
+-  </sink>
+-  <sink>
+-    <name>p4</name>
+-    <type>byte</type>
+-    <vlen>4608</vlen>
+-  </sink>
+-  <sink>
+-    <name>pids</name>
+-    <type>byte</type>
+-    <vlen>80</vlen>
+-  </sink>
+-  <source>
+-    <name>out</name>
+-    <type>byte</type>
+-    <vlen>1048576</vlen>
+-  </source>
+-</block>
+diff --git a/grc/nrsc5_l1_fm_encoder_mp2.block.yml b/grc/nrsc5_l1_fm_encoder_mp2.block.yml
+new file mode 100644
+index 0000000..6e049b5
+--- /dev/null
++++ b/grc/nrsc5_l1_fm_encoder_mp2.block.yml
+@@ -0,0 +1,30 @@
++# auto-generated by grc.converter
++
++id: nrsc5_l1_fm_encoder_mp2
++label: 'Layer 1 FM encoder: MP2'
++category: '[NRSC-5]'
++
++inputs:
++-   label: p1
++    domain: stream
++    dtype: byte
++    vlen: 146176
++-   label: p3
++    domain: stream
++    dtype: byte
++    vlen: 2304
++-   label: pids
++    domain: stream
++    dtype: byte
++    vlen: 80
++
++outputs:
++-   domain: stream
++    dtype: byte
++    vlen: 1048576
++
++templates:
++    imports: import nrsc5
++    make: nrsc5.l1_fm_encoder(2)
++
++file_format: 1
+diff --git a/grc/nrsc5_l1_fm_encoder_mp2.xml b/grc/nrsc5_l1_fm_encoder_mp2.xml
+deleted file mode 100644
+index a176309..0000000
+--- a/grc/nrsc5_l1_fm_encoder_mp2.xml
++++ /dev/null
+@@ -1,28 +0,0 @@
+-<?xml version="1.0"?>
+-<block>
+-  <name>Layer 1 FM encoder: MP2</name>
+-  <key>nrsc5_l1_fm_encoder_mp2</key>
+-  <category>[NRSC-5]</category>
+-  <import>import nrsc5</import>
+-  <make>nrsc5.l1_fm_encoder(2)</make>
+-  <sink>
+-    <name>p1</name>
+-    <type>byte</type>
+-    <vlen>146176</vlen>
+-  </sink>
+-  <sink>
+-    <name>p3</name>
+-    <type>byte</type>
+-    <vlen>2304</vlen>
+-  </sink>
+-  <sink>
+-    <name>pids</name>
+-    <type>byte</type>
+-    <vlen>80</vlen>
+-  </sink>
+-  <source>
+-    <name>out</name>
+-    <type>byte</type>
+-    <vlen>1048576</vlen>
+-  </source>
+-</block>
+diff --git a/grc/nrsc5_l1_fm_encoder_mp3.block.yml b/grc/nrsc5_l1_fm_encoder_mp3.block.yml
+new file mode 100644
+index 0000000..e5077ca
+--- /dev/null
++++ b/grc/nrsc5_l1_fm_encoder_mp3.block.yml
+@@ -0,0 +1,30 @@
++# auto-generated by grc.converter
++
++id: nrsc5_l1_fm_encoder_mp3
++label: 'Layer 1 FM encoder: MP3'
++category: '[NRSC-5]'
++
++inputs:
++-   label: p1
++    domain: stream
++    dtype: byte
++    vlen: 146176
++-   label: p3
++    domain: stream
++    dtype: byte
++    vlen: 4608
++-   label: pids
++    domain: stream
++    dtype: byte
++    vlen: 80
++
++outputs:
++-   domain: stream
++    dtype: byte
++    vlen: 1048576
++
++templates:
++    imports: import nrsc5
++    make: nrsc5.l1_fm_encoder(3)
++
++file_format: 1
+diff --git a/grc/nrsc5_l1_fm_encoder_mp3.xml b/grc/nrsc5_l1_fm_encoder_mp3.xml
+deleted file mode 100644
+index 11af89a..0000000
+--- a/grc/nrsc5_l1_fm_encoder_mp3.xml
++++ /dev/null
+@@ -1,28 +0,0 @@
+-<?xml version="1.0"?>
+-<block>
+-  <name>Layer 1 FM encoder: MP3</name>
+-  <key>nrsc5_l1_fm_encoder_mp3</key>
+-  <category>[NRSC-5]</category>
+-  <import>import nrsc5</import>
+-  <make>nrsc5.l1_fm_encoder(3)</make>
+-  <sink>
+-    <name>p1</name>
+-    <type>byte</type>
+-    <vlen>146176</vlen>
+-  </sink>
+-  <sink>
+-    <name>p3</name>
+-    <type>byte</type>
+-    <vlen>4608</vlen>
+-  </sink>
+-  <sink>
+-    <name>pids</name>
+-    <type>byte</type>
+-    <vlen>80</vlen>
+-  </sink>
+-  <source>
+-    <name>out</name>
+-    <type>byte</type>
+-    <vlen>1048576</vlen>
+-  </source>
+-</block>
+diff --git a/grc/nrsc5_l1_fm_encoder_mp5.block.yml b/grc/nrsc5_l1_fm_encoder_mp5.block.yml
+new file mode 100644
+index 0000000..5a79a23
+--- /dev/null
++++ b/grc/nrsc5_l1_fm_encoder_mp5.block.yml
+@@ -0,0 +1,34 @@
++# auto-generated by grc.converter
++
++id: nrsc5_l1_fm_encoder_mp5
++label: 'Layer 1 FM encoder: MP5'
++category: '[NRSC-5]'
++
++inputs:
++-   label: p1
++    domain: stream
++    dtype: byte
++    vlen: 4608
++-   label: p2
++    domain: stream
++    dtype: byte
++    vlen: 109312
++-   label: p3
++    domain: stream
++    dtype: byte
++    vlen: 4608
++-   label: pids
++    domain: stream
++    dtype: byte
++    vlen: 80
++
++outputs:
++-   domain: stream
++    dtype: byte
++    vlen: 1048576
++
++templates:
++    imports: import nrsc5
++    make: nrsc5.l1_fm_encoder(5)
++
++file_format: 1
+diff --git a/grc/nrsc5_l1_fm_encoder_mp5.xml b/grc/nrsc5_l1_fm_encoder_mp5.xml
+deleted file mode 100644
+index e5b5209..0000000
+--- a/grc/nrsc5_l1_fm_encoder_mp5.xml
++++ /dev/null
+@@ -1,33 +0,0 @@
+-<?xml version="1.0"?>
+-<block>
+-  <name>Layer 1 FM encoder: MP5</name>
+-  <key>nrsc5_l1_fm_encoder_mp5</key>
+-  <category>[NRSC-5]</category>
+-  <import>import nrsc5</import>
+-  <make>nrsc5.l1_fm_encoder(5)</make>
+-  <sink>
+-    <name>p1</name>
+-    <type>byte</type>
+-    <vlen>4608</vlen>
+-  </sink>
+-  <sink>
+-    <name>p2</name>
+-    <type>byte</type>
+-    <vlen>109312</vlen>
+-  </sink>
+-  <sink>
+-    <name>p3</name>
+-    <type>byte</type>
+-    <vlen>4608</vlen>
+-  </sink>
+-  <sink>
+-    <name>pids</name>
+-    <type>byte</type>
+-    <vlen>80</vlen>
+-  </sink>
+-  <source>
+-    <name>out</name>
+-    <type>byte</type>
+-    <vlen>1048576</vlen>
+-  </source>
+-</block>
+diff --git a/grc/nrsc5_l1_fm_encoder_mp5_ms1.block.yml b/grc/nrsc5_l1_fm_encoder_mp5_ms1.block.yml
+new file mode 100644
+index 0000000..34f9d93
+--- /dev/null
++++ b/grc/nrsc5_l1_fm_encoder_mp5_ms1.block.yml
+@@ -0,0 +1,46 @@
++# auto-generated by grc.converter
++
++id: nrsc5_l1_fm_encoder_mp5_ms1
++label: 'Layer 1 FM encoder: MP5+MS1'
++category: '[NRSC-5]'
++
++inputs:
++-   label: p1
++    domain: stream
++    dtype: byte
++    vlen: 4608
++-   label: p2
++    domain: stream
++    dtype: byte
++    vlen: 109312
++-   label: p3
++    domain: stream
++    dtype: byte
++    vlen: 4608
++-   label: pids
++    domain: stream
++    dtype: byte
++    vlen: 80
++-   label: s4
++    domain: stream
++    dtype: byte
++    vlen: 18272
++-   label: s5
++    domain: stream
++    dtype: byte
++    vlen: 512
++-   label: sids
++    domain: stream
++    dtype: byte
++    vlen: 80
++
++outputs:
++-   domain: stream
++    dtype: byte
++    vlen: 1048576
++
++templates:
++    imports: import nrsc5
++    make: nrsc5.l1_fm_encoder(5, 1)
++
++file_format: 1
+diff --git a/grc/nrsc5_l1_fm_encoder_mp5_ms1.xml b/grc/nrsc5_l1_fm_encoder_mp5_ms1.xml
+deleted file mode 100644
+index fd66e29..0000000
+--- a/grc/nrsc5_l1_fm_encoder_mp5_ms1.xml
++++ /dev/null
+@@ -1,48 +0,0 @@
+-<?xml version="1.0"?>
+-<block>
+-  <name>Layer 1 FM encoder: MP5+MS1</name>
+-  <key>nrsc5_l1_fm_encoder_mp5_ms1</key>
+-  <category>[NRSC-5]</category>
+-  <import>import nrsc5</import>
+-  <make>nrsc5.l1_fm_encoder(5, 1)</make>
+-  <sink>
+-    <name>p1</name>
+-    <type>byte</type>
+-    <vlen>4608</vlen>
+-  </sink>
+-  <sink>
+-    <name>p2</name>
+-    <type>byte</type>
+-    <vlen>109312</vlen>
+-  </sink>
+-  <sink>
+-    <name>p3</name>
+-    <type>byte</type>
+-    <vlen>4608</vlen>
+-  </sink>
+-  <sink>
+-    <name>pids</name>
+-    <type>byte</type>
+-    <vlen>80</vlen>
+-  </sink>
+-  <sink>
+-    <name>s4</name>
+-    <type>byte</type>
+-    <vlen>18272</vlen>
+-  </sink>
+-  <sink>
+-    <name>s5</name>
+-    <type>byte</type>
+-    <vlen>512</vlen>
+-  </sink>
+-  <sink>
+-    <name>sids</name>
+-    <type>byte</type>
+-    <vlen>80</vlen>
+-  </sink>
+-  <source>
+-    <name>out</name>
+-    <type>byte</type>
+-    <vlen>1048576</vlen>
+-  </source>
+-</block>
+diff --git a/grc/nrsc5_l1_fm_encoder_mp6.block.yml b/grc/nrsc5_l1_fm_encoder_mp6.block.yml
+new file mode 100644
+index 0000000..32ee051
+--- /dev/null
++++ b/grc/nrsc5_l1_fm_encoder_mp6.block.yml
+@@ -0,0 +1,30 @@
++# auto-generated by grc.converter
++
++id: nrsc5_l1_fm_encoder_mp6
++label: 'Layer 1 FM encoder: MP6'
++category: '[NRSC-5]'
++
++inputs:
++-   label: p1
++    domain: stream
++    dtype: byte
++    vlen: 9216
++-   label: p2
++    domain: stream
++    dtype: byte
++    vlen: 72448
++-   label: pids
++    domain: stream
++    dtype: byte
++    vlen: 80
++
++outputs:
++-   domain: stream
++    dtype: byte
++    vlen: 1048576
++
++templates:
++    imports: import nrsc5
++    make: nrsc5.l1_fm_encoder(6)
++
++file_format: 1
+diff --git a/grc/nrsc5_l1_fm_encoder_mp6.xml b/grc/nrsc5_l1_fm_encoder_mp6.xml
+deleted file mode 100644
+index b1b3f07..0000000
+--- a/grc/nrsc5_l1_fm_encoder_mp6.xml
++++ /dev/null
+@@ -1,28 +0,0 @@
+-<?xml version="1.0"?>
+-<block>
+-  <name>Layer 1 FM encoder: MP6</name>
+-  <key>nrsc5_l1_fm_encoder_mp6</key>
+-  <category>[NRSC-5]</category>
+-  <import>import nrsc5</import>
+-  <make>nrsc5.l1_fm_encoder(6)</make>
+-  <sink>
+-    <name>p1</name>
+-    <type>byte</type>
+-    <vlen>9216</vlen>
+-  </sink>
+-  <sink>
+-    <name>p2</name>
+-    <type>byte</type>
+-    <vlen>72448</vlen>
+-  </sink>
+-  <sink>
+-    <name>pids</name>
+-    <type>byte</type>
+-    <vlen>80</vlen>
+-  </sink>
+-  <source>
+-    <name>out</name>
+-    <type>byte</type>
+-    <vlen>1048576</vlen>
+-  </source>
+-</block>
+diff --git a/grc/nrsc5_l1_fm_encoder_mp6_ms1.block.yml b/grc/nrsc5_l1_fm_encoder_mp6_ms1.block.yml
+new file mode 100644
+index 0000000..fe35996
+--- /dev/null
++++ b/grc/nrsc5_l1_fm_encoder_mp6_ms1.block.yml
+@@ -0,0 +1,42 @@
++# auto-generated by grc.converter
++
++id: nrsc5_l1_fm_encoder_mp6_ms1
++label: 'Layer 1 FM encoder: MP6+MS1'
++category: '[NRSC-5]'
++
++inputs:
++-   label: p1
++    domain: stream
++    dtype: byte
++    vlen: 9216
++-   label: p2
++    domain: stream
++    dtype: byte
++    vlen: 72448
++-   label: pids
++    domain: stream
++    dtype: byte
++    vlen: 80
++-   label: s4
++    domain: stream
++    dtype: byte
++    vlen: 18272
++-   label: s5
++    domain: stream
++    dtype: byte
++    vlen: 512
++-   label: sids
++    domain: stream
++    dtype: byte
++    vlen: 80
++
++outputs:
++-   domain: stream
++    dtype: byte
++    vlen: 1048576
++
++templates:
++    imports: import nrsc5
++    make: nrsc5.l1_fm_encoder(6, 1)
++
++file_format: 1
+diff --git a/grc/nrsc5_l1_fm_encoder_mp6_ms1.xml b/grc/nrsc5_l1_fm_encoder_mp6_ms1.xml
+deleted file mode 100644
+index 2302341..0000000
+--- a/grc/nrsc5_l1_fm_encoder_mp6_ms1.xml
++++ /dev/null
+@@ -1,43 +0,0 @@
+-<?xml version="1.0"?>
+-<block>
+-  <name>Layer 1 FM encoder: MP6+MS1</name>
+-  <key>nrsc5_l1_fm_encoder_mp6_ms1</key>
+-  <category>[NRSC-5]</category>
+-  <import>import nrsc5</import>
+-  <make>nrsc5.l1_fm_encoder(6, 1)</make>
+-  <sink>
+-    <name>p1</name>
+-    <type>byte</type>
+-    <vlen>9216</vlen>
+-  </sink>
+-  <sink>
+-    <name>p2</name>
+-    <type>byte</type>
+-    <vlen>72448</vlen>
+-  </sink>
+-  <sink>
+-    <name>pids</name>
+-    <type>byte</type>
+-    <vlen>80</vlen>
+-  </sink>
+-  <sink>
+-    <name>s4</name>
+-    <type>byte</type>
+-    <vlen>18272</vlen>
+-  </sink>
+-  <sink>
+-    <name>s5</name>
+-    <type>byte</type>
+-    <vlen>512</vlen>
+-  </sink>
+-  <sink>
+-    <name>sids</name>
+-    <type>byte</type>
+-    <vlen>80</vlen>
+-  </sink>
+-  <source>
+-    <name>out</name>
+-    <type>byte</type>
+-    <vlen>1048576</vlen>
+-  </source>
+-</block>
+diff --git a/grc/nrsc5_l2_encoder.block.yml b/grc/nrsc5_l2_encoder.block.yml
+new file mode 100644
+index 0000000..f946b2a
+--- /dev/null
++++ b/grc/nrsc5_l2_encoder.block.yml
+@@ -0,0 +1,44 @@
++# auto-generated by grc.converter
++
++id: nrsc5_l2_encoder
++label: Layer 2 encoder
++category: '[NRSC-5]'
++
++parameters:
++-   id: num_progs
++    label: Programs
++    dtype: int
++    default: 1
++-   id: first_prog
++    label: First prog. no.
++    dtype: int
++    default: 0
++-   id: size
++    label: Frame size
++    dtype: int
++    default: 146176
++    options: [146176, 109312, 72448, 18272, 9216, 4608, 2304]
++
++inputs:
++-   label: hdc
++    domain: stream
++    dtype: byte
++    multiplicity: ${ num_progs }
++-   label: psd
++    domain: stream
++    dtype: byte
++    multiplicity: ${ num_progs }
++
++outputs:
++-   domain: stream
++    dtype: byte
++    vlen: ${ size }
++asserts:
++- ${ 0 <= first_prog <= 7 }
++- ${ 1 <= num_progs <= 8 - first_prog }
++
++templates:
++    imports: import nrsc5
++    make: nrsc5.l2_encoder(${num_progs}, ${first_prog}, ${size})
++
++file_format: 1
+diff --git a/grc/nrsc5_l2_encoder.xml b/grc/nrsc5_l2_encoder.xml
+deleted file mode 100644
+index 216969a..0000000
+--- a/grc/nrsc5_l2_encoder.xml
++++ /dev/null
+@@ -1,71 +0,0 @@
+-<?xml version="1.0"?>
+-<block>
+-  <name>Layer 2 encoder</name>
+-  <key>nrsc5_l2_encoder</key>
+-  <category>[NRSC-5]</category>
+-  <import>import nrsc5</import>
+-  <make>nrsc5.l2_encoder($num_progs, $first_prog, $size)</make>
+-  <param>
+-    <name>Programs</name>
+-    <key>num_progs</key>
+-    <value>1</value>
+-    <type>int</type>
+-  </param>
+-  <param>
+-    <name>First prog. no.</name>
+-    <key>first_prog</key>
+-    <value>0</value>
+-    <type>int</type>
+-  </param>
+-  <param>
+-    <name>Frame size</name>
+-    <key>size</key>
+-    <value>146176</value>
+-    <type>int</type>
+-    <option>
+-      <name>146176</name>
+-      <key>146176</key>
+-    </option>
+-    <option>
+-      <name>109312</name>
+-      <key>109312</key>
+-    </option>
+-    <option>
+-      <name>72448</name>
+-      <key>72448</key>
+-    </option>
+-    <option>
+-      <name>18272</name>
+-      <key>18272</key>
+-    </option>
+-    <option>
+-      <name>9216</name>
+-      <key>9216</key>
+-    </option>
+-    <option>
+-      <name>4608</name>
+-      <key>4608</key>
+-    </option>
+-    <option>
+-      <name>2304</name>
+-      <key>2304</key>
+-    </option>
+-  </param>
+-  <check>0 &lt;= $first_prog &lt;= 7</check>
+-  <check>1 &lt;= $num_progs &lt;= 8 - $first_prog</check>
+-  <sink>
+-    <name>hdc</name>
+-    <type>byte</type>
+-    <nports>$num_progs</nports>
+-  </sink>
+-  <sink>
+-    <name>psd</name>
+-    <type>byte</type>
+-    <nports>$num_progs</nports>
+-  </sink>
+-  <source>
+-    <name>out</name>
+-    <type>byte</type>
+-    <vlen>$size</vlen>
+-  </source>
+-</block>
+diff --git a/grc/nrsc5_psd_encoder.block.yml b/grc/nrsc5_psd_encoder.block.yml
+new file mode 100644
+index 0000000..b0d25ea
+--- /dev/null
++++ b/grc/nrsc5_psd_encoder.block.yml
+@@ -0,0 +1,31 @@
++# auto-generated by grc.converter
++
++id: nrsc5_psd_encoder
++label: PSD encoder
++category: '[NRSC-5]'
++
++parameters:
++-   id: prog_num
++    label: Program number
++    dtype: int
++    default: 0
++-   id: title
++    label: Title
++    dtype: string
++    default: Title
++-   id: artist
++    label: Artist
++    dtype: string
++    default: Artist
++
++outputs:
++-   domain: stream
++    dtype: byte
++asserts:
++- ${ 0 <= prog_num <= 7 }
++
++templates:
++    imports: import nrsc5
++    make: nrsc5.psd_encoder(${prog_num}, ${title}, ${artist})
++
++file_format: 1
+diff --git a/grc/nrsc5_psd_encoder.xml b/grc/nrsc5_psd_encoder.xml
+deleted file mode 100644
+index 8828da4..0000000
+--- a/grc/nrsc5_psd_encoder.xml
++++ /dev/null
+@@ -1,31 +0,0 @@
+-<?xml version="1.0"?>
+-<block>
+-  <name>PSD encoder</name>
+-  <key>nrsc5_psd_encoder</key>
+-  <category>[NRSC-5]</category>
+-  <import>import nrsc5</import>
+-  <make>nrsc5.psd_encoder($prog_num, $title, $artist)</make>
+-  <param>
+-    <name>Program number</name>
+-    <key>prog_num</key>
+-    <value>0</value>
+-    <type>int</type>
+-  </param>
+-  <param>
+-    <name>Title</name>
+-    <key>title</key>
+-    <value>Title</value>
+-    <type>string</type>
+-  </param>
+-  <param>
+-    <name>Artist</name>
+-    <key>artist</key>
+-    <value>Artist</value>
+-    <type>string</type>
+-  </param>
+-  <check>0 &lt;= $prog_num &lt;= 7</check>
+-  <source>
+-    <name>out</name>
+-    <type>byte</type>
+-  </source>
+-</block>
+diff --git a/grc/nrsc5_sis_encoder.block.yml b/grc/nrsc5_sis_encoder.block.yml
+new file mode 100644
+index 0000000..448a753
+--- /dev/null
++++ b/grc/nrsc5_sis_encoder.block.yml
+@@ -0,0 +1,24 @@
++# auto-generated by grc.converter
++
++id: nrsc5_sis_encoder
++label: SIS encoder
++category: '[NRSC-5]'
++
++parameters:
++-   id: short_name
++    label: Station name
++    dtype: string
++    default: ABCD
++
++outputs:
++-   domain: stream
++    dtype: byte
++    vlen: 80
++asserts:
++- ${ len(short_name) == 4 }
++
++templates:
++    imports: import nrsc5
++    make: nrsc5.sis_encoder(${short_name})
++
++file_format: 1
+diff --git a/grc/nrsc5_sis_encoder.xml b/grc/nrsc5_sis_encoder.xml
+deleted file mode 100644
+index 2bd6f1a..0000000
+--- a/grc/nrsc5_sis_encoder.xml
++++ /dev/null
+@@ -1,20 +0,0 @@
+-<?xml version="1.0"?>
+-<block>
+-  <name>SIS encoder</name>
+-  <key>nrsc5_sis_encoder</key>
+-  <category>[NRSC-5]</category>
+-  <import>import nrsc5</import>
+-  <make>nrsc5.sis_encoder($short_name)</make>
+-  <param>
+-    <name>Station name</name>
+-    <key>short_name</key>
+-    <value>ABCD</value>
+-    <type>string</type>
+-  </param>
+-  <check>len($short_name) == 4</check>
+-  <source>
+-    <name>out</name>
+-    <type>byte</type>
+-    <vlen>80</vlen>
+-  </source>
+-</block>
+diff --git a/include/nrsc5/CMakeLists.txt b/include/nrsc5/CMakeLists.txt
+index b3c2c5d..04c74c3 100644
+--- a/include/nrsc5/CMakeLists.txt
++++ b/include/nrsc5/CMakeLists.txt
+@@ -1,6 +1,7 @@
+ # Copyright 2011,2012 Free Software Foundation, Inc.
+ #
+-# This file is part of GNU Radio
++# This file was generated by gr_modtool, a tool from the GNU Radio framework
++# This file is a part of gr-nrsc5
+ #
+ # 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
+@@ -22,9 +23,9 @@
+ ########################################################################
+ install(FILES
+     api.h
++    hdc_encoder.h
+     l1_fm_encoder.h
+-    sis_encoder.h
+     l2_encoder.h
+-    hdc_encoder.h
+-    psd_encoder.h DESTINATION include/nrsc5
++    psd_encoder.h
++    sis_encoder.h DESTINATION include/nrsc5
+ )
+diff --git a/include/nrsc5/api.h b/include/nrsc5/api.h
+index f0e8af7..449b586 100644
+--- a/include/nrsc5/api.h
++++ b/include/nrsc5/api.h
+@@ -1,7 +1,8 @@
+ /*
+  * Copyright 2011 Free Software Foundation, Inc.
+  *
+- * This file is part of GNU Radio
++ * This file was generated by gr_modtool, a tool from the GNU Radio framework
++ * This file is a part of gr-nrsc5
+  *
+  * 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
+diff --git a/include/nrsc5/hdc_encoder.h b/include/nrsc5/hdc_encoder.h
+index 5de1490..4b40b14 100644
+--- a/include/nrsc5/hdc_encoder.h
++++ b/include/nrsc5/hdc_encoder.h
+@@ -18,7 +18,6 @@
+  * Boston, MA 02110-1301, USA.
+  */
+ 
+-
+ #ifndef INCLUDED_NRSC5_HDC_ENCODER_H
+ #define INCLUDED_NRSC5_HDC_ENCODER_H
+ 
+diff --git a/include/nrsc5/l1_fm_encoder.h b/include/nrsc5/l1_fm_encoder.h
+index 9cebec6..52df09d 100644
+--- a/include/nrsc5/l1_fm_encoder.h
++++ b/include/nrsc5/l1_fm_encoder.h
+@@ -18,7 +18,6 @@
+  * Boston, MA 02110-1301, USA.
+  */
+ 
+-
+ #ifndef INCLUDED_NRSC5_L1_FM_ENCODER_H
+ #define INCLUDED_NRSC5_L1_FM_ENCODER_H
+ 
+diff --git a/include/nrsc5/l2_encoder.h b/include/nrsc5/l2_encoder.h
+index 935f3b6..4a3bac0 100644
+--- a/include/nrsc5/l2_encoder.h
++++ b/include/nrsc5/l2_encoder.h
+@@ -18,7 +18,6 @@
+  * Boston, MA 02110-1301, USA.
+  */
+ 
+-
+ #ifndef INCLUDED_NRSC5_L2_ENCODER_H
+ #define INCLUDED_NRSC5_L2_ENCODER_H
+ 
+diff --git a/include/nrsc5/psd_encoder.h b/include/nrsc5/psd_encoder.h
+index f916c71..d6cbca5 100644
+--- a/include/nrsc5/psd_encoder.h
++++ b/include/nrsc5/psd_encoder.h
+@@ -18,7 +18,6 @@
+  * Boston, MA 02110-1301, USA.
+  */
+ 
+-
+ #ifndef INCLUDED_NRSC5_PSD_ENCODER_H
+ #define INCLUDED_NRSC5_PSD_ENCODER_H
+ 
+diff --git a/include/nrsc5/sis_encoder.h b/include/nrsc5/sis_encoder.h
+index ae65c2f..73e26de 100644
+--- a/include/nrsc5/sis_encoder.h
++++ b/include/nrsc5/sis_encoder.h
+@@ -18,7 +18,6 @@
+  * Boston, MA 02110-1301, USA.
+  */
+ 
+-
+ #ifndef INCLUDED_NRSC5_SIS_ENCODER_H
+ #define INCLUDED_NRSC5_SIS_ENCODER_H
+ 
+diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
+index 9f87e20..a23aef5 100644
+--- a/lib/CMakeLists.txt
++++ b/lib/CMakeLists.txt
+@@ -1,6 +1,7 @@
+-# Copyright 2011,2012,2016 Free Software Foundation, Inc.
++# Copyright 2011,2012,2016,2018,2019 Free Software Foundation, Inc.
+ #
+-# This file is part of GNU Radio
++# This file was generated by gr_modtool, a tool from the GNU Radio framework
++# This file is a part of gr-nrsc5
+ #
+ # 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
+@@ -22,25 +23,26 @@
+ ########################################################################
+ include(GrPlatform) #define LIB_SUFFIX
+ 
+-include_directories(${Boost_INCLUDE_DIR})
+-link_directories(${Boost_LIBRARY_DIRS})
+-
+ list(APPEND nrsc5_sources
++    hdc_encoder_impl.cc
+     l1_fm_encoder_impl.cc
+-    sis_encoder_impl.cc
+     l2_encoder_impl.cc
+-    hdc_encoder_impl.cc
+     psd_encoder_impl.cc
++    sis_encoder_impl.cc
+ )
+ 
+ set(nrsc5_sources "${nrsc5_sources}" PARENT_SCOPE)
+ if(NOT nrsc5_sources)
+-	MESSAGE(STATUS "No C++ sources... skipping lib/")
+-	return()
++    MESSAGE(STATUS "No C++ sources... skipping lib/")
++    return()
+ endif(NOT nrsc5_sources)
+ 
+ add_library(gnuradio-nrsc5 SHARED ${nrsc5_sources})
+-target_link_libraries(gnuradio-nrsc5 ${Boost_LIBRARIES} ${GNURADIO_ALL_LIBRARIES} fdk-aac)
++target_link_libraries(gnuradio-nrsc5 gnuradio::gnuradio-runtime gnuradio::gnuradio-fec fdk-aac)
++target_include_directories(gnuradio-nrsc5
++    PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../include>
++    PUBLIC $<INSTALL_INTERFACE:include>
++  )
+ set_target_properties(gnuradio-nrsc5 PROPERTIES DEFINE_SYMBOL "gnuradio_nrsc5_EXPORTS")
+ 
+ if(APPLE)
+@@ -53,34 +55,34 @@ endif(APPLE)
+ # Install built library files
+ ########################################################################
+ include(GrMiscUtils)
+-GR_LIBRARY_FOO(gnuradio-nrsc5 RUNTIME_COMPONENT "nrsc5_runtime" DEVEL_COMPONENT "nrsc5_devel")
++GR_LIBRARY_FOO(gnuradio-nrsc5)
++
++########################################################################
++# Print summary
++########################################################################
++message(STATUS "Using install prefix: ${CMAKE_INSTALL_PREFIX}")
++message(STATUS "Building for version: ${VERSION} / ${LIBVER}")
+ 
+ ########################################################################
+ # Build and register unit test
+ ########################################################################
+ include(GrTest)
+ 
+-include_directories(${CPPUNIT_INCLUDE_DIRS})
+-
++# If your unit tests require special include paths, add them here
++#include_directories()
++# List all files that contain Boost.UTF unit tests here
+ list(APPEND test_nrsc5_sources
+-    ${CMAKE_CURRENT_SOURCE_DIR}/test_nrsc5.cc
+-    ${CMAKE_CURRENT_SOURCE_DIR}/qa_nrsc5.cc
+ )
++# Anything we need to link to for the unit tests go here
++list(APPEND GR_TEST_TARGET_DEPS gnuradio-nrsc5)
+ 
+-add_executable(test-nrsc5 ${test_nrsc5_sources})
+-
+-target_link_libraries(
+-  test-nrsc5
+-  ${GNURADIO_RUNTIME_LIBRARIES}
+-  ${Boost_LIBRARIES}
+-  ${CPPUNIT_LIBRARIES}
+-  gnuradio-nrsc5
+-)
++if(NOT test_nrsc5_sources)
++    MESSAGE(STATUS "No C++ unit tests... skipping")
++    return()
++endif(NOT test_nrsc5_sources)
+ 
+-GR_ADD_TEST(test_nrsc5 test-nrsc5)
+-
+-########################################################################
+-# Print summary
+-########################################################################
+-message(STATUS "Using install prefix: ${CMAKE_INSTALL_PREFIX}")
+-message(STATUS "Building for version: ${VERSION} / ${LIBVER}")
++foreach(qa_file ${test_nrsc5_sources})
++    GR_ADD_CPP_TEST("nrsc5_${qa_file}"
++        ${CMAKE_CURRENT_SOURCE_DIR}/${qa_file}
++    )
++endforeach(qa_file)
+diff --git a/lib/hdc_encoder_impl.cc b/lib/hdc_encoder_impl.cc
+index 706c2ac..89b1374 100644
+--- a/lib/hdc_encoder_impl.cc
++++ b/lib/hdc_encoder_impl.cc
+@@ -35,6 +35,7 @@ namespace gr {
+         (new hdc_encoder_impl(channels, bitrate));
+     }
+ 
++
+     /*
+      * The private constructor
+      */
+diff --git a/lib/hdc_encoder_impl.h b/lib/hdc_encoder_impl.h
+index ff6b1d2..aa5a5a6 100644
+--- a/lib/hdc_encoder_impl.h
++++ b/lib/hdc_encoder_impl.h
+@@ -54,6 +54,7 @@ namespace gr {
+            gr_vector_int &ninput_items,
+            gr_vector_const_void_star &input_items,
+            gr_vector_void_star &output_items);
++
+     };
+ 
+   } // namespace nrsc5
+diff --git a/lib/l1_fm_encoder_impl.cc b/lib/l1_fm_encoder_impl.cc
+index 6861700..bef95ea 100644
+--- a/lib/l1_fm_encoder_impl.cc
++++ b/lib/l1_fm_encoder_impl.cc
+@@ -105,6 +105,7 @@ namespace gr {
+         (new l1_fm_encoder_impl(psm, ssm));
+     }
+ 
++
+     /*
+      * The private constructor
+      */
+diff --git a/lib/l1_fm_encoder_impl.h b/lib/l1_fm_encoder_impl.h
+index e0bba24..a1db3c2 100644
+--- a/lib/l1_fm_encoder_impl.h
++++ b/lib/l1_fm_encoder_impl.h
+@@ -105,6 +105,7 @@ namespace gr {
+            gr_vector_int &ninput_items,
+            gr_vector_const_void_star &input_items,
+            gr_vector_void_star &output_items);
++
+     };
+ 
+   } // namespace nrsc5
+diff --git a/lib/l2_encoder_impl.cc b/lib/l2_encoder_impl.cc
+index ce14714..2ef81c8 100644
+--- a/lib/l2_encoder_impl.cc
++++ b/lib/l2_encoder_impl.cc
+@@ -41,6 +41,7 @@ namespace gr {
+         (new l2_encoder_impl(num_progs, first_prog, size));
+     }
+ 
++
+     /*
+      * The private constructor
+      */
+diff --git a/lib/l2_encoder_impl.h b/lib/l2_encoder_impl.h
+index 9fa9494..084395a 100644
+--- a/lib/l2_encoder_impl.h
++++ b/lib/l2_encoder_impl.h
+@@ -85,6 +85,7 @@ namespace gr {
+            gr_vector_int &ninput_items,
+            gr_vector_const_void_star &input_items,
+            gr_vector_void_star &output_items);
++
+     };
+ 
+   } // namespace nrsc5
+diff --git a/lib/psd_encoder_impl.cc b/lib/psd_encoder_impl.cc
+index acb4010..29c9ed7 100644
+--- a/lib/psd_encoder_impl.cc
++++ b/lib/psd_encoder_impl.cc
+@@ -35,6 +35,7 @@ namespace gr {
+         (new psd_encoder_impl(prog_num, title, artist));
+     }
+ 
++
+     /*
+      * The private constructor
+      */
+diff --git a/lib/qa_nrsc5.cc b/lib/qa_nrsc5.cc
+deleted file mode 100644
+index b523eb2..0000000
+--- a/lib/qa_nrsc5.cc
++++ /dev/null
+@@ -1,36 +0,0 @@
+-/*
+- * Copyright 2012 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.
+- */
+-
+-/*
+- * This class gathers together all the test cases for the gr-filter
+- * directory into a single test suite.  As you create new test cases,
+- * add them here.
+- */
+-
+-#include "qa_nrsc5.h"
+-
+-CppUnit::TestSuite *
+-qa_nrsc5::suite()
+-{
+-  CppUnit::TestSuite *s = new CppUnit::TestSuite("nrsc5");
+-
+-  return s;
+-}
+diff --git a/lib/qa_nrsc5.h b/lib/qa_nrsc5.h
+deleted file mode 100644
+index 8ccf0f5..0000000
+--- a/lib/qa_nrsc5.h
++++ /dev/null
+@@ -1,38 +0,0 @@
+-/* -*- c++ -*- */
+-/*
+- * Copyright 2012 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.
+- */
+-
+-#ifndef _QA_NRSC5_H_
+-#define _QA_NRSC5_H_
+-
+-#include <gnuradio/attributes.h>
+-#include <cppunit/TestSuite.h>
+-
+-//! collect all the tests for the gr-filter directory
+-
+-class __GR_ATTR_EXPORT qa_nrsc5
+-{
+- public:
+-  //! return suite of tests for all of gr-filter directory
+-  static CppUnit::TestSuite *suite();
+-};
+-
+-#endif /* _QA_NRSC5_H_ */
+diff --git a/lib/sis_encoder_impl.cc b/lib/sis_encoder_impl.cc
+index 2e1cb19..714bfb0 100644
+--- a/lib/sis_encoder_impl.cc
++++ b/lib/sis_encoder_impl.cc
+@@ -35,6 +35,7 @@ namespace gr {
+         (new sis_encoder_impl(short_name));
+     }
+ 
++
+     /*
+      * The private constructor
+      */
+diff --git a/lib/test_nrsc5.cc b/lib/test_nrsc5.cc
+deleted file mode 100644
+index 59bd57c..0000000
+--- a/lib/test_nrsc5.cc
++++ /dev/null
+@@ -1,48 +0,0 @@
+-/* -*- c++ -*- */
+-/*
+- * Copyright 2012 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 <cppunit/TextTestRunner.h>
+-#include <cppunit/XmlOutputter.h>
+-
+-#include <gnuradio/unittests.h>
+-#include "qa_nrsc5.h"
+-#include <iostream>
+-#include <fstream>
+-
+-int
+-main (int argc, char **argv)
+-{
+-  CppUnit::TextTestRunner runner;
+-  std::ofstream xmlfile(get_unittest_path("nrsc5.xml").c_str());
+-  CppUnit::XmlOutputter *xmlout = new CppUnit::XmlOutputter(&runner.result(), xmlfile);
+-
+-  runner.addTest(qa_nrsc5::suite());
+-  runner.setOutputter(xmlout);
+-
+-  bool was_successful = runner.run("", false);
+-
+-  return was_successful ? 0 : 1;
+-}
+diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt
+index d0b133e..9b25913 100644
+--- a/python/CMakeLists.txt
++++ b/python/CMakeLists.txt
+@@ -1,6 +1,7 @@
+ # Copyright 2011 Free Software Foundation, Inc.
+ #
+-# This file is part of GNU Radio
++# This file was generated by gr_modtool, a tool from the GNU Radio framework
++# This file is a part of gr-nrsc5
+ #
+ # 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
+@@ -41,8 +42,8 @@ include(GrTest)
+ 
+ set(GR_TEST_TARGET_DEPS gnuradio-nrsc5)
+ set(GR_TEST_PYTHON_DIRS ${CMAKE_BINARY_DIR}/swig)
++GR_ADD_TEST(qa_hdc_encoder ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_hdc_encoder.py)
+ GR_ADD_TEST(qa_l1_fm_encoder ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_l1_fm_encoder.py)
+-GR_ADD_TEST(qa_sis_encoder ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_sis_encoder.py)
+ GR_ADD_TEST(qa_l2_encoder ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_l2_encoder.py)
+-GR_ADD_TEST(qa_hdc_encoder ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_hdc_encoder.py)
+ GR_ADD_TEST(qa_psd_encoder ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_psd_encoder.py)
++GR_ADD_TEST(qa_sis_encoder ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_sis_encoder.py)
+diff --git a/python/__init__.py b/python/__init__.py
+index f192a2d..476fb00 100644
+--- a/python/__init__.py
++++ b/python/__init__.py
+@@ -22,13 +22,14 @@
+ This is the GNU Radio NRSC5 module. Place your Python package
+ description here (python/__init__.py).
+ '''
++from __future__ import unicode_literals
+ 
+ # import swig generated symbols into the nrsc5 namespace
+ try:
+-	# this might fail if the module is python-only
+-	from nrsc5_swig import *
++    # this might fail if the module is python-only
++    from .nrsc5_swig import *
+ except ImportError:
+-	pass
++    pass
+ 
+ # import any pure python here
+ #
+diff --git a/python/build_utils.py b/python/build_utils.py
+deleted file mode 100644
+index cf58a97..0000000
+--- a/python/build_utils.py
++++ /dev/null
+@@ -1,226 +0,0 @@
+-#
+-# Copyright 2004,2009,2012 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.
+-#
+-
+-"""Misc utilities used at build time
+-"""
+-
+-import re, os, os.path
+-from build_utils_codes import *
+-
+-
+-# set srcdir to the directory that contains Makefile.am
+-try:
+-    srcdir = os.environ['srcdir']
+-except KeyError, e:
+-    srcdir = "."
+-srcdir = srcdir + '/'
+-
+-# set do_makefile to either true or false dependeing on the environment
+-try:
+-    if os.environ['do_makefile'] == '0':
+-        do_makefile = False
+-    else:
+-        do_makefile = True
+-except KeyError, e:
+-    do_makefile = False
+-
+-# set do_sources to either true or false dependeing on the environment
+-try:
+-    if os.environ['do_sources'] == '0':
+-        do_sources = False
+-    else:
+-        do_sources = True
+-except KeyError, e:
+-    do_sources = True
+-
+-name_dict = {}
+-
+-def log_output_name (name):
+-    (base, ext) = os.path.splitext (name)
+-    ext = ext[1:]                       # drop the leading '.'
+-
+-    entry = name_dict.setdefault (ext, [])
+-    entry.append (name)
+-
+-def open_and_log_name (name, dir):
+-    global do_sources
+-    if do_sources:
+-        f = open (name, dir)
+-    else:
+-        f = None
+-    log_output_name (name)
+-    return f
+-
+-def expand_template (d, template_filename, extra = ""):
+-    '''Given a dictionary D and a TEMPLATE_FILENAME, expand template into output file
+-    '''
+-    global do_sources
+-    output_extension = extract_extension (template_filename)
+-    template = open_src (template_filename, 'r')
+-    output_name = d['NAME'] + extra + '.' + output_extension
+-    log_output_name (output_name)
+-    if do_sources:
+-        output = open (output_name, 'w')
+-        do_substitution (d, template, output)
+-        output.close ()
+-    template.close ()
+-
+-def output_glue (dirname):
+-    output_makefile_fragment ()
+-    output_ifile_include (dirname)
+-
+-def output_makefile_fragment ():
+-    global do_makefile
+-    if not do_makefile:
+-        return
+-# overwrite the source, which must be writable; this should have been
+-# checked for beforehand in the top-level Makefile.gen.gen .
+-    f = open (os.path.join (os.environ.get('gendir', os.environ.get('srcdir', '.')), 'Makefile.gen'), 'w')
+-    f.write ('#\n# This file is machine generated.  All edits will be overwritten\n#\n')
+-    output_subfrag (f, 'h')
+-    output_subfrag (f, 'i')
+-    output_subfrag (f, 'cc')
+-    f.close ()
+-
+-def output_ifile_include (dirname):
+-    global do_sources
+-    if do_sources:
+-        f = open ('%s_generated.i' % (dirname,), 'w')
+-        f.write ('//\n// This file is machine generated.  All edits will be overwritten\n//\n')
+-        files = name_dict.setdefault ('i', [])
+-        files.sort ()
+-        f.write ('%{\n')
+-        for file in files:
+-            f.write ('#include <%s>\n' % (file[0:-1] + 'h',))
+-        f.write ('%}\n\n')
+-        for file in files:
+-            f.write ('%%include <%s>\n' % (file,))
+-
+-def output_subfrag (f, ext):
+-    files = name_dict.setdefault (ext, [])
+-    files.sort ()
+-    f.write ("GENERATED_%s =" % (ext.upper ()))
+-    for file in files:
+-        f.write (" \\\n\t%s" % (file,))
+-    f.write ("\n\n")
+-
+-def extract_extension (template_name):
+-    # template name is something like: GrFIRfilterXXX.h.t
+-    # we return everything between the penultimate . and .t
+-    mo = re.search (r'\.([a-z]+)\.t$', template_name)
+-    if not mo:
+-        raise ValueError, "Incorrectly formed template_name '%s'" % (template_name,)
+-    return mo.group (1)
+-
+-def open_src (name, mode):
+-    global srcdir
+-    return open (os.path.join (srcdir, name), mode)
+-
+-def do_substitution (d, in_file, out_file):
+-    def repl (match_obj):
+-        key = match_obj.group (1)
+-        # print key
+-        return d[key]
+-
+-    inp = in_file.read ()
+-    out = re.sub (r"@([a-zA-Z0-9_]+)@", repl, inp)
+-    out_file.write (out)
+-
+-
+-
+-copyright = '''/* -*- c++ -*- */
+-/*
+- * Copyright 2003,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.
+- */
+-'''
+-
+-def is_complex (code3):
+-    if i_code (code3) == 'c' or o_code (code3) == 'c':
+-        return '1'
+-    else:
+-        return '0'
+-
+-
+-def standard_dict (name, code3, package='gr'):
+-    d = {}
+-    d['NAME'] = name
+-    d['NAME_IMPL'] = name+'_impl'
+-    d['GUARD_NAME'] = 'INCLUDED_%s_%s_H' % (package.upper(), name.upper())
+-    d['GUARD_NAME_IMPL'] = 'INCLUDED_%s_%s_IMPL_H' % (package.upper(), name.upper())
+-    d['BASE_NAME'] = re.sub ('^' + package + '_', '', name)
+-    d['SPTR_NAME'] = '%s_sptr' % name
+-    d['WARNING'] = 'WARNING: this file is machine generated. Edits will be overwritten'
+-    d['COPYRIGHT'] = copyright
+-    d['TYPE'] = i_type (code3)
+-    d['I_TYPE'] = i_type (code3)
+-    d['O_TYPE'] = o_type (code3)
+-    d['TAP_TYPE'] = tap_type (code3)
+-    d['IS_COMPLEX'] = is_complex (code3)
+-    return d
+-
+-
+-def standard_dict2 (name, code3, package):
+-    d = {}
+-    d['NAME'] = name
+-    d['BASE_NAME'] = name
+-    d['GUARD_NAME'] = 'INCLUDED_%s_%s_H' % (package.upper(), name.upper())
+-    d['WARNING'] = 'WARNING: this file is machine generated. Edits will be overwritten'
+-    d['COPYRIGHT'] = copyright
+-    d['TYPE'] = i_type (code3)
+-    d['I_TYPE'] = i_type (code3)
+-    d['O_TYPE'] = o_type (code3)
+-    d['TAP_TYPE'] = tap_type (code3)
+-    d['IS_COMPLEX'] = is_complex (code3)
+-    return d
+-
+-def standard_impl_dict2 (name, code3, package):
+-    d = {}
+-    d['NAME'] = name
+-    d['IMPL_NAME'] = name
+-    d['BASE_NAME'] = name.rstrip("impl").rstrip("_")
+-    d['GUARD_NAME'] = 'INCLUDED_%s_%s_H' % (package.upper(), name.upper())
+-    d['WARNING'] = 'WARNING: this file is machine generated. Edits will be overwritten'
+-    d['COPYRIGHT'] = copyright
+-    d['FIR_TYPE'] = "fir_filter_" + code3
+-    d['CFIR_TYPE'] = "fir_filter_" + code3[0:2] + 'c'
+-    d['TYPE'] = i_type (code3)
+-    d['I_TYPE'] = i_type (code3)
+-    d['O_TYPE'] = o_type (code3)
+-    d['TAP_TYPE'] = tap_type (code3)
+-    d['IS_COMPLEX'] = is_complex (code3)
+-    return d
+diff --git a/python/qa_hdc_encoder.py b/python/qa_hdc_encoder.py
+index b57d841..7266aa9 100755
+--- a/python/qa_hdc_encoder.py
++++ b/python/qa_hdc_encoder.py
+@@ -23,19 +23,19 @@
+ from gnuradio import blocks
+ import nrsc5_swig as nrsc5
+ 
+-class qa_hdc_encoder (gr_unittest.TestCase):
++class qa_hdc_encoder(gr_unittest.TestCase):
+ 
+-    def setUp (self):
+-        self.tb = gr.top_block ()
++    def setUp(self):
++        self.tb = gr.top_block()
+ 
+-    def tearDown (self):
++    def tearDown(self):
+         self.tb = None
+ 
+-    def test_001_t (self):
++    def test_001_t(self):
+         # set up fg
+-        self.tb.run ()
++        self.tb.run()
+         # check data
+ 
+ 
+ if __name__ == '__main__':
+-    gr_unittest.run(qa_hdc_encoder, "qa_hdc_encoder.xml")
++    gr_unittest.run(qa_hdc_encoder)
+diff --git a/python/qa_l1_fm_encoder.py b/python/qa_l1_fm_encoder.py
+index 9b22e0e..3ebd761 100755
+--- a/python/qa_l1_fm_encoder.py
++++ b/python/qa_l1_fm_encoder.py
+@@ -23,19 +23,19 @@
+ from gnuradio import blocks
+ import nrsc5_swig as nrsc5
+ 
+-class qa_l1_fm_encoder (gr_unittest.TestCase):
++class qa_l1_fm_encoder(gr_unittest.TestCase):
+ 
+-    def setUp (self):
+-        self.tb = gr.top_block ()
++    def setUp(self):
++        self.tb = gr.top_block()
+ 
+-    def tearDown (self):
++    def tearDown(self):
+         self.tb = None
+ 
+-    def test_001_t (self):
++    def test_001_t(self):
+         # set up fg
+-        self.tb.run ()
++        self.tb.run()
+         # check data
+ 
+ 
+ if __name__ == '__main__':
+-    gr_unittest.run(qa_l1_fm_encoder, "qa_l1_fm_encoder.xml")
++    gr_unittest.run(qa_l1_fm_encoder)
+diff --git a/python/qa_l2_encoder.py b/python/qa_l2_encoder.py
+index cb71f27..cb48bd2 100755
+--- a/python/qa_l2_encoder.py
++++ b/python/qa_l2_encoder.py
+@@ -23,19 +23,19 @@
+ from gnuradio import blocks
+ import nrsc5_swig as nrsc5
+ 
+-class qa_l2_encoder (gr_unittest.TestCase):
++class qa_l2_encoder(gr_unittest.TestCase):
+ 
+-    def setUp (self):
+-        self.tb = gr.top_block ()
++    def setUp(self):
++        self.tb = gr.top_block()
+ 
+-    def tearDown (self):
++    def tearDown(self):
+         self.tb = None
+ 
+-    def test_001_t (self):
++    def test_001_t(self):
+         # set up fg
+-        self.tb.run ()
++        self.tb.run()
+         # check data
+ 
+ 
+ if __name__ == '__main__':
+-    gr_unittest.run(qa_l2_encoder, "qa_l2_encoder.xml")
++    gr_unittest.run(qa_l2_encoder)
+diff --git a/python/qa_psd_encoder.py b/python/qa_psd_encoder.py
+index a274a9c..944240d 100755
+--- a/python/qa_psd_encoder.py
++++ b/python/qa_psd_encoder.py
+@@ -23,19 +23,19 @@
+ from gnuradio import blocks
+ import nrsc5_swig as nrsc5
+ 
+-class qa_psd_encoder (gr_unittest.TestCase):
++class qa_psd_encoder(gr_unittest.TestCase):
+ 
+-    def setUp (self):
+-        self.tb = gr.top_block ()
++    def setUp(self):
++        self.tb = gr.top_block()
+ 
+-    def tearDown (self):
++    def tearDown(self):
+         self.tb = None
+ 
+-    def test_001_t (self):
++    def test_001_t(self):
+         # set up fg
+-        self.tb.run ()
++        self.tb.run()
+         # check data
+ 
+ 
+ if __name__ == '__main__':
+-    gr_unittest.run(qa_psd_encoder, "qa_psd_encoder.xml")
++    gr_unittest.run(qa_psd_encoder)
+diff --git a/python/qa_sis_encoder.py b/python/qa_sis_encoder.py
+index 96a83cd..485ab68 100755
+--- a/python/qa_sis_encoder.py
++++ b/python/qa_sis_encoder.py
+@@ -23,19 +23,19 @@
+ from gnuradio import blocks
+ import nrsc5_swig as nrsc5
+ 
+-class qa_sis_encoder (gr_unittest.TestCase):
++class qa_sis_encoder(gr_unittest.TestCase):
+ 
+-    def setUp (self):
+-        self.tb = gr.top_block ()
++    def setUp(self):
++        self.tb = gr.top_block()
+ 
+-    def tearDown (self):
++    def tearDown(self):
+         self.tb = None
+ 
+-    def test_001_t (self):
++    def test_001_t(self):
+         # set up fg
+-        self.tb.run ()
++        self.tb.run()
+         # check data
+ 
+ 
+ if __name__ == '__main__':
+-    gr_unittest.run(qa_sis_encoder, "qa_sis_encoder.xml")
++    gr_unittest.run(qa_sis_encoder)
+diff --git a/swig/CMakeLists.txt b/swig/CMakeLists.txt
+index 06747c5..351aa9b 100644
+--- a/swig/CMakeLists.txt
++++ b/swig/CMakeLists.txt
+@@ -1,6 +1,7 @@
+ # Copyright 2011 Free Software Foundation, Inc.
+ #
+-# This file is part of GNU Radio
++# This file was generated by gr_modtool, a tool from the GNU Radio framework
++# This file is a part of gr-nrsc5
+ #
+ # 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
+@@ -21,15 +22,15 @@
+ # Check if there is C++ code at all
+ ########################################################################
+ if(NOT nrsc5_sources)
+-	MESSAGE(STATUS "No C++ sources... skipping swig/")
+-	return()
++    MESSAGE(STATUS "No C++ sources... skipping swig/")
++    return()
+ endif(NOT nrsc5_sources)
+ 
+ ########################################################################
+ # Include swig generation macros
+ ########################################################################
+ find_package(SWIG)
+-find_package(PythonLibs 2)
++find_package(PythonLibs)
+ if(NOT SWIG_FOUND OR NOT PYTHONLIBS_FOUND)
+     return()
+ endif()
+@@ -39,11 +40,11 @@ include(GrPython)
+ ########################################################################
+ # Setup swig generation
+ ########################################################################
+-foreach(incdir ${GNURADIO_RUNTIME_INCLUDE_DIRS})
+-    list(APPEND GR_SWIG_INCLUDE_DIRS ${incdir}/gnuradio/swig)
+-endforeach(incdir)
++set(GR_SWIG_INCLUDE_DIRS $<TARGET_PROPERTY:gnuradio::runtime_swig,INTERFACE_INCLUDE_DIRECTORIES>)
++set(GR_SWIG_TARGET_DEPS gnuradio::runtime_swig)
+ 
+ set(GR_SWIG_LIBRARIES gnuradio-nrsc5)
++
+ set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/nrsc5_swig_doc.i)
+ set(GR_SWIG_DOC_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../include)
+ 
+diff --git a/swig/nrsc5_swig.i b/swig/nrsc5_swig.i
+index 99841a3..4b75b62 100644
+--- a/swig/nrsc5_swig.i
++++ b/swig/nrsc5_swig.i
+@@ -2,27 +2,26 @@
+ 
+ #define NRSC5_API
+ 
+-%include "gnuradio.i"			// the common stuff
++%include "gnuradio.i"           // the common stuff
+ 
+ //load generated python docstrings
+ %include "nrsc5_swig_doc.i"
+ 
+ %{
++#include "nrsc5/hdc_encoder.h"
+ #include "nrsc5/l1_fm_encoder.h"
+-#include "nrsc5/sis_encoder.h"
+ #include "nrsc5/l2_encoder.h"
+-#include "nrsc5/hdc_encoder.h"
+ #include "nrsc5/psd_encoder.h"
++#include "nrsc5/sis_encoder.h"
+ %}
+ 
+-
++%include "nrsc5/hdc_encoder.h"
++GR_SWIG_BLOCK_MAGIC2(nrsc5, hdc_encoder);
+ %include "nrsc5/l1_fm_encoder.h"
+ GR_SWIG_BLOCK_MAGIC2(nrsc5, l1_fm_encoder);
+-%include "nrsc5/sis_encoder.h"
+-GR_SWIG_BLOCK_MAGIC2(nrsc5, sis_encoder);
+ %include "nrsc5/l2_encoder.h"
+ GR_SWIG_BLOCK_MAGIC2(nrsc5, l2_encoder);
+-%include "nrsc5/hdc_encoder.h"
+-GR_SWIG_BLOCK_MAGIC2(nrsc5, hdc_encoder);
+ %include "nrsc5/psd_encoder.h"
+ GR_SWIG_BLOCK_MAGIC2(nrsc5, psd_encoder);
++%include "nrsc5/sis_encoder.h"
++GR_SWIG_BLOCK_MAGIC2(nrsc5, sis_encoder);
diff --git a/srcpkgs/gnuradio-nrsc5/template b/srcpkgs/gnuradio-nrsc5/template
index 88ca56272d6..5d911852847 100644
--- a/srcpkgs/gnuradio-nrsc5/template
+++ b/srcpkgs/gnuradio-nrsc5/template
@@ -1,11 +1,13 @@
 # Template file for 'gnuradio-nrsc5'
 pkgname=gnuradio-nrsc5
 version=1.0.0
-revision=2
+revision=3
 wrksrc="gr-nrsc5-${version}"
+patch_args="-Np1"
 build_style=cmake
 hostmakedepends="git autoconf automake libtool swig"
-makedepends="gnuradio-devel boost-devel libcppunit-devel python-devel"
+makedepends="gnuradio-devel boost-devel libcppunit-devel python3-devel
+ log4cpp-devel mpir-devel gsl-devel"
 short_desc="GNU Radio implementation of HD Radio"
 maintainer="Remi Pommarel <repk@triplefau.lt>"
 license="GPL-3.0-or-later"

From be4d0310ffdd2e9f0679a064062870b9fd0d09c8 Mon Sep 17 00:00:00 2001
From: Andrew Benson <abenson+void@gmail.com>
Date: Wed, 4 Sep 2019 21:19:56 -0500
Subject: [PATCH 7/7] gnuradio-rds: update to 1.1.0.

---
 srcpkgs/gnuradio-rds/template | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/srcpkgs/gnuradio-rds/template b/srcpkgs/gnuradio-rds/template
index 08947d1a975..4f54748186d 100644
--- a/srcpkgs/gnuradio-rds/template
+++ b/srcpkgs/gnuradio-rds/template
@@ -1,11 +1,11 @@
 # Template file for 'gnuradio-rds'
 pkgname=gnuradio-rds
 version=1.1.0
-revision=2
+revision=3
 wrksrc="gr-rds-${version}"
 build_style=cmake
 hostmakedepends="pkg-config swig"
-makedepends="gnuradio-devel python-devel boost-devel"
+makedepends="gnuradio-devel python3-devel boost-devel"
 short_desc="GNUradio FM RDS/TMC Transceiver"
 maintainer="Remi Pommarel <repk@triplefau.lt>"
 license="GPL-2.0-or-later"

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [WIP] gnuradio: update to 3.8.0
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-13678@inbox.vuxu.org>
                   ` (2 preceding siblings ...)
  2020-01-02 21:25 ` [PR PATCH] [Updated] " voidlinux-github
@ 2020-01-06 23:48 ` voidlinux-github
  2020-02-10  4:14 ` [PR PATCH] [Closed]: " voidlinux-github
  4 siblings, 0 replies; 5+ messages in thread
From: voidlinux-github @ 2020-01-06 23:48 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 212 bytes --]

New comment by abenson on void-packages repository

https://github.com/void-linux/void-packages/pull/13678#issuecomment-571365780

Comment:
`gnuradio-osmosdr` depends on `gnuradio-fcd`, which was dropped in 3.8.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PR PATCH] [Closed]: [WIP] gnuradio: update to 3.8.0
       [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-13678@inbox.vuxu.org>
                   ` (3 preceding siblings ...)
  2020-01-06 23:48 ` voidlinux-github
@ 2020-02-10  4:14 ` voidlinux-github
  4 siblings, 0 replies; 5+ messages in thread
From: voidlinux-github @ 2020-02-10  4:14 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 165 bytes --]

There's a closed pull request on the void-packages repository

[WIP] gnuradio: update to 3.8.0
https://github.com/void-linux/void-packages/pull/13678

Description:


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-02-10  4:14 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-13678@inbox.vuxu.org>
2019-12-29 13:23 ` [WIP] gnuradio: update to 3.8.0 voidlinux-github
2020-01-02 21:02 ` voidlinux-github
2020-01-02 21:25 ` [PR PATCH] [Updated] " voidlinux-github
2020-01-06 23:48 ` voidlinux-github
2020-02-10  4:14 ` [PR PATCH] [Closed]: " voidlinux-github

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).