mirror of https://github.com/YosysHQ/yosys.git
Fixed remaining cases where we check fo wire reg/wire incorrect assignments
on Yosys-generated assignments. In this case, offending code was: module top(input in, output out); function func; input arg; func = arg; endfunction assign out = func(in); endmodule
This commit is contained in:
parent
73d426bc87
commit
f6fe73b31f
|
@ -1337,6 +1337,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
|
||||||
str.clear();
|
str.clear();
|
||||||
type = AST_ASSIGN;
|
type = AST_ASSIGN;
|
||||||
children.push_back(children_list.at(0));
|
children.push_back(children_list.at(0));
|
||||||
|
children.back()->was_checked = true;
|
||||||
children.push_back(node);
|
children.push_back(node);
|
||||||
did_something = true;
|
did_something = true;
|
||||||
}
|
}
|
||||||
|
@ -1373,6 +1374,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
|
||||||
str.clear();
|
str.clear();
|
||||||
type = AST_ASSIGN;
|
type = AST_ASSIGN;
|
||||||
children.push_back(children_list[0]);
|
children.push_back(children_list[0]);
|
||||||
|
children.back()->was_checked = true;
|
||||||
children.push_back(node);
|
children.push_back(node);
|
||||||
did_something = true;
|
did_something = true;
|
||||||
}
|
}
|
||||||
|
@ -1531,6 +1533,7 @@ skip_dynamic_range_lvalue_expansion:;
|
||||||
wire_tmp_id->str = wire_tmp->str;
|
wire_tmp_id->str = wire_tmp->str;
|
||||||
|
|
||||||
newNode->children.push_back(new AstNode(AST_ASSIGN_EQ, wire_tmp_id, children[1]->clone()));
|
newNode->children.push_back(new AstNode(AST_ASSIGN_EQ, wire_tmp_id, children[1]->clone()));
|
||||||
|
newNode->children.back()->was_checked = true;
|
||||||
|
|
||||||
int cursor = 0;
|
int cursor = 0;
|
||||||
for (auto child : children[0]->children)
|
for (auto child : children[0]->children)
|
||||||
|
@ -1816,6 +1819,7 @@ skip_dynamic_range_lvalue_expansion:;
|
||||||
AstNode *regid = new AstNode(AST_IDENTIFIER);
|
AstNode *regid = new AstNode(AST_IDENTIFIER);
|
||||||
regid->str = reg->str;
|
regid->str = reg->str;
|
||||||
regid->id2ast = reg;
|
regid->id2ast = reg;
|
||||||
|
regid->was_checked = true;
|
||||||
|
|
||||||
AstNode *rhs = nullptr;
|
AstNode *rhs = nullptr;
|
||||||
|
|
||||||
|
@ -2202,6 +2206,8 @@ skip_dynamic_range_lvalue_expansion:;
|
||||||
|
|
||||||
AstNode *always = new AstNode(AST_ALWAYS, new AstNode(AST_BLOCK,
|
AstNode *always = new AstNode(AST_ALWAYS, new AstNode(AST_BLOCK,
|
||||||
new AstNode(AST_ASSIGN_EQ, lvalue, clone())));
|
new AstNode(AST_ASSIGN_EQ, lvalue, clone())));
|
||||||
|
always->children[0]->children[0]->was_checked = true;
|
||||||
|
|
||||||
current_ast_mod->children.push_back(always);
|
current_ast_mod->children.push_back(always);
|
||||||
|
|
||||||
goto replace_fcall_with_id;
|
goto replace_fcall_with_id;
|
||||||
|
@ -2251,6 +2257,7 @@ skip_dynamic_range_lvalue_expansion:;
|
||||||
AstNode *assign = child->is_input ?
|
AstNode *assign = child->is_input ?
|
||||||
new AstNode(AST_ASSIGN_EQ, wire_id->clone(), arg) :
|
new AstNode(AST_ASSIGN_EQ, wire_id->clone(), arg) :
|
||||||
new AstNode(AST_ASSIGN_EQ, arg, wire_id->clone());
|
new AstNode(AST_ASSIGN_EQ, arg, wire_id->clone());
|
||||||
|
assign->children[0]->was_checked = true;
|
||||||
|
|
||||||
for (auto it = current_block->children.begin(); it != current_block->children.end(); it++) {
|
for (auto it = current_block->children.begin(); it != current_block->children.end(); it++) {
|
||||||
if (*it != current_block_child)
|
if (*it != current_block_child)
|
||||||
|
@ -2321,6 +2328,7 @@ skip_dynamic_range_lvalue_expansion:;
|
||||||
AstNode *assign = child->is_input ?
|
AstNode *assign = child->is_input ?
|
||||||
new AstNode(AST_ASSIGN_EQ, wire_id, arg) :
|
new AstNode(AST_ASSIGN_EQ, wire_id, arg) :
|
||||||
new AstNode(AST_ASSIGN_EQ, arg, wire_id);
|
new AstNode(AST_ASSIGN_EQ, arg, wire_id);
|
||||||
|
assign->children[0]->was_checked = true;
|
||||||
|
|
||||||
for (auto it = current_block->children.begin(); it != current_block->children.end(); it++) {
|
for (auto it = current_block->children.begin(); it != current_block->children.end(); it++) {
|
||||||
if (*it != current_block_child)
|
if (*it != current_block_child)
|
||||||
|
@ -2760,6 +2768,7 @@ AstNode *AstNode::readmem(bool is_readmemh, std::string mem_filename, AstNode *m
|
||||||
block->children.push_back(new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER, new AstNode(AST_RANGE, AstNode::mkconst_int(cursor, false))), value));
|
block->children.push_back(new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER, new AstNode(AST_RANGE, AstNode::mkconst_int(cursor, false))), value));
|
||||||
block->children.back()->children[0]->str = memory->str;
|
block->children.back()->children[0]->str = memory->str;
|
||||||
block->children.back()->children[0]->id2ast = memory;
|
block->children.back()->children[0]->id2ast = memory;
|
||||||
|
block->children.back()->children[0]->was_checked = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
cursor += increment;
|
cursor += increment;
|
||||||
|
@ -3021,6 +3030,7 @@ bool AstNode::mem2reg_as_needed_pass2(pool<AstNode*> &mem2reg_set, AstNode *mod,
|
||||||
AstNode *newNode = clone();
|
AstNode *newNode = clone();
|
||||||
newNode->type = AST_ASSIGN_EQ;
|
newNode->type = AST_ASSIGN_EQ;
|
||||||
async_block->children[0]->children.push_back(newNode);
|
async_block->children[0]->children.push_back(newNode);
|
||||||
|
async_block->children[0]->children.back()->children[0]->was_checked = true;
|
||||||
|
|
||||||
newNode = new AstNode(AST_NONE);
|
newNode = new AstNode(AST_NONE);
|
||||||
newNode->cloneInto(this);
|
newNode->cloneInto(this);
|
||||||
|
@ -3065,6 +3075,7 @@ bool AstNode::mem2reg_as_needed_pass2(pool<AstNode*> &mem2reg_set, AstNode *mod,
|
||||||
|
|
||||||
AstNode *assign_addr = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER), children[0]->children[0]->children[0]->clone());
|
AstNode *assign_addr = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER), children[0]->children[0]->children[0]->clone());
|
||||||
assign_addr->children[0]->str = id_addr;
|
assign_addr->children[0]->str = id_addr;
|
||||||
|
assign_addr->children[0]->str = was_checked;
|
||||||
block->children.insert(block->children.begin()+assign_idx+1, assign_addr);
|
block->children.insert(block->children.begin()+assign_idx+1, assign_addr);
|
||||||
|
|
||||||
AstNode *case_node = new AstNode(AST_CASE, new AstNode(AST_IDENTIFIER));
|
AstNode *case_node = new AstNode(AST_CASE, new AstNode(AST_IDENTIFIER));
|
||||||
|
@ -3088,6 +3099,7 @@ bool AstNode::mem2reg_as_needed_pass2(pool<AstNode*> &mem2reg_set, AstNode *mod,
|
||||||
children[0]->id2ast = NULL;
|
children[0]->id2ast = NULL;
|
||||||
children[0]->str = id_data;
|
children[0]->str = id_data;
|
||||||
type = AST_ASSIGN_EQ;
|
type = AST_ASSIGN_EQ;
|
||||||
|
children[0]->was_checked = true;
|
||||||
|
|
||||||
did_something = true;
|
did_something = true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue