systemverilog-plugin: use custom simplification step before yosys
Signed-off-by: Kamil Rakoczy <krakoczy@antmicro.com>
diff --git a/systemverilog-plugin/UhdmAst.cc b/systemverilog-plugin/UhdmAst.cc
index 2dc7f0c..d069d53 100644
--- a/systemverilog-plugin/UhdmAst.cc
+++ b/systemverilog-plugin/UhdmAst.cc
@@ -79,6 +79,8 @@
return id;
}
+static void simplify(AST::AstNode *current_node, AST::AstNode *parent_node);
+
static void sanitize_symbol_name(std::string &name)
{
if (!name.empty()) {
@@ -216,17 +218,21 @@
if (ranges[i]->children.size() == 1) {
ranges[i]->children.push_back(ranges[i]->children[0]->clone());
}
+ simplify(ranges[i], wire_node);
while (ranges[i]->simplify(true, false, false, 1, -1, false, false)) {
}
// this workaround case, where yosys doesn't follow id2ast and simplifies it to resolve constant
if (ranges[i]->children[0]->id2ast) {
+ simplify(ranges[i]->children[0]->id2ast, ranges[i]->children[0]);
while (ranges[i]->children[0]->id2ast->simplify(true, false, false, 1, -1, false, false)) {
}
}
if (ranges[i]->children[1]->id2ast) {
+ simplify(ranges[i]->children[1]->id2ast, ranges[i]->children[1]);
while (ranges[i]->children[1]->id2ast->simplify(true, false, false, 1, -1, false, false)) {
}
}
+ simplify(ranges[i], wire_node);
while (ranges[i]->simplify(true, false, false, 1, -1, false, false)) {
}
log_assert(ranges[i]->children[0]->type == AST::AST_CONSTANT);
@@ -1836,7 +1842,31 @@
});
}
// first apply custom simplification step if needed
- simplify(parameter, nullptr);
+ simplify(parameter, module_node);
+ // workaround for yosys sometimes not simplifying parameters children
+ // parameters can have 2 children:
+ // first child should be parameter value
+ // second child should be parameter range (optional)
+ log_assert(!parameter->children.empty());
+ simplify(parameter->children[0], parameter);
+ while (parameter->children[0]->simplify(true, false, false, 1, -1, false, false)) {
+ }
+ // follow id2ast as yosys doesn't do it by default
+ if (parameter->children[0]->id2ast) {
+ simplify(parameter->children[0]->id2ast, parameter);
+ while (parameter->children[0]->id2ast->simplify(true, false, false, 1, -1, false, false)) {
+ }
+ }
+ if (parameter->children.size() > 1) {
+ simplify(parameter->children[1], parameter);
+ while (parameter->children[1]->simplify(true, false, false, 1, -1, false, false)) {
+ }
+ if (parameter->children[1]->id2ast) {
+ simplify(parameter->children[1]->id2ast, parameter);
+ while (parameter->children[1]->id2ast->simplify(true, false, false, 1, -1, false, false)) {
+ }
+ }
+ }
// then simplify parameter to AST_CONSTANT or AST_REALVALUE
while (parameter->simplify(true, false, false, 1, -1, false, false)) {
}