@@ -197,6 +197,28 @@ CStr BLIF_file::BNode::cPrimType() const noexcept {
197
197
return ptype_ == prim::A_ZERO ? " {e}" : pr_enum2str (ptype_);
198
198
}
199
199
200
+ int BLIF_file::findTermByNet (const vector<string>& D, const string& net) noexcept {
201
+ assert (not net.empty ());
202
+ assert (not D.empty ());
203
+ if (net.empty () or D.empty ())
204
+ return -1 ;
205
+
206
+ int64_t sz = D.size ();
207
+ assert (sz < INT_MAX);
208
+
209
+ // lputs();
210
+ // logVec(D, " _bnode.D ");
211
+ // lputs();
212
+
213
+ for (int i = sz - 1 ; i >= 0 ; i--) {
214
+ CStr term = D[i].c_str ();
215
+ CStr p = ::strchr (term, ' =' );
216
+ if (p and net == p+1 )
217
+ return i;
218
+ }
219
+ return -1 ;
220
+ }
221
+
200
222
bool BLIF_file::readBlif () noexcept {
201
223
inputs_.clear ();
202
224
outputs_.clear ();
@@ -507,15 +529,16 @@ bool BLIF_file::checkBlif(vector<string>& badInputs,
507
529
if (trace_ >= 8 ) {
508
530
// string written = pr_write_yaml( FIFO36K );
509
531
// string written = pr_write_yaml( FIFO18KX2 );
510
- string written = pr_write_yaml ( TDP_RAM36K );
532
+ // string written = pr_write_yaml( TDP_RAM36K );
533
+ string written = pr_write_yaml ( TDP_RAM18KX2 );
511
534
flush_out (true );
512
535
if (written.empty ()) {
513
536
lprintf (" \t\t FAIL: pr_write_yaml() FAILED\n\n " );
514
537
} else {
515
538
lprintf (" \t written: %s\n\n " , written.c_str ());
516
539
if (0 ) {
517
540
lprintf (" \n " );
518
- for (int bb = 30 ; bb >= 0 ; bb--) {
541
+ for (int bb = 15 ; bb >= 0 ; bb--) {
519
542
lprintf (" \" RDATA_A[%i]\" ," , bb);
520
543
}
521
544
lputs ();
@@ -1127,6 +1150,12 @@ bool BLIF_file::createNodes() noexcept {
1127
1150
if (not starts_w_subckt (cs + 1 , len - 1 ))
1128
1151
continue ;
1129
1152
Fio::split_spa (lines_[L], V);
1153
+ // if (L == 48) {
1154
+ // string delWire1151 = "$delete_wire$1151";
1155
+ // lputs8();
1156
+ // int dTerm = findTermByNet(V, delWire1151);
1157
+ // lprintf(" dTerm= %i\n", dTerm);
1158
+ // }
1130
1159
if (V.size () > 1 and V.front () == " .subckt" ) {
1131
1160
Prim_t pt = pr_str2enum ( V[1 ].c_str () );
1132
1161
if (pr_is_MOG (pt)) {
@@ -1172,7 +1201,6 @@ bool BLIF_file::createNodes() noexcept {
1172
1201
if (starts_w_names (cs + 1 , len - 1 )) {
1173
1202
Fio::split_spa (lines_[L], V);
1174
1203
if (V.size () > 1 and V.front () == " .names" ) {
1175
- // lputs9();
1176
1204
nodePool_.emplace_back (" .names" , L);
1177
1205
BNode& nd = nodePool_.back ();
1178
1206
nd.data_ .assign (V.begin () + 1 , V.end ());
@@ -1209,7 +1237,6 @@ bool BLIF_file::createNodes() noexcept {
1209
1237
nd.ptype_ = pr_str2enum (nd.data_front ());
1210
1238
nd.place_output_at_back (nd.data_ );
1211
1239
if (pr_is_DSP (nd.ptype_ )) {
1212
- // lputs9();
1213
1240
vector<string> TK;
1214
1241
// search for .param DSP_MODE "MULTIPLY"
1215
1242
// to flag clock-less DSP
@@ -1285,6 +1312,13 @@ bool BLIF_file::createNodes() noexcept {
1285
1312
continue ;
1286
1313
assert (!nd.is_mog_ );
1287
1314
1315
+ // if (nd.lnum_ == 48) {
1316
+ // string delWire1151 = "$delete_wire$1151";
1317
+ // lputs8();
1318
+ // int dTerm = findTermByNet(nd.data_, delWire1151);
1319
+ // lprintf(" dTerm= %i\n", dTerm);
1320
+ // }
1321
+
1288
1322
s_is_MOG (nd, V);
1289
1323
bool is_mog = V.size () > 1 ;
1290
1324
if (is_mog) {
@@ -1294,15 +1328,16 @@ bool BLIF_file::createNodes() noexcept {
1294
1328
logVec (V, " [V-terms] " );
1295
1329
lputs ();
1296
1330
}
1297
- // lputs9();
1298
1331
1332
+ vector<string> dataCopy { nd.data_ };
1299
1333
s_remove_MOG_terms (nd);
1300
1334
uint startVirtual = nodePool_.size ();
1301
1335
for (uint j = 1 ; j < V.size (); j++) {
1302
1336
nodePool_.emplace_back (nd);
1303
1337
nodePool_.back ().virtualOrigin_ = i;
1304
1338
nodePool_.back ().is_mog_ = true ;
1305
1339
}
1340
+ nd.realData_ .swap (dataCopy);
1306
1341
nd.data_ .push_back (V.front ());
1307
1342
nd.is_mog_ = true ;
1308
1343
// give one output term to each virtual MOG:
@@ -1341,8 +1376,6 @@ bool BLIF_file::createNodes() noexcept {
1341
1376
}
1342
1377
if (nd.kw_ == " .subckt" or nd.kw_ == " .gate" ) {
1343
1378
if (nd.data_ .size () > 1 ) {
1344
- // if (nd.lnum_ == 47)
1345
- // lputs8();
1346
1379
const string& last = nd.data_ .back ();
1347
1380
size_t llen = last.length ();
1348
1381
if (!last.empty () and llen < 4095 ) {
@@ -1637,7 +1670,6 @@ bool BLIF_file::linkNodes() noexcept {
1637
1670
assert (fab_nd);
1638
1671
BNode& nd = *fab_nd;
1639
1672
if (nd.out_ .empty ()) {
1640
- // lputs8();
1641
1673
err_msg_ = str::concat (" incomplete fabric cell: " , nd.kw_ );
1642
1674
if (!nd.data_ .empty ()) {
1643
1675
err_msg_ += str::concat (" " , nd.data_ .front ());
@@ -1708,20 +1740,35 @@ bool BLIF_file::linkNodes() noexcept {
1708
1740
assert (!nd.out_ .empty ());
1709
1741
if (nd.parent_ )
1710
1742
continue ;
1743
+ // if (nd.lnum_ == 48)
1744
+ // lputs7();
1711
1745
int pinIndex = -1 ;
1712
1746
BNode* par = findFabricParent (nd.id_ , nd.out_ , pinIndex);
1713
1747
if (!par) {
1714
1748
if (nd.is_RAM () or nd.is_DSP ()) {
1749
+ const string& net = nd.out_ ;
1715
1750
bool is_ram = nd.is_RAM ();
1751
+ uint rid = nd.realId (*this );
1752
+ const BNode& realNd = bnodeRef (rid);
1753
+ const vector<string>& realData = realNd.realData_ ;
1754
+ assert (not realData.empty ());
1755
+ int dataTerm = findTermByNet (realData, net);
1756
+ assert (dataTerm >= 0 );
1757
+ assert (dataTerm < int64_t (realData.size ()));
1758
+ if (dataTerm < 0 )
1759
+ continue ;
1716
1760
// RAM or DSP output bits may be unused
1717
- if (trace_ >= 5 ) {
1761
+ if (trace_ >= 4 ) {
1718
1762
lprintf (" skipping dangling cell output issue for %s at line %u\n " ,
1719
- is_ram ? " RAM" : " DSP" , nd.lnum_ );
1763
+ is_ram ? " RAM" : " DSP" , realNd.lnum_ );
1764
+ lprintf (" dangling net: %s term# %i %s\n " ,
1765
+ net.c_str (), dataTerm, realData[dataTerm].c_str ());
1766
+ lputs ();
1720
1767
}
1721
1768
if (is_ram)
1722
- dang_RAM_outputs_.emplace_back (nd .id_ );
1769
+ dang_RAM_outputs_.emplace_back (realNd .id_ , dataTerm );
1723
1770
else
1724
- dang_DSP_outputs_.emplace_back (nd .id_ );
1771
+ dang_DSP_outputs_.emplace_back (realNd .id_ , dataTerm );
1725
1772
continue ;
1726
1773
}
1727
1774
err_msg_ = " dangling cell output: " ;
@@ -1934,7 +1981,7 @@ bool BLIF_file::checkClockSepar(vector<BNode*>& clocked) noexcept {
1934
1981
else
1935
1982
pg_.setNwName (" pin_graph_VIOL" );
1936
1983
1937
- if (trace_ >= 3 ) {
1984
+ if (not ::getenv ( " pln_blif_dont_write_pinGraph " ) ) {
1938
1985
pinGraphFile_ = writePinGraph (" _PinGraph.dot" );
1939
1986
}
1940
1987
0 commit comments