import "primitives/core.futil";
import "primitives/memories/comb.futil";
import "primitives/sync.futil";
component main(@go go: 1, @clk clk: 1, @reset reset: 1) -> (@done done: 1) {
cells {
out = comb_mem_d1(32, 1, 3);
val = std_reg(32);
add_0 = std_add(32);
no_use = std_reg(32);
@generated barrier = std_sync_reg(32);
@generated eq = std_eq(32);
@generated wait_restore_reg = std_reg(1);
@generated save = std_reg(32);
@generated incr = std_add(32);
@generated wait_reg = std_reg(1);
@generated save0 = std_reg(32);
@generated incr0 = std_add(32);
@generated wait_reg0 = std_reg(1);
}
wires {
group no_op {
no_use.write_en = 1'd1;
no_use.in = 32'd0;
no_op[done] = no_use.done;
}
group calc_val {
val.write_en = 1'd1;
add_0.right = 32'd1;
add_0.left = 32'd2;
val.in = add_0.out;
calc_val[done] = val.done;
}
group reg_to_mem {
out.addr0 = 3'd0;
out.write_data = val.out;
out.write_en = 1'd1;
reg_to_mem[done] = out.done;
}
group restore {
barrier.write_en_0 = 1'd1;
barrier.in_0 = 32'd0;
restore[done] = barrier.write_done_0;
}
group wait_restore {
wait_restore_reg.in = !eq.out ? 1'd1;
wait_restore_reg.write_en = !eq.out ? 1'd1;
wait_restore[done] = wait_restore_reg.done;
}
group clear_barrier {
barrier.read_en_0 = 1'd1;
clear_barrier[done] = barrier.read_done_0;
}
group incr_barrier {
barrier.read_en_0 = 1'd1;
incr.left = barrier.out_0;
incr.right = 32'd1;
save.in = barrier.read_done_0 ? incr.out;
save.write_en = barrier.read_done_0;
incr_barrier[done] = save.done;
}
group write_barrier {
barrier.write_en_0 = 1'd1;
barrier.in_0 = save.out;
write_barrier[done] = barrier.write_done_0;
}
group wt {
wait_reg.in = eq.out;
wait_reg.write_en = eq.out ? 1'd1;
wt[done] = wait_reg.done;
}
group incr_barrier0 {
barrier.read_en_1 = 1'd1;
incr0.left = barrier.out_1;
incr0.right = 32'd1;
save0.in = barrier.read_done_1 ? incr0.out;
save0.write_en = barrier.read_done_1;
incr_barrier0[done] = save0.done;
}
group write_barrier0 {
barrier.write_en_1 = 1'd1;
barrier.in_1 = save0.out;
write_barrier0[done] = barrier.write_done_1;
}
group wt0 {
wait_reg0.in = eq.out;
wait_reg0.write_en = eq.out ? 1'd1;
wt0[done] = wait_reg0.done;
}
eq.left = barrier.peek;
eq.right = 32'd2;
}
control {
seq {
par {
restore;
}
par {
seq {
no_op;
seq {
incr_barrier;
write_barrier;
wt;
clear_barrier;
restore;
}
reg_to_mem;
}
seq {
calc_val;
seq {
incr_barrier0;
write_barrier0;
wt0;
wait_restore;
}
}
}
}
}
}