Initial commit

This commit is contained in:
2026-03-05 23:03:21 +01:00
commit ed9027d12c
14 changed files with 867 additions and 0 deletions

143
src/main.rs Normal file
View File

@ -0,0 +1,143 @@
use ntw_flowgraph::Block;
use ntw_flowgraph::BlockWork;
use ntw_flowgraph::graph::Graph;
use ntw_flowgraph::inout::In;
use ntw_flowgraph::inout::Out;
use ntw_flowgraph::inout::Stream;
use ntw_flowgraph_macros::Block;
use ringbuf::traits::Consumer;
use ringbuf::traits::Observer;
use ringbuf::traits::Producer;
#[derive(Block)]
pub struct VecSource
{
vector: Vec<u32>,
#[output]
out: Out<u32>,
}
impl BlockWork for VecSource
{
fn work(&mut self)
{
while let Some(element) = self.vector.pop()
{
match self.out.rb.try_push(element)
{
Ok(()) =>
{}
Err(x) =>
{
self.vector.push(x);
break;
}
}
}
}
fn ready(&self) -> bool
{
self.vector.len() > 0 && self.out.rb.vacant_len() > 0
}
}
impl VecSource
{
pub fn new(vector: Vec<u32>) -> (VecSource, In<u32>)
{
let (out, stream) = Stream::make(16);
(VecSource { vector, out }, stream)
}
}
#[derive(Block)]
pub struct Adder
{
#[input]
in_a: In<u32>,
#[input]
in_b: In<u32>,
#[output]
out: Out<u32>,
}
impl BlockWork for Adder
{
fn work(&mut self)
{
while let Some(a) = self.in_a.rb.try_pop()
&& let Some(b) = self.in_b.rb.try_pop()
&& self.out.rb.vacant_len() > 0
{
let _ = self.out.rb.try_push(a + b);
}
}
fn ready(&self) -> bool
{
self.in_a.rb.occupied_len() > 0
&& self.in_b.rb.occupied_len() > 0
&& self.out.rb.vacant_len() > 0
}
}
impl Adder
{
pub fn new(in_a: In<u32>, in_b: In<u32>) -> (Adder, In<u32>)
{
let (out, stream) = Stream::make(16);
(Adder { in_a, in_b, out }, stream)
}
}
#[derive(Block)]
pub struct PrintSink
{
#[input]
stream: In<u32>,
}
impl BlockWork for PrintSink
{
fn work(&mut self)
{
if let Some(x) = self.stream.rb.try_pop()
{
println!("{x}");
}
}
fn ready(&self) -> bool
{
self.stream.rb.occupied_len() > 0
}
}
impl PrintSink
{
pub fn new(stream: In<u32>) -> PrintSink
{
PrintSink { stream }
}
}
fn main()
{
let (vector_a, a) = VecSource::new((0..15).collect());
let (vector_b, b) = VecSource::new((0..15).collect());
let (adder, sum) = Adder::new(a, b);
let printer = PrintSink::new(sum);
let mut graph = Graph::new();
graph.add_block(printer);
graph.add_block(adder);
graph.add_block(vector_a);
graph.add_block(vector_b);
graph.run();
}