MCPcopy Index your code
hub / github.com/FutureSDR/FutureSDR

github.com/FutureSDR/FutureSDR @main

Chat with this repo
repository ↗ · DeepWiki ↗ · + Follow
2,903 symbols 8,425 edges 446 files 555 documented · 19%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

FutureSDR

An experimental asynchronous SDR runtime for heterogeneous architectures that is:

  • Extensible: custom buffers (supporting accelerators like GPUs and FPGAs) and custom schedulers (optimized for your application).

  • Asynchronous: solving long-standing issues around IO, blocking, and timers.

  • Portable: Linux, Windows, Mac, WASM, Android, and prime support for embedded platforms through a REST API and web-based GUIs.

  • Fast: SDR go brrr!

Crates.io Apache 2.0 licensed Build Status

Website | Guides | API Docs | Chat

Overview

FutureSDR supports Blocks with synchronous or asynchronous implementations for stream-based or message-based data processing. Blocks can be combined to a Flowgraph and launched on a Runtime that is driven by a Scheduler.

  • Single and multi-threaded schedulers, including examples for application-specific implementations.
  • Portable GPU acceleration using the Vulkan API (supports Linux, Windows, Android, ...).
  • User space DMA driver for Xilinx Zynq to interface FPGAs.

Development

Since FutureSDR is in an early state of development, it is likely that SDR applications will require changes to the runtime. We, therefore, do not recommend to add it as a dependency in a separate project but to clone the repository and implement the application as binary, example, or sub-crate.

Example

An example flowgraph that forwards 123 zeros into a sink:

use futuresdr::anyhow::Result;
use futuresdr::blocks::Head;
use futuresdr::blocks::NullSink;
use futuresdr::blocks::NullSource;
use futuresdr::macros::connect;
use futuresdr::runtime::Flowgraph;
use futuresdr::runtime::Runtime;

fn main() -> Result<()> {
    let mut fg = Flowgraph::new();

    let src = NullSource::<u8>::new();
    let head = Head::<u8>::new(123);
    let snk = NullSink::<u8>::new();

    connect!(fg, src > head > snk);

    Runtime::new().run(fg)?;

    Ok(())
}

Credits

Contributing

Contributions are very welcome. Please see the (work-in-progress) contributing guide for more information. If you develop larger features or work on major changes with the main intention to submit them upstream, it would be great, if you could announce them in advance.

Conduct

The FutureSDR project adheres to the Rust Code of Conduct. It describes the minimum behavior expected from all contributors.

License

This project is licensed under the Apache 2.0 license.

The main motivation for this license is that * it better fits the Rust ecosystem * it eases adoption; one can use (parts of) the code with close to no strings attached * using Open Source and not contributing back (for the time being) seems better than not using Open Source at all

Contributions

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in FutureSDR, shall be licensed as Apache 2.0, without any additional terms or conditions.

Extension points exported contracts — how you extend this code

Kernel (Interface)
Processing logic for a block. `Kernel` is the central trait custom block authors implement. The `#[derive(Block)]` macr [143 …
src/runtime/kernel.rs
Filter (Interface)
Trait for a state-less filter [12 implementers]
crates/futuredsp/src/lib.rs
BufferType (Interface)
(no doc) [3 implementers]
perf/null/null.rs
IntoAntenna (Interface)
(no doc) [3 implementers]
src/blocks/seify/builder.rs
PmtAny (Interface)
Trait object support for type-erased in-process PMT payloads. Any clonable, sendable, sync, `'static` type implements t [1 …
crates/types/src/pmt.rs
BufferType (Interface)
(no doc) [2 implementers]
perf/inplace/add.rs
BufferType (Interface)
(no doc) [2 implementers]
perf/buffer_rand/buffer_rand.rs
BufferType (Interface)
(no doc) [2 implementers]
perf/buffer_size/buffer_size.rs

Core symbols most depended-on inside this repo

len
called by 515
examples/burn/src/dataset.rs
clone
called by 285
src/runtime/channel.rs
map
called by 237
examples/wlan/src/lib.rs
push
called by 212
src/blocks/pfb/window_buffer.rs
into
called by 176
src/blocks/seify/builder.rs
run
called by 167
src/runtime/mocker.rs
add
called by 166
src/runtime/flowgraph.rs
slice
called by 139
perf/perf/src/spsc.rs

Shape

Method 1,640
Function 617
Class 529
Enum 69
Interface 48

Languages

Rust96%
Python2%
TypeScript1%
C++1%
Kotlin1%

Modules by API surface

src/runtime/flowgraph.rs98 symbols
src/runtime/buffer/mod.rs58 symbols
examples/rattlegram/src/decoder.rs50 symbols
examples/lora/src/utils.rs50 symbols
examples/m17/src/symbol_sync.rs44 symbols
src/runtime/buffer/burn/burn.rs41 symbols
examples/rattlegram/src/polar.rs41 symbols
src/blocks/wasm/hack_rf.rs39 symbols
src/runtime/mocker.rs38 symbols
src/runtime/buffer/queued.rs38 symbols
src/runtime/buffer/circuit.rs38 symbols
src/runtime/scheduler/wasm.rs34 symbols

For agents

$ claude mcp add FutureSDR \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact