module rolfmobile99_alu_fsm_top(
  input [7:0] io_in,
  output [7:0] io_out
);

  wire clk = io_in[7];
  wire reset = io_in[6];
  wire ctl_in = io_in[5];
  wire notused = io_in[4];
  wire [3:0] databus = io_in[3:0];

  assign io_out[4] = aluCout;
  assign io_out[3:0] = aluOut[3:0];

  wire [2:0] state_out;
  wire enA, enB, enM, enC, selC;
  wire rst_out;

  wire [3:0] aluA, aluB;	// tmp: to alu A input
  wire aluCout;
  wire aluZ;				// notused
  wire [3:0] aluOut;
  wire [3:0] aluOp;			// bit0: add=0, sub=1  bit1: enCin  bit2,3: unused
  wire op0;					// bit0 of above

  assign op0 = aluOp[0];


  // connect modules

  alu_fsm alu_fsm(
    .ctl(ctl_in),
    .curstate(state_out),
    .rst_out(rst_out),
    .enA(enA),
    .enB(enB),
    .enM(enM),
    .enC(enC),
    .selC(selC),
    .reset(reset),
    .clk(clk) );	// clk with 'clk' signal

  flop_4 regA(
    .dd(databus),
    .qq(aluA),
    .qEn(1'b1),		// always enable output
    .reset(rst_out),// clear on reset state
    .cEn(enA),
    .clk(clk) );	// clk with 'clk' signal

  flop_4 regB(
    .dd(databus),
    .qq(aluB),
    .qEn(1'b1),		// always enable output
    .reset(rst_out),// clear on reset state
    .cEn(enB),
    .clk(clk) );	// clk with 'clk' signal

  flop_4 regM(
    .dd(databus),
    .qq(aluOp),		// note: regM drives aluOp lines
    .qEn(1'b1),		// always enable output
    .reset(rst_out),// clear on reset state
    .cEn(enM),
    .clk(clk) );	// clk with 'clk' signal

  alu_4 alu(
    .op(op0),	// controls add/sub
    .a(aluA),
    .b(aluB),
    .cin(1'b0),		// tmp: carryin=0
    .out(aluOut),
    .z(aluZ),		// alu zero (notused)
    .cout(aluCout),
    .outEn(1'b1) );	// always enable output

endmodule