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)) {
     }