futuresdr 0.0.38

An Experimental Async SDR Runtime for Heterogeneous Architectures.
Documentation
use anyhow::Result;
use futuresdr::blocks::Copy;
use futuresdr::blocks::VectorSink;
use futuresdr::blocks::VectorSinkBuilder;
use futuresdr::blocks::VectorSource;
use futuresdr::blocks::Zynq;
use futuresdr::runtime::Flowgraph;
use futuresdr::runtime::Runtime;
use futuresdr::runtime::buffer::zynq::D2H;
use futuresdr::runtime::buffer::zynq::H2D;
use rand::Rng;
use rand::distr::Uniform;

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

    let n_items = 100_000;
    let orig: Vec<u32> = rand::rng()
        .sample_iter(Uniform::<u32>::new(0, 1024).unwrap())
        .take(n_items)
        .collect();

    let src = VectorSource::<u32>::new(orig.clone());
    let cpy = Copy::<u32>::new();
    let zynq = Zynq::<u32, u32>::new("uio4", "uio5", vec!["udmabuf0", "udmabuf1"])?;
    let snk = VectorSinkBuilder::<u32>::new().build();

    let src = fg.add_block(src)?;
    let cpy = fg.add_block(cpy)?;
    let zynq = fg.add_block(zynq)?;
    let snk = fg.add_block(snk)?;

    fg.connect_stream(src, "out", cpy, "in")?;
    fg.connect_stream_with_type(cpy, "out", zynq, "in", H2D::with_size(1 << 14))?;
    fg.connect_stream_with_type(zynq, "out", snk, "in", D2H::new())?;

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

    let snk = fg.kernel::<VectorSink<u32>>(snk).unwrap();
    let v = snk.items();

    assert_eq!(v.len(), n_items);
    for i in 0..v.len() {
        assert_eq!(orig[i] + 123, v[i]);
    }

    Ok(())
}