// -p group2invoke -p dead-group-removal
import "primitives/core.futil";
import "primitives/memories/comb.futil";
component main() -> () {
cells {
r = std_reg(32);
add = std_add(32);
lt = std_lt(32);
}
wires {
// simple transformation
group write_r {
r.in = 32'd1;
r.write_en = 1'd1;
write_r[done] = r.done;
}
// transform w/ comb group
group add_write_r{
r.in = add.out;
r.write_en = 1'd1;
add_write_r[done] = r.done;
add.left = 32'd2;
add.right = 32'd3;
}
// multiple guarded assignments to r.in
group g{
r.write_en = 1'd1;
r.in = 1'd0 ? 32'd1;
r.in = 1'd0 ? 32'd2;
g[done] = r.done;
}
// need comb group that has multiple combinational cells
group guard2{
lt.left = 32'd2;
lt.right = 32'd4;
add.left = 32'd2;
add.right = lt.out ? r.out;
r.write_en = 1'd1;
r.in = add.out;
guard2[done] = r.done;
}
group read_write_same {
r.write_en = 1'd1;
r.in = r.out;
read_write_same[done] = r.done;
}
}
control {
seq{
write_r;
g;
@foo add_write_r;
@bar guard2;
read_write_same;
}
}
}