Skip to content

Commit 516c765

Browse files
authored
Merge pull request #777 from os-fpga/checker_DB_primitive_inputs
checker: added input pins to primitive-DB for clock-data
2 parents 074578c + fe75b51 commit 516c765

File tree

5 files changed

+179
-20
lines changed

5 files changed

+179
-20
lines changed

planning/src/file_readers/pln_blif_file.cpp

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -562,8 +562,8 @@ uint BLIF_file::printPrimitives(std::ostream& os, bool instCounts) const noexcep
562562
if (n_clocks) {
563563
::sprintf(ncs_buf, " #clock_pins= %u", n_clocks);
564564
}
565-
os_printf(os, " [%u] %s #outputs= %u%s\n",
566-
t, pn, n_outputs, ncs_buf);
565+
os_printf(os, " [%u] %s i:%u o:%u %s\n",
566+
t, pn, pr_num_inputs(pt), n_outputs, ncs_buf);
567567
}
568568
}
569569

@@ -1097,6 +1097,35 @@ string BLIF_file::Node::firstInputPin() const noexcept {
10971097
return {};
10981098
}
10991099

1100+
void BLIF_file::Node::allInputPins(vector<string>& V) const noexcept {
1101+
V.clear();
1102+
1103+
if (data_.size() < 2) return;
1104+
if (kw_ == ".names") {
1105+
if (data_[0] != out_) {
1106+
V.push_back(data_[0]);
1107+
return;
1108+
}
1109+
}
1110+
if (kw_ == ".latch") {
1111+
if (data_[1] != out_) {
1112+
V.push_back(data_[1]);
1113+
return;
1114+
}
1115+
}
1116+
if (data_.size() < 3) return;
1117+
if (kw_ == ".subckt" or kw_ == ".gate") {
1118+
CStr dat1 = data_[1].c_str();
1119+
if (starts_w_I_eq(dat1)) {
1120+
V.push_back(dat1 + 2); // TMP. WRONG.
1121+
return;
1122+
}
1123+
}
1124+
return;
1125+
}
1126+
1127+
// void BLIF_file::Node:: allInputSignals(vector<string>& V) const noexcept;
1128+
11001129
BLIF_file::Node* BLIF_file::findOutputPort(const string& contact) noexcept {
11011130
assert(not contact.empty());
11021131
if (topOutputs_.empty()) return nullptr;
@@ -1312,7 +1341,9 @@ bool BLIF_file::linkNodes() noexcept {
13121341
}
13131342

13141343
bool BLIF_file::checkClockSepar(vector<const Node*>& clocked) noexcept {
1315-
if (1|| clocked.empty())
1344+
if (not ::getenv("pln_check_clock_separation"))
1345+
return true;
1346+
if (clocked.empty())
13161347
return true;
13171348

13181349
bool ok = createPinGraph();
@@ -1388,6 +1419,7 @@ bool BLIF_file::createPinGraph() noexcept {
13881419
err_msg_.clear();
13891420
uint64_t key = 0;
13901421
uint nid = 0, kid = 0, eid = 0;
1422+
vector<string> INP;
13911423

13921424
// -- create pg-nodes for topInputs_
13931425
for (const Node* p : topInputs_) {
@@ -1408,14 +1440,33 @@ bool BLIF_file::createPinGraph() noexcept {
14081440
}
14091441

14101442
// -- link from input ports to fabric
1443+
lputs9();
14111444
for (Node* p : topInputs_) {
1445+
INP.clear();
14121446
Node& port = *p;
14131447
assert(!port.out_.empty());
1448+
1449+
if (trace_ >= 5) {
1450+
lprintf(" TopInput: lnum_= %u %s\n",
1451+
port.lnum_, port.out_.c_str());
1452+
}
1453+
14141454
int pinIndex = -1;
14151455
Node* par = findFabricParent(port.id_, port.out_, pinIndex);
14161456
if (!par) {
14171457
continue;
14181458
}
1459+
1460+
pr_get_inputs(par->ptype_, INP);
1461+
1462+
if (trace_ >= 5) {
1463+
lprintf(" FabricParent par: lnum_= %u kw_= %s ptype_= %s #inputs= %u\n",
1464+
par->lnum_, par->kw_.c_str(), par->cPrimType(),
1465+
pr_num_inputs(par->ptype_));
1466+
logVec(INP, " [par_inputs] ");
1467+
lputs();
1468+
}
1469+
14191470
assert(par->cell_hc_);
14201471
key = hashComb(par->cell_hc_, pinIndex);
14211472
assert(key);

planning/src/file_readers/pln_blif_file.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ struct BLIF_file : public fio::MMapReader
117117

118118
string firstInputPin() const noexcept;
119119

120+
void allInputPins(vector<string>& V) const noexcept;
121+
122+
void allInputSignals(vector<string>& V) const noexcept;
123+
120124
CStr cOut() const noexcept { return out_.empty() ? "{e}" : out_.c_str(); }
121125

122126
CStr cPrimType() const noexcept {

planning/src/file_readers/pln_primitives.cpp

Lines changed: 109 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,89 @@ using std::string;
126126
{}
127127
}; // _id2outputs
128128

129+
static vector<string> _id2inputs[] = {
130+
{}, // 0
131+
132+
{ }, // BOOT_CLOCK
133+
{ "P", "G", "CIN" }, // CARRY
134+
135+
{ "I" }, // CLK_BUF
136+
137+
{ "D", "R", "E", "C" }, // DFFNRE
138+
139+
{ "D", "R", "E", "C" }, // DFFRE
140+
141+
// DSP19X2
142+
{ "CLK", "RESET", "LOAD_ACC", "UNSIGNED_A", "UNSIGNED_B",
143+
"SATURATE", "ROUND", "SUBTRACT" }, // TMP. INCOMPLETE.
144+
145+
{ }, // DSP38
146+
147+
// FIFO18KX2
148+
{ },
149+
150+
// FIFO36K
151+
{ },
152+
153+
{ "I", "EN" }, // I_BUF
154+
{ "I_P", "I_N", "EN" }, // I_BUF_DS
155+
156+
{ "D", "R", "E", "C" }, // I_DDR
157+
158+
// I_DELAY
159+
{ "I", "DLY_LOAD", "DLY_ADJ",
160+
"DLY_INCDEC", "CLK_IN" },
161+
162+
{ "I" }, // IO_BUF
163+
{ "I" }, // IO_BUF_DS
164+
165+
// I_SERDES
166+
{ "D", "RST", "BITSLIP_ADJ", "EN", "CLK_IN",
167+
"PLL_LOCK", "PLL_CLK" },
168+
169+
{ "A" }, // LUT1
170+
{ "A[1]", "A[0]" }, // LUT2
171+
{ "A[2]", "A[1]", "A[0]"}, // LUT3
172+
{ "A[3]", "A[2]", "A[1]", "A[0]" }, // LUT4
173+
{ "A[4]", "A[3]", "A[2]", "A[1]", "A[0]" }, // LUT5
174+
{ "A[5]", "A[4]", "A[3]", "A[2]", "A[1]", "A[0]" }, // LUT6
175+
176+
{ "I" }, // O_BUF
177+
{ "I" }, // O_BUF_DS
178+
179+
{ "I", "T" }, // O_BUFT
180+
{ "I", "T" }, // O_BUFT_DS
181+
182+
// O_DDR
183+
{ "D[1]", "D[0]", "R", "E", "C" },
184+
185+
// O_DELAY
186+
{ "I", "DLY_LOAD", "DLY_ADJ",
187+
"DLY_INCDEC", "CLK_IN" },
188+
189+
// O_SERDES // TMP. INCOMPLETE: D is a bus
190+
{ "D", "RST", "DATA_VALID", "CLK_IN", "OE_IN",
191+
"CHANNEL_BOND_SYNC_IN", "PLL_LOCK", "PLL_CLK" },
192+
193+
// O_SERDES_CLK
194+
{ "CLK_EN", "PLL_LOCK", "PLL_CLK" },
195+
196+
// PLL
197+
{ "PLL_EN", "CLK_IN" },
198+
199+
// TDP_RAM18KX2 // TMP. INCOMPLETE
200+
{ "WEN_A1", "WEN_B1", "REN_A1", "REN_B1",
201+
"CLK_A1", "CLK_B1" },
202+
203+
// TDP_RAM36K // TMP. INCOMPLETE
204+
{ "WEN_A", "WEN_B", "REN_A", "REN_B",
205+
"CLK_A", "CLK_B" },
206+
207+
{}, // X_UNKNOWN
208+
{}, // Y_UPPER_GUARD
209+
{}
210+
}; // _id2inputs
211+
129212
static vector<string> _id2clocks[] = {
130213
{}, // 0
131214

@@ -204,17 +287,17 @@ static inline bool _vec_contains(const vector<string>& V, CStr name) noexcept {
204287
return false;
205288
}
206289

207-
bool pr_cpin_is_output(Prim_t primId, CStr pinName) noexcept {
208-
uint i = primId;
290+
bool pr_cpin_is_output(Prim_t pt, CStr pinName) noexcept {
291+
uint i = pt;
209292
assert(i <= Prim_MAX_ID);
210293
if (i == 0 or !pinName or !pinName[0] or i > Prim_MAX_ID)
211294
return false;
212295
const vector<string>& V = _id2outputs[i];
213296
return _vec_contains(V, pinName);
214297
}
215298

216-
bool pr_cpin_is_clock(Prim_t primId, CStr pinName) noexcept {
217-
uint i = primId;
299+
bool pr_cpin_is_clock(Prim_t pt, CStr pinName) noexcept {
300+
uint i = pt;
218301
assert(i <= Prim_MAX_ID);
219302
if (i == 0 or !pinName or !pinName[0] or i > Prim_MAX_ID)
220303
return false;
@@ -229,24 +312,42 @@ CStr pr_enum2str(Prim_t enu) noexcept {
229312
return _enumNames[i];
230313
}
231314

232-
uint pr_num_outputs(Prim_t primId) noexcept {
233-
uint i = primId;
315+
uint pr_num_outputs(Prim_t pt) noexcept {
316+
uint i = pt;
234317
assert(i <= Prim_MAX_ID);
235318
if (i == 0 or i > Prim_MAX_ID)
236319
return 0;
237320
const vector<string>& V = _id2outputs[i];
238321
return V.size();
239322
}
240323

241-
uint pr_num_clocks(Prim_t primId) noexcept {
242-
uint i = primId;
324+
uint pr_num_inputs(Prim_t pt) noexcept {
325+
uint i = pt;
326+
assert(i <= Prim_MAX_ID);
327+
if (i == 0 or i > Prim_MAX_ID)
328+
return 0;
329+
const vector<string>& V = _id2inputs[i];
330+
return V.size();
331+
}
332+
333+
uint pr_num_clocks(Prim_t pt) noexcept {
334+
uint i = pt;
243335
assert(i <= Prim_MAX_ID);
244336
if (i == 0 or i > Prim_MAX_ID)
245337
return 0;
246338
const vector<string>& V = _id2clocks[i];
247339
return V.size();
248340
}
249341

342+
void pr_get_inputs(Prim_t pt, std::vector<std::string>& INP) {
343+
INP.clear();
344+
uint i = pt;
345+
assert(i <= Prim_MAX_ID);
346+
if (i == 0 or i > Prim_MAX_ID)
347+
return;
348+
INP = _id2inputs[i];
349+
}
350+
250351
// "A_"
251352
static inline bool starts_w_A(CStr z) noexcept {
252353
assert(z);

planning/src/file_readers/pln_primitives.h

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,18 +66,21 @@ CStr pr_enum2str(Prim_t enu) noexcept;
6666
Prim_t pr_str2enum(CStr name) noexcept;
6767

6868

69-
bool pr_cpin_is_output(Prim_t primId, CStr pinName) noexcept;
70-
bool pr_cpin_is_clock(Prim_t primId, CStr pinName) noexcept;
69+
bool pr_cpin_is_output(Prim_t pt, CStr pinName) noexcept;
70+
bool pr_cpin_is_clock(Prim_t pt, CStr pinName) noexcept;
7171

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());
72+
inline bool pr_pin_is_output(Prim_t pt, const std::string& pinName) noexcept {
73+
return pr_cpin_is_output(pt, pinName.c_str());
7474
}
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());
75+
inline bool pr_pin_is_clock(Prim_t pt, const std::string& pinName) noexcept {
76+
return pr_cpin_is_clock(pt, pinName.c_str());
7777
}
7878

79-
uint pr_num_outputs(Prim_t primId) noexcept;
80-
uint pr_num_clocks(Prim_t primId) noexcept;
79+
uint pr_num_inputs(Prim_t pt) noexcept;
80+
uint pr_num_outputs(Prim_t pt) noexcept;
81+
uint pr_num_clocks(Prim_t pt) noexcept;
82+
83+
void pr_get_inputs(Prim_t pt, std::vector<std::string>& INP);
8184

8285
bool is_I_SERDES_output_term(const std::string& term) noexcept;
8386
bool is_O_SERDES_output_term(const std::string& term) noexcept;

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 = "pln0289";
1+
static const char* _pln_VERSION_STR = "pln0291";
22

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

0 commit comments

Comments
 (0)