flatten
diff --git a/techlibs/xilinx/cells_sim.v b/techlibs/xilinx/cells_sim.v index 053358b..3ed0759 100644 --- a/techlibs/xilinx/cells_sim.v +++ b/techlibs/xilinx/cells_sim.v
@@ -667,8 +667,17 @@ parameter [15:0] INIT_00 = 16'h0000; parameter [15:0] INIT_01 = 16'h0000; parameter [0:0] IS_WCLK_INVERTED = 1'b0; - RAM16X1S #(.INIT(INIT_00), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram0 (.O(O0), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .D(D0), .WCLK(WCLK), .WE(WE)); - RAM16X1S #(.INIT(INIT_01), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram1 (.O(O1), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .D(D1), .WCLK(WCLK), .WE(WE)); + wire [3:0] a = {A3, A2, A1, A0}; + wire clk = WCLK ^ IS_WCLK_INVERTED; + reg [15:0] mem0 = INIT_00; + reg [15:0] mem1 = INIT_01; + assign O0 = mem0[a]; + assign O1 = mem1[a]; + always @(posedge clk) + if (WE) begin + mem0[a] <= D0; + mem1[a] <= D1; + end endmodule module RAM32X2S ( @@ -683,8 +692,17 @@ parameter [31:0] INIT_00 = 32'h00000000; parameter [31:0] INIT_01 = 32'h00000000; parameter [0:0] IS_WCLK_INVERTED = 1'b0; - RAM32X1S #(.INIT(INIT_00), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram0 (.O(O0), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .A4(A4), .D(D0), .WCLK(WCLK), .WE(WE)); - RAM32X1S #(.INIT(INIT_01), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram1 (.O(O1), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .A4(A4), .D(D1), .WCLK(WCLK), .WE(WE)); + wire [4:0] a = {A4, A3, A2, A1, A0}; + wire clk = WCLK ^ IS_WCLK_INVERTED; + reg [31:0] mem0 = INIT_00; + reg [31:0] mem1 = INIT_01; + assign O0 = mem0[a]; + assign O1 = mem1[a]; + always @(posedge clk) + if (WE) begin + mem0[a] <= D0; + mem1[a] <= D1; + end endmodule module RAM64X2S ( @@ -699,8 +717,17 @@ parameter [63:0] INIT_00 = 64'h0000000000000000; parameter [63:0] INIT_01 = 64'h0000000000000000; parameter [0:0] IS_WCLK_INVERTED = 1'b0; - RAM64X1S #(.INIT(INIT_00), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram0 (.O(O0), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .A4(A4), .A5(A5), .D(D0), .WCLK(WCLK), .WE(WE)); - RAM64X1S #(.INIT(INIT_01), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram1 (.O(O1), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .A4(A4), .A5(A5), .D(D1), .WCLK(WCLK), .WE(WE)); + wire [5:0] a = {A5, A3, A2, A1, A0}; + wire clk = WCLK ^ IS_WCLK_INVERTED; + reg [63:0] mem0 = INIT_00; + reg [63:0] mem1 = INIT_01; + assign O0 = mem0[a]; + assign O1 = mem1[a]; + always @(posedge clk) + if (WE) begin + mem0[a] <= D0; + mem1[a] <= D1; + end endmodule module RAM16X4S ( @@ -717,10 +744,23 @@ parameter [15:0] INIT_02 = 16'h0000; parameter [15:0] INIT_03 = 16'h0000; parameter [0:0] IS_WCLK_INVERTED = 1'b0; - RAM16X1S #(.INIT(INIT_00), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram0 (.O(O0), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .D(D0), .WCLK(WCLK), .WE(WE)); - RAM16X1S #(.INIT(INIT_01), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram1 (.O(O1), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .D(D1), .WCLK(WCLK), .WE(WE)); - RAM16X1S #(.INIT(INIT_02), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram2 (.O(O2), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .D(D2), .WCLK(WCLK), .WE(WE)); - RAM16X1S #(.INIT(INIT_03), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram3 (.O(O3), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .D(D3), .WCLK(WCLK), .WE(WE)); + wire [3:0] a = {A3, A2, A1, A0}; + wire clk = WCLK ^ IS_WCLK_INVERTED; + reg [15:0] mem0 = INIT_00; + reg [15:0] mem1 = INIT_01; + reg [15:0] mem2 = INIT_02; + reg [15:0] mem3 = INIT_03; + assign O0 = mem0[a]; + assign O1 = mem1[a]; + assign O2 = mem2[a]; + assign O3 = mem3[a]; + always @(posedge clk) + if (WE) begin + mem0[a] <= D0; + mem1[a] <= D1; + mem2[a] <= D2; + mem3[a] <= D3; + end endmodule module RAM32X4S ( @@ -737,10 +777,23 @@ parameter [31:0] INIT_02 = 32'h00000000; parameter [31:0] INIT_03 = 32'h00000000; parameter [0:0] IS_WCLK_INVERTED = 1'b0; - RAM32X1S #(.INIT(INIT_00), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram0 (.O(O0), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .A4(A4), .D(D0), .WCLK(WCLK), .WE(WE)); - RAM32X1S #(.INIT(INIT_01), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram1 (.O(O1), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .A4(A4), .D(D1), .WCLK(WCLK), .WE(WE)); - RAM32X1S #(.INIT(INIT_02), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram2 (.O(O2), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .A4(A4), .D(D2), .WCLK(WCLK), .WE(WE)); - RAM32X1S #(.INIT(INIT_03), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram3 (.O(O3), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .A4(A4), .D(D3), .WCLK(WCLK), .WE(WE)); + wire [4:0] a = {A4, A3, A2, A1, A0}; + wire clk = WCLK ^ IS_WCLK_INVERTED; + reg [31:0] mem0 = INIT_00; + reg [31:0] mem1 = INIT_01; + reg [31:0] mem2 = INIT_02; + reg [31:0] mem3 = INIT_03; + assign O0 = mem0[a]; + assign O1 = mem1[a]; + assign O2 = mem2[a]; + assign O3 = mem3[a]; + always @(posedge clk) + if (WE) begin + mem0[a] <= D0; + mem1[a] <= D1; + mem2[a] <= D2; + mem3[a] <= D3; + end endmodule module RAM16X8S ( @@ -761,14 +814,35 @@ parameter [15:0] INIT_06 = 16'h0000; parameter [15:0] INIT_07 = 16'h0000; parameter [0:0] IS_WCLK_INVERTED = 1'b0; - RAM16X1S #(.INIT(INIT_00), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram0 (.O(O[0]), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .D(D[0]), .WCLK(WCLK), .WE(WE)); - RAM16X1S #(.INIT(INIT_01), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram1 (.O(O[1]), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .D(D[1]), .WCLK(WCLK), .WE(WE)); - RAM16X1S #(.INIT(INIT_02), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram2 (.O(O[2]), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .D(D[2]), .WCLK(WCLK), .WE(WE)); - RAM16X1S #(.INIT(INIT_03), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram3 (.O(O[3]), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .D(D[3]), .WCLK(WCLK), .WE(WE)); - RAM16X1S #(.INIT(INIT_04), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram4 (.O(O[4]), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .D(D[4]), .WCLK(WCLK), .WE(WE)); - RAM16X1S #(.INIT(INIT_05), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram5 (.O(O[5]), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .D(D[5]), .WCLK(WCLK), .WE(WE)); - RAM16X1S #(.INIT(INIT_06), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram6 (.O(O[6]), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .D(D[6]), .WCLK(WCLK), .WE(WE)); - RAM16X1S #(.INIT(INIT_07), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram7 (.O(O[7]), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .D(D[7]), .WCLK(WCLK), .WE(WE)); + wire [3:0] a = {A3, A2, A1, A0}; + wire clk = WCLK ^ IS_WCLK_INVERTED; + reg [15:0] mem0 = INIT_00; + reg [15:0] mem1 = INIT_01; + reg [15:0] mem2 = INIT_02; + reg [15:0] mem3 = INIT_03; + reg [15:0] mem4 = INIT_04; + reg [15:0] mem5 = INIT_05; + reg [15:0] mem6 = INIT_06; + reg [15:0] mem7 = INIT_07; + assign O[0] = mem0[a]; + assign O[1] = mem1[a]; + assign O[2] = mem2[a]; + assign O[3] = mem3[a]; + assign O[4] = mem4[a]; + assign O[5] = mem5[a]; + assign O[6] = mem6[a]; + assign O[7] = mem7[a]; + always @(posedge clk) + if (WE) begin + mem0[a] <= D[0]; + mem1[a] <= D[1]; + mem2[a] <= D[2]; + mem3[a] <= D[3]; + mem4[a] <= D[4]; + mem5[a] <= D[5]; + mem6[a] <= D[6]; + mem7[a] <= D[7]; + end endmodule module RAM32X8S ( @@ -789,14 +863,35 @@ parameter [31:0] INIT_06 = 32'h00000000; parameter [31:0] INIT_07 = 32'h00000000; parameter [0:0] IS_WCLK_INVERTED = 1'b0; - RAM32X1S #(.INIT(INIT_00), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram0 (.O(O[0]), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .A4(A4), .D(D[0]), .WCLK(WCLK), .WE(WE)); - RAM32X1S #(.INIT(INIT_01), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram1 (.O(O[1]), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .A4(A4), .D(D[1]), .WCLK(WCLK), .WE(WE)); - RAM32X1S #(.INIT(INIT_02), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram2 (.O(O[2]), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .A4(A4), .D(D[2]), .WCLK(WCLK), .WE(WE)); - RAM32X1S #(.INIT(INIT_03), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram3 (.O(O[3]), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .A4(A4), .D(D[3]), .WCLK(WCLK), .WE(WE)); - RAM32X1S #(.INIT(INIT_04), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram4 (.O(O[4]), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .A4(A4), .D(D[4]), .WCLK(WCLK), .WE(WE)); - RAM32X1S #(.INIT(INIT_05), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram5 (.O(O[5]), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .A4(A4), .D(D[5]), .WCLK(WCLK), .WE(WE)); - RAM32X1S #(.INIT(INIT_06), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram6 (.O(O[6]), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .A4(A4), .D(D[6]), .WCLK(WCLK), .WE(WE)); - RAM32X1S #(.INIT(INIT_07), .IS_WCLK_INVERTED(IS_WCLK_INVERTED)) ram7 (.O(O[7]), .A0(A0), .A1(A1), .A2(A2), .A3(A3), .A4(A4), .D(D[7]), .WCLK(WCLK), .WE(WE)); + wire [4:0] a = {A4, A3, A2, A1, A0}; + wire clk = WCLK ^ IS_WCLK_INVERTED; + reg [31:0] mem0 = INIT_00; + reg [31:0] mem1 = INIT_01; + reg [31:0] mem2 = INIT_02; + reg [31:0] mem3 = INIT_03; + reg [31:0] mem4 = INIT_04; + reg [31:0] mem5 = INIT_05; + reg [31:0] mem6 = INIT_06; + reg [31:0] mem7 = INIT_07; + assign O[0] = mem0[a]; + assign O[1] = mem1[a]; + assign O[2] = mem2[a]; + assign O[3] = mem3[a]; + assign O[4] = mem4[a]; + assign O[5] = mem5[a]; + assign O[6] = mem6[a]; + assign O[7] = mem7[a]; + always @(posedge clk) + if (WE) begin + mem0[a] <= D[0]; + mem1[a] <= D[1]; + mem2[a] <= D[2]; + mem3[a] <= D[3]; + mem4[a] <= D[4]; + mem5[a] <= D[5]; + mem6[a] <= D[6]; + mem7[a] <= D[7]; + end endmodule // Dual port.