@@ -82,9 +82,26 @@ namespace {
82
82
{ " O" }, // IO_BUF = 13,
83
83
{ " O" }, // IO_BUF_DS = 14,
84
84
85
- // I_SERDES = 15,
86
- { " DLY_TAP_VALUE" , " CLK_OUT" , " CDR_CORE_CLK" ,
87
- " Q" , " DATA_VALID" , " DPA_LOCK" , " DPA_ERROR" },
85
+
86
+ /* I_SERDES
87
+ CLK_OUT:
88
+ dir: output
89
+ desc: Fabric clock output
90
+ Q[WIDTH-1:0]:
91
+ dir: output
92
+ desc: Data output
93
+ DATA_VALID:
94
+ dir: output
95
+ desc: DATA_VALID output
96
+ DPA_LOCK:
97
+ dir: output
98
+ desc: DPA_LOCK output
99
+ DPA_ERROR:
100
+ dir: output
101
+ desc: DPA_ERROR output
102
+ */
103
+ { " CLK_OUT" , " Q" , " DATA_VALID" , " DPA_LOCK" , " DPA_ERROR" },
104
+
88
105
89
106
{ " Y" }, // LUT1 = 16,
90
107
{ " Y" }, // LUT2 = 17,
@@ -103,18 +120,60 @@ namespace {
103
120
104
121
{ " O" , " DLY_TAP_VALUE" }, // O_DELAY = 27,
105
122
106
- // O_SERDES = 28,
107
- { " CLK_OUT" , " Q" , " CHANNEL_BOND_SYNC_OUT" , " DLY_TAP_VALUE" },
123
+ /* O_SERDES
124
+ OE_OUT:
125
+ dir: output
126
+ desc: Output tri-state enable output (to O_BUFT or inferred tri-state signal)
127
+ Q:
128
+ dir: output
129
+ desc: Data output (Connect to output port, buffer or O_DELAY)
130
+ CHANNEL_BOND_SYNC_OUT:
131
+ dir: output
132
+ */
133
+ { " OE_OUT" , " Q" , " CHANNEL_BOND_SYNC_OUT" , " DLY_TAP_VALUE" },
134
+
135
+
136
+ /* O_SERDES_CLK
137
+ CLK_EN:
138
+ dir: input
139
+ desc: Gates output OUTPUT_CLK
140
+ OUTPUT_CLK:
141
+ dir: output
142
+ desc: Clock output (Connect to output port, buffer or O_DELAY)
143
+ type: reg
144
+ default: 1'b0
145
+ PLL_LOCK:
146
+ dir: input
147
+ desc: PLL lock input
148
+ PLL_CLK:
149
+ dir: input
150
+ desc: PLL clock input
151
+ */
152
+ { " OUTPUT_CLK" },
153
+
154
+
155
+ /* PLL
156
+ CLK_OUT:
157
+ dir: output
158
+ CLK_OUT_DIV2:
159
+ dir: output
160
+ CLK_OUT_DIV3:
161
+ dir: output
162
+ CLK_OUT_DIV4:
163
+ dir: output
164
+ SERDES_FAST_CLK:
165
+ dir: output
166
+ LOCK:
167
+ dir: output
168
+ */
169
+ { " CLK_OUT" , " CLK_OUT_DIV2" ,
170
+ " CLK_OUT_DIV3" , " CLK_OUT_DIV4" ,
171
+ " SERDES_FAST_CLK" , " LOCK" },
108
172
109
- // O_SERDES_CLK = 29,
110
- { " CLK_OUT" , " Q" , " CHANNEL_BOND_SYNC_OUT" , " DLY_TAP_VALUE" },
111
-
112
- // PLL = 30,
113
- { " CLK_OUT0" , " CLK_OUT1" , " CLK_OUT2" , " CLK_OUT3" ,
114
- " GEARBOX_FAST_CLK" , " LOCK" },
115
173
116
174
// TDP_RAM18KX2 = 31,
117
- { " RDATA_A1" , " RDATA_B1" , " RDATA_A2" , " RDATA_B2" },
175
+ { " RDATA_A1" , " RDATA_B1" , " RDATA_A2" , " RDATA_B2" ,
176
+ " RPARITY_A1" , " RPARITY_B1" , " RPARITY_A2" , " RPARITY_B2" },
118
177
119
178
// TDP_RAM36K = 32,
120
179
{ " RDATA_A" , " RPARITY_A" , " RDATA_B" , " RPARITY_B" },
@@ -186,7 +245,7 @@ bool is_I_SERDES_output_term(const std::string& term) noexcept {
186
245
if (term.empty ()) return false ;
187
246
188
247
static std::regex re_iserdes_out{
189
- R"( DLY_TAP_VALUE=| CLK_OUT=|CDR_CORE_CLK =|Q=|DATA_VALID=|DPA_LOCK=|DPA_ERROR=|Q\[\d+\]=)" };
248
+ R"( CLK_OUT=|Q=|DATA_VALID=|DPA_LOCK=|DPA_ERROR=|Q\[\d+\]=)" };
190
249
191
250
std::cmatch m;
192
251
bool b = false ;
@@ -209,10 +268,10 @@ bool is_O_SERDES_output_term(const std::string& term) noexcept {
209
268
if (term.empty ()) return false ;
210
269
211
270
static std::regex re_oserdes_out{
212
- R"( CLK_OUT=|Q=|CHANNEL_BOND_SYNC_OUT=|DLY_TAP_VALUE=|Q\[\d+\]=)" };
213
-
214
- std::cmatch m;
271
+ R"( OE_OUT=|Q=|CHANNEL_BOND_SYNC_OUT=|Q\[\d+\]=)" };
272
+
215
273
bool b = false ;
274
+ std::cmatch m;
216
275
217
276
try {
218
277
b = std::regex_search (term.c_str (), m, re_oserdes_out);
@@ -231,9 +290,6 @@ bool is_TDP_RAM36K_output_term(const std::string& term) noexcept {
231
290
assert (!term.empty ());
232
291
if (term.empty ()) return false ;
233
292
234
- // // TDP_RAM36K = 32,
235
- // { "RDATA_A", "RPARITY_A", "RDATA_B", "RPARITY_B" },
236
-
237
293
static std::regex re_RAM36K_out{
238
294
R"( RDATA_A=|RPARITY_A=|RDATA_B=|RPARITY_B=|RDATA_A\[\d+\]=|RPARITY_A\[\d+\]=|RDATA_B\[\d+\]=|RPARITY_B\[\d+\]=)"
239
295
};
@@ -258,12 +314,10 @@ bool is_TDP_RAM18KX_output_term(const std::string& term) noexcept {
258
314
assert (!term.empty ());
259
315
if (term.empty ()) return false ;
260
316
261
- // // TDP_RAM18KX2 = 31,
262
- // { " RDATA_A1", "RDATA_B1", " RDATA_A2", " RDATA_B2" },
317
+ static CStr p =
318
+ R"( RDATA_A1=|RDATA_A1\[\d+\]=| RDATA_A2=|RDATA_A2\[\d+\]=|RDATA_B1=|RDATA_B1\[\d+\]=| RDATA_B2=|RDATA_B2\[\d+\]=|RPARITY_A1\[\d+\]=|RPARITY_A2\[\d+\]=|RPARITY_B1\[\d+\]=|RPARITY_B2\[\d+\]= )" ;
263
319
264
- static std::regex re_RAM18KX_out{
265
- R"( RDATA_A1=|RDATA_A1\[\d+\]=|RDATA_A2=|RDATA_A2\[\d+\]=|RDATA_B1=|RDATA_B1\[\d+\]=|RDATA_B2=|RDATA_B2\[\d+\]=)"
266
- };
320
+ static std::regex re_RAM18KX_out{ p };
267
321
268
322
std::cmatch m;
269
323
bool b = false ;
@@ -281,6 +335,35 @@ bool is_TDP_RAM18KX_output_term(const std::string& term) noexcept {
281
335
return b;
282
336
}
283
337
338
+ bool is_PLL_output_term (const std::string& term) noexcept {
339
+ assert (!term.empty ());
340
+ if (term.empty ()) return false ;
341
+
342
+ // { "CLK_OUT", "CLK_OUT_DIV2",
343
+ // "CLK_OUT_DIV3", "CLK_OUT_DIV4",
344
+ // "SERDES_FAST_CLK", "LOCK" }
345
+
346
+ static CStr p =
347
+ R"( CLK_OUT=|CLK_OUT_DIV2=|CLK_OUT_DIV3=|CLK_OUT_DIV4=|SERDES_FAST_CLK=|LOCK=)" ;
348
+
349
+ static std::regex re_PLL_out{ p };
350
+
351
+ std::cmatch m;
352
+ bool b = false ;
353
+
354
+ try {
355
+ b = std::regex_search (term.c_str (), m, re_PLL_out);
356
+ } catch (...) {
357
+ assert (0 );
358
+ b = false ;
359
+ }
360
+
361
+ // if (b)
362
+ // lprintf("__PLL_output REGEX matched: %s\n", term.c_str());
363
+
364
+ return b;
365
+ }
366
+
284
367
// string -> enum, returns A_ZERO on error
285
368
Prim_t primt_id (CStr name) noexcept {
286
369
if (!name or !name[0 ])
0 commit comments