data/full_repos/permissive/494622711/verilog/rtl/game_engine.v
1: b'%Warning-WIDTH: data/full_repos/permissive/494622711/verilog/rtl/game_engine.v:49: Operator ADD expects 32 or 10 bits on the RHS, but RHS\'s VARREF \'p_width\' generates 8 bits.\n                                                                                 : ... In instance GameEngine\n    assign max_platform_pos = (position + p_width) >= WIDTH - BORDER;\n                                        ^\n                ... Use "/* verilator lint_off WIDTH */" and lint_on around source to disable this message.\n%Warning-WIDTH: data/full_repos/permissive/494622711/verilog/rtl/game_engine.v:79: Operator ADD expects 10 bits on the RHS, but RHS\'s VARREF \'p_width\' generates 8 bits.\n                                                                                 : ... In instance GameEngine\n    assign in_platform = pix_x > position && pix_x < position + p_width && pix_y < P_MAX_H && pix_y > P_MIN_H;\n                                                              ^\n%Warning-WIDTH: data/full_repos/permissive/494622711/verilog/rtl/game_engine.v:109: Operator ADD expects 32 or 10 bits on the RHS, but RHS\'s SEL generates 8 bits.\n                                                                                  : ... In instance GameEngine\n            b_pos_x <= B_MIN_X + random_counter[7:0];\n                               ^\n%Warning-WIDTH: data/full_repos/permissive/494622711/verilog/rtl/game_engine.v:110: Operator ADD expects 32 or 10 bits on the RHS, but RHS\'s SEL generates 8 bits.\n                                                                                  : ... In instance GameEngine\n            b_pos_y <= BORDER + random_counter[7:0];\n                              ^\n%Warning-WIDTH: data/full_repos/permissive/494622711/verilog/rtl/game_engine.v:115: Operator ADD expects 10 bits on the RHS, but RHS\'s VARREF \'b_speed\' generates 4 bits.\n                                                                                  : ... In instance GameEngine\n                    b_pos_y <= b_pos_y + b_speed;\n                                       ^\n%Warning-WIDTH: data/full_repos/permissive/494622711/verilog/rtl/game_engine.v:119: Operator ADD expects 10 bits on the RHS, but RHS\'s VARREF \'b_speed\' generates 4 bits.\n                                                                                  : ... In instance GameEngine\n                        b_pos_y <= b_pos_y + b_speed;    \n                                           ^\n%Warning-WIDTH: data/full_repos/permissive/494622711/verilog/rtl/game_engine.v:117: Operator ADD expects 10 bits on the RHS, but RHS\'s VARREF \'p_width\' generates 8 bits.\n                                                                                  : ... In instance GameEngine\n                    if (position > b_pos_x + B_SIZE || position + p_width < b_pos_x) begin\n                                                                ^\n%Warning-WIDTH: data/full_repos/permissive/494622711/verilog/rtl/game_engine.v:114: Operator SUB expects 32 or 10 bits on the RHS, but RHS\'s VARREF \'b_speed\' generates 4 bits.\n                                                                                  : ... In instance GameEngine\n                if (b_pos_y <= B_MAX_Y - b_speed - B_SIZE) begin\n                                       ^\n%Warning-WIDTH: data/full_repos/permissive/494622711/verilog/rtl/game_engine.v:132: Operator SUB expects 10 bits on the RHS, but RHS\'s VARREF \'b_speed\' generates 4 bits.\n                                                                                  : ... In instance GameEngine\n                    b_pos_y <= b_pos_y - b_speed;\n                                       ^\n%Warning-WIDTH: data/full_repos/permissive/494622711/verilog/rtl/game_engine.v:131: Operator ADD expects 32 or 10 bits on the RHS, but RHS\'s VARREF \'b_speed\' generates 4 bits.\n                                                                                  : ... In instance GameEngine\n                if (b_pos_y > BORDER + b_speed) begin\n                                     ^\n%Warning-WIDTH: data/full_repos/permissive/494622711/verilog/rtl/game_engine.v:142: Operator ADD expects 10 bits on the RHS, but RHS\'s VARREF \'b_speed\' generates 4 bits.\n                                                                                  : ... In instance GameEngine\n                    b_pos_x <= b_pos_x + b_speed;\n                                       ^\n%Warning-WIDTH: data/full_repos/permissive/494622711/verilog/rtl/game_engine.v:141: Operator SUB expects 32 or 10 bits on the RHS, but RHS\'s VARREF \'b_speed\' generates 4 bits.\n                                                                                  : ... In instance GameEngine\n                if (b_pos_x <= B_MAX_X - b_speed - B_SIZE) begin\n                                       ^\n%Warning-WIDTH: data/full_repos/permissive/494622711/verilog/rtl/game_engine.v:149: Operator SUB expects 10 bits on the RHS, but RHS\'s VARREF \'b_speed\' generates 4 bits.\n                                                                                  : ... In instance GameEngine\n                    b_pos_x <= b_pos_x - b_speed;\n                                       ^\n%Warning-WIDTH: data/full_repos/permissive/494622711/verilog/rtl/game_engine.v:148: Operator ADD expects 32 or 10 bits on the RHS, but RHS\'s VARREF \'b_speed\' generates 4 bits.\n                                                                                  : ... In instance GameEngine\n                if (b_pos_x > B_MIN_X + b_speed) begin\n                                      ^\n%Error: Exiting due to 14 warning(s)\n'
module GameEngine(input clk,
                  input clk_vga,
                  input clk_input,
                  input reset,
                  input active_pixels,
                  input [9:0] counter_x,
                  input [9:0] counter_y,
                  input [9:0] position,
                  output max_platform_pos,
                  output reg [3:0] red,
                  output reg [3:0] green,
                  output reg [3:0] blue);
    
    

    parameter WIDTH    = 640;
    parameter H_FPORCH = 16;
    parameter H_SYNC   = 96;
    parameter H_BPORCH = 48;
    

    parameter HEIGHT   = 480;
    parameter V_FPORCH = 10;
    parameter V_SYNC   = 2;
    parameter V_BPORCH = 33;
    
    parameter H_START = H_SYNC + H_BPORCH;
    parameter V_START = V_SYNC + V_BPORCH;
    
    parameter COLOR_BACKGROUND = 12'hFFF;
    parameter COLOR_BORDER     = 12'h40A;
    parameter COLOR_PLATFORM   = 12'hF00;
    parameter COLOR_BALL       = 12'hA09;
    parameter COLOR_LOST       = 12'h0F0;

    parameter BORDER = 10;
    
    parameter P_HEIGHT = 30;
    parameter P_MIN_H = HEIGHT - BORDER - P_HEIGHT;
    parameter P_MAX_H = HEIGHT - BORDER;
    
    parameter P_MIN_X = BORDER;
    parameter P_WIDTH_MAX = 150;
    parameter P_WIDTH_MIN = 20;
    parameter P_REDUCT = 4;

    
    reg[7:0] p_width = P_WIDTH_MAX;    
    assign max_platform_pos = (position + p_width) >= WIDTH - BORDER;


    parameter B_MAX_Y = P_MIN_H;
    parameter B_MIN_X = BORDER;
    parameter B_MAX_X = WIDTH - BORDER;
    parameter B_SIZE  = 20;
    
    reg [9:0] b_pos_x = B_MIN_X;
    reg [9:0] b_pos_y = BORDER;
    reg [12:0] random_counter;
    
    wire [9:0] pix_x;
    wire [9:0] pix_y;
    
    assign pix_x = counter_x - H_START;
    assign pix_y = counter_y - V_START;


    reg b_going_up    = 1;
    reg b_going_right = 1;
    reg in_play = 1;
    reg [3:0] b_speed = 5;



    wire in_platform;
    wire in_ball;
    wire in_border;

    assign in_platform = pix_x > position && pix_x < position + p_width && pix_y < P_MAX_H && pix_y > P_MIN_H;
    assign in_ball = pix_x > b_pos_x && pix_x < b_pos_x + B_SIZE && pix_y > b_pos_y && pix_y < b_pos_y + B_SIZE;
    assign in_border = pix_x < BORDER || pix_y < BORDER || pix_x > WIDTH - BORDER;


    always @(posedge clk_vga) begin
        if (~active_pixels) begin
            {red[3:0], green[3:0], blue[3:0]} <= 0;
        end else if (~in_play) begin
            {red[3:0], green[3:0], blue[3:0]} <= {pix_x[9:6] + random_counter[8:5], pix_x[9:6] + random_counter[9:6], pix_y[9:6] + random_counter[9:6]};
        end else if (in_border) begin
            {red[3:0], green[3:0], blue[3:0]} <= COLOR_BORDER;
        end else if (in_ball) begin
            {red[3:0], green[3:0], blue[3:0]} <= COLOR_BALL;
        end else if (in_platform) begin
            {red[3:0], green[3:0], blue[3:0]} <= COLOR_PLATFORM;
        end else begin
            {red[3:0], green[3:0], blue[3:0]} <= COLOR_BACKGROUND;
        end
    end
    
    parameter P_JUMP = 4;
    
    always @ (posedge clk_input) begin
        random_counter <= random_counter + 1;
        if (reset) begin
            in_play <= 1;
            b_going_up <= 0;
            b_going_right <= 0;
            p_width <= P_WIDTH_MAX;
            b_pos_x <= B_MIN_X + random_counter[7:0];
            b_pos_y <= BORDER + random_counter[7:0];
            b_speed <= 5;
        end else begin
            if (b_going_up) begin
                if (b_pos_y <= B_MAX_Y - b_speed - B_SIZE) begin
                    b_pos_y <= b_pos_y + b_speed;
                end else begin
                    if (position > b_pos_x + B_SIZE || position + p_width < b_pos_x) begin
                        in_play <= 0;
                        b_pos_y <= b_pos_y + b_speed;    
                    end else begin
                        b_going_up <= 0;
                    	b_speed <= b_speed + 1;
                        b_pos_y <= P_MIN_H - B_SIZE;
                        if (p_width > P_WIDTH_MIN) begin
                            p_width <= p_width - P_REDUCT;
                        end
                    end
                    
                end 
            end else begin
                if (b_pos_y > BORDER + b_speed) begin
                    b_pos_y <= b_pos_y - b_speed;
                end else begin
                    b_going_up <= 1;
                    b_pos_y <= BORDER;
                end
            end


            if (b_going_right) begin
                if (b_pos_x <= B_MAX_X - b_speed - B_SIZE) begin
                    b_pos_x <= b_pos_x + b_speed;
                end else begin
                    b_going_right <= 0;
                    b_pos_x <= B_MAX_X - B_SIZE;
                end 
            end else begin
                if (b_pos_x > B_MIN_X + b_speed) begin
                    b_pos_x <= b_pos_x - b_speed;
                    end else begin
                    b_going_right <= 1;
                    b_pos_x <= B_MIN_X;
                end
            end
        end
    end
    
endmodule
module GameEngine(input clk,
                  input clk_vga,
                  input clk_input,
                  input reset,
                  input active_pixels,
                  input [9:0] counter_x,
                  input [9:0] counter_y,
                  input [9:0] position,
                  output max_platform_pos,
                  output reg [3:0] red,
                  output reg [3:0] green,
                  output reg [3:0] blue);

    
    

    parameter WIDTH    = 640;
    parameter H_FPORCH = 16;
    parameter H_SYNC   = 96;
    parameter H_BPORCH = 48;
    

    parameter HEIGHT   = 480;
    parameter V_FPORCH = 10;
    parameter V_SYNC   = 2;
    parameter V_BPORCH = 33;
    
    parameter H_START = H_SYNC + H_BPORCH;
    parameter V_START = V_SYNC + V_BPORCH;
    
    parameter COLOR_BACKGROUND = 12'hFFF;
    parameter COLOR_BORDER     = 12'h40A;
    parameter COLOR_PLATFORM   = 12'hF00;
    parameter COLOR_BALL       = 12'hA09;
    parameter COLOR_LOST       = 12'h0F0;

    parameter BORDER = 10;
    
    parameter P_HEIGHT = 30;
    parameter P_MIN_H = HEIGHT - BORDER - P_HEIGHT;
    parameter P_MAX_H = HEIGHT - BORDER;
    
    parameter P_MIN_X = BORDER;
    parameter P_WIDTH_MAX = 150;
    parameter P_WIDTH_MIN = 20;
    parameter P_REDUCT = 4;

    
    reg[7:0] p_width = P_WIDTH_MAX;    
    assign max_platform_pos = (position + p_width) >= WIDTH - BORDER;


    parameter B_MAX_Y = P_MIN_H;
    parameter B_MIN_X = BORDER;
    parameter B_MAX_X = WIDTH - BORDER;
    parameter B_SIZE  = 20;
    
    reg [9:0] b_pos_x = B_MIN_X;
    reg [9:0] b_pos_y = BORDER;
    reg [12:0] random_counter;
    
    wire [9:0] pix_x;
    wire [9:0] pix_y;
    
    assign pix_x = counter_x - H_START;
    assign pix_y = counter_y - V_START;


    reg b_going_up    = 1;
    reg b_going_right = 1;
    reg in_play = 1;
    reg [3:0] b_speed = 5;



    wire in_platform;
    wire in_ball;
    wire in_border;

    assign in_platform = pix_x > position && pix_x < position + p_width && pix_y < P_MAX_H && pix_y > P_MIN_H;
    assign in_ball = pix_x > b_pos_x && pix_x < b_pos_x + B_SIZE && pix_y > b_pos_y && pix_y < b_pos_y + B_SIZE;
    assign in_border = pix_x < BORDER || pix_y < BORDER || pix_x > WIDTH - BORDER;


    always @(posedge clk_vga) begin
        if (~active_pixels) begin
            {red[3:0], green[3:0], blue[3:0]} <= 0;
        end else if (~in_play) begin
            {red[3:0], green[3:0], blue[3:0]} <= {pix_x[9:6] + random_counter[8:5], pix_x[9:6] + random_counter[9:6], pix_y[9:6] + random_counter[9:6]};
        end else if (in_border) begin
            {red[3:0], green[3:0], blue[3:0]} <= COLOR_BORDER;
        end else if (in_ball) begin
            {red[3:0], green[3:0], blue[3:0]} <= COLOR_BALL;
        end else if (in_platform) begin
            {red[3:0], green[3:0], blue[3:0]} <= COLOR_PLATFORM;
        end else begin
            {red[3:0], green[3:0], blue[3:0]} <= COLOR_BACKGROUND;
        end
    end
    
    parameter P_JUMP = 4;
    
    always @ (posedge clk_input) begin
        random_counter <= random_counter + 1;
        if (reset) begin
            in_play <= 1;
            b_going_up <= 0;
            b_going_right <= 0;
            p_width <= P_WIDTH_MAX;
            b_pos_x <= B_MIN_X + random_counter[7:0];
            b_pos_y <= BORDER + random_counter[7:0];
            b_speed <= 5;
        end else begin
            if (b_going_up) begin
                if (b_pos_y <= B_MAX_Y - b_speed - B_SIZE) begin
                    b_pos_y <= b_pos_y + b_speed;
                end else begin
                    if (position > b_pos_x + B_SIZE || position + p_width < b_pos_x) begin
                        in_play <= 0;
                        b_pos_y <= b_pos_y + b_speed;    
                    end else begin
                        b_going_up <= 0;
                    	b_speed <= b_speed + 1;
                        b_pos_y <= P_MIN_H - B_SIZE;
                        if (p_width > P_WIDTH_MIN) begin
                            p_width <= p_width - P_REDUCT;
                        end
                    end
                    
                end 
            end else begin
                if (b_pos_y > BORDER + b_speed) begin
                    b_pos_y <= b_pos_y - b_speed;
                end else begin
                    b_going_up <= 1;
                    b_pos_y <= BORDER;
                end
            end


            if (b_going_right) begin
                if (b_pos_x <= B_MAX_X - b_speed - B_SIZE) begin
                    b_pos_x <= b_pos_x + b_speed;
                end else begin
                    b_going_right <= 0;
                    b_pos_x <= B_MAX_X - B_SIZE;
                end 
            end else begin
                if (b_pos_x > B_MIN_X + b_speed) begin
                    b_pos_x <= b_pos_x - b_speed;
                    end else begin
                    b_going_right <= 1;
                    b_pos_x <= B_MIN_X;
                end
            end
        end
    end
    
endmodule