mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 11:42:30 +00:00 
			
		
		
		
	ast: Move to a new helper method to print input errors
It's a repeating pattern to print an error message tied to an AST node. Start using an 'input_error' helper for that. Among other things this is beneficial in shortening the print lines, which tend to be long.
This commit is contained in:
		
							parent
							
								
									1ac1b2eed5
								
							
						
					
					
						commit
						77d4b5230e
					
				
					 6 changed files with 204 additions and 195 deletions
				
			
		|  | @ -53,7 +53,7 @@ std::string AstNode::process_format_str(const std::string &sformat, int next_arg | |||
| 		{ | ||||
| 			// If there's no next character, that's a problem
 | ||||
| 			if (i+1 >= sformat.length()) | ||||
| 				log_file_error(filename, location.first_line, "System task `%s' called with `%%' at end of string.\n", str.c_str()); | ||||
| 				input_error("System task `%s' called with `%%' at end of string.\n", str.c_str()); | ||||
| 
 | ||||
| 			char cformat = sformat[++i]; | ||||
| 
 | ||||
|  | @ -95,13 +95,13 @@ std::string AstNode::process_format_str(const std::string &sformat, int next_arg | |||
| 				case 'x': | ||||
| 				case 'X': | ||||
| 					if (next_arg >= GetSize(children)) | ||||
| 						log_file_error(filename, location.first_line, "Missing argument for %%%c format specifier in system task `%s'.\n", | ||||
| 						input_error("Missing argument for %%%c format specifier in system task `%s'.\n", | ||||
| 								cformat, str.c_str()); | ||||
| 
 | ||||
| 					node_arg = children[next_arg++]; | ||||
| 					while (node_arg->simplify(true, false, false, stage, width_hint, sign_hint, false)) { } | ||||
| 					if (node_arg->type != AST_CONSTANT) | ||||
| 						log_file_error(filename, location.first_line, "Failed to evaluate system task `%s' with non-constant argument.\n", str.c_str()); | ||||
| 						input_error("Failed to evaluate system task `%s' with non-constant argument.\n", str.c_str()); | ||||
| 					break; | ||||
| 
 | ||||
| 				case 'm': | ||||
|  | @ -118,7 +118,7 @@ std::string AstNode::process_format_str(const std::string &sformat, int next_arg | |||
| 
 | ||||
| 				default: | ||||
| 				unsupported_format: | ||||
| 					log_file_error(filename, location.first_line, "System task `%s' called with invalid/unsupported format specifier.\n", str.c_str()); | ||||
| 					input_error("System task `%s' called with invalid/unsupported format specifier.\n", str.c_str()); | ||||
| 					break; | ||||
| 			} | ||||
| 
 | ||||
|  | @ -266,7 +266,7 @@ static int range_width(AstNode *node, AstNode *rnode) | |||
| { | ||||
| 	log_assert(rnode->type==AST_RANGE); | ||||
| 	if (!rnode->range_valid) { | ||||
| 		log_file_error(node->filename, node->location.first_line, "Size must be constant in packed struct/union member %s\n", node->str.c_str()); | ||||
| 		node->input_error("Size must be constant in packed struct/union member %s\n", node->str.c_str()); | ||||
| 
 | ||||
| 	} | ||||
| 	// note: range swapping has already been checked for
 | ||||
|  | @ -275,7 +275,7 @@ static int range_width(AstNode *node, AstNode *rnode) | |||
| 
 | ||||
| [[noreturn]] static void struct_array_packing_error(AstNode *node) | ||||
| { | ||||
| 	log_file_error(node->filename, node->location.first_line, "Unpacked array in packed struct/union member %s\n", node->str.c_str()); | ||||
| 	node->input_error("Unpacked array in packed struct/union member %s\n", node->str.c_str()); | ||||
| } | ||||
| 
 | ||||
| static void save_struct_range_dimensions(AstNode *node, AstNode *rnode) | ||||
|  | @ -394,10 +394,8 @@ static int size_packed_struct(AstNode *snode, int base_offset) | |||
| 				packed_width = width; | ||||
| 			} | ||||
| 			else { | ||||
| 				if (packed_width != width) { | ||||
| 
 | ||||
| 					log_file_error(node->filename, node->location.first_line, "member %s of a packed union has %d bits, expecting %d\n", node->str.c_str(), width, packed_width); | ||||
| 				} | ||||
| 				if (packed_width != width) | ||||
| 					node->input_error("member %s of a packed union has %d bits, expecting %d\n", node->str.c_str(), width, packed_width); | ||||
| 			} | ||||
| 		} | ||||
| 		else { | ||||
|  | @ -409,7 +407,7 @@ static int size_packed_struct(AstNode *snode, int base_offset) | |||
| 
 | ||||
| [[noreturn]] static void struct_op_error(AstNode *node) | ||||
| { | ||||
| 	log_file_error(node->filename, node->location.first_line, "Unsupported operation for struct/union member %s\n", node->str.c_str()+1); | ||||
| 	node->input_error("Unsupported operation for struct/union member %s\n", node->str.c_str()+1); | ||||
| } | ||||
| 
 | ||||
| static AstNode *node_int(int ival) | ||||
|  | @ -1034,14 +1032,14 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 	{ | ||||
| 		int nargs = GetSize(children); | ||||
| 		if (nargs < 1) | ||||
| 			log_file_error(filename, location.first_line, "System task `%s' got %d arguments, expected >= 1.\n", | ||||
| 			input_error("System task `%s' got %d arguments, expected >= 1.\n", | ||||
| 					str.c_str(), int(children.size())); | ||||
| 
 | ||||
| 		// First argument is the format string
 | ||||
| 		AstNode *node_string = children[0]; | ||||
| 		while (node_string->simplify(true, false, false, stage, width_hint, sign_hint, false)) { } | ||||
| 		if (node_string->type != AST_CONSTANT) | ||||
| 			log_file_error(filename, location.first_line, "Failed to evaluate system task `%s' with non-constant 1st argument.\n", str.c_str()); | ||||
| 			input_error("Failed to evaluate system task `%s' with non-constant 1st argument.\n", str.c_str()); | ||||
| 		std::string sformat = node_string->bitsAsConst().decode_string(); | ||||
| 		std::string sout = process_format_str(sformat, 1, stage, width_hint, sign_hint); | ||||
| 		// Finally, print the message (only include a \n for $display, not for $write)
 | ||||
|  | @ -1138,7 +1136,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 					continue; | ||||
| 				wires_are_incompatible: | ||||
| 					if (stage > 1) | ||||
| 						log_file_error(filename, location.first_line, "Incompatible re-declaration of wire %s.\n", node->str.c_str()); | ||||
| 						input_error("Incompatible re-declaration of wire %s.\n", node->str.c_str()); | ||||
| 					continue; | ||||
| 				} | ||||
| 				this_wire_scope[node->str] = node; | ||||
|  | @ -1157,7 +1155,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 					if (current_scope.count(enode->str) == 0) | ||||
| 						current_scope[enode->str] = enode; | ||||
| 					else | ||||
| 						log_file_error(filename, location.first_line, "enum item %s already exists\n", enode->str.c_str()); | ||||
| 						input_error("enum item %s already exists\n", enode->str.c_str()); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | @ -1197,7 +1195,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 					if (current_scope.count(enode->str) == 0) | ||||
| 						current_scope[enode->str] = enode; | ||||
| 					else | ||||
| 						log_file_error(filename, location.first_line, "enum item %s already exists in package\n", enode->str.c_str()); | ||||
| 						input_error("enum item %s already exists in package\n", enode->str.c_str()); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | @ -1213,7 +1211,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 	if (type == AST_ALWAYS || type == AST_INITIAL) | ||||
| 	{ | ||||
| 		if (current_always != nullptr) | ||||
| 			log_file_error(filename, location.first_line, "Invalid nesting of always blocks and/or initializations.\n"); | ||||
| 			input_error("Invalid nesting of always blocks and/or initializations.\n"); | ||||
| 
 | ||||
| 		current_always = this; | ||||
| 		current_always_clocked = false; | ||||
|  | @ -1279,16 +1277,14 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 					port_name = child->str; | ||||
| 				else { | ||||
| 					if (port_counter >= module->ports.size()) | ||||
| 						log_file_error(filename, location.first_line, | ||||
| 								"Cell instance has more ports than the module!\n"); | ||||
| 						input_error("Cell instance has more ports than the module!\n"); | ||||
| 					port_name = module->ports[port_counter++]; | ||||
| 				} | ||||
| 
 | ||||
| 				// find the port's wire in the underlying module
 | ||||
| 				const RTLIL::Wire *ref = module->wire(port_name); | ||||
| 				if (ref == nullptr) | ||||
| 					log_file_error(filename, location.first_line, | ||||
| 							"Cell instance refers to port %s which does not exist in module %s!.\n", | ||||
| 					input_error("Cell instance refers to port %s which does not exist in module %s!.\n", | ||||
| 							log_id(port_name), log_id(module->name)); | ||||
| 
 | ||||
| 				// select the argument, if present
 | ||||
|  | @ -1494,7 +1490,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 			while (!children[1]->basic_prep && children[1]->simplify(false, false, false, stage, -1, false, true) == true) | ||||
| 				did_something = true; | ||||
| 			if (!children[1]->range_valid) | ||||
| 				log_file_error(filename, location.first_line, "Non-constant width range on parameter decl.\n"); | ||||
| 				input_error("Non-constant width range on parameter decl.\n"); | ||||
| 			width_hint = max(width_hint, children[1]->range_left - children[1]->range_right + 1); | ||||
| 		} | ||||
| 		break; | ||||
|  | @ -1506,7 +1502,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 			while (!children[1]->basic_prep && children[1]->simplify(false, false, false, stage, -1, false, in_param)) | ||||
| 				did_something = true; | ||||
| 			if (!children[1]->range_valid) | ||||
| 				log_file_error(filename, location.first_line, "Non-constant width range on enum item decl.\n"); | ||||
| 				input_error("Non-constant width range on enum item decl.\n"); | ||||
| 			width_hint = max(width_hint, children[1]->range_left - children[1]->range_right + 1); | ||||
| 		} | ||||
| 		break; | ||||
|  | @ -1812,7 +1808,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 	if (type == AST_DEFPARAM && !children.empty()) | ||||
| 	{ | ||||
| 		if (children[0]->type != AST_IDENTIFIER) | ||||
| 			log_file_error(filename, location.first_line, "Module name in defparam contains non-constant expressions!\n"); | ||||
| 			input_error("Module name in defparam contains non-constant expressions!\n"); | ||||
| 
 | ||||
| 		string modname, paramname = children[0]->str; | ||||
| 
 | ||||
|  | @ -1829,12 +1825,12 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 		} | ||||
| 
 | ||||
| 		if (pos == std::string::npos) | ||||
| 			log_file_error(filename, location.first_line, "Can't find object for defparam `%s`!\n", RTLIL::unescape_id(paramname).c_str()); | ||||
| 			input_error("Can't find object for defparam `%s`!\n", RTLIL::unescape_id(paramname).c_str()); | ||||
| 
 | ||||
| 		paramname = "\\" + paramname.substr(pos+1); | ||||
| 
 | ||||
| 		if (current_scope.at(modname)->type != AST_CELL) | ||||
| 			log_file_error(filename, location.first_line, "Defparam argument `%s . %s` does not match a cell!\n", | ||||
| 			input_error("Defparam argument `%s . %s` does not match a cell!\n", | ||||
| 					RTLIL::unescape_id(modname).c_str(), RTLIL::unescape_id(paramname).c_str()); | ||||
| 
 | ||||
| 		AstNode *paraset = new AstNode(AST_PARASET, children[1]->clone(), GetSize(children) > 2 ? children[2]->clone() : NULL); | ||||
|  | @ -1863,11 +1859,11 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 			log_assert(children[0]->type == AST_WIRETYPE); | ||||
| 			auto type_name = children[0]->str; | ||||
| 			if (!current_scope.count(type_name)) { | ||||
| 				log_file_error(filename, location.first_line, "Unknown identifier `%s' used as type name\n", type_name.c_str()); | ||||
| 				input_error("Unknown identifier `%s' used as type name\n", type_name.c_str()); | ||||
| 			} | ||||
| 			AstNode *resolved_type_node = current_scope.at(type_name); | ||||
| 			if (resolved_type_node->type != AST_TYPEDEF) | ||||
| 				log_file_error(filename, location.first_line, "`%s' does not name a type\n", type_name.c_str()); | ||||
| 				input_error("`%s' does not name a type\n", type_name.c_str()); | ||||
| 			log_assert(resolved_type_node->children.size() == 1); | ||||
| 			AstNode *template_node = resolved_type_node->children[0]; | ||||
| 
 | ||||
|  | @ -1928,11 +1924,11 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 			log_assert(children[1]->type == AST_WIRETYPE); | ||||
| 			auto type_name = children[1]->str; | ||||
| 			if (!current_scope.count(type_name)) { | ||||
| 				log_file_error(filename, location.first_line, "Unknown identifier `%s' used as type name\n", type_name.c_str()); | ||||
| 				input_error("Unknown identifier `%s' used as type name\n", type_name.c_str()); | ||||
| 			} | ||||
| 			AstNode *resolved_type_node = current_scope.at(type_name); | ||||
| 			if (resolved_type_node->type != AST_TYPEDEF) | ||||
| 				log_file_error(filename, location.first_line, "`%s' does not name a type\n", type_name.c_str()); | ||||
| 				input_error("`%s' does not name a type\n", type_name.c_str()); | ||||
| 			log_assert(resolved_type_node->children.size() == 1); | ||||
| 			AstNode *template_node = resolved_type_node->children[0]; | ||||
| 
 | ||||
|  | @ -1955,7 +1951,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 			children.pop_back(); | ||||
| 
 | ||||
| 			if (template_node->type == AST_MEMORY) | ||||
| 				log_file_error(filename, location.first_line, "unpacked array type `%s' cannot be used for a parameter\n", children[1]->str.c_str()); | ||||
| 				input_error("unpacked array type `%s' cannot be used for a parameter\n", children[1]->str.c_str()); | ||||
| 			is_signed = template_node->is_signed; | ||||
| 			is_string = template_node->is_string; | ||||
| 			is_custom_type = template_node->is_custom_type; | ||||
|  | @ -1976,7 +1972,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 	if (type == AST_PREFIX) { | ||||
| 		if (children[0]->type != AST_CONSTANT) { | ||||
| 			// dumpAst(NULL, ">   ");
 | ||||
| 			log_file_error(filename, location.first_line, "Index in generate block prefix syntax is not constant!\n"); | ||||
| 			input_error("Index in generate block prefix syntax is not constant!\n"); | ||||
| 		} | ||||
| 		if (children[1]->type == AST_PREFIX) | ||||
| 			children[1]->simplify(const_fold, at_zero, in_lvalue, stage, width_hint, sign_hint, in_param); | ||||
|  | @ -1992,9 +1988,9 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 	// evaluate TO_BITS nodes
 | ||||
| 	if (type == AST_TO_BITS) { | ||||
| 		if (children[0]->type != AST_CONSTANT) | ||||
| 			log_file_error(filename, location.first_line, "Left operand of to_bits expression is not constant!\n"); | ||||
| 			input_error("Left operand of to_bits expression is not constant!\n"); | ||||
| 		if (children[1]->type != AST_CONSTANT) | ||||
| 			log_file_error(filename, location.first_line, "Right operand of to_bits expression is not constant!\n"); | ||||
| 			input_error("Right operand of to_bits expression is not constant!\n"); | ||||
| 		RTLIL::Const new_value = children[1]->bitsAsConst(children[0]->bitsAsConst().as_int(), children[1]->is_signed); | ||||
| 		newNode = mkconst_bits(new_value.bits, children[1]->is_signed); | ||||
| 		goto apply_newNode; | ||||
|  | @ -2044,17 +2040,17 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 				if (attributes.count(ID::force_upto)) { | ||||
| 					AstNode *val = attributes[ID::force_upto]; | ||||
| 					if (val->type != AST_CONSTANT) | ||||
| 						log_file_error(filename, location.first_line, "Attribute `force_upto' with non-constant value!\n"); | ||||
| 						input_error("Attribute `force_upto' with non-constant value!\n"); | ||||
| 					force_upto = val->asAttrConst().as_bool(); | ||||
| 				} | ||||
| 				if (attributes.count(ID::force_downto)) { | ||||
| 					AstNode *val = attributes[ID::force_downto]; | ||||
| 					if (val->type != AST_CONSTANT) | ||||
| 						log_file_error(filename, location.first_line, "Attribute `force_downto' with non-constant value!\n"); | ||||
| 						input_error("Attribute `force_downto' with non-constant value!\n"); | ||||
| 					force_downto = val->asAttrConst().as_bool(); | ||||
| 				} | ||||
| 				if (force_upto && force_downto) | ||||
| 					log_file_error(filename, location.first_line, "Attributes `force_downto' and `force_upto' cannot be both set!\n"); | ||||
| 					input_error("Attributes `force_downto' and `force_upto' cannot be both set!\n"); | ||||
| 				if ((force_upto && !range_swapped) || (force_downto && range_swapped)) { | ||||
| 					std::swap(range_left, range_right); | ||||
| 					range_swapped = force_upto; | ||||
|  | @ -2078,7 +2074,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 		multirange_swapped.clear(); | ||||
| 		for (auto range : children[1]->children) { | ||||
| 			if (!range->range_valid) | ||||
| 				log_file_error(filename, location.first_line, "Non-constant range on memory decl.\n"); | ||||
| 				input_error("Non-constant range on memory decl.\n"); | ||||
| 			multirange_dimensions.push_back(min(range->range_left, range->range_right)); | ||||
| 			multirange_dimensions.push_back(max(range->range_left, range->range_right) - min(range->range_left, range->range_right) + 1); | ||||
| 			multirange_swapped.push_back(range->range_swapped); | ||||
|  | @ -2098,7 +2094,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 		for (int i = 0; 2*i < GetSize(id2ast->multirange_dimensions); i++) | ||||
| 		{ | ||||
| 			if (GetSize(children[0]->children) <= i) | ||||
| 				log_file_error(filename, location.first_line, "Insufficient number of array indices for %s.\n", log_id(str)); | ||||
| 				input_error("Insufficient number of array indices for %s.\n", log_id(str)); | ||||
| 
 | ||||
| 			AstNode *new_index_expr = children[0]->children[i]->children.at(0)->clone(); | ||||
| 
 | ||||
|  | @ -2127,7 +2123,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 	if (type == AST_PARAMETER || type == AST_LOCALPARAM || type == AST_ENUM_ITEM) { | ||||
| 		if (children.size() > 1 && children[1]->type == AST_RANGE) { | ||||
| 			if (!children[1]->range_valid) | ||||
| 				log_file_error(filename, location.first_line, "Non-constant width range on parameter decl.\n"); | ||||
| 				input_error("Non-constant width range on parameter decl.\n"); | ||||
| 			int width = std::abs(children[1]->range_left - children[1]->range_right) + 1; | ||||
| 			if (children[0]->type == AST_REALVALUE) { | ||||
| 				RTLIL::Const constvalue = children[0]->realAsConst(width); | ||||
|  | @ -2228,7 +2224,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 		} | ||||
| 		if (current_scope.count(str) == 0) { | ||||
| 			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()); | ||||
| 				input_error("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); | ||||
| 				auto_wire->str = str; | ||||
|  | @ -2236,7 +2232,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 				current_scope[str] = auto_wire; | ||||
| 				did_something = true; | ||||
| 			} else { | ||||
| 				log_file_error(filename, location.first_line, "Identifier `%s' is implicitly declared and `default_nettype is set to none.\n", str.c_str()); | ||||
| 				input_error("Identifier `%s' is implicitly declared and `default_nettype is set to none.\n", str.c_str()); | ||||
| 			} | ||||
| 		} | ||||
| 		if (id2ast != current_scope[str]) { | ||||
|  | @ -2249,7 +2245,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 	if (type == AST_IDENTIFIER && children.size() == 2 && children[0]->type == AST_RANGE && children[1]->type == AST_RANGE && !in_lvalue && stage == 2) | ||||
| 	{ | ||||
| 		if (id2ast == NULL || id2ast->type != AST_MEMORY || children[0]->children.size() != 1) | ||||
| 			log_file_error(filename, location.first_line, "Invalid bit-select on memory access!\n"); | ||||
| 			input_error("Invalid bit-select on memory access!\n"); | ||||
| 
 | ||||
| 		int mem_width, mem_size, addr_bits; | ||||
| 		id2ast->meminfo(mem_width, mem_size, addr_bits); | ||||
|  | @ -2303,7 +2299,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 	} | ||||
| 
 | ||||
| 	if (type == AST_WHILE) | ||||
| 		log_file_error(filename, location.first_line, "While loops are only allowed in constant functions!\n"); | ||||
| 		input_error("While loops are only allowed in constant functions!\n"); | ||||
| 
 | ||||
| 	if (type == AST_REPEAT) | ||||
| 	{ | ||||
|  | @ -2314,7 +2310,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 		while (count->simplify(true, false, false, stage, 32, true, false)) { } | ||||
| 
 | ||||
| 		if (count->type != AST_CONSTANT) | ||||
| 			log_file_error(filename, location.first_line, "Repeat loops outside must have constant repeat counts!\n"); | ||||
| 			input_error("Repeat loops outside must have constant repeat counts!\n"); | ||||
| 
 | ||||
| 		// convert to a block with the body repeated n times
 | ||||
| 		type = AST_BLOCK; | ||||
|  | @ -2349,17 +2345,17 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 		} | ||||
| 
 | ||||
| 		if (init_ast->type != AST_ASSIGN_EQ) | ||||
| 			log_file_error(filename, location.first_line, "Unsupported 1st expression of %s for-loop!\n", loop_type_str); | ||||
| 			input_error("Unsupported 1st expression of %s for-loop!\n", loop_type_str); | ||||
| 		if (next_ast->type != AST_ASSIGN_EQ) | ||||
| 			log_file_error(filename, location.first_line, "Unsupported 3rd expression of %s for-loop!\n", loop_type_str); | ||||
| 			input_error("Unsupported 3rd expression of %s for-loop!\n", loop_type_str); | ||||
| 
 | ||||
| 		if (init_ast->children[0]->id2ast == NULL || init_ast->children[0]->id2ast->type != var_type) | ||||
| 			log_file_error(filename, location.first_line, "Left hand side of 1st expression of %s for-loop is not a %s!\n", loop_type_str, var_type_str); | ||||
| 			input_error("Left hand side of 1st expression of %s for-loop is not a %s!\n", loop_type_str, var_type_str); | ||||
| 		if (next_ast->children[0]->id2ast == NULL || next_ast->children[0]->id2ast->type != var_type) | ||||
| 			log_file_error(filename, location.first_line, "Left hand side of 3rd expression of %s for-loop is not a %s!\n", loop_type_str, var_type_str); | ||||
| 			input_error("Left hand side of 3rd expression of %s for-loop is not a %s!\n", loop_type_str, var_type_str); | ||||
| 
 | ||||
| 		if (init_ast->children[0]->id2ast != next_ast->children[0]->id2ast) | ||||
| 			log_file_error(filename, location.first_line, "Incompatible left-hand sides in 1st and 3rd expression of %s for-loop!\n", loop_type_str); | ||||
| 			input_error("Incompatible left-hand sides in 1st and 3rd expression of %s for-loop!\n", loop_type_str); | ||||
| 
 | ||||
| 		// eval 1st expression
 | ||||
| 		AstNode *varbuf = init_ast->children[1]->clone(); | ||||
|  | @ -2371,7 +2367,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 		} | ||||
| 
 | ||||
| 		if (varbuf->type != AST_CONSTANT) | ||||
| 			log_file_error(filename, location.first_line, "Right hand side of 1st expression of %s for-loop is not constant!\n", loop_type_str); | ||||
| 			input_error("Right hand side of 1st expression of %s for-loop is not constant!\n", loop_type_str); | ||||
| 
 | ||||
| 		auto resolved = current_scope.at(init_ast->children[0]->str); | ||||
| 		if (resolved->range_valid) { | ||||
|  | @ -2412,7 +2408,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 			} | ||||
| 
 | ||||
| 			if (buf->type != AST_CONSTANT) | ||||
| 				log_file_error(filename, location.first_line, "2nd expression of %s for-loop is not constant!\n", loop_type_str); | ||||
| 				input_error("2nd expression of %s for-loop is not constant!\n", loop_type_str); | ||||
| 
 | ||||
| 			if (buf->integer == 0) { | ||||
| 				delete buf; | ||||
|  | @ -2463,7 +2459,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 			} | ||||
| 
 | ||||
| 			if (buf->type != AST_CONSTANT) | ||||
| 				log_file_error(filename, location.first_line, "Right hand side of 3rd expression of %s for-loop is not constant (%s)!\n", loop_type_str, type2str(buf->type).c_str()); | ||||
| 				input_error("Right hand side of 3rd expression of %s for-loop is not constant (%s)!\n", loop_type_str, type2str(buf->type).c_str()); | ||||
| 
 | ||||
| 			delete varbuf->children[0]; | ||||
| 			varbuf->children[0] = buf; | ||||
|  | @ -2489,7 +2485,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 			if (children[i]->type == AST_WIRE || children[i]->type == AST_MEMORY || children[i]->type == AST_PARAMETER || children[i]->type == AST_LOCALPARAM || children[i]->type == AST_TYPEDEF) | ||||
| 			{ | ||||
| 				log_assert(!VERILOG_FRONTEND::sv_mode); | ||||
| 				log_file_error(children[i]->filename, children[i]->location.first_line, "Local declaration in unnamed block is only supported in SystemVerilog mode!\n"); | ||||
| 				children[i]->input_error("Local declaration in unnamed block is only supported in SystemVerilog mode!\n"); | ||||
| 			} | ||||
| 	} | ||||
| 
 | ||||
|  | @ -2546,7 +2542,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 		if (buf->type != AST_CONSTANT) { | ||||
| 			// for (auto f : log_files)
 | ||||
| 			// 	dumpAst(f, "verilog-ast> ");
 | ||||
| 			log_file_error(filename, location.first_line, "Condition for generate if is not constant!\n"); | ||||
| 			input_error("Condition for generate if is not constant!\n"); | ||||
| 		} | ||||
| 		if (buf->asBool() != 0) { | ||||
| 			delete buf; | ||||
|  | @ -2586,7 +2582,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 		if (buf->type != AST_CONSTANT) { | ||||
| 			// for (auto f : log_files)
 | ||||
| 			// 	dumpAst(f, "verilog-ast> ");
 | ||||
| 			log_file_error(filename, location.first_line, "Condition for generate case is not constant!\n"); | ||||
| 			input_error("Condition for generate case is not constant!\n"); | ||||
| 		} | ||||
| 
 | ||||
| 		bool ref_signed = buf->is_signed; | ||||
|  | @ -2620,7 +2616,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 				if (buf->type != AST_CONSTANT) { | ||||
| 					// for (auto f : log_files)
 | ||||
| 					// 	dumpAst(f, "verilog-ast> ");
 | ||||
| 					log_file_error(filename, location.first_line, "Expression in generate case is not constant!\n"); | ||||
| 					input_error("Expression in generate case is not constant!\n"); | ||||
| 				} | ||||
| 
 | ||||
| 				bool is_selected = RTLIL::const_eq(ref_value, buf->bitsAsConst(), ref_signed && buf->is_signed, ref_signed && buf->is_signed, 1).as_bool(); | ||||
|  | @ -2660,7 +2656,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 	if (type == AST_CELLARRAY) | ||||
| 	{ | ||||
| 		if (!children.at(0)->range_valid) | ||||
| 			log_file_error(filename, location.first_line, "Non-constant array range on cell array.\n"); | ||||
| 			input_error("Non-constant array range on cell array.\n"); | ||||
| 
 | ||||
| 		newNode = new AstNode(AST_GENBLOCK); | ||||
| 		int num = max(children.at(0)->range_left, children.at(0)->range_right) - min(children.at(0)->range_left, children.at(0)->range_right) + 1; | ||||
|  | @ -2671,7 +2667,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 			newNode->children.push_back(new_cell); | ||||
| 			new_cell->str += stringf("[%d]", idx); | ||||
| 			if (new_cell->type == AST_PRIMITIVE) { | ||||
| 				log_file_error(filename, location.first_line, "Cell arrays of primitives are currently not supported.\n"); | ||||
| 				input_error("Cell arrays of primitives are currently not supported.\n"); | ||||
| 			} else { | ||||
| 				log_assert(new_cell->children.at(0)->type == AST_CELLTYPE); | ||||
| 				new_cell->children.at(0)->str = stringf("$array:%d:%d:%s", i, num, new_cell->children.at(0)->str.c_str()); | ||||
|  | @ -2685,7 +2681,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 	if (type == AST_PRIMITIVE) | ||||
| 	{ | ||||
| 		if (children.size() < 2) | ||||
| 			log_file_error(filename, location.first_line, "Insufficient number of arguments for primitive `%s'!\n", str.c_str()); | ||||
| 			input_error("Insufficient number of arguments for primitive `%s'!\n", str.c_str()); | ||||
| 
 | ||||
| 		std::vector<AstNode*> children_list; | ||||
| 		for (auto child : children) { | ||||
|  | @ -2700,7 +2696,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 		if (str == "bufif0" || str == "bufif1" || str == "notif0" || str == "notif1") | ||||
| 		{ | ||||
| 			if (children_list.size() != 3) | ||||
| 				log_file_error(filename, location.first_line, "Invalid number of arguments for primitive `%s'!\n", str.c_str()); | ||||
| 				input_error("Invalid number of arguments for primitive `%s'!\n", str.c_str()); | ||||
| 
 | ||||
| 			std::vector<RTLIL::State> z_const(1, RTLIL::State::Sz); | ||||
| 
 | ||||
|  | @ -2816,7 +2812,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 		AstNode *range = children[0]->children[0]; | ||||
| 
 | ||||
| 		if (!try_determine_range_width(range, result_width)) | ||||
| 			log_file_error(filename, location.first_line, "Unsupported expression on dynamic range select on signal `%s'!\n", str.c_str()); | ||||
| 			input_error("Unsupported expression on dynamic range select on signal `%s'!\n", str.c_str()); | ||||
| 
 | ||||
| 		if (range->children.size() >= 2) | ||||
| 			shift_expr = range->children[1]->clone(); | ||||
|  | @ -2829,7 +2825,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, | |||
| 			AstNode *node = children[0]->id2ast->attributes.at(ID::nowrshmsk); | ||||
| 			while (node->simplify(true, false, false, stage, -1, false, false)) { } | ||||
| 			if (node->type != AST_CONSTANT) | ||||
| 				log_file_error(filename, location.first_line, "Non-constant value for `nowrshmsk' attribute on `%s'!\n", children[0]->id2ast->str.c_str()); | ||||
| 				input_error("Non-constant value for `nowrshmsk' attribute on `%s'!\n", children[0]->id2ast->str.c_str()); | ||||
| 			if (node->asAttrConst().as_bool()) | ||||
| 				use_case_method = true; | ||||
| 		} | ||||
|  | @ -3229,7 +3225,7 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 				int width; | ||||
| 
 | ||||
| 				if (!try_determine_range_width(the_range, width)) | ||||
| 					log_file_error(filename, location.first_line, "Unsupported expression on dynamic range select on signal `%s'!\n", str.c_str()); | ||||
| 					input_error("Unsupported expression on dynamic range select on signal `%s'!\n", str.c_str()); | ||||
| 
 | ||||
| 				if (the_range->children.size() >= 2) | ||||
| 					offset_ast = the_range->children[1]->clone(); | ||||
|  | @ -3337,11 +3333,11 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 				int num_steps = 1; | ||||
| 
 | ||||
| 				if (GetSize(children) != 1 && GetSize(children) != 2) | ||||
| 					log_file_error(filename, location.first_line, "System function %s got %d arguments, expected 1 or 2.\n", | ||||
| 					input_error("System function %s got %d arguments, expected 1 or 2.\n", | ||||
| 							RTLIL::unescape_id(str).c_str(), int(children.size())); | ||||
| 
 | ||||
| 				if (!current_always_clocked) | ||||
| 					log_file_error(filename, location.first_line, "System function %s is only allowed in clocked blocks.\n", | ||||
| 					input_error("System function %s is only allowed in clocked blocks.\n", | ||||
| 							RTLIL::unescape_id(str).c_str()); | ||||
| 
 | ||||
| 				if (GetSize(children) == 2) | ||||
|  | @ -3349,7 +3345,7 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 					AstNode *buf = children[1]->clone(); | ||||
| 					while (buf->simplify(true, false, false, stage, -1, false, false)) { } | ||||
| 					if (buf->type != AST_CONSTANT) | ||||
| 						log_file_error(filename, location.first_line, "Failed to evaluate system function `%s' with non-constant value.\n", str.c_str()); | ||||
| 						input_error("Failed to evaluate system function `%s' with non-constant value.\n", str.c_str()); | ||||
| 
 | ||||
| 					num_steps = buf->asInt(true); | ||||
| 					delete buf; | ||||
|  | @ -3412,11 +3408,11 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 			if (str == "\\$stable" || str == "\\$rose" || str == "\\$fell" || str == "\\$changed") | ||||
| 			{ | ||||
| 				if (GetSize(children) != 1) | ||||
| 					log_file_error(filename, location.first_line, "System function %s got %d arguments, expected 1.\n", | ||||
| 					input_error("System function %s got %d arguments, expected 1.\n", | ||||
| 							RTLIL::unescape_id(str).c_str(), int(children.size())); | ||||
| 
 | ||||
| 				if (!current_always_clocked) | ||||
| 					log_file_error(filename, location.first_line, "System function %s is only allowed in clocked blocks.\n", | ||||
| 					input_error("System function %s is only allowed in clocked blocks.\n", | ||||
| 							RTLIL::unescape_id(str).c_str()); | ||||
| 
 | ||||
| 				AstNode *present = children.at(0)->clone(); | ||||
|  | @ -3454,13 +3450,13 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 			if (str == "\\$clog2") | ||||
| 			{ | ||||
| 				if (children.size() != 1) | ||||
| 					log_file_error(filename, location.first_line, "System function %s got %d arguments, expected 1.\n", | ||||
| 					input_error("System function %s got %d arguments, expected 1.\n", | ||||
| 							RTLIL::unescape_id(str).c_str(), int(children.size())); | ||||
| 
 | ||||
| 				AstNode *buf = children[0]->clone(); | ||||
| 				while (buf->simplify(true, false, false, stage, width_hint, sign_hint, false)) { } | ||||
| 				if (buf->type != AST_CONSTANT) | ||||
| 					log_file_error(filename, location.first_line, "Failed to evaluate system function `%s' with non-constant value.\n", str.c_str()); | ||||
| 					input_error("Failed to evaluate system function `%s' with non-constant value.\n", str.c_str()); | ||||
| 
 | ||||
| 				RTLIL::Const arg_value = buf->bitsAsConst(); | ||||
| 				if (arg_value.as_bool()) | ||||
|  | @ -3481,11 +3477,11 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 				int dim = 1; | ||||
| 				if (str == "\\$bits") { | ||||
| 					if (children.size() != 1) | ||||
| 						log_file_error(filename, location.first_line, "System function %s got %d arguments, expected 1.\n", | ||||
| 						input_error("System function %s got %d arguments, expected 1.\n", | ||||
| 								RTLIL::unescape_id(str).c_str(), int(children.size())); | ||||
| 				} else { | ||||
| 					if (children.size() != 1 && children.size() != 2) | ||||
| 						log_file_error(filename, location.first_line, "System function %s got %d arguments, expected 1 or 2.\n", | ||||
| 						input_error("System function %s got %d arguments, expected 1 or 2.\n", | ||||
| 							RTLIL::unescape_id(str).c_str(), int(children.size())); | ||||
| 					if (children.size() == 2) { | ||||
| 						AstNode *buf = children[1]->clone(); | ||||
|  | @ -3509,7 +3505,7 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 					if (id_ast == NULL && current_scope.count(buf->str)) | ||||
| 						id_ast = current_scope.at(buf->str); | ||||
| 					if (!id_ast) | ||||
| 						log_file_error(filename, location.first_line, "Failed to resolve identifier %s for width detection!\n", buf->str.c_str()); | ||||
| 						input_error("Failed to resolve identifier %s for width detection!\n", buf->str.c_str()); | ||||
| 
 | ||||
| 					// Check for item in packed struct / union
 | ||||
| 					AST::AstNode *item_node = get_struct_member(buf); | ||||
|  | @ -3518,13 +3514,13 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 						dim += buf->integer; | ||||
| 						if (item_node->multirange_dimensions.empty()) { | ||||
| 							if (dim != 1) | ||||
| 								log_file_error(filename, location.first_line, "Dimension %d out of range in `%s', as it only has one dimension!\n", dim, item_node->str.c_str()); | ||||
| 								input_error("Dimension %d out of range in `%s', as it only has one dimension!\n", dim, item_node->str.c_str()); | ||||
| 							left  = high = item_node->range_left; | ||||
| 							right = low  = item_node->range_right; | ||||
| 						} else { | ||||
| 							int dims = GetSize(item_node->multirange_dimensions)/2; | ||||
| 							if (dim < 1 || dim > dims) | ||||
| 								log_file_error(filename, location.first_line, "Dimension %d out of range in `%s', as it only has dimensions 1..%d!\n", dim, item_node->str.c_str(), dims); | ||||
| 								input_error("Dimension %d out of range in `%s', as it only has dimensions 1..%d!\n", dim, item_node->str.c_str(), dims); | ||||
| 							right = low  = get_struct_range_offset(item_node, dim - 1); | ||||
| 							left  = high = low + get_struct_range_width(item_node, dim - 1) - 1; | ||||
| 							if (item_node->multirange_swapped[dim - 1]) { | ||||
|  | @ -3568,17 +3564,17 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 						if (str == "\\$bits") { | ||||
| 							if (mem_range->type == AST_RANGE) { | ||||
| 								if (!mem_range->range_valid) | ||||
| 									log_file_error(filename, location.first_line, "Failed to detect width of memory access `%s'!\n", buf->str.c_str()); | ||||
| 									input_error("Failed to detect width of memory access `%s'!\n", buf->str.c_str()); | ||||
| 								mem_depth = mem_range->range_left - mem_range->range_right + 1; | ||||
| 							} else | ||||
| 								log_file_error(filename, location.first_line, "Unknown memory depth AST type in `%s'!\n", buf->str.c_str()); | ||||
| 								input_error("Unknown memory depth AST type in `%s'!\n", buf->str.c_str()); | ||||
| 						} else { | ||||
| 							// $size(), $left(), $right(), $high(), $low()
 | ||||
| 							int dims = 1; | ||||
| 							if (mem_range->type == AST_RANGE) { | ||||
| 								if (id_ast->multirange_dimensions.empty()) { | ||||
| 									if (!mem_range->range_valid) | ||||
| 										log_file_error(filename, location.first_line, "Failed to detect width of memory access `%s'!\n", buf->str.c_str()); | ||||
| 										input_error("Failed to detect width of memory access `%s'!\n", buf->str.c_str()); | ||||
| 									if (dim == 1) { | ||||
| 										left  = mem_range->range_right; | ||||
| 										right = mem_range->range_left; | ||||
|  | @ -3599,10 +3595,10 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 											left = high; | ||||
| 										} | ||||
| 									} else if ((dim > dims+1) || (dim < 0)) | ||||
| 										log_file_error(filename, location.first_line, "Dimension %d out of range in `%s', as it only has dimensions 1..%d!\n", dim, buf->str.c_str(), dims+1); | ||||
| 										input_error("Dimension %d out of range in `%s', as it only has dimensions 1..%d!\n", dim, buf->str.c_str(), dims+1); | ||||
| 								} | ||||
| 							} else { | ||||
| 								log_file_error(filename, location.first_line, "Unknown memory depth AST type in `%s'!\n", buf->str.c_str()); | ||||
| 								input_error("Unknown memory depth AST type in `%s'!\n", buf->str.c_str()); | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
|  | @ -3639,18 +3635,18 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 
 | ||||
| 				if (func_with_two_arguments) { | ||||
| 					if (children.size() != 2) | ||||
| 						log_file_error(filename, location.first_line, "System function %s got %d arguments, expected 2.\n", | ||||
| 						input_error("System function %s got %d arguments, expected 2.\n", | ||||
| 								RTLIL::unescape_id(str).c_str(), int(children.size())); | ||||
| 				} else { | ||||
| 					if (children.size() != 1) | ||||
| 						log_file_error(filename, location.first_line, "System function %s got %d arguments, expected 1.\n", | ||||
| 						input_error("System function %s got %d arguments, expected 1.\n", | ||||
| 								RTLIL::unescape_id(str).c_str(), int(children.size())); | ||||
| 				} | ||||
| 
 | ||||
| 				if (children.size() >= 1) { | ||||
| 					while (children[0]->simplify(true, false, false, stage, width_hint, sign_hint, false)) { } | ||||
| 					if (!children[0]->isConst()) | ||||
| 						log_file_error(filename, location.first_line, "Failed to evaluate system function `%s' with non-constant argument.\n", | ||||
| 						input_error("Failed to evaluate system function `%s' with non-constant argument.\n", | ||||
| 								RTLIL::unescape_id(str).c_str()); | ||||
| 					int child_width_hint = width_hint; | ||||
| 					bool child_sign_hint = sign_hint; | ||||
|  | @ -3661,7 +3657,7 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 				if (children.size() >= 2) { | ||||
| 					while (children[1]->simplify(true, false, false, stage, width_hint, sign_hint, false)) { } | ||||
| 					if (!children[1]->isConst()) | ||||
| 						log_file_error(filename, location.first_line, "Failed to evaluate system function `%s' with non-constant argument.\n", | ||||
| 						input_error("Failed to evaluate system function `%s' with non-constant argument.\n", | ||||
| 								RTLIL::unescape_id(str).c_str()); | ||||
| 					int child_width_hint = width_hint; | ||||
| 					bool child_sign_hint = sign_hint; | ||||
|  | @ -3704,7 +3700,7 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 				AstNode *node_string = children[0]; | ||||
| 				while (node_string->simplify(true, false, false, stage, width_hint, sign_hint, false)) { } | ||||
| 				if (node_string->type != AST_CONSTANT) | ||||
| 					log_file_error(filename, location.first_line, "Failed to evaluate system function `%s' with non-constant 1st argument.\n", str.c_str()); | ||||
| 					input_error("Failed to evaluate system function `%s' with non-constant 1st argument.\n", str.c_str()); | ||||
| 				std::string sformat = node_string->bitsAsConst().decode_string(); | ||||
| 				std::string sout = process_format_str(sformat, 1, stage, width_hint, sign_hint); | ||||
| 				newNode = AstNode::mkconst_str(sout); | ||||
|  | @ -3713,7 +3709,7 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 
 | ||||
| 			if (str == "\\$countbits") { | ||||
| 				if (children.size() < 2) | ||||
| 					log_file_error(filename, location.first_line, "System function %s got %d arguments, expected at least 2.\n", | ||||
| 					input_error("System function %s got %d arguments, expected at least 2.\n", | ||||
| 							RTLIL::unescape_id(str).c_str(), int(children.size())); | ||||
| 
 | ||||
| 				std::vector<RTLIL::State> control_bits; | ||||
|  | @ -3723,9 +3719,9 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 					AstNode *node = children[i]; | ||||
| 					while (node->simplify(true, false, false, stage, -1, false, false)) { } | ||||
| 					if (node->type != AST_CONSTANT) | ||||
| 						log_file_error(filename, location.first_line, "Failed to evaluate system function `%s' with non-constant control bit argument.\n", str.c_str()); | ||||
| 						input_error("Failed to evaluate system function `%s' with non-constant control bit argument.\n", str.c_str()); | ||||
| 					if (node->bits.size() != 1) | ||||
| 						log_file_error(filename, location.first_line, "Failed to evaluate system function `%s' with control bit width != 1.\n", str.c_str()); | ||||
| 						input_error("Failed to evaluate system function `%s' with control bit width != 1.\n", str.c_str()); | ||||
| 					control_bits.push_back(node->bits[0]); | ||||
| 				} | ||||
| 
 | ||||
|  | @ -3772,7 +3768,7 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 
 | ||||
| 			if (str == "\\$countones" || str == "\\$isunknown" || str == "\\$onehot" || str == "\\$onehot0") { | ||||
| 				if (children.size() != 1) | ||||
| 					log_file_error(filename, location.first_line, "System function %s got %d arguments, expected 1.\n", | ||||
| 					input_error("System function %s got %d arguments, expected 1.\n", | ||||
| 							RTLIL::unescape_id(str).c_str(), int(children.size())); | ||||
| 
 | ||||
| 				AstNode *countbits = clone(); | ||||
|  | @ -3812,14 +3808,14 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 				for (int i = 2; i < GetSize(dpi_decl->children); i++) | ||||
| 				{ | ||||
| 					if (i-2 >= GetSize(children)) | ||||
| 						log_file_error(filename, location.first_line, "Insufficient number of arguments in DPI function call.\n"); | ||||
| 						input_error("Insufficient number of arguments in DPI function call.\n"); | ||||
| 
 | ||||
| 					argtypes.push_back(RTLIL::unescape_id(dpi_decl->children.at(i)->str)); | ||||
| 					args.push_back(children.at(i-2)->clone()); | ||||
| 					while (args.back()->simplify(true, false, false, stage, -1, false, true)) { } | ||||
| 
 | ||||
| 					if (args.back()->type != AST_CONSTANT && args.back()->type != AST_REALVALUE) | ||||
| 						log_file_error(filename, location.first_line, "Failed to evaluate DPI function with non-constant argument.\n"); | ||||
| 						input_error("Failed to evaluate DPI function with non-constant argument.\n"); | ||||
| 				} | ||||
| 
 | ||||
| 				newNode = dpi_call(rtype, fname, argtypes, args); | ||||
|  | @ -3833,7 +3829,7 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 			if (current_scope.count(str) == 0) | ||||
| 				str = try_pop_module_prefix(); | ||||
| 			if (current_scope.count(str) == 0 || current_scope[str]->type != AST_FUNCTION) | ||||
| 				log_file_error(filename, location.first_line, "Can't resolve function name `%s'.\n", str.c_str()); | ||||
| 				input_error("Can't resolve function name `%s'.\n", str.c_str()); | ||||
| 		} | ||||
| 
 | ||||
| 		if (type == AST_TCALL) | ||||
|  | @ -3841,26 +3837,26 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 			if (str == "$finish" || str == "$stop") | ||||
| 			{ | ||||
| 				if (!current_always || current_always->type != AST_INITIAL) | ||||
| 					log_file_error(filename, location.first_line, "System task `%s' outside initial block is unsupported.\n", str.c_str()); | ||||
| 					input_error("System task `%s' outside initial block is unsupported.\n", str.c_str()); | ||||
| 
 | ||||
| 				log_file_error(filename, location.first_line, "System task `%s' executed.\n", str.c_str()); | ||||
| 				input_error("System task `%s' executed.\n", str.c_str()); | ||||
| 			} | ||||
| 
 | ||||
| 			if (str == "\\$readmemh" || str == "\\$readmemb") | ||||
| 			{ | ||||
| 				if (GetSize(children) < 2 || GetSize(children) > 4) | ||||
| 					log_file_error(filename, location.first_line, "System function %s got %d arguments, expected 2-4.\n", | ||||
| 					input_error("System function %s got %d arguments, expected 2-4.\n", | ||||
| 							RTLIL::unescape_id(str).c_str(), int(children.size())); | ||||
| 
 | ||||
| 				AstNode *node_filename = children[0]->clone(); | ||||
| 				while (node_filename->simplify(true, false, false, stage, width_hint, sign_hint, false)) { } | ||||
| 				if (node_filename->type != AST_CONSTANT) | ||||
| 					log_file_error(filename, location.first_line, "Failed to evaluate system function `%s' with non-constant 1st argument.\n", str.c_str()); | ||||
| 					input_error("Failed to evaluate system function `%s' with non-constant 1st argument.\n", str.c_str()); | ||||
| 
 | ||||
| 				AstNode *node_memory = children[1]->clone(); | ||||
| 				while (node_memory->simplify(true, false, false, stage, width_hint, sign_hint, false)) { } | ||||
| 				if (node_memory->type != AST_IDENTIFIER || node_memory->id2ast == nullptr || node_memory->id2ast->type != AST_MEMORY) | ||||
| 					log_file_error(filename, location.first_line, "Failed to evaluate system function `%s' with non-memory 2nd argument.\n", str.c_str()); | ||||
| 					input_error("Failed to evaluate system function `%s' with non-memory 2nd argument.\n", str.c_str()); | ||||
| 
 | ||||
| 				int start_addr = -1, finish_addr = -1; | ||||
| 
 | ||||
|  | @ -3868,7 +3864,7 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 					AstNode *node_addr = children[2]->clone(); | ||||
| 					while (node_addr->simplify(true, false, false, stage, width_hint, sign_hint, false)) { } | ||||
| 					if (node_addr->type != AST_CONSTANT) | ||||
| 						log_file_error(filename, location.first_line, "Failed to evaluate system function `%s' with non-constant 3rd argument.\n", str.c_str()); | ||||
| 						input_error("Failed to evaluate system function `%s' with non-constant 3rd argument.\n", str.c_str()); | ||||
| 					start_addr = int(node_addr->asInt(false)); | ||||
| 				} | ||||
| 
 | ||||
|  | @ -3876,7 +3872,7 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 					AstNode *node_addr = children[3]->clone(); | ||||
| 					while (node_addr->simplify(true, false, false, stage, width_hint, sign_hint, false)) { } | ||||
| 					if (node_addr->type != AST_CONSTANT) | ||||
| 						log_file_error(filename, location.first_line, "Failed to evaluate system function `%s' with non-constant 4th argument.\n", str.c_str()); | ||||
| 						input_error("Failed to evaluate system function `%s' with non-constant 4th argument.\n", str.c_str()); | ||||
| 					finish_addr = int(node_addr->asInt(false)); | ||||
| 				} | ||||
| 
 | ||||
|  | @ -3906,7 +3902,7 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 			if (current_scope.count(str) == 0) | ||||
| 				str = try_pop_module_prefix(); | ||||
| 			if (current_scope.count(str) == 0 || current_scope[str]->type != AST_TASK) | ||||
| 				log_file_error(filename, location.first_line, "Can't resolve task name `%s'.\n", str.c_str()); | ||||
| 				input_error("Can't resolve task name `%s'.\n", str.c_str()); | ||||
| 		} | ||||
| 
 | ||||
| 
 | ||||
|  | @ -3943,9 +3939,9 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 			} | ||||
| 
 | ||||
| 			if (in_param) | ||||
| 				log_file_error(filename, location.first_line, "Non-constant function call in constant expression.\n"); | ||||
| 				input_error("Non-constant function call in constant expression.\n"); | ||||
| 			if (require_const_eval) | ||||
| 				log_file_error(filename, location.first_line, "Function %s can only be called with constant arguments.\n", str.c_str()); | ||||
| 				input_error("Function %s can only be called with constant arguments.\n", str.c_str()); | ||||
| 		} | ||||
| 
 | ||||
| 		size_t arg_count = 0; | ||||
|  | @ -4066,7 +4062,7 @@ skip_dynamic_range_lvalue_expansion:; | |||
| 									goto tcall_incompatible_wires; | ||||
| 						} else { | ||||
| 					tcall_incompatible_wires: | ||||
| 							log_file_error(filename, location.first_line, "Incompatible re-declaration of wire %s.\n", child->str.c_str()); | ||||
| 							input_error("Incompatible re-declaration of wire %s.\n", child->str.c_str()); | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
|  | @ -4498,7 +4494,7 @@ AstNode *AstNode::readmem(bool is_readmemh, std::string mem_filename, AstNode *m | |||
| 		yosys_input_files.insert(mem_filename); | ||||
| 	} | ||||
| 	if (f.fail() || GetSize(mem_filename) == 0) | ||||
| 		log_file_error(filename, location.first_line, "Can not open file `%s` for %s.\n", mem_filename.c_str(), str.c_str()); | ||||
| 		input_error("Can not open file `%s` for %s.\n", mem_filename.c_str(), str.c_str()); | ||||
| 
 | ||||
| 	log_assert(GetSize(memory->children) == 2 && memory->children[1]->type == AST_RANGE && memory->children[1]->range_valid); | ||||
| 	int range_left =  memory->children[1]->range_left, range_right =  memory->children[1]->range_right; | ||||
|  | @ -4544,7 +4540,7 @@ AstNode *AstNode::readmem(bool is_readmemh, std::string mem_filename, AstNode *m | |||
| 				char *endptr; | ||||
| 				cursor = strtol(nptr, &endptr, 16); | ||||
| 				if (!*nptr || *endptr) | ||||
| 					log_file_error(filename, location.first_line, "Can not parse address `%s` for %s.\n", nptr, str.c_str()); | ||||
| 					input_error("Can not parse address `%s` for %s.\n", nptr, str.c_str()); | ||||
| 				continue; | ||||
| 			} | ||||
| 
 | ||||
|  | @ -4905,7 +4901,7 @@ bool AstNode::mem2reg_check(pool<AstNode*> &mem2reg_set) | |||
| 		return false; | ||||
| 
 | ||||
| 	if (children.empty() || children[0]->type != AST_RANGE || GetSize(children[0]->children) != 1) | ||||
| 		log_file_error(filename, location.first_line, "Invalid array access.\n"); | ||||
| 		input_error("Invalid array access.\n"); | ||||
| 
 | ||||
| 	return true; | ||||
| } | ||||
|  | @ -5339,7 +5335,7 @@ bool AstNode::replace_variables(std::map<std::string, AstNode::varinfo_t> &varia | |||
| 			if (children.size() != 1 || children.at(0)->type != AST_RANGE) { | ||||
| 				if (!must_succeed) | ||||
| 					return false; | ||||
| 				log_file_error(filename, location.first_line, "Memory access in constant function is not supported\n%s: ...called from here.\n", | ||||
| 				input_error("Memory access in constant function is not supported\n%s: ...called from here.\n", | ||||
| 						fcall->loc_string().c_str()); | ||||
| 			} | ||||
| 			if (!children.at(0)->replace_variables(variables, fcall, must_succeed)) | ||||
|  | @ -5348,7 +5344,7 @@ bool AstNode::replace_variables(std::map<std::string, AstNode::varinfo_t> &varia | |||
| 			if (!children.at(0)->range_valid) { | ||||
| 				if (!must_succeed) | ||||
| 					return false; | ||||
| 				log_file_error(filename, location.first_line, "Non-constant range\n%s: ... called from here.\n", | ||||
| 				input_error("Non-constant range\n%s: ... called from here.\n", | ||||
| 						fcall->loc_string().c_str()); | ||||
| 			} | ||||
| 			offset = min(children.at(0)->range_left, children.at(0)->range_right); | ||||
|  | @ -5403,7 +5399,7 @@ AstNode *AstNode::eval_const_function(AstNode *fcall, bool must_succeed) | |||
| 			if (!stmt->range_valid) { | ||||
| 				if (!must_succeed) | ||||
| 					goto finished; | ||||
| 				log_file_error(stmt->filename, stmt->location.first_line, "Can't determine size of variable %s\n%s: ... called from here.\n", | ||||
| 				stmt->input_error("Can't determine size of variable %s\n%s: ... called from here.\n", | ||||
| 						stmt->str.c_str(), fcall->loc_string().c_str()); | ||||
| 			} | ||||
| 			AstNode::varinfo_t &variable = variables[stmt->str]; | ||||
|  | @ -5411,7 +5407,7 @@ AstNode *AstNode::eval_const_function(AstNode *fcall, bool must_succeed) | |||
| 			// if this variable has already been declared as an input, check the
 | ||||
| 			// sizes match if it already had an explicit size
 | ||||
| 			if (variable.arg && variable.explicitly_sized && variable.val.size() != width) { | ||||
| 				log_file_error(filename, location.first_line, "Incompatible re-declaration of constant function wire %s.\n", stmt->str.c_str()); | ||||
| 				input_error("Incompatible re-declaration of constant function wire %s.\n", stmt->str.c_str()); | ||||
| 			} | ||||
| 			variable.val = RTLIL::Const(RTLIL::State::Sx, width); | ||||
| 			variable.offset = stmt->range_swapped ? stmt->range_left : stmt->range_right; | ||||
|  | @ -5468,21 +5464,21 @@ AstNode *AstNode::eval_const_function(AstNode *fcall, bool must_succeed) | |||
| 			if (stmt->children.at(1)->type != AST_CONSTANT) { | ||||
| 				if (!must_succeed) | ||||
| 					goto finished; | ||||
| 				log_file_error(stmt->filename, stmt->location.first_line, "Non-constant expression in constant function\n%s: ... called from here. X\n", | ||||
| 				stmt->input_error("Non-constant expression in constant function\n%s: ... called from here. X\n", | ||||
| 						fcall->loc_string().c_str()); | ||||
| 			} | ||||
| 
 | ||||
| 			if (stmt->children.at(0)->type != AST_IDENTIFIER) { | ||||
| 				if (!must_succeed) | ||||
| 					goto finished; | ||||
| 				log_file_error(stmt->filename, stmt->location.first_line, "Unsupported composite left hand side in constant function\n%s: ... called from here.\n", | ||||
| 				stmt->input_error("Unsupported composite left hand side in constant function\n%s: ... called from here.\n", | ||||
| 						fcall->loc_string().c_str()); | ||||
| 			} | ||||
| 
 | ||||
| 			if (!variables.count(stmt->children.at(0)->str)) { | ||||
| 				if (!must_succeed) | ||||
| 					goto finished; | ||||
| 				log_file_error(stmt->filename, stmt->location.first_line, "Assignment to non-local variable in constant function\n%s: ... called from here.\n", | ||||
| 				stmt->input_error("Assignment to non-local variable in constant function\n%s: ... called from here.\n", | ||||
| 						fcall->loc_string().c_str()); | ||||
| 			} | ||||
| 
 | ||||
|  | @ -5493,8 +5489,7 @@ AstNode *AstNode::eval_const_function(AstNode *fcall, bool must_succeed) | |||
| 				if (!range->range_valid) { | ||||
| 					if (!must_succeed) | ||||
| 						goto finished; | ||||
| 					log_file_error(range->filename, range->location.first_line, "Non-constant range\n%s: ... called from here.\n", | ||||
| 							fcall->loc_string().c_str()); | ||||
| 					range->input_error("Non-constant range\n%s: ... called from here.\n", fcall->loc_string().c_str()); | ||||
| 				} | ||||
| 				int offset = min(range->range_left, range->range_right); | ||||
| 				int width = std::abs(range->range_left - range->range_right) + 1; | ||||
|  | @ -5533,7 +5528,7 @@ AstNode *AstNode::eval_const_function(AstNode *fcall, bool must_succeed) | |||
| 			if (cond->type != AST_CONSTANT) { | ||||
| 				if (!must_succeed) | ||||
| 					goto finished; | ||||
| 				log_file_error(stmt->filename, stmt->location.first_line, "Non-constant expression in constant function\n%s: ... called from here.\n", | ||||
| 				stmt->input_error("Non-constant expression in constant function\n%s: ... called from here.\n", | ||||
| 						fcall->loc_string().c_str()); | ||||
| 			} | ||||
| 
 | ||||
|  | @ -5558,7 +5553,7 @@ AstNode *AstNode::eval_const_function(AstNode *fcall, bool must_succeed) | |||
| 			if (num->type != AST_CONSTANT) { | ||||
| 				if (!must_succeed) | ||||
| 					goto finished; | ||||
| 				log_file_error(stmt->filename, stmt->location.first_line, "Non-constant expression in constant function\n%s: ... called from here.\n", | ||||
| 				stmt->input_error("Non-constant expression in constant function\n%s: ... called from here.\n", | ||||
| 						fcall->loc_string().c_str()); | ||||
| 			} | ||||
| 
 | ||||
|  | @ -5601,7 +5596,7 @@ AstNode *AstNode::eval_const_function(AstNode *fcall, bool must_succeed) | |||
| 					if (cond->type != AST_CONSTANT) { | ||||
| 						if (!must_succeed) | ||||
| 							goto finished; | ||||
| 						log_file_error(stmt->filename, stmt->location.first_line, "Non-constant expression in constant function\n%s: ... called from here.\n", | ||||
| 						stmt->input_error("Non-constant expression in constant function\n%s: ... called from here.\n", | ||||
| 								fcall->loc_string().c_str()); | ||||
| 					} | ||||
| 
 | ||||
|  | @ -5637,7 +5632,7 @@ AstNode *AstNode::eval_const_function(AstNode *fcall, bool must_succeed) | |||
| 
 | ||||
| 		if (!must_succeed) | ||||
| 			goto finished; | ||||
| 		log_file_error(stmt->filename, stmt->location.first_line, "Unsupported language construct in constant function\n%s: ... called from here.\n", | ||||
| 		stmt->input_error("Unsupported language construct in constant function\n%s: ... called from here.\n", | ||||
| 				fcall->loc_string().c_str()); | ||||
| 		log_abort(); | ||||
| 	} | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue