@@ -18,6 +18,7 @@ using std::string;
18
18
" DFFRE" ,
19
19
" DSP19X2" ,
20
20
" DSP38" ,
21
+ " FCLK_BUF" ,
21
22
" FIFO18KX2" ,
22
23
" FIFO36K" ,
23
24
" I_BUF" ,
@@ -64,6 +65,8 @@ using std::string;
64
65
65
66
{ " Z" , " DLY_B" }, // DSP38
66
67
68
+ { " O" }, // FCLK_BUF
69
+
67
70
// FIFO18KX2
68
71
{ " RD_DATA1" , " EMPTY1" , " FULL1" , " ALMOST_EMPTY1" , " ALMOST_FULL1" ,
69
72
" PROG_EMPTY1" , " PROG_FULL1" , " OVERFLOW1" , " UNDERFLOW1" ,
@@ -138,11 +141,24 @@ using std::string;
138
141
139
142
{ " D" , " R" , " E" , " C" }, // DFFRE
140
143
141
- // DSP19X2
142
- { " CLK" , " RESET" , " LOAD_ACC" , " UNSIGNED_A" , " UNSIGNED_B" ,
143
- " SATURATE" , " ROUND" , " SUBTRACT" }, // TMP. INCOMPLETE.
144
-
145
- { }, // DSP38
144
+ // DSP19X2
145
+ {
146
+ " A1[8]" , " A1[7]" , " A1[6]" , " A1[5]" , " A1[4]" , " A1[3]" , " A1[2]" , " A1[1]" , " A1[0]" ,
147
+ " B1[9]" , " B1[8]" , " B1[7]" , " B1[6]" , " B1[5]" , " B1[4]" , " B1[3]" , " B1[2]" , " B1[1]" , " B1[0]" ,
148
+ " CLK" , " RESET" , " LOAD_ACC" , " UNSIGNED_A" , " UNSIGNED_B" ,
149
+ " SATURATE" , " ROUND" , " SUBTRACT"
150
+ },
151
+
152
+ // DSP38
153
+ {
154
+ " A[19]" , " A[18]" , " A[17]" , " A[16]" , " A[15]" , " A[14]" , " A[13]" , " A[12]" , " A[11]" , " A[10]" ,
155
+ " A[9]" , " A[8]" , " A[7]" , " A[6]" , " A[5]" , " A[4]" , " A[3]" , " A[2]" , " A[1]" , " A[0]" ,
156
+ " B[17]" , " B[16]" , " B[15]" , " B[14]" , " B[13]" , " B[12]" , " B[11]" , " B[10]" , " B[9]" , " B[8]" ,
157
+ " B[7]" , " B[6]" , " B[5]" , " B[4]" , " B[3]" , " B[2]" , " B[1]" , " B[0]" ,
158
+ " CLK" ,
159
+ },
160
+
161
+ { " I" }, // FCLK_BUF
146
162
147
163
// FIFO18KX2
148
164
{ },
@@ -225,6 +241,8 @@ using std::string;
225
241
226
242
{ " CLK" }, // DSP38
227
243
244
+ { " I" , " O" }, // FCLK_BUF
245
+
228
246
// FIFO18KX2
229
247
{ " WR_CLK1" , " RD_CLK1" ,
230
248
" WR_CLK2" , " RD_CLK2" },
@@ -339,7 +357,7 @@ uint pr_num_clocks(Prim_t pt) noexcept {
339
357
return V.size ();
340
358
}
341
359
342
- void pr_get_inputs (Prim_t pt, std:: vector<std:: string>& INP) {
360
+ void pr_get_inputs (Prim_t pt, vector<string>& INP) {
343
361
INP.clear ();
344
362
uint i = pt;
345
363
assert (i <= Prim_MAX_ID);
@@ -348,6 +366,15 @@ void pr_get_inputs(Prim_t pt, std::vector<std::string>& INP) {
348
366
INP = _id2inputs[i];
349
367
}
350
368
369
+ void pr_get_outputs (Prim_t pt, vector<string>& OUT) {
370
+ OUT.clear ();
371
+ uint i = pt;
372
+ assert (i <= Prim_MAX_ID);
373
+ if (i == 0 or i > Prim_MAX_ID)
374
+ return ;
375
+ OUT = _id2outputs[i];
376
+ }
377
+
351
378
// "A_"
352
379
static inline bool starts_w_A (CStr z) noexcept {
353
380
assert (z);
@@ -379,7 +406,7 @@ static inline bool starts_w_CAR(CStr z) noexcept {
379
406
return z[0 ] == ' C' and z[1 ] == ' A' and z[2 ] == ' R' ;
380
407
}
381
408
382
- bool is_I_SERDES_output_term (const std:: string& term) noexcept {
409
+ bool is_I_SERDES_output_term (const string& term) noexcept {
383
410
assert (!term.empty ());
384
411
if (term.empty ()) return false ;
385
412
@@ -402,7 +429,7 @@ bool is_I_SERDES_output_term(const std::string& term) noexcept {
402
429
return b;
403
430
}
404
431
405
- bool is_O_SERDES_output_term (const std:: string& term) noexcept {
432
+ bool is_O_SERDES_output_term (const string& term) noexcept {
406
433
assert (!term.empty ());
407
434
if (term.empty ()) return false ;
408
435
@@ -425,7 +452,7 @@ bool is_O_SERDES_output_term(const std::string& term) noexcept {
425
452
return b;
426
453
}
427
454
428
- bool is_TDP_RAM36K_output_term (const std:: string& term) noexcept {
455
+ bool is_TDP_RAM36K_output_term (const string& term) noexcept {
429
456
assert (!term.empty ());
430
457
if (term.empty ()) return false ;
431
458
@@ -449,7 +476,7 @@ bool is_TDP_RAM36K_output_term(const std::string& term) noexcept {
449
476
return b;
450
477
}
451
478
452
- bool is_TDP_RAM18KX_output_term (const std:: string& term) noexcept {
479
+ bool is_TDP_RAM18KX_output_term (const string& term) noexcept {
453
480
assert (!term.empty ());
454
481
if (term.empty ()) return false ;
455
482
@@ -474,7 +501,7 @@ R"(RDATA_A1=|RDATA_A1\[\d+\]=|RDATA_A2=|RDATA_A2\[\d+\]=|RDATA_B1=|RDATA_B1\[\d+
474
501
return b;
475
502
}
476
503
477
- bool is_PLL_output_term (const std:: string& term) noexcept {
504
+ bool is_PLL_output_term (const string& term) noexcept {
478
505
assert (!term.empty ());
479
506
if (term.empty ()) return false ;
480
507
@@ -524,5 +551,64 @@ Prim_t pr_str2enum(CStr name) noexcept {
524
551
return A_ZERO;
525
552
}
526
553
554
+ // ==== DEBUG:
555
+
556
+ string pr_write_yaml (Prim_t pt) noexcept {
557
+ using std::endl;
558
+ CStr primName = pr_enum2str (pt);
559
+ assert (primName);
560
+ assert (primName[0 ]);
561
+ if (!primName or !primName[0 ])
562
+ return {};
563
+
564
+ string fn = str::concat (primName, " _pln.yaml" );
565
+
566
+ flush_out (true );
567
+ lprintf (" pr_write_yaml( %s ) to file: %s\n " , primName, fn.c_str ());
568
+
569
+ std::ofstream fos (fn);
570
+ if (not fos.is_open ()) {
571
+ flush_out (true );
572
+ lprintf (" pr_write_yaml: could not open file for writing: %s\n\n " , fn.c_str ());
573
+ return {};
574
+ }
575
+
576
+ fos << " name: " << primName << endl;
577
+ fos << " desc: " ;
578
+ if (pt >= LUT1 and pt <= LUT6)
579
+ os_printf (fos, " %u-input lookup table (LUT)" , pr_num_inputs (pt));
580
+ fos << endl;
581
+
582
+ fos << " category: core_fabric" << endl;
583
+ fos << endl;
584
+
585
+ fos << " ports:" << endl;
586
+
587
+ vector<string> V;
588
+
589
+ pr_get_inputs (pt, V);
590
+ for (const string& port : V) {
591
+ os_printf (fos, " %s:\n " , port.c_str ());
592
+ os_printf (fos, " dir: input\n " );
593
+ os_printf (fos, " desc:" );
594
+ if (pr_pin_is_clock (pt, port))
595
+ fos << " Clock" ;
596
+ fos << endl;
597
+ }
598
+ pr_get_outputs (pt, V);
599
+ for (const string& port : V) {
600
+ os_printf (fos, " %s:\n " , port.c_str ());
601
+ os_printf (fos, " dir: output\n " );
602
+ os_printf (fos, " desc:" );
603
+ if (pr_pin_is_clock (pt, port))
604
+ fos << " Clock" ;
605
+ fos << endl;
606
+ }
607
+
608
+ fos << endl;
609
+
610
+ return fn;
611
+ }
612
+
527
613
}}
528
614
0 commit comments