* initial implementation and tests * [wip] refactor checking of RS code validity * [wip] point GHA badge link to main branch instead of initial_impl * [wip] delete leftover echo at bottom of test_leopard.nim * [wip] add basic usage info to README * [wip] more basic info added to README re: requirements, installation, usage * [wip] add config.nims with --tlsEmulation:off to check if it helps with perf on Windows * [wip] use `object` instead of `object of CatchableError` for LeopardError workaround for edge case encountered in context of nimbus-build-system project * [wip] clarify wording in README re: stability * [wip] can use `object of CatchableError` for LeopardError with workaround * Initial implementation * make Leo a case object * initial test * cleanup * remove echo * use `func` where possible * comments, misc * make construction more convenient * add more tests * more tests * unused warnings * remove sideeffects pragma * fix importc pragma on unix * fix windows build * fix ci * better warning * adding more comprehensive tests * moar tests * add TODO for usage * Update leopard/leopard.nim Co-authored-by: Michael Bradley <michaelsbradleyjr@gmail.com> * Update leopard/wrapper.nim Co-authored-by: Michael Bradley <michaelsbradleyjr@gmail.com> * add tests to reuse same encoder/decoder * check that parity and data buffers are < 65536 * test that data+parity isn't > 65536 Co-authored-by: Michael Bradley, Jr <michaelsbradleyjr@gmail.com>
nim-leopard
Nim wrapper for Leopard-RS: a fast library for Reed-Solomon erasure correction coding.
Requirements
- Same as Leopard-RS' requirements, e.g. CMake 3.7 or newer.
- Nim 1.2 or newer.
Installation
With Nimble
$ nimble install leopard
In a project's .nimble
file
requires "leopard >= 0.0.1 & < 0.0.2"
In a nimbus-build-system project
$ git submodule add https://github.com/status-im/nim-leopard.git vendor/nim-leopard
$ make update
Submodule
Init
status-im/leopard, a fork of catid/leopard (Leopard-RS), is a submodule of nim-leopard.
When nim-leopard is installed with nimble install leopard
, or as a dependency in a Nimble project, or vendored in a nimbus-build-system project, submodule init is handled automatically.
If the nim-leopard repo is cloned directly, then before running nimble develop
or nimble install
in the root of the clone, it's necessary to init the submodule
$ git submodule update --init
Build
The submodule is automatically built (in the nimcache
dir) and statically linked during compilation of any Nim module that has import leopard
or import leopard/wrapper
.
If the nimcache
dir is set to a custom value, it must be an absolute path.
For the build to work on Windows, nimble
or nim c
must be run from a Bash shell, e.g. Git Bash or an MSYS2 shell, and all needed tools (e.g. cmake
and make
) must be available in and suitable for that environment.
OpenMP
Leopard-RS' CMakeLists.txt
checks for OpenMP support. If it is available then it is enabled in the build of libleopard.a
.
Build toolchains commonly installed on Linux and Windows come with support for OpenMP.
The clang/++ compiler in Apple's Xcode does not support OpenMP, but the one installed with brew install llvm
does support it, though it's also necessary to brew install libomp
.
So, on macOS, when running nimble test
of nim-leopard or compiling a project that imports nim-leopard:
- If libomp is not installed and Apple's clang is used, no extra flags need to be passed to the Nim compiler. OpenMP support will not be enabled in
libleopard.a
. - If libomp is installed and Apple's clang is used, this flag should be passed to
nim c
-d:LeopardCmakeFlags="-DCMAKE_BUILD_TYPE=Release -DENABLE_OPENMP=off"
- If the intent is to use brew-installed clang + libomp, the shell environment should be modified
and these flags should be passed to$ export PATH="$(brew --prefix)/opt/llvm/bin:${PATH}" $ export LDFLAGS="-L$(brew --prefix)/opt/libomp/lib -L$(brew --prefix)/opt/llvm/lib -Wl,-rpath,$(brew --prefix)/opt/llvm/lib"
nim c
-d:LeopardCmakeFlags="-DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=$(brew --prefix)/opt/llvm/bin/clang -DCMAKE_CXX_COMPILER=$(brew --prefix)/opt/llvm/bin/clang++" -d:LeopardExtraCompilerlags="-fopenmp" -d:LeopardExtraLinkerFlags="-fopenmp -L$(brew --prefix)/opt/libomp/lib"
Usage
TODO
OpenMP
When OpenMP is enabled, whether or not parallel processing kicks in depends on the symbol and byte counts. On a local machine with an Intel processor RS(256,239)
with symbolBytes == 64
seems to be the lower bound for triggering parallel processing.
Versioning
nim-leopard generally follows the upstream master
branch such that changes there will result in a version bump for this package.
Stability
This package is currently marked as experimental. Until it is marked as stable, it may be subject to breaking changes across any version bump.
License
Wrapper License
nim-leopard is licensed and distributed under either of:
- Apache License, Version 2.0: LICENSE-APACHEv2 or https://opensource.org/licenses/Apache-2.0
- MIT license: LICENSE-MIT or http://opensource.org/licenses/MIT
at your option. The contents of this repository may not be copied, modified, or distributed except according to those terms.
Dependency License
Leopard-RS is licensed under the BSD 3-Clause License. See their licensing page for further information.