futuresdr 0.0.38

An Experimental Async SDR Runtime for Heterogeneous Architectures.
Documentation
use anyhow::Context;
use anyhow::Result;
use futuresdr::blocks::Copy;
use futuresdr::blocks::VectorSink;
use futuresdr::blocks::VectorSinkBuilder;
use futuresdr::blocks::VectorSource;
use futuresdr::runtime::Flowgraph;
use futuresdr::runtime::Runtime;
use std::iter::repeat_with;
use std::time;

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

    let n_items = 20_000;
    let n_copy = 1000;

    let orig: Vec<f32> = repeat_with(rand::random::<f32>).take(n_items).collect();

    let src = fg.add_block(VectorSource::new(orig.clone()))?;
    let snk = fg.add_block(
        VectorSinkBuilder::<f32>::new()
            .init_capacity(n_items)
            .build(),
    )?;

    let mut prev = 0;
    for i in 0..n_copy {
        let t = fg.add_block(Copy::<f32>::new())?;

        if i == 0 {
            fg.connect_stream(src, "out", t, "in")?;
        } else {
            fg.connect_stream(prev, "out", t, "in")?;
        }
        prev = t;
    }

    fg.connect_stream(prev, "out", snk, "in")?;

    let now = time::Instant::now();
    fg = Runtime::new().run(fg)?;
    let elapsed = now.elapsed();

    let snk = fg
        .kernel::<VectorSink<f32>>(snk)
        .context("block not found")?;
    let v = snk.items();

    assert_eq!(v.len(), n_items);
    for i in 0..v.len() {
        assert!((orig[i] - v[i]).abs() < f32::EPSILON);
    }

    println!("flowgraph took {elapsed:?}");

    Ok(())
}