Initial commit
This commit is contained in:
143
src/main.rs
Normal file
143
src/main.rs
Normal 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();
|
||||
}
|
||||
Reference in New Issue
Block a user