mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-10-30 23:03:05 +00:00 
			
		
		
		
	Merge branch 'next' of github.com:gnss-sdr/gnss-sdr into pps_lime
This commit is contained in:
		
							
								
								
									
										79
									
								
								.github/workflows/gnss-sdr_archs.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								.github/workflows/gnss-sdr_archs.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
| # SPDX-FileCopyrightText: 2023 Carles Fernandez-Prades <carles.fernandez@cttc.es> | ||||
|  | ||||
| name: Run gnss-sdr in non-x86 archs | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|       - "**-archs" | ||||
|       - main | ||||
|   workflow_dispatch: | ||||
|  | ||||
| jobs: | ||||
|   gnss-sdr-non-x86: | ||||
|     runs-on: ubuntu-latest | ||||
|     name: ${{ matrix.distro }} ${{ matrix.arch }} ${{ matrix.compiler.name }} | ||||
|  | ||||
|     # Run steps on a matrix of archs. | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         include: | ||||
|           - arch: aarch64 | ||||
|             distro: ubuntu22.04 | ||||
|             compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } | ||||
|           - arch: aarch64 | ||||
|             distro: ubuntu22.04 | ||||
|             compiler: { name: clang-14, cc: clang-14, cxx: clang++-14 } | ||||
|           - arch: armv7 | ||||
|             distro: ubuntu22.04 | ||||
|             compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } | ||||
|           - arch: ppc64le | ||||
|             distro: ubuntu22.04 | ||||
|             compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } | ||||
|           - arch: s390x | ||||
|             distro: ubuntu22.04 | ||||
|             compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } | ||||
|           - arch: riscv64 | ||||
|             distro: ubuntu22.04 | ||||
|             compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } | ||||
|  | ||||
|     steps: | ||||
|       - uses: actions/checkout@v3.1.0 | ||||
|       - uses: uraimo/run-on-arch-action@v2.5.0 | ||||
|         name: Test in non-x86 container | ||||
|         continue-on-error: ${{ contains(fromJson('["ppc64le", "s390x"]'), matrix.arch) }} | ||||
|         id: test | ||||
|         with: | ||||
|           arch: ${{ matrix.arch }} | ||||
|           distro: ${{ matrix.distro }} | ||||
|           githubToken: ${{ github.token }} # Not required, but speeds up builds | ||||
|           setup: | | ||||
|             mkdir -p "${PWD}/testing" | ||||
|           dockerRunArgs: | | ||||
|             --volume "${PWD}:/gnss-sdr" | ||||
|           env: | | ||||
|             CC: ${{ matrix.compiler.cc }} | ||||
|             CXX: ${{ matrix.compiler.cxx }} | ||||
|           shell: /bin/sh | ||||
|           install: | | ||||
|             apt-get update -q -y | ||||
|             apt-get install -q -y ${{ matrix.compiler.name }} git ninja-build cmake \ | ||||
|             libboost-dev libboost-date-time-dev libboost-system-dev libboost-filesystem-dev \ | ||||
|             libboost-thread-dev libboost-chrono-dev libboost-serialization-dev \ | ||||
|             liblog4cpp5-dev gnuradio-dev gr-osmosdr libpugixml-dev libpcap-dev libblas-dev \ | ||||
|             liblapack-dev libarmadillo-dev libgflags-dev libgoogle-glog-dev \ | ||||
|             libgnutls-openssl-dev libmatio-dev googletest protobuf-compiler libprotobuf-dev \ | ||||
|             python3-mako liborc-0.4-dev | ||||
|           run: | | ||||
|             git config --global --add safe.directory /gnss-sdr | ||||
|             cd /gnss-sdr | ||||
|             cd testing | ||||
|             mkdir install | ||||
|             cmake -DENABLE_SYSTEM_TESTING_EXTRA=ON -DCMAKE_INSTALL_PREFIX=/gnss-sdr/testing/install -DENABLE_INSTALL_TESTS=ON .. | ||||
|             echo "Build with $(nproc) thread(s)" | ||||
|             make -j$(nproc) | ||||
|             make install | ||||
|             cd install/bin | ||||
|             ./position_test | ||||
							
								
								
									
										3
									
								
								.github/workflows/main.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/main.yml
									
									
									
									
										vendored
									
									
								
							| @@ -9,6 +9,7 @@ on: | ||||
|   push: | ||||
|     paths-ignore: | ||||
|       - "**/CITATION.cff" | ||||
|   workflow_dispatch: | ||||
|  | ||||
| jobs: | ||||
|   build-ubuntu: | ||||
| @@ -113,7 +114,7 @@ jobs: | ||||
|           ln -s $(brew --prefix llvm)/bin/clang-apply-replacements /usr/local/bin | ||||
|           ln -s $(brew --prefix llvm)/bin/run-clang-tidy /usr/local/bin | ||||
|       - name: Prepare run | ||||
|         run: cd build && cmake .. && make volk_gnsssdr_module gtest-1.12.1 core_monitor core_libs pvt_libs | ||||
|         run: cd build && cmake .. && make volk_gnsssdr_module gtest-1.13.0 core_monitor core_libs pvt_libs | ||||
|       - name: run clang-tidy | ||||
|         run: cd build && run-clang-tidy -fix | ||||
|       - name: check | ||||
|   | ||||
| @@ -4,12 +4,14 @@ on: | ||||
|   push: | ||||
|     paths: | ||||
|       - "src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/**" | ||||
|       - "CMakeLists.txt" | ||||
|   pull_request: | ||||
|     paths: | ||||
|       - "src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/**" | ||||
|       - "CMakeLists.txt" | ||||
|   workflow_dispatch: | ||||
| 
 | ||||
| name: Build volk-gnssdr on Android NDK | ||||
| name: Build volk_gnsssdr on Android NDK | ||||
| jobs: | ||||
|   build: | ||||
|     name: Build on Android NDK ${{ matrix.arch.name }} | ||||
							
								
								
									
										80
									
								
								.github/workflows/volk_gnsssdr_archs.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								.github/workflows/volk_gnsssdr_archs.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
| # SPDX-FileCopyrightText: 2023 Carles Fernandez-Prades <carles.fernandez@cttc.es> | ||||
|  | ||||
| name: Run volk_gnsssdr tests | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     paths: | ||||
|       - "src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/**" | ||||
|       - "CMakeLists.txt" | ||||
|   pull_request: | ||||
|     paths: | ||||
|       - "src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/**" | ||||
|       - "CMakeLists.txt" | ||||
|   workflow_dispatch: | ||||
|  | ||||
| jobs: | ||||
|   build-ubuntu-non-x86: | ||||
|     runs-on: ubuntu-latest | ||||
|     name: ${{ matrix.distro }} ${{ matrix.arch }} ${{ matrix.compiler.name }} | ||||
|  | ||||
|     # Run steps on a matrix of archs. | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         include: | ||||
|           - arch: aarch64 | ||||
|             distro: ubuntu22.04 | ||||
|             compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } | ||||
|           - arch: aarch64 | ||||
|             distro: ubuntu22.04 | ||||
|             compiler: { name: clang-14, cc: clang-14, cxx: clang++-14 } | ||||
|           - arch: armv7 | ||||
|             distro: ubuntu22.04 | ||||
|             compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } | ||||
|           - arch: ppc64le | ||||
|             distro: ubuntu22.04 | ||||
|             compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } | ||||
|           - arch: s390x | ||||
|             distro: ubuntu22.04 | ||||
|             compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } | ||||
|           - arch: riscv64 | ||||
|             distro: ubuntu22.04 | ||||
|             compiler: { name: g++-12, cc: gcc-12, cxx: g++-12 } | ||||
|  | ||||
|     steps: | ||||
|       - uses: actions/checkout@v3.1.0 | ||||
|       - uses: uraimo/run-on-arch-action@v2.5.0 | ||||
|         name: Build in non-x86 container | ||||
|         # continue-on-error: ${{ contains(fromJson('["ppc64le", "s390x"]'), matrix.arch) }} | ||||
|         id: build | ||||
|         with: | ||||
|           arch: ${{ matrix.arch }} | ||||
|           distro: ${{ matrix.distro }} | ||||
|           githubToken: ${{ github.token }} # Not required, but speeds up builds | ||||
|           setup: | | ||||
|             mkdir -p "${PWD}/testing" | ||||
|           dockerRunArgs: | | ||||
|             --volume "${PWD}:/volk_gnsssdr" | ||||
|           env: | | ||||
|             CC: ${{ matrix.compiler.cc }} | ||||
|             CXX: ${{ matrix.compiler.cxx }} | ||||
|           shell: /bin/sh | ||||
|           install: | | ||||
|             apt-get update -q -y | ||||
|             apt-get install -q -y git cmake python3-mako liborc-dev ${{ matrix.compiler.name }} | ||||
|           run: | | ||||
|             git config --global --add safe.directory /volk_gnsssdr | ||||
|             cd /volk_gnsssdr | ||||
|             cd testing | ||||
|             cmake ../src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/ | ||||
|             echo "Build with $(nproc) thread(s)" | ||||
|             make -j$(nproc) | ||||
|             ./cpu_features/list_cpu_features | ||||
|             ./apps/volk_gnsssdr-config-info --alignment | ||||
|             ./apps/volk_gnsssdr-config-info --avail-machines | ||||
|             ./apps/volk_gnsssdr-config-info --all-machines | ||||
|             ./apps/volk_gnsssdr-config-info --malloc | ||||
|             ./apps/volk_gnsssdr-config-info --cc | ||||
|             ctest -V | ||||
| @@ -50,7 +50,7 @@ option(ENABLE_FLEXIBAND "Enable the use of the signal source adater for the Tele | ||||
|  | ||||
| option(ENABLE_ARRAY "Enable the use of CTTC's antenna array front-end as signal source (experimental)" OFF) | ||||
|  | ||||
| option(ENABLE_ZMQ "Enable GNU Radio ZeroMQ Messaging, requires gr-zeromq" OFF) | ||||
| option(ENABLE_ZMQ "Enable GNU Radio ZeroMQ Messaging, requires gr-zeromq" ON) | ||||
|  | ||||
| # Performance analysis tools | ||||
| option(ENABLE_GPERFTOOLS "Enable linking to Gperftools libraries (tcmalloc and profiler)" OFF) | ||||
| @@ -70,8 +70,6 @@ option(ENABLE_CUDA "Enable building of processing blocks implemented with CUDA ( | ||||
| option(ENABLE_FPGA "Enable building of processing blocks implementing FPGA offloading" OFF) | ||||
|  | ||||
| # Building and packaging options | ||||
| option(ENABLE_GENERIC_ARCH "Builds a portable binary" OFF) | ||||
|  | ||||
| option(ENABLE_PACKAGING "Enable software packaging" OFF) | ||||
|  | ||||
| option(ENABLE_OWN_GLOG "Download glog and link it to gflags" OFF) | ||||
| @@ -87,7 +85,6 @@ option(ENABLE_STRIP "Create stripped binaries without debugging symbols (in Rele | ||||
| option(Boost_USE_STATIC_LIBS "Use Boost static libs" OFF) | ||||
|  | ||||
| if(ENABLE_PACKAGING) | ||||
|     set(ENABLE_GENERIC_ARCH ON) | ||||
|     set(ENABLE_ARMA_NO_DEBUG ON) | ||||
|     set(CMAKE_VERBOSE_MAKEFILE ON) | ||||
|     set(ENABLE_STRIP OFF) | ||||
| @@ -346,7 +343,7 @@ if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_ | ||||
|   CMAKE_VERSION VERSION_LESS 3.5) | ||||
|     set(GNSSSDR_GTEST_LOCAL_VERSION "1.10.x") | ||||
| else() | ||||
|     set(GNSSSDR_GTEST_LOCAL_VERSION "1.12.1") | ||||
|     set(GNSSSDR_GTEST_LOCAL_VERSION "1.13.0") | ||||
| endif() | ||||
| set(GNSSSDR_GNSS_SIM_LOCAL_VERSION "master") | ||||
| if(CMAKE_VERSION VERSION_GREATER 3.17.0) | ||||
| @@ -444,7 +441,6 @@ endif() | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ################################################################################ | ||||
| # Set minimal C and C++ standards | ||||
| ################################################################################ | ||||
| @@ -503,23 +499,19 @@ endif() | ||||
| ################################################################################ | ||||
| # Check if the compiler defines the architecture as ARM | ||||
| ################################################################################ | ||||
| if(CMAKE_SYSTEM_PROCESSOR MATCHES "(^arm)|(^aarch64)") | ||||
|     set(IS_ARM TRUE) | ||||
| endif() | ||||
| if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")) | ||||
|     if(CMAKE_CROSSCOMPILING) | ||||
|         set(IS_ARM TRUE) | ||||
|         if(NOT CMAKE_NO_SYSTEM_FROM_IMPORTED) | ||||
|             set(CMAKE_NO_SYSTEM_FROM_IMPORTED TRUE) | ||||
|         endif() | ||||
|     else() | ||||
|         if(NOT IS_ARM) | ||||
|             include(TestForARM) | ||||
|         endif() | ||||
|     endif() | ||||
| else() | ||||
|     if(CMAKE_SYSTEM_PROCESSOR MATCHES "(^aarch64)|(arm64)") | ||||
|         set(IS_ARM TRUE) | ||||
|     endif() | ||||
| endif() | ||||
|  | ||||
|  | ||||
|  | ||||
| ################################################################################ | ||||
| # pkg-config - Helper tool used when compiling applications and libraries. | ||||
| ################################################################################ | ||||
| @@ -528,6 +520,7 @@ set(FPHSA_NAME_MISMATCHED ON) | ||||
| find_package(PkgConfig) | ||||
|  | ||||
|  | ||||
|  | ||||
| ################################################################################ | ||||
| # Find the POSIX thread (pthread) libraries | ||||
| ################################################################################ | ||||
| @@ -622,9 +615,18 @@ if(ENABLE_UHD) | ||||
|     endif() | ||||
| endif() | ||||
|  | ||||
| find_package(ZEROMQ) | ||||
| set_package_properties(ZEROMQ PROPERTIES | ||||
|     PURPOSE "Used by the ZMQ_Signal_Source." | ||||
|     TYPE OPTIONAL | ||||
| ) | ||||
| if(ENABLE_ZMQ) | ||||
|     if(NOT ZEROMQ_FOUND) | ||||
|         set(ENABLE_ZMQ OFF) | ||||
|     else() | ||||
|         list(APPEND GR_REQUIRED_COMPONENTS ZEROMQ) | ||||
|     endif() | ||||
| endif() | ||||
|  | ||||
| find_package(GNURADIO) | ||||
| set_package_properties(GNURADIO PROPERTIES | ||||
| @@ -1195,7 +1197,7 @@ if(NOT VOLKGNSSSDR_FOUND) | ||||
|     include(GNUInstallDirs) | ||||
|     set(SUPPORTED_CPU_FEATURES_ARCH FALSE) | ||||
|     if(CMAKE_SYSTEM_PROCESSOR MATCHES | ||||
|         "(^mips)|(^arm)|(^aarch64)|(x86_64)|(AMD64|amd64)|(^i.86$)|(^powerpc)|(^ppc)|(^s390x)") | ||||
|         "(^mips)|(^arm)|(^aarch64)|(x86_64)|(AMD64|amd64)|(^i.86$)|(^powerpc)|(^ppc)|(^s390x)|^riscv") | ||||
|         set(SUPPORTED_CPU_FEATURES_ARCH TRUE) | ||||
|     endif() | ||||
|     if(${CMAKE_INSTALL_LIBDIR} MATCHES lib64) | ||||
| @@ -1234,11 +1236,14 @@ if(NOT VOLKGNSSSDR_FOUND) | ||||
|                 set_package_properties(CPUFEATURES PROPERTIES | ||||
|                     DESCRIPTION "A cross platform C99 library to get CPU features at runtime (version: ${CPUFEATURES_VERSION})" | ||||
|                 ) | ||||
|                 if((CMAKE_SYSTEM_PROCESSOR MATCHES "(^s390x)|^riscv") AND (CPUFEATURES_VERSION VERSION_LESS "0.8.0")) # detect cpu_features without s390x / riscv support | ||||
|                     set(ENABLE_CPUFEATURES OFF) | ||||
|                 endif() | ||||
|             else() | ||||
|                 set_package_properties(CPUFEATURES PROPERTIES | ||||
|                     DESCRIPTION "A cross platform C99 library to get CPU features at runtime" | ||||
|                 ) | ||||
|                 if(VOLK_VERSION AND VOLK_VERSION VERSION_GREATER "2.3" AND VOLK_VERSION VERSION_LESS "2.5.2") # detect "hidden" cpu_features 0.6.0 | ||||
|                 if(DEFINED VOLK_VERSION AND VOLK_VERSION VERSION_GREATER "2.3") # avoid clash with volk's cpufeatures. | ||||
|                     set(ENABLE_CPUFEATURES OFF) | ||||
|                 else() | ||||
|                     set_package_properties(CPUFEATURES PROPERTIES | ||||
| @@ -1807,6 +1812,9 @@ else() | ||||
|     if(NOT BLA_VENDOR) | ||||
|         set(BLA_VENDOR "Generic") | ||||
|     endif() | ||||
|     if(NOT CMAKE_CROSSCOMPILING AND NOT DEFINED BLA_PREFER_PKGCONFIG) | ||||
|         set(BLA_PREFER_PKGCONFIG ON)  # Required by riscv64 arch | ||||
|     endif() | ||||
|     find_package(BLAS) | ||||
|     set_package_properties(BLAS PROPERTIES | ||||
|         URL "https://www.netlib.org/blas/" | ||||
| @@ -2905,9 +2913,9 @@ if(ENABLE_OPENCL) | ||||
|             message(STATUS " You can disable OpenCL use by doing 'cmake -DENABLE_OPENCL=OFF ..'") | ||||
|         endif() | ||||
|     endif() | ||||
|     if(ENABLE_GENERIC_ARCH) | ||||
|     if(ENABLE_PACKAGING) | ||||
|         set(ENABLE_OPENCL OFF) | ||||
|         message(STATUS "ENABLE_GENERIC_ARCH is set to ON so the use of OpenCL has been disabled.") | ||||
|         message(STATUS "ENABLE_PACKAGING is set to ON so the use of OpenCL has been disabled.") | ||||
|     endif() | ||||
|     if(NOT OPENCL_FOUND) | ||||
|         message(STATUS "Processing blocks using OpenCL will not be built.") | ||||
| @@ -3286,36 +3294,6 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") | ||||
|     endif() | ||||
| endif() | ||||
|  | ||||
| # Processor-architecture related flags | ||||
| # See https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html | ||||
| if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND NOT WIN32) | ||||
|     if(NOT ENABLE_GENERIC_ARCH) | ||||
|         if(IS_ARM) | ||||
|             # ARM-specific options | ||||
|             # See https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html | ||||
|             if(NOT CMAKE_CROSSCOMPILING AND NOT CMAKE_TOOLCHAIN_FILE) | ||||
|                 add_compile_options(-mtune=native) | ||||
|             endif() | ||||
|         else() | ||||
|             if(NOT ENABLE_CUDA) | ||||
|                 add_compile_options(-march=native) | ||||
|             endif() | ||||
|         endif() | ||||
|     endif() | ||||
| endif() | ||||
| if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") | ||||
|     if(NOT ENABLE_GENERIC_ARCH) | ||||
|         if(IS_ARM) | ||||
|             # ARM-specific options | ||||
|             if(NOT CMAKE_CROSSCOMPILING AND NOT CMAKE_TOOLCHAIN_FILE) | ||||
|                 add_compile_options(-mcpu=native) | ||||
|             endif() | ||||
|         else() | ||||
|             add_compile_options(-march=native) | ||||
|         endif() | ||||
|     endif() | ||||
| endif() | ||||
|  | ||||
|  | ||||
|  | ||||
| ################################################################################ | ||||
| @@ -3389,7 +3367,6 @@ add_feature_info(ENABLE_OPENCL ENABLE_OPENCL "Enables GPS_L1_CA_PCPS_OpenCl_Acqu | ||||
| add_feature_info(ENABLE_CUDA ENABLE_CUDA "Enables GPS_L1_CA_DLL_PLL_Tracking_GPU (experimental). Requires CUDA.") | ||||
| add_feature_info(ENABLE_FPGA ENABLE_FPGA "Enables building of processing blocks for FPGA offloading.") | ||||
| add_feature_info(ENABLE_ARMA_NO_DEBUG ENABLE_ARMA_NO_DEBUG "Enables passing the ARMA_NO_DEBUG macro to Armadillo, hence disabling bound checking.") | ||||
| add_feature_info(ENABLE_GENERIC_ARCH ENABLE_GENERIC_ARCH "When disabled, flags such as '-march=native' are passed to the compiler.") | ||||
| add_feature_info(ENABLE_PACKAGING ENABLE_PACKAGING "Enables software packaging.") | ||||
| add_feature_info(ENABLE_OWN_GLOG ENABLE_OWN_GLOG "Forces the downloading and building of Google glog.") | ||||
| add_feature_info(ENABLE_OWN_ARMADILLO ENABLE_OWN_ARMADILLO "Forces the downloading and building of Armadillo.") | ||||
|   | ||||
							
								
								
									
										61
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								README.md
									
									
									
									
									
								
							| @@ -64,11 +64,12 @@ information about this open-source, software-defined GNSS receiver. | ||||
|    1. [GNU/Linux](#gnulinux) | ||||
|       1. [Alternative 1: Install dependencies using software packages](#alternative-1-install-dependencies-using-software-packages) | ||||
|          1. [Debian / Ubuntu](#debian--ubuntu) | ||||
|          2. [Arch Linux](#arch-linux) | ||||
|          3. [CentOS](#centos) | ||||
|          4. [Fedora](#fedora) | ||||
|          5. [openSUSE](#opensuse) | ||||
|          6. [Rocky Linux](#rocky-linux) | ||||
|          2. [AlmaLinux](#almalinux) | ||||
|          3. [Arch Linux](#arch-linux) | ||||
|          4. [CentOS](#centos) | ||||
|          5. [Fedora](#fedora) | ||||
|          6. [openSUSE](#opensuse) | ||||
|          7. [Rocky Linux](#rocky-linux) | ||||
|       2. [Alternative 2: Install dependencies using PyBOMBS](#alternative-2-install-dependencies-using-pybombs) | ||||
|       3. [Manual installation of other required dependencies](#manual-installation-of-other-required-dependencies) | ||||
|          1. [Install Armadillo, a C++ linear algebra library](#install-armadillo-a-c-linear-algebra-library) | ||||
| @@ -85,7 +86,6 @@ information about this open-source, software-defined GNSS receiver. | ||||
|          2. [Build FMCOMMS2 based SDR Hardware support (OPTIONAL)](#build-fmcomms2-based-sdr-hardware-support-optional) | ||||
|          3. [Build OpenCL support (OPTIONAL)](#build-opencl-support-optional) | ||||
|          4. [Build CUDA support (OPTIONAL)](#build-cuda-support-optional) | ||||
|          5. [Build a portable binary](#build-a-portable-binary) | ||||
|    2. [macOS](#macos) | ||||
|       1. [Macports](#macports) | ||||
|       2. [Homebrew](#homebrew) | ||||
| @@ -142,6 +142,7 @@ This section describes how to set up the compilation environment in GNU/Linux or | ||||
|     Motorola (now Freescale), and Apple. | ||||
|   - ppc64: 64-bit big-endian PowerPC architecture. | ||||
|   - ppc64el: 64-bit little-endian PowerPC architecture. | ||||
|   - riscv64: 64-bit RISC-V open standard instruction set architecture. | ||||
|   - s390x: IBM System z architecture for mainframe computers. | ||||
|  | ||||
| Older distribution releases might work as well, but you will need GCC 4.7 or | ||||
| @@ -201,6 +202,26 @@ need `python-six`. | ||||
| Once you have installed these packages, you can jump directly to | ||||
| [download the source code and build GNSS-SDR](#clone-gnss-sdrs-git-repository). | ||||
|  | ||||
| #### AlmaLinux | ||||
|  | ||||
| If you are using AlmaLinux: | ||||
|  | ||||
| ``` | ||||
| # dnf update -y | ||||
| # dnf install -y 'dnf-command(config-manager)' | ||||
| # dnf config-manager --set-enabled powertools | ||||
| # dnf install -y epel-release | ||||
| # dnf install -y make gcc gcc-c++ kernel-devel cmake git boost-devel \ | ||||
|       boost-date-time boost-system boost-thread boost-chrono \ | ||||
|       boost-serialization log4cpp-devel gmp-devel uhd-devel gnuradio-devel \ | ||||
|       pugixml-devel matio-devel protobuf-devel glog-devel libpcap-devel \ | ||||
|       blas-devel lapack-devel armadillo-devel openssl-devel python3-mako \ | ||||
|       libarchive | ||||
| ``` | ||||
|  | ||||
| Once you have installed these packages, you can jump directly to | ||||
| [download the source code and build GNSS-SDR](#clone-gnss-sdrs-git-repository). | ||||
|  | ||||
| #### Arch Linux | ||||
|  | ||||
| If you are using Arch Linux: | ||||
| @@ -496,8 +517,8 @@ $ sudo ldconfig | ||||
| #### Download [GoogleTest](https://github.com/google/googletest "Googletest Homepage") | ||||
|  | ||||
| ``` | ||||
| $ wget https://github.com/google/googletest/archive/release-1.12.1.zip | ||||
| $ unzip release-1.12.1.zip | ||||
| $ wget https://github.com/google/googletest/archive/refs/tags/v1.13.0.zip | ||||
| $ unzip v1.13.0.zip | ||||
| ``` | ||||
|  | ||||
| Please **DO NOT build or install** Google Test. Every user needs to compile | ||||
| @@ -521,10 +542,10 @@ downloaded resides. Just type in your terminal (or add it to your | ||||
| `$HOME/.bashrc` file for a permanent solution) the following line: | ||||
|  | ||||
| ``` | ||||
| export GTEST_DIR=/home/username/googletest-release-1.12.1 | ||||
| export GTEST_DIR=/home/username/googletest-1.13.0 | ||||
| ``` | ||||
|  | ||||
| changing `/home/username/googletest-release-1.12.1` by the actual path where you | ||||
| changing `/home/username/googletest-1.13.0` by the actual path where you | ||||
| unpacked Google Test. If the CMake script does not find that folder, or the | ||||
| environment variable is not defined, or the source code is not installed by a | ||||
| package, then it will download a fresh copy of the Google Test source code and | ||||
| @@ -790,26 +811,6 @@ $ sudo make install | ||||
| Of course, you will also need a GPU that | ||||
| [supports CUDA](https://developer.nvidia.com/cuda-gpus "CUDA GPUs"). | ||||
|  | ||||
| #### Build a portable binary | ||||
|  | ||||
| In order to build an executable that not depends on the specific SIMD | ||||
| instruction set that is present in the processor of the compiling machine, so | ||||
| other users can execute it in other machines without those particular sets, use: | ||||
|  | ||||
| ``` | ||||
| $ cmake -DENABLE_GENERIC_ARCH=ON .. | ||||
| $ make | ||||
| $ sudo make install | ||||
| ``` | ||||
|  | ||||
| Using this option, all SIMD instructions are exclusively accessed via VOLK, | ||||
| which automatically includes versions of each function for different SIMD | ||||
| instruction sets, then detects at runtime which to use, or if there are none, | ||||
| substitutes a generic, non-SIMD implementation. | ||||
|  | ||||
| More details can be found in our tutorial about | ||||
| [GNSS-SDR configuration options at building time](https://gnss-sdr.org/docs/tutorials/using-git/ "Configuration options at building time"). | ||||
|  | ||||
| ## macOS | ||||
|  | ||||
| GNSS-SDR can be built on macOS (or the former Mac OS X), starting from 10.9 | ||||
|   | ||||
| @@ -20,7 +20,7 @@ if(DEFINED ENV{GFORTRAN_ROOT}) | ||||
|     ) | ||||
| endif() | ||||
|  | ||||
| set(GCC_MAJOR_SERIES 12 11 10 9 8 7 6 5) | ||||
| set(GCC_MAJOR_SERIES 13 12 11 10 9 8 7 6 5) | ||||
| set(GCC4_SERIES 4.9.1 4.9 4.8.3 4.8.1 4.7.2 4.7 4.8.2 4.8 4.7 4.6 4.5 4.4.4 4.4) | ||||
| set(GCC_SERIES ${GCC_MAJOR_SERIES} ${GCC4_SERIES}) | ||||
|  | ||||
|   | ||||
							
								
								
									
										82
									
								
								cmake/Modules/FindZEROMQ.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								cmake/Modules/FindZEROMQ.cmake
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | ||||
| # GNSS-SDR is a Global Navigation Satellite System software-defined receiver. | ||||
| # This file is part of GNSS-SDR. | ||||
| # | ||||
| # SPDX-FileCopyrightText: 2023 C. Fernandez-Prades cfernandez(at)cttc.es | ||||
| # SPDX-License-Identifier: BSD-3-Clause | ||||
|  | ||||
| # | ||||
| # Provides the following imported target: | ||||
| # ZeroMQ::ZeroMQ | ||||
| # | ||||
|  | ||||
| if(NOT COMMAND feature_summary) | ||||
|     include(FeatureSummary) | ||||
| endif() | ||||
|  | ||||
| if(NOT PKG_CONFIG_FOUND) | ||||
|     include(FindPkgConfig) | ||||
| endif() | ||||
|  | ||||
| find_package(PkgConfig) | ||||
| pkg_check_modules(PC_ZEROMQ "libzmq") | ||||
|  | ||||
| find_path(ZEROMQ_INCLUDE_DIRS | ||||
|     NAMES zmq.hpp | ||||
|     HINTS ${PC_ZEROMQ_INCLUDE_DIR} ${CMAKE_INSTALL_PREFIX}/include | ||||
|     PATHS /usr/local/include /usr/include /opt/local/include | ||||
| ) | ||||
|  | ||||
| find_library(ZEROMQ_LIBRARIES | ||||
|     NAMES zmq libzmq.so.5 ${ZEROMQ_LIBRARY_NAME} | ||||
|     HINTS ${PC_ZEROMQ_LIBDIR} ${CMAKE_INSTALL_PREFIX}/lib ${CMAKE_INSTALL_PREFIX}/lib64 | ||||
|     PATHS /usr/lib | ||||
|         /usr/lib64 | ||||
|         /usr/lib/alpha-linux-gnu | ||||
|         /usr/lib/x86_64-linux-gnu | ||||
|         /usr/lib/aarch64-linux-gnu | ||||
|         /usr/lib/arm-linux-gnueabi | ||||
|         /usr/lib/arm-linux-gnueabihf | ||||
|         /usr/lib/hppa-linux-gnu | ||||
|         /usr/lib/i386-linux-gnu | ||||
|         /usr/lib/m68k-linux-gnu | ||||
|         /usr/lib/mips-linux-gnu | ||||
|         /usr/lib/mips64el-linux-gnuabi64 | ||||
|         /usr/lib/mipsel-linux-gnu | ||||
|         /usr/lib/powerpc-linux-gnuspe | ||||
|         /usr/lib/powerpc64-linux-gnu | ||||
|         /usr/lib/powerpc64le-linux-gnu | ||||
|         /usr/lib/riscv64-linux-gnu | ||||
|         /usr/lib/s390x-linux-gnu | ||||
|         /usr/lib/sh4-linux-gnu | ||||
|         /usr/lib/sparc64-linux-gnu | ||||
|         /usr/lib/x86_64-linux-gnux32 | ||||
|         /usr/lib/x86_64-kfreebsd-gnu | ||||
|         /usr/lib/i386-kfreebsd-gnu | ||||
|         /usr/local/lib | ||||
|         /usr/local/lib64 | ||||
|         /opt/local/lib | ||||
| ) | ||||
|  | ||||
| include(FindPackageHandleStandardArgs) | ||||
| # This is just to detect presence, include files not required | ||||
| find_package_handle_standard_args(ZEROMQ DEFAULT_MSG ZEROMQ_LIBRARIES) | ||||
| mark_as_advanced(ZEROMQ_LIBRARIES ZEROMQ_INCLUDE_DIRS) | ||||
|  | ||||
| set_package_properties(ZEROMQ PROPERTIES URL "https://zeromq.org/") | ||||
| if(PC_ZEROMQ_VERSION) | ||||
|     set_package_properties(ZEROMQ PROPERTIES | ||||
|         DESCRIPTION "An open-source universal messaging library (found: v${PC_ZEROMQ_VERSION})" | ||||
|     ) | ||||
| else() | ||||
|     set_package_properties(ZEROMQ PROPERTIES | ||||
|         DESCRIPTION "An open-source universal messaging library" | ||||
|     ) | ||||
| endif() | ||||
|  | ||||
| if(ZEROMQ_FOUND AND ZEROMQ_INCLUDE_DIRS AND NOT TARGET ZeroMQ::ZeroMQ) | ||||
|     add_library(ZeroMQ::ZeroMQ INTERFACE IMPORTED) | ||||
|     set_target_properties(ZeroMQ::ZeroMQ PROPERTIES | ||||
|         INTERFACE_INCLUDE_DIRECTORIES "${ZEROMQ_INCLUDE_DIRS}" | ||||
|         INTERFACE_LINK_LIBRARIES "${ZEROMQ_LIBRARIES}" | ||||
|     ) | ||||
| endif() | ||||
| @@ -12,13 +12,22 @@ | ||||
| # - cmd an additional command to run | ||||
| # - have the result variable to set | ||||
| ######################################################################## | ||||
| macro(GNSSSDR_PYTHON_CHECK_MODULE_RAW desc python_code have) | ||||
| macro(GNSSSDR_PYTHON_CHECK_MODULE desc mod cmd have) | ||||
|     message(STATUS "Python checking for ${desc}") | ||||
|     execute_process( | ||||
|         COMMAND ${PYTHON_EXECUTABLE} -c "${python_code}" | ||||
|         COMMAND ${PYTHON_EXECUTABLE} -c " | ||||
| ######################################### | ||||
| try: import ${mod} | ||||
| except: | ||||
|     try: ${mod} | ||||
|     except: exit(-1) | ||||
| try: assert ${cmd} | ||||
| except: exit(-1) | ||||
| #########################################" | ||||
|         OUTPUT_QUIET ERROR_QUIET | ||||
|         RESULT_VARIABLE return_code | ||||
|         RESULT_VARIABLE ${have} | ||||
|     ) | ||||
|     if(return_code EQUAL 0) | ||||
|     if(${have} EQUAL 0) | ||||
|         message(STATUS "Python checking for ${desc} - found") | ||||
|         set(${have} TRUE) | ||||
|     else() | ||||
| @@ -27,19 +36,6 @@ macro(GNSSSDR_PYTHON_CHECK_MODULE_RAW desc python_code have) | ||||
|     endif() | ||||
| endmacro() | ||||
|  | ||||
| macro(GNSSSDR_PYTHON_CHECK_MODULE desc mod cmd have) | ||||
|     gnsssdr_python_check_module_raw( | ||||
|         "${desc}" " | ||||
| ######################################### | ||||
| try: | ||||
|     import ${mod} | ||||
|     assert ${cmd} | ||||
| except (ImportError, AssertionError): exit(-1) | ||||
| except: pass | ||||
| #########################################" | ||||
|     "${have}") | ||||
| endmacro() | ||||
|  | ||||
|  | ||||
| ######################################################################## | ||||
| # Setup the python interpreter: | ||||
|   | ||||
| @@ -1,115 +0,0 @@ | ||||
| # GNSS-SDR is a Global Navigation Satellite System software-defined receiver. | ||||
| # This file is part of GNSS-SDR. | ||||
| # | ||||
| # SPDX-FileCopyrightText: 2011-2020 C. Fernandez-Prades cfernandez(at)cttc.es | ||||
| # SPDX-License-Identifier: BSD-3-Clause | ||||
|  | ||||
| ############################################################################## | ||||
| # check if the compiler defines the architecture as ARM  and set the | ||||
| # version, if found. | ||||
| # | ||||
| # - Anthony Arnold | ||||
| ############################################################################## | ||||
|  | ||||
| if(__TEST_FOR_ARM_INCLUDED) | ||||
|     return() | ||||
| endif() | ||||
| set(__TEST_FOR_ARM_INCLUDED TRUE) | ||||
|  | ||||
| # Function checks if the input string defines ARM version and sets the | ||||
| # output variable if found. | ||||
| function(check_arm_version ppdef input_string version output_var) | ||||
|     string(REGEX MATCH "${ppdef}"  _VERSION_MATCH "${input_string}") | ||||
|     if(NOT _VERSION_MATCH STREQUAL "") | ||||
|         set(${output_var} "${version}" PARENT_SCOPE) | ||||
|     endif() | ||||
| endfunction() | ||||
|  | ||||
| message(STATUS "Checking for ARM") | ||||
|  | ||||
| set(IS_ARM FALSE) | ||||
| set(ARM_VERSION "") | ||||
|  | ||||
| if(ENABLE_PACKAGING) | ||||
|     set(VERBOSE_BUILDING "-v") | ||||
| else() | ||||
|     set(VERBOSE_BUILDING "") | ||||
| endif() | ||||
|  | ||||
| if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") | ||||
|     execute_process(COMMAND echo "int main(){}" | ||||
|         COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} -dM ${VERBOSE_BUILDING} -E - | ||||
|         OUTPUT_VARIABLE TEST_FOR_ARM_RESULTS | ||||
|     ) | ||||
|  | ||||
|     string(REGEX MATCH "__arm" ARM_FOUND "${TEST_FOR_ARM_RESULTS}") | ||||
|     if(ARM_FOUND STREQUAL "") | ||||
|         string(REGEX MATCH "__aarch64" ARM_FOUND "${TEST_FOR_ARM_RESULTS}") | ||||
|     endif() | ||||
|     if(ARM_FOUND STREQUAL "") | ||||
|         if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm") | ||||
|             set(ARM_FOUND ${CMAKE_HOST_SYSTEM_PROCESSOR}) | ||||
|         endif() | ||||
|     endif() | ||||
|  | ||||
|     if(NOT ARM_FOUND STREQUAL "") | ||||
|         set(IS_ARM TRUE) | ||||
|         message(STATUS "ARM system detected.") | ||||
|  | ||||
|         # detect the version | ||||
|         check_arm_version("__ARM_ARCH_2__" ${TEST_FOR_ARM_RESULTS} "armv2" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_2A__" ${TEST_FOR_ARM_RESULTS} "armv2a" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_3__" ${TEST_FOR_ARM_RESULTS} "armv3" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_3M__" ${TEST_FOR_ARM_RESULTS} "armv3m" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_4__" ${TEST_FOR_ARM_RESULTS} "armv4" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_4T__" ${TEST_FOR_ARM_RESULTS} "armv4t" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_5__" ${TEST_FOR_ARM_RESULTS} "armv5" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_5T__" ${TEST_FOR_ARM_RESULTS} "armv5t" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_5E__" ${TEST_FOR_ARM_RESULTS} "armv5e" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_5TE__" ${TEST_FOR_ARM_RESULTS} "armv5te" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_6__" ${TEST_FOR_ARM_RESULTS} "armv6" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_6J__" ${TEST_FOR_ARM_RESULTS} "armv6j" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_6K__" ${TEST_FOR_ARM_RESULTS} "armv6k" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_6T2__" ${TEST_FOR_ARM_RESULTS} "armv6t2" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_6Z__" ${TEST_FOR_ARM_RESULTS} "armv6z" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_6ZK__" ${TEST_FOR_ARM_RESULTS} "armv6zk" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_6M__" ${TEST_FOR_ARM_RESULTS} "armv6-m" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_7__" ${TEST_FOR_ARM_RESULTS} "armv7" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_7A__" ${TEST_FOR_ARM_RESULTS} "armv7-a" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_7M__" ${TEST_FOR_ARM_RESULTS} "armv7-m" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_7R__" ${TEST_FOR_ARM_RESULTS} "armv7-r" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_7EM_" ${TEST_FOR_ARM_RESULTS} "armv7e-m" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_7VE__" ${TEST_FOR_ARM_RESULTS} "armv7ve" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_8A__" ${TEST_FOR_ARM_RESULTS} "armv8-a" ARM_VERSION) | ||||
|         check_arm_version("__ARM_ARCH_8A" ${TEST_FOR_ARM_RESULTS} "armv8-a" ARM_VERSION) | ||||
|  | ||||
|         # anything else just define as unknown | ||||
|         if(ARM_VERSION STREQUAL "") | ||||
|             message(STATUS "Couldn't detect ARM version.") | ||||
|             set(ARM_VERSION "unknown") | ||||
|         else() | ||||
|             message(STATUS "ARM version ${ARM_VERSION} detected.") | ||||
|         endif() | ||||
|     else() | ||||
|         message(STATUS "System is not ARM.") | ||||
|     endif() | ||||
| elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") | ||||
|     if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm") | ||||
|         set(IS_ARM TRUE) | ||||
|         set(ARM_VERSION ${CMAKE_HOST_SYSTEM_PROCESSOR}) | ||||
|         message(STATUS "ARM version ${ARM_VERSION} detected.") | ||||
|     endif() | ||||
| elseif(CMAKE_CXX_COMPILER_ID STREQUAL "ARMClang") | ||||
|     set(IS_ARM TRUE) | ||||
|     set(ARM_VERSION "arm") | ||||
|     if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm") | ||||
|         set(ARM_VERSION ${CMAKE_HOST_SYSTEM_PROCESSOR}) | ||||
|         message(STATUS "ARM version ${ARM_VERSION} detected.") | ||||
|     endif() | ||||
| else() | ||||
|     message(STATUS "Not detecting ARM on non-GNUCXX or non-Clang compiler. Defaulting to false.") | ||||
|     message(STATUS "If you are compiling for ARM, set -DIS_ARM=ON manually.") | ||||
| endif() | ||||
|  | ||||
| set(IS_ARM ${IS_ARM} CACHE BOOL "Compiling for ARM") | ||||
| set(ARM_VERSION ${ARM_VERSION} CACHE STRING "ARM version") | ||||
| @@ -70,11 +70,14 @@ All notable changes to GNSS-SDR will be documented in this file. | ||||
| - Improved passing of compiler flags to `volk_gnsssdr` if the corresponding | ||||
|   environment variables are defined. This fixes warnings in some packaging | ||||
|   systems. | ||||
| - Improved support for the RISC-V architecture. | ||||
| - Test files are now donwloaded at configuration time instead of being included | ||||
|   in the source tree. This allows for a smaller package and fixes Lintian | ||||
|   `very-long-line-length-in-source-file` warnings since those files were not | ||||
|   recognized as binaries. The configuration flag `-DENABLE_PACKAGING=ON` passed | ||||
|   to CMake deactivates file downloading. | ||||
| - The `ENABLE_GENERIC_ARCH` building option was removed, simplifying the process | ||||
|   of buiding the software in non-x86 processor architectures. | ||||
|  | ||||
| ### Improvements in Usability: | ||||
|  | ||||
|   | ||||
| @@ -258,7 +258,7 @@ endif() | ||||
|  | ||||
| # cpu_features - sensible defaults, user settable option | ||||
| if(CMAKE_SYSTEM_PROCESSOR MATCHES | ||||
|     "(^mips)|(^arm)|(^aarch64)|(x86_64)|(AMD64|amd64)|(^i.86$)|(^powerpc)|(^ppc)|(^s390x)") | ||||
|     "(^mips)|(^arm)|(^aarch64)|(x86_64)|(AMD64|amd64)|(^i.86$)|(^powerpc)|(^ppc)|(^s390x)|^riscv") | ||||
|     option(VOLK_CPU_FEATURES "volk-gnsssdr uses cpu_features" ON) | ||||
| else() | ||||
|     option(VOLK_CPU_FEATURES "volk-gnsssdr uses cpu_features" OFF) | ||||
| @@ -266,7 +266,13 @@ endif() | ||||
|  | ||||
| if(CMAKE_VERSION VERSION_GREATER 3.0 AND VOLK_CPU_FEATURES) | ||||
|     find_package(CPUFEATURES) | ||||
|     if(CPUFEATURES_FOUND AND (CMAKE_SYSTEM_PROCESSOR MATCHES "(^s390x)|^riscv") AND (CPUFEATURES_VERSION VERSION_LESS "0.8.0")) | ||||
|         set(USE_CPU_FEATURES OFF) | ||||
|         unset(CPUFEATURES_FOUND CACHE) | ||||
|         message(STATUS "Building volk-gnsssdr without cpu_features, installed version v${CPUFEATURES_VERSION} does not support the ${CMAKE_SYSTEM_PROCESSOR} architecture") | ||||
|     else() | ||||
|         set(USE_CPU_FEATURES ON) | ||||
|     endif() | ||||
|     if(NOT CPUFEATURES_FOUND) | ||||
|         message(STATUS "Building volk-gnsssdr with cpu_features") | ||||
|         set(BUILD_TESTING OFF CACHE BOOL "Build cpu_features without tests." FORCE) | ||||
| @@ -290,13 +296,8 @@ endif() | ||||
|  | ||||
| # Python | ||||
| include(VolkPython) # sets PYTHON_EXECUTABLE | ||||
| volk_python_check_module("python >= 2.7" sys "sys.version.split()[0] >= '2.7'" PYTHON_MIN_VER_FOUND) | ||||
| volk_python_check_module("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND) | ||||
| if(Python2_VERSION OR (PYTHON_VERSION_STRING VERSION_LESS "3.0")) | ||||
|     volk_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND) | ||||
| endif() | ||||
|  | ||||
| if(NOT PYTHON_MIN_VER_FOUND) | ||||
| if(NOT PYTHON_EXECUTABLE) | ||||
|     message(FATAL_ERROR "Python 2.7 or greater required to build VOLK_GNSSSDR") | ||||
| endif() | ||||
|  | ||||
|   | ||||
| @@ -16,13 +16,22 @@ set(__INCLUDED_VOLK_PYTHON_CMAKE TRUE) | ||||
| # - cmd an additional command to run | ||||
| # - have the result variable to set | ||||
| ######################################################################## | ||||
| macro(VOLK_PYTHON_CHECK_MODULE_RAW desc python_code have) | ||||
| macro(VOLK_PYTHON_CHECK_MODULE desc mod cmd have) | ||||
|     message(STATUS "Python checking for ${desc}") | ||||
|     execute_process( | ||||
|         COMMAND ${PYTHON_EXECUTABLE} -c "${python_code}" | ||||
|         COMMAND ${PYTHON_EXECUTABLE} -c " | ||||
| ######################################### | ||||
| try: import ${mod} | ||||
| except: | ||||
|     try: ${mod} | ||||
|     except: exit(-1) | ||||
| try: assert ${cmd} | ||||
| except: exit(-1) | ||||
| #########################################" | ||||
|         OUTPUT_QUIET ERROR_QUIET | ||||
|         RESULT_VARIABLE return_code | ||||
|         RESULT_VARIABLE ${have} | ||||
|     ) | ||||
|     if(return_code EQUAL 0) | ||||
|     if(${have} EQUAL 0) | ||||
|         message(STATUS "Python checking for ${desc} - found") | ||||
|         set(${have} TRUE) | ||||
|     else() | ||||
| @@ -31,19 +40,6 @@ macro(VOLK_PYTHON_CHECK_MODULE_RAW desc python_code have) | ||||
|     endif() | ||||
| endmacro() | ||||
|  | ||||
| macro(VOLK_PYTHON_CHECK_MODULE desc mod cmd have) | ||||
|     volk_python_check_module_raw( | ||||
|         "${desc}" " | ||||
| ######################################### | ||||
| try: | ||||
|     import ${mod} | ||||
|     assert ${cmd} | ||||
| except (ImportError, AssertionError): exit(-1) | ||||
| except: pass | ||||
| #########################################" | ||||
|     "${have}") | ||||
| endmacro() | ||||
|  | ||||
|  | ||||
| ######################################################################## | ||||
| # Setup the python interpreter: | ||||
| @@ -57,6 +53,9 @@ if(CMAKE_VERSION VERSION_LESS 3.12 OR CMAKE_CROSSCOMPILING) | ||||
|     if(PYTHON_EXECUTABLE) | ||||
|         message(STATUS "User set python executable ${PYTHON_EXECUTABLE}") | ||||
|         find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION} REQUIRED) | ||||
|         if(PYTHON_VERSION_STRING VERSION_LESS "3.0") | ||||
|             volk_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND) | ||||
|         endif() | ||||
|     else() | ||||
|         message(STATUS "PYTHON_EXECUTABLE not set - trying by default python3") | ||||
|         message(STATUS "Use -DPYTHON_EXECUTABLE=/path/to/python to build for python 2.7") | ||||
| @@ -65,12 +64,18 @@ if(CMAKE_VERSION VERSION_LESS 3.12 OR CMAKE_CROSSCOMPILING) | ||||
|         if(NOT PYTHONINTERP_FOUND) | ||||
|             message(STATUS "python3 not found - trying with python2.7") | ||||
|             find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION} REQUIRED) | ||||
|             volk_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND) | ||||
|         endif() | ||||
|     endif() | ||||
|     volk_python_check_module("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND) | ||||
| else() | ||||
|     if(PYTHON_EXECUTABLE) | ||||
|         message(STATUS "User set python executable ${PYTHON_EXECUTABLE}") | ||||
|         find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION} REQUIRED) | ||||
|         volk_python_check_module("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND) | ||||
|         if(PYTHON_VERSION_STRING VERSION_LESS "3.0") | ||||
|             volk_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND) | ||||
|         endif() | ||||
|     else() | ||||
|         if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") | ||||
|             set(_previous ${CMAKE_FIND_FRAMEWORK}) | ||||
| @@ -98,6 +103,7 @@ else() | ||||
|             if(NOT MAKO_FOUND OR NOT SIX_FOUND) | ||||
|                 unset(PYTHON_EXECUTABLE) | ||||
|                 find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION}) | ||||
|                 volk_python_check_module("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND) | ||||
|             endif() | ||||
|         endif() | ||||
|     endif() | ||||
|   | ||||
| @@ -56,6 +56,7 @@ set(PROCESSOR_IS_AARCH64 FALSE) | ||||
| set(PROCESSOR_IS_X86 FALSE) | ||||
| set(PROCESSOR_IS_POWER FALSE) | ||||
| set(PROCESSOR_IS_S390X FALSE) | ||||
| set(PROCESSOR_IS_RISCV FALSE) | ||||
|  | ||||
| if(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips") | ||||
|   set(PROCESSOR_IS_MIPS TRUE) | ||||
| @@ -69,6 +70,8 @@ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)") | ||||
|   set(PROCESSOR_IS_POWER TRUE) | ||||
| elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(s390x)") | ||||
|   set(PROCESSOR_IS_S390X TRUE) | ||||
| elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^riscv") | ||||
|   set(PROCESSOR_IS_RISCV TRUE) | ||||
| endif() | ||||
|  | ||||
| macro(add_cpu_features_headers_and_sources HDRS_LIST_NAME SRCS_LIST_NAME) | ||||
| @@ -90,6 +93,8 @@ macro(add_cpu_features_headers_and_sources HDRS_LIST_NAME SRCS_LIST_NAME) | ||||
|       list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_ppc.h) | ||||
|   elseif(PROCESSOR_IS_S390X) | ||||
|       list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_s390x.h) | ||||
|   elseif(PROCESSOR_IS_RISCV) | ||||
|       list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_riscv.h) | ||||
|   else() | ||||
|     message(FATAL_ERROR "Unsupported architectures ${CMAKE_SYSTEM_PROCESSOR}") | ||||
|   endif() | ||||
|   | ||||
| @@ -158,14 +158,14 @@ flags           : aes,avx,cx16,smx,sse4_1,sse4_2,ssse3 | ||||
|  | ||||
| ## What's supported | ||||
|  | ||||
| |         | x86³ | AArch64 |   ARM   |  MIPS⁴  |  s390x  |  POWER  | | ||||
| | ------- | :--: | :-----: | :-----: | :-----: | :-----: | :-----: | | ||||
| | Linux   | yes² |  yes¹   |  yes¹   |  yes¹   |  yes¹   |  yes¹   | | ||||
| | FreeBSD | yes² | not yet | not yet | not yet | not yet | not yet | | ||||
| | MacOs   | yes² | not yet |   N/A   |   N/A   |   no    |   no    | | ||||
| | Windows | yes² | not yet | not yet |   N/A   |   N/A   |   N/A   | | ||||
| | Android | yes² |  yes¹   |  yes¹   |  yes¹   |   N/A   |   N/A   | | ||||
| | iOS     | N/A  | not yet | not yet |   N/A   |   N/A   |   N/A   | | ||||
| |         | x86³ | AArch64 |   ARM   |  MIPS⁴  |  POWER  | RISCV |  s390x  | | ||||
| | ------- | :--: | :-----: | :-----: | :-----: | :-----: | :---: | :-----: | | ||||
| | Linux   | yes² |  yes¹   |  yes¹   |  yes¹   |  yes¹   | yes¹  |  yes¹   | | ||||
| | FreeBSD | yes² | not yet | not yet | not yet | not yet |  N/A  | not yet | | ||||
| | MacOs   | yes² | not yet |   N/A   |   N/A   |   no    |  N/A  |   no    | | ||||
| | Windows | yes² | not yet | not yet |   N/A   |   N/A   |  N/A  |   N/A   | | ||||
| | Android | yes² |  yes¹   |  yes¹   |  yes¹   |   N/A   |  N/A  |   N/A   | | ||||
| | iOS     | N/A  | not yet | not yet |   N/A   |   N/A   |  N/A  |   N/A   | | ||||
|  | ||||
| 1.  **Features revealed from Linux.** We gather data from several sources | ||||
|     depending on availability: | ||||
|   | ||||
| @@ -0,0 +1,62 @@ | ||||
| // SPDX-FileCopyrightText: 2022 Google LLC | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
|  | ||||
| #ifndef CPU_FEATURES_INCLUDE_CPUINFO_RISCV_H_ | ||||
| #define CPU_FEATURES_INCLUDE_CPUINFO_RISCV_H_ | ||||
|  | ||||
| #include "cpu_features_cache_info.h" | ||||
| #include "cpu_features_macros.h" | ||||
|  | ||||
| #if !defined(CPU_FEATURES_ARCH_RISCV) | ||||
| #error "Including cpuinfo_riscv.h from a non-riscv target." | ||||
| #endif | ||||
|  | ||||
| CPU_FEATURES_START_CPP_NAMESPACE | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|     // Base | ||||
|     int RV32I : 1;  // Base Integer Instruction Set, 32-bit | ||||
|     int RV64I : 1;  // Base Integer Instruction Set, 64-bit | ||||
|  | ||||
|     // Extension | ||||
|     int M : 1;         // Standard Extension for Integer Multiplication/Division | ||||
|     int A : 1;         // Standard Extension for Atomic Instructions | ||||
|     int F : 1;         // Standard Extension for Single-Precision Floating-Point | ||||
|     int D : 1;         // Standard Extension for Double-Precision Floating-Point | ||||
|     int Q : 1;         // Standard Extension for Quad-Precision Floating-Point | ||||
|     int C : 1;         // Standard Extension for Compressed Instructions | ||||
|     int Zicsr : 1;     // Control and Status Register (CSR) | ||||
|     int Zifencei : 1;  // Instruction-Fetch Fence | ||||
| } RiscvFeatures; | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|     RiscvFeatures features; | ||||
|     char uarch[64];   // 0 terminated string | ||||
|     char vendor[64];  // 0 terminated string | ||||
| } RiscvInfo; | ||||
|  | ||||
| typedef enum | ||||
| { | ||||
|     RISCV_RV32I, | ||||
|     RISCV_RV64I, | ||||
|     RISCV_M, | ||||
|     RISCV_A, | ||||
|     RISCV_F, | ||||
|     RISCV_D, | ||||
|     RISCV_Q, | ||||
|     RISCV_C, | ||||
|     RISCV_Zicsr, | ||||
|     RISCV_Zifencei, | ||||
|     RISCV_LAST_, | ||||
| } RiscvFeaturesEnum; | ||||
|  | ||||
| RiscvInfo GetRiscvInfo(void); | ||||
| int GetRiscvFeaturesEnumValue(const RiscvFeatures* features, | ||||
|     RiscvFeaturesEnum value); | ||||
| const char* GetRiscvFeaturesEnumName(RiscvFeaturesEnum); | ||||
|  | ||||
| CPU_FEATURES_END_CPP_NAMESPACE | ||||
|  | ||||
| #endif  // CPU_FEATURES_INCLUDE_CPUINFO_RISCV_H_ | ||||
| @@ -193,15 +193,15 @@ CPU_FEATURES_START_CPP_NAMESPACE | ||||
| #define HWCAP_S390_SIE 4194304 | ||||
|  | ||||
| // https://elixir.bootlin.com/linux/latest/source/arch/riscv/include/uapi/asm/hwcap.h | ||||
| #define RISCV_HWCAP_A (1UL << ('A' - 'A')) | ||||
| #define RISCV_HWCAP_C (1UL << ('C' - 'A')) | ||||
| #define RISCV_HWCAP_D (1UL << ('D' - 'A')) | ||||
| #define RISCV_HWCAP_E (1UL << ('E' - 'A')) | ||||
| #define RISCV_HWCAP_F (1UL << ('F' - 'A')) | ||||
| #define RISCV_HWCAP_I (1UL << ('I' - 'A')) | ||||
| #define RISCV_HWCAP_32 0x32 | ||||
| #define RISCV_HWCAP_64 0x64 | ||||
| #define RISCV_HWCAP_128 0x128 | ||||
| #define RISCV_HWCAP_M (1UL << ('M' - 'A')) | ||||
| #define RISCV_HWCAP_V (1UL << ('V' - 'A')) | ||||
| #define RISCV_HWCAP_A (1UL << ('A' - 'A')) | ||||
| #define RISCV_HWCAP_F (1UL << ('F' - 'A')) | ||||
| #define RISCV_HWCAP_D (1UL << ('D' - 'A')) | ||||
| #define RISCV_HWCAP_Q (1UL << ('Q' - 'A')) | ||||
| #define RISCV_HWCAP_C (1UL << ('C' - 'A')) | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|   | ||||
| @@ -0,0 +1,109 @@ | ||||
| // SPDX-FileCopyrightText: 2022 Google LLC | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
|  | ||||
| #include "cpu_features_macros.h" | ||||
|  | ||||
| #ifdef CPU_FEATURES_ARCH_RISCV | ||||
| #if defined(CPU_FEATURES_OS_LINUX) | ||||
|  | ||||
| #include "cpuinfo_riscv.h" | ||||
|  | ||||
| // According to | ||||
| // https://elixir.bootlin.com/linux/latest/source/Documentation/devicetree/bindings/riscv/cpus.yaml | ||||
| // isa string should match the following regex | ||||
| // ^rv(?:64|32)imaf?d?q?c?b?v?k?h?(?:_[hsxz](?:[a-z])+)*$ | ||||
| // | ||||
| // This means we can test for features in this exact order except for Z | ||||
| // extensions. | ||||
|  | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Definitions for introspection. | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| #define INTROSPECTION_TABLE                              \ | ||||
|     LINE(RISCV_RV32I, RV32I, "rv32i", RISCV_HWCAP_32, 0) \ | ||||
|     LINE(RISCV_RV64I, RV64I, "rv64i", RISCV_HWCAP_64, 0) \ | ||||
|     LINE(RISCV_M, M, "m", RISCV_HWCAP_M, 0)              \ | ||||
|     LINE(RISCV_A, A, "a", RISCV_HWCAP_A, 0)              \ | ||||
|     LINE(RISCV_F, F, "f", RISCV_HWCAP_F, 0)              \ | ||||
|     LINE(RISCV_D, D, "d", RISCV_HWCAP_D, 0)              \ | ||||
|     LINE(RISCV_Q, Q, "q", RISCV_HWCAP_Q, 0)              \ | ||||
|     LINE(RISCV_C, C, "c", RISCV_HWCAP_C, 0)              \ | ||||
|     LINE(RISCV_Zicsr, Zicsr, "_zicsr", 0, 0)             \ | ||||
|     LINE(RISCV_Zifencei, Zifencei, "_zifencei", 0, 0) | ||||
| #define INTROSPECTION_PREFIX Riscv | ||||
| #define INTROSPECTION_ENUM_PREFIX RISCV | ||||
| #include "define_introspection_and_hwcaps.inl" | ||||
|  | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Implementation. | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #include "internal/filesystem.h" | ||||
| #include "internal/stack_line_reader.h" | ||||
| #include <stdbool.h> | ||||
| #include <stdio.h> | ||||
|  | ||||
| static const RiscvInfo kEmptyRiscvInfo; | ||||
|  | ||||
| static void HandleRiscVIsaLine(StringView line, RiscvFeatures* const features) | ||||
| { | ||||
|     for (size_t i = 0; i < RISCV_LAST_; ++i) | ||||
|         { | ||||
|             StringView flag = str(kCpuInfoFlags[i]); | ||||
|             int index_of_flag = CpuFeatures_StringView_IndexOf(line, flag); | ||||
|             bool is_set = index_of_flag != -1; | ||||
|             kSetters[i](features, is_set); | ||||
|             if (is_set) | ||||
|                 line = CpuFeatures_StringView_PopFront(line, index_of_flag + flag.size); | ||||
|         } | ||||
| } | ||||
|  | ||||
| static bool HandleRiscVLine(const LineResult result, RiscvInfo* const info) | ||||
| { | ||||
|     StringView line = result.line; | ||||
|     StringView key, value; | ||||
|     if (CpuFeatures_StringView_GetAttributeKeyValue(line, &key, &value)) | ||||
|         { | ||||
|             if (CpuFeatures_StringView_IsEquals(key, str("isa"))) | ||||
|                 { | ||||
|                     HandleRiscVIsaLine(value, &info->features); | ||||
|                 } | ||||
|             else if (CpuFeatures_StringView_IsEquals(key, str("uarch"))) | ||||
|                 { | ||||
|                     int index = CpuFeatures_StringView_IndexOfChar(value, ','); | ||||
|                     if (index == -1) return true; | ||||
|                     StringView vendor = CpuFeatures_StringView_KeepFront(value, index); | ||||
|                     StringView uarch = CpuFeatures_StringView_PopFront(value, index + 1); | ||||
|                     CpuFeatures_StringView_CopyString(vendor, info->vendor, | ||||
|                         sizeof(info->vendor)); | ||||
|                     CpuFeatures_StringView_CopyString(uarch, info->uarch, | ||||
|                         sizeof(info->uarch)); | ||||
|                 } | ||||
|         } | ||||
|     return !result.eof; | ||||
| } | ||||
|  | ||||
| static void FillProcCpuInfoData(RiscvInfo* const info) | ||||
| { | ||||
|     const int fd = CpuFeatures_OpenFile("/proc/cpuinfo"); | ||||
|     if (fd >= 0) | ||||
|         { | ||||
|             StackLineReader reader; | ||||
|             StackLineReader_Initialize(&reader, fd); | ||||
|             for (;;) | ||||
|                 { | ||||
|                     if (!HandleRiscVLine(StackLineReader_NextLine(&reader), info)) break; | ||||
|                 } | ||||
|             CpuFeatures_CloseFile(fd); | ||||
|         } | ||||
| } | ||||
|  | ||||
| RiscvInfo GetRiscvInfo(void) | ||||
| { | ||||
|     RiscvInfo info = kEmptyRiscvInfo; | ||||
|     FillProcCpuInfoData(&info); | ||||
|     return info; | ||||
| } | ||||
|  | ||||
| #endif  //  defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID) | ||||
| #endif  // CPU_FEATURES_ARCH_RISCV | ||||
| @@ -25,6 +25,8 @@ | ||||
| #include "cpuinfo_ppc.h" | ||||
| #elif defined(CPU_FEATURES_ARCH_S390X) | ||||
| #include "cpuinfo_s390x.h" | ||||
| #elif defined(CPU_FEATURES_ARCH_RISCV) | ||||
| #include "cpuinfo_riscv.h" | ||||
| #endif | ||||
|  | ||||
| // Design principles | ||||
| @@ -217,6 +219,9 @@ DEFINE_ADD_FLAGS(GetPPCFeaturesEnumValue, GetPPCFeaturesEnumName, PPCFeatures, | ||||
| #elif defined(CPU_FEATURES_ARCH_S390X) | ||||
| DEFINE_ADD_FLAGS(GetS390XFeaturesEnumValue, GetS390XFeaturesEnumName, S390XFeatures, | ||||
|     S390X_LAST_) | ||||
| #elif defined(CPU_FEATURES_ARCH_RISCV) | ||||
| DEFINE_ADD_FLAGS(GetRiscvFeaturesEnumValue, GetRiscvFeaturesEnumName, RiscvFeatures, | ||||
|     RISCV_LAST_) | ||||
| #endif | ||||
|  | ||||
| // Prints a json string with characters escaping. | ||||
| @@ -447,6 +452,12 @@ static Node* CreateTree(void) | ||||
|     AddMapEntry(root, "model", CreateString(strings.type.platform)); | ||||
|     AddMapEntry(root, "# processors", CreateInt(strings.num_processors)); | ||||
|     AddFlags(root, &info.features); | ||||
| #elif defined(CPU_FEATURES_ARCH_RISCV) | ||||
|     const RiscvInfo info = GetRiscvInfo(); | ||||
|     AddMapEntry(root, "arch", CreateString("risc-v")); | ||||
|     AddMapEntry(root, "vendor", CreateString(info.vendor)); | ||||
|     AddMapEntry(root, "microarchitecture", CreateString(info.uarch)); | ||||
|     AddFlags(root, &info.features); | ||||
| #endif | ||||
|     return root; | ||||
| } | ||||
|   | ||||
| @@ -99,3 +99,10 @@ if(PROCESSOR_IS_S390X) | ||||
|   target_link_libraries(cpuinfo_s390x_test all_libraries) | ||||
|   add_test(NAME cpuinfo_s390x_test COMMAND cpuinfo_s390x_test) | ||||
| endif() | ||||
| ##------------------------------------------------------------------------------ | ||||
| ## cpuinfo_riscv_test | ||||
| if(PROCESSOR_IS_RISCV) | ||||
|   add_executable(cpuinfo_riscv_test cpuinfo_riscv_test.cc  ../src/impl_riscv_linux.c) | ||||
|   target_link_libraries(cpuinfo_riscv_test all_libraries) | ||||
|   add_test(NAME cpuinfo_riscv_test COMMAND cpuinfo_riscv_test) | ||||
| endif() | ||||
| @@ -0,0 +1,141 @@ | ||||
| // SPDX-FileCopyrightText: 2022 Google LLC | ||||
| // SPDX-License-Identifier: Apache-2.0 | ||||
|  | ||||
| #include "cpuinfo_riscv.h" | ||||
| #include "filesystem_for_testing.h" | ||||
| #include "gtest/gtest.h" | ||||
| #include "hwcaps_for_testing.h" | ||||
|  | ||||
| namespace cpu_features | ||||
| { | ||||
| namespace | ||||
| { | ||||
|  | ||||
| TEST(CpuinfoRiscvTest, Sipeed_Lichee_RV_FromCpuInfo) | ||||
| { | ||||
|     ResetHwcaps(); | ||||
|     auto& fs = GetEmptyFilesystem(); | ||||
|     fs.CreateFile("/proc/cpuinfo", R"(processor	: 0  | ||||
| hart  : 0 | ||||
| isa   : rv64imafdc | ||||
| mmu   : sv39 | ||||
| uarch : thead,c906)"); | ||||
|     const auto info = GetRiscvInfo(); | ||||
|     EXPECT_STREQ(info.uarch, "c906"); | ||||
|     EXPECT_STREQ(info.vendor, "thead"); | ||||
|  | ||||
|     EXPECT_FALSE(info.features.RV32I); | ||||
|     EXPECT_TRUE(info.features.RV64I); | ||||
|     EXPECT_TRUE(info.features.M); | ||||
|     EXPECT_TRUE(info.features.A); | ||||
|     EXPECT_TRUE(info.features.F); | ||||
|     EXPECT_TRUE(info.features.D); | ||||
|     EXPECT_FALSE(info.features.Q); | ||||
|     EXPECT_TRUE(info.features.C); | ||||
| } | ||||
|  | ||||
| // https://github.com/ThomasKaiser/sbc-bench/blob/284e82b016ec1beeac42a5fcbe556b670f68441a/results/Kendryte-K510-4.17.0.cpuinfo | ||||
| TEST(CpuinfoRiscvTest, Kendryte_K510_FromCpuInfo) | ||||
| { | ||||
|     ResetHwcaps(); | ||||
|     auto& fs = GetEmptyFilesystem(); | ||||
|     fs.CreateFile("/proc/cpuinfo", R"( | ||||
| hart	: 0 | ||||
| isa	    : rv64i2p0m2p0a2p0f2p0d2p0c2p0xv5-0p0 | ||||
| mmu	    : sv39 | ||||
|  | ||||
| hart	: 1 | ||||
| isa	    : rv64i2p0m2p0a2p0f2p0d2p0c2p0xv5-0p0 | ||||
| mmu	    : sv39"); | ||||
|   const auto info = GetRiscvInfo(); | ||||
|   EXPECT_STREQ(info.uarch, ""); | ||||
|   EXPECT_STREQ(info.vendor, ""); | ||||
|   EXPECT_FALSE(info.features.RV32I); | ||||
|   EXPECT_TRUE(info.features.RV64I); | ||||
|   EXPECT_TRUE(info.features.M); | ||||
|   EXPECT_TRUE(info.features.A); | ||||
|   EXPECT_TRUE(info.features.F); | ||||
|   EXPECT_TRUE(info.features.D); | ||||
|   EXPECT_FALSE(info.features.Q); | ||||
|   EXPECT_TRUE(info.features.C); | ||||
| } | ||||
|  | ||||
| // https://github.com/ThomasKaiser/sbc-bench/blob/284e82b016ec1beeac42a5fcbe556b670f68441a/results/T-Head-C910-5.10.4.cpuinfo | ||||
| TEST(CpuinfoRiscvTest, T_Head_C910_FromCpuInfo) { | ||||
|   ResetHwcaps(); | ||||
|   auto& fs = GetEmptyFilesystem(); | ||||
|   fs.CreateFile("/proc/cpuinfo", R"( | ||||
| processor	: 0 | ||||
| hart		: 0 | ||||
| isa		    : rv64imafdcsu | ||||
| mmu		    : sv39 | ||||
| cpu-freq	: 1.2Ghz | ||||
| cpu-icache	: 64KB | ||||
| cpu-dcache	: 64KB | ||||
| cpu-l2cache	: 2MB | ||||
| cpu-tlb		: 1024 4-ways | ||||
| cpu-cacheline	: 64Bytes | ||||
| cpu-vector	: 0.7.1 | ||||
| processor	: 1 | ||||
| hart		: 1 | ||||
| isa		    : rv64imafdcsu | ||||
| mmu		    : sv39 | ||||
| cpu-freq	: 1.2Ghz | ||||
| cpu-icache	: 64KB | ||||
| cpu-dcache	: 64KB | ||||
| cpu-l2cache	: 2MB | ||||
| cpu-tlb		: 1024 4-ways | ||||
| cpu-cacheline	: 64Bytes | ||||
| cpu-vector	: 0.7.1"); | ||||
|   const auto info = GetRiscvInfo(); | ||||
|   EXPECT_STREQ(info.uarch, ""); | ||||
|   EXPECT_STREQ(info.vendor, ""); | ||||
|   EXPECT_FALSE(info.features.RV32I); | ||||
|   EXPECT_TRUE(info.features.RV64I); | ||||
|   EXPECT_TRUE(info.features.M); | ||||
|   EXPECT_TRUE(info.features.A); | ||||
|   EXPECT_TRUE(info.features.F); | ||||
|   EXPECT_TRUE(info.features.D); | ||||
|   EXPECT_FALSE(info.features.Q); | ||||
|   EXPECT_TRUE(info.features.C); | ||||
| } | ||||
| TEST(CpuinfoRiscvTest, UnknownFromCpuInfo) { | ||||
|   ResetHwcaps(); | ||||
|   auto& fs = GetEmptyFilesystem(); | ||||
|   fs.CreateFile("/proc/cpuinfo", R"( | ||||
| processor : 0 | ||||
| hart      : 2 | ||||
| isa       : rv64imafdc | ||||
| mmu       : sv39 | ||||
| uarch     : sifive,bullet0 | ||||
| processor : 1 | ||||
| hart      : 1 | ||||
| isa       : rv64imafdc | ||||
| mmu       : sv39 | ||||
| uarch     : sifive,bullet0 | ||||
| processor : 2 | ||||
| hart      : 3 | ||||
| isa       : rv64imafdc | ||||
| mmu       : sv39 | ||||
| uarch     : sifive,bullet0 | ||||
| processor : 3 | ||||
| hart      : 4 | ||||
| isa       : rv64imafdc | ||||
| mmu       : sv39 | ||||
| uarch     : sifive,bullet0)"); | ||||
|     const auto info = GetRiscvInfo(); | ||||
|     EXPECT_STREQ(info.uarch, "bullet0"); | ||||
|     EXPECT_STREQ(info.vendor, "sifive"); | ||||
|  | ||||
|     EXPECT_FALSE(info.features.RV32I); | ||||
|     EXPECT_TRUE(info.features.RV64I); | ||||
|     EXPECT_TRUE(info.features.M); | ||||
|     EXPECT_TRUE(info.features.A); | ||||
|     EXPECT_TRUE(info.features.F); | ||||
|     EXPECT_TRUE(info.features.D); | ||||
|     EXPECT_FALSE(info.features.Q); | ||||
|     EXPECT_TRUE(info.features.C); | ||||
| } | ||||
|  | ||||
| }  // namespace | ||||
| }  // namespace cpu_features | ||||
| @@ -23,7 +23,6 @@ | ||||
| \li \subpage volk_gnsssdr_8ic_magnitude_squared_8i | ||||
| \li \subpage volk_gnsssdr_8ic_x2_dot_prod_8ic | ||||
| \li \subpage volk_gnsssdr_8ic_x2_multiply_8ic | ||||
| \li \subpage volk_gnsssdr_8ic_s8ic_multiply_8ic | ||||
| \li \subpage volk_gnsssdr_8i_accumulator_s8i | ||||
| \li \subpage volk_gnsssdr_8i_index_max_16u | ||||
| \li \subpage volk_gnsssdr_8i_max_s8i | ||||
|   | ||||
| @@ -1,27 +0,0 @@ | ||||
| # | ||||
| # ORC implementation: calculates the conjugate of a 16 bits vector | ||||
| # | ||||
| # Andres Cecilia, 2014. a.cecilia.luque(at)gmail.com | ||||
| # | ||||
| # ORC code that calculates the conjugate of a | ||||
| # 16 bits vector (8 bits the real part and 8 bits the imaginary part) | ||||
| # result = (real*real) + (imag*imag) | ||||
| # | ||||
| # | ||||
| # ------------------------------------------------------------------------------ | ||||
| # | ||||
| # GNSS-SDR is a Global Navigation Satellite System software-defined receiver. | ||||
| # This file is part of GNSS-SDR. | ||||
| # | ||||
| # Copyright (C) 2010-2020  (see AUTHORS file for a list of contributors) | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
| # | ||||
| # ------------------------------------------------------------------------------ | ||||
| # | ||||
|  | ||||
| .function volk_gnsssdr_8ic_conjugate_8ic_a_orc_impl | ||||
| .source 2 src1 | ||||
| .dest 2 dst | ||||
| .temp 2 merged | ||||
| mergebw merged, 1, -1 | ||||
| x2 mullb dst, merged, src1 | ||||
| @@ -1,39 +0,0 @@ | ||||
| # | ||||
| # ORC implementation: multiplies a group of 16 bits vectors by one constant vector | ||||
| # | ||||
| #  Andres Cecilia, 2014. a.cecilia.luque(at)gmail.com | ||||
| # | ||||
| # | ||||
| # ORC code that multiplies a group of 16 bits vectors | ||||
| # (8 bits the real part and 8 bits the imaginary part) by one constant vector | ||||
| # | ||||
| # ------------------------------------------------------------------------------ | ||||
| # | ||||
| # GNSS-SDR is a Global Navigation Satellite System software-defined receiver. | ||||
| # This file is part of GNSS-SDR. | ||||
| # | ||||
| # Copyright (C) 2010-2020  (see AUTHORS file for a list of contributors) | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
| # | ||||
| # ------------------------------------------------------------------------------ | ||||
| # | ||||
|  | ||||
| .function volk_gnsssdr_8ic_s8ic_multiply_8ic_a_orc_impl | ||||
| .source 2 src1 | ||||
| .param 2 src2real | ||||
| .param 2 src2imag | ||||
| .dest 2 dst | ||||
| .temp 2 iqprod | ||||
| .temp 1 real | ||||
| .temp 1 imag | ||||
| .temp 1 rr | ||||
| .temp 1 ii | ||||
| .temp 1 ri | ||||
| .temp 1 ir | ||||
| x2 mullb iqprod, src1, src2real | ||||
| splitwb ir, rr, iqprod | ||||
| x2 mullb iqprod, src1, src2imag | ||||
| splitwb ii, ri, iqprod | ||||
| subb real, rr, ii | ||||
| addb imag, ri, ir | ||||
| mergebw dst, real, imag | ||||
| @@ -324,16 +324,6 @@ static inline void volk_gnsssdr_8ic_conjugate_8ic_a_sse3(lv_8sc_t* cVector, cons | ||||
| #endif /* LV_HAVE_SSE3 */ | ||||
|  | ||||
|  | ||||
| #ifdef LV_HAVE_ORC | ||||
|  | ||||
| extern void volk_gnsssdr_8ic_conjugate_8ic_a_orc_impl(lv_8sc_t* cVector, const lv_8sc_t* aVector, unsigned int num_points); | ||||
| static inline void volk_gnsssdr_8ic_conjugate_8ic_u_orc(lv_8sc_t* cVector, const lv_8sc_t* aVector, unsigned int num_points) | ||||
| { | ||||
|     volk_gnsssdr_8ic_conjugate_8ic_a_orc_impl(cVector, aVector, num_points); | ||||
| } | ||||
| #endif /* LV_HAVE_ORC */ | ||||
|  | ||||
|  | ||||
| #ifdef LV_HAVE_NEON | ||||
| #include <arm_neon.h> | ||||
|  | ||||
|   | ||||
| @@ -1,205 +0,0 @@ | ||||
| /*! | ||||
|  * \file volk_gnsssdr_8ic_s8ic_multiply_8ic.h | ||||
|  * \brief VOLK_GNSSSDR kernel: multiplies a group of 16 bits vectors by one constant vector. | ||||
|  * \authors <ul> | ||||
|  *          <li> Andres Cecilia, 2014. a.cecilia.luque(at)gmail.com | ||||
|  *          </ul> | ||||
|  * | ||||
|  * VOLK_GNSSSDR kernel that multiplies a group of 16 bits vectors | ||||
|  * (8 bits the real part and 8 bits the imaginary part) by one constant vector | ||||
|  * | ||||
|  * ----------------------------------------------------------------------------- | ||||
|  * | ||||
|  * GNSS-SDR is a Global Navigation Satellite System software-defined receiver. | ||||
|  * This file is part of GNSS-SDR. | ||||
|  * | ||||
|  * Copyright (C) 2010-2020  (see AUTHORS file for a list of contributors) | ||||
|  * SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  * | ||||
|  * ----------------------------------------------------------------------------- | ||||
|  */ | ||||
|  | ||||
| /*! | ||||
|  * \page volk_gnsssdr_8ic_s8ic_multiply_8ic | ||||
|  * | ||||
|  * \b Overview | ||||
|  * | ||||
|  * Multiplies the input vector by a scalar and stores the results in the third vector | ||||
|  * | ||||
|  * <b>Dispatcher Prototype</b> | ||||
|  * \code | ||||
|  * void volk_gnsssdr_8ic_s8ic_multiply_8ic(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t scalar, unsigned int num_points); | ||||
|  * \endcode | ||||
|  * | ||||
|  * \b Inputs | ||||
|  * \li aVector: The vector to be multiplied. | ||||
|  * \li scalar The complex scalar to multiply \p aVector | ||||
|  * \li num_points: The number of complex values in \p aVector to be multiplied by \p scalar and stored into \p cVector. | ||||
|  * | ||||
|  * \b Outputs | ||||
|  * \li cVector: The vector where the results will be stored | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #ifndef INCLUDED_volk_gnsssdr_8ic_s8ic_multiply_8ic_H | ||||
| #define INCLUDED_volk_gnsssdr_8ic_s8ic_multiply_8ic_H | ||||
|  | ||||
| #include <volk_gnsssdr/volk_gnsssdr_complex.h> | ||||
|  | ||||
| #ifdef LV_HAVE_SSE3 | ||||
| #include <pmmintrin.h> | ||||
|  | ||||
| static inline void volk_gnsssdr_8ic_s8ic_multiply_8ic_u_sse3(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t scalar, unsigned int num_points) | ||||
| { | ||||
|     unsigned int number = 0; | ||||
|     const unsigned int sse_iters = num_points / 8; | ||||
|  | ||||
|     __m128i x, y, mult1, realx, imagx, realy, imagy, realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, realc, imagc, totalc; | ||||
|  | ||||
|     lv_8sc_t* c = cVector; | ||||
|     const lv_8sc_t* a = aVector; | ||||
|  | ||||
|     mult1 = _mm_set_epi8(0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF); | ||||
|  | ||||
|     y = _mm_set1_epi16(*(short*)&scalar); | ||||
|     imagy = _mm_srli_si128(y, 1); | ||||
|     imagy = _mm_and_si128(imagy, mult1); | ||||
|     realy = _mm_and_si128(y, mult1); | ||||
|  | ||||
|     for (; number < sse_iters; number++) | ||||
|         { | ||||
|             x = _mm_lddqu_si128((__m128i*)a); | ||||
|  | ||||
|             imagx = _mm_srli_si128(x, 1); | ||||
|             imagx = _mm_and_si128(imagx, mult1); | ||||
|             realx = _mm_and_si128(x, mult1); | ||||
|  | ||||
|             realx_mult_realy = _mm_mullo_epi16(realx, realy); | ||||
|             imagx_mult_imagy = _mm_mullo_epi16(imagx, imagy); | ||||
|             realx_mult_imagy = _mm_mullo_epi16(realx, imagy); | ||||
|             imagx_mult_realy = _mm_mullo_epi16(imagx, realy); | ||||
|  | ||||
|             realc = _mm_sub_epi16(realx_mult_realy, imagx_mult_imagy); | ||||
|             realc = _mm_and_si128(realc, mult1); | ||||
|             imagc = _mm_add_epi16(realx_mult_imagy, imagx_mult_realy); | ||||
|             imagc = _mm_and_si128(imagc, mult1); | ||||
|             imagc = _mm_slli_si128(imagc, 1); | ||||
|  | ||||
|             totalc = _mm_or_si128(realc, imagc); | ||||
|  | ||||
|             _mm_storeu_si128((__m128i*)c, totalc); | ||||
|  | ||||
|             a += 8; | ||||
|             c += 8; | ||||
|         } | ||||
|  | ||||
|     for (number = sse_iters * 8; number < num_points; ++number) | ||||
|         { | ||||
|             *c++ = (*a++) * scalar; | ||||
|         } | ||||
| } | ||||
| #endif /* LV_HAVE_SSE3 */ | ||||
|  | ||||
|  | ||||
| #ifdef LV_HAVE_GENERIC | ||||
|  | ||||
| static inline void volk_gnsssdr_8ic_s8ic_multiply_8ic_generic(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t scalar, unsigned int num_points) | ||||
| { | ||||
|     /*lv_8sc_t* cPtr = cVector; | ||||
|      const lv_8sc_t* aPtr = aVector; | ||||
|  | ||||
|      for (int i = 0; i<num_points; ++i) | ||||
|      { | ||||
|      *cPtr++ = (*aPtr++) * scalar; | ||||
|      }*/ | ||||
|  | ||||
|     lv_8sc_t* cPtr = cVector; | ||||
|     const lv_8sc_t* aPtr = aVector; | ||||
|     unsigned int number = num_points; | ||||
|  | ||||
|     // unwrap loop | ||||
|     while (number >= 8) | ||||
|         { | ||||
|             *cPtr++ = (*aPtr++) * scalar; | ||||
|             *cPtr++ = (*aPtr++) * scalar; | ||||
|             *cPtr++ = (*aPtr++) * scalar; | ||||
|             *cPtr++ = (*aPtr++) * scalar; | ||||
|             *cPtr++ = (*aPtr++) * scalar; | ||||
|             *cPtr++ = (*aPtr++) * scalar; | ||||
|             *cPtr++ = (*aPtr++) * scalar; | ||||
|             *cPtr++ = (*aPtr++) * scalar; | ||||
|             number -= 8; | ||||
|         } | ||||
|  | ||||
|     // clean up any remaining | ||||
|     while (number-- > 0) | ||||
|         *cPtr++ = *aPtr++ * scalar; | ||||
| } | ||||
| #endif /* LV_HAVE_GENERIC */ | ||||
|  | ||||
|  | ||||
| #ifdef LV_HAVE_SSE3 | ||||
| #include <pmmintrin.h> | ||||
|  | ||||
| static inline void volk_gnsssdr_8ic_s8ic_multiply_8ic_a_sse3(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t scalar, unsigned int num_points) | ||||
| { | ||||
|     unsigned int number = 0; | ||||
|     const unsigned int sse_iters = num_points / 8; | ||||
|  | ||||
|     __m128i x, y, mult1, realx, imagx, realy, imagy, realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, realc, imagc, totalc; | ||||
|  | ||||
|     lv_8sc_t* c = cVector; | ||||
|     const lv_8sc_t* a = aVector; | ||||
|  | ||||
|     mult1 = _mm_set_epi8(0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF); | ||||
|  | ||||
|     y = _mm_set1_epi16(*(short*)&scalar); | ||||
|     imagy = _mm_srli_si128(y, 1); | ||||
|     imagy = _mm_and_si128(imagy, mult1); | ||||
|     realy = _mm_and_si128(y, mult1); | ||||
|  | ||||
|     for (; number < sse_iters; number++) | ||||
|         { | ||||
|             x = _mm_load_si128((__m128i*)a); | ||||
|  | ||||
|             imagx = _mm_srli_si128(x, 1); | ||||
|             imagx = _mm_and_si128(imagx, mult1); | ||||
|             realx = _mm_and_si128(x, mult1); | ||||
|  | ||||
|             realx_mult_realy = _mm_mullo_epi16(realx, realy); | ||||
|             imagx_mult_imagy = _mm_mullo_epi16(imagx, imagy); | ||||
|             realx_mult_imagy = _mm_mullo_epi16(realx, imagy); | ||||
|             imagx_mult_realy = _mm_mullo_epi16(imagx, realy); | ||||
|  | ||||
|             realc = _mm_sub_epi16(realx_mult_realy, imagx_mult_imagy); | ||||
|             realc = _mm_and_si128(realc, mult1); | ||||
|             imagc = _mm_add_epi16(realx_mult_imagy, imagx_mult_realy); | ||||
|             imagc = _mm_and_si128(imagc, mult1); | ||||
|             imagc = _mm_slli_si128(imagc, 1); | ||||
|  | ||||
|             totalc = _mm_or_si128(realc, imagc); | ||||
|  | ||||
|             _mm_store_si128((__m128i*)c, totalc); | ||||
|  | ||||
|             a += 8; | ||||
|             c += 8; | ||||
|         } | ||||
|  | ||||
|     for (number = sse_iters * 8; number < num_points; ++number) | ||||
|         { | ||||
|             *c++ = (*a++) * scalar; | ||||
|         } | ||||
| } | ||||
| #endif /* LV_HAVE_SSE3 */ | ||||
|  | ||||
|  | ||||
| #ifdef LV_HAVE_ORC | ||||
|  | ||||
| extern void volk_gnsssdr_8ic_s8ic_multiply_8ic_a_orc_impl(lv_8sc_t* cVector, const lv_8sc_t* aVector, const char scalarreal, const char scalarimag, unsigned int num_points); | ||||
| static inline void volk_gnsssdr_8ic_s8ic_multiply_8ic_u_orc(lv_8sc_t* cVector, const lv_8sc_t* aVector, const lv_8sc_t scalar, unsigned int num_points) | ||||
| { | ||||
|     volk_gnsssdr_8ic_s8ic_multiply_8ic_a_orc_impl(cVector, aVector, lv_creal(scalar), lv_cimag(scalar), num_points); | ||||
| } | ||||
| #endif /* LV_HAVE_ORC */ | ||||
|  | ||||
| #endif /* INCLUDED_volk_gnsssdr_32fc_x2_multiply_32fc_H */ | ||||
| @@ -51,7 +51,8 @@ std::vector<volk_gnsssdr_test_case_t> init_test_list(volk_gnsssdr_test_params_t | ||||
|     volk_gnsssdr_test_params_t test_params_inacc2 = volk_gnsssdr_test_params_t(2e-1, test_params.scalar(), | ||||
|         test_params.vlen(), test_params.iter(), test_params.benchmark_mode(), test_params.kernel_regex()); | ||||
|  | ||||
|     std::vector<volk_gnsssdr_test_case_t> test_cases; | ||||
|     std::vector<volk_gnsssdr_test_case_t> | ||||
|         test_cases; | ||||
|  | ||||
|     QA(VOLK_INIT_TEST(volk_gnsssdr_8i_accumulator_s8i, test_params_more_iters)) | ||||
|     QA(VOLK_INIT_TEST(volk_gnsssdr_8i_index_max_16u, test_params_more_iters)) | ||||
| @@ -61,7 +62,6 @@ std::vector<volk_gnsssdr_test_case_t> init_test_list(volk_gnsssdr_test_params_t | ||||
|     QA(VOLK_INIT_TEST(volk_gnsssdr_8ic_magnitude_squared_8i, test_params_more_iters)) | ||||
|     QA(VOLK_INIT_TEST(volk_gnsssdr_8ic_x2_dot_prod_8ic, test_params)) | ||||
|     QA(VOLK_INIT_TEST(volk_gnsssdr_8ic_x2_multiply_8ic, test_params)) | ||||
|     QA(VOLK_INIT_TEST(volk_gnsssdr_8ic_s8ic_multiply_8ic, test_params)) | ||||
|     QA(VOLK_INIT_TEST(volk_gnsssdr_8u_x2_multiply_8u, test_params_more_iters)) | ||||
|     QA(VOLK_INIT_TEST(volk_gnsssdr_64f_accumulator_64f, test_params)) | ||||
|     QA(VOLK_INIT_TEST(volk_gnsssdr_32f_sincos_32fc, test_params_inacc)) | ||||
|   | ||||
| @@ -26,6 +26,10 @@ | ||||
| #include "cpuinfo_mips.h" | ||||
| #elif defined(CPU_FEATURES_ARCH_PPC) | ||||
| #include "cpuinfo_ppc.h" | ||||
| #elif defined(CPU_FEATURES_ARCH_S390X) | ||||
| #include "cpuinfo_s390x.h" | ||||
| #elif defined(CPU_FEATURES_ARCH_RISCV) | ||||
| #include "cpuinfo_riscv.h" | ||||
| #endif | ||||
|  | ||||
| // This is required for MSVC | ||||
| @@ -44,6 +48,22 @@ static int i_can_has_${arch.name} (void) { | ||||
|         %if "neon" in arch.name: | ||||
| #if defined(CPU_FEATURES_ARCH_ARM) | ||||
|     if (GetArmInfo().features.${check} == 0){ return 0; } | ||||
| #endif | ||||
|         %elif "mips" in arch.name: | ||||
| #if defined(CPU_FEATURES_ARCH_MIPS) | ||||
|     if (GetMipsInfo().features.${check} == 0){ return 0; } | ||||
| #endif | ||||
|         %elif "ppc" in arch.name: | ||||
| #if defined(CPU_FEATURES_ARCH_PPC) | ||||
|     if (GetPPCInfo().features.${check} == 0){ return 0; } | ||||
| #endif | ||||
|         %elif "s390x" in arch.name: | ||||
| #if defined(CPU_FEATURES_ARCH_S390X) | ||||
|     if (GetS390XInfo().features.${check} == 0){ return 0; } | ||||
| #endif | ||||
|         %elif "riscv" in arch.name: | ||||
| #if defined(CPU_FEATURES_ARCH_RISCV) | ||||
|     if (GetRiscvInfo().features.${check} == 0){ return 0; } | ||||
| #endif | ||||
|         %else: | ||||
| #if defined(CPU_FEATURES_ARCH_X86) | ||||
|   | ||||
| @@ -44,6 +44,7 @@ ZmqSignalSource::ZmqSignalSource(const ConfigurationInterface* configuration, | ||||
|             LOG(INFO) << "Connecting to ZMQ pub at " << endpoint; | ||||
|             // work around gnuradio interface deficiency | ||||
|             d_source_block = gr::zeromq::sub_source::make(d_item_size, vlen, const_cast<char*>(endpoint.data()), timeout_ms, pass_tags, hwm); | ||||
|             d_source_block->set_tag_propagation_policy(gr::block::TPP_DONT);  // GNSS-SDR doesn't do well with tags/ | ||||
|         } | ||||
|     else | ||||
|         { | ||||
| @@ -94,9 +95,13 @@ auto ZmqSignalSource::get_right_block() -> gr::basic_block_sptr | ||||
|     auto result = gr::basic_block_sptr(); | ||||
|  | ||||
|     if (d_vec_block) | ||||
|         result = d_vec_block;  // NOLINT | ||||
|         { | ||||
|             result = d_vec_block; | ||||
|         } | ||||
|     else | ||||
|         result = d_source_block;  // NOLINT | ||||
|         { | ||||
|             result = d_source_block; | ||||
|         } | ||||
|  | ||||
|     return result; | ||||
| } | ||||
|   | ||||
| @@ -23,6 +23,7 @@ | ||||
| #ifndef GNSS_SDR_FPGA_SWITCH_H | ||||
| #define GNSS_SDR_FPGA_SWITCH_H | ||||
|  | ||||
| #include <cstdint> | ||||
| #include <string> | ||||
|  | ||||
| /** \addtogroup Signal_Source | ||||
|   | ||||
| @@ -664,6 +664,7 @@ void galileo_telemetry_decoder_gs::set_satellite(const Gnss_Satellite &satellite | ||||
|     d_received_tow_ms = std::numeric_limits<uint32_t>::max(); | ||||
|     d_E6_TOW_set = false; | ||||
|     d_valid_timetag = false; | ||||
|     d_inav_nav.init_PRN(d_satellite.get_PRN()); | ||||
|     if (d_there_are_e6_channels) | ||||
|         { | ||||
|             const std::pair<uint32_t, uint64_t> tow_and_sample{d_received_tow_ms, 0ULL}; | ||||
| @@ -684,6 +685,7 @@ void galileo_telemetry_decoder_gs::reset() | ||||
|     d_fnav_nav.set_flag_TOW_set(false); | ||||
|     d_inav_nav.set_flag_TOW_set(false); | ||||
|     d_inav_nav.set_TOW0_flag(false); | ||||
|     d_inav_nav.init_PRN(d_satellite.get_PRN()); | ||||
|     d_last_valid_preamble = d_symbol_counter; | ||||
|     d_sent_tlm_failed_msg = false; | ||||
|     d_E6_TOW_set = false; | ||||
|   | ||||
| @@ -37,12 +37,6 @@ if(NOT GOOGLETEST_FOUND) | ||||
|     if(CMAKE_GENERATOR STREQUAL Xcode) | ||||
|         set(GTEST_BUILD_COMMAND "xcodebuild" "-configuration" $<$<CONFIG:Debug>:Debug>$<$<CONFIG:Release>:Release>$<$<CONFIG:RelWithDebInfo>:RelWithDebInfo>$<$<CONFIG:MinSizeRel>:MinSizeRel> "-target" "gtest_main") | ||||
|     endif() | ||||
|     if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) OR | ||||
|       (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)) | ||||
|         set(GOOGLETEST_GIT_TAG v${GNSSSDR_GTEST_LOCAL_VERSION}) | ||||
|     else() | ||||
|         set(GOOGLETEST_GIT_TAG release-${GNSSSDR_GTEST_LOCAL_VERSION}) | ||||
|     endif() | ||||
|     if(GNSSSDR_GTEST_LOCAL_VERSION VERSION_LESS 1.12.0) | ||||
|         set(DEBUG_DECORATION "d") | ||||
|     else() | ||||
| @@ -51,7 +45,7 @@ if(NOT GOOGLETEST_FOUND) | ||||
|     if(CMAKE_VERSION VERSION_LESS 3.2) | ||||
|         ExternalProject_Add(gtest-${GNSSSDR_GTEST_LOCAL_VERSION} | ||||
|             GIT_REPOSITORY https://github.com/google/googletest | ||||
|             GIT_TAG ${GOOGLETEST_GIT_TAG} | ||||
|             GIT_TAG v${GNSSSDR_GTEST_LOCAL_VERSION} | ||||
|             SOURCE_DIR ${GNSSSDR_BINARY_DIR}/thirdparty/gtest/gtest-${GNSSSDR_GTEST_LOCAL_VERSION} | ||||
|             BINARY_DIR ${GNSSSDR_BINARY_DIR}/gtest-${GNSSSDR_GTEST_LOCAL_VERSION} | ||||
|             CMAKE_ARGS ${GTEST_COMPILER} | ||||
| @@ -80,7 +74,7 @@ if(NOT GOOGLETEST_FOUND) | ||||
|         endif() | ||||
|         ExternalProject_Add(gtest-${GNSSSDR_GTEST_LOCAL_VERSION} | ||||
|             GIT_REPOSITORY https://github.com/google/googletest | ||||
|             GIT_TAG ${GOOGLETEST_GIT_TAG} | ||||
|             GIT_TAG v${GNSSSDR_GTEST_LOCAL_VERSION} | ||||
|             SOURCE_DIR ${GNSSSDR_BINARY_DIR}/thirdparty/gtest/gtest-${GNSSSDR_GTEST_LOCAL_VERSION} | ||||
|             BINARY_DIR ${GNSSSDR_BINARY_DIR}/gtest-${GNSSSDR_GTEST_LOCAL_VERSION} | ||||
|             CMAKE_ARGS ${GTEST_COMPILER} | ||||
| @@ -369,12 +363,14 @@ if(ENABLE_UNIT_TESTING_EXTRA OR ENABLE_SYSTEM_TESTING_EXTRA OR ENABLE_FPGA) | ||||
|         if(CMAKE_VERSION VERSION_GREATER 3.17.0) | ||||
|             set(GNSSTK_PATCH_COMMAND | ||||
|                 cd ${GNSSSDR_BINARY_DIR}/thirdparty/gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION} && | ||||
|                 ${Patch_EXECUTABLE} ${GNSSSDR_BINARY_DIR}/thirdparty/gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION}/CMakeLists.txt < ${GNSSSDR_SOURCE_DIR}/src/tests/data/gnsstk_static14.patch | ||||
|                 ${Patch_EXECUTABLE} ${GNSSSDR_BINARY_DIR}/thirdparty/gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION}/CMakeLists.txt < ${GNSSSDR_SOURCE_DIR}/src/tests/data/gnsstk_static14.patch && | ||||
|                 ${Patch_EXECUTABLE} ${GNSSSDR_BINARY_DIR}/thirdparty/gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION}/core/lib/GNSSCore/ObsID.hpp < ${GNSSSDR_SOURCE_DIR}/src/tests/data/gnsstk_gcc13.patch | ||||
|             ) | ||||
|         else() | ||||
|             set(GNSSTK_PATCH_COMMAND | ||||
|                 cd ${GNSSSDR_BINARY_DIR}/thirdparty/gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION} && | ||||
|                 ${Patch_EXECUTABLE} ${GNSSSDR_BINARY_DIR}/thirdparty/gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION}/CMakeLists.txt < ${GNSSSDR_SOURCE_DIR}/src/tests/data/gnsstk_static13.patch | ||||
|                 ${Patch_EXECUTABLE} ${GNSSSDR_BINARY_DIR}/thirdparty/gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION}/CMakeLists.txt < ${GNSSSDR_SOURCE_DIR}/src/tests/data/gnsstk_static13.patch && | ||||
|                 ${Patch_EXECUTABLE} ${GNSSSDR_BINARY_DIR}/thirdparty/gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION}/core/lib/GNSSCore/ObsID.hpp < ${GNSSSDR_SOURCE_DIR}/src/tests/data/gnsstk_gcc13.patch | ||||
|             ) | ||||
|         endif() | ||||
|         # Patch only once | ||||
| @@ -408,6 +404,9 @@ if(ENABLE_UNIT_TESTING_EXTRA OR ENABLE_SYSTEM_TESTING_EXTRA OR ENABLE_FPGA) | ||||
|                     set(GNSSTK_PARALLEL_BUILD "-j${NUMBER_OF_PROCESSORS}") | ||||
|                 endif() | ||||
|             endif() | ||||
|             if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") | ||||
|                 set(GNSSTK_FLAGS "-DCMAKE_CXX_FLAGS:STRING=-w")  # Fix for clang in aarch64 | ||||
|             endif() | ||||
|             if(CMAKE_VERSION VERSION_GREATER 3.17.0) | ||||
|                 ExternalProject_Add(gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION} | ||||
|                     GIT_REPOSITORY https://github.com/SGL-UT/gnsstk | ||||
| @@ -425,6 +424,7 @@ if(ENABLE_UNIT_TESTING_EXTRA OR ENABLE_SYSTEM_TESTING_EXTRA OR ENABLE_FPGA) | ||||
|                         -DCMAKE_CXX_EXTENSIONS=ON | ||||
|                         -DCMAKE_C_STANDARD=11 | ||||
|                         -DCMAKE_C_EXTENSIONS=ON | ||||
|                         "${GNSSTK_FLAGS}" | ||||
|                     BUILD_COMMAND ${GNSSTK_BUILD_COMMAND} ${GNSSTK_PARALLEL_BUILD} | ||||
|                     BUILD_BYPRODUCTS ${GNSSSDR_BINARY_DIR}/gnsstk-${GNSSSDR_GNSSTK_LOCAL_VERSION}/install/lib/${CMAKE_FIND_LIBRARY_PREFIXES}gnsstk${CMAKE_STATIC_LIBRARY_SUFFIX} | ||||
|                     UPDATE_COMMAND "" | ||||
|   | ||||
							
								
								
									
										12
									
								
								src/tests/data/gnsstk_gcc13.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/tests/data/gnsstk_gcc13.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| SPDX-License-Identifier: GPL-3.0-or-later | ||||
| SPDX-FileCopyrightText: 2022 Carles Fernandez-Prades <carles.fernandez@cttc.es> | ||||
| --- ObsID.hpp 2023-01-23 16:53:25.000000000 +0100 | ||||
| +++ ObsID.hpp 2023-01-23 16:55:14.000000000 +0100 | ||||
| @@ -47,6 +47,7 @@ | ||||
|  #ifndef OBSID_HPP | ||||
|  #define OBSID_HPP | ||||
|   | ||||
| +#include <cstdint> | ||||
|  #include <iostream> | ||||
|  #include <iomanip> | ||||
|  #include <sstream> | ||||
		Reference in New Issue
	
	Block a user
	 Javier Arribas
					Javier Arribas