// 多蚂蚁引擎 - 支持N只蚂蚁同时运行
module multi_ant #(
    parameter WIDTH  = 128,
    parameter HEIGHT = 128,
    parameter NUM_ANTS = 4
)(
    input  wire             clk,
    input  wire             rst_n,
    input  wire             enable,
    output wire [7:0]       ant_x [0:NUM_ANTS-1],
    output wire [7:0]       ant_y [0:NUM_ANTS-1],
    output wire [1:0]       ant_dir [0:NUM_ANTS-1],
    output wire [WIDTH*HEIGHT-1:0] grid
);
    reg [WIDTH*HEIGHT-1:0] grid_r;
    reg [7:0]  ax [0:NUM_ANTS-1];
    reg [7:0]  ay [0:NUM_ANTS-1];
    reg [1:0]  adir [0:NUM_ANTS-1];
    reg [31:0] steps;
    
    integer a;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            grid_r <= {WIDTH*HEIGHT{1'b0}};
            for (a = 0; a < NUM_ANTS; a = a + 1) begin
                ax[a]   <= WIDTH/2 + a*8;
                ay[a]   <= HEIGHT/2;
                adir[a] <= a[1:0];
            end
        end else if (enable) begin
            for (a = 0; a < NUM_ANTS; a = a + 1) begin
                reg [15:0] idx_a;
                reg cur_color;
                reg [1:0] ndir;
                idx_a = ay[a] * WIDTH + ax[a];
                cur_color = grid_r[idx_a];
                ndir = cur_color ? (adir[a] - 2'd1) : (adir[a] + 2'd1);
                grid_r[idx_a] <= ~cur_color;
                adir[a] <= ndir;
                case (ndir)
                    2'd0: ay[a] <= (ay[a]==0) ? HEIGHT-1 : ay[a]-1;
                    2'd1: ax[a] <= (ax[a]==WIDTH-1) ? 0 : ax[a]+1;
                    2'd2: ay[a] <= (ay[a]==HEIGHT-1) ? 0 : ay[a]+1;
                    2'd3: ax[a] <= (ax[a]==0) ? WIDTH-1 : ax[a]-1;
                endcase
            end
            steps <= steps + 32'd1;
        end
    end
    genvar gi;
    generate
        for (gi = 0; gi < NUM_ANTS; gi = gi + 1) begin
            assign ant_x[gi] = ax[gi];
            assign ant_y[gi] = ay[gi];
            assign ant_dir[gi] = adir[gi];
        end
    endgenerate
    assign grid = grid_r;
endmodule