Merge pull request #1943 from YosysHQ/dave/fix-1919

ast: Fix handling of identifiers in the global scope
This commit is contained in:
David Shah 2020-04-16 13:48:20 +01:00 committed by GitHub
commit 2b57c06360
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 2 deletions

View File

@ -1153,6 +1153,7 @@ void AST::process(RTLIL::Design *design, AstNode *ast, bool dump_ast1, bool dump
bool nolatches, bool nomeminit, bool nomem2reg, bool mem2reg, bool noblackbox, bool lib, bool nowb, bool noopt, bool icells, bool pwires, bool nooverwrite, bool overwrite, bool defer, bool autowire) bool nolatches, bool nomeminit, bool nomem2reg, bool mem2reg, bool noblackbox, bool lib, bool nowb, bool noopt, bool icells, bool pwires, bool nooverwrite, bool overwrite, bool defer, bool autowire)
{ {
current_ast = ast; current_ast = ast;
current_ast_mod = nullptr;
flag_dump_ast1 = dump_ast1; flag_dump_ast1 = dump_ast1;
flag_dump_ast2 = dump_ast2; flag_dump_ast2 = dump_ast2;
flag_no_dump_ptr = no_dump_ptr; flag_no_dump_ptr = no_dump_ptr;
@ -1219,6 +1220,7 @@ void AST::process(RTLIL::Design *design, AstNode *ast, bool dump_ast1, bool dump
} }
design->add(process_module(*it, defer)); design->add(process_module(*it, defer));
current_ast_mod = nullptr;
} }
else if ((*it)->type == AST_PACKAGE) { else if ((*it)->type == AST_PACKAGE) {
// process enum/other declarations // process enum/other declarations

View File

@ -1169,7 +1169,8 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
// annotate identifiers using scope resolution and create auto-wires as needed // annotate identifiers using scope resolution and create auto-wires as needed
if (type == AST_IDENTIFIER) { if (type == AST_IDENTIFIER) {
if (current_scope.count(str) == 0) { if (current_scope.count(str) == 0) {
for (auto node : current_ast_mod->children) { AstNode *current_scope_ast = (current_ast_mod == nullptr) ? current_ast : current_ast_mod;
for (auto node : current_scope_ast->children) {
//log("looking at mod scope child %s\n", type2str(node->type).c_str()); //log("looking at mod scope child %s\n", type2str(node->type).c_str());
switch (node->type) { switch (node->type) {
case AST_PARAMETER: case AST_PARAMETER:
@ -1203,7 +1204,9 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
} }
} }
if (current_scope.count(str) == 0) { if (current_scope.count(str) == 0) {
if (flag_autowire || str == "\\$global_clock") { if (current_ast_mod == nullptr) {
log_file_error(filename, location.first_line, "Identifier `%s' is implicitly declared outside of a module.\n", str.c_str());
} else if (flag_autowire || str == "\\$global_clock") {
AstNode *auto_wire = new AstNode(AST_AUTOWIRE); AstNode *auto_wire = new AstNode(AST_AUTOWIRE);
auto_wire->str = str; auto_wire->str = str;
current_ast_mod->children.push_back(auto_wire); current_ast_mod->children.push_back(auto_wire);

View File

@ -0,0 +1,18 @@
read_verilog -sv <<EOT
parameter A = 10;
parameter B = A;
typedef enum {
CONST_A = A,
CONST_B = A+1
} enum_t;
module top(output [3:0] q, output [3:0] r);
assign q = 10;
assign r = CONST_B;
endmodule
EOT
hierarchy -top top
sat -verify -prove q 10 top
sat -verify -prove r 11 top