mirror of
https://github.com/YosysHQ/yosys
synced 2026-07-25 00:22:34 +00:00
check make always_latch exempt.
This commit is contained in:
parent
0e82bbefe5
commit
391c0e5f89
8 changed files with 26 additions and 10 deletions
|
|
@ -63,7 +63,8 @@ struct CheckPass : public Pass {
|
|||
log(" -nolatches\n");
|
||||
log(" also check for latch cells ($dlatch, $adlatch, $dlatchsr and their\n");
|
||||
log(" $_DLATCH_*/$_DLATCHSR_* mappings) remaining in the design. Use this\n");
|
||||
log(" before techmapping in flows that must not emit latches.\n");
|
||||
log(" before techmapping in flows that must not emit latches. Cells marked\n");
|
||||
log(" with the 'always_latch' attribute are not reported.\n");
|
||||
log("\n");
|
||||
log(" -latchonly\n");
|
||||
log(" check only for latch cells (as listed under -nolatches), skipping all\n");
|
||||
|
|
@ -142,10 +143,10 @@ struct CheckPass : public Pass {
|
|||
// latch-only mode only flags latches, skipping the (potentially false-positive mid-flow) undriven/driver/loop checks below
|
||||
if (latchonly) {
|
||||
for (auto cell : module->cells())
|
||||
if (
|
||||
if ((
|
||||
cell->type.in(ID($dlatch), ID($adlatch), ID($dlatchsr)) ||
|
||||
cell->type.begins_with("$_DLATCH_") || cell->type.begins_with("$_DLATCHSR_")
|
||||
) {
|
||||
) && !cell->get_bool_attribute(ID::always_latch)) {
|
||||
log_warning("Cell %s.%s is a latch of type %s.\n", module, cell, cell->type.unescape());
|
||||
counter++;
|
||||
}
|
||||
|
|
@ -300,7 +301,8 @@ struct CheckPass : public Pass {
|
|||
if (
|
||||
nolatches && (
|
||||
cell->type.in(ID($dlatch), ID($adlatch), ID($dlatchsr)) ||
|
||||
cell->type.begins_with("$_DLATCH_") || cell->type.begins_with("$_DLATCHSR_"))
|
||||
cell->type.begins_with("$_DLATCH_") || cell->type.begins_with("$_DLATCHSR_")) &&
|
||||
!cell->get_bool_attribute(ID::always_latch)
|
||||
) {
|
||||
log_warning("Cell %s.%s is a latch of type %s.\n", module, cell, cell->type.unescape());
|
||||
counter++;
|
||||
|
|
|
|||
|
|
@ -546,11 +546,16 @@ void proc_dlatch(proc_dlatch_db_t &db, RTLIL::Process *proc, LatchPolicy policy)
|
|||
else
|
||||
cell = db.module->addDlatch(NEW_ID, en, rhs, lhs);
|
||||
cell->set_src_attribute(src);
|
||||
if (proc->get_bool_attribute(ID::always_latch))
|
||||
cell->set_bool_attribute(ID::always_latch);
|
||||
db.generated_dlatches.insert(cell);
|
||||
|
||||
if (proc->get_bool_attribute(ID::always_comb))
|
||||
log_error("Latch inferred for signal `%s.%s' from always_comb process `%s.%s'.\n",
|
||||
db.module->name.c_str(), log_signal(lhs), db.module->name.c_str(), proc->name.c_str());
|
||||
else if (proc->get_bool_attribute(ID::always_latch))
|
||||
log("Latch inferred for signal `%s.%s' from always_latch process `%s.%s': %s\n",
|
||||
db.module->name.c_str(), log_signal(lhs), db.module->name.c_str(), proc->name.c_str(), cell);
|
||||
else if (policy == POLICY_ERROR)
|
||||
log_error("Latch inferred for signal `%s.%s' from process `%s.%s': %s\n",
|
||||
db.module->name.c_str(), log_signal(lhs), db.module->name.c_str(), proc->name.c_str(), cell);
|
||||
|
|
@ -580,6 +585,9 @@ struct ProcDlatchPass : public Pass {
|
|||
log(" -latches <info|warn|error>\n");
|
||||
log(" controls how the inference of a latch is reported. Alternatively, one\n");
|
||||
log(" can use the 'proc.latches' scratchpad variable. Defaults to 'warn'.\n");
|
||||
log(" Latches requested explicitly with 'always_latch' processes are exempt\n");
|
||||
log(" from this policy and always reported at info level. The generated\n");
|
||||
log(" latch cells carry the 'always_latch' attribute.\n");
|
||||
log("\n");
|
||||
}
|
||||
void execute(std::vector<std::string> args, RTLIL::Design *design) override
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue