mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-03 21:09:12 +00:00 
			
		
		
		
	ast/simplify: Retire in_lvalue/in_param arguments to simplify
This commit is contained in:
		
							parent
							
								
									22b99413e8
								
							
						
					
					
						commit
						a511976b48
					
				
					 4 changed files with 110 additions and 119 deletions
				
			
		| 
						 | 
				
			
			@ -1078,7 +1078,7 @@ static RTLIL::Module *process_module(RTLIL::Design *design, AstNode *ast, bool d
 | 
			
		|||
		// simplify this module or interface using the current design as context
 | 
			
		||||
		// for lookup up ports and wires within cells
 | 
			
		||||
		set_simplify_design_context(design);
 | 
			
		||||
		while (ast->simplify(!flag_noopt, false, 0, -1, false, false)) { }
 | 
			
		||||
		while (ast->simplify(!flag_noopt, 0, -1, false)) { }
 | 
			
		||||
		set_simplify_design_context(nullptr);
 | 
			
		||||
 | 
			
		||||
		if (flag_dump_ast2) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1380,7 +1380,7 @@ void AST::process(RTLIL::Design *design, AstNode *ast, bool dump_ast1, bool dump
 | 
			
		|||
		}
 | 
			
		||||
		else if (child->type == AST_PACKAGE) {
 | 
			
		||||
			// process enum/other declarations
 | 
			
		||||
			child->simplify(true, false, 1, -1, false, false);
 | 
			
		||||
			child->simplify(true, 1, -1, false);
 | 
			
		||||
			rename_in_package_stmts(child);
 | 
			
		||||
			design->verilog_packages.push_back(child->clone());
 | 
			
		||||
			current_scope.clear();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -258,7 +258,7 @@ namespace AST
 | 
			
		|||
 | 
			
		||||
		// simplify() creates a simpler AST by unrolling for-loops, expanding generate blocks, etc.
 | 
			
		||||
		// it also sets the id2ast pointers so that identifier lookups are fast in genRTLIL()
 | 
			
		||||
		bool simplify(bool const_fold, bool in_lvalue, int stage, int width_hint, bool sign_hint, bool in_param);
 | 
			
		||||
		bool simplify(bool const_fold, int stage, int width_hint, bool sign_hint);
 | 
			
		||||
		void replace_result_wire_name_in_function(const std::string &from, const std::string &to);
 | 
			
		||||
		AstNode *readmem(bool is_readmemh, std::string mem_filename, AstNode *memory, int start_addr, int finish_addr, bool unconditional_init);
 | 
			
		||||
		void expand_genblock(const std::string &prefix);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -180,7 +180,7 @@ struct AST_INTERNAL::LookaheadRewriter
 | 
			
		|||
				wire->str = stringf("$lookahead%s$%d", node->str.c_str(), autoidx++);
 | 
			
		||||
				wire->set_attribute(ID::nosync, AstNode::mkconst_int(1, false));
 | 
			
		||||
				wire->is_logic = true;
 | 
			
		||||
				while (wire->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
				while (wire->simplify(true, 1, -1, false)) { }
 | 
			
		||||
				current_ast_mod->children.push_back(wire);
 | 
			
		||||
				lookaheadids[node->str] = make_pair(node->id2ast, wire);
 | 
			
		||||
				wire->genRTLIL();
 | 
			
		||||
| 
						 | 
				
			
			@ -927,7 +927,7 @@ void AstNode::detectSignWidthWorker(int &width_hint, bool &sign_hint, bool *foun
 | 
			
		|||
				this_width = id_ast->children[1]->range_left - id_ast->children[1]->range_right + 1;
 | 
			
		||||
			} else {
 | 
			
		||||
				if (id_ast->children[0]->type != AST_CONSTANT)
 | 
			
		||||
					while (id_ast->simplify(true, false, 1, -1, false, true)) { }
 | 
			
		||||
					while (id_ast->simplify(true, 1, -1, false)) { }
 | 
			
		||||
				if (id_ast->children[0]->type == AST_CONSTANT)
 | 
			
		||||
					this_width = id_ast->children[0]->bits.size();
 | 
			
		||||
				else
 | 
			
		||||
| 
						 | 
				
			
			@ -971,8 +971,8 @@ void AstNode::detectSignWidthWorker(int &width_hint, bool &sign_hint, bool *foun
 | 
			
		|||
			else if (!range->range_valid) {
 | 
			
		||||
				AstNode *left_at_zero_ast = children[0]->children[0]->clone_at_zero();
 | 
			
		||||
				AstNode *right_at_zero_ast = children[0]->children.size() >= 2 ? children[0]->children[1]->clone_at_zero() : left_at_zero_ast->clone();
 | 
			
		||||
				while (left_at_zero_ast->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
				while (right_at_zero_ast->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
				while (left_at_zero_ast->simplify(true, 1, -1, false)) { }
 | 
			
		||||
				while (right_at_zero_ast->simplify(true, 1, -1, false)) { }
 | 
			
		||||
				if (left_at_zero_ast->type != AST_CONSTANT || right_at_zero_ast->type != AST_CONSTANT)
 | 
			
		||||
					input_error("Unsupported expression on dynamic range select on signal `%s'!\n", str.c_str());
 | 
			
		||||
				this_width = abs(int(left_at_zero_ast->integer - right_at_zero_ast->integer)) + 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -988,7 +988,7 @@ void AstNode::detectSignWidthWorker(int &width_hint, bool &sign_hint, bool *foun
 | 
			
		|||
		break;
 | 
			
		||||
 | 
			
		||||
	case AST_TO_BITS:
 | 
			
		||||
		while (children[0]->simplify(true, false, 1, -1, false, false) == true) { }
 | 
			
		||||
		while (children[0]->simplify(true, 1, -1, false) == true) { }
 | 
			
		||||
		if (children[0]->type != AST_CONSTANT)
 | 
			
		||||
			input_error("Left operand of tobits expression is not constant!\n");
 | 
			
		||||
		children[1]->detectSignWidthWorker(sub_width_hint, sign_hint);
 | 
			
		||||
| 
						 | 
				
			
			@ -1010,7 +1010,7 @@ void AstNode::detectSignWidthWorker(int &width_hint, bool &sign_hint, bool *foun
 | 
			
		|||
		break;
 | 
			
		||||
 | 
			
		||||
	case AST_CAST_SIZE:
 | 
			
		||||
		while (children.at(0)->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
		while (children.at(0)->simplify(true, 1, -1, false)) { }
 | 
			
		||||
		if (children.at(0)->type != AST_CONSTANT)
 | 
			
		||||
			input_error("Static cast with non constant expression!\n");
 | 
			
		||||
		children.at(1)->detectSignWidthWorker(width_hint, sign_hint);
 | 
			
		||||
| 
						 | 
				
			
			@ -1032,7 +1032,7 @@ void AstNode::detectSignWidthWorker(int &width_hint, bool &sign_hint, bool *foun
 | 
			
		|||
		break;
 | 
			
		||||
 | 
			
		||||
	case AST_REPLICATE:
 | 
			
		||||
		while (children[0]->simplify(true, false, 1, -1, false, true) == true) { }
 | 
			
		||||
		while (children[0]->simplify(true, 1, -1, false) == true) { }
 | 
			
		||||
		if (children[0]->type != AST_CONSTANT)
 | 
			
		||||
			input_error("Left operand of replicate expression is not constant!\n");
 | 
			
		||||
		children[1]->detectSignWidthWorker(sub_width_hint, sub_sign_hint);
 | 
			
		||||
| 
						 | 
				
			
			@ -1144,7 +1144,7 @@ void AstNode::detectSignWidthWorker(int &width_hint, bool &sign_hint, bool *foun
 | 
			
		|||
	case AST_PREFIX:
 | 
			
		||||
		// Prefix nodes always resolve to identifiers in generate loops, so we
 | 
			
		||||
		// can simply perform the resolution to determine the sign and width.
 | 
			
		||||
		simplify(true, false, 1, -1, false, false);
 | 
			
		||||
		simplify(true, 1, -1, false);
 | 
			
		||||
		log_assert(type == AST_IDENTIFIER);
 | 
			
		||||
		detectSignWidthWorker(width_hint, sign_hint, found_real);
 | 
			
		||||
		break;
 | 
			
		||||
| 
						 | 
				
			
			@ -1152,7 +1152,7 @@ void AstNode::detectSignWidthWorker(int &width_hint, bool &sign_hint, bool *foun
 | 
			
		|||
	case AST_FCALL:
 | 
			
		||||
		if (str == "\\$anyconst" || str == "\\$anyseq" || str == "\\$allconst" || str == "\\$allseq") {
 | 
			
		||||
			if (GetSize(children) == 1) {
 | 
			
		||||
				while (children[0]->simplify(true, false, 1, -1, false, true) == true) { }
 | 
			
		||||
				while (children[0]->simplify(true, 1, -1, false) == true) { }
 | 
			
		||||
				if (children[0]->type != AST_CONSTANT)
 | 
			
		||||
					input_error("System function %s called with non-const argument!\n",
 | 
			
		||||
							RTLIL::unescape_id(str).c_str());
 | 
			
		||||
| 
						 | 
				
			
			@ -1201,8 +1201,8 @@ void AstNode::detectSignWidthWorker(int &width_hint, bool &sign_hint, bool *foun
 | 
			
		|||
				AstNode *right = range->children.at(1)->clone();
 | 
			
		||||
				left->set_in_param_flag(true);
 | 
			
		||||
				right->set_in_param_flag(true);
 | 
			
		||||
				while (left->simplify(true, in_lvalue, 1, -1, false, true)) { }
 | 
			
		||||
				while (right->simplify(true, in_lvalue, 1, -1, false, true)) { }
 | 
			
		||||
				while (left->simplify(true, 1, -1, false)) { }
 | 
			
		||||
				while (right->simplify(true, 1, -1, false)) { }
 | 
			
		||||
				if (left->type != AST_CONSTANT || right->type != AST_CONSTANT)
 | 
			
		||||
					input_error("Function %s has non-constant width!",
 | 
			
		||||
							RTLIL::unescape_id(str).c_str());
 | 
			
		||||
| 
						 | 
				
			
			@ -1546,8 +1546,8 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)
 | 
			
		|||
				if (!children[0]->range_valid) {
 | 
			
		||||
					AstNode *left_at_zero_ast = children[0]->children[0]->clone_at_zero();
 | 
			
		||||
					AstNode *right_at_zero_ast = children[0]->children.size() >= 2 ? children[0]->children[1]->clone_at_zero() : left_at_zero_ast->clone();
 | 
			
		||||
					while (left_at_zero_ast->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
					while (right_at_zero_ast->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
					while (left_at_zero_ast->simplify(true, 1, -1, false)) { }
 | 
			
		||||
					while (right_at_zero_ast->simplify(true, 1, -1, false)) { }
 | 
			
		||||
					if (left_at_zero_ast->type != AST_CONSTANT || right_at_zero_ast->type != AST_CONSTANT)
 | 
			
		||||
						input_error("Unsupported expression on dynamic range select on signal `%s'!\n", str.c_str());
 | 
			
		||||
					int width = abs(int(left_at_zero_ast->integer - right_at_zero_ast->integer)) + 1;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -136,7 +136,7 @@ Fmt AstNode::processFormat(int stage, bool sformat_like, int default_base, size_
 | 
			
		|||
	std::vector<VerilogFmtArg> args;
 | 
			
		||||
	for (size_t index = first_arg_at; index < children.size(); index++) {
 | 
			
		||||
		AstNode *node_arg = children[index];
 | 
			
		||||
		while (node_arg->simplify(true, false, stage, -1, false, in_param)) { }
 | 
			
		||||
		while (node_arg->simplify(true, stage, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
		VerilogFmtArg arg = {};
 | 
			
		||||
		arg.filename = filename;
 | 
			
		||||
| 
						 | 
				
			
			@ -180,7 +180,7 @@ void AstNode::annotateTypedEnums(AstNode *template_node)
 | 
			
		|||
		log_assert(current_scope.count(enum_type) == 1);
 | 
			
		||||
		AstNode *enum_node = current_scope.at(enum_type);
 | 
			
		||||
		log_assert(enum_node->type == AST_ENUM);
 | 
			
		||||
		while (enum_node->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
		while (enum_node->simplify(true, 1, -1, false)) { }
 | 
			
		||||
		//get width from 1st enum item:
 | 
			
		||||
		log_assert(enum_node->children.size() >= 1);
 | 
			
		||||
		AstNode *enum_item0 = enum_node->children[0];
 | 
			
		||||
| 
						 | 
				
			
			@ -814,8 +814,8 @@ static bool try_determine_range_width(AstNode *range, int &result_width)
 | 
			
		|||
	AstNode *left_at_zero_ast = range->children[0]->clone_at_zero();
 | 
			
		||||
	AstNode *right_at_zero_ast = range->children[1]->clone_at_zero();
 | 
			
		||||
 | 
			
		||||
	while (left_at_zero_ast->simplify(true, false, 1, -1, false, false)) {}
 | 
			
		||||
	while (right_at_zero_ast->simplify(true, false, 1, -1, false, false)) {}
 | 
			
		||||
	while (left_at_zero_ast->simplify(true, 1, -1, false)) {}
 | 
			
		||||
	while (right_at_zero_ast->simplify(true, 1, -1, false)) {}
 | 
			
		||||
 | 
			
		||||
	bool ok = false;
 | 
			
		||||
	if (left_at_zero_ast->type == AST_CONSTANT
 | 
			
		||||
| 
						 | 
				
			
			@ -899,7 +899,7 @@ static void check_auto_nosync(AstNode *node)
 | 
			
		|||
//
 | 
			
		||||
// this function also does all name resolving and sets the id2ast member of all
 | 
			
		||||
// nodes that link to a different node using names and lexical scoping.
 | 
			
		||||
bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hint, bool sign_hint, bool in_param_)
 | 
			
		||||
bool AstNode::simplify(bool const_fold, int stage, int width_hint, bool sign_hint)
 | 
			
		||||
{
 | 
			
		||||
	static int recursion_counter = 0;
 | 
			
		||||
	static bool deep_recursion_warning = false;
 | 
			
		||||
| 
						 | 
				
			
			@ -917,8 +917,8 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
#if 0
 | 
			
		||||
	log("-------------\n");
 | 
			
		||||
	log("AST simplify[%d] depth %d at %s:%d on %s %p:\n", stage, recursion_counter, filename.c_str(), location.first_line, type2str(type).c_str(), this);
 | 
			
		||||
	log("const_fold=%d, in_lvalue=%d, stage=%d, width_hint=%d, sign_hint=%d, in_param=%d\n",
 | 
			
		||||
			int(const_fold), int(in_lvalue), int(stage), int(width_hint), int(sign_hint), int(in_param));
 | 
			
		||||
	log("const_fold=%d, stage=%d, width_hint=%d, sign_hint=%d\n",
 | 
			
		||||
			int(const_fold), int(stage), int(width_hint), int(sign_hint));
 | 
			
		||||
	// dumpAst(NULL, "> ");
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -927,7 +927,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
		log_assert(type == AST_MODULE || type == AST_INTERFACE);
 | 
			
		||||
 | 
			
		||||
		deep_recursion_warning = true;
 | 
			
		||||
		while (simplify(const_fold, in_lvalue, 1, width_hint, sign_hint, in_param)) { }
 | 
			
		||||
		while (simplify(const_fold, 1, width_hint, sign_hint)) { }
 | 
			
		||||
 | 
			
		||||
		if (!flag_nomem2reg && !get_bool_attribute(ID::nomem2reg))
 | 
			
		||||
		{
 | 
			
		||||
| 
						 | 
				
			
			@ -1010,7 +1010,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
					reg->filename = node->filename;
 | 
			
		||||
					reg->location = node->location;
 | 
			
		||||
					children.push_back(reg);
 | 
			
		||||
					while (reg->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
					while (reg->simplify(true, 1, -1, false)) { }
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1024,7 +1024,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
				delete node;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		while (simplify(const_fold, in_lvalue, 2, width_hint, sign_hint, in_param)) { }
 | 
			
		||||
		while (simplify(const_fold, 2, width_hint, sign_hint)) { }
 | 
			
		||||
		recursion_counter--;
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -1071,7 +1071,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
			// when $display()/$write() functions are used in an always block, simplify the expressions and
 | 
			
		||||
			// convert them to a special cell later in genrtlil
 | 
			
		||||
			for (auto node : children)
 | 
			
		||||
				while (node->simplify(true, false, stage, -1, false, in_param)) {}
 | 
			
		||||
				while (node->simplify(true, stage, -1, false)) {}
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1085,12 +1085,6 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
	if (type == AST_IDENTIFIER && current_scope.count(str) > 0 && (current_scope[str]->type == AST_PARAMETER || current_scope[str]->type == AST_LOCALPARAM || current_scope[str]->type == AST_ENUM_ITEM))
 | 
			
		||||
		const_fold = true;
 | 
			
		||||
 | 
			
		||||
	// in certain cases a function must be evaluated constant. this is what in_param controls.
 | 
			
		||||
	if (type == AST_PARAMETER || type == AST_LOCALPARAM || type == AST_DEFPARAM || type == AST_PARASET || type == AST_PREFIX)
 | 
			
		||||
		in_param_ = true;
 | 
			
		||||
	log_assert(in_param == in_param_);
 | 
			
		||||
	log_assert(in_lvalue == in_lvalue_);
 | 
			
		||||
 | 
			
		||||
	std::map<std::string, AstNode*> backup_scope;
 | 
			
		||||
 | 
			
		||||
	// create name resolution entries for all objects with names
 | 
			
		||||
| 
						 | 
				
			
			@ -1193,12 +1187,12 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
		for (size_t i = 0; i < children.size(); i++) {
 | 
			
		||||
			AstNode *node = children[i];
 | 
			
		||||
			if (node->type == AST_PARAMETER || node->type == AST_LOCALPARAM || node->type == AST_WIRE || node->type == AST_AUTOWIRE || node->type == AST_MEMORY || node->type == AST_TYPEDEF)
 | 
			
		||||
				while (node->simplify(true, false, 1, -1, false, node->type == AST_PARAMETER || node->type == AST_LOCALPARAM))
 | 
			
		||||
				while (node->simplify(true, 1, -1, false))
 | 
			
		||||
					did_something = true;
 | 
			
		||||
			if (node->type == AST_ENUM) {
 | 
			
		||||
				for (auto enode : node->children){
 | 
			
		||||
					log_assert(enode->type==AST_ENUM_ITEM);
 | 
			
		||||
					while (node->simplify(true, false, 1, -1, false, in_param))
 | 
			
		||||
					while (node->simplify(true, 1, -1, false))
 | 
			
		||||
						did_something = true;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -1263,7 +1257,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
		for (AstNode *child : children) {
 | 
			
		||||
			// simplify any parameters to constants
 | 
			
		||||
			if (child->type == AST_PARASET)
 | 
			
		||||
				while (child->simplify(true, false, 1, -1, false, true)) { }
 | 
			
		||||
				while (child->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
			// look for patterns which _may_ indicate ambiguity requiring
 | 
			
		||||
			// resolution of the underlying module
 | 
			
		||||
| 
						 | 
				
			
			@ -1378,9 +1372,9 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
	case AST_ASSIGN_EQ:
 | 
			
		||||
	case AST_ASSIGN_LE:
 | 
			
		||||
	case AST_ASSIGN:
 | 
			
		||||
		while (!children[0]->basic_prep && children[0]->simplify(false, true, stage, -1, false, in_param) == true)
 | 
			
		||||
		while (!children[0]->basic_prep && children[0]->simplify(false, stage, -1, false) == true)
 | 
			
		||||
			did_something = true;
 | 
			
		||||
		while (!children[1]->basic_prep && children[1]->simplify(false, false, stage, -1, false, in_param) == true)
 | 
			
		||||
		while (!children[1]->basic_prep && children[1]->simplify(false, stage, -1, false) == true)
 | 
			
		||||
			did_something = true;
 | 
			
		||||
		children[0]->detectSignWidth(backup_width_hint, backup_sign_hint);
 | 
			
		||||
		children[1]->detectSignWidth(width_hint, sign_hint);
 | 
			
		||||
| 
						 | 
				
			
			@ -1416,7 +1410,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
		if (!basic_prep) {
 | 
			
		||||
			for (auto *node : children) {
 | 
			
		||||
				// resolve any ranges
 | 
			
		||||
				while (!node->basic_prep && node->simplify(true, false, stage, -1, false, false)) {
 | 
			
		||||
				while (!node->basic_prep && node->simplify(true, stage, -1, false)) {
 | 
			
		||||
					did_something = true;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -1449,7 +1443,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
			AstNode *template_node = resolved_type_node->children[0];
 | 
			
		||||
 | 
			
		||||
			// Ensure typedef itself is fully simplified
 | 
			
		||||
			while (template_node->simplify(const_fold, in_lvalue, stage, width_hint, sign_hint, in_param)) {};
 | 
			
		||||
			while (template_node->simplify(const_fold, stage, width_hint, sign_hint)) {};
 | 
			
		||||
 | 
			
		||||
			// Remove type reference
 | 
			
		||||
			delete children[0];
 | 
			
		||||
| 
						 | 
				
			
			@ -1495,7 +1489,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
		//log("\nENUM %s: %d child %d\n", str.c_str(), basic_prep, children[0]->basic_prep);
 | 
			
		||||
		if (!basic_prep) {
 | 
			
		||||
			for (auto item_node : children) {
 | 
			
		||||
				while (!item_node->basic_prep && item_node->simplify(false, false, stage, -1, false, in_param))
 | 
			
		||||
				while (!item_node->basic_prep && item_node->simplify(false, stage, -1, false))
 | 
			
		||||
					did_something = true;
 | 
			
		||||
			}
 | 
			
		||||
			// allocate values (called more than once)
 | 
			
		||||
| 
						 | 
				
			
			@ -1515,11 +1509,11 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
				add_members_to_scope(attributes[ID::wiretype], str);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		while (!children[0]->basic_prep && children[0]->simplify(false, false, stage, -1, false, true) == true)
 | 
			
		||||
		while (!children[0]->basic_prep && children[0]->simplify(false, stage, -1, false) == true)
 | 
			
		||||
			did_something = true;
 | 
			
		||||
		children[0]->detectSignWidth(width_hint, sign_hint);
 | 
			
		||||
		if (children.size() > 1 && children[1]->type == AST_RANGE) {
 | 
			
		||||
			while (!children[1]->basic_prep && children[1]->simplify(false, false, stage, -1, false, true) == true)
 | 
			
		||||
			while (!children[1]->basic_prep && children[1]->simplify(false, stage, -1, false) == true)
 | 
			
		||||
				did_something = true;
 | 
			
		||||
			if (!children[1]->range_valid)
 | 
			
		||||
				input_error("Non-constant width range on parameter decl.\n");
 | 
			
		||||
| 
						 | 
				
			
			@ -1527,11 +1521,11 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
		}
 | 
			
		||||
		break;
 | 
			
		||||
	case AST_ENUM_ITEM:
 | 
			
		||||
		while (!children[0]->basic_prep && children[0]->simplify(false, false, stage, -1, false, in_param))
 | 
			
		||||
		while (!children[0]->basic_prep && children[0]->simplify(false, stage, -1, false))
 | 
			
		||||
			did_something = true;
 | 
			
		||||
		children[0]->detectSignWidth(width_hint, sign_hint);
 | 
			
		||||
		if (children.size() > 1 && children[1]->type == AST_RANGE) {
 | 
			
		||||
			while (!children[1]->basic_prep && children[1]->simplify(false, false, stage, -1, false, in_param))
 | 
			
		||||
			while (!children[1]->basic_prep && children[1]->simplify(false, stage, -1, false))
 | 
			
		||||
				did_something = true;
 | 
			
		||||
			if (!children[1]->range_valid)
 | 
			
		||||
				input_error("Non-constant width range on enum item decl.\n");
 | 
			
		||||
| 
						 | 
				
			
			@ -1590,7 +1584,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
		width_hint = -1;
 | 
			
		||||
		sign_hint = true;
 | 
			
		||||
		for (auto child : children) {
 | 
			
		||||
			while (!child->basic_prep && child->simplify(false, in_lvalue, stage, -1, false, in_param) == true)
 | 
			
		||||
			while (!child->basic_prep && child->simplify(false, stage, -1, false) == true)
 | 
			
		||||
				did_something = true;
 | 
			
		||||
			child->detectSignWidthWorker(width_hint, sign_hint);
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -1625,10 +1619,10 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
 | 
			
		||||
	if (detect_width_simple && width_hint < 0) {
 | 
			
		||||
		if (type == AST_REPLICATE)
 | 
			
		||||
			while (children[0]->simplify(true, in_lvalue, stage, -1, false, true) == true)
 | 
			
		||||
			while (children[0]->simplify(true, stage, -1, false) == true)
 | 
			
		||||
				did_something = true;
 | 
			
		||||
		for (auto child : children)
 | 
			
		||||
			while (!child->basic_prep && child->simplify(false, in_lvalue, stage, -1, false, in_param) == true)
 | 
			
		||||
			while (!child->basic_prep && child->simplify(false, stage, -1, false) == true)
 | 
			
		||||
				did_something = true;
 | 
			
		||||
		detectSignWidth(width_hint, sign_hint);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -1638,18 +1632,18 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
 | 
			
		||||
	if (type == AST_TERNARY) {
 | 
			
		||||
		if (width_hint < 0) {
 | 
			
		||||
			while (!children[0]->basic_prep && children[0]->simplify(true, in_lvalue, stage, -1, false, in_param))
 | 
			
		||||
			while (!children[0]->basic_prep && children[0]->simplify(true, stage, -1, false))
 | 
			
		||||
				did_something = true;
 | 
			
		||||
 | 
			
		||||
			bool backup_unevaluated_tern_branch = unevaluated_tern_branch;
 | 
			
		||||
			AstNode *chosen = get_tern_choice().first;
 | 
			
		||||
 | 
			
		||||
			unevaluated_tern_branch = backup_unevaluated_tern_branch || chosen == children[2];
 | 
			
		||||
			while (!children[1]->basic_prep && children[1]->simplify(false, in_lvalue, stage, -1, false, in_param))
 | 
			
		||||
			while (!children[1]->basic_prep && children[1]->simplify(false, stage, -1, false))
 | 
			
		||||
				did_something = true;
 | 
			
		||||
 | 
			
		||||
			unevaluated_tern_branch = backup_unevaluated_tern_branch || chosen == children[1];
 | 
			
		||||
			while (!children[2]->basic_prep && children[2]->simplify(false, in_lvalue, stage, -1, false, in_param))
 | 
			
		||||
			while (!children[2]->basic_prep && children[2]->simplify(false, stage, -1, false))
 | 
			
		||||
				did_something = true;
 | 
			
		||||
 | 
			
		||||
			unevaluated_tern_branch = backup_unevaluated_tern_branch;
 | 
			
		||||
| 
						 | 
				
			
			@ -1681,7 +1675,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
	if (const_fold && type == AST_CASE)
 | 
			
		||||
	{
 | 
			
		||||
		detectSignWidth(width_hint, sign_hint);
 | 
			
		||||
		while (children[0]->simplify(const_fold, in_lvalue, stage, width_hint, sign_hint, in_param)) { }
 | 
			
		||||
		while (children[0]->simplify(const_fold, stage, width_hint, sign_hint)) { }
 | 
			
		||||
		if (children[0]->type == AST_CONSTANT && children[0]->bits_only_01()) {
 | 
			
		||||
			children[0]->is_signed = sign_hint;
 | 
			
		||||
			RTLIL::Const case_expr = children[0]->bitsAsConst(width_hint, sign_hint);
 | 
			
		||||
| 
						 | 
				
			
			@ -1695,7 +1689,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
						goto keep_const_cond;
 | 
			
		||||
					if (v->type == AST_BLOCK)
 | 
			
		||||
						continue;
 | 
			
		||||
					while (v->simplify(const_fold, in_lvalue, stage, width_hint, sign_hint, in_param)) { }
 | 
			
		||||
					while (v->simplify(const_fold, stage, width_hint, sign_hint)) { }
 | 
			
		||||
					if (v->type == AST_CONSTANT && v->bits_only_01()) {
 | 
			
		||||
						RTLIL::Const case_item_expr = v->bitsAsConst(width_hint, sign_hint);
 | 
			
		||||
						RTLIL::Const match = const_eq(case_expr, case_item_expr, sign_hint, sign_hint, 1);
 | 
			
		||||
| 
						 | 
				
			
			@ -1752,20 +1746,18 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
			unevaluated_tern_branch = chosen && chosen != children[i];
 | 
			
		||||
		}
 | 
			
		||||
		while (did_something_here && i < children.size()) {
 | 
			
		||||
			bool const_fold_here = const_fold, in_lvalue_here = in_lvalue;
 | 
			
		||||
			bool const_fold_here = const_fold;
 | 
			
		||||
			int width_hint_here = width_hint;
 | 
			
		||||
			bool sign_hint_here = sign_hint;
 | 
			
		||||
			bool in_param_here = in_param;
 | 
			
		||||
			if (i == 0 && (type == AST_REPLICATE || type == AST_WIRE))
 | 
			
		||||
				const_fold_here = true, in_param_here = true;
 | 
			
		||||
				const_fold_here = true;
 | 
			
		||||
			if (i == 0 && (type == AST_GENIF || type == AST_GENCASE))
 | 
			
		||||
				in_param_here = true;
 | 
			
		||||
			if (i == 1 && (type == AST_FOR || type == AST_GENFOR))
 | 
			
		||||
				in_param_here = true;
 | 
			
		||||
			if (type == AST_PARAMETER || type == AST_LOCALPARAM)
 | 
			
		||||
				const_fold_here = true;
 | 
			
		||||
			if (i == 0 && (type == AST_ASSIGN || type == AST_ASSIGN_EQ || type == AST_ASSIGN_LE))
 | 
			
		||||
				in_lvalue_here = true;
 | 
			
		||||
			if (type == AST_BLOCK) {
 | 
			
		||||
				current_block = this;
 | 
			
		||||
				current_block_child = children[i];
 | 
			
		||||
| 
						 | 
				
			
			@ -1780,7 +1772,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
				width_hint_here = -1, sign_hint_here = false;
 | 
			
		||||
			if (children_are_self_determined)
 | 
			
		||||
				width_hint_here = -1, sign_hint_here = false;
 | 
			
		||||
			did_something_here = children[i]->simplify(const_fold_here, in_lvalue_here, stage, width_hint_here, sign_hint_here, in_param_here);
 | 
			
		||||
			did_something_here = children[i]->simplify(const_fold_here, stage, width_hint_here, sign_hint_here);
 | 
			
		||||
			if (did_something_here)
 | 
			
		||||
				did_something = true;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -1800,7 +1792,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
	for (auto &attr : attributes) {
 | 
			
		||||
		while (attr.second->simplify(true, false, stage, -1, false, true))
 | 
			
		||||
		while (attr.second->simplify(true, stage, -1, false))
 | 
			
		||||
			did_something = true;
 | 
			
		||||
	}
 | 
			
		||||
	if (type == AST_CASE && stage == 2) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1878,7 +1870,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
		log_assert(children.size() == 1);
 | 
			
		||||
		auto type_node = children[0];
 | 
			
		||||
		log_assert(type_node->type == AST_WIRE || type_node->type == AST_MEMORY || type_node->type == AST_STRUCT || type_node->type == AST_UNION);
 | 
			
		||||
		while (type_node->simplify(const_fold, in_lvalue, stage, width_hint, sign_hint, in_param)) {
 | 
			
		||||
		while (type_node->simplify(const_fold, stage, width_hint, sign_hint)) {
 | 
			
		||||
			did_something = true;
 | 
			
		||||
		}
 | 
			
		||||
		log_assert(!type_node->is_custom_type);
 | 
			
		||||
| 
						 | 
				
			
			@ -1900,7 +1892,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
			AstNode *template_node = resolved_type_node->children[0];
 | 
			
		||||
 | 
			
		||||
			// Ensure typedef itself is fully simplified
 | 
			
		||||
			while (template_node->simplify(const_fold, in_lvalue, stage, width_hint, sign_hint, false)) {};
 | 
			
		||||
			while (template_node->simplify(const_fold, stage, width_hint, sign_hint)) {};
 | 
			
		||||
 | 
			
		||||
			if (!str.empty() && str[0] == '\\' && (template_node->type == AST_STRUCT || template_node->type == AST_UNION)) {
 | 
			
		||||
				// replace instance with wire representing the packed structure
 | 
			
		||||
| 
						 | 
				
			
			@ -1966,7 +1958,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
			AstNode *template_node = resolved_type_node->children[0];
 | 
			
		||||
 | 
			
		||||
			// Ensure typedef itself is fully simplified
 | 
			
		||||
			while (template_node->simplify(const_fold, false, stage, width_hint, sign_hint, false)) {};
 | 
			
		||||
			while (template_node->simplify(const_fold, stage, width_hint, sign_hint)) {};
 | 
			
		||||
 | 
			
		||||
			if (template_node->type == AST_STRUCT || template_node->type == AST_UNION) {
 | 
			
		||||
				// replace with wire representing the packed structure
 | 
			
		||||
| 
						 | 
				
			
			@ -2009,7 +2001,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
			input_error("Index in generate block prefix syntax is not constant!\n");
 | 
			
		||||
		}
 | 
			
		||||
		if (children[1]->type == AST_PREFIX)
 | 
			
		||||
			children[1]->simplify(const_fold, in_lvalue, stage, width_hint, sign_hint, in_param);
 | 
			
		||||
			children[1]->simplify(const_fold, stage, width_hint, sign_hint);
 | 
			
		||||
		log_assert(children[1]->type == AST_IDENTIFIER);
 | 
			
		||||
		newNode = children[1]->clone();
 | 
			
		||||
		const char *second_part = children[1]->str.c_str();
 | 
			
		||||
| 
						 | 
				
			
			@ -2304,7 +2296,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
		if (current_block)
 | 
			
		||||
			wire->set_attribute(ID::nosync, AstNode::mkconst_int(1, false));
 | 
			
		||||
		current_ast_mod->children.push_back(wire);
 | 
			
		||||
		while (wire->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
		while (wire->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
		AstNode *data = clone();
 | 
			
		||||
		delete data->children[1];
 | 
			
		||||
| 
						 | 
				
			
			@ -2346,7 +2338,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
		AstNode *body = children[1];
 | 
			
		||||
 | 
			
		||||
		// eval count expression
 | 
			
		||||
		while (count->simplify(true, false, stage, 32, true, false)) { }
 | 
			
		||||
		while (count->simplify(true, stage, 32, true)) { }
 | 
			
		||||
 | 
			
		||||
		if (count->type != AST_CONSTANT)
 | 
			
		||||
			input_error("Repeat loops outside must have constant repeat counts!\n");
 | 
			
		||||
| 
						 | 
				
			
			@ -2402,7 +2394,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
			int expr_width_hint = -1;
 | 
			
		||||
			bool expr_sign_hint = true;
 | 
			
		||||
			varbuf->detectSignWidth(expr_width_hint, expr_sign_hint);
 | 
			
		||||
			while (varbuf->simplify(true, false, stage, 32, true, false)) { }
 | 
			
		||||
			while (varbuf->simplify(true, stage, 32, true)) { }
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (varbuf->type != AST_CONSTANT)
 | 
			
		||||
| 
						 | 
				
			
			@ -2443,7 +2435,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
				int expr_width_hint = -1;
 | 
			
		||||
				bool expr_sign_hint = true;
 | 
			
		||||
				buf->detectSignWidth(expr_width_hint, expr_sign_hint);
 | 
			
		||||
				while (buf->simplify(true, false, stage, expr_width_hint, expr_sign_hint, false)) { }
 | 
			
		||||
				while (buf->simplify(true, stage, expr_width_hint, expr_sign_hint)) { }
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (buf->type != AST_CONSTANT)
 | 
			
		||||
| 
						 | 
				
			
			@ -2478,7 +2470,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
 | 
			
		||||
			if (type == AST_GENFOR) {
 | 
			
		||||
				for (size_t i = 0; i < buf->children.size(); i++) {
 | 
			
		||||
					buf->children[i]->simplify(const_fold, false, stage, -1, false, false);
 | 
			
		||||
					buf->children[i]->simplify(const_fold, stage, -1, false);
 | 
			
		||||
					current_ast_mod->children.push_back(buf->children[i]);
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
| 
						 | 
				
			
			@ -2495,7 +2487,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
				int expr_width_hint = -1;
 | 
			
		||||
				bool expr_sign_hint = true;
 | 
			
		||||
				buf->detectSignWidth(expr_width_hint, expr_sign_hint);
 | 
			
		||||
				while (buf->simplify(true, false, stage, expr_width_hint, expr_sign_hint, true)) { }
 | 
			
		||||
				while (buf->simplify(true, stage, expr_width_hint, expr_sign_hint)) { }
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (buf->type != AST_CONSTANT)
 | 
			
		||||
| 
						 | 
				
			
			@ -2547,7 +2539,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
		std::vector<AstNode*> new_children;
 | 
			
		||||
		for (size_t i = 0; i < children.size(); i++)
 | 
			
		||||
			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) {
 | 
			
		||||
				children[i]->simplify(false, false, stage, -1, false, false);
 | 
			
		||||
				children[i]->simplify(false, stage, -1, false);
 | 
			
		||||
				current_ast_mod->children.push_back(children[i]);
 | 
			
		||||
				current_scope[children[i]->str] = children[i];
 | 
			
		||||
			} else
 | 
			
		||||
| 
						 | 
				
			
			@ -2566,7 +2558,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		for (size_t i = 0; i < children.size(); i++) {
 | 
			
		||||
			children[i]->simplify(const_fold, false, stage, -1, false, false);
 | 
			
		||||
			children[i]->simplify(const_fold, stage, -1, false);
 | 
			
		||||
			current_ast_mod->children.push_back(children[i]);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2578,7 +2570,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
	if (type == AST_GENIF && children.size() != 0)
 | 
			
		||||
	{
 | 
			
		||||
		AstNode *buf = children[0]->clone();
 | 
			
		||||
		while (buf->simplify(true, false, stage, width_hint, sign_hint, false)) { }
 | 
			
		||||
		while (buf->simplify(true, stage, width_hint, sign_hint)) { }
 | 
			
		||||
		if (buf->type != AST_CONSTANT) {
 | 
			
		||||
			// for (auto f : log_files)
 | 
			
		||||
			// 	dumpAst(f, "verilog-ast> ");
 | 
			
		||||
| 
						 | 
				
			
			@ -2602,7 +2594,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
			}
 | 
			
		||||
 | 
			
		||||
			for (size_t i = 0; i < buf->children.size(); i++) {
 | 
			
		||||
				buf->children[i]->simplify(const_fold, false, stage, -1, false, false);
 | 
			
		||||
				buf->children[i]->simplify(const_fold, stage, -1, false);
 | 
			
		||||
				current_ast_mod->children.push_back(buf->children[i]);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2618,7 +2610,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
	if (type == AST_GENCASE && children.size() != 0)
 | 
			
		||||
	{
 | 
			
		||||
		AstNode *buf = children[0]->clone();
 | 
			
		||||
		while (buf->simplify(true, false, stage, width_hint, sign_hint, false)) { }
 | 
			
		||||
		while (buf->simplify(true, stage, width_hint, sign_hint)) { }
 | 
			
		||||
		if (buf->type != AST_CONSTANT) {
 | 
			
		||||
			// for (auto f : log_files)
 | 
			
		||||
			// 	dumpAst(f, "verilog-ast> ");
 | 
			
		||||
| 
						 | 
				
			
			@ -2653,7 +2645,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
 | 
			
		||||
				buf = child->clone();
 | 
			
		||||
				buf->set_in_param_flag(true);
 | 
			
		||||
				while (buf->simplify(true, false, stage, width_hint, sign_hint, true)) { }
 | 
			
		||||
				while (buf->simplify(true, stage, width_hint, sign_hint)) { }
 | 
			
		||||
				if (buf->type != AST_CONSTANT) {
 | 
			
		||||
					// for (auto f : log_files)
 | 
			
		||||
					// 	dumpAst(f, "verilog-ast> ");
 | 
			
		||||
| 
						 | 
				
			
			@ -2681,7 +2673,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
			}
 | 
			
		||||
 | 
			
		||||
			for (size_t i = 0; i < buf->children.size(); i++) {
 | 
			
		||||
				buf->children[i]->simplify(const_fold, false, stage, -1, false, false);
 | 
			
		||||
				buf->children[i]->simplify(const_fold, stage, -1, false);
 | 
			
		||||
				current_ast_mod->children.push_back(buf->children[i]);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2866,7 +2858,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
 | 
			
		||||
		if (children[0]->id2ast->attributes.count(ID::nowrshmsk)) {
 | 
			
		||||
			AstNode *node = children[0]->id2ast->attributes.at(ID::nowrshmsk);
 | 
			
		||||
			while (node->simplify(true, false, stage, -1, false, true)) { }
 | 
			
		||||
			while (node->simplify(true, stage, -1, false)) { }
 | 
			
		||||
			if (node->type != AST_CONSTANT)
 | 
			
		||||
				input_error("Non-constant value for `nowrshmsk' attribute on `%s'!\n", children[0]->id2ast->str.c_str());
 | 
			
		||||
			if (node->asAttrConst().as_bool())
 | 
			
		||||
| 
						 | 
				
			
			@ -2904,14 +2896,14 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
			wire_mask->str = stringf("$bitselwrite$mask$%s:%d$%d", RTLIL::encode_filename(filename).c_str(), location.first_line, autoidx++);
 | 
			
		||||
			wire_mask->set_attribute(ID::nosync, AstNode::mkconst_int(1, false));
 | 
			
		||||
			wire_mask->is_logic = true;
 | 
			
		||||
			while (wire_mask->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
			while (wire_mask->simplify(true, 1, -1, false)) { }
 | 
			
		||||
			current_ast_mod->children.push_back(wire_mask);
 | 
			
		||||
 | 
			
		||||
			AstNode *wire_data = new AstNode(AST_WIRE, new AstNode(AST_RANGE, mkconst_int(source_width-1, true), mkconst_int(0, true)));
 | 
			
		||||
			wire_data->str = stringf("$bitselwrite$data$%s:%d$%d", RTLIL::encode_filename(filename).c_str(), location.first_line, autoidx++);
 | 
			
		||||
			wire_data->set_attribute(ID::nosync, AstNode::mkconst_int(1, false));
 | 
			
		||||
			wire_data->is_logic = true;
 | 
			
		||||
			while (wire_data->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
			while (wire_data->simplify(true, 1, -1, false)) { }
 | 
			
		||||
			current_ast_mod->children.push_back(wire_data);
 | 
			
		||||
 | 
			
		||||
			int shamt_width_hint = -1;
 | 
			
		||||
| 
						 | 
				
			
			@ -2923,7 +2915,7 @@ bool AstNode::simplify(bool const_fold, bool in_lvalue_, int stage, int width_hi
 | 
			
		|||
			wire_sel->set_attribute(ID::nosync, AstNode::mkconst_int(1, false));
 | 
			
		||||
			wire_sel->is_logic = true;
 | 
			
		||||
			wire_sel->is_signed = shamt_sign_hint;
 | 
			
		||||
			while (wire_sel->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
			while (wire_sel->simplify(true, 1, -1, false)) { }
 | 
			
		||||
			current_ast_mod->children.push_back(wire_sel);
 | 
			
		||||
 | 
			
		||||
			did_something = true;
 | 
			
		||||
| 
						 | 
				
			
			@ -3008,7 +3000,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
		wire_check->was_checked = true;
 | 
			
		||||
		current_ast_mod->children.push_back(wire_check);
 | 
			
		||||
		current_scope[wire_check->str] = wire_check;
 | 
			
		||||
		while (wire_check->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
		while (wire_check->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
		AstNode *wire_en = new AstNode(AST_WIRE);
 | 
			
		||||
		wire_en->str = id_en;
 | 
			
		||||
| 
						 | 
				
			
			@ -3020,7 +3012,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
			current_ast_mod->children.back()->children[0]->children[0]->children[0]->was_checked = true;
 | 
			
		||||
		}
 | 
			
		||||
		current_scope[wire_en->str] = wire_en;
 | 
			
		||||
		while (wire_en->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
		while (wire_en->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
		AstNode *check_defval;
 | 
			
		||||
		if (type == AST_LIVE || type == AST_FAIR) {
 | 
			
		||||
| 
						 | 
				
			
			@ -3116,7 +3108,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
			current_ast_mod->children.push_back(wire_tmp);
 | 
			
		||||
			current_scope[wire_tmp->str] = wire_tmp;
 | 
			
		||||
			wire_tmp->set_attribute(ID::nosync, AstNode::mkconst_int(1, false));
 | 
			
		||||
			while (wire_tmp->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
			while (wire_tmp->simplify(true, 1, -1, false)) { }
 | 
			
		||||
			wire_tmp->is_logic = true;
 | 
			
		||||
 | 
			
		||||
			AstNode *wire_tmp_id = new AstNode(AST_IDENTIFIER);
 | 
			
		||||
| 
						 | 
				
			
			@ -3186,7 +3178,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
			wire_addr->was_checked = true;
 | 
			
		||||
			current_ast_mod->children.push_back(wire_addr);
 | 
			
		||||
			current_scope[wire_addr->str] = wire_addr;
 | 
			
		||||
			while (wire_addr->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
			while (wire_addr->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
			AstNode *assign_addr = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER), mkconst_bits(x_bits_addr, false));
 | 
			
		||||
			assign_addr->children[0]->str = id_addr;
 | 
			
		||||
| 
						 | 
				
			
			@ -3212,7 +3204,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
			wire_data->is_signed = mem_signed;
 | 
			
		||||
			current_ast_mod->children.push_back(wire_data);
 | 
			
		||||
			current_scope[wire_data->str] = wire_data;
 | 
			
		||||
			while (wire_data->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
			while (wire_data->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
			AstNode *assign_data = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER), mkconst_bits(x_bits_data, false));
 | 
			
		||||
			assign_data->children[0]->str = id_data;
 | 
			
		||||
| 
						 | 
				
			
			@ -3228,7 +3220,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
		wire_en->was_checked = true;
 | 
			
		||||
		current_ast_mod->children.push_back(wire_en);
 | 
			
		||||
		current_scope[wire_en->str] = wire_en;
 | 
			
		||||
		while (wire_en->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
		while (wire_en->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
		AstNode *assign_en_first = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER), mkconst_int(0, false, mem_width));
 | 
			
		||||
		assign_en_first->children[0]->str = id_en;
 | 
			
		||||
| 
						 | 
				
			
			@ -3356,7 +3348,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
				AstNode *wire = new AstNode(AST_WIRE);
 | 
			
		||||
				wire->str = stringf("$initstate$%d_wire", myidx);
 | 
			
		||||
				current_ast_mod->children.push_back(wire);
 | 
			
		||||
				while (wire->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
				while (wire->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
				AstNode *cell = new AstNode(AST_CELL, new AstNode(AST_CELLTYPE), new AstNode(AST_ARGUMENT, new AstNode(AST_IDENTIFIER)));
 | 
			
		||||
				cell->str = stringf("$initstate$%d", myidx);
 | 
			
		||||
| 
						 | 
				
			
			@ -3365,7 +3357,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
				cell->children[1]->children[0]->str = wire->str;
 | 
			
		||||
				cell->children[1]->children[0]->id2ast = wire;
 | 
			
		||||
				current_ast_mod->children.push_back(cell);
 | 
			
		||||
				while (cell->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
				while (cell->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
				newNode = new AstNode(AST_IDENTIFIER);
 | 
			
		||||
				newNode->str = wire->str;
 | 
			
		||||
| 
						 | 
				
			
			@ -3391,7 +3383,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
				if (GetSize(children) == 2)
 | 
			
		||||
				{
 | 
			
		||||
					AstNode *buf = children[1]->clone();
 | 
			
		||||
					while (buf->simplify(true, false, stage, -1, false, false)) { }
 | 
			
		||||
					while (buf->simplify(true, stage, -1, false)) { }
 | 
			
		||||
					if (buf->type != AST_CONSTANT)
 | 
			
		||||
						input_error("Failed to evaluate system function `%s' with non-constant value.\n", str.c_str());
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -3426,7 +3418,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
 | 
			
		||||
					current_ast_mod->children.push_back(reg);
 | 
			
		||||
 | 
			
		||||
					while (reg->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
					while (reg->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
					AstNode *regid = new AstNode(AST_IDENTIFIER);
 | 
			
		||||
					regid->str = reg->str;
 | 
			
		||||
| 
						 | 
				
			
			@ -3502,7 +3494,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
							RTLIL::unescape_id(str).c_str(), int(children.size()));
 | 
			
		||||
 | 
			
		||||
				AstNode *buf = children[0]->clone();
 | 
			
		||||
				while (buf->simplify(true, false, stage, width_hint, sign_hint, false)) { }
 | 
			
		||||
				while (buf->simplify(true, stage, width_hint, sign_hint)) { }
 | 
			
		||||
				if (buf->type != AST_CONSTANT)
 | 
			
		||||
					input_error("Failed to evaluate system function `%s' with non-constant value.\n", str.c_str());
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -3534,7 +3526,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
					if (children.size() == 2) {
 | 
			
		||||
						AstNode *buf = children[1]->clone();
 | 
			
		||||
						// Evaluate constant expression
 | 
			
		||||
						while (buf->simplify(true, false, stage, width_hint, sign_hint, false)) { }
 | 
			
		||||
						while (buf->simplify(true, stage, width_hint, sign_hint)) { }
 | 
			
		||||
						dim = buf->asInt(false);
 | 
			
		||||
						delete buf;
 | 
			
		||||
					}
 | 
			
		||||
| 
						 | 
				
			
			@ -3692,7 +3684,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
				}
 | 
			
		||||
 | 
			
		||||
				if (children.size() >= 1) {
 | 
			
		||||
					while (children[0]->simplify(true, false, stage, width_hint, sign_hint, in_param)) { }
 | 
			
		||||
					while (children[0]->simplify(true, stage, width_hint, sign_hint)) { }
 | 
			
		||||
					if (!children[0]->isConst())
 | 
			
		||||
						input_error("Failed to evaluate system function `%s' with non-constant argument.\n",
 | 
			
		||||
								RTLIL::unescape_id(str).c_str());
 | 
			
		||||
| 
						 | 
				
			
			@ -3703,7 +3695,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
				}
 | 
			
		||||
 | 
			
		||||
				if (children.size() >= 2) {
 | 
			
		||||
					while (children[1]->simplify(true, false, stage, width_hint, sign_hint, in_param)) { }
 | 
			
		||||
					while (children[1]->simplify(true, stage, width_hint, sign_hint)) { }
 | 
			
		||||
					if (!children[1]->isConst())
 | 
			
		||||
						input_error("Failed to evaluate system function `%s' with non-constant argument.\n",
 | 
			
		||||
								RTLIL::unescape_id(str).c_str());
 | 
			
		||||
| 
						 | 
				
			
			@ -3760,7 +3752,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
				// Determine which bits to count
 | 
			
		||||
				for (size_t i = 1; i < children.size(); i++) {
 | 
			
		||||
					AstNode *node = children[i];
 | 
			
		||||
					while (node->simplify(true, false, stage, -1, false, in_param)) { }
 | 
			
		||||
					while (node->simplify(true, stage, -1, false)) { }
 | 
			
		||||
					if (node->type != AST_CONSTANT)
 | 
			
		||||
						input_error("Failed to evaluate system function `%s' with non-constant control bit argument.\n", str.c_str());
 | 
			
		||||
					if (node->bits.size() != 1)
 | 
			
		||||
| 
						 | 
				
			
			@ -3855,8 +3847,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
 | 
			
		||||
					argtypes.push_back(RTLIL::unescape_id(dpi_decl->children.at(i)->str));
 | 
			
		||||
					args.push_back(children.at(i-2)->clone());
 | 
			
		||||
					args.back()->set_in_param_flag(true);
 | 
			
		||||
					while (args.back()->simplify(true, false, stage, -1, false, true)) { }
 | 
			
		||||
					while (args.back()->simplify(true, stage, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
					if (args.back()->type != AST_CONSTANT && args.back()->type != AST_REALVALUE)
 | 
			
		||||
						input_error("Failed to evaluate DPI function with non-constant argument.\n");
 | 
			
		||||
| 
						 | 
				
			
			@ -3893,12 +3884,12 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
							RTLIL::unescape_id(str).c_str(), int(children.size()));
 | 
			
		||||
 | 
			
		||||
				AstNode *node_filename = children[0]->clone();
 | 
			
		||||
				while (node_filename->simplify(true, false, stage, width_hint, sign_hint, false)) { }
 | 
			
		||||
				while (node_filename->simplify(true, stage, width_hint, sign_hint)) { }
 | 
			
		||||
				if (node_filename->type != AST_CONSTANT)
 | 
			
		||||
					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, stage, width_hint, sign_hint, false)) { }
 | 
			
		||||
				while (node_memory->simplify(true, stage, width_hint, sign_hint)) { }
 | 
			
		||||
				if (node_memory->type != AST_IDENTIFIER || node_memory->id2ast == nullptr || node_memory->id2ast->type != AST_MEMORY)
 | 
			
		||||
					input_error("Failed to evaluate system function `%s' with non-memory 2nd argument.\n", str.c_str());
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -3906,7 +3897,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
 | 
			
		||||
				if (GetSize(children) > 2) {
 | 
			
		||||
					AstNode *node_addr = children[2]->clone();
 | 
			
		||||
					while (node_addr->simplify(true, false, stage, width_hint, sign_hint, false)) { }
 | 
			
		||||
					while (node_addr->simplify(true, stage, width_hint, sign_hint)) { }
 | 
			
		||||
					if (node_addr->type != AST_CONSTANT)
 | 
			
		||||
						input_error("Failed to evaluate system function `%s' with non-constant 3rd argument.\n", str.c_str());
 | 
			
		||||
					start_addr = int(node_addr->asInt(false));
 | 
			
		||||
| 
						 | 
				
			
			@ -3914,7 +3905,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
 | 
			
		||||
				if (GetSize(children) > 3) {
 | 
			
		||||
					AstNode *node_addr = children[3]->clone();
 | 
			
		||||
					while (node_addr->simplify(true, false, stage, width_hint, sign_hint, false)) { }
 | 
			
		||||
					while (node_addr->simplify(true, stage, width_hint, sign_hint)) { }
 | 
			
		||||
					if (node_addr->type != AST_CONSTANT)
 | 
			
		||||
						input_error("Failed to evaluate system function `%s' with non-constant 4th argument.\n", str.c_str());
 | 
			
		||||
					finish_addr = int(node_addr->asInt(false));
 | 
			
		||||
| 
						 | 
				
			
			@ -3966,7 +3957,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
			bool require_const_eval = decl->has_const_only_constructs();
 | 
			
		||||
			bool all_args_const = true;
 | 
			
		||||
			for (auto child : children) {
 | 
			
		||||
				while (child->simplify(true, in_lvalue, 1, -1, false, in_param)) { }
 | 
			
		||||
				while (child->simplify(true, 1, -1, false)) { }
 | 
			
		||||
				if (child->type != AST_CONSTANT && child->type != AST_REALVALUE)
 | 
			
		||||
					all_args_const = false;
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -4011,7 +4002,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
 | 
			
		||||
			current_scope[wire->str] = wire;
 | 
			
		||||
			current_ast_mod->children.push_back(wire);
 | 
			
		||||
			while (wire->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
			while (wire->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
			AstNode *lvalue = new AstNode(AST_IDENTIFIER);
 | 
			
		||||
			lvalue->str = wire->str;
 | 
			
		||||
| 
						 | 
				
			
			@ -4057,7 +4048,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
					wire->is_input = false;
 | 
			
		||||
					wire->is_output = false;
 | 
			
		||||
					current_ast_mod->children.push_back(wire);
 | 
			
		||||
					while (wire->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
					while (wire->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
					AstNode *wire_id = new AstNode(AST_IDENTIFIER);
 | 
			
		||||
					wire_id->str = wire->str;
 | 
			
		||||
| 
						 | 
				
			
			@ -4100,7 +4091,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
						for (auto c : child->children)
 | 
			
		||||
							wire->children.push_back(c->clone());
 | 
			
		||||
					} else if (!child->children.empty()) {
 | 
			
		||||
						while (child->simplify(true, false, stage, -1, false, false)) { }
 | 
			
		||||
						while (child->simplify(true, stage, -1, false)) { }
 | 
			
		||||
						if (GetSize(child->children) == GetSize(wire->children) - contains_value) {
 | 
			
		||||
							for (int i = 0; i < GetSize(child->children); i++)
 | 
			
		||||
								if (*child->children.at(i) != *wire->children.at(i + contains_value))
 | 
			
		||||
| 
						 | 
				
			
			@ -4128,7 +4119,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
					current_ast_mod->children.push_back(wire);
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				while (wire->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
				while (wire->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
				if ((child->is_input || child->is_output) && arg_count < children.size())
 | 
			
		||||
				{
 | 
			
		||||
| 
						 | 
				
			
			@ -4161,7 +4152,7 @@ skip_dynamic_range_lvalue_expansion:;
 | 
			
		|||
						}
 | 
			
		||||
						wire->fixup_hierarchy_flags();
 | 
			
		||||
						// updates the sizing
 | 
			
		||||
						while (wire->simplify(true, false, 1, -1, false, true)) { }
 | 
			
		||||
						while (wire->simplify(true, 1, -1, false)) { }
 | 
			
		||||
						delete arg;
 | 
			
		||||
						continue;
 | 
			
		||||
					}
 | 
			
		||||
| 
						 | 
				
			
			@ -5072,7 +5063,7 @@ bool AstNode::mem2reg_as_needed_pass2(pool<AstNode*> &mem2reg_set, AstNode *mod,
 | 
			
		|||
		wire_addr->was_checked = true;
 | 
			
		||||
		wire_addr->set_attribute(ID::nosync, AstNode::mkconst_int(1, false));
 | 
			
		||||
		mod->children.push_back(wire_addr);
 | 
			
		||||
		while (wire_addr->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
		while (wire_addr->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
		AstNode *wire_data = new AstNode(AST_WIRE, new AstNode(AST_RANGE, mkconst_int(mem_width-1, true), mkconst_int(0, true)));
 | 
			
		||||
		wire_data->str = id_data;
 | 
			
		||||
| 
						 | 
				
			
			@ -5081,7 +5072,7 @@ bool AstNode::mem2reg_as_needed_pass2(pool<AstNode*> &mem2reg_set, AstNode *mod,
 | 
			
		|||
		wire_data->is_signed = mem_signed;
 | 
			
		||||
		wire_data->set_attribute(ID::nosync, AstNode::mkconst_int(1, false));
 | 
			
		||||
		mod->children.push_back(wire_data);
 | 
			
		||||
		while (wire_data->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
		while (wire_data->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
		log_assert(block != NULL);
 | 
			
		||||
		size_t assign_idx = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -5194,7 +5185,7 @@ bool AstNode::mem2reg_as_needed_pass2(pool<AstNode*> &mem2reg_set, AstNode *mod,
 | 
			
		|||
			if (block)
 | 
			
		||||
				wire_addr->set_attribute(ID::nosync, AstNode::mkconst_int(1, false));
 | 
			
		||||
			mod->children.push_back(wire_addr);
 | 
			
		||||
			while (wire_addr->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
			while (wire_addr->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
			AstNode *wire_data = new AstNode(AST_WIRE, new AstNode(AST_RANGE, mkconst_int(mem_width-1, true), mkconst_int(0, true)));
 | 
			
		||||
			wire_data->str = id_data;
 | 
			
		||||
| 
						 | 
				
			
			@ -5204,7 +5195,7 @@ bool AstNode::mem2reg_as_needed_pass2(pool<AstNode*> &mem2reg_set, AstNode *mod,
 | 
			
		|||
			if (block)
 | 
			
		||||
				wire_data->set_attribute(ID::nosync, AstNode::mkconst_int(1, false));
 | 
			
		||||
			mod->children.push_back(wire_data);
 | 
			
		||||
			while (wire_data->simplify(true, false, 1, -1, false, false)) { }
 | 
			
		||||
			while (wire_data->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
			AstNode *assign_addr = new AstNode(block ? AST_ASSIGN_EQ : AST_ASSIGN, new AstNode(AST_IDENTIFIER), children[0]->children[0]->clone());
 | 
			
		||||
			assign_addr->children[0]->str = id_addr;
 | 
			
		||||
| 
						 | 
				
			
			@ -5387,7 +5378,7 @@ bool AstNode::replace_variables(std::map<std::string, AstNode::varinfo_t> &varia
 | 
			
		|||
			}
 | 
			
		||||
			if (!children.at(0)->replace_variables(variables, fcall, must_succeed))
 | 
			
		||||
				return false;
 | 
			
		||||
			while (simplify(true, false, 1, -1, false, true)) { }
 | 
			
		||||
			while (simplify(true, 1, -1, false)) { }
 | 
			
		||||
			if (!children.at(0)->range_valid) {
 | 
			
		||||
				if (!must_succeed)
 | 
			
		||||
					return false;
 | 
			
		||||
| 
						 | 
				
			
			@ -5443,7 +5434,7 @@ AstNode *AstNode::eval_const_function(AstNode *fcall, bool must_succeed)
 | 
			
		|||
 | 
			
		||||
		if (stmt->type == AST_WIRE)
 | 
			
		||||
		{
 | 
			
		||||
			while (stmt->simplify(true, false, 1, -1, false, true)) { }
 | 
			
		||||
			while (stmt->simplify(true, 1, -1, false)) { }
 | 
			
		||||
			if (!stmt->range_valid) {
 | 
			
		||||
				if (!must_succeed)
 | 
			
		||||
					goto finished;
 | 
			
		||||
| 
						 | 
				
			
			@ -5487,7 +5478,7 @@ AstNode *AstNode::eval_const_function(AstNode *fcall, bool must_succeed)
 | 
			
		|||
 | 
			
		||||
		if (stmt->type == AST_LOCALPARAM)
 | 
			
		||||
		{
 | 
			
		||||
			while (stmt->simplify(true, false, 1, -1, false, true)) { }
 | 
			
		||||
			while (stmt->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
			current_scope[stmt->str] = stmt;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -5504,7 +5495,7 @@ AstNode *AstNode::eval_const_function(AstNode *fcall, bool must_succeed)
 | 
			
		|||
					goto finished;
 | 
			
		||||
			if (!stmt->children.at(1)->replace_variables(variables, fcall, must_succeed))
 | 
			
		||||
				goto finished;
 | 
			
		||||
			while (stmt->simplify(true, false, 1, -1, false, true)) { }
 | 
			
		||||
			while (stmt->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
			if (stmt->type != AST_ASSIGN_EQ)
 | 
			
		||||
				continue;
 | 
			
		||||
| 
						 | 
				
			
			@ -5572,7 +5563,7 @@ AstNode *AstNode::eval_const_function(AstNode *fcall, bool must_succeed)
 | 
			
		|||
			if (!cond->replace_variables(variables, fcall, must_succeed))
 | 
			
		||||
				goto finished;
 | 
			
		||||
			cond->set_in_param_flag(true);
 | 
			
		||||
			while (cond->simplify(true, false, 1, -1, false, true)) { }
 | 
			
		||||
			while (cond->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
			if (cond->type != AST_CONSTANT) {
 | 
			
		||||
				if (!must_succeed)
 | 
			
		||||
| 
						 | 
				
			
			@ -5598,7 +5589,7 @@ AstNode *AstNode::eval_const_function(AstNode *fcall, bool must_succeed)
 | 
			
		|||
			if (!num->replace_variables(variables, fcall, must_succeed))
 | 
			
		||||
				goto finished;
 | 
			
		||||
			num->set_in_param_flag(true);
 | 
			
		||||
			while (num->simplify(true, false, 1, -1, false, true)) { }
 | 
			
		||||
			while (num->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
			if (num->type != AST_CONSTANT) {
 | 
			
		||||
				if (!must_succeed)
 | 
			
		||||
| 
						 | 
				
			
			@ -5622,7 +5613,7 @@ AstNode *AstNode::eval_const_function(AstNode *fcall, bool must_succeed)
 | 
			
		|||
			if (!expr->replace_variables(variables, fcall, must_succeed))
 | 
			
		||||
				goto finished;
 | 
			
		||||
			expr->set_in_param_flag(true);
 | 
			
		||||
			while (expr->simplify(true, false, 1, -1, false, true)) { }
 | 
			
		||||
			while (expr->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
			AstNode *sel_case = NULL;
 | 
			
		||||
			for (size_t i = 1; i < stmt->children.size(); i++)
 | 
			
		||||
| 
						 | 
				
			
			@ -5643,7 +5634,7 @@ AstNode *AstNode::eval_const_function(AstNode *fcall, bool must_succeed)
 | 
			
		|||
 | 
			
		||||
					cond = new AstNode(AST_EQ, expr->clone(), cond);
 | 
			
		||||
					cond->set_in_param_flag(true);
 | 
			
		||||
					while (cond->simplify(true, false, 1, -1, false, true)) { }
 | 
			
		||||
					while (cond->simplify(true, 1, -1, false)) { }
 | 
			
		||||
 | 
			
		||||
					if (cond->type != AST_CONSTANT) {
 | 
			
		||||
						if (!must_succeed)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue