mirror of https://github.com/YosysHQ/yosys.git
AST simplifier: optimize constant AST_CASE nodes before recursively descending
This commit is contained in:
parent
f9c096eeda
commit
37aa2e02db
|
@ -384,6 +384,41 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (const_fold && type == AST_CASE)
|
||||||
|
{
|
||||||
|
while (children[0]->simplify(const_fold, at_zero, in_lvalue, stage, width_hint, sign_hint, in_param)) { }
|
||||||
|
if (children[0]->type == AST_CONSTANT && children[0]->bits_only_01()) {
|
||||||
|
std::vector<AstNode*> new_children;
|
||||||
|
new_children.push_back(children[0]);
|
||||||
|
for (int i = 1; i < GetSize(children); i++) {
|
||||||
|
AstNode *child = children[i];
|
||||||
|
log_assert(child->type == AST_COND);
|
||||||
|
for (auto v : child->children) {
|
||||||
|
if (v->type == AST_DEFAULT)
|
||||||
|
goto keep_const_cond;
|
||||||
|
if (v->type == AST_BLOCK)
|
||||||
|
continue;
|
||||||
|
while (v->simplify(const_fold, at_zero, in_lvalue, stage, width_hint, sign_hint, in_param)) { }
|
||||||
|
if (v->type == AST_CONSTANT && v->bits_only_01()) {
|
||||||
|
if (v->bits == children[0]->bits) {
|
||||||
|
while (i+1 < GetSize(children))
|
||||||
|
delete children[++i];
|
||||||
|
goto keep_const_cond;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
goto keep_const_cond;
|
||||||
|
}
|
||||||
|
if (0)
|
||||||
|
keep_const_cond:
|
||||||
|
new_children.push_back(child);
|
||||||
|
else
|
||||||
|
delete child;
|
||||||
|
}
|
||||||
|
new_children.swap(children);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// simplify all children first
|
// simplify all children first
|
||||||
// (iterate by index as e.g. auto wires can add new children in the process)
|
// (iterate by index as e.g. auto wires can add new children in the process)
|
||||||
for (size_t i = 0; i < children.size(); i++) {
|
for (size_t i = 0; i < children.size(); i++) {
|
||||||
|
@ -1883,37 +1918,6 @@ skip_dynamic_range_lvalue_expansion:;
|
||||||
newNode->realvalue = -children[0]->asReal(sign_hint);
|
newNode->realvalue = -children[0]->asReal(sign_hint);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case AST_CASE:
|
|
||||||
if (children[0]->type == AST_CONSTANT && children[0]->bits_only_01()) {
|
|
||||||
std::vector<AstNode*> new_children;
|
|
||||||
new_children.push_back(children[0]);
|
|
||||||
for (int i = 1; i < GetSize(children); i++) {
|
|
||||||
AstNode *child = children[i];
|
|
||||||
log_assert(child->type == AST_COND);
|
|
||||||
for (auto v : child->children) {
|
|
||||||
if (v->type == AST_DEFAULT)
|
|
||||||
goto keep_const_cond;
|
|
||||||
if (v->type == AST_BLOCK)
|
|
||||||
continue;
|
|
||||||
if (v->type == AST_CONSTANT && v->bits_only_01()) {
|
|
||||||
if (v->bits == children[0]->bits) {
|
|
||||||
while (i+1 < GetSize(children))
|
|
||||||
delete children[++i];
|
|
||||||
goto keep_const_cond;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
goto keep_const_cond;
|
|
||||||
}
|
|
||||||
if (0)
|
|
||||||
keep_const_cond:
|
|
||||||
new_children.push_back(child);
|
|
||||||
else
|
|
||||||
delete child;
|
|
||||||
}
|
|
||||||
new_children.swap(children);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case AST_TERNARY:
|
case AST_TERNARY:
|
||||||
if (children[0]->isConst())
|
if (children[0]->isConst())
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue