diff options
author | Claire Wolf <claire@symbioticeda.com> | 2020-04-29 14:28:04 +0200 |
---|---|---|
committer | Claire Wolf <claire@symbioticeda.com> | 2020-05-02 11:21:01 +0200 |
commit | 589ed2d97032829568e73a5858772e39088aeeeb (patch) | |
tree | ff318592efab768ecb4f57e493cb8a260641c298 /frontends/ast/simplify.cc | |
parent | bbbce0d1c58f8bfb0a615f1ed53fa046552b5adf (diff) | |
download | yosys-589ed2d97032829568e73a5858772e39088aeeeb.tar.gz yosys-589ed2d97032829568e73a5858772e39088aeeeb.tar.bz2 yosys-589ed2d97032829568e73a5858772e39088aeeeb.zip |
Add AST_SELFSZ and improve handling of bit slices
Signed-off-by: Claire Wolf <claire@symbioticeda.com>
Diffstat (limited to 'frontends/ast/simplify.cc')
-rw-r--r-- | frontends/ast/simplify.cc | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc index af347b8f1..af5e14217 100644 --- a/frontends/ast/simplify.cc +++ b/frontends/ast/simplify.cc @@ -608,6 +608,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, case AST_TO_BITS: case AST_TO_SIGNED: case AST_TO_UNSIGNED: + case AST_SELFSZ: case AST_CONCAT: case AST_REPLICATE: case AST_REDUCE_AND: @@ -1855,8 +1856,12 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, AstNode *shamt = shift_expr; + int shamt_width_hint = 0; + bool shamt_sign_hint = true; + shamt->detectSignWidth(shamt_width_hint, shamt_sign_hint); + int start_bit = children[0]->id2ast->range_right; - bool use_shift = shamt->is_signed; + bool use_shift = shamt_sign_hint; if (start_bit != 0) { shamt = new AstNode(AST_SUB, shamt, mkconst_int(start_bit, true)); @@ -3060,6 +3065,7 @@ replace_fcall_later:; } } break; + if (0) { case AST_SELFSZ: const_func = RTLIL::const_pos; } if (0) { case AST_POS: const_func = RTLIL::const_pos; } if (0) { case AST_NEG: const_func = RTLIL::const_neg; } if (children[0]->type == AST_CONSTANT) { @@ -3068,10 +3074,10 @@ replace_fcall_later:; } else if (children[0]->isConst()) { newNode = new AstNode(AST_REALVALUE); - if (type == AST_POS) - newNode->realvalue = +children[0]->asReal(sign_hint); - else + if (type == AST_NEG) newNode->realvalue = -children[0]->asReal(sign_hint); + else + newNode->realvalue = +children[0]->asReal(sign_hint); } break; case AST_TERNARY: |