Skip to content

Commit 8da26af

Browse files
authored
Merge pull request #773 from os-fpga/checker_impr_msg_n_restruct
checker: improved messages, some restructuring
2 parents 1af8cd9 + dbe4fa5 commit 8da26af

File tree

5 files changed

+108
-47
lines changed

5 files changed

+108
-47
lines changed

planning/src/file_readers/pln_blif_file.cpp

Lines changed: 50 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace pln {
55

66
using namespace fio;
77
using namespace std;
8+
using namespace prim;
89

910
BLIF_file::~BLIF_file() {}
1011

@@ -364,10 +365,12 @@ bool BLIF_file::checkBlif() noexcept {
364365
// 4. create and link nodes
365366
createNodes();
366367

367-
if (trace_ >= 5) {
368+
if (trace_ >= 4) {
368369
printPrimitives(ls);
369-
printNodes(ls);
370-
flush_out(true);
370+
if (trace_ >= 5) {
371+
printNodes(ls);
372+
flush_out(true);
373+
}
371374
}
372375
if (trace_ >= 6) {
373376
printCarryNodes(ls);
@@ -386,7 +389,20 @@ bool BLIF_file::checkBlif() noexcept {
386389

387390
if (trace_ >= 3) {
388391
flush_out(true);
389-
printNodes(ls);
392+
if (trace_ >= 5) {
393+
printNodes(ls);
394+
lputs("====");
395+
} else {
396+
lprintf("==== node summary after linking ====\n");
397+
uint nn = numNodes();
398+
ls << "==== nodes (" << nn << ") :" << endl;
399+
ls << "==== #topInputs_= " << topInputs_.size() << '\n';
400+
ls << " #topOutputs_= " << topOutputs_.size() << '\n';
401+
ls << " #fabricNodes_= " << fabricNodes_.size() << '\n';
402+
ls << " #latches_= " << latches_.size() << '\n';
403+
ls << " #constantNodes_= " << constantNodes_.size() << '\n';
404+
flush_out(true);
405+
}
390406
}
391407

392408
// 5. no undriven output ports
@@ -409,7 +425,7 @@ bool BLIF_file::checkBlif() noexcept {
409425
assert(port->inDeg() == 0);
410426
pinG.insK(port->hashCode());
411427
}
412-
if (trace_ >= 4) {
428+
if (trace_ >= 14) {
413429
flush_out(true);
414430
pinG.printSum(ls, 0);
415431
}
@@ -494,11 +510,20 @@ uint BLIF_file::printNodes(std::ostream& os) const noexcept {
494510

495511
uint BLIF_file::printPrimitives(std::ostream& os) const noexcept {
496512
os << endl;
497-
os_printf(os, "======== primitive types (%u) :\n", Prim_MAX_ID);
513+
os_printf(os, "======== primitive types (%u) :\n", Prim_MAX_ID - 1);
514+
char ncs_buf[80] = {};
498515
for (uint t = 1; t < Prim_MAX_ID; t++) {
499-
CStr pn = primt_name(Prim_t(t));
516+
Prim_t pt = Prim_t(t);
517+
CStr pn = pr_enum2str(pt);
500518
assert(pn and pn[0]);
501-
os_printf(os, " [%u] %s\n", t, pn);
519+
uint n_outputs = pr_num_outputs(pt);
520+
uint n_clocks = pr_num_clocks(pt);
521+
ncs_buf[0] = 0;
522+
if (n_clocks) {
523+
::sprintf(ncs_buf, " #clock_pins= %u", n_clocks);
524+
}
525+
os_printf(os, " [%u] %s #outputs= %u%s\n",
526+
t, pn, n_outputs, ncs_buf);
502527
}
503528

504529
os << endl;
@@ -800,7 +825,7 @@ bool BLIF_file::createNodes() noexcept {
800825
nodePool_.emplace_back(".subckt", L);
801826
Node& nd = nodePool_.back();
802827
nd.data_.assign(V.begin() + 1, V.end());
803-
nd.ptype_ = primt_id(nd.data_front());
828+
nd.ptype_ = pr_str2enum(nd.data_front());
804829
nd.place_output_at_back(nd.data_);
805830
}
806831
continue;
@@ -813,7 +838,7 @@ bool BLIF_file::createNodes() noexcept {
813838
nodePool_.emplace_back(".gate", L);
814839
Node& nd = nodePool_.back();
815840
nd.data_.assign(V.begin() + 1, V.end());
816-
nd.ptype_ = primt_id(nd.data_front());
841+
nd.ptype_ = pr_str2enum(nd.data_front());
817842
nd.place_output_at_back(nd.data_);
818843
}
819844
continue;
@@ -1061,6 +1086,8 @@ bool BLIF_file::linkNodes() noexcept {
10611086
if (inputs_.empty() and outputs_.empty()) return false;
10621087
if (fabricNodes_.empty()) return false;
10631088

1089+
err_msg_.clear();
1090+
10641091
// 1. start with fabricNodes_ which are rooted at output ports
10651092
for (Node* fab_nd : fabricNodes_) {
10661093
assert(fab_nd);
@@ -1086,8 +1113,13 @@ bool BLIF_file::linkNodes() noexcept {
10861113
assert(!nd.out_.empty());
10871114
Node* par = findFabricDriver(nd.id_, nd.out_);
10881115
if (par) {
1089-
err_msg_ = "input port contacts fabric driver: ";
1116+
err_msg_.reserve(224);
1117+
err_msg_ = "input port contacts fabric driver: port= ",
10901118
err_msg_ += nd.out_;
1119+
err_msg_ += " fab-driver= ";
1120+
err_msg_ += par->cPrimType();
1121+
err_msg_ += " @ line ";
1122+
err_msg_ += std::to_string(par->lnum_);
10911123
err_lnum_ = nd.lnum_;
10921124
return false;
10931125
}
@@ -1101,16 +1133,21 @@ bool BLIF_file::linkNodes() noexcept {
11011133
int pinIndex = -1;
11021134
Node* par = findFabricParent(nd.id_, nd.out_, pinIndex);
11031135
if (par) {
1104-
// lputs9();
11051136
assert(pinIndex >= 0);
11061137
assert(uint(pinIndex) < par->data_.size());
11071138
const string& pinToken = par->data_[pinIndex];
11081139
if (trace_ >= 20)
11091140
lout() << pinToken << endl;
11101141
if (not par->isLatch()) {
11111142
// skipping latches for now
1112-
err_msg_ = "output port contacts fabric input: ";
1143+
// lputs9();
1144+
err_msg_.reserve(224);
1145+
err_msg_ = "output port contacts fabric input: port= ",
11131146
err_msg_ += nd.out_;
1147+
err_msg_ += " fab-input= ";
1148+
err_msg_ += par->cPrimType();
1149+
err_msg_ += " @ line ";
1150+
err_msg_ += std::to_string(par->lnum_);
11141151
err_lnum_ = nd.lnum_;
11151152
return false;
11161153
}

planning/src/file_readers/pln_blif_file.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ struct BLIF_file : public fio::MMapReader
3030

3131
uint virtualOrigin_ = 0; // node-ID from which this virtual MOG is created
3232

33-
Prim_t ptype_ = A_ZERO;
33+
prim::Prim_t ptype_ = prim::A_ZERO;
3434

3535
int16_t is_top_ = 0; // -1:top input 1:top output
3636
bool is_mog_ = false;
@@ -64,7 +64,7 @@ struct BLIF_file : public fio::MMapReader
6464

6565
bool hasPrimType() const noexcept {
6666
uint pt = ptype_;
67-
return pt > 0 and pt < Prim_MAX_ID;
67+
return pt > 0 and pt < prim::Prim_MAX_ID;
6868
}
6969

7070
uint deg() const noexcept { return uint(!isRoot()) + chld_.size(); }
@@ -94,9 +94,11 @@ struct BLIF_file : public fio::MMapReader
9494
}
9595

9696
bool is_IBUF() const noexcept {
97+
using namespace prim;
9798
return ptype_ == I_BUF or ptype_ == I_BUF_DS;
9899
}
99100
bool is_OBUF() const noexcept {
101+
using namespace prim;
100102
return ptype_ == O_BUF or ptype_ == O_BUF_DS or
101103
ptype_ == O_BUFT or ptype_ == O_BUFT_DS;
102104
}
@@ -105,25 +107,27 @@ struct BLIF_file : public fio::MMapReader
105107

106108
CStr cOut() const noexcept { return out_.empty() ? "{e}" : out_.c_str(); }
107109

108-
CStr cPrimType() const noexcept { return ptype_ == A_ZERO ? "{e}" : primt_name(ptype_); }
110+
CStr cPrimType() const noexcept {
111+
return ptype_ == prim::A_ZERO ? "{e}" : pr_enum2str(ptype_);
112+
}
109113

110114
struct CmpOut {
111115
bool operator()(const Node* a, const Node* b) const noexcept {
112116
return a->out_ < b->out_;
113117
}
114118
};
115119
struct PinIsInput {
116-
Prim_t pt_ = A_ZERO;
117-
PinIsInput(Prim_t p) noexcept
120+
prim::Prim_t pt_ = prim::A_ZERO;
121+
PinIsInput(prim::Prim_t p) noexcept
118122
: pt_(p) {}
119123
bool operator()(const string& pinName) const noexcept {
120-
return not prim_pin_is_output(pt_, pinName);
124+
return not pr_pin_is_output(pt_, pinName);
121125
}
122126
};
123127

124128
struct PinPatternIsInput {
125-
Prim_t pt_ = A_ZERO;
126-
PinPatternIsInput(Prim_t p) noexcept
129+
prim::Prim_t pt_ = prim::A_ZERO;
130+
PinPatternIsInput(prim::Prim_t p) noexcept
127131
: pt_(p) {}
128132
bool operator()(const string& pat) const noexcept {
129133
size_t len = pat.length();
@@ -138,7 +142,7 @@ struct BLIF_file : public fio::MMapReader
138142
break;
139143
}
140144
}
141-
return not prim_cpin_is_output(pt_, buf);
145+
return not pr_cpin_is_output(pt_, buf);
142146
}
143147
};
144148

planning/src/file_readers/pln_primitives.cpp

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@
22
#include <regex>
33

44
namespace pln {
5+
namespace prim {
56

67
using std::vector;
78
using std::string;
89

9-
namespace {
10-
1110
// _enumNames are sorted and Prim_t is sorted, it ensures
1211
// correct ID -> name mapping. Always keep them in sorted order.
1312
static const char* _enumNames[] = {
@@ -108,8 +107,7 @@ namespace {
108107
// O_SERDES
109108
{ "OE_OUT", "Q", "CHANNEL_BOND_SYNC_OUT", "DLY_TAP_VALUE" },
110109

111-
// O_SERDES_CLK
112-
{ "OUTPUT_CLK" },
110+
{ "OUTPUT_CLK" }, // O_SERDES_CLK
113111

114112
// PLL
115113
{ "CLK_OUT", "CLK_OUT_DIV2",
@@ -191,16 +189,13 @@ namespace {
191189
{ "CLK_A1", "CLK_B1",
192190
"CLK_A2", "CLK_B2" },
193191

194-
// TDP_RAM36K
195-
{ "CLK_A", "CLK_B" },
192+
{ "CLK_A", "CLK_B" }, // TDP_RAM36K
196193

197194
{}, // X_UNKNOWN
198195
{}, // Y_UPPER_GUARD
199196
{}
200197
}; // _id2clocks
201198

202-
}
203-
204199
static inline bool _vec_contains(const vector<string>& V, CStr name) noexcept {
205200
for (const string& s : V) {
206201
if (s == name)
@@ -209,7 +204,7 @@ static inline bool _vec_contains(const vector<string>& V, CStr name) noexcept {
209204
return false;
210205
}
211206

212-
bool prim_cpin_is_output(Prim_t primId, CStr pinName) noexcept {
207+
bool pr_cpin_is_output(Prim_t primId, CStr pinName) noexcept {
213208
uint i = primId;
214209
assert(i <= Prim_MAX_ID);
215210
if (i == 0 or !pinName or !pinName[0] or i > Prim_MAX_ID)
@@ -218,7 +213,7 @@ bool prim_cpin_is_output(Prim_t primId, CStr pinName) noexcept {
218213
return _vec_contains(V, pinName);
219214
}
220215

221-
bool prim_cpin_is_clock(Prim_t primId, CStr pinName) noexcept {
216+
bool pr_cpin_is_clock(Prim_t primId, CStr pinName) noexcept {
222217
uint i = primId;
223218
assert(i <= Prim_MAX_ID);
224219
if (i == 0 or !pinName or !pinName[0] or i > Prim_MAX_ID)
@@ -227,13 +222,31 @@ bool prim_cpin_is_clock(Prim_t primId, CStr pinName) noexcept {
227222
return _vec_contains(V, pinName);
228223
}
229224

230-
CStr primt_name(Prim_t enu) noexcept {
225+
CStr pr_enum2str(Prim_t enu) noexcept {
231226
static_assert(sizeof(_enumNames) / sizeof(_enumNames[0]) == Y_UPPER_GUARD + 1);
232227
uint i = enu;
233228
assert(i <= Prim_MAX_ID);
234229
return _enumNames[i];
235230
}
236231

232+
uint pr_num_outputs(Prim_t primId) noexcept {
233+
uint i = primId;
234+
assert(i <= Prim_MAX_ID);
235+
if (i == 0 or i > Prim_MAX_ID)
236+
return 0;
237+
const vector<string>& V = _id2outputs[i];
238+
return V.size();
239+
}
240+
241+
uint pr_num_clocks(Prim_t primId) noexcept {
242+
uint i = primId;
243+
assert(i <= Prim_MAX_ID);
244+
if (i == 0 or i > Prim_MAX_ID)
245+
return 0;
246+
const vector<string>& V = _id2clocks[i];
247+
return V.size();
248+
}
249+
237250
// "A_"
238251
static inline bool starts_w_A(CStr z) noexcept {
239252
assert(z);
@@ -390,7 +403,7 @@ R"(CLK_OUT=|CLK_OUT_DIV2=|CLK_OUT_DIV3=|CLK_OUT_DIV4=|SERDES_FAST_CLK=|LOCK=)";
390403
}
391404

392405
// string -> enum, returns A_ZERO on error
393-
Prim_t primt_id(CStr name) noexcept {
406+
Prim_t pr_str2enum(CStr name) noexcept {
394407
if (!name or !name[0])
395408
return A_ZERO;
396409
if (starts_w_X(name))
@@ -410,5 +423,5 @@ Prim_t primt_id(CStr name) noexcept {
410423
return A_ZERO;
411424
}
412425

413-
}
426+
}}
414427

planning/src/file_readers/pln_primitives.h

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@
44

55
#include "util/pln_log.h"
66

7+
#undef A_ZERO
8+
#undef CARRY
9+
#undef PLL
10+
711
namespace pln {
12+
namespace prim {
813

914
enum Prim_t {
1015

@@ -19,7 +24,7 @@ enum Prim_t {
1924
DSP38 = 7,
2025
FIFO18KX2 = 8,
2126
FIFO36K = 9,
22-
I_BUF =10,
27+
I_BUF = 10,
2328
I_BUF_DS = 11,
2429
I_DDR = 12,
2530
I_DELAY = 13,
@@ -55,23 +60,25 @@ constexpr uint Prim_MAX_ID = X_UNKNOWN;
5560

5661

5762
// enum -> string
58-
CStr primt_name(Prim_t enu) noexcept;
59-
63+
CStr pr_enum2str(Prim_t enu) noexcept;
6064

6165
// string -> enum, returns A_ZERO on error
62-
Prim_t primt_id(CStr name) noexcept;
66+
Prim_t pr_str2enum(CStr name) noexcept;
6367

6468

65-
bool prim_cpin_is_output(Prim_t primId, CStr pinName) noexcept;
66-
bool prim_cpin_is_clock(Prim_t primId, CStr pinName) noexcept;
69+
bool pr_cpin_is_output(Prim_t primId, CStr pinName) noexcept;
70+
bool pr_cpin_is_clock(Prim_t primId, CStr pinName) noexcept;
6771

68-
inline bool prim_pin_is_output(Prim_t primId, const std::string& pinName) noexcept {
69-
return prim_cpin_is_output(primId, pinName.c_str());
72+
inline bool pr_pin_is_output(Prim_t primId, const std::string& pinName) noexcept {
73+
return pr_cpin_is_output(primId, pinName.c_str());
7074
}
71-
inline bool prim_pin_is_clock(Prim_t primId, const std::string& pinName) noexcept {
72-
return prim_cpin_is_clock(primId, pinName.c_str());
75+
inline bool pr_pin_is_clock(Prim_t primId, const std::string& pinName) noexcept {
76+
return pr_cpin_is_clock(primId, pinName.c_str());
7377
}
7478

79+
uint pr_num_outputs(Prim_t primId) noexcept;
80+
uint pr_num_clocks(Prim_t primId) noexcept;
81+
7582
bool is_I_SERDES_output_term(const std::string& term) noexcept;
7683
bool is_O_SERDES_output_term(const std::string& term) noexcept;
7784

@@ -80,7 +87,7 @@ bool is_TDP_RAM18KX_output_term(const std::string& term) noexcept;
8087

8188
bool is_PLL_output_term(const std::string& term) noexcept;
8289

83-
}
90+
}}
8491

8592
#endif
8693

planning/src/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
static const char* _pln_VERSION_STR = "pln0278";
1+
static const char* _pln_VERSION_STR = "pln0281";
22

33
#include "RS/rsEnv.h"
44
#include "util/pln_log.h"

0 commit comments

Comments
 (0)