yowasp-yosys 0.35.0.0.post605__py3-none-any.whl → 0.36.0.8.post623.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. yowasp_yosys/share/cmp2softlogic.v +117 -0
  2. yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_capi.cc → runtime/cxxrtl/capi/cxxrtl_capi.cc} +3 -3
  3. yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_vcd_capi.cc → runtime/cxxrtl/capi/cxxrtl_capi_vcd.cc} +3 -3
  4. yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_vcd_capi.h → runtime/cxxrtl/capi/cxxrtl_capi_vcd.h} +3 -3
  5. yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl.h → runtime/cxxrtl/cxxrtl.h} +2 -1
  6. yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_vcd.h → runtime/cxxrtl/cxxrtl_vcd.h} +1 -1
  7. yowasp_yosys/share/include/kernel/rtlil.h +3 -0
  8. yowasp_yosys/share/nexus/brams_map.v +6 -6
  9. yowasp_yosys/share/python3/ywio.py +8 -2
  10. yowasp_yosys/share/quicklogic/{pp3_cells_sim.v → pp3/cells_sim.v} +77 -0
  11. yowasp_yosys/share/quicklogic/qlf_k6n10f/TDP18K_FIFO.v +344 -0
  12. yowasp_yosys/share/quicklogic/qlf_k6n10f/arith_map.v +99 -0
  13. yowasp_yosys/share/quicklogic/qlf_k6n10f/bram_types_sim.v +74035 -0
  14. yowasp_yosys/share/quicklogic/qlf_k6n10f/brams_map.v +4288 -0
  15. yowasp_yosys/share/quicklogic/qlf_k6n10f/brams_sim.v +10949 -0
  16. yowasp_yosys/share/quicklogic/qlf_k6n10f/cells_sim.v +375 -0
  17. yowasp_yosys/share/quicklogic/qlf_k6n10f/dsp_final_map.v +265 -0
  18. yowasp_yosys/share/quicklogic/qlf_k6n10f/dsp_map.v +102 -0
  19. yowasp_yosys/share/quicklogic/qlf_k6n10f/dsp_sim.v +4527 -0
  20. yowasp_yosys/share/quicklogic/qlf_k6n10f/ffs_map.v +133 -0
  21. yowasp_yosys/share/quicklogic/qlf_k6n10f/libmap_brams.txt +22 -0
  22. yowasp_yosys/share/quicklogic/qlf_k6n10f/libmap_brams_map.v +483 -0
  23. yowasp_yosys/share/quicklogic/qlf_k6n10f/sram1024x18_mem.v +64 -0
  24. yowasp_yosys/share/quicklogic/qlf_k6n10f/ufifo_ctl.v +620 -0
  25. yowasp_yosys/smtbmc.py +99 -55
  26. yowasp_yosys/witness.py +16 -7
  27. yowasp_yosys/yosys.wasm +0 -0
  28. yowasp_yosys/ywio.py +8 -2
  29. {yowasp_yosys-0.35.0.0.post605.dist-info → yowasp_yosys-0.36.0.8.post623.dev0.dist-info}/METADATA +12 -12
  30. {yowasp_yosys-0.35.0.0.post605.dist-info → yowasp_yosys-0.36.0.8.post623.dev0.dist-info}/RECORD +42 -28
  31. {yowasp_yosys-0.35.0.0.post605.dist-info → yowasp_yosys-0.36.0.8.post623.dev0.dist-info}/WHEEL +1 -1
  32. yowasp_yosys/share/quicklogic/lut_sim.v +0 -76
  33. /yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_capi.h → runtime/cxxrtl/capi/cxxrtl_capi.h} +0 -0
  34. /yowasp_yosys/share/quicklogic/{cells_sim.v → common/cells_sim.v} +0 -0
  35. /yowasp_yosys/share/quicklogic/{abc9_map.v → pp3/abc9_map.v} +0 -0
  36. /yowasp_yosys/share/quicklogic/{abc9_model.v → pp3/abc9_model.v} +0 -0
  37. /yowasp_yosys/share/quicklogic/{abc9_unmap.v → pp3/abc9_unmap.v} +0 -0
  38. /yowasp_yosys/share/quicklogic/{pp3_cells_map.v → pp3/cells_map.v} +0 -0
  39. /yowasp_yosys/share/quicklogic/{pp3_ffs_map.v → pp3/ffs_map.v} +0 -0
  40. /yowasp_yosys/share/quicklogic/{pp3_latches_map.v → pp3/latches_map.v} +0 -0
  41. /yowasp_yosys/share/quicklogic/{pp3_lut_map.v → pp3/lut_map.v} +0 -0
  42. {yowasp_yosys-0.35.0.0.post605.dist-info → yowasp_yosys-0.36.0.8.post623.dev0.dist-info}/entry_points.txt +0 -0
  43. {yowasp_yosys-0.35.0.0.post605.dist-info → yowasp_yosys-0.36.0.8.post623.dev0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,133 @@
1
+ // Copyright 2020-2022 F4PGA Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+ // SPDX-License-Identifier: Apache-2.0
16
+
17
+ // DFF, asynchronous set/reset, enable
18
+ module \$_DFFSRE_PNNP_ (C, S, R, E, D, Q);
19
+ input C;
20
+ input S;
21
+ input R;
22
+ input E;
23
+ input D;
24
+ output Q;
25
+ dffsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(E), .R(R), .S(S));
26
+ endmodule
27
+
28
+ module \$_DFFSRE_NNNP_ (C, S, R, E, D, Q);
29
+ input C;
30
+ input S;
31
+ input R;
32
+ input E;
33
+ input D;
34
+ output Q;
35
+ dffnsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(E), .R(R), .S(S));
36
+ endmodule
37
+
38
+ // DFF, synchronous set or reset, enable
39
+ module \$_SDFFE_PN0P_ (D, C, R, E, Q);
40
+ input D;
41
+ input C;
42
+ input R;
43
+ input E;
44
+ output Q;
45
+ sdffsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(E), .R(R), .S(1'b1));
46
+ endmodule
47
+
48
+ module \$_SDFFE_PN1P_ (D, C, R, E, Q);
49
+ input D;
50
+ input C;
51
+ input R;
52
+ input E;
53
+ output Q;
54
+ sdffsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(E), .R(1'b1), .S(R));
55
+ endmodule
56
+
57
+ module \$_SDFFE_NN0P_ (D, C, R, E, Q);
58
+ input D;
59
+ input C;
60
+ input R;
61
+ input E;
62
+ output Q;
63
+ sdffnsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(E), .R(R), .S(1'b1));
64
+ endmodule
65
+
66
+ module \$_SDFFE_NN1P_ (D, C, R, E, Q);
67
+ input D;
68
+ input C;
69
+ input R;
70
+ input E;
71
+ output Q;
72
+ sdffnsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(E), .R(1'b1), .S(R));
73
+ endmodule
74
+
75
+ // Latch, no set/reset, no enable
76
+ module \$_DLATCH_P_ (input E, D, output Q);
77
+ latchsre _TECHMAP_REPLACE_ (.D(D), .Q(Q), .E(1'b1), .G(E), .R(1'b1), .S(1'b1));
78
+ endmodule
79
+
80
+ module \$_DLATCH_N_ (input E, D, output Q);
81
+ latchnsre _TECHMAP_REPLACE_ (.D(D), .Q(Q), .E(1'b1), .G(E), .R(1'b1), .S(1'b1));
82
+ endmodule
83
+
84
+ // Latch with async set and reset and enable
85
+ module \$_DLATCHSR_PPP_ (input E, S, R, D, output Q);
86
+ latchsre _TECHMAP_REPLACE_ (.D(D), .Q(Q), .E(1'b1), .G(E), .R(!R), .S(!S));
87
+ endmodule
88
+
89
+ module \$_DLATCHSR_NPP_ (input E, S, R, D, output Q);
90
+ latchnsre _TECHMAP_REPLACE_ (.D(D), .Q(Q), .E(1'b1), .G(E), .R(!R), .S(!S));
91
+ endmodule
92
+
93
+ module \$__SHREG_DFF_P_ (D, Q, C);
94
+ input D;
95
+ input C;
96
+ output Q;
97
+
98
+ parameter DEPTH = 2;
99
+
100
+ reg [DEPTH-2:0] q;
101
+
102
+ genvar i;
103
+ generate for (i = 0; i < DEPTH; i = i + 1) begin: slice
104
+
105
+ // First in chain
106
+ generate if (i == 0) begin
107
+ sh_dff #() shreg_beg (
108
+ .Q(q[i]),
109
+ .D(D),
110
+ .C(C)
111
+ );
112
+ end endgenerate
113
+ // Middle in chain
114
+ generate if (i > 0 && i != DEPTH-1) begin
115
+ sh_dff #() shreg_mid (
116
+ .Q(q[i]),
117
+ .D(q[i-1]),
118
+ .C(C)
119
+ );
120
+ end endgenerate
121
+ // Last in chain
122
+ generate if (i == DEPTH-1) begin
123
+ sh_dff #() shreg_end (
124
+ .Q(Q),
125
+ .D(q[i-1]),
126
+ .C(C)
127
+ );
128
+ end endgenerate
129
+ end: slice
130
+ endgenerate
131
+
132
+ endmodule
133
+
@@ -0,0 +1,22 @@
1
+ ram block $__QLF_TDP36K {
2
+ init any;
3
+ byte 9;
4
+ option "SPLIT" 0 {
5
+ abits 15;
6
+ widths 1 2 4 9 18 36 per_port;
7
+ }
8
+ option "SPLIT" 1 {
9
+ abits 14;
10
+ widths 1 2 4 9 18 per_port;
11
+ }
12
+ cost 65;
13
+ port srsw "A" "B" {
14
+ width tied;
15
+ clock posedge;
16
+ # wen causes read even when ren is low
17
+ # map clken = wen || ren
18
+ clken;
19
+ wrbe_separate;
20
+ rdwr old;
21
+ }
22
+ }
@@ -0,0 +1,483 @@
1
+ // Copyright 2020-2022 F4PGA Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+ // SPDX-License-Identifier: Apache-2.0
16
+
17
+ module \$__QLF_TDP36K (PORT_A_CLK, PORT_A_ADDR, PORT_A_WR_DATA, PORT_A_WR_EN, PORT_A_WR_BE, PORT_A_CLK_EN, PORT_A_RD_DATA,
18
+ PORT_B_CLK, PORT_B_ADDR, PORT_B_WR_DATA, PORT_B_WR_EN, PORT_B_WR_BE, PORT_B_CLK_EN, PORT_B_RD_DATA);
19
+
20
+ parameter INIT = 0;
21
+
22
+ parameter OPTION_SPLIT = 0;
23
+
24
+ parameter PORT_A_WIDTH = 1;
25
+ parameter PORT_A_WR_BE_WIDTH = 1;
26
+
27
+ parameter PORT_B_WIDTH = 1;
28
+ parameter PORT_B_WR_BE_WIDTH = 1;
29
+
30
+ input PORT_A_CLK;
31
+ input [14:0] PORT_A_ADDR;
32
+ input [PORT_A_WIDTH-1:0] PORT_A_WR_DATA;
33
+ input PORT_A_WR_EN;
34
+ input [PORT_A_WR_BE_WIDTH-1:0] PORT_A_WR_BE;
35
+ input PORT_A_CLK_EN;
36
+ output [PORT_A_WIDTH-1:0] PORT_A_RD_DATA;
37
+
38
+ input PORT_B_CLK;
39
+ input [14:0] PORT_B_ADDR;
40
+ input [PORT_B_WIDTH-1:0] PORT_B_WR_DATA;
41
+ input PORT_B_WR_EN;
42
+ input [PORT_B_WR_BE_WIDTH-1:0] PORT_B_WR_BE;
43
+ input PORT_B_CLK_EN;
44
+ output [PORT_B_WIDTH-1:0] PORT_B_RD_DATA;
45
+
46
+
47
+ // Fixed mode settings
48
+ localparam [ 0:0] SYNC_FIFO1_i = 1'd0;
49
+ localparam [ 0:0] FMODE1_i = 1'd0;
50
+ localparam [ 0:0] POWERDN1_i = 1'd0;
51
+ localparam [ 0:0] SLEEP1_i = 1'd0;
52
+ localparam [ 0:0] PROTECT1_i = 1'd0;
53
+ localparam [11:0] UPAE1_i = 12'd10;
54
+ localparam [11:0] UPAF1_i = 12'd10;
55
+
56
+ localparam [ 0:0] SYNC_FIFO2_i = 1'd0;
57
+ localparam [ 0:0] FMODE2_i = 1'd0;
58
+ localparam [ 0:0] POWERDN2_i = 1'd0;
59
+ localparam [ 0:0] SLEEP2_i = 1'd0;
60
+ localparam [ 0:0] PROTECT2_i = 1'd0;
61
+ localparam [10:0] UPAE2_i = 11'd10;
62
+ localparam [10:0] UPAF2_i = 11'd10;
63
+
64
+ // Width mode function
65
+ function [2:0] mode;
66
+ input integer width;
67
+ case (width)
68
+ 1: mode = 3'b101;
69
+ 2: mode = 3'b110;
70
+ 4: mode = 3'b100;
71
+ 8,9: mode = 3'b001;
72
+ 16, 18: mode = 3'b010;
73
+ 32, 36: mode = 3'b011;
74
+ default: mode = 3'b000;
75
+ endcase
76
+ endfunction
77
+
78
+ function [36863:0] pack_init;
79
+ integer i;
80
+ reg [35:0] ri;
81
+ for (i = 0; i < (OPTION_SPLIT ? 512 : 1024); i = i + 1) begin
82
+ ri = INIT[i*36 +: 36];
83
+ pack_init[i*36 +: 36] = {ri[35], ri[26], ri[34:27], ri[25:18],
84
+ ri[17], ri[8], ri[16:9], ri[7:0]};
85
+ end
86
+ if (OPTION_SPLIT)
87
+ pack_init[36863:18432] = 18432'bx;
88
+ endfunction
89
+
90
+ wire REN_A1_i;
91
+ wire REN_A2_i;
92
+
93
+ wire REN_B1_i;
94
+ wire REN_B2_i;
95
+
96
+ wire WEN_A1_i;
97
+ wire WEN_A2_i;
98
+
99
+ wire WEN_B1_i;
100
+ wire WEN_B2_i;
101
+
102
+ wire [1:0] BE_A1_i;
103
+ wire [1:0] BE_A2_i;
104
+
105
+ wire [1:0] BE_B1_i;
106
+ wire [1:0] BE_B2_i;
107
+
108
+ wire [14:0] ADDR_A1_i;
109
+ wire [13:0] ADDR_A2_i;
110
+
111
+ wire [14:0] ADDR_B1_i;
112
+ wire [13:0] ADDR_B2_i;
113
+
114
+ wire [17:0] WDATA_A1_i;
115
+ wire [17:0] WDATA_A2_i;
116
+
117
+ wire [17:0] WDATA_B1_i;
118
+ wire [17:0] WDATA_B2_i;
119
+
120
+ wire [17:0] RDATA_A1_o;
121
+ wire [17:0] RDATA_A2_o;
122
+
123
+ wire [17:0] RDATA_B1_o;
124
+ wire [17:0] RDATA_B2_o;
125
+
126
+
127
+ // Set port width mode (In non-split mode A2/B2 is not active. Set same values anyway to match previous behavior.)
128
+ localparam [ 2:0] RMODE_A1_i = mode(PORT_A_WIDTH);
129
+ localparam [ 2:0] WMODE_A1_i = mode(PORT_A_WIDTH);
130
+ localparam [ 2:0] RMODE_A2_i = mode(PORT_A_WIDTH);
131
+ localparam [ 2:0] WMODE_A2_i = mode(PORT_A_WIDTH);
132
+
133
+ localparam [ 2:0] RMODE_B1_i = mode(PORT_B_WIDTH);
134
+ localparam [ 2:0] WMODE_B1_i = mode(PORT_B_WIDTH);
135
+ localparam [ 2:0] RMODE_B2_i = mode(PORT_B_WIDTH);
136
+ localparam [ 2:0] WMODE_B2_i = mode(PORT_B_WIDTH);
137
+
138
+ assign REN_A1_i = PORT_A_CLK_EN;
139
+ assign WEN_A1_i = PORT_A_CLK_EN & PORT_A_WR_EN;
140
+ assign {BE_A2_i, BE_A1_i} = PORT_A_WR_BE;
141
+
142
+ assign REN_B1_i = PORT_B_CLK_EN;
143
+ assign WEN_B1_i = PORT_B_CLK_EN & PORT_B_WR_EN;
144
+ assign {BE_B2_i, BE_B1_i} = PORT_B_WR_BE;
145
+
146
+ case (PORT_A_WIDTH)
147
+ 9: assign { WDATA_A1_i[16], WDATA_A1_i[7:0] } = PORT_A_WR_DATA;
148
+ 18: assign { WDATA_A1_i[17], WDATA_A1_i[15:8], WDATA_A1_i[16], WDATA_A1_i[7:0] } = PORT_A_WR_DATA;
149
+ 36: assign { WDATA_A2_i[17], WDATA_A2_i[15:8], WDATA_A2_i[16], WDATA_A2_i[7:0], WDATA_A1_i[17], WDATA_A1_i[15:8], WDATA_A1_i[16], WDATA_A1_i[7:0]} = PORT_A_WR_DATA;
150
+ default: assign WDATA_A1_i = PORT_A_WR_DATA; // 1,2,4
151
+ endcase
152
+
153
+ case (PORT_B_WIDTH)
154
+ 9: assign { WDATA_B1_i[16], WDATA_B1_i[7:0] } = PORT_B_WR_DATA;
155
+ 18: assign { WDATA_B1_i[17], WDATA_B1_i[15:8], WDATA_B1_i[16], WDATA_B1_i[7:0] } = PORT_B_WR_DATA;
156
+ 36: assign { WDATA_B2_i[17], WDATA_B2_i[15:8], WDATA_B2_i[16], WDATA_B2_i[7:0], WDATA_B1_i[17], WDATA_B1_i[15:8], WDATA_B1_i[16], WDATA_B1_i[7:0]} = PORT_B_WR_DATA;
157
+ default: assign WDATA_B1_i = PORT_B_WR_DATA; // 1,2,4
158
+ endcase
159
+
160
+ case (PORT_A_WIDTH)
161
+ 9: assign PORT_A_RD_DATA = { RDATA_A1_o[16], RDATA_A1_o[7:0] };
162
+ 18: assign PORT_A_RD_DATA = { RDATA_A1_o[17], RDATA_A1_o[15:8], RDATA_A1_o[16], RDATA_A1_o[7:0] };
163
+ 36: assign PORT_A_RD_DATA = { RDATA_A2_o[17], RDATA_A2_o[15:8], RDATA_A2_o[16], RDATA_A2_o[7:0], RDATA_A1_o[17], RDATA_A1_o[15:8], RDATA_A1_o[16], RDATA_A1_o[7:0]};
164
+ default: assign PORT_A_RD_DATA = RDATA_A1_o; // 1,2,4
165
+ endcase
166
+
167
+ case (PORT_B_WIDTH)
168
+ 9: assign PORT_B_RD_DATA = { RDATA_B1_o[16], RDATA_B1_o[7:0] };
169
+ 18: assign PORT_B_RD_DATA = { RDATA_B1_o[17], RDATA_B1_o[15:8], RDATA_B1_o[16], RDATA_B1_o[7:0] };
170
+ 36: assign PORT_B_RD_DATA = { RDATA_B2_o[17], RDATA_B2_o[15:8], RDATA_B2_o[16], RDATA_B2_o[7:0], RDATA_B1_o[17], RDATA_B1_o[15:8], RDATA_B1_o[16], RDATA_B1_o[7:0]};
171
+ default: assign PORT_B_RD_DATA = RDATA_B1_o; // 1,2,4
172
+ endcase
173
+
174
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0,
175
+ UPAF2_i, UPAE2_i, PROTECT2_i, SLEEP2_i, POWERDN2_i, FMODE2_i, WMODE_B2_i, WMODE_A2_i, RMODE_B2_i, RMODE_A2_i, SYNC_FIFO2_i,
176
+ UPAF1_i, UPAE1_i, PROTECT1_i, SLEEP1_i, POWERDN1_i, FMODE1_i, WMODE_B1_i, WMODE_A1_i, RMODE_B1_i, RMODE_A1_i, SYNC_FIFO1_i
177
+ };
178
+
179
+ (* is_inferred = 1 *)
180
+ (* is_split = 0 *)
181
+ (* was_split_candidate = OPTION_SPLIT *)
182
+ (* port_a_width = PORT_A_WIDTH *)
183
+ (* port_b_width = PORT_B_WIDTH *)
184
+ TDP36K #(
185
+ .RAM_INIT(pack_init()),
186
+ ) _TECHMAP_REPLACE_ (
187
+ .RESET_ni(1'b1),
188
+
189
+ .CLK_A1_i(PORT_A_CLK),
190
+ .ADDR_A1_i(PORT_A_ADDR),
191
+ .WEN_A1_i(WEN_A1_i),
192
+ .BE_A1_i(BE_A1_i),
193
+ .WDATA_A1_i(WDATA_A1_i),
194
+ .REN_A1_i(REN_A1_i),
195
+ .RDATA_A1_o(RDATA_A1_o),
196
+
197
+ .CLK_A2_i(PORT_A_CLK),
198
+ .ADDR_A2_i(PORT_A_ADDR[13:0]),
199
+ .WEN_A2_i(WEN_A1_i),
200
+ .BE_A2_i(BE_A2_i),
201
+ .WDATA_A2_i(WDATA_A2_i),
202
+ .REN_A2_i(REN_A1_i),
203
+ .RDATA_A2_o(RDATA_A2_o),
204
+
205
+ .CLK_B1_i(PORT_B_CLK),
206
+ .ADDR_B1_i(PORT_B_ADDR),
207
+ .WEN_B1_i(WEN_B1_i),
208
+ .BE_B1_i(BE_B1_i),
209
+ .WDATA_B1_i(WDATA_B1_i),
210
+ .REN_B1_i(REN_B1_i),
211
+ .RDATA_B1_o(RDATA_B1_o),
212
+
213
+ .CLK_B2_i(PORT_B_CLK),
214
+ .ADDR_B2_i(PORT_B_ADDR[13:0]),
215
+ .WEN_B2_i(WEN_B1_i),
216
+ .BE_B2_i(BE_B2_i),
217
+ .WDATA_B2_i(WDATA_B2_i),
218
+ .REN_B2_i(REN_B1_i),
219
+ .RDATA_B2_o(RDATA_B2_o),
220
+
221
+ .FLUSH1_i(1'b0),
222
+ .FLUSH2_i(1'b0)
223
+ );
224
+
225
+ endmodule
226
+
227
+
228
+ module \$__QLF_TDP36K_MERGED (...);
229
+
230
+ parameter INIT1 = 0;
231
+
232
+ parameter PORT_A1_WIDTH = 1;
233
+ parameter PORT_B1_WIDTH = 1;
234
+
235
+ parameter PORT_A1_WR_BE_WIDTH = 1;
236
+ parameter PORT_B1_WR_BE_WIDTH = 1;
237
+
238
+ input PORT_A1_CLK;
239
+ input [14:0] PORT_A1_ADDR;
240
+ input [PORT_A1_WIDTH-1:0] PORT_A1_WR_DATA;
241
+ input PORT_A1_WR_EN;
242
+ input [PORT_A1_WR_BE_WIDTH-1:0] PORT_A1_WR_BE;
243
+ input PORT_A1_CLK_EN;
244
+ output [PORT_A1_WIDTH-1:0] PORT_A1_RD_DATA;
245
+
246
+ input PORT_B1_CLK;
247
+ input [14:0] PORT_B1_ADDR;
248
+ input [PORT_B1_WIDTH-1:0] PORT_B1_WR_DATA;
249
+ input PORT_B1_WR_EN;
250
+ input [PORT_B1_WR_BE_WIDTH-1:0] PORT_B1_WR_BE;
251
+ input PORT_B1_CLK_EN;
252
+ output [PORT_B1_WIDTH-1:0] PORT_B1_RD_DATA;
253
+
254
+ parameter INIT2 = 0;
255
+
256
+ parameter PORT_A2_WIDTH = 1;
257
+ parameter PORT_B2_WIDTH = 1;
258
+ parameter PORT_A2_WR_BE_WIDTH = 1;
259
+ parameter PORT_B2_WR_BE_WIDTH = 1;
260
+
261
+ input PORT_A2_CLK;
262
+ input [14:0] PORT_A2_ADDR;
263
+ input [PORT_A2_WIDTH-1:0] PORT_A2_WR_DATA;
264
+ input PORT_A2_WR_EN;
265
+ input [PORT_A2_WR_BE_WIDTH-1:0] PORT_A2_WR_BE;
266
+ input PORT_A2_CLK_EN;
267
+ output [PORT_A2_WIDTH-1:0] PORT_A2_RD_DATA;
268
+
269
+ input PORT_B2_CLK;
270
+ input [14:0] PORT_B2_ADDR;
271
+ input [PORT_B2_WIDTH-1:0] PORT_B2_WR_DATA;
272
+ input PORT_B2_WR_EN;
273
+ input [PORT_B2_WR_BE_WIDTH-1:0] PORT_B2_WR_BE;
274
+ input PORT_B2_CLK_EN;
275
+ output [PORT_B2_WIDTH-1:0] PORT_B2_RD_DATA;
276
+
277
+
278
+ // Fixed mode settings
279
+ localparam [ 0:0] SYNC_FIFO1_i = 1'd0;
280
+ localparam [ 0:0] FMODE1_i = 1'd0;
281
+ localparam [ 0:0] POWERDN1_i = 1'd0;
282
+ localparam [ 0:0] SLEEP1_i = 1'd0;
283
+ localparam [ 0:0] PROTECT1_i = 1'd0;
284
+ localparam [11:0] UPAE1_i = 12'd10;
285
+ localparam [11:0] UPAF1_i = 12'd10;
286
+
287
+ localparam [ 0:0] SYNC_FIFO2_i = 1'd0;
288
+ localparam [ 0:0] FMODE2_i = 1'd0;
289
+ localparam [ 0:0] POWERDN2_i = 1'd0;
290
+ localparam [ 0:0] SLEEP2_i = 1'd0;
291
+ localparam [ 0:0] PROTECT2_i = 1'd0;
292
+ localparam [10:0] UPAE2_i = 11'd10;
293
+ localparam [10:0] UPAF2_i = 11'd10;
294
+
295
+ // Width mode function
296
+ function [2:0] mode;
297
+ input integer width;
298
+ case (width)
299
+ 1: mode = 3'b101;
300
+ 2: mode = 3'b110;
301
+ 4: mode = 3'b100;
302
+ 8,9: mode = 3'b001;
303
+ 16, 18: mode = 3'b010;
304
+ default: mode = 3'b000;
305
+ endcase
306
+ endfunction
307
+
308
+ function [36863:0] pack_init;
309
+ integer i;
310
+ reg [35:0] ri;
311
+ for (i = 0; i < 1024; i = i + 1) begin
312
+ ri = {INIT2[i*18 +: 18], INIT1[i*18 +: 18]};
313
+ pack_init[i*36 +: 36] = {ri[35], ri[26], ri[34:27], ri[25:18], ri[17], ri[8], ri[16:9], ri[7:0]};
314
+ end
315
+ endfunction
316
+
317
+ wire REN_A1_i;
318
+ wire REN_A2_i;
319
+
320
+ wire REN_B1_i;
321
+ wire REN_B2_i;
322
+
323
+ wire WEN_A1_i;
324
+ wire WEN_A2_i;
325
+
326
+ wire WEN_B1_i;
327
+ wire WEN_B2_i;
328
+
329
+ wire [1:0] BE_A1_i;
330
+ wire [1:0] BE_A2_i;
331
+
332
+ wire [1:0] BE_B1_i;
333
+ wire [1:0] BE_B2_i;
334
+
335
+ wire [14:0] ADDR_A1_i;
336
+ wire [13:0] ADDR_A2_i;
337
+
338
+ wire [14:0] ADDR_B1_i;
339
+ wire [13:0] ADDR_B2_i;
340
+
341
+ wire [17:0] WDATA_A1_i;
342
+ wire [17:0] WDATA_A2_i;
343
+
344
+ wire [17:0] WDATA_B1_i;
345
+ wire [17:0] WDATA_B2_i;
346
+
347
+ wire [17:0] RDATA_A1_o;
348
+ wire [17:0] RDATA_A2_o;
349
+
350
+ wire [17:0] RDATA_B1_o;
351
+ wire [17:0] RDATA_B2_o;
352
+
353
+
354
+ // Set port width mode (In non-split mode A2/B2 is not active. Set same values anyway to match previous behavior.)
355
+ localparam [ 2:0] RMODE_A1_i = mode(PORT_A1_WIDTH);
356
+ localparam [ 2:0] WMODE_A1_i = mode(PORT_A1_WIDTH);
357
+ localparam [ 2:0] RMODE_B1_i = mode(PORT_B1_WIDTH);
358
+ localparam [ 2:0] WMODE_B1_i = mode(PORT_B1_WIDTH);
359
+
360
+ localparam [ 2:0] RMODE_A2_i = mode(PORT_A2_WIDTH);
361
+ localparam [ 2:0] WMODE_A2_i = mode(PORT_A2_WIDTH);
362
+ localparam [ 2:0] RMODE_B2_i = mode(PORT_B2_WIDTH);
363
+ localparam [ 2:0] WMODE_B2_i = mode(PORT_B2_WIDTH);
364
+
365
+ assign REN_A1_i = PORT_A1_CLK_EN;
366
+ assign WEN_A1_i = PORT_A1_CLK_EN & PORT_A1_WR_EN;
367
+ assign BE_A1_i = PORT_A1_WR_BE;
368
+
369
+ assign REN_B1_i = PORT_B1_CLK_EN;
370
+ assign WEN_B1_i = PORT_B1_CLK_EN & PORT_B1_WR_EN;
371
+ assign BE_B1_i = PORT_B1_WR_BE;
372
+
373
+ assign REN_A2_i = PORT_A2_CLK_EN;
374
+ assign WEN_A2_i = PORT_A2_CLK_EN & PORT_A2_WR_EN;
375
+ assign BE_A2_i = PORT_A2_WR_BE;
376
+
377
+ assign REN_B2_i = PORT_B2_CLK_EN;
378
+ assign WEN_B2_i = PORT_B2_CLK_EN & PORT_B2_WR_EN;
379
+ assign BE_B2_i = PORT_B2_WR_BE;
380
+
381
+ assign ADDR_A1_i = PORT_A1_ADDR;
382
+ assign ADDR_B1_i = PORT_B1_ADDR;
383
+ assign ADDR_A2_i = PORT_A2_ADDR;
384
+ assign ADDR_B2_i = PORT_B2_ADDR;
385
+
386
+ case (PORT_A1_WIDTH)
387
+ 9: assign { WDATA_A1_i[16], WDATA_A1_i[7:0] } = PORT_A1_WR_DATA;
388
+ 18: assign { WDATA_A1_i[17], WDATA_A1_i[15:8], WDATA_A1_i[16], WDATA_A1_i[7:0] } = PORT_A1_WR_DATA;
389
+ default: assign WDATA_A1_i = PORT_A1_WR_DATA; // 1,2,4,8,16
390
+ endcase
391
+
392
+ case (PORT_B1_WIDTH)
393
+ 9: assign { WDATA_B1_i[16], WDATA_B1_i[7:0] } = PORT_B1_WR_DATA;
394
+ 18: assign { WDATA_B1_i[17], WDATA_B1_i[15:8], WDATA_B1_i[16], WDATA_B1_i[7:0] } = PORT_B1_WR_DATA;
395
+ default: assign WDATA_B1_i = PORT_B1_WR_DATA; // 1,2,4,8,16
396
+ endcase
397
+
398
+ case (PORT_A1_WIDTH)
399
+ 9: assign PORT_A1_RD_DATA = { RDATA_A1_o[16], RDATA_A1_o[7:0] };
400
+ 18: assign PORT_A1_RD_DATA = { RDATA_A1_o[17], RDATA_A1_o[15:8], RDATA_A1_o[16], RDATA_A1_o[7:0] };
401
+ default: assign PORT_A1_RD_DATA = RDATA_A1_o; // 1,2,4,8,16
402
+ endcase
403
+
404
+ case (PORT_B1_WIDTH)
405
+ 9: assign PORT_B1_RD_DATA = { RDATA_B1_o[16], RDATA_B1_o[7:0] };
406
+ 18: assign PORT_B1_RD_DATA = { RDATA_B1_o[17], RDATA_B1_o[15:8], RDATA_B1_o[16], RDATA_B1_o[7:0] };
407
+ default: assign PORT_B1_RD_DATA = RDATA_B1_o; // 1,2,4,8,16
408
+ endcase
409
+
410
+ case (PORT_A2_WIDTH)
411
+ 9: assign { WDATA_A2_i[16], WDATA_A2_i[7:0] } = PORT_A2_WR_DATA;
412
+ 18: assign { WDATA_A2_i[17], WDATA_A2_i[15:8], WDATA_A2_i[16], WDATA_A2_i[7:0] } = PORT_A2_WR_DATA;
413
+ default: assign WDATA_A2_i = PORT_A2_WR_DATA; // 1,2,4,8,16
414
+ endcase
415
+
416
+ case (PORT_B2_WIDTH)
417
+ 9: assign { WDATA_B2_i[16], WDATA_B2_i[7:0] } = PORT_B2_WR_DATA;
418
+ 18: assign { WDATA_B2_i[17], WDATA_B2_i[15:8], WDATA_B2_i[16], WDATA_B2_i[7:0] } = PORT_B2_WR_DATA;
419
+ default: assign WDATA_B2_i = PORT_B2_WR_DATA; // 1,2,4,8,16
420
+ endcase
421
+
422
+ case (PORT_A2_WIDTH)
423
+ 9: assign PORT_A2_RD_DATA = { RDATA_A2_o[16], RDATA_A2_o[7:0] };
424
+ 18: assign PORT_A2_RD_DATA = { RDATA_A2_o[17], RDATA_A2_o[15:8], RDATA_A2_o[16], RDATA_A2_o[7:0] };
425
+ default: assign PORT_A2_RD_DATA = RDATA_A2_o; // 1,2,4,8,16
426
+ endcase
427
+
428
+ case (PORT_B2_WIDTH)
429
+ 9: assign PORT_B2_RD_DATA = { RDATA_B2_o[16], RDATA_B2_o[7:0] };
430
+ 18: assign PORT_B2_RD_DATA = { RDATA_B2_o[17], RDATA_B2_o[15:8], RDATA_B2_o[16], RDATA_B2_o[7:0] };
431
+ default: assign PORT_B2_RD_DATA = RDATA_B2_o; // 1,2,4,8,16
432
+ endcase
433
+
434
+ defparam _TECHMAP_REPLACE_.MODE_BITS = {1'b1,
435
+ UPAF2_i, UPAE2_i, PROTECT2_i, SLEEP2_i, POWERDN2_i, FMODE2_i, WMODE_B2_i, WMODE_A2_i, RMODE_B2_i, RMODE_A2_i, SYNC_FIFO2_i,
436
+ UPAF1_i, UPAE1_i, PROTECT1_i, SLEEP1_i, POWERDN1_i, FMODE1_i, WMODE_B1_i, WMODE_A1_i, RMODE_B1_i, RMODE_A1_i, SYNC_FIFO1_i
437
+ };
438
+
439
+ (* is_inferred = 1 *)
440
+ (* is_split = 1 *)
441
+ (* port_a1_width = PORT_A1_WIDTH *)
442
+ (* port_a2_width = PORT_A2_WIDTH *)
443
+ (* port_b1_width = PORT_B1_WIDTH *)
444
+ (* port_b2_width = PORT_B2_WIDTH *)
445
+ TDP36K #(
446
+ .RAM_INIT(pack_init()),
447
+ ) _TECHMAP_REPLACE_ (
448
+ .RESET_ni(1'b1),
449
+ .WDATA_A1_i(WDATA_A1_i),
450
+ .WDATA_A2_i(WDATA_A2_i),
451
+ .RDATA_A1_o(RDATA_A1_o),
452
+ .RDATA_A2_o(RDATA_A2_o),
453
+ .ADDR_A1_i(ADDR_A1_i),
454
+ .ADDR_A2_i(ADDR_A2_i),
455
+ .CLK_A1_i(PORT_A1_CLK),
456
+ .CLK_A2_i(PORT_A2_CLK),
457
+ .REN_A1_i(REN_A1_i),
458
+ .REN_A2_i(REN_A2_i),
459
+ .WEN_A1_i(WEN_A1_i),
460
+ .WEN_A2_i(WEN_A2_i),
461
+ .BE_A1_i(BE_A1_i),
462
+ .BE_A2_i(BE_A2_i),
463
+
464
+ .WDATA_B1_i(WDATA_B1_i),
465
+ .WDATA_B2_i(WDATA_B2_i),
466
+ .RDATA_B1_o(RDATA_B1_o),
467
+ .RDATA_B2_o(RDATA_B2_o),
468
+ .ADDR_B1_i(ADDR_B1_i),
469
+ .ADDR_B2_i(ADDR_B2_i),
470
+ .CLK_B1_i(PORT_B1_CLK),
471
+ .CLK_B2_i(PORT_B2_CLK),
472
+ .REN_B1_i(REN_B1_i),
473
+ .REN_B2_i(REN_B2_i),
474
+ .WEN_B1_i(WEN_B1_i),
475
+ .WEN_B2_i(WEN_B2_i),
476
+ .BE_B1_i(BE_B1_i),
477
+ .BE_B2_i(BE_B2_i),
478
+
479
+ .FLUSH1_i(1'b0),
480
+ .FLUSH2_i(1'b0)
481
+ );
482
+
483
+ endmodule
@@ -0,0 +1,64 @@
1
+ `default_nettype none
2
+ module sram1024x18 (
3
+ clk_a,
4
+ cen_a,
5
+ wen_a,
6
+ addr_a,
7
+ wmsk_a,
8
+ wdata_a,
9
+ rdata_a,
10
+ clk_b,
11
+ cen_b,
12
+ wen_b,
13
+ addr_b,
14
+ wmsk_b,
15
+ wdata_b,
16
+ rdata_b
17
+ );
18
+ parameter [1024*18-1:0] init = 18431'bx;
19
+ (* clkbuf_sink *)
20
+ input wire clk_a;
21
+ input wire cen_a;
22
+ input wire wen_a;
23
+ input wire [9:0] addr_a;
24
+ input wire [17:0] wmsk_a;
25
+ input wire [17:0] wdata_a;
26
+ output reg [17:0] rdata_a;
27
+ (* clkbuf_sink *)
28
+ input wire clk_b;
29
+ input wire cen_b;
30
+ input wire wen_b;
31
+ input wire [9:0] addr_b;
32
+ input wire [17:0] wmsk_b;
33
+ input wire [17:0] wdata_b;
34
+ output reg [17:0] rdata_b;
35
+ reg [17:0] ram [1023:0];
36
+ integer i;
37
+ initial begin
38
+ for (i = 0; i < 1024; i = i + 1) begin
39
+ ram[i] = init[18*i +: 18];
40
+ end
41
+ end
42
+
43
+ always @(posedge clk_a) begin
44
+ if (!cen_a) begin
45
+ if (!wen_a)
46
+ for (i = 0; i < 18; i++) begin
47
+ if (!wmsk_a[i]) ram[addr_a][i] <= wdata_a[i];
48
+ end
49
+ rdata_a <= ram[addr_a];
50
+ end
51
+ end
52
+
53
+ always @(posedge clk_b) begin
54
+ if (!cen_b) begin
55
+ if (!wen_b)
56
+ for (i = 0; i < 18; i++) begin
57
+ if (!wmsk_b[i]) ram[addr_b][i] <= wdata_b[i];
58
+ end
59
+ rdata_b <= ram[addr_b];
60
+ end
61
+ end
62
+
63
+ endmodule
64
+