import "primitives/std.lib";
component main(@go go: 1, @clk clk: 1, @reset reset: 1) -> (@done done: 1) {
  cells {
    a = std_reg(2);
    b = std_reg(2);
    c = std_reg(2);
    @generated fsm = std_reg(2);
  }
  wires {
    group A {
      a.in = 2'd0;
      a.write_en = 1'd1;
      A[done] = a.done;
    }
    group B {
      b.in = 2'd1;
      b.write_en = 1'd1;
      B[done] = b.done;
    }
    group C {
      c.in = 2'd2;
      c.write_en = 1'd1;
      C[done] = c.done;
    }
    group seq {
      A[go] = fsm.out == 2'd0 & !A[done] ? 1'd1;
      fsm.in = fsm.out == 2'd0 & A[done] ? 2'd1;
      fsm.write_en = fsm.out == 2'd0 & A[done] ? 1'd1;
      B[go] = fsm.out == 2'd1 & !B[done] ? 1'd1;
      fsm.in = fsm.out == 2'd1 & B[done] ? 2'd2;
      fsm.write_en = fsm.out == 2'd1 & B[done] ? 1'd1;
      C[go] = fsm.out == 2'd2 & !C[done] ? 1'd1;
      fsm.in = fsm.out == 2'd2 & C[done] ? 2'd3;
      fsm.write_en = fsm.out == 2'd2 & C[done] ? 1'd1;
      seq[done] = fsm.out == 2'd3 ? 1'd1;
    }
    fsm.in = fsm.out == 2'd3 ? 2'd0;
    fsm.write_en = fsm.out == 2'd3 ? 1'd1;
  }

  control {
    seq;
  }
}