CCCPaste

5ccf5e75beb21

module full_flagram (
    output wire [15:0] o_w_out,
    input wire i_w_clk,
    input wire [3:0] i_w_address,
    input wire [3:0] i_w_data,
    input wire i_w_we,
    input wire i_w_oe,
    input wire i_w_flags_out
);
    // FLAGS
    wire [15:0] l_w_flags;

    // RAM read data
    wire [3:0] l_w_ram_data;

    // RAM
    sol_ram #(
        .p_data_width(4),
        .p_address_width(4)
    ) ram_inst (
        .o_w_out(l_w_ram_data),
        .i_w_in(i_w_data),
        .i_w_address(i_w_address),
        .i_w_we(i_w_we),
        .i_w_oe(i_w_oe),
        .i_w_clk(i_w_clk)
    );

    // Flags
    wire Z_flag;
    wire S_flag;
    wire E_flag;
    wire O_flag;
    wire C2_flag;
    wire S2_flag;
    wire G4_flag;
    wire L4_flag;
    wire POW_flag;
    wire SMAX_flag;
    wire SMIN_flag;
    wire MAX_flag;
    wire PAL_flag;
    wire SB2_flag;

    assign Z_flag = (|l_w_ram_data);
    assign S_flag = l_w_ram_data[3];
    assign E_flag = (~(^l_w_ram_data));
    assign O_flag = (^l_w_ram_data);
    assign C2_flag = !l_w_ram_data[2];
    assign S2_flag = l_w_ram_data[2];
    assign G4_flag = l_w_ram_data > 4'd4;
    assign L4_flag = l_w_ram_data < 4'd4;
    assign POW_flag = (l_w_ram_data == 4'd1) || (l_w_ram_data == 4'd2) || (l_w_ram_data == 4'd4) || (l_w_ram_data == 4'd8);
    assign SMAX_flag = l_w_ram_data == 4'd7;
    assign SMIN_flag = l_w_ram_data == 4'd8;
    assign MAX_flag = l_w_ram_data == 4'd15;
    assign PAL_flag = (l_w_ram_data[0] == l_w_ram_data[3]) && (l_w_ram_data[1] == l_w_ram_data[2]);
    assign SB2_flag = (l_w_ram_data[3] == l_w_ram_data[2]) || (l_w_ram_data[2] == l_w_ram_data[1]) || (l_w_ram_data[1] == l_w_ram_data[0]);

    wire [15:0] l_w_flags_in;
    wire [15:0] l_w_flags_out;
    assign l_w_flags_in = {2'd0, SB2_flag, PAL_flag, MAX_flag, SMIN_flag, SMAX_flag, POW_flag, L4_flag, G4_flag, S2_flag, C2_flag, O_flag, E_flag, S_flag, Z_flag};

    // register for FLGAS
    sol_register #(
        .p_data_width(16)
    ) register_inst (
        .o_w_out(l_w_flags_out),
        .i_w_in(l_w_flags_in),
        .i_w_we(i_w_oe),
        .i_w_oe(i_w_flags_out),
        .i_w_clk(i_w_clk),
        .i_w_reset(1'b1)
    );

    assign o_w_out = i_w_we ? 16'd0 : (i_w_oe ? {12'd0, l_w_ram_data} : (i_w_flags_out ? l_w_flags_out : 16'd0));

endmodule






module sol_flagram (
    output wire [3:0] o_w_out,
    input wire i_w_clk,
    input wire [3:0] i_w_address,
    input wire [3:0] i_w_data,
    input wire i_w_we,
    input wire i_w_oe,
    input wire i_w_flags_out
);

    wire [15:0] l_w_full_out;

    full_flagram full_flagram_inst (
        .o_w_out(l_w_full_out),
        .i_w_clk(i_w_clk),
        .i_w_address(i_w_address),
        .i_w_data(i_w_data),
        .i_w_we(i_w_we),
        .i_w_oe(i_w_oe),
        .i_w_flags_out(i_w_flags_out)
    );

    assign o_w_out = (i_w_we || i_w_oe) ? l_w_full_out[3:0] : (
        i_w_flags_out ? {l_w_full_out[4'd`OP3], l_w_full_out[4'd`OP2], l_w_full_out[4'd`OP1], l_w_full_out[4'd`OP0]} : 4'd0
    );
endmodule