mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 13:29:12 +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_GENIF)
 | 
				
			||||||
	X(AST_GENCASE)
 | 
						X(AST_GENCASE)
 | 
				
			||||||
	X(AST_GENBLOCK)
 | 
						X(AST_GENBLOCK)
 | 
				
			||||||
 | 
						X(AST_TECALL)
 | 
				
			||||||
	X(AST_POSEDGE)
 | 
						X(AST_POSEDGE)
 | 
				
			||||||
	X(AST_NEGEDGE)
 | 
						X(AST_NEGEDGE)
 | 
				
			||||||
	X(AST_EDGE)
 | 
						X(AST_EDGE)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -137,6 +137,7 @@ namespace AST
 | 
				
			||||||
		AST_GENIF,
 | 
							AST_GENIF,
 | 
				
			||||||
		AST_GENCASE,
 | 
							AST_GENCASE,
 | 
				
			||||||
		AST_GENBLOCK,
 | 
							AST_GENBLOCK,
 | 
				
			||||||
 | 
							AST_TECALL,
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		AST_POSEDGE,
 | 
							AST_POSEDGE,
 | 
				
			||||||
		AST_NEGEDGE,
 | 
							AST_NEGEDGE,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1575,6 +1575,37 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)
 | 
				
			||||||
			delete always;
 | 
								delete always;
 | 
				
			||||||
		} break;
 | 
							} 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: {
 | 
						case AST_FCALL: {
 | 
				
			||||||
			if (str == "\\$anyconst" || str == "\\$anyseq" || str == "\\$allconst" || str == "\\$allseq")
 | 
								if (str == "\\$anyconst" || str == "\\$anyseq" || str == "\\$allconst" || str == "\\$allseq")
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -311,6 +311,11 @@ supply1 { return TOK_SUPPLY1; }
 | 
				
			||||||
	return TOK_ID;
 | 
						return TOK_ID;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"$"(info|warning|error|fatal) {
 | 
				
			||||||
 | 
						frontend_verilog_yylval.string = new std::string(yytext);
 | 
				
			||||||
 | 
						return TOK_ELAB_TASK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"$signed"   { return TOK_TO_SIGNED; }
 | 
					"$signed"   { return TOK_TO_SIGNED; }
 | 
				
			||||||
"$unsigned" { return TOK_TO_UNSIGNED; }
 | 
					"$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_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 TOK_ASSERT TOK_ASSUME TOK_RESTRICT TOK_COVER TOK_FINAL
 | 
				
			||||||
%token ATTR_BEGIN ATTR_END DEFATTR_BEGIN DEFATTR_END
 | 
					%token ATTR_BEGIN ATTR_END DEFATTR_BEGIN DEFATTR_END
 | 
				
			||||||
%token TOK_MODULE TOK_ENDMODULE TOK_PARAMETER TOK_LOCALPARAM TOK_DEFPARAM
 | 
					%token TOK_MODULE TOK_ENDMODULE TOK_PARAMETER TOK_LOCALPARAM TOK_DEFPARAM
 | 
				
			||||||
| 
						 | 
					@ -2176,6 +2176,15 @@ gen_stmt:
 | 
				
			||||||
		if ($6 != NULL)
 | 
							if ($6 != NULL)
 | 
				
			||||||
			delete $6;
 | 
								delete $6;
 | 
				
			||||||
		ast_stack.pop_back();
 | 
							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:
 | 
					gen_stmt_block:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -277,11 +277,22 @@ void log_file_warning(const std::string &filename, int lineno,
 | 
				
			||||||
	va_list ap;
 | 
						va_list ap;
 | 
				
			||||||
	va_start(ap, format);
 | 
						va_start(ap, format);
 | 
				
			||||||
	std::string prefix = stringf("%s:%d: Warning: ",
 | 
						std::string prefix = stringf("%s:%d: Warning: ",
 | 
				
			||||||
				     filename.c_str(), lineno);
 | 
								filename.c_str(), lineno);
 | 
				
			||||||
	logv_warning_with_prefix(prefix.c_str(), format, ap);
 | 
						logv_warning_with_prefix(prefix.c_str(), format, ap);
 | 
				
			||||||
	va_end(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)
 | 
					YS_ATTRIBUTE(noreturn)
 | 
				
			||||||
static void logv_error_with_prefix(const char *prefix,
 | 
					static void logv_error_with_prefix(const char *prefix,
 | 
				
			||||||
                                   const char *format, va_list ap)
 | 
					                                   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.
 | 
					// 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_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));
 | 
					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);
 | 
					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