use polydat::compile::assembly::{PolydatAssembler, WireRef};
use polydat::library::arithmetic::{MixedRadix, Mod};
use polydat::library::hash::Hash;
fn main() {
let mut asm = PolydatAssembler::new(vec!["cycle".into()]);
asm.add_node(
"decompose",
Box::new(MixedRadix::new(vec![100, 1000, 0])),
vec![WireRef::input("cycle")],
);
asm.add_node(
"region_h",
Box::new(Hash::new()),
vec![WireRef::node_port("decompose", 0)],
);
asm.add_node(
"region_code",
Box::new(Mod::new(10000)),
vec![WireRef::node("region_h")],
);
asm.add_output("region", WireRef::node_port("decompose", 0));
asm.add_output("device", WireRef::node_port("decompose", 1));
asm.add_output("reading", WireRef::node_port("decompose", 2));
asm.add_output("region_code", WireRef::node("region_code"));
let mut kernel = asm.compile_kernel().expect("assembly failed");
println!("cycle region device reading region_code");
println!("-------- ------ ------ ------- -----------");
for cycle in [0, 1, 50, 100, 10000, 100000] {
kernel.set_inputs(&[cycle]);
println!(
"{cycle:>8} {:>6} {:>6} {:>7} {:>11}",
kernel.pull("region").as_u64(),
kernel.pull("device").as_u64(),
kernel.pull("reading").as_u64(),
kernel.pull("region_code").as_u64(),
);
}
}