module lineram (
    input [35:0] din,
    input [8:0] addr_w,
    output reg [35:0] dout,
    input [8:0] addr_r,
    input write_en,
    input read_clk,
    input write_clk
);

  `ifdef YOSYS
    // use the ECP5 primitive.
    PDPW16KD #(.REGMODE("OUTREG")) ram (
        .DI0 (din[0]),
        .DI1 (din[1]),
        .DI2 (din[2]),
        .DI3 (din[3]),
        .DI4 (din[4]),
        .DI5 (din[5]),
        .DI6 (din[6]),
        .DI7 (din[7]),
        .DI8 (din[8]),
        .DI9 (din[9]),
        .DI10(din[10]),
        .DI11(din[11]),
        .DI12(din[12]),
        .DI13(din[13]),
        .DI14(din[14]),
        .DI15(din[15]),
        .DI16(din[16]),
        .DI17(din[17]),
        .DI18(din[18]),
        .DI19(din[19]),
        .DI20(din[20]),
        .DI21(din[21]),
        .DI22(din[22]),
        .DI23(din[23]),
        .DI24(din[24]),
        .DI25(din[25]),
        .DI26(din[26]),
        .DI27(din[27]),
        .DI28(din[28]),
        .DI29(din[29]),
        .DI30(din[30]),
        .DI31(din[31]),
        .DI32(din[32]),
        .DI33(din[33]),
        .DI34(din[34]),
        .DI35(din[35]),
        .ADW0(addr_w[0]),
        .ADW1(addr_w[1]),
        .ADW2(addr_w[2]),
        .ADW3(addr_w[3]),
        .ADW4(addr_w[4]),
        .ADW5(addr_w[5]),
        .ADW6(addr_w[6]),
        .ADW7(addr_w[7]),
        .ADW8(addr_w[8]),
        .DO0 (dout[0]),
        .DO1 (dout[1]),
        .DO2 (dout[2]),
        .DO3 (dout[3]),
        .DO4 (dout[4]),
        .DO5 (dout[5]),
        .DO6 (dout[6]),
        .DO7 (dout[7]),
        .DO8 (dout[8]),
        .DO9 (dout[9]),
        .DO10(dout[10]),
        .DO11(dout[11]),
        .DO12(dout[12]),
        .DO13(dout[13]),
        .DO14(dout[14]),
        .DO15(dout[15]),
        .DO16(dout[16]),
        .DO17(dout[17]),
        .DO18(dout[18]),
        .DO19(dout[19]),
        .DO20(dout[20]),
        .DO21(dout[21]),
        .DO22(dout[22]),
        .DO23(dout[23]),
        .DO24(dout[24]),
        .DO25(dout[25]),
        .DO26(dout[26]),
        .DO27(dout[27]),
        .DO28(dout[28]),
        .DO29(dout[29]),
        .DO30(dout[30]),
        .DO31(dout[31]),
        .DO32(dout[32]),
        .DO33(dout[33]),
        .DO34(dout[34]),
        .DO35(dout[35]),
        .ADR0(addr_r[0]),
        .ADR1(addr_r[1]),
        .ADR2(addr_r[2]),
        .ADR3(addr_r[3]),
        .ADR4(addr_r[4]),
        .ADR5(addr_r[5]),
        .ADR6(addr_r[6]),
        .ADR7(addr_r[7]),
        .ADR8(addr_r[8]),
        .CER(1),
        .CEW(1),
        .CLKR(read_clk),
        .CLKW(write_clk),
        .CSW1(0),
        .CSW2(0),
        .CSW3(0),
        .CSR1(0),
        .CSR2(0),
        .CSR3(0),
    );
`else
  reg [35:0] ram [2**9]/*verilator public*/;

`ifndef YOSYS
  initial begin
    for (integer i = 0; i < 2 ** 9; i = i + 1) begin
      ram[i] = 0;
    end
  end
`endif

  always @(posedge write_clk) begin
    if (write_en) ram[addr_w] <= din;
  end
  always @(posedge read_clk) begin
    dout <= ram[addr_r];
  end
`endif
endmodule