From e1fb12a4b9e1d0685a1a1b060f2887f79b3c297f Mon Sep 17 00:00:00 2001 From: Claire Wolf Date: Wed, 15 Apr 2020 20:36:40 +0200 Subject: Add LookaheadRewriter for proper bitselwrite support Signed-off-by: Claire Wolf --- frontends/ast/simplify.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'frontends/ast/simplify.cc') diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc index e181af140..18ad6926f 100644 --- a/frontends/ast/simplify.cc +++ b/frontends/ast/simplify.cc @@ -1797,19 +1797,25 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, AstNode *ref_mask = new AstNode(AST_IDENTIFIER); ref_mask->str = wire_mask->str; + ref_mask->id2ast = wire_mask; ref_mask->was_checked = true; AstNode *ref_data = new AstNode(AST_IDENTIFIER); ref_data->str = wire_data->str; + ref_data->id2ast = wire_data; ref_data->was_checked = true; + AstNode *old_data = lvalue->clone(); + if (type == AST_ASSIGN_LE) + old_data->lookahead = true; + AstNode *shamt = shift_expr; newNode->children.push_back(new AstNode(AST_ASSIGN_EQ, ref_mask->clone(), new AstNode(AST_SHIFT_LEFT, mkconst_bits(std::vector(result_width, State::S1), false), shamt->clone()))); newNode->children.push_back(new AstNode(AST_ASSIGN_EQ, ref_data->clone(), new AstNode(AST_SHIFT_LEFT, new AstNode(AST_BIT_AND, mkconst_bits(std::vector(result_width, State::S1), false), children[1]->clone()), shamt))); - newNode->children.push_back(new AstNode(type, lvalue, new AstNode(AST_BIT_OR, new AstNode(AST_BIT_AND, lvalue->clone(), new AstNode(AST_BIT_NOT, ref_mask)), ref_data))); + newNode->children.push_back(new AstNode(type, lvalue, new AstNode(AST_BIT_OR, new AstNode(AST_BIT_AND, old_data, new AstNode(AST_BIT_NOT, ref_mask)), ref_data))); } goto apply_newNode; -- cgit v1.2.3