Merge pull request #2112 from YosysHQ/claire/fix2040

Add latch detection for use_case_method in part-select write
This commit is contained in:
clairexen 2020-06-09 18:27:59 +02:00 committed by GitHub
commit 5c426d2bff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 58 additions and 0 deletions

View File

@ -257,6 +257,7 @@ namespace AST
bool mem2reg_check(pool<AstNode*> &mem2reg_set);
void mem2reg_remove(pool<AstNode*> &mem2reg_set, vector<AstNode*> &delnodes);
void meminfo(int &mem_width, int &mem_size, int &addr_bits);
bool detect_latch(const std::string &var);
// additional functionality for evaluating constant functions
struct varinfo_t { RTLIL::Const val; int offset; bool is_signed; };

View File

@ -2136,6 +2136,9 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
use_case_method = true;
}
if (!use_case_method && current_always->detect_latch(children[0]->str))
use_case_method = true;
if (use_case_method)
{
// big case block
@ -4204,6 +4207,60 @@ void AstNode::meminfo(int &mem_width, int &mem_size, int &addr_bits)
addr_bits++;
}
bool AstNode::detect_latch(const std::string &var)
{
switch (type)
{
case AST_ALWAYS:
for (auto &c : children)
{
switch (c->type)
{
case AST_POSEDGE:
case AST_NEGEDGE:
return false;
case AST_BLOCK:
if (!c->detect_latch(var))
return false;
break;
default:
log_abort();
}
}
return true;
case AST_BLOCK:
for (auto &c : children)
if (!c->detect_latch(var))
return false;
return true;
case AST_CASE:
{
bool r = true;
for (auto &c : children) {
if (c->type == AST_COND) {
if (c->children.at(1)->detect_latch(var))
return true;
r = false;
}
if (c->type == AST_DEFAULT) {
if (c->children.at(0)->detect_latch(var))
return true;
r = false;
}
}
return r;
}
case AST_ASSIGN_EQ:
case AST_ASSIGN_LE:
if (children.at(0)->type == AST_IDENTIFIER &&
children.at(0)->children.empty() && children.at(0)->str == var)
return false;
return true;
default:
return true;
}
}
bool AstNode::has_const_only_constructs(bool &recommend_const_eval)
{
if (type == AST_FOR)