/* String manipulator FSM that removes the second 1 from any
* set of consecutive 1 inputs.
*/
module fsm (input logic clk, reset, in,
output logic out);
// present and next state
enum logic [1:0] {S0, S1, S3} ps, ns;
// next state logic
always_comb
case (ps)
S0: if (in) ns = S1;
else ns = S0;
S1: if (in) ns = S3;
else ns = S0;
S3: if (in) ns = S3;
else ns = S0;
endcase
// output logic
assign out = in & (ps[1] | ~ps[0]);
// sequential logic (DFFs)
// synchronous reset
always_ff @(posedge clk)
if (reset)
ps <= S0; // reset state
else
ps <= ns;
endmodule // fsm