use cmtc::*;
use cmtrs::*;
itfc_declare! {
struct ForExample {
out: output Type::UInt(4)
}
method out () -> (out);
method start ();
}
#[module]
fn make_for_example() -> ForExample {
let io = io! {};
let mut r = instance!(stl::reg(&Type::UInt(4)));
let mut sum = instance!(stl::reg(&Type::UInt(4)));
let out = method!(
() -> (io.out) {
ret!(sum)
}
);
let start = method!(
fsm;
() {
seq!(
for_!(
( r %= literal(0, &Type::UInt(4)); true; r %= &r + literal(1, &Type::UInt(4)); r.lt(literal(3, &Type::UInt(4))) ) { step!{ sum %= &sum + &r; }; }
);
step!{ sum %= 0.uint(4);};
for_!(
loose;
( r%= 0.uint(4); r.lt(literal(4, &Type::UInt(4))); r %= &r + literal(1, &Type::UInt(4)) ) { step!{ sum %= &sum + &r; }; }
);
)
}
);
schedule!(out, start);
}
fn main() -> anyhow::Result<()> {
let for_example = make_for_example();
utils::setup_logger();
elaborate(for_example, sv_config("tb/for_example/for_example.sv"))?;
Ok(())
}