mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	Merge pull request #1077 from YosysHQ/clifford/pr983
elaboration system tasks
This commit is contained in:
		
						commit
						6d49145497
					
				
					 9 changed files with 93 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -154,6 +154,7 @@ std::string AST::type2str(AstNodeType type)
 | 
			
		|||
	X(AST_GENIF)
 | 
			
		||||
	X(AST_GENCASE)
 | 
			
		||||
	X(AST_GENBLOCK)
 | 
			
		||||
	X(AST_TECALL)
 | 
			
		||||
	X(AST_POSEDGE)
 | 
			
		||||
	X(AST_NEGEDGE)
 | 
			
		||||
	X(AST_EDGE)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -137,7 +137,8 @@ namespace AST
 | 
			
		|||
		AST_GENIF,
 | 
			
		||||
		AST_GENCASE,
 | 
			
		||||
		AST_GENBLOCK,
 | 
			
		||||
 | 
			
		||||
		AST_TECALL,
 | 
			
		||||
		
 | 
			
		||||
		AST_POSEDGE,
 | 
			
		||||
		AST_NEGEDGE,
 | 
			
		||||
		AST_EDGE,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1575,6 +1575,37 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)
 | 
			
		|||
			delete always;
 | 
			
		||||
		} break;
 | 
			
		||||
 | 
			
		||||
	case AST_TECALL: {
 | 
			
		||||
			int sz = children.size();
 | 
			
		||||
			if (str == "$info") {
 | 
			
		||||
				if (sz > 0)
 | 
			
		||||
					log_file_info(filename, linenum, "%s.\n", children[0]->str.c_str());
 | 
			
		||||
				else
 | 
			
		||||
					log_file_info(filename, linenum, "\n");
 | 
			
		||||
			} else if (str == "$warning") {
 | 
			
		||||
				if (sz > 0)
 | 
			
		||||
					log_file_warning(filename, linenum, "%s.\n", children[0]->str.c_str());
 | 
			
		||||
				else
 | 
			
		||||
					log_file_warning(filename, linenum, "\n");
 | 
			
		||||
			} else if (str == "$error") {
 | 
			
		||||
				if (sz > 0)
 | 
			
		||||
					log_file_error(filename, linenum, "%s.\n", children[0]->str.c_str());
 | 
			
		||||
				else
 | 
			
		||||
					log_file_error(filename, linenum, "\n");
 | 
			
		||||
			} else if (str == "$fatal") {
 | 
			
		||||
				// TODO: 1st parameter, if exists, is 0,1 or 2, and passed to $finish()
 | 
			
		||||
				// if no parameter is given, default value is 1
 | 
			
		||||
				// dollar_finish(sz ? children[0] : 1);
 | 
			
		||||
				// perhaps create & use log_file_fatal()
 | 
			
		||||
				if (sz > 0)
 | 
			
		||||
					log_file_error(filename, linenum, "FATAL: %s.\n", children[0]->str.c_str());
 | 
			
		||||
				else
 | 
			
		||||
					log_file_error(filename, linenum, "FATAL.\n");
 | 
			
		||||
			} else {
 | 
			
		||||
				log_file_error(filename, linenum, "Unknown elabortoon system task '%s'.\n", str.c_str());
 | 
			
		||||
			}
 | 
			
		||||
		} break;
 | 
			
		||||
 | 
			
		||||
	case AST_FCALL: {
 | 
			
		||||
			if (str == "\\$anyconst" || str == "\\$anyseq" || str == "\\$allconst" || str == "\\$allseq")
 | 
			
		||||
			{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -311,6 +311,11 @@ supply1 { return TOK_SUPPLY1; }
 | 
			
		|||
	return TOK_ID;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
"$"(info|warning|error|fatal) {
 | 
			
		||||
	frontend_verilog_yylval.string = new std::string(yytext);
 | 
			
		||||
	return TOK_ELAB_TASK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
"$signed"   { return TOK_TO_SIGNED; }
 | 
			
		||||
"$unsigned" { return TOK_TO_UNSIGNED; }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -133,7 +133,7 @@ struct specify_rise_fall {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
%token <string> TOK_STRING TOK_ID TOK_CONSTVAL TOK_REALVAL TOK_PRIMITIVE
 | 
			
		||||
%token <string> TOK_SVA_LABEL TOK_SPECIFY_OPER
 | 
			
		||||
%token <string> TOK_SVA_LABEL TOK_SPECIFY_OPER TOK_ELAB_TASK
 | 
			
		||||
%token TOK_ASSERT TOK_ASSUME TOK_RESTRICT TOK_COVER TOK_FINAL
 | 
			
		||||
%token ATTR_BEGIN ATTR_END DEFATTR_BEGIN DEFATTR_END
 | 
			
		||||
%token TOK_MODULE TOK_ENDMODULE TOK_PARAMETER TOK_LOCALPARAM TOK_DEFPARAM
 | 
			
		||||
| 
						 | 
				
			
			@ -2176,6 +2176,15 @@ gen_stmt:
 | 
			
		|||
		if ($6 != NULL)
 | 
			
		||||
			delete $6;
 | 
			
		||||
		ast_stack.pop_back();
 | 
			
		||||
	} |
 | 
			
		||||
	TOK_ELAB_TASK {
 | 
			
		||||
		AstNode *node = new AstNode(AST_TECALL);
 | 
			
		||||
		node->str = *$1;
 | 
			
		||||
		delete $1;
 | 
			
		||||
		ast_stack.back()->children.push_back(node);
 | 
			
		||||
		ast_stack.push_back(node);
 | 
			
		||||
	} opt_arg_list ';'{
 | 
			
		||||
		ast_stack.pop_back();		
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
gen_stmt_block:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -277,11 +277,22 @@ void log_file_warning(const std::string &filename, int lineno,
 | 
			
		|||
	va_list ap;
 | 
			
		||||
	va_start(ap, format);
 | 
			
		||||
	std::string prefix = stringf("%s:%d: Warning: ",
 | 
			
		||||
				     filename.c_str(), lineno);
 | 
			
		||||
			filename.c_str(), lineno);
 | 
			
		||||
	logv_warning_with_prefix(prefix.c_str(), format, ap);
 | 
			
		||||
	va_end(ap);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void log_file_info(const std::string &filename, int lineno,
 | 
			
		||||
                      const char *format, ...)
 | 
			
		||||
{
 | 
			
		||||
	va_list ap;
 | 
			
		||||
	va_start(ap, format);
 | 
			
		||||
	std::string fmt = stringf("%s:%d: Info: %s",
 | 
			
		||||
			filename.c_str(), lineno, format);
 | 
			
		||||
	logv(fmt.c_str(), ap);
 | 
			
		||||
	va_end(ap);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
YS_ATTRIBUTE(noreturn)
 | 
			
		||||
static void logv_error_with_prefix(const char *prefix,
 | 
			
		||||
                                   const char *format, va_list ap)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -80,6 +80,7 @@ void log_warning(const char *format, ...) YS_ATTRIBUTE(format(printf, 1, 2));
 | 
			
		|||
 | 
			
		||||
// Log with filename to report a problem in a source file.
 | 
			
		||||
void log_file_warning(const std::string &filename, int lineno, const char *format, ...) YS_ATTRIBUTE(format(printf, 3, 4));
 | 
			
		||||
void log_file_info(const std::string &filename, int lineno, const char *format, ...) YS_ATTRIBUTE(format(printf, 3, 4));
 | 
			
		||||
 | 
			
		||||
void log_warning_noprefix(const char *format, ...) YS_ATTRIBUTE(format(printf, 1, 2));
 | 
			
		||||
YS_NORETURN void log_error(const char *format, ...) YS_ATTRIBUTE(format(printf, 1, 2), noreturn);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										30
									
								
								tests/various/elab_sys_tasks.sv
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								tests/various/elab_sys_tasks.sv
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
module test;
 | 
			
		||||
localparam X=1;
 | 
			
		||||
genvar i;
 | 
			
		||||
generate
 | 
			
		||||
if (X == 1)
 | 
			
		||||
  $info("X is 1");
 | 
			
		||||
if (X == 1)
 | 
			
		||||
  $warning("X is 1");
 | 
			
		||||
else
 | 
			
		||||
  $error("X is not 1");
 | 
			
		||||
case (X)
 | 
			
		||||
  1: $info("X is 1 in a case statement");
 | 
			
		||||
endcase
 | 
			
		||||
//case (X-1)
 | 
			
		||||
//  1: $warn("X is 2");
 | 
			
		||||
//  default: $warn("X might be anything in a case statement");
 | 
			
		||||
//endcase
 | 
			
		||||
for (i = 0; i < 3; i = i + 1)
 | 
			
		||||
begin
 | 
			
		||||
  case(i)
 | 
			
		||||
    0: $info;
 | 
			
		||||
    1: $warning;
 | 
			
		||||
    default: $info("default case statemnent");
 | 
			
		||||
  endcase
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
$info("This is a standalone $info(). Next $info has no parameters");
 | 
			
		||||
$info;
 | 
			
		||||
endgenerate
 | 
			
		||||
endmodule
 | 
			
		||||
							
								
								
									
										1
									
								
								tests/various/elab_sys_tasks.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								tests/various/elab_sys_tasks.ys
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
read_verilog -sv elab_sys_tasks.sv
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue