// -p infer-static-timing import "primitives/core.futil"; /** * Tests the infer-static-timing pass. `exponent` is intentionally placed * after main to test post-order iteration of components. */ component main() -> () { cells { r = std_reg(32); exp0 = exponent(); } wires { group upd0 { r.in = 32'd1; r.write_en = 1'd1; upd0[done] = r.done; } } control { seq { upd0; invoke exp0(base = r.out, exp = r.out)(); } } } component exponent(base: 32, exp: 4) -> (out: 32) { cells { r1 = std_reg(32); r2 = std_reg(32); } wires { group upd2 { r2.in = 32'd1; r2.write_en = 1'd1; upd2[done] = r2.done; } group upd1 { r1.in = 32'd1; r1.write_en = 1'd1; upd1[done] = r1.done; } } control { seq { upd1; upd2; } } }