Fixes and improvements in AST const folding
authorClifford Wolf <clifford@clifford.at>
Mon, 10 Jun 2013 11:56:03 +0000 (13:56 +0200)
committerClifford Wolf <clifford@clifford.at>
Mon, 10 Jun 2013 11:56:03 +0000 (13:56 +0200)
frontends/ast/genrtlil.cc
frontends/ast/simplify.cc

index 1fb762fc1b31ff29c550c2f2069cbf941f1f3d17..c75bca911a356a84bf75ce99c6d71a81f64c807b 100644 (file)
@@ -647,7 +647,7 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint)
                                current_module->wires[str] = wire;
                        }
                        else if (id2ast->type == AST_PARAMETER || id2ast->type == AST_LOCALPARAM) {
-                               chunk = RTLIL::Const(id2ast->bits);
+                               chunk = RTLIL::Const(id2ast->children[0]->bits);
                                goto use_const_chunk;
                        }
                        else if (!id2ast || (id2ast->type != AST_WIRE && id2ast->type != AST_AUTOWIRE &&
index 9035d547875148e3d5a020b5306654c29f98398c..bc135b39dccc617f3d508b4c211b6c4a5e1caef2 100644 (file)
@@ -749,6 +749,7 @@ skip_dynamic_range_lvalue_expansion:;
        // perform const folding when activated
        if (const_fold && newNode == NULL)
        {
+               std::vector<RTLIL::State> tmp_bits;
                RTLIL::Const (*const_func)(const RTLIL::Const&, const RTLIL::Const&, bool, bool, int);
                RTLIL::Const dummy_arg;
 
@@ -864,7 +865,16 @@ skip_dynamic_range_lvalue_expansion:;
                                        newNode = children[2]->clone();
                        }
                        break;
+               case AST_CONCAT:
+                       for (auto it = children.begin(); it != children.end(); it++) {
+                               if ((*it)->type != AST_CONSTANT)
+                                       goto not_const;
+                               tmp_bits.insert(tmp_bits.end(), (*it)->bits.begin(), (*it)->bits.end());
+                       }
+                       newNode = mkconst_bits(tmp_bits, is_signed);
+                       break;
                default:
+               not_const:
                        break;
                }
        }