systemverilog-plugin: Use AstNode:: members correctly

Signed-off-by: Magdalena Andrys <mandrys@antmicro.com>
diff --git a/systemverilog-plugin/third_party/yosys/simplify.cc b/systemverilog-plugin/third_party/yosys/simplify.cc
index 71d15a4..2f60ce4 100644
--- a/systemverilog-plugin/third_party/yosys/simplify.cc
+++ b/systemverilog-plugin/third_party/yosys/simplify.cc
@@ -504,7 +504,7 @@
 		// mark the wire with `nosync`
 		AstNode *wire = it->second;
 		log_assert(wire->type == AST_WIRE);
-		wire->attributes[ID::nosync] = AstNode::mkconst_int(1, false);
+		wire->attributes[ID::nosync] = node->mkconst_int(1, false);
 	}
 
 	// remove the attributes we've "consumed"
@@ -540,7 +540,7 @@
 //
 // 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 at_zero, bool in_lvalue, int stage, int width_hint, bool sign_hint, bool in_param)
+bool simplify(AstNode *ast_node, bool const_fold, bool at_zero, bool in_lvalue, int stage, int width_hint, bool sign_hint, bool in_param)
 {
 	static int recursion_counter = 0;
 	static bool deep_recursion_warning = false;
@@ -565,17 +565,17 @@
 
 	if (stage == 0)
 	{
-		log_assert(type == AST_MODULE || type == AST_INTERFACE);
+		log_assert(ast_node->type == AST_MODULE || ast_node->type == AST_INTERFACE);
 
 		deep_recursion_warning = true;
-		while (simplify(const_fold, at_zero, in_lvalue, 1, width_hint, sign_hint, in_param)) { }
+		while (simplify(ast_node, const_fold, at_zero, in_lvalue, 1, width_hint, sign_hint, in_param)) { }
 
-		if (!flag_nomem2reg && !get_bool_attribute(ID::nomem2reg))
+		if (!flag_nomem2reg && !ast_node->get_bool_attribute(ID::nomem2reg))
 		{
 			dict<AstNode*, pool<std::string>> mem2reg_places;
 			dict<AstNode*, uint32_t> mem2reg_candidates, dummy_proc_flags;
 			uint32_t flags = flag_mem2reg ? AstNode::MEM2REG_FL_ALL : 0;
-			mem2reg_as_needed_pass1(mem2reg_places, mem2reg_candidates, dummy_proc_flags, flags);
+			ast_node->mem2reg_as_needed_pass1(mem2reg_places, mem2reg_candidates, dummy_proc_flags, flags); // not sure if correct MAND
 
 			pool<AstNode*> mem2reg_set;
 			for (auto &it : mem2reg_candidates)
@@ -588,7 +588,7 @@
 				if (mem->get_bool_attribute(ID::nomem2reg))
 					continue;
 
-				if (mem->get_bool_attribute(ID::nomeminit) || get_bool_attribute(ID::nomeminit))
+				if (mem->get_bool_attribute(ID::nomeminit) || ast_node->get_bool_attribute(ID::nomeminit))
 					this_nomeminit = true;
 
 				if (memflags & AstNode::MEM2REG_FL_FORCED)
@@ -641,7 +641,7 @@
 
 				for (int i = 0; i < mem_size; i++) {
 					AstNode *reg = new AstNode(AST_WIRE, new AstNode(AST_RANGE,
-							mkconst_int(data_range_left, true), mkconst_int(data_range_right, true)));
+							node->mkconst_int(data_range_left, true), node->mkconst_int(data_range_right, true)));
 					reg->str = stringf("%s[%d]", node->str.c_str(), i);
 					reg->is_reg = true;
 					reg->is_signed = node->is_signed;
@@ -650,105 +650,105 @@
 							reg->attributes.emplace(it.first, it.second->clone());
 					reg->filename = node->filename;
 					reg->location = node->location;
-					children.push_back(reg);
-					while (reg->simplify(true, false, false, 1, -1, false, false)) { }
+					ast_node->children.push_back(reg);
+					while (simplify(reg, true, false, false, 1, -1, false, false)) { } // <- not sure about reg being the first arg here...
 				}
 			}
 
 			AstNode *async_block = NULL;
-			while (mem2reg_as_needed_pass2(mem2reg_set, this, NULL, async_block)) { }
+			while (ast_node->mem2reg_as_needed_pass2(mem2reg_set, ast_node, NULL, async_block)) { }
 
 			vector<AstNode*> delnodes;
-			mem2reg_remove(mem2reg_set, delnodes);
+			ast_node->mem2reg_remove(mem2reg_set, delnodes);
 
 			for (auto node : delnodes)
 				delete node;
 		}
 
-		while (simplify(const_fold, at_zero, in_lvalue, 2, width_hint, sign_hint, in_param)) { }
+		while (simplify(ast_node, const_fold, at_zero, in_lvalue, 2, width_hint, sign_hint, in_param)) { }
 		recursion_counter--;
 		return false;
 	}
 
-	current_filename = filename;
+	current_filename = ast_node->filename;
 
 	// we do not look inside a task or function
 	// (but as soon as a task or function is instantiated we process the generated AST as usual)
-	if (type == AST_FUNCTION || type == AST_TASK) {
+	if (ast_node->type == AST_FUNCTION || ast_node->type == AST_TASK) {
 		recursion_counter--;
 		return false;
 	}
 
 	// deactivate all calls to non-synthesis system tasks
 	// note that $display, $finish, and $stop are used for synthesis-time DRC so they're not in this list
-	if ((type == AST_FCALL || type == AST_TCALL) && (str == "$strobe" || str == "$monitor" || str == "$time" ||
-			str == "$dumpfile" || str == "$dumpvars" || str == "$dumpon" || str == "$dumpoff" || str == "$dumpall")) {
-		log_file_warning(filename, location.first_line, "Ignoring call to system %s %s.\n", type == AST_FCALL ? "function" : "task", str.c_str());
-		delete_children();
-		str = std::string();
+	if ((ast_node->type == AST_FCALL || ast_node->type == AST_TCALL) && (ast_node->str == "$strobe" || ast_node->str == "$monitor" || ast_node->str == "$time" ||
+			ast_node->str == "$dumpfile" || ast_node->str == "$dumpvars" || ast_node->str == "$dumpon" || ast_node->str == "$dumpoff" || ast_node->str == "$dumpall")) {
+		log_file_warning(ast_node->filename, ast_node->location.first_line, "Ignoring call to system %s %s.\n", ast_node->type == AST_FCALL ? "function" : "task", ast_node->str.c_str());
+		ast_node->delete_children();
+		ast_node->str = std::string();
 	}
 
-	if ((type == AST_TCALL) && (str == "$display" || str == "$write") && (!current_always || current_always->type != AST_INITIAL)) {
-		log_file_warning(filename, location.first_line, "System task `%s' outside initial block is unsupported.\n", str.c_str());
-		delete_children();
-		str = std::string();
+	if ((ast_node->type == AST_TCALL) && (ast_node->str == "$display" || ast_node->str == "$write") && (!current_always || current_always->type != AST_INITIAL)) {
+		log_file_warning(ast_node->filename, ast_node->location.first_line, "System task `%s' outside initial block is unsupported.\n", ast_node->str.c_str());
+		ast_node->delete_children();
+		ast_node->str = std::string();
 	}
 
 	// print messages if this a call to $display() or $write()
 	// This code implements only a small subset of Verilog-2005 $display() format specifiers,
 	// but should be good enough for most uses
-	if ((type == AST_TCALL) && ((str == "$display") || (str == "$write")))
+	if ((ast_node->type == AST_TCALL) && ((ast_node->str == "$display") || (ast_node->str == "$write")))
 	{
-		int nargs = GetSize(children);
+		int nargs = GetSize(ast_node->children);
 		if (nargs < 1)
-			log_file_error(filename, location.first_line, "System task `%s' got %d arguments, expected >= 1.\n",
-					str.c_str(), int(children.size()));
+			log_file_error(ast_node->filename, ast_node->location.first_line, "System task `%s' got %d arguments, expected >= 1.\n",
+					ast_node->str.c_str(), int(ast_node->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)) { }
+		AstNode *node_string = ast_node->children[0];
+		while (simplify(node_string, 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());
+			log_file_error(ast_node->filename, ast_node->location.first_line, "Failed to evaluate system task `%s' with non-constant 1st argument.\n", ast_node->str.c_str());
 		std::string sformat = node_string->bitsAsConst().decode_string();
-		std::string sout = process_format_str(sformat, 1, stage, width_hint, sign_hint);
+		std::string sout = ast_node->process_format_str(sformat, 1, stage, width_hint, sign_hint);
 		// Finally, print the message (only include a \n for $display, not for $write)
 		log("%s", sout.c_str());
-		if (str == "$display")
+		if (ast_node->str == "$display")
 			log("\n");
-		delete_children();
-		str = std::string();
+		ast_node->delete_children();
+		ast_node->str = std::string();
 	}
 
 	// activate const folding if this is anything that must be evaluated statically (ranges, parameters, attributes, etc.)
-	if (type == AST_WIRE || type == AST_PARAMETER || type == AST_LOCALPARAM || type == AST_ENUM_ITEM || type == AST_DEFPARAM || type == AST_PARASET || type == AST_RANGE || type == AST_PREFIX || type == AST_TYPEDEF)
+	if (ast_node->type == AST_WIRE || ast_node->type == AST_PARAMETER || ast_node->type == AST_LOCALPARAM || ast_node->type == AST_ENUM_ITEM || ast_node->type == AST_DEFPARAM || ast_node->type == AST_PARASET || ast_node->type == AST_RANGE || ast_node->type == AST_PREFIX || ast_node->type == AST_TYPEDEF)
 		const_fold = true;
-	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))
+	if (ast_node->type == AST_IDENTIFIER && current_scope.count(ast_node->str) > 0 && (current_scope[ast_node->str]->type == AST_PARAMETER || current_scope[ast_node->str]->type == AST_LOCALPARAM || current_scope[ast_node->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)
+	if (ast_node->type == AST_PARAMETER || ast_node->type == AST_LOCALPARAM || ast_node->type == AST_DEFPARAM || ast_node->type == AST_PARASET || ast_node->type == AST_PREFIX)
 		in_param = true;
 
 	std::map<std::string, AstNode*> backup_scope;
 
 	// create name resolution entries for all objects with names
 	// also merge multiple declarations for the same wire (e.g. "output foobar; reg foobar;")
-	if (type == AST_MODULE || type == AST_INTERFACE) {
+	if (ast_node->type == AST_MODULE || ast_node->type == AST_INTERFACE) {
 		current_scope.clear();
 		std::set<std::string> existing;
 		int counter = 0;
-		label_genblks(existing, counter);
+		ast_node->label_genblks(existing, counter);
 		std::map<std::string, AstNode*> this_wire_scope;
-		for (size_t i = 0; i < children.size(); i++) {
-			AstNode *node = children[i];
+		for (size_t i = 0; i < ast_node->children.size(); i++) {
+			AstNode *node = ast_node->children[i];
 
 			if (node->type == AST_WIRE) {
 				if (node->children.size() == 1 && node->children[0]->type == AST_RANGE) {
 					for (auto c : node->children[0]->children) {
 						if (!c->is_simple_const_expr()) {
-							if (attributes.count(ID::dynports))
-								delete attributes.at(ID::dynports);
-							attributes[ID::dynports] = AstNode::mkconst_int(1, true);
+							if (ast_node->attributes.count(ID::dynports))
+								delete ast_node->attributes.at(ID::dynports);
+							node->attributes[ID::dynports] = node->mkconst_int(1, true);
 						}
 					}
 				}
@@ -799,13 +799,13 @@
 							delete first_node->attributes[it.first];
 						first_node->attributes[it.first] = it.second->clone();
 					}
-					children.erase(children.begin()+(i--));
+					ast_node->children.erase(ast_node->children.begin()+(i--));
 					did_something = true;
 					delete node;
 					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());
+						log_file_error(ast_node->filename, ast_node->location.first_line, "Incompatible re-declaration of wire %s.\n", node->str.c_str());
 					continue;
 				}
 				this_wire_scope[node->str] = node;
@@ -824,35 +824,35 @@
 					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());
+						log_file_error(ast_node->filename, ast_node->location.first_line, "enum item %s already exists\n", enode->str.c_str());
 				}
 			}
 		}
-		for (size_t i = 0; i < children.size(); i++) {
-			AstNode *node = children[i];
+		for (size_t i = 0; i < ast_node->children.size(); i++) {
+			AstNode *node = ast_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, false, 1, -1, false, node->type == AST_PARAMETER || node->type == AST_LOCALPARAM))
+				while (simplify(node, true, false, false, 1, -1, false, node->type == AST_PARAMETER || node->type == AST_LOCALPARAM))
 					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, false, 1, -1, false, in_param))
+					while (simplify(node, true, false, false, 1, -1, false, in_param))
 						did_something = true;
 				}
 			}
 		}
 
-		for (AstNode *child : children)
+		for (AstNode *child : ast_node->children)
 			if (child->type == AST_ALWAYS &&
 					child->attributes.count(ID::always_comb))
 				check_auto_nosync(child);
 	}
 
 	// create name resolution entries for all objects with names
-	if (type == AST_PACKAGE) {
+	if (ast_node->type == AST_PACKAGE) {
 		//add names to package scope
-		for (size_t i = 0; i < children.size(); i++) {
-			AstNode *node = children[i];
+		for (size_t i = 0; i < ast_node->children.size(); i++) {
+			AstNode *node = ast_node->children[i];
 			// these nodes appear at the top level in a package and can define names
 			if (node->type == AST_PARAMETER || node->type == AST_LOCALPARAM || node->type == AST_TYPEDEF || node->type == AST_FUNCTION || node->type == AST_TASK) {
 				current_scope[node->str] = node;
@@ -864,7 +864,7 @@
 					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());
+						log_file_error(ast_node->filename, ast_node->location.first_line, "enum item %s already exists in package\n", enode->str.c_str());
 				}
 			}
 		}
@@ -877,16 +877,16 @@
 	auto backup_current_always = current_always;
 	auto backup_current_always_clocked = current_always_clocked;
 
-	if (type == AST_ALWAYS || type == AST_INITIAL)
+	if (ast_node->type == AST_ALWAYS || ast_node->type == AST_INITIAL)
 	{
 		if (current_always != nullptr)
-			log_file_error(filename, location.first_line, "Invalid nesting of always blocks and/or initializations.\n");
+			log_file_error(ast_node->filename, ast_node->location.first_line, "Invalid nesting of always blocks and/or initializations.\n");
 
-		current_always = this;
+		current_always = ast_node;
 		current_always_clocked = false;
 
-		if (type == AST_ALWAYS)
-			for (auto child : children) {
+		if (ast_node->type == AST_ALWAYS)
+			for (auto child : ast_node->children) {
 				if (child->type == AST_POSEDGE || child->type == AST_NEGEDGE)
 					current_always_clocked = true;
 				if (child->type == AST_EDGE && GetSize(child->children) == 1 &&
@@ -895,13 +895,13 @@
 			}
 	}
 
-	if (type == AST_CELL) {
+	if (ast_node->type == AST_CELL) {
 		bool lookup_suggested = false;
 
-		for (AstNode *child : children) {
+		for (AstNode *child : ast_node->children) {
 			// simplify any parameters to constants
 			if (child->type == AST_PARASET)
-				while (child->simplify(true, false, false, 1, -1, false, true)) { }
+				while (simplify(child, true, false, false, 1, -1, false, true)) { }
 
 			// look for patterns which _may_ indicate ambiguity requiring
 			// resolution of the underlying module
@@ -933,10 +933,10 @@
 
 		const RTLIL::Module *module = nullptr;
 		if (lookup_suggested)
-			module = lookup_cell_module();
+			module = ast_node->lookup_cell_module();
 		if (module) {
 			size_t port_counter = 0;
-			for (AstNode *child : children) {
+			for (AstNode *child : ast_node->children) {
 				if (child->type != AST_ARGUMENT)
 					continue;
 
@@ -946,7 +946,7 @@
 					port_name = child->str;
 				else {
 					if (port_counter >= module->ports.size())
-						log_file_error(filename, location.first_line,
+						log_file_error(ast_node->filename, ast_node->location.first_line,
 								"Cell instance has more ports than the module!\n");
 					port_name = module->ports[port_counter++];
 				}
@@ -954,7 +954,7 @@
 				// 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,
+					log_file_error(ast_node->filename, ast_node->location.first_line,
 							"Cell instance refers to port %s which does not exist in module %s!.\n",
 							log_id(port_name), log_id(module->name));
 
@@ -977,7 +977,7 @@
 
 				// create the indirection wire
 				std::stringstream sstr;
-				sstr << "$indirect$" << ref->name.c_str() << "$" << encode_filename(filename) << ":" << location.first_line << "$" << (autoidx++);
+				sstr << "$indirect$" << ref->name.c_str() << "$" << encode_filename(ast_node->filename) << ":" << ast_node->location.first_line << "$" << (autoidx++);
 				std::string tmp_str = sstr.str();
 				add_wire_for_ref(ref, tmp_str);
 
@@ -1012,83 +1012,79 @@
 	bool children_are_self_determined = false;
 	bool reset_width_after_children = false;
 
-	switch (type)
+	switch (ast_node->type)
 	{
 	case AST_ASSIGN_EQ:
 	case AST_ASSIGN_LE:
 	case AST_ASSIGN:
-		while (!children[0]->basic_prep && children[0]->simplify(false, false, true, stage, -1, false, in_param) == true)
+		while (!ast_node->children[0]->basic_prep && simplify(ast_node->children[0], false, false, true, stage, -1, false, in_param) == true)
 			did_something = true;
-		while (!children[1]->basic_prep && children[1]->simplify(false, false, false, stage, -1, false, in_param) == true)
+		while (!ast_node->children[1]->basic_prep && simplify(ast_node->children[1], false, false, false, stage, -1, false, in_param) == true)
 			did_something = true;
-		children[0]->detectSignWidth(backup_width_hint, backup_sign_hint);
-		children[1]->detectSignWidth(width_hint, sign_hint);
+		ast_node->children[0]->detectSignWidth(backup_width_hint, backup_sign_hint);
+		ast_node->children[1]->detectSignWidth(width_hint, sign_hint);
 		width_hint = max(width_hint, backup_width_hint);
 		child_0_is_self_determined = true;
 		// test only once, before optimizations and memory mappings but after assignment LHS was mapped to an identifier
-		if (children[0]->id2ast && !children[0]->was_checked) {
-			if ((type == AST_ASSIGN_LE || type == AST_ASSIGN_EQ) && children[0]->id2ast->is_logic)
-				children[0]->id2ast->is_reg = true; // if logic type is used in a block asignment
-			if ((type == AST_ASSIGN_LE || type == AST_ASSIGN_EQ) && !children[0]->id2ast->is_reg)
-				log_warning("wire '%s' is assigned in a block at %s.\n", children[0]->str.c_str(), loc_string().c_str());
-			if (type == AST_ASSIGN && children[0]->id2ast->is_reg) {
+		if (ast_node->children[0]->id2ast && !ast_node->children[0]->was_checked) {
+			if ((ast_node->type == AST_ASSIGN_LE || ast_node->type == AST_ASSIGN_EQ) && ast_node->children[0]->id2ast->is_logic)
+				ast_node->children[0]->id2ast->is_reg = true; // if logic type is used in a block asignment
+			if ((ast_node->type == AST_ASSIGN_LE || ast_node->type == AST_ASSIGN_EQ) && !ast_node->children[0]->id2ast->is_reg)
+				log_warning("wire '%s' is assigned in a block at %s.\n", ast_node->children[0]->str.c_str(), ast_node->loc_string().c_str());
+			if (ast_node->type == AST_ASSIGN && ast_node->children[0]->id2ast->is_reg) {
 				bool is_rand_reg = false;
-				if (children[1]->type == AST_FCALL) {
-					if (children[1]->str == "\\$anyconst")
+				if (ast_node->children[1]->type == AST_FCALL) {
+					if (ast_node->children[1]->str == "\\$anyconst")
 						is_rand_reg = true;
-					if (children[1]->str == "\\$anyseq")
+					if (ast_node->children[1]->str == "\\$anyseq")
 						is_rand_reg = true;
-					if (children[1]->str == "\\$allconst")
+					if (ast_node->children[1]->str == "\\$allconst")
 						is_rand_reg = true;
-					if (children[1]->str == "\\$allseq")
+					if (ast_node->children[1]->str == "\\$allseq")
 						is_rand_reg = true;
 				}
 				if (!is_rand_reg)
-					log_warning("reg '%s' is assigned in a continuous assignment at %s.\n", children[0]->str.c_str(), loc_string().c_str());
+					log_warning("reg '%s' is assigned in a continuous assignment at %s.\n", ast_node->children[0]->str.c_str(), ast_node->loc_string().c_str());
 			}
-			children[0]->was_checked = true;
+			ast_node->children[0]->was_checked = true;
 		}
 		break;
 
 	case AST_STRUCT:
 	case AST_UNION:
-		std::cout << "str: " << str << " | " << __func__ << ":" << __LINE__ << std::endl;
-		if (!basic_prep) {
-			std::cout << "!basic_prep | " << __func__ << ":" << __LINE__ << std::endl;
-			for (auto *node : children) {
-				std::cout << "node str: " << node->str << " | " << __func__ << ":" << __LINE__ << std::endl;
+		if (!ast_node->basic_prep) {
+			for (auto *node : ast_node->children) {
 				// resolve any ranges
-				while (!node->basic_prep && node->simplify(true, false, false, stage, -1, false, false)) {
+				while (!node->basic_prep && simplify(node, true, false, false, stage, -1, false, false)) {
 					did_something = true;
 				}
 			}
 			// determine member offsets and widths
-			size_packed_struct(this, 0);
+			size_packed_struct(ast_node, 0);
 
 			// instance rather than just a type in a typedef or outer struct?
-			if (!str.empty() && str[0] == '\\') {
+			if (!ast_node->str.empty() && ast_node->str[0] == '\\') {
 				// instance so add a wire for the packed structure
-				auto wnode = make_packed_struct(this, str);
+				auto wnode = make_packed_struct(ast_node, ast_node->str);
 				log_assert(current_ast_mod);
 				current_ast_mod->children.push_back(wnode);
 			}
-			basic_prep = true;
+			ast_node->basic_prep = true;
 		}
 		break;
 
 	case AST_STRUCT_ITEM:
-		std::cout << " | " << __func__ << ":" << __LINE__ << std::endl;
 		break;
 
 	case AST_ENUM:
-		//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, false, stage, -1, false, in_param))
+		//log("\nENUM %s: %d child %d\n", ast_node->str.c_str(), ast_node->basic_prep, ast_node->children[0]->basic_prep);
+		if (!ast_node->basic_prep) {
+			for (auto item_node : ast_node->children) {
+				while (!item_node->basic_prep && simplify(item_node, false, false, false, stage, -1, false, in_param))
 					did_something = true;
 			}
 			// allocate values (called more than once)
-			allocateDefaultEnumValues();
+			ast_node->allocateDefaultEnumValues();
 		}
 		break;
 
@@ -1096,35 +1092,35 @@
 	case AST_LOCALPARAM:
 		// if parameter is implicit type which is the typename of a struct or union,
 		// save information about struct in wiretype attribute
-		if (children[0]->type == AST_IDENTIFIER && current_scope.count(children[0]->str) > 0) {
-			auto item_node = current_scope[children[0]->str];
+		if (ast_node->children[0]->type == AST_IDENTIFIER && current_scope.count(ast_node->children[0]->str) > 0) {
+			auto item_node = current_scope[ast_node->children[0]->str];
 			if (item_node->type == AST_STRUCT || item_node->type == AST_UNION) {
-				attributes[ID::wiretype] = item_node->clone();
-				size_packed_struct(attributes[ID::wiretype], 0);
-				add_members_to_scope(attributes[ID::wiretype], str);
+				ast_node->attributes[ID::wiretype] = item_node->clone();
+				size_packed_struct(ast_node->attributes[ID::wiretype], 0);
+				add_members_to_scope(ast_node->attributes[ID::wiretype], ast_node->str);
 			}
 		}
-		while (!children[0]->basic_prep && children[0]->simplify(false, false, false, stage, -1, false, true) == true)
+		while (!ast_node->children[0]->basic_prep && simplify(ast_node->children[0], false, false, false, stage, -1, false, true) == 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, false, stage, -1, false, true) == true)
+		ast_node->children[0]->detectSignWidth(width_hint, sign_hint);
+		if (ast_node->children.size() > 1 && ast_node->children[1]->type == AST_RANGE) {
+			while (!ast_node->children[1]->basic_prep && simplify(ast_node->children[1], 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");
-			width_hint = max(width_hint, children[1]->range_left - children[1]->range_right + 1);
+			if (!ast_node->children[1]->range_valid)
+				log_file_error(ast_node->filename, ast_node->location.first_line, "Non-constant width range on parameter decl.\n");
+			width_hint = max(width_hint, ast_node->children[1]->range_left - ast_node->children[1]->range_right + 1);
 		}
 		break;
 	case AST_ENUM_ITEM:
-		while (!children[0]->basic_prep && children[0]->simplify(false, false, false, stage, -1, false, in_param))
+		while (!ast_node->children[0]->basic_prep && simplify(ast_node->children[0], false, false, false, stage, -1, false, in_param))
 			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, false, stage, -1, false, in_param))
+		ast_node->children[0]->detectSignWidth(width_hint, sign_hint);
+		if (ast_node->children.size() > 1 && ast_node->children[1]->type == AST_RANGE) {
+			while (!ast_node->children[1]->basic_prep && simplify(ast_node->children[1], 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");
-			width_hint = max(width_hint, children[1]->range_left - children[1]->range_right + 1);
+			if (!ast_node->children[1]->range_valid)
+				log_file_error(ast_node->filename, ast_node->location.first_line, "Non-constant width range on enum item decl.\n");
+			width_hint = max(width_hint, ast_node->children[1]->range_left - ast_node->children[1]->range_right + 1);
 		}
 		break;
 
@@ -1178,8 +1174,8 @@
 	case AST_GT:
 		width_hint = -1;
 		sign_hint = true;
-		for (auto child : children) {
-			while (!child->basic_prep && child->simplify(false, false, in_lvalue, stage, -1, false, in_param) == true)
+		for (auto child : ast_node->children) {
+			while (!child->basic_prep && simplify(child, false, false, in_lvalue, stage, -1, false, in_param) == true)
 				did_something = true;
 			child->detectSignWidthWorker(width_hint, sign_hint);
 		}
@@ -1213,85 +1209,85 @@
 	}
 
 	if (detect_width_simple && width_hint < 0) {
-		if (type == AST_REPLICATE)
-			while (children[0]->simplify(true, false, in_lvalue, stage, -1, false, true) == true)
+		if (ast_node->type == AST_REPLICATE)
+			while (simplify(ast_node->children[0], true, false, in_lvalue, stage, -1, false, true) == true)
 				did_something = true;
-		for (auto child : children)
-			while (!child->basic_prep && child->simplify(false, false, in_lvalue, stage, -1, false, in_param) == true)
+		for (auto child : ast_node->children)
+			while (!child->basic_prep && simplify(child, false, false, in_lvalue, stage, -1, false, in_param) == true)
 				did_something = true;
-		detectSignWidth(width_hint, sign_hint);
+		ast_node->detectSignWidth(width_hint, sign_hint);
 	}
 
-	if (type == AST_FCALL && str == "\\$past")
-		detectSignWidth(width_hint, sign_hint);
+	if (ast_node->type == AST_FCALL && ast_node->str == "\\$past")
+		ast_node->detectSignWidth(width_hint, sign_hint);
 
-	if (type == AST_TERNARY) {
+	if (ast_node->type == AST_TERNARY) {
 		if (width_hint < 0) {
-			while (!children[0]->basic_prep && children[0]->simplify(true, false, in_lvalue, stage, -1, false, in_param))
+			while (!ast_node->children[0]->basic_prep && simplify(ast_node->children[0], true, false, in_lvalue, stage, -1, false, in_param))
 				did_something = true;
 
 			bool backup_unevaluated_tern_branch = unevaluated_tern_branch;
-			AstNode *chosen = get_tern_choice().first;
+			AstNode *chosen = ast_node->get_tern_choice().first;
 
-			unevaluated_tern_branch = backup_unevaluated_tern_branch || chosen == children[2];
-			while (!children[1]->basic_prep && children[1]->simplify(false, false, in_lvalue, stage, -1, false, in_param))
+			unevaluated_tern_branch = backup_unevaluated_tern_branch || chosen == ast_node->children[2];
+			while (!ast_node->children[1]->basic_prep && simplify(ast_node->children[1], false, false, in_lvalue, stage, -1, false, in_param))
 				did_something = true;
 
-			unevaluated_tern_branch = backup_unevaluated_tern_branch || chosen == children[1];
-			while (!children[2]->basic_prep && children[2]->simplify(false, false, in_lvalue, stage, -1, false, in_param))
+			unevaluated_tern_branch = backup_unevaluated_tern_branch || chosen == ast_node->children[1];
+			while (!ast_node->children[2]->basic_prep && simplify(ast_node->children[2], false, false, in_lvalue, stage, -1, false, in_param))
 				did_something = true;
 
 			unevaluated_tern_branch = backup_unevaluated_tern_branch;
-			detectSignWidth(width_hint, sign_hint);
+			ast_node->detectSignWidth(width_hint, sign_hint);
 		}
 		int width_hint_left, width_hint_right;
 		bool sign_hint_left, sign_hint_right;
 		bool found_real_left, found_real_right;
-		children[1]->detectSignWidth(width_hint_left, sign_hint_left, &found_real_left);
-		children[2]->detectSignWidth(width_hint_right, sign_hint_right, &found_real_right);
+		ast_node->children[1]->detectSignWidth(width_hint_left, sign_hint_left, &found_real_left);
+		ast_node->children[2]->detectSignWidth(width_hint_right, sign_hint_right, &found_real_right);
 		if (found_real_left || found_real_right) {
 			child_1_is_self_determined = true;
 			child_2_is_self_determined = true;
 		}
 	}
 
-	if (type == AST_CONDX && children.size() > 0 && children.at(0)->type == AST_CONSTANT) {
-		for (auto &bit : children.at(0)->bits)
+	if (ast_node->type == AST_CONDX && ast_node->children.size() > 0 && ast_node->children.at(0)->type == AST_CONSTANT) {
+		for (auto &bit : ast_node->children.at(0)->bits)
 			if (bit == State::Sz || bit == State::Sx)
 				bit = State::Sa;
 	}
 
-	if (type == AST_CONDZ && children.size() > 0 && children.at(0)->type == AST_CONSTANT) {
-		for (auto &bit : children.at(0)->bits)
+	if (ast_node->type == AST_CONDZ && ast_node->children.size() > 0 && ast_node->children.at(0)->type == AST_CONSTANT) {
+		for (auto &bit : ast_node->children.at(0)->bits)
 			if (bit == State::Sz)
 				bit = State::Sa;
 	}
 
-	if (const_fold && type == AST_CASE)
+	if (const_fold && ast_node->type == AST_CASE)
 	{
-		detectSignWidth(width_hint, sign_hint);
-		while (children[0]->simplify(const_fold, at_zero, in_lvalue, stage, width_hint, sign_hint, in_param)) { }
-		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);
+		ast_node->detectSignWidth(width_hint, sign_hint);
+		while (simplify(ast_node->children[0], const_fold, at_zero, in_lvalue, stage, width_hint, sign_hint, in_param)) { }
+		if (ast_node->children[0]->type == AST_CONSTANT && ast_node->children[0]->bits_only_01()) {
+			ast_node->children[0]->is_signed = sign_hint;
+			RTLIL::Const case_expr = ast_node->children[0]->bitsAsConst(width_hint, sign_hint);
 			std::vector<AstNode*> new_children;
-			new_children.push_back(children[0]);
-			for (int i = 1; i < GetSize(children); i++) {
-				AstNode *child = children[i];
+			new_children.push_back(ast_node->children[0]);
+			for (int i = 1; i < GetSize(ast_node->children); i++) {
+				AstNode *child = ast_node->children[i];
 				log_assert(child->type == AST_COND || child->type == AST_CONDX || child->type == AST_CONDZ);
 				for (auto v : child->children) {
 					if (v->type == AST_DEFAULT)
 						goto keep_const_cond;
 					if (v->type == AST_BLOCK)
 						continue;
-					while (v->simplify(const_fold, at_zero, in_lvalue, stage, width_hint, sign_hint, in_param)) { }
+					while (simplify(v, const_fold, at_zero, in_lvalue, stage, width_hint, sign_hint, in_param)) { }
 					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);
 						log_assert(match.bits.size() == 1);
 						if (match.bits.front() == RTLIL::State::S1) {
-							while (i+1 < GetSize(children))
-								delete children[++i];
+							while (i+1 < GetSize(ast_node->children))
+								delete ast_node->children[++i];
 							goto keep_const_cond;
 						}
 						continue;
@@ -1304,63 +1300,63 @@
 				else
 					delete child;
 			}
-			new_children.swap(children);
+			new_children.swap(ast_node->children);
 		}
 	}
 
 	dict<std::string, pool<int>> backup_memwr_visible;
 	dict<std::string, pool<int>> final_memwr_visible;
 
-	if (type == AST_CASE && stage == 2) {
+	if (ast_node->type == AST_CASE && stage == 2) {
 		backup_memwr_visible = current_memwr_visible;
 		final_memwr_visible = current_memwr_visible;
 	}
 
 	// simplify all children first
 	// (iterate by index as e.g. auto wires can add new children in the process)
-	for (size_t i = 0; i < children.size(); i++) {
+	for (size_t i = 0; i < ast_node->children.size(); i++) {
 		bool did_something_here = true;
 		bool backup_flag_autowire = flag_autowire;
 		bool backup_unevaluated_tern_branch = unevaluated_tern_branch;
-		if ((type == AST_GENFOR || type == AST_FOR) && i >= 3)
+		if ((ast_node->type == AST_GENFOR || ast_node->type == AST_FOR) && i >= 3)
 			break;
-		if ((type == AST_GENIF || type == AST_GENCASE) && i >= 1)
+		if ((ast_node->type == AST_GENIF || ast_node->type == AST_GENCASE) && i >= 1)
 			break;
-		if (type == AST_GENBLOCK)
+		if (ast_node->type == AST_GENBLOCK)
 			break;
-		if (type == AST_CELLARRAY && children[i]->type == AST_CELL)
+		if (ast_node->type == AST_CELLARRAY && ast_node->children[i]->type == AST_CELL)
 			continue;
-		if (type == AST_BLOCK && !str.empty())
+		if (ast_node->type == AST_BLOCK && !ast_node->str.empty())
 			break;
-		if (type == AST_PREFIX && i >= 1)
+		if (ast_node->type == AST_PREFIX && i >= 1)
 			break;
-		if (type == AST_DEFPARAM && i == 0)
+		if (ast_node->type == AST_DEFPARAM && i == 0)
 			flag_autowire = true;
-		if (type == AST_TERNARY && i > 0 && !unevaluated_tern_branch) {
-			AstNode *chosen = get_tern_choice().first;
-			unevaluated_tern_branch = chosen && chosen != children[i];
+		if (ast_node->type == AST_TERNARY && i > 0 && !unevaluated_tern_branch) {
+			AstNode *chosen = ast_node->get_tern_choice().first;
+			unevaluated_tern_branch = chosen && chosen != ast_node->children[i];
 		}
-		while (did_something_here && i < children.size()) {
+		while (did_something_here && i < ast_node->children.size()) {
 			bool const_fold_here = const_fold, in_lvalue_here = in_lvalue;
 			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))
+			if (i == 0 && (ast_node->type == AST_REPLICATE || ast_node->type == AST_WIRE))
 				const_fold_here = true, in_param_here = true;
-			if (i == 0 && (type == AST_GENIF || type == AST_GENCASE))
+			if (i == 0 && (ast_node->type == AST_GENIF || ast_node->type == AST_GENCASE))
 				in_param_here = true;
-			if (i == 1 && (type == AST_FOR || type == AST_GENFOR))
+			if (i == 1 && (ast_node->type == AST_FOR || ast_node->type == AST_GENFOR))
 				in_param_here = true;
-			if (type == AST_PARAMETER || type == AST_LOCALPARAM)
+			if (ast_node->type == AST_PARAMETER || ast_node->type == AST_LOCALPARAM)
 				const_fold_here = true;
-			if (i == 0 && (type == AST_ASSIGN || type == AST_ASSIGN_EQ || type == AST_ASSIGN_LE))
+			if (i == 0 && (ast_node->type == AST_ASSIGN || ast_node->type == AST_ASSIGN_EQ || ast_node->type == AST_ASSIGN_LE))
 				in_lvalue_here = true;
-			if (type == AST_BLOCK) {
-				current_block = this;
-				current_block_child = children[i];
+			if (ast_node->type == AST_BLOCK) {
+				current_block = ast_node;
+				current_block_child = ast_node->children[i];
 			}
-			if ((type == AST_ALWAYS || type == AST_INITIAL) && children[i]->type == AST_BLOCK)
-				current_top_block = children[i];
+			if ((ast_node->type == AST_ALWAYS || ast_node->type == AST_INITIAL) && ast_node->children[i]->type == AST_BLOCK)
+				current_top_block = ast_node->children[i];
 			if (i == 0 && child_0_is_self_determined)
 				width_hint_here = -1, sign_hint_here = false;
 			if (i == 1 && child_1_is_self_determined)
@@ -1369,18 +1365,18 @@
 				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, at_zero, in_lvalue_here, stage, width_hint_here, sign_hint_here, in_param_here);
+			did_something_here = simplify(ast_node->children[i], const_fold_here, at_zero, in_lvalue_here, stage, width_hint_here, sign_hint_here, in_param_here);
 			if (did_something_here)
 				did_something = true;
 		}
-		if (stage == 2 && children[i]->type == AST_INITIAL && current_ast_mod != this) {
-			current_ast_mod->children.push_back(children[i]);
-			children.erase(children.begin() + (i--));
+		if (stage == 2 && ast_node->children[i]->type == AST_INITIAL && current_ast_mod != ast_node) {
+			current_ast_mod->children.push_back(ast_node->children[i]);
+			ast_node->children.erase(ast_node->children.begin() + (i--));
 			did_something = true;
 		}
 		flag_autowire = backup_flag_autowire;
 		unevaluated_tern_branch = backup_unevaluated_tern_branch;
-		if (stage == 2 && type == AST_CASE) {
+		if (stage == 2 && ast_node->type == AST_CASE) {
 			for (auto &x : current_memwr_visible) {
 				for (int y : x.second)
 					final_memwr_visible[x.first].insert(y);
@@ -1388,14 +1384,14 @@
 			current_memwr_visible = backup_memwr_visible;
 		}
 	}
-	for (auto &attr : attributes) {
-		while (attr.second->simplify(true, false, false, stage, -1, false, true))
+	for (auto &attr : ast_node->attributes) {
+		while (simplify(attr.second, true, false, false, stage, -1, false, true))
 			did_something = true;
 	}
-	if (type == AST_CASE && stage == 2) {
+	if (ast_node->type == AST_CASE && stage == 2) {
 		current_memwr_visible = final_memwr_visible;
 	}
-	if (type == AST_ALWAYS && stage == 2) {
+	if (ast_node->type == AST_ALWAYS && stage == 2) {
 		current_memwr_visible.clear();
 		current_memwr_count.clear();
 	}
@@ -1404,7 +1400,7 @@
 		width_hint = backup_width_hint;
 		sign_hint = backup_sign_hint;
 		if (width_hint < 0)
-			detectSignWidth(width_hint, sign_hint);
+			ast_node->detectSignWidth(width_hint, sign_hint);
 	}
 
 	current_block = backup_current_block;
@@ -1420,18 +1416,18 @@
 			current_scope[it->first] = it->second;
 	}
 
-	current_filename = filename;
+	current_filename = ast_node->filename;
 
-	if (type == AST_MODULE || type == AST_INTERFACE)
+	if (ast_node->type == AST_MODULE || ast_node->type == AST_INTERFACE)
 		current_scope.clear();
 
 	// convert defparam nodes to cell parameters
-	if (type == AST_DEFPARAM && !children.empty())
+	if (ast_node->type == AST_DEFPARAM && !ast_node->children.empty())
 	{
-		if (children[0]->type != AST_IDENTIFIER)
-			log_file_error(filename, location.first_line, "Module name in defparam contains non-constant expressions!\n");
+		if (ast_node->children[0]->type != AST_IDENTIFIER)
+			log_file_error(ast_node->filename, ast_node->location.first_line, "Module name in defparam contains non-constant expressions!\n");
 
-		string modname, paramname = children[0]->str;
+		string modname, paramname = ast_node->children[0]->str;
 
 		size_t pos = paramname.rfind('.');
 
@@ -1446,356 +1442,356 @@
 		}
 
 		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());
+			log_file_error(ast_node->filename, ast_node->location.first_line, "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",
+			log_file_error(ast_node->filename, ast_node->location.first_line, "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);
+		AstNode *paraset = new AstNode(AST_PARASET, ast_node->children[1]->clone(), GetSize(ast_node->children) > 2 ? ast_node->children[2]->clone() : NULL);
 		paraset->str = paramname;
 
 		AstNode *cell = current_scope.at(modname);
 		cell->children.insert(cell->children.begin() + 1, paraset);
-		delete_children();
+		ast_node->delete_children();
 	}
 
 	// resolve typedefs
-	if (type == AST_TYPEDEF) {
-		log_assert(children.size() == 1);
-		auto type_node = children[0];
+	if (ast_node->type == AST_TYPEDEF) {
+		log_assert(ast_node->children.size() == 1);
+		auto type_node = ast_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, at_zero, in_lvalue, stage, width_hint, sign_hint, in_param)) {
+		while (simplify(type_node, const_fold, at_zero, in_lvalue, stage, width_hint, sign_hint, in_param)) {
 			did_something = true;
 		}
 		log_assert(!type_node->is_custom_type);
 	}
 
 	// resolve types of wires
-	if (type == AST_WIRE || type == AST_MEMORY) {
-		if (is_custom_type) {
-			log_assert(children.size() >= 1);
-			log_assert(children[0]->type == AST_WIRETYPE);
-			auto type_name = children[0]->str;
+	if (ast_node->type == AST_WIRE || ast_node->type == AST_MEMORY) {
+		if (ast_node->is_custom_type) {
+			log_assert(ast_node->children.size() >= 1);
+			log_assert(ast_node->children[0]->type == AST_WIRETYPE);
+			auto type_name = ast_node->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());
+				log_file_error(ast_node->filename, ast_node->location.first_line, "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());
+				log_file_error(ast_node->filename, ast_node->location.first_line, "`%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];
 
 			// Ensure typedef itself is fully simplified
-			while (template_node->simplify(const_fold, at_zero, in_lvalue, stage, width_hint, sign_hint, in_param)) {};
+			while (simplify(template_node, const_fold, at_zero, in_lvalue, stage, width_hint, sign_hint, in_param)) {};
 
 			if (template_node->type == AST_STRUCT || template_node->type == AST_UNION) {
 				// replace with wire representing the packed structure
-				newNode = make_packed_struct(template_node, str);
-				newNode->attributes[ID::wiretype] = mkconst_str(resolved_type_node->str);
+				newNode = make_packed_struct(template_node, ast_node->str);
+				newNode->attributes[ID::wiretype] = ast_node->mkconst_str(resolved_type_node->str);
 				// add original input/output attribute to resolved wire
-				newNode->is_input = this->is_input;
-				newNode->is_output = this->is_output;
-				current_scope[str] = this;
+				newNode->is_input = ast_node->is_input;
+				newNode->is_output = ast_node->is_output;
+				current_scope[ast_node->str] = ast_node;
 				goto apply_newNode;
 			}
 
 			// Remove type reference
-			delete children[0];
-			children.erase(children.begin());
+			delete ast_node->children[0];
+			ast_node->children.erase(ast_node->children.begin());
 
-			if (type == AST_WIRE)
-				type = template_node->type;
-			is_reg = template_node->is_reg;
-			is_logic = template_node->is_logic;
-			is_signed = template_node->is_signed;
-			is_string = template_node->is_string;
-			is_custom_type = template_node->is_custom_type;
+			if (ast_node->type == AST_WIRE)
+				ast_node->type = template_node->type;
+			ast_node->is_reg = template_node->is_reg;
+			ast_node->is_logic = template_node->is_logic;
+			ast_node->is_signed = template_node->is_signed;
+			ast_node->is_string = template_node->is_string;
+			ast_node->is_custom_type = template_node->is_custom_type;
 
-			range_valid = template_node->range_valid;
-			range_swapped = template_node->range_swapped;
-			range_left = template_node->range_left;
-			range_right = template_node->range_right;
+			ast_node->range_valid = template_node->range_valid;
+			ast_node->range_swapped = template_node->range_swapped;
+			ast_node->range_left = template_node->range_left;
+			ast_node->range_right = template_node->range_right;
 
-			attributes[ID::wiretype] = mkconst_str(resolved_type_node->str);
+			ast_node->attributes[ID::wiretype] = ast_node->mkconst_str(resolved_type_node->str);
 
 			// if an enum then add attributes to support simulator tracing
 			annotateTypedEnums(ast_node, template_node);
 
 			// Insert clones children from template at beginning
 			for (int i  = 0; i < GetSize(template_node->children); i++)
-				children.insert(children.begin() + i, template_node->children[i]->clone());
+				ast_node->children.insert(ast_node->children.begin() + i, template_node->children[i]->clone());
 
-			if (type == AST_MEMORY && GetSize(children) == 1) {
+			if (ast_node->type == AST_MEMORY && GetSize(ast_node->children) == 1) {
 				// Single-bit memories must have [0:0] range
 				AstNode *rng = make_range(0, 0);
-				children.insert(children.begin(), rng);
+				ast_node->children.insert(ast_node->children.begin(), rng);
 			}
 			did_something = true;
 		}
-		log_assert(!is_custom_type);
+		log_assert(!ast_node->is_custom_type);
 	}
 
 	// resolve types of parameters
-	if (type == AST_LOCALPARAM || type == AST_PARAMETER) {
-		if (is_custom_type) {
-			log_assert(children.size() == 2);
-			log_assert(children[1]->type == AST_WIRETYPE);
-			auto type_name = children[1]->str;
+	if (ast_node->type == AST_LOCALPARAM || ast_node->type == AST_PARAMETER) {
+		if (ast_node->is_custom_type) {
+			log_assert(ast_node->children.size() == 2);
+			log_assert(ast_node->children[1]->type == AST_WIRETYPE);
+			auto type_name = ast_node->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());
+				log_file_error(ast_node->filename, ast_node->location.first_line, "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());
+				log_file_error(ast_node->filename, ast_node->location.first_line, "`%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];
 
 			// Ensure typedef itself is fully simplified
-			while (template_node->simplify(const_fold, at_zero, in_lvalue, stage, width_hint, sign_hint, in_param)) {};
+			while (simplify(template_node, const_fold, at_zero, in_lvalue, stage, width_hint, sign_hint, in_param)) {};
 
 			if (template_node->type == AST_STRUCT || template_node->type == AST_UNION) {
 				// replace with wire representing the packed structure
-				newNode = make_packed_struct(template_node, str);
-				newNode->attributes[ID::wiretype] = mkconst_str(resolved_type_node->str);
-				newNode->type = type;
-				current_scope[str] = this;
+				newNode = make_packed_struct(template_node, ast_node->str);
+				newNode->attributes[ID::wiretype] = ast_node->mkconst_str(resolved_type_node->str);
+				newNode->type = ast_node->type;
+				current_scope[ast_node->str] = ast_node;
 				// copy param value, it needs to be 1st value
-				delete children[1];
-				children.pop_back();
-				newNode->children.insert(newNode->children.begin(), children[0]->clone());
+				delete ast_node->children[1];
+				ast_node->children.pop_back();
+				newNode->children.insert(newNode->children.begin(), ast_node->children[0]->clone());
 				goto apply_newNode;
 			}
-			delete children[1];
-			children.pop_back();
+			delete ast_node->children[1];
+			ast_node->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());
-			is_signed = template_node->is_signed;
-			is_string = template_node->is_string;
-			is_custom_type = template_node->is_custom_type;
+				log_file_error(ast_node->filename, ast_node->location.first_line, "unpacked array type `%s' cannot be used for a parameter\n", ast_node->children[1]->str.c_str());
+			ast_node->is_signed = template_node->is_signed;
+			ast_node->is_string = template_node->is_string;
+			ast_node->is_custom_type = template_node->is_custom_type;
 
-			range_valid = template_node->range_valid;
-			range_swapped = template_node->range_swapped;
-			range_left = template_node->range_left;
-			range_right = template_node->range_right;
-			attributes[ID::wiretype] = mkconst_str(resolved_type_node->str);
+			ast_node->range_valid = template_node->range_valid;
+			ast_node->range_swapped = template_node->range_swapped;
+			ast_node->range_left = template_node->range_left;
+			ast_node->range_right = template_node->range_right;
+			ast_node->attributes[ID::wiretype] = ast_node->mkconst_str(resolved_type_node->str);
 			for (auto template_child : template_node->children)
-				children.push_back(template_child->clone());
+				ast_node->children.push_back(template_child->clone());
 			did_something = true;
 		}
-		log_assert(!is_custom_type);
+		log_assert(!ast_node->is_custom_type);
 	}
 
 	// resolve constant prefixes
-	if (type == AST_PREFIX) {
-		if (children[0]->type != AST_CONSTANT) {
+	if (ast_node->type == AST_PREFIX) {
+		if (ast_node->children[0]->type != AST_CONSTANT) {
 			// dumpAst(NULL, ">   ");
-			log_file_error(filename, location.first_line, "Index in generate block prefix syntax is not constant!\n");
+			log_file_error(ast_node->filename, ast_node->location.first_line, "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);
-		log_assert(children[1]->type == AST_IDENTIFIER);
-		newNode = children[1]->clone();
-		const char *second_part = children[1]->str.c_str();
+		if (ast_node->children[1]->type == AST_PREFIX)
+			simplify(ast_node->children[1], const_fold, at_zero, in_lvalue, stage, width_hint, sign_hint, in_param);
+		log_assert(ast_node->children[1]->type == AST_IDENTIFIER);
+		newNode = ast_node->children[1]->clone();
+		const char *second_part = ast_node->children[1]->str.c_str();
 		if (second_part[0] == '\\')
 			second_part++;
-		newNode->str = stringf("%s[%d].%s", str.c_str(), children[0]->integer, second_part);
+		newNode->str = stringf("%s[%d].%s", ast_node->str.c_str(), ast_node->children[0]->integer, second_part);
 		goto apply_newNode;
 	}
 
 	// 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");
-		if (children[1]->type != AST_CONSTANT)
-			log_file_error(filename, location.first_line, "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);
+	if (ast_node->type == AST_TO_BITS) {
+		if (ast_node->children[0]->type != AST_CONSTANT)
+			log_file_error(ast_node->filename, ast_node->location.first_line, "Left operand of to_bits expression is not constant!\n");
+		if (ast_node->children[1]->type != AST_CONSTANT)
+			log_file_error(ast_node->filename, ast_node->location.first_line, "Right operand of to_bits expression is not constant!\n");
+		RTLIL::Const new_value = ast_node->children[1]->bitsAsConst(ast_node->children[0]->bitsAsConst().as_int(), ast_node->children[1]->is_signed);
+		newNode = AstNode::mkconst_bits(new_value.bits, ast_node->children[1]->is_signed);
 		goto apply_newNode;
 	}
 
 	// annotate constant ranges
-	if (type == AST_RANGE) {
-		bool old_range_valid = range_valid;
-		range_valid = false;
-		range_swapped = false;
-		range_left = -1;
-		range_right = 0;
-		log_assert(children.size() >= 1);
-		if (children[0]->type == AST_CONSTANT) {
-			range_valid = true;
-			range_left = children[0]->integer;
-			if (children.size() == 1)
-				range_right = range_left;
+	if (ast_node->type == AST_RANGE) {
+		bool old_range_valid = ast_node->range_valid;
+		ast_node->range_valid = false;
+		ast_node->range_swapped = false;
+		ast_node->range_left = -1;
+		ast_node->range_right = 0;
+		log_assert(ast_node->children.size() >= 1);
+		if (ast_node->children[0]->type == AST_CONSTANT) {
+			ast_node->range_valid = true;
+			ast_node->range_left = ast_node->children[0]->integer;
+			if (ast_node->children.size() == 1)
+				ast_node->range_right = ast_node->range_left;
 		}
-		if (children.size() >= 2) {
-			if (children[1]->type == AST_CONSTANT)
-				range_right = children[1]->integer;
+		if (ast_node->children.size() >= 2) {
+			if (ast_node->children[1]->type == AST_CONSTANT)
+				ast_node->range_right = ast_node->children[1]->integer;
 			else
-				range_valid = false;
+				ast_node->range_valid = false;
 		}
-		if (old_range_valid != range_valid)
+		if (old_range_valid != ast_node->range_valid)
 			did_something = true;
-		if (range_valid && range_right > range_left) {
-			int tmp = range_right;
-			range_right = range_left;
-			range_left = tmp;
-			range_swapped = true;
+		if (ast_node->range_valid && ast_node->range_right > ast_node->range_left) {
+			int tmp = ast_node->range_right;
+			ast_node->range_right = ast_node->range_left;
+			ast_node->range_left = tmp;
+			ast_node->range_swapped = true;
 		}
 	}
 
 	// annotate wires with their ranges
-	if (type == AST_WIRE) {
-		if (children.size() > 0) {
-			if (children[0]->range_valid) {
-				if (!range_valid)
+	if (ast_node->type == AST_WIRE) {
+		if (ast_node->children.size() > 0) {
+			if (ast_node->children[0]->range_valid) {
+				if (!ast_node->range_valid)
 					did_something = true;
-				range_valid = true;
-				range_swapped = children[0]->range_swapped;
-				range_left = children[0]->range_left;
-				range_right = children[0]->range_right;
+				ast_node->range_valid = true;
+				ast_node->range_swapped = ast_node->children[0]->range_swapped;
+				ast_node->range_left = ast_node->children[0]->range_left;
+				ast_node->range_right = ast_node->children[0]->range_right;
 				bool force_upto = false, force_downto = false;
-				if (attributes.count(ID::force_upto)) {
-					AstNode *val = attributes[ID::force_upto];
+				if (ast_node->attributes.count(ID::force_upto)) {
+					AstNode *val = ast_node->attributes[ID::force_upto];
 					if (val->type != AST_CONSTANT)
-						log_file_error(filename, location.first_line, "Attribute `force_upto' with non-constant value!\n");
+						log_file_error(ast_node->filename, ast_node->location.first_line, "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 (ast_node->attributes.count(ID::force_downto)) {
+					AstNode *val = ast_node->attributes[ID::force_downto];
 					if (val->type != AST_CONSTANT)
-						log_file_error(filename, location.first_line, "Attribute `force_downto' with non-constant value!\n");
+						log_file_error(ast_node->filename, ast_node->location.first_line, "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");
-				if ((force_upto && !range_swapped) || (force_downto && range_swapped)) {
-					std::swap(range_left, range_right);
-					range_swapped = force_upto;
+					log_file_error(ast_node->filename, ast_node->location.first_line, "Attributes `force_downto' and `force_upto' cannot be both set!\n");
+				if ((force_upto && !ast_node->range_swapped) || (force_downto && ast_node->range_swapped)) {
+					std::swap(ast_node->range_left, ast_node->range_right);
+					ast_node->range_swapped = force_upto;
 				}
 			}
 		} else {
-			if (!range_valid)
+			if (!ast_node->range_valid)
 				did_something = true;
-			range_valid = true;
-			range_swapped = false;
-			range_left = 0;
-			range_right = 0;
+			ast_node->range_valid = true;
+			ast_node->range_swapped = false;
+			ast_node->range_left = 0;
+			ast_node->range_right = 0;
 		}
 	}
 
 	// resolve multiranges on memory decl
-	if (type == AST_MEMORY && children.size() > 1 && children[1]->type == AST_MULTIRANGE)
+	if (ast_node->type == AST_MEMORY && ast_node->children.size() > 1 && ast_node->children[1]->type == AST_MULTIRANGE)
 	{
 		int total_size = 1;
-		multirange_dimensions.clear();
-		multirange_swapped.clear();
-		for (auto range : children[1]->children) {
+		ast_node->multirange_dimensions.clear();
+		ast_node->multirange_swapped.clear();
+		for (auto range : ast_node->children[1]->children) {
 			if (!range->range_valid)
-				log_file_error(filename, location.first_line, "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);
-			total_size *= multirange_dimensions.back();
+				log_file_error(ast_node->filename, ast_node->location.first_line, "Non-constant range on memory decl.\n");
+			ast_node->multirange_dimensions.push_back(min(range->range_left, range->range_right));
+			ast_node->multirange_dimensions.push_back(max(range->range_left, range->range_right) - min(range->range_left, range->range_right) + 1);
+			ast_node->multirange_swapped.push_back(range->range_swapped);
+			total_size *= ast_node->multirange_dimensions.back();
 		}
-		delete children[1];
-		children[1] = new AstNode(AST_RANGE, AstNode::mkconst_int(0, true), AstNode::mkconst_int(total_size-1, true));
+		delete ast_node->children[1];
+		ast_node->children[1] = new AstNode(AST_RANGE, ast_node->mkconst_int(0, true), ast_node->mkconst_int(total_size-1, true));
 		did_something = true;
 	}
 
 	// resolve multiranges on memory access
-	if (type == AST_IDENTIFIER && id2ast && id2ast->type == AST_MEMORY && children.size() > 0 && children[0]->type == AST_MULTIRANGE)
+	if (ast_node->type == AST_IDENTIFIER && ast_node->id2ast && ast_node->id2ast->type == AST_MEMORY && ast_node->children.size() > 0 && ast_node->children[0]->type == AST_MULTIRANGE)
 	{
 		AstNode *index_expr = nullptr;
 
-		integer = children[0]->children.size(); // save original number of dimensions for $size() etc.
-		for (int i = 0; 2*i < GetSize(id2ast->multirange_dimensions); i++)
+		ast_node->integer = ast_node->children[0]->children.size(); // save original number of dimensions for $size() etc.
+		for (int i = 0; 2*i < GetSize(ast_node->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));
+			if (GetSize(ast_node->children[0]->children) <= i)
+				log_file_error(ast_node->filename, ast_node->location.first_line, "Insufficient number of array indices for %s.\n", log_id(ast_node->str));
 
-			AstNode *new_index_expr = children[0]->children[i]->children.at(0)->clone();
+			AstNode *new_index_expr = ast_node->children[0]->children[i]->children.at(0)->clone();
 
-			if (id2ast->multirange_dimensions[2*i])
-				new_index_expr = new AstNode(AST_SUB, new_index_expr, AstNode::mkconst_int(id2ast->multirange_dimensions[2*i], true));
+			if (ast_node->id2ast->multirange_dimensions[2*i])
+				new_index_expr = new AstNode(AST_SUB, new_index_expr, ast_node->mkconst_int(ast_node->id2ast->multirange_dimensions[2*i], true));
 
 			if (i == 0)
 				index_expr = new_index_expr;
 			else
-				index_expr = new AstNode(AST_ADD, new AstNode(AST_MUL, index_expr, AstNode::mkconst_int(id2ast->multirange_dimensions[2*i+1], true)), new_index_expr);
+				index_expr = new AstNode(AST_ADD, new AstNode(AST_MUL, index_expr, ast_node->mkconst_int(ast_node->id2ast->multirange_dimensions[2*i+1], true)), new_index_expr);
 		}
 
-		for (int i = GetSize(id2ast->multirange_dimensions)/2; i < GetSize(children[0]->children); i++)
-			children.push_back(children[0]->children[i]->clone());
+		for (int i = GetSize(ast_node->id2ast->multirange_dimensions)/2; i < GetSize(ast_node->children[0]->children); i++)
+			ast_node->children.push_back(ast_node->children[0]->children[i]->clone());
 
-		delete children[0];
+		delete ast_node->children[0];
 		if (index_expr == nullptr)
-			children.erase(children.begin());
+			ast_node->children.erase(ast_node->children.begin());
 		else
-			children[0] = new AstNode(AST_RANGE, index_expr);
+			ast_node->children[0] = new AstNode(AST_RANGE, index_expr);
 
 		did_something = true;
 	}
 
 	// trim/extend parameters
-	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");
-			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);
-				log_file_warning(filename, location.first_line, "converting real value %e to binary %s.\n",
-						children[0]->realvalue, log_signal(constvalue));
-				delete children[0];
-				children[0] = mkconst_bits(constvalue.bits, sign_hint);
+	if (ast_node->type == AST_PARAMETER || ast_node->type == AST_LOCALPARAM || ast_node->type == AST_ENUM_ITEM) {
+		if (ast_node->children.size() > 1 && ast_node->children[1]->type == AST_RANGE) {
+			if (!ast_node->children[1]->range_valid)
+				log_file_error(ast_node->filename, ast_node->location.first_line, "Non-constant width range on parameter decl.\n");
+			int width = std::abs(ast_node->children[1]->range_left - ast_node->children[1]->range_right) + 1;
+			if (ast_node->children[0]->type == AST_REALVALUE) {
+				RTLIL::Const constvalue = ast_node->children[0]->realAsConst(width);
+				log_file_warning(ast_node->filename, ast_node->location.first_line, "converting real value %e to binary %s.\n",
+						ast_node->children[0]->realvalue, log_signal(constvalue));
+				delete ast_node->children[0];
+				ast_node->children[0] = AstNode::mkconst_bits(constvalue.bits, sign_hint);
 				did_something = true;
 			}
-			if (children[0]->type == AST_CONSTANT) {
-				if (width != int(children[0]->bits.size())) {
-					RTLIL::SigSpec sig(children[0]->bits);
-					sig.extend_u0(width, children[0]->is_signed);
-					AstNode *old_child_0 = children[0];
-					children[0] = mkconst_bits(sig.as_const().bits, is_signed);
+			if (ast_node->children[0]->type == AST_CONSTANT) {
+				if (width != int(ast_node->children[0]->bits.size())) {
+					RTLIL::SigSpec sig(ast_node->children[0]->bits);
+					sig.extend_u0(width, ast_node->children[0]->is_signed);
+					AstNode *old_child_0 = ast_node->children[0];
+					ast_node->children[0] = AstNode::mkconst_bits(sig.as_const().bits, ast_node->is_signed);
 					delete old_child_0;
 				}
-				children[0]->is_signed = is_signed;
+				ast_node->children[0]->is_signed = ast_node->is_signed;
 			}
-			range_valid = true;
-			range_swapped = children[1]->range_swapped;
-			range_left = children[1]->range_left;
-			range_right = children[1]->range_right;
+			ast_node->range_valid = true;
+			ast_node->range_swapped = ast_node->children[1]->range_swapped;
+			ast_node->range_left = ast_node->children[1]->range_left;
+			ast_node->range_right = ast_node->children[1]->range_right;
 		} else
-		if (children.size() > 1 && children[1]->type == AST_REALVALUE && children[0]->type == AST_CONSTANT) {
-			double as_realvalue = children[0]->asReal(sign_hint);
-			delete children[0];
-			children[0] = new AstNode(AST_REALVALUE);
-			children[0]->realvalue = as_realvalue;
+		if (ast_node->children.size() > 1 && ast_node->children[1]->type == AST_REALVALUE && ast_node->children[0]->type == AST_CONSTANT) {
+			double as_realvalue = ast_node->children[0]->asReal(sign_hint);
+			delete ast_node->children[0];
+			ast_node->children[0] = new AstNode(AST_REALVALUE);
+			ast_node->children[0]->realvalue = as_realvalue;
 			did_something = true;
 		}
 	}
 
-	if (type == AST_IDENTIFIER && !basic_prep) {
+	if (ast_node->type == AST_IDENTIFIER && !ast_node->basic_prep) {
 		// check if a plausible struct member sss.mmmm
 		std::string sname;
-		if (name_has_dot(str, sname)) {
-			if (current_scope.count(str) > 0) {
-				auto item_node = current_scope[str];
+		if (name_has_dot(ast_node->str, sname)) {
+			if (current_scope.count(ast_node->str) > 0) {
+				auto item_node = current_scope[ast_node->str];
 				if (item_node->type == AST_STRUCT_ITEM || item_node->type == AST_STRUCT || item_node->type == AST_UNION) {
-					// structure member, rewrite this node to reference the packed struct wire
-					auto range = make_struct_member_range(this, item_node);
+					// structure member, rewrite ast_node node to reference the packed struct wire
+					auto range = AST::make_struct_member_range(ast_node, item_node);
 					newNode = new AstNode(AST_IDENTIFIER, range);
 					newNode->str = sname;
 					// save type and original number of dimensions for $size() etc.
 					newNode->attributes[ID::wiretype] = item_node->clone();
-					if (!item_node->multirange_dimensions.empty() && children.size() > 0) {
-						if (children[0]->type == AST_RANGE)
+					if (!item_node->multirange_dimensions.empty() && ast_node->children.size() > 0) {
+						if (ast_node->children[0]->type == AST_RANGE)
 							newNode->integer = 1;
-						else if (children[0]->type == AST_MULTIRANGE)
-							newNode->integer = children[0]->children.size();
+						else if (ast_node->children[0]->type == AST_MULTIRANGE)
+							newNode->integer = ast_node->children[0]->children.size();
 					}
 					newNode->basic_prep = true;
 					if (item_node->is_signed)
@@ -1806,10 +1802,10 @@
 		}
 	}
 	// annotate identifiers using scope resolution and create auto-wires as needed
-	if (type == AST_IDENTIFIER) {
-		if (current_scope.count(str) == 0) {
+	if (ast_node->type == AST_IDENTIFIER) {
+		if (current_scope.count(ast_node->str) == 0) {
 			AstNode *current_scope_ast = (current_ast_mod == nullptr) ? current_ast : current_ast_mod;
-			str = try_pop_module_prefix();
+			ast_node->str = ast_node->try_pop_module_prefix();
 			for (auto node : current_scope_ast->children) {
 				//log("looking at mod scope child %s\n", type2str(node->type).c_str());
 				switch (node->type) {
@@ -1823,8 +1819,8 @@
 				case AST_TASK:
 				case AST_DPI_FUNCTION:
 					//log("found child %s, %s\n", type2str(node->type).c_str(), node->str.c_str());
-					if (str == node->str) {
-						//log("add %s, type %s to scope\n", str.c_str(), type2str(node->type).c_str());
+					if (ast_node->str == node->str) {
+						//log("add %s, type %s to scope\n", ast_node->str.c_str(), type2str(node->type).c_str());
 						current_scope[node->str] = node;
 					}
 					break;
@@ -1832,9 +1828,9 @@
 					current_scope[node->str] = node;
 					for (auto enum_node : node->children) {
 						log_assert(enum_node->type==AST_ENUM_ITEM);
-						if (str == enum_node->str) {
-							//log("\nadding enum item %s to scope\n", str.c_str());
-							current_scope[str] = enum_node;
+						if (ast_node->str == enum_node->str) {
+							//log("\nadding enum item %s to scope\n", ast_node->str.c_str());
+							current_scope[ast_node->str] = enum_node;
 						}
 					}
 					break;
@@ -1843,52 +1839,52 @@
 				}
 			}
 		}
-		if (current_scope.count(str) == 0) {
+		if (current_scope.count(ast_node->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());
-			} else if (flag_autowire || str == "\\$global_clock") {
+				log_file_error(ast_node->filename, ast_node->location.first_line, "Identifier `%s' is implicitly declared outside of a module.\n", ast_node->str.c_str());
+			} else if (flag_autowire || ast_node->str == "\\$global_clock") {
 				AstNode *auto_wire = new AstNode(AST_AUTOWIRE);
-				auto_wire->str = str;
+				auto_wire->str = ast_node->str;
 				current_ast_mod->children.push_back(auto_wire);
-				current_scope[str] = auto_wire;
+				current_scope[ast_node->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());
+				log_file_error(ast_node->filename, ast_node->location.first_line, "Identifier `%s' is implicitly declared and `default_nettype is set to none.\n", ast_node->str.c_str());
 			}
 		}
-		if (id2ast != current_scope[str]) {
-			id2ast = current_scope[str];
+		if (ast_node->id2ast != current_scope[ast_node->str]) {
+			ast_node->id2ast = current_scope[ast_node->str];
 			did_something = true;
 		}
 	}
 
 	// split memory access with bit select to individual statements
-	if (type == AST_IDENTIFIER && children.size() == 2 && children[0]->type == AST_RANGE && children[1]->type == AST_RANGE && !in_lvalue && stage == 2)
+	if (ast_node->type == AST_IDENTIFIER && ast_node->children.size() == 2 && ast_node->children[0]->type == AST_RANGE && ast_node->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");
+		if (ast_node->id2ast == NULL || ast_node->id2ast->type != AST_MEMORY || ast_node->children[0]->children.size() != 1)
+			log_file_error(ast_node->filename, ast_node->location.first_line, "Invalid bit-select on memory access!\n");
 
 		int mem_width, mem_size, addr_bits;
-		id2ast->meminfo(mem_width, mem_size, addr_bits);
+		ast_node->id2ast->meminfo(mem_width, mem_size, addr_bits);
 
-		int data_range_left = id2ast->children[0]->range_left;
-		int data_range_right = id2ast->children[0]->range_right;
+		int data_range_left = ast_node->id2ast->children[0]->range_left;
+		int data_range_right = ast_node->id2ast->children[0]->range_right;
 
-		if (id2ast->children[0]->range_swapped)
+		if (ast_node->id2ast->children[0]->range_swapped)
 			std::swap(data_range_left, data_range_right);
 
 		std::stringstream sstr;
-		sstr << "$mem2bits$" << str << "$" << encode_filename(filename) << ":" << location.first_line << "$" << (autoidx++);
+		sstr << "$mem2bits$" << ast_node->str << "$" << encode_filename(ast_node->filename) << ":" << ast_node->location.first_line << "$" << (autoidx++);
 		std::string wire_id = sstr.str();
 
-		AstNode *wire = new AstNode(AST_WIRE, new AstNode(AST_RANGE, mkconst_int(data_range_left, true), mkconst_int(data_range_right, true)));
+		AstNode *wire = new AstNode(AST_WIRE, new AstNode(AST_RANGE, ast_node->mkconst_int(data_range_left, true), ast_node->mkconst_int(data_range_right, true)));
 		wire->str = wire_id;
 		if (current_block)
-			wire->attributes[ID::nosync] = AstNode::mkconst_int(1, false);
+			wire->attributes[ID::nosync] = ast_node->mkconst_int(1, false);
 		current_ast_mod->children.push_back(wire);
-		while (wire->simplify(true, false, false, 1, -1, false, false)) { }
+		while (simplify(wire, true, false, false, 1, -1, false, false)) { }
 
-		AstNode *data = clone();
+		AstNode *data = ast_node->clone();
 		delete data->children[1];
 		data->children.pop_back();
 
@@ -1912,32 +1908,32 @@
 			current_ast_mod->children.push_back(proc);
 		}
 
-		newNode = new AstNode(AST_IDENTIFIER, children[1]->clone());
+		newNode = new AstNode(AST_IDENTIFIER, ast_node->children[1]->clone());
 		newNode->str = wire_id;
-		newNode->integer = integer; // save original number of dimensions for $size() etc.
+		newNode->integer = ast_node->integer; // save original number of dimensions for $size() etc.
 		newNode->id2ast = wire;
 		goto apply_newNode;
 	}
 
-	if (type == AST_WHILE)
-		log_file_error(filename, location.first_line, "While loops are only allowed in constant functions!\n");
+	if (ast_node->type == AST_WHILE)
+		log_file_error(ast_node->filename, ast_node->location.first_line, "While loops are only allowed in constant functions!\n");
 
-	if (type == AST_REPEAT)
+	if (ast_node->type == AST_REPEAT)
 	{
-		AstNode *count = children[0];
-		AstNode *body = children[1];
+		AstNode *count = ast_node->children[0];
+		AstNode *body = ast_node->children[1];
 
 		// eval count expression
-		while (count->simplify(true, false, false, stage, 32, true, false)) { }
+		while (simplify(count, 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");
+			log_file_error(ast_node->filename, ast_node->location.first_line, "Repeat loops outside must have constant repeat counts!\n");
 
 		// convert to a block with the body repeated n times
-		type = AST_BLOCK;
-		children.clear();
+		ast_node->type = AST_BLOCK;
+		ast_node->children.clear();
 		for (int i = 0; i < count->bitsAsConst().as_int(); i++)
-			children.insert(children.begin(), body->clone());
+			ast_node->children.insert(ast_node->children.begin(), body->clone());
 
 		delete count;
 		delete body;
@@ -1945,12 +1941,12 @@
 	}
 
 	// unroll for loops and generate-for blocks
-	if ((type == AST_GENFOR || type == AST_FOR) && children.size() != 0)
+	if ((ast_node->type == AST_GENFOR || ast_node->type == AST_FOR) && ast_node->children.size() != 0)
 	{
-		AstNode *init_ast = children[0];
-		AstNode *while_ast = children[1];
-		AstNode *next_ast = children[2];
-		AstNode *body_ast = children[3];
+		AstNode *init_ast = ast_node->children[0];
+		AstNode *while_ast = ast_node->children[1];
+		AstNode *next_ast = ast_node->children[2];
+		AstNode *body_ast = ast_node->children[3];
 
 		while (body_ast->type == AST_GENBLOCK && body_ast->str.empty() &&
 				body_ast->children.size() == 1 && body_ast->children.at(0)->type == AST_GENBLOCK)
@@ -1959,24 +1955,24 @@
 		const char* loop_type_str = "procedural";
 		const char* var_type_str = "register";
 		AstNodeType var_type = AST_WIRE;
-		if (type == AST_GENFOR) {
+		if (ast_node->type == AST_GENFOR) {
 			loop_type_str = "generate";
 			var_type_str = "genvar";
 			var_type = AST_GENVAR;
 		}
 
 		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);
+			log_file_error(ast_node->filename, ast_node->location.first_line, "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);
+			log_file_error(ast_node->filename, ast_node->location.first_line, "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);
+			log_file_error(ast_node->filename, ast_node->location.first_line, "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);
+			log_file_error(ast_node->filename, ast_node->location.first_line, "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);
+			log_file_error(ast_node->filename, ast_node->location.first_line, "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();
@@ -1984,11 +1980,11 @@
 			int expr_width_hint = -1;
 			bool expr_sign_hint = true;
 			varbuf->detectSignWidth(expr_width_hint, expr_sign_hint);
-			while (varbuf->simplify(true, false, false, stage, 32, true, false)) { }
+			while (simplify(varbuf, true, false, false, stage, 32, true, false)) { }
 		}
 
 		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);
+			log_file_error(ast_node->filename, ast_node->location.first_line, "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) {
@@ -2011,7 +2007,7 @@
 		current_scope[varbuf->str] = varbuf;
 
 		size_t current_block_idx = 0;
-		if (type == AST_FOR) {
+		if (ast_node->type == AST_FOR) {
 			while (current_block_idx < current_block->children.size() &&
 					current_block->children[current_block_idx] != current_block_child)
 				current_block_idx++;
@@ -2025,11 +2021,11 @@
 				int expr_width_hint = -1;
 				bool expr_sign_hint = true;
 				buf->detectSignWidth(expr_width_hint, expr_sign_hint);
-				while (buf->simplify(true, false, false, stage, expr_width_hint, expr_sign_hint, false)) { }
+				while (simplify(buf, true, false, false, stage, expr_width_hint, expr_sign_hint, false)) { }
 			}
 
 			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);
+				log_file_error(ast_node->filename, ast_node->location.first_line, "2nd expression of %s for-loop is not constant!\n", loop_type_str);
 
 			if (buf->integer == 0) {
 				delete buf;
@@ -2058,9 +2054,9 @@
 
 			buf->expand_genblock(prefix);
 
-			if (type == AST_GENFOR) {
+			if (ast_node->type == AST_GENFOR) {
 				for (size_t i = 0; i < buf->children.size(); i++) {
-					buf->children[i]->simplify(const_fold, false, false, stage, -1, false, false);
+					simplify(buf->children[i], const_fold, false, false, stage, -1, false, false);
 					current_ast_mod->children.push_back(buf->children[i]);
 				}
 			} else {
@@ -2076,17 +2072,17 @@
 				int expr_width_hint = -1;
 				bool expr_sign_hint = true;
 				buf->detectSignWidth(expr_width_hint, expr_sign_hint);
-				while (buf->simplify(true, false, false, stage, expr_width_hint, expr_sign_hint, true)) { }
+				while (simplify(buf, true, false, false, stage, expr_width_hint, expr_sign_hint, true)) { }
 			}
 
 			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());
+				log_file_error(ast_node->filename, ast_node->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());
 
 			delete varbuf->children[0];
 			varbuf->children[0] = buf;
 		}
 
-		if (type == AST_FOR) {
+		if (ast_node->type == AST_FOR) {
 			AstNode *buf = next_ast->clone();
 			delete buf->children[1];
 			buf->children[1] = varbuf->children[0]->clone();
@@ -2095,82 +2091,82 @@
 
 		current_scope[varbuf->str] = backup_scope_varbuf;
 		delete varbuf;
-		delete_children();
+		ast_node->delete_children();
 		did_something = true;
 	}
 
 	// check for local objects in unnamed block
-	if (type == AST_BLOCK && str.empty())
+	if (ast_node->type == AST_BLOCK && ast_node->str.empty())
 	{
-		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)
+		for (size_t i = 0; i < ast_node->children.size(); i++)
+			if (ast_node->children[i]->type == AST_WIRE || ast_node->children[i]->type == AST_MEMORY || ast_node->children[i]->type == AST_PARAMETER || ast_node->children[i]->type == AST_LOCALPARAM || ast_node->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");
+				log_file_error(ast_node->children[i]->filename, ast_node->children[i]->location.first_line, "Local declaration in unnamed block is only supported in SystemVerilog mode!\n");
 			}
 	}
 
 	// transform block with name
-	if (type == AST_BLOCK && !str.empty())
+	if (ast_node->type == AST_BLOCK && !ast_node->str.empty())
 	{
-		expand_genblock(str + ".");
+		ast_node->expand_genblock(ast_node->str + ".");
 
-		// if this is an autonamed block is in an always_comb
+		// if ast_node is an autonamed block is in an always_comb
 		if (current_always && current_always->attributes.count(ID::always_comb)
-				&& is_autonamed_block(str))
-			// track local variables in this block so we can consider adding
+				&& is_autonamed_block(ast_node->str))
+			// track local variables in ast_node block so we can consider adding
 			// nosync once the block has been fully elaborated
-			for (AstNode *child : children)
+			for (AstNode *child : ast_node->children)
 				if (child->type == AST_WIRE &&
 						!child->attributes.count(ID::nosync))
-					mark_auto_nosync(this, child);
+					mark_auto_nosync(ast_node, child);
 
 		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, false, stage, -1, false, false);
-				current_ast_mod->children.push_back(children[i]);
-				current_scope[children[i]->str] = children[i];
+		for (size_t i = 0; i < ast_node->children.size(); i++)
+			if (ast_node->children[i]->type == AST_WIRE || ast_node->children[i]->type == AST_MEMORY || ast_node->children[i]->type == AST_PARAMETER || ast_node->children[i]->type == AST_LOCALPARAM || ast_node->children[i]->type == AST_TYPEDEF) {
+				simplify(ast_node->children[i], false, false, false, stage, -1, false, false);
+				current_ast_mod->children.push_back(ast_node->children[i]);
+				current_scope[ast_node->children[i]->str] = ast_node->children[i];
 			} else
-				new_children.push_back(children[i]);
+				new_children.push_back(ast_node->children[i]);
 
-		children.swap(new_children);
+		ast_node->children.swap(new_children);
 		did_something = true;
-		str.clear();
+		ast_node->str.clear();
 	}
 
 	// simplify unconditional generate block
-	if (type == AST_GENBLOCK && children.size() != 0)
+	if (ast_node->type == AST_GENBLOCK && ast_node->children.size() != 0)
 	{
-		if (!str.empty()) {
-			expand_genblock(str + ".");
+		if (!ast_node->str.empty()) {
+			ast_node->expand_genblock(ast_node->str + ".");
 		}
 
-		for (size_t i = 0; i < children.size(); i++) {
-			children[i]->simplify(const_fold, false, false, stage, -1, false, false);
-			current_ast_mod->children.push_back(children[i]);
+		for (size_t i = 0; i < ast_node->children.size(); i++) {
+			simplify(ast_node->children[i], const_fold, false, false, stage, -1, false, false);
+			current_ast_mod->children.push_back(ast_node->children[i]);
 		}
 
-		children.clear();
+		ast_node->children.clear();
 		did_something = true;
 	}
 
 	// simplify generate-if blocks
-	if (type == AST_GENIF && children.size() != 0)
+	if (ast_node->type == AST_GENIF && ast_node->children.size() != 0)
 	{
-		AstNode *buf = children[0]->clone();
-		while (buf->simplify(true, false, false, stage, width_hint, sign_hint, false)) { }
+		AstNode *buf = ast_node->children[0]->clone();
+		while (simplify(buf, true, false, false, stage, width_hint, sign_hint, false)) { }
 		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");
+			log_file_error(ast_node->filename, ast_node->location.first_line, "Condition for generate if is not constant!\n");
 		}
 		if (buf->asBool() != 0) {
 			delete buf;
-			buf = children[1]->clone();
+			buf = ast_node->children[1]->clone();
 		} else {
 			delete buf;
-			buf = children.size() > 2 ? children[2]->clone() : NULL;
+			buf = ast_node->children.size() > 2 ? ast_node->children[2]->clone() : NULL;
 		}
 
 		if (buf)
@@ -2183,7 +2179,7 @@
 			}
 
 			for (size_t i = 0; i < buf->children.size(); i++) {
-				buf->children[i]->simplify(const_fold, false, false, stage, -1, false, false);
+				simplify(buf->children[i], const_fold, false, false, stage, -1, false, false);
 				current_ast_mod->children.push_back(buf->children[i]);
 			}
 
@@ -2191,19 +2187,19 @@
 			delete buf;
 		}
 
-		delete_children();
+		ast_node->delete_children();
 		did_something = true;
 	}
 
 	// simplify generate-case blocks
-	if (type == AST_GENCASE && children.size() != 0)
+	if (ast_node->type == AST_GENCASE && ast_node->children.size() != 0)
 	{
-		AstNode *buf = children[0]->clone();
-		while (buf->simplify(true, false, false, stage, width_hint, sign_hint, false)) { }
+		AstNode *buf = ast_node->children[0]->clone();
+		while (simplify(buf, true, false, false, stage, width_hint, sign_hint, false)) { }
 		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");
+			log_file_error(ast_node->filename, ast_node->location.first_line, "Condition for generate case is not constant!\n");
 		}
 
 		bool ref_signed = buf->is_signed;
@@ -2211,18 +2207,18 @@
 		delete buf;
 
 		AstNode *selected_case = NULL;
-		for (size_t i = 1; i < children.size(); i++)
+		for (size_t i = 1; i < ast_node->children.size(); i++)
 		{
-			log_assert(children.at(i)->type == AST_COND || children.at(i)->type == AST_CONDX || children.at(i)->type == AST_CONDZ);
+			log_assert(ast_node->children.at(i)->type == AST_COND || ast_node->children.at(i)->type == AST_CONDX || ast_node->children.at(i)->type == AST_CONDZ);
 
 			AstNode *this_genblock = NULL;
-			for (auto child : children.at(i)->children) {
+			for (auto child : ast_node->children.at(i)->children) {
 				log_assert(this_genblock == NULL);
 				if (child->type == AST_GENBLOCK)
 					this_genblock = child;
 			}
 
-			for (auto child : children.at(i)->children)
+			for (auto child : ast_node->children.at(i)->children)
 			{
 				if (child->type == AST_DEFAULT) {
 					if (selected_case == NULL)
@@ -2233,11 +2229,11 @@
 					continue;
 
 				buf = child->clone();
-				while (buf->simplify(true, false, false, stage, width_hint, sign_hint, true)) { }
+				while (simplify(buf, true, false, false, stage, width_hint, sign_hint, true)) { }
 				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");
+					log_file_error(ast_node->filename, ast_node->location.first_line, "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();
@@ -2245,7 +2241,7 @@
 
 				if (is_selected) {
 					selected_case = this_genblock;
-					i = children.size();
+					i = ast_node->children.size();
 					break;
 				}
 			}
@@ -2261,7 +2257,7 @@
 			}
 
 			for (size_t i = 0; i < buf->children.size(); i++) {
-				buf->children[i]->simplify(const_fold, false, false, stage, -1, false, false);
+				simplify(buf->children[i], const_fold, false, false, stage, -1, false, false);
 				current_ast_mod->children.push_back(buf->children[i]);
 			}
 
@@ -2269,26 +2265,26 @@
 			delete buf;
 		}
 
-		delete_children();
+		ast_node->delete_children();
 		did_something = true;
 	}
 
 	// unroll cell arrays
-	if (type == AST_CELLARRAY)
+	if (ast_node->type == AST_CELLARRAY)
 	{
-		if (!children.at(0)->range_valid)
-			log_file_error(filename, location.first_line, "Non-constant array range on cell array.\n");
+		if (!ast_node->children.at(0)->range_valid)
+			log_file_error(ast_node->filename, ast_node->location.first_line, "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;
+		int num = max(ast_node->children.at(0)->range_left, ast_node->children.at(0)->range_right) - min(ast_node->children.at(0)->range_left, ast_node->children.at(0)->range_right) + 1;
 
 		for (int i = 0; i < num; i++) {
-			int idx = children.at(0)->range_left > children.at(0)->range_right ? children.at(0)->range_right + i : children.at(0)->range_right - i;
-			AstNode *new_cell = children.at(1)->clone();
+			int idx = ast_node->children.at(0)->range_left > ast_node->children.at(0)->range_right ? ast_node->children.at(0)->range_right + i : ast_node->children.at(0)->range_right - i;
+			AstNode *new_cell = ast_node->children.at(1)->clone();
 			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");
+				log_file_error(ast_node->filename, ast_node->location.first_line, "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());
@@ -2299,34 +2295,34 @@
 	}
 
 	// replace primitives with assignments
-	if (type == AST_PRIMITIVE)
+	if (ast_node->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());
+		if (ast_node->children.size() < 2)
+			log_file_error(ast_node->filename, ast_node->location.first_line, "Insufficient number of arguments for primitive `%s'!\n", ast_node->str.c_str());
 
 		std::vector<AstNode*> children_list;
-		for (auto child : children) {
+		for (auto child : ast_node->children) {
 			log_assert(child->type == AST_ARGUMENT);
 			log_assert(child->children.size() == 1);
 			children_list.push_back(child->children[0]);
 			child->children.clear();
 			delete child;
 		}
-		children.clear();
+		ast_node->children.clear();
 
-		if (str == "bufif0" || str == "bufif1" || str == "notif0" || str == "notif1")
+		if (ast_node->str == "bufif0" || ast_node->str == "bufif1" || ast_node->str == "notif0" || ast_node->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());
+				log_file_error(ast_node->filename, ast_node->location.first_line, "Invalid number of arguments for primitive `%s'!\n", ast_node->str.c_str());
 
 			std::vector<RTLIL::State> z_const(1, RTLIL::State::Sz);
 
 			AstNode *mux_input = children_list.at(1);
-			if (str == "notif0" || str == "notif1") {
+			if (ast_node->str == "notif0" || ast_node->str == "notif1") {
 				mux_input = new AstNode(AST_BIT_NOT, mux_input);
 			}
 			AstNode *node = new AstNode(AST_TERNARY, children_list.at(2));
-			if (str == "bufif0") {
+			if (ast_node->str == "bufif0") {
 				node->children.push_back(AstNode::mkconst_bits(z_const, false));
 				node->children.push_back(mux_input);
 			} else {
@@ -2334,17 +2330,17 @@
 				node->children.push_back(AstNode::mkconst_bits(z_const, false));
 			}
 
-			str.clear();
-			type = AST_ASSIGN;
-			children.push_back(children_list.at(0));
-			children.back()->was_checked = true;
-			children.push_back(node);
+			ast_node->str.clear();
+			ast_node->type = AST_ASSIGN;
+			ast_node->children.push_back(children_list.at(0));
+			ast_node->children.back()->was_checked = true;
+			ast_node->children.push_back(node);
 			did_something = true;
 		}
-		else if (str == "buf" || str == "not")
+		else if (ast_node->str == "buf" || ast_node->str == "not")
 		{
 			AstNode *input = children_list.back();
-			if (str == "not")
+			if (ast_node->str == "not")
 				input = new AstNode(AST_BIT_NOT, input);
 
 			newNode = new AstNode(AST_GENBLOCK);
@@ -2361,17 +2357,17 @@
 			AstNodeType op_type = AST_NONE;
 			bool invert_results = false;
 
-			if (str == "and")
+			if (ast_node->str == "and")
 				op_type = AST_BIT_AND;
-			if (str == "nand")
+			if (ast_node->str == "nand")
 				op_type = AST_BIT_AND, invert_results = true;
-			if (str == "or")
+			if (ast_node->str == "or")
 				op_type = AST_BIT_OR;
-			if (str == "nor")
+			if (ast_node->str == "nor")
 				op_type = AST_BIT_OR, invert_results = true;
-			if (str == "xor")
+			if (ast_node->str == "xor")
 				op_type = AST_BIT_XOR;
-			if (str == "xnor")
+			if (ast_node->str == "xnor")
 				op_type = AST_BIT_XOR, invert_results = true;
 			log_assert(op_type != AST_NONE);
 
@@ -2379,16 +2375,16 @@
 			if (op_type != AST_POS)
 				for (size_t i = 2; i < children_list.size(); i++) {
 					node = new AstNode(op_type, node, children_list[i]);
-					node->location = location;
+					node->location = ast_node->location;
 				}
 			if (invert_results)
 				node = new AstNode(AST_BIT_NOT, node);
 
-			str.clear();
-			type = AST_ASSIGN;
-			children.push_back(children_list[0]);
-			children.back()->was_checked = true;
-			children.push_back(node);
+			ast_node->str.clear();
+			ast_node->type = AST_ASSIGN;
+			ast_node->children.push_back(children_list[0]);
+			ast_node->children.back()->was_checked = true;
+			ast_node->children.push_back(node);
 			did_something = true;
 		}
 	}
@@ -2396,29 +2392,29 @@
 	// replace dynamic ranges in left-hand side expressions (e.g. "foo[bar] <= 1'b1;") with
 	// either a big case block that selects the correct single-bit assignment, or mask and
 	// shift operations.
-	if (type == AST_ASSIGN_EQ || type == AST_ASSIGN_LE)
+	if (ast_node->type == AST_ASSIGN_EQ || ast_node->type == AST_ASSIGN_LE)
 	{
-		if (children[0]->type != AST_IDENTIFIER || children[0]->children.size() == 0)
+		if (ast_node->children[0]->type != AST_IDENTIFIER || ast_node->children[0]->children.size() == 0)
 			goto skip_dynamic_range_lvalue_expansion;
-		if (children[0]->children[0]->range_valid || did_something)
+		if (ast_node->children[0]->children[0]->range_valid || did_something)
 			goto skip_dynamic_range_lvalue_expansion;
-		if (children[0]->id2ast == NULL || children[0]->id2ast->type != AST_WIRE)
+		if (ast_node->children[0]->id2ast == NULL || ast_node->children[0]->id2ast->type != AST_WIRE)
 			goto skip_dynamic_range_lvalue_expansion;
-		if (!children[0]->id2ast->range_valid)
+		if (!ast_node->children[0]->id2ast->range_valid)
 			goto skip_dynamic_range_lvalue_expansion;
 
-		int source_width = children[0]->id2ast->range_left - children[0]->id2ast->range_right + 1;
-		int source_offset = children[0]->id2ast->range_right;
+		int source_width = ast_node->children[0]->id2ast->range_left - ast_node->children[0]->id2ast->range_right + 1;
+		int source_offset = ast_node->children[0]->id2ast->range_right;
 		int result_width = 1;
-		AST::AstNode *member_node = get_struct_member(children[0]);
+		AST::AstNode *member_node = AST::get_struct_member(ast_node->children[0]);
 		if (member_node) {
 			// Clamp chunk to range of member within struct/union.
-			log_assert(!source_offset && !children[0]->id2ast->range_swapped);
+			log_assert(!source_offset && !ast_node->children[0]->id2ast->range_swapped);
 			source_width = member_node->range_left - member_node->range_right + 1;
 		}
 
 		AstNode *shift_expr = NULL;
-		AstNode *range = children[0]->children[0];
+		AstNode *range = ast_node->children[0]->children[0];
 
 		if (range->children.size() == 1) {
 			shift_expr = range->children[0]->clone();
@@ -2426,10 +2422,10 @@
 			shift_expr = range->children[1]->clone();
 			AstNode *left_at_zero_ast = range->children[0]->clone();
 			AstNode *right_at_zero_ast = range->children[1]->clone();
-			while (left_at_zero_ast->simplify(true, true, false, stage, -1, false, false)) { }
-			while (right_at_zero_ast->simplify(true, true, false, stage, -1, false, false)) { }
+			while (simplify(left_at_zero_ast, true, true, false, stage, -1, false, false)) { }
+			while (simplify(right_at_zero_ast, true, true, false, stage, -1, false, false)) { }
 			if (left_at_zero_ast->type != AST_CONSTANT || right_at_zero_ast->type != AST_CONSTANT)
-				log_file_error(filename, location.first_line, "Unsupported expression on dynamic range select on signal `%s'!\n", str.c_str());
+				log_file_error(ast_node->filename, ast_node->location.first_line, "Unsupported expression on dynamic range select on signal `%s'!\n", ast_node->str.c_str());
 			result_width = abs(int(left_at_zero_ast->integer - right_at_zero_ast->integer)) + 1;
 			delete left_at_zero_ast;
 			delete right_at_zero_ast;
@@ -2437,16 +2433,16 @@
 
 		bool use_case_method = false;
 
-		if (children[0]->id2ast->attributes.count(ID::nowrshmsk)) {
-			AstNode *node = children[0]->id2ast->attributes.at(ID::nowrshmsk);
-			while (node->simplify(true, false, false, stage, -1, false, false)) { }
+		if (ast_node->children[0]->id2ast->attributes.count(ID::nowrshmsk)) {
+			AstNode *node = ast_node->children[0]->id2ast->attributes.at(ID::nowrshmsk);
+			while (simplify(node, 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());
+				log_file_error(ast_node->filename, ast_node->location.first_line, "Non-constant value for `nowrshmsk' attribute on `%s'!\n", ast_node->children[0]->id2ast->str.c_str());
 			if (node->asAttrConst().as_bool())
 				use_case_method = true;
 		}
 
-		if (!use_case_method && current_always->detect_latch(children[0]->str))
+		if (!use_case_method && current_always->detect_latch(ast_node->children[0]->str))
 			use_case_method = true;
 
 		if (use_case_method)
@@ -2458,14 +2454,14 @@
 			for (int i = 0; i < source_width; i++) {
 				int start_bit = source_offset + i;
 				int end_bit = std::min(start_bit+result_width,source_width) - 1;
-				AstNode *cond = new AstNode(AST_COND, mkconst_int(start_bit, true));
-				AstNode *lvalue = children[0]->clone();
+				AstNode *cond = new AstNode(AST_COND, ast_node->mkconst_int(start_bit, true));
+				AstNode *lvalue = ast_node->children[0]->clone();
 				lvalue->delete_children();
 				if (member_node)
 					lvalue->attributes[ID::wiretype] = member_node->clone();
 				lvalue->children.push_back(new AstNode(AST_RANGE,
-						mkconst_int(end_bit, true), mkconst_int(start_bit, true)));
-				cond->children.push_back(new AstNode(AST_BLOCK, new AstNode(type, lvalue, children[1]->clone())));
+						ast_node->mkconst_int(end_bit, true), ast_node->mkconst_int(start_bit, true)));
+				cond->children.push_back(new AstNode(AST_BLOCK, new AstNode(ast_node->type, lvalue, ast_node->children[1]->clone())));
 				newNode->children.push_back(cond);
 			}
 		}
@@ -2473,36 +2469,36 @@
 		{
 			// mask and shift operations, disabled for now
 
-			AstNode *wire_mask = new AstNode(AST_WIRE, new AstNode(AST_RANGE, mkconst_int(source_width-1, true), mkconst_int(0, true)));
-			wire_mask->str = stringf("$bitselwrite$mask$%s:%d$%d", encode_filename(filename).c_str(), location.first_line, autoidx++);
-			wire_mask->attributes[ID::nosync] = AstNode::mkconst_int(1, false);
+			AstNode *wire_mask = new AstNode(AST_WIRE, new AstNode(AST_RANGE, ast_node->mkconst_int(source_width-1, true), ast_node->mkconst_int(0, true)));
+			wire_mask->str = stringf("$bitselwrite$mask$%s:%d$%d", encode_filename(ast_node->filename).c_str(), ast_node->location.first_line, autoidx++);
+			wire_mask->attributes[ID::nosync] = ast_node->mkconst_int(1, false);
 			wire_mask->is_logic = true;
-			while (wire_mask->simplify(true, false, false, 1, -1, false, false)) { }
+			while (simplify(wire_mask, true, false, false, 1, -1, false, 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", encode_filename(filename).c_str(), location.first_line, autoidx++);
-			wire_data->attributes[ID::nosync] = AstNode::mkconst_int(1, false);
+			AstNode *wire_data = new AstNode(AST_WIRE, new AstNode(AST_RANGE, ast_node->mkconst_int(source_width-1, true), ast_node->mkconst_int(0, true)));
+			wire_data->str = stringf("$bitselwrite$data$%s:%d$%d", encode_filename(ast_node->filename).c_str(), ast_node->location.first_line, autoidx++);
+			wire_data->attributes[ID::nosync] = ast_node->mkconst_int(1, false);
 			wire_data->is_logic = true;
-			while (wire_data->simplify(true, false, false, 1, -1, false, false)) { }
+			while (simplify(wire_data, true, false, false, 1, -1, false, false)) { }
 			current_ast_mod->children.push_back(wire_data);
 
 			int shamt_width_hint = -1;
 			bool shamt_sign_hint = true;
 			shift_expr->detectSignWidth(shamt_width_hint, shamt_sign_hint);
 
-			AstNode *wire_sel = new AstNode(AST_WIRE, new AstNode(AST_RANGE, mkconst_int(shamt_width_hint-1, true), mkconst_int(0, true)));
-			wire_sel->str = stringf("$bitselwrite$sel$%s:%d$%d", encode_filename(filename).c_str(), location.first_line, autoidx++);
-			wire_sel->attributes[ID::nosync] = AstNode::mkconst_int(1, false);
+			AstNode *wire_sel = new AstNode(AST_WIRE, new AstNode(AST_RANGE, ast_node->mkconst_int(shamt_width_hint-1, true), ast_node->mkconst_int(0, true)));
+			wire_sel->str = stringf("$bitselwrite$sel$%s:%d$%d", encode_filename(ast_node->filename).c_str(), ast_node->location.first_line, autoidx++);
+			wire_sel->attributes[ID::nosync] = ast_node->mkconst_int(1, false);
 			wire_sel->is_logic = true;
 			wire_sel->is_signed = shamt_sign_hint;
-			while (wire_sel->simplify(true, false, false, 1, -1, false, false)) { }
+			while (simplify(wire_sel, true, false, false, 1, -1, false, false)) { }
 			current_ast_mod->children.push_back(wire_sel);
 
 			did_something = true;
 			newNode = new AstNode(AST_BLOCK);
 
-			AstNode *lvalue = children[0]->clone();
+			AstNode *lvalue = ast_node->children[0]->clone();
 			lvalue->delete_children();
 			if (member_node)
 				lvalue->attributes[ID::wiretype] = member_node->clone();
@@ -2523,7 +2519,7 @@
 			ref_sel->was_checked = true;
 
 			AstNode *old_data = lvalue->clone();
-			if (type == AST_ASSIGN_LE)
+			if (ast_node->type == AST_ASSIGN_LE)
 				old_data->lookahead = true;
 
 			AstNode *s = new AstNode(AST_ASSIGN_EQ, ref_sel->clone(), shift_expr);
@@ -2532,35 +2528,35 @@
 			AstNode *shamt = ref_sel;
 
 			// convert to signed while preserving the sign and value
-			shamt = new AstNode(AST_CAST_SIZE, mkconst_int(shamt_width_hint + 1, true), shamt);
+			shamt = new AstNode(AST_CAST_SIZE, ast_node->mkconst_int(shamt_width_hint + 1, true), shamt);
 			shamt = new AstNode(AST_TO_SIGNED, shamt);
 
 			// offset the shift amount by the lower bound of the dimension
 			int start_bit = source_offset;
-			shamt = new AstNode(AST_SUB, shamt, mkconst_int(start_bit, true));
+			shamt = new AstNode(AST_SUB, shamt, ast_node->mkconst_int(start_bit, true));
 
 			// reflect the shift amount if the dimension is swapped
-			if (children[0]->id2ast->range_swapped)
-				shamt = new AstNode(AST_SUB, mkconst_int(source_width - result_width, true), shamt);
+			if (ast_node->children[0]->id2ast->range_swapped)
+				shamt = new AstNode(AST_SUB, ast_node->mkconst_int(source_width - result_width, true), shamt);
 
 			// AST_SHIFT uses negative amounts for shifting left
 			shamt = new AstNode(AST_NEG, shamt);
 
 			AstNode *t;
 
-			t = mkconst_bits(std::vector<RTLIL::State>(result_width, State::S1), false);
+			t = AstNode::mkconst_bits(std::vector<RTLIL::State>(result_width, State::S1), false);
 			t = new AstNode(AST_SHIFT, t, shamt->clone());
 			t = new AstNode(AST_ASSIGN_EQ, ref_mask->clone(), t);
 			newNode->children.push_back(t);
 
-			t = new AstNode(AST_BIT_AND, mkconst_bits(std::vector<RTLIL::State>(result_width, State::S1), false), children[1]->clone());
+			t = new AstNode(AST_BIT_AND, AstNode::mkconst_bits(std::vector<RTLIL::State>(result_width, State::S1), false), ast_node->children[1]->clone());
 			t = new AstNode(AST_SHIFT, t, shamt);
 			t = new AstNode(AST_ASSIGN_EQ, ref_data->clone(), t);
 			newNode->children.push_back(t);
 
 			t = new AstNode(AST_BIT_AND, old_data, new AstNode(AST_BIT_NOT, ref_mask));
 			t = new AstNode(AST_BIT_OR, t, ref_data);
-			t = new AstNode(type, lvalue, t);
+			t = new AstNode(ast_node->type, lvalue, t);
 			newNode->children.push_back(t);
 		}
 
@@ -2568,10 +2564,10 @@
 	}
 skip_dynamic_range_lvalue_expansion:;
 
-	if (stage > 1 && (type == AST_ASSERT || type == AST_ASSUME || type == AST_LIVE || type == AST_FAIR || type == AST_COVER) && current_block != NULL)
+	if (stage > 1 && (ast_node->type == AST_ASSERT || ast_node->type == AST_ASSUME || ast_node->type == AST_LIVE || ast_node->type == AST_FAIR || ast_node->type == AST_COVER) && current_block != NULL)
 	{
 		std::stringstream sstr;
-		sstr << "$formal$" << encode_filename(filename) << ":" << location.first_line << "$" << (autoidx++);
+		sstr << "$formal$" << encode_filename(ast_node->filename) << ":" << ast_node->location.first_line << "$" << (autoidx++);
 		std::string id_check = sstr.str() + "_CHECK", id_en = sstr.str() + "_EN";
 
 		AstNode *wire_check = new AstNode(AST_WIRE);
@@ -2579,34 +2575,34 @@
 		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, false, 1, -1, false, false)) { }
+		while (simplify(wire_check, true, false, false, 1, -1, false, false)) { }
 
 		AstNode *wire_en = new AstNode(AST_WIRE);
 		wire_en->str = id_en;
 		wire_en->was_checked = true;
 		current_ast_mod->children.push_back(wire_en);
 		if (current_always_clocked) {
-			current_ast_mod->children.push_back(new AstNode(AST_INITIAL, new AstNode(AST_BLOCK, new AstNode(AST_ASSIGN_LE, new AstNode(AST_IDENTIFIER), AstNode::mkconst_int(0, false, 1)))));
+			current_ast_mod->children.push_back(new AstNode(AST_INITIAL, new AstNode(AST_BLOCK, new AstNode(AST_ASSIGN_LE, new AstNode(AST_IDENTIFIER), ast_node->mkconst_int(0, false, 1)))));
 			current_ast_mod->children.back()->children[0]->children[0]->children[0]->str = id_en;
 			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, false, 1, -1, false, false)) { }
+		while (simplify(wire_en, true, false, false, 1, -1, false, false)) { }
 
 		AstNode *check_defval;
-		if (type == AST_LIVE || type == AST_FAIR) {
-			check_defval = new AstNode(AST_REDUCE_BOOL, children[0]->clone());
+		if (ast_node->type == AST_LIVE || ast_node->type == AST_FAIR) {
+			check_defval = new AstNode(AST_REDUCE_BOOL, ast_node->children[0]->clone());
 		} else {
 			std::vector<RTLIL::State> x_bit;
 			x_bit.push_back(RTLIL::State::Sx);
-			check_defval = mkconst_bits(x_bit, false);
+			check_defval = AstNode::mkconst_bits(x_bit, false);
 		}
 
 		AstNode *assign_check = new AstNode(AST_ASSIGN_LE, new AstNode(AST_IDENTIFIER), check_defval);
 		assign_check->children[0]->str = id_check;
 		assign_check->children[0]->was_checked = true;
 
-		AstNode *assign_en = new AstNode(AST_ASSIGN_LE, new AstNode(AST_IDENTIFIER), mkconst_int(0, false, 1));
+		AstNode *assign_en = new AstNode(AST_ASSIGN_LE, new AstNode(AST_IDENTIFIER), ast_node->mkconst_int(0, false, 1));
 		assign_en->children[0]->str = id_en;
 		assign_en->children[0]->was_checked = true;
 
@@ -2615,16 +2611,16 @@
 		default_signals->children.push_back(assign_en);
 		current_top_block->children.insert(current_top_block->children.begin(), default_signals);
 
-		if (type == AST_LIVE || type == AST_FAIR) {
+		if (ast_node->type == AST_LIVE || ast_node->type == AST_FAIR) {
 			assign_check = nullptr;
 		} else {
-			assign_check = new AstNode(AST_ASSIGN_LE, new AstNode(AST_IDENTIFIER), new AstNode(AST_REDUCE_BOOL, children[0]->clone()));
+			assign_check = new AstNode(AST_ASSIGN_LE, new AstNode(AST_IDENTIFIER), new AstNode(AST_REDUCE_BOOL, ast_node->children[0]->clone()));
 			assign_check->children[0]->str = id_check;
 			assign_check->children[0]->was_checked = true;
 		}
 
 		if (current_always == nullptr || current_always->type != AST_INITIAL) {
-			assign_en = new AstNode(AST_ASSIGN_LE, new AstNode(AST_IDENTIFIER), mkconst_int(1, false, 1));
+			assign_en = new AstNode(AST_ASSIGN_LE, new AstNode(AST_IDENTIFIER), ast_node->mkconst_int(1, false, 1));
 		} else {
 			assign_en = new AstNode(AST_ASSIGN_LE, new AstNode(AST_IDENTIFIER), new AstNode(AST_FCALL));
 			assign_en->children[1]->str = "\\$initstate";
@@ -2637,40 +2633,40 @@
 			newNode->children.push_back(assign_check);
 		newNode->children.push_back(assign_en);
 
-		AstNode *assertnode = new AstNode(type);
-		assertnode->location = location;
-		assertnode->str = str;
+		AstNode *assertnode = new AstNode(ast_node->type);
+		assertnode->location = ast_node->location;
+		assertnode->str = ast_node->str;
 		assertnode->children.push_back(new AstNode(AST_IDENTIFIER));
 		assertnode->children.push_back(new AstNode(AST_IDENTIFIER));
 		assertnode->children[0]->str = id_check;
 		assertnode->children[1]->str = id_en;
-		assertnode->attributes.swap(attributes);
+		assertnode->attributes.swap(ast_node->attributes);
 		current_ast_mod->children.push_back(assertnode);
 
 		goto apply_newNode;
 	}
 
-	if (stage > 1 && (type == AST_ASSERT || type == AST_ASSUME || type == AST_LIVE || type == AST_FAIR || type == AST_COVER) && children.size() == 1)
+	if (stage > 1 && (ast_node->type == AST_ASSERT || ast_node->type == AST_ASSUME || ast_node->type == AST_LIVE || ast_node->type == AST_FAIR || ast_node->type == AST_COVER) && ast_node->children.size() == 1)
 	{
-		children.push_back(mkconst_int(1, false, 1));
+		ast_node->children.push_back(ast_node->mkconst_int(1, false, 1));
 		did_something = true;
 	}
 
 	// found right-hand side identifier for memory -> replace with memory read port
-	if (stage > 1 && type == AST_IDENTIFIER && id2ast != NULL && id2ast->type == AST_MEMORY && !in_lvalue &&
-			children.size() == 1 && children[0]->type == AST_RANGE && children[0]->children.size() == 1) {
-		newNode = new AstNode(AST_MEMRD, children[0]->children[0]->clone());
-		newNode->str = str;
-		newNode->id2ast = id2ast;
+	if (stage > 1 && ast_node->type == AST_IDENTIFIER && ast_node->id2ast != NULL && ast_node->id2ast->type == AST_MEMORY && !in_lvalue &&
+			ast_node->children.size() == 1 && ast_node->children[0]->type == AST_RANGE && ast_node->children[0]->children.size() == 1) {
+		newNode = new AstNode(AST_MEMRD, ast_node->children[0]->children[0]->clone());
+		newNode->str = ast_node->str;
+		newNode->id2ast = ast_node->id2ast;
 		goto apply_newNode;
 	}
 
 	// assignment with nontrivial member in left-hand concat expression -> split assignment
-	if ((type == AST_ASSIGN_EQ || type == AST_ASSIGN_LE) && children[0]->type == AST_CONCAT && width_hint > 0)
+	if ((ast_node->type == AST_ASSIGN_EQ || ast_node->type == AST_ASSIGN_LE) && ast_node->children[0]->type == AST_CONCAT && width_hint > 0)
 	{
 		bool found_nontrivial_member = false;
 
-		for (auto child : children[0]->children) {
+		for (auto child : ast_node->children[0]->children) {
 			if (child->type == AST_IDENTIFIER && child->id2ast != NULL && child->id2ast->type == AST_MEMORY)
 				found_nontrivial_member = true;
 		}
@@ -2679,30 +2675,30 @@
 		{
 			newNode = new AstNode(AST_BLOCK);
 
-			AstNode *wire_tmp = new AstNode(AST_WIRE, new AstNode(AST_RANGE, mkconst_int(width_hint-1, true), mkconst_int(0, true)));
-			wire_tmp->str = stringf("$splitcmplxassign$%s:%d$%d", encode_filename(filename).c_str(), location.first_line, autoidx++);
+			AstNode *wire_tmp = new AstNode(AST_WIRE, new AstNode(AST_RANGE, ast_node->mkconst_int(width_hint-1, true), ast_node->mkconst_int(0, true)));
+			wire_tmp->str = stringf("$splitcmplxassign$%s:%d$%d", encode_filename(ast_node->filename).c_str(), ast_node->location.first_line, autoidx++);
 			current_ast_mod->children.push_back(wire_tmp);
 			current_scope[wire_tmp->str] = wire_tmp;
-			wire_tmp->attributes[ID::nosync] = AstNode::mkconst_int(1, false);
-			while (wire_tmp->simplify(true, false, false, 1, -1, false, false)) { }
+			wire_tmp->attributes[ID::nosync] = ast_node->mkconst_int(1, false);
+			while (simplify(wire_tmp, true, false, false, 1, -1, false, false)) { }
 			wire_tmp->is_logic = true;
 
 			AstNode *wire_tmp_id = new AstNode(AST_IDENTIFIER);
 			wire_tmp_id->str = wire_tmp->str;
 
-			newNode->children.push_back(new AstNode(AST_ASSIGN_EQ, wire_tmp_id, children[1]->clone()));
+			newNode->children.push_back(new AstNode(AST_ASSIGN_EQ, wire_tmp_id, ast_node->children[1]->clone()));
 			newNode->children.back()->was_checked = true;
 
 			int cursor = 0;
-			for (auto child : children[0]->children)
+			for (auto child : ast_node->children[0]->children)
 			{
 				int child_width_hint = -1;
 				bool child_sign_hint = true;
 				child->detectSignWidth(child_width_hint, child_sign_hint);
 
 				AstNode *rhs = wire_tmp_id->clone();
-				rhs->children.push_back(new AstNode(AST_RANGE, AstNode::mkconst_int(cursor+child_width_hint-1, true), AstNode::mkconst_int(cursor, true)));
-				newNode->children.push_back(new AstNode(type, child->clone(), rhs));
+				rhs->children.push_back(new AstNode(AST_RANGE, ast_node->mkconst_int(cursor+child_width_hint-1, true), ast_node->mkconst_int(cursor, true)));
+				newNode->children.push_back(new AstNode(ast_node->type, child->clone(), rhs));
 
 				cursor += child_width_hint;
 			}
@@ -2712,29 +2708,29 @@
 	}
 
 	// assignment with memory in left-hand side expression -> replace with memory write port
-	if (stage > 1 && (type == AST_ASSIGN_EQ || type == AST_ASSIGN_LE) && children[0]->type == AST_IDENTIFIER &&
-			children[0]->id2ast && children[0]->id2ast->type == AST_MEMORY && children[0]->id2ast->children.size() >= 2 &&
-			children[0]->id2ast->children[0]->range_valid && children[0]->id2ast->children[1]->range_valid &&
-			(children[0]->children.size() == 1 || children[0]->children.size() == 2) && children[0]->children[0]->type == AST_RANGE)
+	if (stage > 1 && (ast_node->type == AST_ASSIGN_EQ || ast_node->type == AST_ASSIGN_LE) && ast_node->children[0]->type == AST_IDENTIFIER &&
+			ast_node->children[0]->id2ast && ast_node->children[0]->id2ast->type == AST_MEMORY && ast_node->children[0]->id2ast->children.size() >= 2 &&
+			ast_node->children[0]->id2ast->children[0]->range_valid && ast_node->children[0]->id2ast->children[1]->range_valid &&
+			(ast_node->children[0]->children.size() == 1 || ast_node->children[0]->children.size() == 2) && ast_node->children[0]->children[0]->type == AST_RANGE)
 	{
 		std::stringstream sstr;
-		sstr << "$memwr$" << children[0]->str << "$" << encode_filename(filename) << ":" << location.first_line << "$" << (autoidx++);
+		sstr << "$memwr$" << ast_node->children[0]->str << "$" << encode_filename(ast_node->filename) << ":" << ast_node->location.first_line << "$" << (autoidx++);
 		std::string id_addr = sstr.str() + "_ADDR", id_data = sstr.str() + "_DATA", id_en = sstr.str() + "_EN";
 
 		int mem_width, mem_size, addr_bits;
-		bool mem_signed = children[0]->id2ast->is_signed;
-		children[0]->id2ast->meminfo(mem_width, mem_size, addr_bits);
+		bool mem_signed = ast_node->children[0]->id2ast->is_signed;
+		ast_node->children[0]->id2ast->meminfo(mem_width, mem_size, addr_bits);
 
 		newNode = new AstNode(AST_BLOCK);
 		AstNode *defNode = new AstNode(AST_BLOCK);
 
-		int data_range_left = children[0]->id2ast->children[0]->range_left;
-		int data_range_right = children[0]->id2ast->children[0]->range_right;
+		int data_range_left = ast_node->children[0]->id2ast->children[0]->range_left;
+		int data_range_right = ast_node->children[0]->id2ast->children[0]->range_right;
 		int mem_data_range_offset = std::min(data_range_left, data_range_right);
 
 		int addr_width_hint = -1;
 		bool addr_sign_hint = true;
-		children[0]->children[0]->children[0]->detectSignWidthWorker(addr_width_hint, addr_sign_hint);
+		ast_node->children[0]->children[0]->children[0]->detectSignWidthWorker(addr_width_hint, addr_sign_hint);
 		addr_bits = std::max(addr_bits, addr_width_hint);
 
 		std::vector<RTLIL::State> x_bits_addr, x_bits_data, set_bits_en;
@@ -2746,22 +2742,22 @@
 			set_bits_en.push_back(RTLIL::State::S1);
 
 		AstNode *node_addr = nullptr;
-		if (children[0]->children[0]->children[0]->isConst()) {
-			node_addr = children[0]->children[0]->children[0]->clone();
+		if (ast_node->children[0]->children[0]->children[0]->isConst()) {
+			node_addr = ast_node->children[0]->children[0]->children[0]->clone();
 		} else {
-			AstNode *wire_addr = new AstNode(AST_WIRE, new AstNode(AST_RANGE, mkconst_int(addr_bits-1, true), mkconst_int(0, true)));
+			AstNode *wire_addr = new AstNode(AST_WIRE, new AstNode(AST_RANGE, ast_node->mkconst_int(addr_bits-1, true), ast_node->mkconst_int(0, true)));
 			wire_addr->str = id_addr;
 			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, false, 1, -1, false, false)) { }
+			while (simplify(wire_addr, true, false, false, 1, -1, false, false)) { }
 
-			AstNode *assign_addr = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER), mkconst_bits(x_bits_addr, false));
+			AstNode *assign_addr = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER), AstNode::mkconst_bits(x_bits_addr, false));
 			assign_addr->children[0]->str = id_addr;
 			assign_addr->children[0]->was_checked = true;
 			defNode->children.push_back(assign_addr);
 
-			assign_addr = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER), children[0]->children[0]->children[0]->clone());
+			assign_addr = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER), ast_node->children[0]->children[0]->children[0]->clone());
 			assign_addr->children[0]->str = id_addr;
 			assign_addr->children[0]->was_checked = true;
 			newNode->children.push_back(assign_addr);
@@ -2771,18 +2767,18 @@
 		}
 
 		AstNode *node_data = nullptr;
-		if (children[0]->children.size() == 1 && children[1]->isConst()) {
-			node_data = children[1]->clone();
+		if (ast_node->children[0]->children.size() == 1 && ast_node->children[1]->isConst()) {
+			node_data = ast_node->children[1]->clone();
 		} else {
-			AstNode *wire_data = new AstNode(AST_WIRE, new AstNode(AST_RANGE, mkconst_int(mem_width-1, true), mkconst_int(0, true)));
+			AstNode *wire_data = new AstNode(AST_WIRE, new AstNode(AST_RANGE, ast_node->mkconst_int(mem_width-1, true), ast_node->mkconst_int(0, true)));
 			wire_data->str = id_data;
 			wire_data->was_checked = true;
 			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, false, 1, -1, false, false)) { }
+			while (simplify(wire_data, true, false, false, 1, -1, false, false)) { }
 
-			AstNode *assign_data = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER), mkconst_bits(x_bits_data, false));
+			AstNode *assign_data = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER), AstNode::mkconst_bits(x_bits_data, false));
 			assign_data->children[0]->str = id_data;
 			assign_data->children[0]->was_checked = true;
 			defNode->children.push_back(assign_data);
@@ -2791,14 +2787,14 @@
 			node_data->str = id_data;
 		}
 
-		AstNode *wire_en = new AstNode(AST_WIRE, new AstNode(AST_RANGE, mkconst_int(mem_width-1, true), mkconst_int(0, true)));
+		AstNode *wire_en = new AstNode(AST_WIRE, new AstNode(AST_RANGE, ast_node->mkconst_int(mem_width-1, true), ast_node->mkconst_int(0, true)));
 		wire_en->str = id_en;
 		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, false, 1, -1, false, false)) { }
+		while (simplify(wire_en, true, false, false, 1, -1, false, false)) { }
 
-		AstNode *assign_en_first = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER), mkconst_int(0, false, mem_width));
+		AstNode *assign_en_first = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER), ast_node->mkconst_int(0, false, mem_width));
 		assign_en_first->children[0]->str = id_en;
 		assign_en_first->children[0]->was_checked = true;
 		defNode->children.push_back(assign_en_first);
@@ -2813,52 +2809,52 @@
 
 		AstNode *assign_data = nullptr;
 		AstNode *assign_en = nullptr;
-		if (children[0]->children.size() == 2)
+		if (ast_node->children[0]->children.size() == 2)
 		{
-			if (children[0]->children[1]->range_valid)
+			if (ast_node->children[0]->children[1]->range_valid)
 			{
-				int offset = children[0]->children[1]->range_right;
-				int width = children[0]->children[1]->range_left - offset + 1;
+				int offset = ast_node->children[0]->children[1]->range_right;
+				int width = ast_node->children[0]->children[1]->range_left - offset + 1;
 				offset -= mem_data_range_offset;
 
 				std::vector<RTLIL::State> padding_x(offset, RTLIL::State::Sx);
 
 				assign_data = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER),
-						new AstNode(AST_CONCAT, mkconst_bits(padding_x, false), children[1]->clone()));
+						new AstNode(AST_CONCAT, AstNode::mkconst_bits(padding_x, false), ast_node->children[1]->clone()));
 				assign_data->children[0]->str = id_data;
 				assign_data->children[0]->was_checked = true;
 
 				for (int i = 0; i < mem_width; i++)
 					set_bits_en[i] = offset <= i && i < offset+width ? RTLIL::State::S1 : RTLIL::State::S0;
-				assign_en = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER), mkconst_bits(set_bits_en, false));
+				assign_en = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER), AstNode::mkconst_bits(set_bits_en, false));
 				assign_en->children[0]->str = id_en;
 				assign_en->children[0]->was_checked = true;
 			}
 			else
 			{
-				AstNode *the_range = children[0]->children[1];
+				AstNode *the_range = ast_node->children[0]->children[1];
 				AstNode *left_at_zero_ast = the_range->children[0]->clone();
 				AstNode *right_at_zero_ast = the_range->children.size() >= 2 ? the_range->children[1]->clone() : left_at_zero_ast->clone();
 				AstNode *offset_ast = right_at_zero_ast->clone();
 
 				if (mem_data_range_offset)
-					offset_ast = new AstNode(AST_SUB, offset_ast, mkconst_int(mem_data_range_offset, true));
+					offset_ast = new AstNode(AST_SUB, offset_ast, ast_node->mkconst_int(mem_data_range_offset, true));
 
-				while (left_at_zero_ast->simplify(true, true, false, 1, -1, false, false)) { }
-				while (right_at_zero_ast->simplify(true, true, false, 1, -1, false, false)) { }
+				while (simplify(left_at_zero_ast, true, true, false, 1, -1, false, false)) { }
+				while (simplify(right_at_zero_ast, true, true, false, 1, -1, false, false)) { }
 				if (left_at_zero_ast->type != AST_CONSTANT || right_at_zero_ast->type != AST_CONSTANT)
-					log_file_error(filename, location.first_line, "Unsupported expression on dynamic range select on signal `%s'!\n", str.c_str());
+					log_file_error(ast_node->filename, ast_node->location.first_line, "Unsupported expression on dynamic range select on signal `%s'!\n", ast_node->str.c_str());
 				int width = abs(int(left_at_zero_ast->integer - right_at_zero_ast->integer)) + 1;
 
 				assign_data = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER),
-						new AstNode(AST_SHIFT_LEFT, children[1]->clone(), offset_ast->clone()));
+						new AstNode(AST_SHIFT_LEFT, ast_node->children[1]->clone(), offset_ast->clone()));
 				assign_data->children[0]->str = id_data;
 				assign_data->children[0]->was_checked = true;
 
 				for (int i = 0; i < mem_width; i++)
 					set_bits_en[i] = i < width ? RTLIL::State::S1 : RTLIL::State::S0;
 				assign_en = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER),
-						new AstNode(AST_SHIFT_LEFT, mkconst_bits(set_bits_en, false), offset_ast->clone()));
+						new AstNode(AST_SHIFT_LEFT, AstNode::mkconst_bits(set_bits_en, false), offset_ast->clone()));
 				assign_en->children[0]->str = id_en;
 				assign_en->children[0]->was_checked = true;
 
@@ -2869,13 +2865,13 @@
 		}
 		else
 		{
-			if (!(children[0]->children.size() == 1 && children[1]->isConst())) {
-				assign_data = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER), children[1]->clone());
+			if (!(ast_node->children[0]->children.size() == 1 && ast_node->children[1]->isConst())) {
+				assign_data = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER), ast_node->children[1]->clone());
 				assign_data->children[0]->str = id_data;
 				assign_data->children[0]->was_checked = true;
 			}
 
-			assign_en = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER), mkconst_bits(set_bits_en, false));
+			assign_en = new AstNode(AST_ASSIGN_EQ, new AstNode(AST_IDENTIFIER), AstNode::mkconst_bits(set_bits_en, false));
 			assign_en->children[0]->str = id_en;
 			assign_en->children[0]->was_checked = true;
 		}
@@ -2886,21 +2882,21 @@
 
 		AstNode *wrnode;
 		if (current_always->type == AST_INITIAL)
-			wrnode = new AstNode(AST_MEMINIT, node_addr, node_data, node_en, mkconst_int(1, false));
+			wrnode = new AstNode(AST_MEMINIT, node_addr, node_data, node_en, ast_node->mkconst_int(1, false));
 		else
 			wrnode = new AstNode(AST_MEMWR, node_addr, node_data, node_en);
-		wrnode->str = children[0]->str;
-		wrnode->id2ast = children[0]->id2ast;
-		wrnode->location = location;
+		wrnode->str = ast_node->children[0]->str;
+		wrnode->id2ast = ast_node->children[0]->id2ast;
+		wrnode->location = ast_node->location;
 		if (wrnode->type == AST_MEMWR) {
 			int portid = current_memwr_count[wrnode->str]++;
-			wrnode->children.push_back(mkconst_int(portid, false));
+			wrnode->children.push_back(ast_node->mkconst_int(portid, false));
 			std::vector<RTLIL::State> priority_mask;
 			for (int i = 0; i < portid; i++) {
 				bool has_prio = current_memwr_visible[wrnode->str].count(i);
 				priority_mask.push_back(State(has_prio));
 			}
-			wrnode->children.push_back(mkconst_bits(priority_mask, false));
+			wrnode->children.push_back(AstNode::mkconst_bits(priority_mask, false));
 			current_memwr_visible[wrnode->str].insert(portid);
 			current_always->children.push_back(wrnode);
 		} else {
@@ -2915,18 +2911,18 @@
 	}
 
 	// replace function and task calls with the code from the function or task
-	if ((type == AST_FCALL || type == AST_TCALL) && !str.empty())
+	if ((ast_node->type == AST_FCALL || ast_node->type == AST_TCALL) && !ast_node->str.empty())
 	{
-		if (type == AST_FCALL)
+		if (ast_node->type == AST_FCALL)
 		{
-			if (str == "\\$initstate")
+			if (ast_node->str == "\\$initstate")
 			{
 				int myidx = autoidx++;
 
 				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, false, 1, -1, false, false)) { }
+				while (simplify(wire, true, false, false, 1, -1, false, 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);
@@ -2935,7 +2931,7 @@
 				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, false, 1, -1, false, false)) { }
+				while (simplify(cell, true, false, false, 1, -1, false, false)) { }
 
 				newNode = new AstNode(AST_IDENTIFIER);
 				newNode->str = wire->str;
@@ -2943,27 +2939,27 @@
 				goto apply_newNode;
 			}
 
-			if (str == "\\$past")
+			if (ast_node->str == "\\$past")
 			{
 				if (width_hint < 0)
 					goto replace_fcall_later;
 
 				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",
-							RTLIL::unescape_id(str).c_str(), int(children.size()));
+				if (GetSize(ast_node->children) != 1 && GetSize(ast_node->children) != 2)
+					log_file_error(ast_node->filename, ast_node->location.first_line, "System function %s got %d arguments, expected 1 or 2.\n",
+							RTLIL::unescape_id(ast_node->str).c_str(), int(ast_node->children.size()));
 
 				if (!current_always_clocked)
-					log_file_error(filename, location.first_line, "System function %s is only allowed in clocked blocks.\n",
-							RTLIL::unescape_id(str).c_str());
+					log_file_error(ast_node->filename, ast_node->location.first_line, "System function %s is only allowed in clocked blocks.\n",
+							RTLIL::unescape_id(ast_node->str).c_str());
 
-				if (GetSize(children) == 2)
+				if (GetSize(ast_node->children) == 2)
 				{
-					AstNode *buf = children[1]->clone();
-					while (buf->simplify(true, false, false, stage, -1, false, false)) { }
+					AstNode *buf = ast_node->children[1]->clone();
+					while (simplify(buf, 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());
+						log_file_error(ast_node->filename, ast_node->location.first_line, "Failed to evaluate system function `%s' with non-constant value.\n", ast_node->str.c_str());
 
 					num_steps = buf->asInt(true);
 					delete buf;
@@ -2978,7 +2974,7 @@
 				log_assert(block != nullptr);
 
 				if (num_steps == 0) {
-					newNode = children[0]->clone();
+					newNode = ast_node->children[0]->clone();
 					goto apply_newNode;
 				}
 
@@ -2988,15 +2984,15 @@
 				for (int i = 0; i < num_steps; i++)
 				{
 					AstNode *reg = new AstNode(AST_WIRE, new AstNode(AST_RANGE,
-							mkconst_int(width_hint-1, true), mkconst_int(0, true)));
+							ast_node->mkconst_int(width_hint-1, true), ast_node->mkconst_int(0, true)));
 
-					reg->str = stringf("$past$%s:%d$%d$%d", encode_filename(filename).c_str(), location.first_line, myidx, i);
+					reg->str = stringf("$past$%s:%d$%d$%d", encode_filename(ast_node->filename).c_str(), ast_node->location.first_line, myidx, i);
 					reg->is_reg = true;
 					reg->is_signed = sign_hint;
 
 					current_ast_mod->children.push_back(reg);
 
-					while (reg->simplify(true, false, false, 1, -1, false, false)) { }
+					while (simplify(reg, true, false, false, 1, -1, false, false)) { }
 
 					AstNode *regid = new AstNode(AST_IDENTIFIER);
 					regid->str = reg->str;
@@ -3006,7 +3002,7 @@
 					AstNode *rhs = nullptr;
 
 					if (outreg == nullptr) {
-						rhs = children.at(0)->clone();
+						rhs = ast_node->children.at(0)->clone();
 					} else {
 						rhs = new AstNode(AST_IDENTIFIER);
 						rhs->str = outreg->str;
@@ -3023,35 +3019,35 @@
 				goto apply_newNode;
 			}
 
-			if (str == "\\$stable" || str == "\\$rose" || str == "\\$fell" || str == "\\$changed")
+			if (ast_node->str == "\\$stable" || ast_node->str == "\\$rose" || ast_node->str == "\\$fell" || ast_node->str == "\\$changed")
 			{
-				if (GetSize(children) != 1)
-					log_file_error(filename, location.first_line, "System function %s got %d arguments, expected 1.\n",
-							RTLIL::unescape_id(str).c_str(), int(children.size()));
+				if (GetSize(ast_node->children) != 1)
+					log_file_error(ast_node->filename, ast_node->location.first_line, "System function %s got %d arguments, expected 1.\n",
+							RTLIL::unescape_id(ast_node->str).c_str(), int(ast_node->children.size()));
 
 				if (!current_always_clocked)
-					log_file_error(filename, location.first_line, "System function %s is only allowed in clocked blocks.\n",
-							RTLIL::unescape_id(str).c_str());
+					log_file_error(ast_node->filename, ast_node->location.first_line, "System function %s is only allowed in clocked blocks.\n",
+							RTLIL::unescape_id(ast_node->str).c_str());
 
-				AstNode *present = children.at(0)->clone();
-				AstNode *past = clone();
+				AstNode *present = ast_node->children.at(0)->clone();
+				AstNode *past = ast_node->clone();
 				past->str = "\\$past";
 
-				if (str == "\\$stable")
+				if (ast_node->str == "\\$stable")
 					newNode = new AstNode(AST_EQ, past, present);
 
-				else if (str == "\\$changed")
+				else if (ast_node->str == "\\$changed")
 					newNode = new AstNode(AST_NE, past, present);
 
-				else if (str == "\\$rose")
+				else if (ast_node->str == "\\$rose")
 					newNode = new AstNode(AST_LOGIC_AND,
-							new AstNode(AST_LOGIC_NOT, new AstNode(AST_BIT_AND, past, mkconst_int(1,false))),
-							new AstNode(AST_BIT_AND, present, mkconst_int(1,false)));
+							new AstNode(AST_LOGIC_NOT, new AstNode(AST_BIT_AND, past, ast_node->mkconst_int(1,false))),
+							new AstNode(AST_BIT_AND, present, ast_node->mkconst_int(1,false)));
 
-				else if (str == "\\$fell")
+				else if (ast_node->str == "\\$fell")
 					newNode = new AstNode(AST_LOGIC_AND,
-							new AstNode(AST_BIT_AND, past, mkconst_int(1,false)),
-							new AstNode(AST_LOGIC_NOT, new AstNode(AST_BIT_AND, present, mkconst_int(1,false))));
+							new AstNode(AST_BIT_AND, past, ast_node->mkconst_int(1,false)),
+							new AstNode(AST_LOGIC_NOT, new AstNode(AST_BIT_AND, present, ast_node->mkconst_int(1,false))));
 
 				else
 					log_abort();
@@ -3059,22 +3055,22 @@
 				goto apply_newNode;
 			}
 
-			// $anyconst and $anyseq are mapped in AstNode::genRTLIL()
-			if (str == "\\$anyconst" || str == "\\$anyseq" || str == "\\$allconst" || str == "\\$allseq") {
+			// $anyconst and $anyseq are mapped in genRTLIL()
+			if (ast_node->str == "\\$anyconst" || ast_node->str == "\\$anyseq" || ast_node->str == "\\$allconst" || ast_node->str == "\\$allseq") {
 				recursion_counter--;
 				return false;
 			}
 
-			if (str == "\\$clog2")
+			if (ast_node->str == "\\$clog2")
 			{
-				if (children.size() != 1)
-					log_file_error(filename, location.first_line, "System function %s got %d arguments, expected 1.\n",
-							RTLIL::unescape_id(str).c_str(), int(children.size()));
+				if (ast_node->children.size() != 1)
+					log_file_error(ast_node->filename, ast_node->location.first_line, "System function %s got %d arguments, expected 1.\n",
+							RTLIL::unescape_id(ast_node->str).c_str(), int(ast_node->children.size()));
 
-				AstNode *buf = children[0]->clone();
-				while (buf->simplify(true, false, false, stage, width_hint, sign_hint, false)) { }
+				AstNode *buf = ast_node->children[0]->clone();
+				while (simplify(buf, 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());
+					log_file_error(ast_node->filename, ast_node->location.first_line, "Failed to evaluate system function `%s' with non-constant value.\n", ast_node->str.c_str());
 
 				RTLIL::Const arg_value = buf->bitsAsConst();
 				if (arg_value.as_bool())
@@ -3086,36 +3082,36 @@
 					if (arg_value.bits.at(i) == RTLIL::State::S1)
 						result = i + 1;
 
-				newNode = mkconst_int(result, true);
+				newNode = ast_node->mkconst_int(result, true);
 				goto apply_newNode;
 			}
 
-			if (str == "\\$size" || str == "\\$bits" || str == "\\$high" || str == "\\$low" || str == "\\$left" || str == "\\$right")
+			if (ast_node->str == "\\$size" || ast_node->str == "\\$bits" || ast_node->str == "\\$high" || ast_node->str == "\\$low" || ast_node->str == "\\$left" || ast_node->str == "\\$right")
 			{
 				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",
-								RTLIL::unescape_id(str).c_str(), int(children.size()));
+				if (ast_node->str == "\\$bits") {
+					if (ast_node->children.size() != 1)
+						log_file_error(ast_node->filename, ast_node->location.first_line, "System function %s got %d arguments, expected 1.\n",
+								RTLIL::unescape_id(ast_node->str).c_str(), int(ast_node->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",
-							RTLIL::unescape_id(str).c_str(), int(children.size()));
-					if (children.size() == 2) {
-						AstNode *buf = children[1]->clone();
+					if (ast_node->children.size() != 1 && ast_node->children.size() != 2)
+						log_file_error(ast_node->filename, ast_node->location.first_line, "System function %s got %d arguments, expected 1 or 2.\n",
+							RTLIL::unescape_id(ast_node->str).c_str(), int(ast_node->children.size()));
+					if (ast_node->children.size() == 2) {
+						AstNode *buf = ast_node->children[1]->clone();
 						// Evaluate constant expression
-						while (buf->simplify(true, false, false, stage, width_hint, sign_hint, false)) { }
+						while (simplify(buf, true, false, false, stage, width_hint, sign_hint, false)) { }
 						dim = buf->asInt(false);
 						delete buf;
 					}
 				}
-				AstNode *buf = children[0]->clone();
+				AstNode *buf = ast_node->children[0]->clone();
 				int mem_depth = 1;
 				int result, high = 0, low = 0, left = 0, right = 0, width = 1; // defaults for a simple wire
 				AstNode *id_ast = NULL;
 
 				// Is this needed?
-				//while (buf->simplify(true, false, false, stage, width_hint, sign_hint, false)) { }
+				//while (simplify(buf, true, false, false, stage, width_hint, sign_hint, false)) { }
 				buf->detectSignWidth(width_hint, sign_hint);
 
 				if (buf->type == AST_IDENTIFIER) {
@@ -3123,22 +3119,22 @@
 					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());
+						log_file_error(ast_node->filename, ast_node->location.first_line, "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);
+					AST::AstNode *item_node = AST::get_struct_member(buf);
 					if (id_ast->type == AST_WIRE && item_node) {
 						// The dimension of the original array expression is saved in the 'integer' field
 						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());
+								log_file_error(ast_node->filename, ast_node->location.first_line, "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);
+								log_file_error(ast_node->filename, ast_node->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);
 							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]) {
@@ -3169,7 +3165,7 @@
 						if (buf->children.size() > 0) {
 							// something is hanging below this identifier
 							if (buf->children[0]->type == AST_RANGE && buf->integer == 0)
-								// if integer == 0, this node was originally created as AST_RANGE so it's dimension is 1
+								// if integer == 0, ast_node node was originally created as AST_RANGE so it's dimension is 1
 								dim++;
 							// more than one range, e.g. $size(a[3][2])
 							else // created an AST_MULTIRANGE, converted to AST_RANGE, but original dimension saved in 'integer' field
@@ -3179,20 +3175,20 @@
 						// We got here only if the argument is a memory
 						// Otherwise $size() and $bits() return the expression width
 						AstNode *mem_range = id_ast->children[1];
-						if (str == "\\$bits") {
+						if (ast_node->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());
+									log_file_error(ast_node->filename, ast_node->location.first_line, "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());
+								log_file_error(ast_node->filename, ast_node->location.first_line, "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());
+										log_file_error(ast_node->filename, ast_node->location.first_line, "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;
@@ -3213,10 +3209,10 @@
 											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);
+										log_file_error(ast_node->filename, ast_node->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);
 								}
 							} else {
-								log_file_error(filename, location.first_line, "Unknown memory depth AST type in `%s'!\n", buf->str.c_str());
+								log_file_error(ast_node->filename, ast_node->location.first_line, "Unknown memory depth AST type in `%s'!\n", buf->str.c_str());
 							}
 						}
 					}
@@ -3225,144 +3221,144 @@
 					width = width_hint;
 				}
 				delete buf;
-				if (str == "\\$high")
+				if (ast_node->str == "\\$high")
 					result = high;
-				else if (str == "\\$low")
+				else if (ast_node->str == "\\$low")
 					result = low;
-				else if (str == "\\$left")
+				else if (ast_node->str == "\\$left")
 					result = left;
-				else if (str == "\\$right")
+				else if (ast_node->str == "\\$right")
 					result = right;
-				else if (str == "\\$size")
+				else if (ast_node->str == "\\$size")
 					result = width;
-				else { // str == "\\$bits"
+				else { // ast_node->str == "\\$bits"
 					result = width * mem_depth;
 				}
-				newNode = mkconst_int(result, true);
+				newNode = ast_node->mkconst_int(result, true);
 				goto apply_newNode;
 			}
 
-			if (str == "\\$ln" || str == "\\$log10" || str == "\\$exp" || str == "\\$sqrt" || str == "\\$pow" ||
-					str == "\\$floor" || str == "\\$ceil" || str == "\\$sin" || str == "\\$cos" || str == "\\$tan" ||
-					str == "\\$asin" || str == "\\$acos" || str == "\\$atan" || str == "\\$atan2" || str == "\\$hypot" ||
-					str == "\\$sinh" || str == "\\$cosh" || str == "\\$tanh" || str == "\\$asinh" || str == "\\$acosh" || str == "\\$atanh" ||
-					str == "\\$rtoi" || str == "\\$itor")
+			if (ast_node->str == "\\$ln" || ast_node->str == "\\$log10" || ast_node->str == "\\$exp" || ast_node->str == "\\$sqrt" || ast_node->str == "\\$pow" ||
+					ast_node->str == "\\$floor" || ast_node->str == "\\$ceil" || ast_node->str == "\\$sin" || ast_node->str == "\\$cos" || ast_node->str == "\\$tan" ||
+					ast_node->str == "\\$asin" || ast_node->str == "\\$acos" || ast_node->str == "\\$atan" || ast_node->str == "\\$atan2" || ast_node->str == "\\$hypot" ||
+					ast_node->str == "\\$sinh" || ast_node->str == "\\$cosh" || ast_node->str == "\\$tanh" || ast_node->str == "\\$asinh" || ast_node->str == "\\$acosh" || ast_node->str == "\\$atanh" ||
+					ast_node->str == "\\$rtoi" || ast_node->str == "\\$itor")
 			{
-				bool func_with_two_arguments = str == "\\$pow" || str == "\\$atan2" || str == "\\$hypot";
+				bool func_with_two_arguments = ast_node->str == "\\$pow" || ast_node->str == "\\$atan2" || ast_node->str == "\\$hypot";
 				double x = 0, y = 0;
 
 				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",
-								RTLIL::unescape_id(str).c_str(), int(children.size()));
+					if (ast_node->children.size() != 2)
+						log_file_error(ast_node->filename, ast_node->location.first_line, "System function %s got %d arguments, expected 2.\n",
+								RTLIL::unescape_id(ast_node->str).c_str(), int(ast_node->children.size()));
 				} else {
-					if (children.size() != 1)
-						log_file_error(filename, location.first_line, "System function %s got %d arguments, expected 1.\n",
-								RTLIL::unescape_id(str).c_str(), int(children.size()));
+					if (ast_node->children.size() != 1)
+						log_file_error(ast_node->filename, ast_node->location.first_line, "System function %s got %d arguments, expected 1.\n",
+								RTLIL::unescape_id(ast_node->str).c_str(), int(ast_node->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",
-								RTLIL::unescape_id(str).c_str());
+				if (ast_node->children.size() >= 1) {
+					while (simplify(ast_node->children[0], true, false, false, stage, width_hint, sign_hint, false)) { }
+					if (!ast_node->children[0]->isConst())
+						log_file_error(ast_node->filename, ast_node->location.first_line, "Failed to evaluate system function `%s' with non-constant argument.\n",
+								RTLIL::unescape_id(ast_node->str).c_str());
 					int child_width_hint = width_hint;
 					bool child_sign_hint = sign_hint;
-					children[0]->detectSignWidth(child_width_hint, child_sign_hint);
-					x = children[0]->asReal(child_sign_hint);
+					ast_node->children[0]->detectSignWidth(child_width_hint, child_sign_hint);
+					x = ast_node->children[0]->asReal(child_sign_hint);
 				}
 
-				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",
-								RTLIL::unescape_id(str).c_str());
+				if (ast_node->children.size() >= 2) {
+					while (simplify(ast_node->children[1], true, false, false, stage, width_hint, sign_hint, false)) { }
+					if (!ast_node->children[1]->isConst())
+						log_file_error(ast_node->filename, ast_node->location.first_line, "Failed to evaluate system function `%s' with non-constant argument.\n",
+								RTLIL::unescape_id(ast_node->str).c_str());
 					int child_width_hint = width_hint;
 					bool child_sign_hint = sign_hint;
-					children[1]->detectSignWidth(child_width_hint, child_sign_hint);
-					y = children[1]->asReal(child_sign_hint);
+					ast_node->children[1]->detectSignWidth(child_width_hint, child_sign_hint);
+					y = ast_node->children[1]->asReal(child_sign_hint);
 				}
 
-				if (str == "\\$rtoi") {
-					newNode = AstNode::mkconst_int(x, true);
+				if (ast_node->str == "\\$rtoi") {
+					newNode = ast_node->mkconst_int(x, true);
 				} else {
 					newNode = new AstNode(AST_REALVALUE);
-					if (str == "\\$ln")         newNode->realvalue = ::log(x);
-					else if (str == "\\$log10") newNode->realvalue = ::log10(x);
-					else if (str == "\\$exp")   newNode->realvalue = ::exp(x);
-					else if (str == "\\$sqrt")  newNode->realvalue = ::sqrt(x);
-					else if (str == "\\$pow")   newNode->realvalue = ::pow(x, y);
-					else if (str == "\\$floor") newNode->realvalue = ::floor(x);
-					else if (str == "\\$ceil")  newNode->realvalue = ::ceil(x);
-					else if (str == "\\$sin")   newNode->realvalue = ::sin(x);
-					else if (str == "\\$cos")   newNode->realvalue = ::cos(x);
-					else if (str == "\\$tan")   newNode->realvalue = ::tan(x);
-					else if (str == "\\$asin")  newNode->realvalue = ::asin(x);
-					else if (str == "\\$acos")  newNode->realvalue = ::acos(x);
-					else if (str == "\\$atan")  newNode->realvalue = ::atan(x);
-					else if (str == "\\$atan2") newNode->realvalue = ::atan2(x, y);
-					else if (str == "\\$hypot") newNode->realvalue = ::hypot(x, y);
-					else if (str == "\\$sinh")  newNode->realvalue = ::sinh(x);
-					else if (str == "\\$cosh")  newNode->realvalue = ::cosh(x);
-					else if (str == "\\$tanh")  newNode->realvalue = ::tanh(x);
-					else if (str == "\\$asinh") newNode->realvalue = ::asinh(x);
-					else if (str == "\\$acosh") newNode->realvalue = ::acosh(x);
-					else if (str == "\\$atanh") newNode->realvalue = ::atanh(x);
-					else if (str == "\\$itor")  newNode->realvalue = x;
+					if (ast_node->str == "\\$ln")         newNode->realvalue = ::log(x);
+					else if (ast_node->str == "\\$log10") newNode->realvalue = ::log10(x);
+					else if (ast_node->str == "\\$exp")   newNode->realvalue = ::exp(x);
+					else if (ast_node->str == "\\$sqrt")  newNode->realvalue = ::sqrt(x);
+					else if (ast_node->str == "\\$pow")   newNode->realvalue = ::pow(x, y);
+					else if (ast_node->str == "\\$floor") newNode->realvalue = ::floor(x);
+					else if (ast_node->str == "\\$ceil")  newNode->realvalue = ::ceil(x);
+					else if (ast_node->str == "\\$sin")   newNode->realvalue = ::sin(x);
+					else if (ast_node->str == "\\$cos")   newNode->realvalue = ::cos(x);
+					else if (ast_node->str == "\\$tan")   newNode->realvalue = ::tan(x);
+					else if (ast_node->str == "\\$asin")  newNode->realvalue = ::asin(x);
+					else if (ast_node->str == "\\$acos")  newNode->realvalue = ::acos(x);
+					else if (ast_node->str == "\\$atan")  newNode->realvalue = ::atan(x);
+					else if (ast_node->str == "\\$atan2") newNode->realvalue = ::atan2(x, y);
+					else if (ast_node->str == "\\$hypot") newNode->realvalue = ::hypot(x, y);
+					else if (ast_node->str == "\\$sinh")  newNode->realvalue = ::sinh(x);
+					else if (ast_node->str == "\\$cosh")  newNode->realvalue = ::cosh(x);
+					else if (ast_node->str == "\\$tanh")  newNode->realvalue = ::tanh(x);
+					else if (ast_node->str == "\\$asinh") newNode->realvalue = ::asinh(x);
+					else if (ast_node->str == "\\$acosh") newNode->realvalue = ::acosh(x);
+					else if (ast_node->str == "\\$atanh") newNode->realvalue = ::atanh(x);
+					else if (ast_node->str == "\\$itor")  newNode->realvalue = x;
 					else log_abort();
 				}
 				goto apply_newNode;
 			}
 
-			if (str == "\\$sformatf") {
-				AstNode *node_string = children[0];
-				while (node_string->simplify(true, false, false, stage, width_hint, sign_hint, false)) { }
+			if (ast_node->str == "\\$sformatf") {
+				AstNode *node_string = ast_node->children[0];
+				while (simplify(node_string, 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());
+					log_file_error(ast_node->filename, ast_node->location.first_line, "Failed to evaluate system function `%s' with non-constant 1st argument.\n", ast_node->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);
+				std::string sout = ast_node->process_format_str(sformat, 1, stage, width_hint, sign_hint);
+				newNode = ast_node->mkconst_str(sout);
 				goto apply_newNode;
 			}
 
-			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",
-							RTLIL::unescape_id(str).c_str(), int(children.size()));
+			if (ast_node->str == "\\$countbits") {
+				if (ast_node->children.size() < 2)
+					log_file_error(ast_node->filename, ast_node->location.first_line, "System function %s got %d arguments, expected at least 2.\n",
+							RTLIL::unescape_id(ast_node->str).c_str(), int(ast_node->children.size()));
 
 				std::vector<RTLIL::State> control_bits;
 
 				// Determine which bits to count
-				for (size_t i = 1; i < children.size(); i++) {
-					AstNode *node = children[i];
-					while (node->simplify(true, false, false, stage, -1, false, false)) { }
+				for (size_t i = 1; i < ast_node->children.size(); i++) {
+					AstNode *node = ast_node->children[i];
+					while (simplify(node, 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());
+						log_file_error(ast_node->filename, ast_node->location.first_line, "Failed to evaluate system function `%s' with non-constant control bit argument.\n", ast_node->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());
+						log_file_error(ast_node->filename, ast_node->location.first_line, "Failed to evaluate system function `%s' with control bit width != 1.\n", ast_node->str.c_str());
 					control_bits.push_back(node->bits[0]);
 				}
 
 				// Detect width of exp (first argument of $countbits)
 				int  exp_width = -1;
 				bool exp_sign  = false;
-				AstNode *exp = children[0];
+				AstNode *exp = ast_node->children[0];
 				exp->detectSignWidth(exp_width, exp_sign, NULL);
 
-				newNode = mkconst_int(0, false);
+				newNode = ast_node->mkconst_int(0, false);
 
 				for (int i = 0; i < exp_width; i++) {
 					// Generate nodes for:  exp << i >> ($size(exp) - 1)
 					//                          ^^   ^^
-					AstNode *lsh_node = new AstNode(AST_SHIFT_LEFT, exp->clone(), mkconst_int(i, false));
-					AstNode *rsh_node = new AstNode(AST_SHIFT_RIGHT, lsh_node, mkconst_int(exp_width - 1, false));
+					AstNode *lsh_node = new AstNode(AST_SHIFT_LEFT, exp->clone(), AstNode::mkconst_int(i, false));
+					AstNode *rsh_node = new AstNode(AST_SHIFT_RIGHT, lsh_node, AstNode::mkconst_int(exp_width - 1, false));
 
 					AstNode *or_node = nullptr;
 
 					for (RTLIL::State control_bit : control_bits) {
 						// Generate node for:  (exp << i >> ($size(exp) - 1)) === control_bit
 						//                                                    ^^^
-						AstNode *eq_node = new AstNode(AST_EQX, rsh_node->clone(), mkconst_bits({control_bit}, false));
+						AstNode *eq_node = new AstNode(AST_EQX, rsh_node->clone(), AstNode::mkconst_bits({control_bit}, false));
 
 						// Or the result for each checked bit value
 						if (or_node)
@@ -3384,27 +3380,27 @@
 				goto apply_newNode;
 			}
 
-			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",
-							RTLIL::unescape_id(str).c_str(), int(children.size()));
+			if (ast_node->str == "\\$countones" || ast_node->str == "\\$isunknown" || ast_node->str == "\\$onehot" || ast_node->str == "\\$onehot0") {
+				if (ast_node->children.size() != 1)
+					log_file_error(ast_node->filename, ast_node->location.first_line, "System function %s got %d arguments, expected 1.\n",
+							RTLIL::unescape_id(ast_node->str).c_str(), int(ast_node->children.size()));
 
-				AstNode *countbits = clone();
+				AstNode *countbits = ast_node->clone();
 				countbits->str = "\\$countbits";
 
-				if (str == "\\$countones") {
-					countbits->children.push_back(mkconst_bits({RTLIL::State::S1}, false));
+				if (ast_node->str == "\\$countones") {
+					countbits->children.push_back(AstNode::mkconst_bits({RTLIL::State::S1}, false));
 					newNode = countbits;
-				} else if (str == "\\$isunknown") {
-					countbits->children.push_back(mkconst_bits({RTLIL::Sx}, false));
-					countbits->children.push_back(mkconst_bits({RTLIL::Sz}, false));
-					newNode = new AstNode(AST_GT, countbits, mkconst_int(0, false));
-				} else if (str == "\\$onehot") {
-					countbits->children.push_back(mkconst_bits({RTLIL::State::S1}, false));
-					newNode = new AstNode(AST_EQ, countbits, mkconst_int(1, false));
-				} else if (str == "\\$onehot0") {
-					countbits->children.push_back(mkconst_bits({RTLIL::State::S1}, false));
-					newNode = new AstNode(AST_LE, countbits, mkconst_int(1, false));
+				} else if (ast_node->str == "\\$isunknown") {
+					countbits->children.push_back(AstNode::mkconst_bits({RTLIL::Sx}, false));
+					countbits->children.push_back(AstNode::mkconst_bits({RTLIL::Sz}, false));
+					newNode = new AstNode(AST_GT, countbits, AstNode::mkconst_int(0, false));
+				} else if (ast_node->str == "\\$onehot") {
+					countbits->children.push_back(AstNode::mkconst_bits({RTLIL::State::S1}, false));
+					newNode = new AstNode(AST_EQ, countbits, AstNode::mkconst_int(1, false));
+				} else if (ast_node->str == "\\$onehot0") {
+					countbits->children.push_back(AstNode::mkconst_bits({RTLIL::State::S1}, false));
+					newNode = new AstNode(AST_LE, countbits, AstNode::mkconst_int(1, false));
 				} else {
 					log_abort();
 				}
@@ -3412,9 +3408,9 @@
 				goto apply_newNode;
 			}
 
-			if (current_scope.count(str) != 0 && current_scope[str]->type == AST_DPI_FUNCTION)
+			if (current_scope.count(ast_node->str) != 0 && current_scope[ast_node->str]->type == AST_DPI_FUNCTION)
 			{
-				AstNode *dpi_decl = current_scope[str];
+				AstNode *dpi_decl = current_scope[ast_node->str];
 
 				std::string rtype, fname;
 				std::vector<std::string> argtypes;
@@ -3425,15 +3421,15 @@
 
 				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");
+					if (i-2 >= GetSize(ast_node->children))
+						log_file_error(ast_node->filename, ast_node->location.first_line, "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)) { }
+					args.push_back(ast_node->children.at(i-2)->clone());
+					while (simplify(args.back(), 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");
+						log_file_error(ast_node->filename, ast_node->location.first_line, "Failed to evaluate DPI function with non-constant argument.\n");
 				}
 
 				newNode = dpi_call(rtype, fname, argtypes, args);
@@ -3444,53 +3440,53 @@
 				goto apply_newNode;
 			}
 
-			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());
+			if (current_scope.count(ast_node->str) == 0)
+				ast_node->str = ast_node->try_pop_module_prefix();
+			if (current_scope.count(ast_node->str) == 0 || current_scope[ast_node->str]->type != AST_FUNCTION)
+				log_file_error(ast_node->filename, ast_node->location.first_line, "Can't resolve function name `%s'.\n", ast_node->str.c_str());
 		}
 
-		if (type == AST_TCALL)
+		if (ast_node->type == AST_TCALL)
 		{
-			if (str == "$finish" || str == "$stop")
+			if (ast_node->str == "$finish" || ast_node->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());
+					log_file_error(ast_node->filename, ast_node->location.first_line, "System task `%s' outside initial block is unsupported.\n", ast_node->str.c_str());
 
-				log_file_error(filename, location.first_line, "System task `%s' executed.\n", str.c_str());
+				log_file_error(ast_node->filename, ast_node->location.first_line, "System task `%s' executed.\n", ast_node->str.c_str());
 			}
 
-			if (str == "\\$readmemh" || str == "\\$readmemb")
+			if (ast_node->str == "\\$readmemh" || ast_node->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",
-							RTLIL::unescape_id(str).c_str(), int(children.size()));
+				if (GetSize(ast_node->children) < 2 || GetSize(ast_node->children) > 4)
+					log_file_error(ast_node->filename, ast_node->location.first_line, "System function %s got %d arguments, expected 2-4.\n",
+							RTLIL::unescape_id(ast_node->str).c_str(), int(ast_node->children.size()));
 
-				AstNode *node_filename = children[0]->clone();
-				while (node_filename->simplify(true, false, false, stage, width_hint, sign_hint, false)) { }
+				AstNode *node_filename = ast_node->children[0]->clone();
+				while (simplify(node_filename, 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());
+					log_file_error(ast_node->filename, ast_node->location.first_line, "Failed to evaluate system function `%s' with non-constant 1st argument.\n", ast_node->str.c_str());
 
-				AstNode *node_memory = children[1]->clone();
-				while (node_memory->simplify(true, false, false, stage, width_hint, sign_hint, false)) { }
+				AstNode *node_memory = ast_node->children[1]->clone();
+				while (simplify(node_memory, 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());
+					log_file_error(ast_node->filename, ast_node->location.first_line, "Failed to evaluate system function `%s' with non-memory 2nd argument.\n", ast_node->str.c_str());
 
 				int start_addr = -1, finish_addr = -1;
 
-				if (GetSize(children) > 2) {
-					AstNode *node_addr = children[2]->clone();
-					while (node_addr->simplify(true, false, false, stage, width_hint, sign_hint, false)) { }
+				if (GetSize(ast_node->children) > 2) {
+					AstNode *node_addr = ast_node->children[2]->clone();
+					while (simplify(node_addr, 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());
+						log_file_error(ast_node->filename, ast_node->location.first_line, "Failed to evaluate system function `%s' with non-constant 3rd argument.\n", ast_node->str.c_str());
 					start_addr = int(node_addr->asInt(false));
 				}
 
-				if (GetSize(children) > 3) {
-					AstNode *node_addr = children[3]->clone();
-					while (node_addr->simplify(true, false, false, stage, width_hint, sign_hint, false)) { }
+				if (GetSize(ast_node->children) > 3) {
+					AstNode *node_addr = ast_node->children[3]->clone();
+					while (simplify(node_addr, 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());
+						log_file_error(ast_node->filename, ast_node->location.first_line, "Failed to evaluate system function `%s' with non-constant 4th argument.\n", ast_node->str.c_str());
 					finish_addr = int(node_addr->asInt(false));
 				}
 
@@ -3503,7 +3499,7 @@
 						pool<AstNode*> next_queue;
 						for (auto n : queue)
 						for (auto c : n->children) {
-							if (c == this)
+							if (c == ast_node)
 								unconditional_init = true;
 							next_queue.insert(c);
 						}
@@ -3511,36 +3507,36 @@
 					}
 				}
 
-				newNode = readmem(str == "\\$readmemh", node_filename->bitsAsConst().decode_string(), node_memory->id2ast, start_addr, finish_addr, unconditional_init);
+				newNode = ast_node->readmem(ast_node->str == "\\$readmemh", node_filename->bitsAsConst().decode_string(), node_memory->id2ast, start_addr, finish_addr, unconditional_init);
 				delete node_filename;
 				delete node_memory;
 				goto apply_newNode;
 			}
 
-			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());
+			if (current_scope.count(ast_node->str) == 0)
+				ast_node->str = ast_node->try_pop_module_prefix();
+			if (current_scope.count(ast_node->str) == 0 || current_scope[ast_node->str]->type != AST_TASK)
+				log_file_error(ast_node->filename, ast_node->location.first_line, "Can't resolve task name `%s'.\n", ast_node->str.c_str());
 		}
 
 
 		std::stringstream sstr;
-		sstr << str << "$func$" << encode_filename(filename) << ":" << location.first_line << "$" << (autoidx++) << '.';
+		sstr << ast_node->str << "$func$" << encode_filename(ast_node->filename) << ":" << ast_node->location.first_line << "$" << (autoidx++) << '.';
 		std::string prefix = sstr.str();
 
-		AstNode *decl = current_scope[str];
+		AstNode *decl = current_scope[ast_node->str];
 		if (unevaluated_tern_branch && decl->is_recursive_function())
 			goto replace_fcall_later;
 		decl = decl->clone();
-		decl->replace_result_wire_name_in_function(str, "$result"); // enables recursion
+		decl->replace_result_wire_name_in_function(ast_node->str, "$result"); // enables recursion
 		decl->expand_genblock(prefix);
 
 		if (decl->type == AST_FUNCTION && !decl->attributes.count(ID::via_celltype))
 		{
 			bool require_const_eval = decl->has_const_only_constructs();
 			bool all_args_const = true;
-			for (auto child : children) {
-				while (child->simplify(true, false, false, 1, -1, false, true)) { }
+			for (auto child : ast_node->children) {
+				while (simplify(child, true, false, false, 1, -1, false, true)) { }
 				if (child->type != AST_CONSTANT && child->type != AST_REALVALUE)
 					all_args_const = false;
 			}
@@ -3548,7 +3544,7 @@
 			if (all_args_const) {
 				AstNode *func_workspace = decl->clone();
 				func_workspace->str = prefix_id(prefix, "$result");
-				newNode = func_workspace->eval_const_function(this, in_param || require_const_eval);
+				newNode = func_workspace->eval_const_function(ast_node, in_param || require_const_eval);
 				delete func_workspace;
 				if (newNode) {
 					delete decl;
@@ -3557,9 +3553,9 @@
 			}
 
 			if (in_param)
-				log_file_error(filename, location.first_line, "Non-constant function call in constant expression.\n");
+				log_file_error(ast_node->filename, ast_node->location.first_line, "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());
+				log_file_error(ast_node->filename, ast_node->location.first_line, "Function %s can only be called with constant arguments.\n", ast_node->str.c_str());
 		}
 
 		size_t arg_count = 0;
@@ -3569,7 +3565,7 @@
 
 		if (current_block == NULL)
 		{
-			log_assert(type == AST_FCALL);
+			log_assert(ast_node->type == AST_FCALL);
 
 			AstNode *wire = NULL;
 			std::string res_name = prefix_id(prefix, "$result");
@@ -3584,13 +3580,13 @@
 
 			current_scope[wire->str] = wire;
 			current_ast_mod->children.push_back(wire);
-			while (wire->simplify(true, false, false, 1, -1, false, false)) { }
+			while (simplify(wire, true, false, false, 1, -1, false, false)) { }
 
 			AstNode *lvalue = new AstNode(AST_IDENTIFIER);
 			lvalue->str = wire->str;
 
 			AstNode *always = new AstNode(AST_ALWAYS, new AstNode(AST_BLOCK,
-					new AstNode(AST_ASSIGN_EQ, lvalue, clone())));
+					new AstNode(AST_ASSIGN_EQ, lvalue, ast_node->clone())));
 			always->children[0]->children[0]->was_checked = true;
 
 			current_ast_mod->children.push_back(always);
@@ -3601,7 +3597,7 @@
 		if (decl->attributes.count(ID::via_celltype))
 		{
 			std::string celltype = decl->attributes.at(ID::via_celltype)->asAttrConst().decode_string();
-			std::string outport = str;
+			std::string outport = ast_node->str;
 
 			if (celltype.find(' ') != std::string::npos) {
 				int pos = celltype.find(' ');
@@ -3623,21 +3619,21 @@
 				}
 
 			for (auto child : decl->children)
-				if (child->type == AST_WIRE && (child->is_input || child->is_output || (type == AST_FCALL && child->str == str)))
+				if (child->type == AST_WIRE && (child->is_input || child->is_output || (ast_node->type == AST_FCALL && child->str == ast_node->str)))
 				{
 					AstNode *wire = child->clone();
 					wire->port_id = 0;
 					wire->is_input = false;
 					wire->is_output = false;
 					current_ast_mod->children.push_back(wire);
-					while (wire->simplify(true, false, false, 1, -1, false, false)) { }
+					while (simplify(wire, true, false, false, 1, -1, false, false)) { }
 
 					AstNode *wire_id = new AstNode(AST_IDENTIFIER);
 					wire_id->str = wire->str;
 
-					if ((child->is_input || child->is_output) && arg_count < children.size())
+					if ((child->is_input || child->is_output) && arg_count < ast_node->children.size())
 					{
-						AstNode *arg = children[arg_count++]->clone();
+						AstNode *arg = ast_node->children[arg_count++]->clone();
 						AstNode *assign = child->is_input ?
 								new AstNode(AST_ASSIGN_EQ, wire_id->clone(), arg) :
 								new AstNode(AST_ASSIGN_EQ, arg, wire_id->clone());
@@ -3652,7 +3648,7 @@
 					}
 
 					AstNode *cell_arg = new AstNode(AST_ARGUMENT, wire_id);
-					cell_arg->str = child->str == str ? outport : child->str;
+					cell_arg->str = child->str == ast_node->str ? outport : child->str;
 					cell->children.push_back(cell_arg);
 				}
 
@@ -3673,14 +3669,14 @@
 						for (auto c : child->children)
 							wire->children.push_back(c->clone());
 					} else if (!child->children.empty()) {
-						while (child->simplify(true, false, false, stage, -1, false, false)) { }
+						while (simplify(child, true, false, false, stage, -1, false, 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))
 									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());
+							log_file_error(ast_node->filename, ast_node->location.first_line, "Incompatible re-declaration of wire %s.\n", child->str.c_str());
 						}
 					}
 				}
@@ -3701,11 +3697,11 @@
 					current_ast_mod->children.push_back(wire);
 				}
 
-				while (wire->simplify(true, false, false, 1, -1, false, false)) { }
+				while (simplify(wire, true, false, false, 1, -1, false, false)) { }
 
-				if ((child->is_input || child->is_output) && arg_count < children.size())
+				if ((child->is_input || child->is_output) && arg_count < ast_node->children.size())
 				{
-					AstNode *arg = children[arg_count++]->clone();
+					AstNode *arg = ast_node->children[arg_count++]->clone();
 					// convert purely constant arguments into localparams
 					if (child->is_input && child->type == AST_WIRE && arg->type == AST_CONSTANT && node_contains_assignment_to(decl, child)) {
 						wire->type = AST_LOCALPARAM;
@@ -3728,12 +3724,12 @@
 								AstNode* range = new AstNode();
 								range->type = AST_RANGE;
 								wire->children.push_back(range);
-								range->children.push_back(mkconst_int(0, true));
-								range->children.push_back(mkconst_int(0, true));
+								range->children.push_back(AstNode::mkconst_int(0, true));
+								range->children.push_back(AstNode::mkconst_int(0, true));
 							}
 						}
 						// updates the sizing
-						while (wire->simplify(true, false, false, 1, -1, false, false)) { }
+						while (simplify(wire, true, false, false, 1, -1, false, false)) { }
 						delete arg;
 						continue;
 					}
@@ -3766,13 +3762,13 @@
 
 	replace_fcall_with_id:
 		delete decl;
-		if (type == AST_FCALL) {
-			delete_children();
-			type = AST_IDENTIFIER;
-			str = prefix_id(prefix, "$result");
+		if (ast_node->type == AST_FCALL) {
+			ast_node->delete_children();
+			ast_node->type = AST_IDENTIFIER;
+			ast_node->str = prefix_id(prefix, "$result");
 		}
-		if (type == AST_TCALL)
-			str = "";
+		if (ast_node->type == AST_TCALL)
+			ast_node->str = "";
 		did_something = true;
 	}
 
@@ -3786,72 +3782,72 @@
 		RTLIL::Const (*const_func)(const RTLIL::Const&, const RTLIL::Const&, bool, bool, int);
 		RTLIL::Const dummy_arg;
 
-		switch (type)
+		switch (ast_node->type)
 		{
 		case AST_IDENTIFIER:
-			if (current_scope.count(str) > 0 && (current_scope[str]->type == AST_PARAMETER || current_scope[str]->type == AST_LOCALPARAM || current_scope[str]->type == AST_ENUM_ITEM)) {
-				if (current_scope[str]->children[0]->type == AST_CONSTANT) {
-					if (children.size() != 0 && children[0]->type == AST_RANGE && children[0]->range_valid) {
+			if (current_scope.count(ast_node->str) > 0 && (current_scope[ast_node->str]->type == AST_PARAMETER || current_scope[ast_node->str]->type == AST_LOCALPARAM || current_scope[ast_node->str]->type == AST_ENUM_ITEM)) {
+				if (current_scope[ast_node->str]->children[0]->type == AST_CONSTANT) {
+					if (ast_node->children.size() != 0 && ast_node->children[0]->type == AST_RANGE && ast_node->children[0]->range_valid) {
 						std::vector<RTLIL::State> data;
-						bool param_upto = current_scope[str]->range_valid && current_scope[str]->range_swapped;
-						int param_offset = current_scope[str]->range_valid ? current_scope[str]->range_right : 0;
-						int param_width = current_scope[str]->range_valid ? current_scope[str]->range_left - current_scope[str]->range_right + 1 :
-								GetSize(current_scope[str]->children[0]->bits);
-						int tmp_range_left = children[0]->range_left, tmp_range_right = children[0]->range_right;
+						bool param_upto = current_scope[ast_node->str]->range_valid && current_scope[ast_node->str]->range_swapped;
+						int param_offset = current_scope[ast_node->str]->range_valid ? current_scope[ast_node->str]->range_right : 0;
+						int param_width = current_scope[ast_node->str]->range_valid ? current_scope[ast_node->str]->range_left - current_scope[ast_node->str]->range_right + 1 :
+								GetSize(current_scope[ast_node->str]->children[0]->bits);
+						int tmp_range_left = ast_node->children[0]->range_left, tmp_range_right = ast_node->children[0]->range_right;
 						if (param_upto) {
-							tmp_range_left = (param_width + 2*param_offset) - children[0]->range_right - 1;
-							tmp_range_right = (param_width + 2*param_offset) - children[0]->range_left - 1;
+							tmp_range_left = (param_width + 2*param_offset) - ast_node->children[0]->range_right - 1;
+							tmp_range_right = (param_width + 2*param_offset) - ast_node->children[0]->range_left - 1;
 						}
-						AST::AstNode *member_node = get_struct_member(this);
+						AST::AstNode *member_node = AST::get_struct_member(ast_node);
 						int chunk_offset = member_node ? member_node->range_right : 0;
 						log_assert(!(chunk_offset && param_upto));
 						for (int i = tmp_range_right; i <= tmp_range_left; i++) {
 							int index = i - param_offset;
 							if (0 <= index && index < param_width)
-								data.push_back(current_scope[str]->children[0]->bits[chunk_offset + index]);
+								data.push_back(current_scope[ast_node->str]->children[0]->bits[chunk_offset + index]);
 							else
 								data.push_back(RTLIL::State::Sx);
 						}
-						newNode = mkconst_bits(data, false);
+						newNode = AstNode::mkconst_bits(data, false);
 					} else
-					if (children.size() == 0)
-						newNode = current_scope[str]->children[0]->clone();
+					if (ast_node->children.size() == 0)
+						newNode = current_scope[ast_node->str]->children[0]->clone();
 				} else
-				if (current_scope[str]->children[0]->isConst())
-					newNode = current_scope[str]->children[0]->clone();
+				if (current_scope[ast_node->str]->children[0]->isConst())
+					newNode = current_scope[ast_node->str]->children[0]->clone();
 			}
-			else if (at_zero && current_scope.count(str) > 0) {
-				AstNode *node = current_scope[str];
+			else if (at_zero && current_scope.count(ast_node->str) > 0) {
+				AstNode *node = current_scope[ast_node->str];
 				if (node->type == AST_WIRE || node->type == AST_AUTOWIRE || node->type == AST_MEMORY)
-					newNode = mkconst_int(0, sign_hint, width_hint);
+					newNode = node->mkconst_int(0, sign_hint, width_hint);
 			}
 			break;
 		case AST_MEMRD:
 			if (at_zero) {
-				newNode = mkconst_int(0, sign_hint, width_hint);
+				newNode = AstNode::mkconst_int(0, sign_hint, width_hint);
 			}
 			break;
 		case AST_BIT_NOT:
-			if (children[0]->type == AST_CONSTANT) {
-				RTLIL::Const y = RTLIL::const_not(children[0]->bitsAsConst(width_hint, sign_hint), dummy_arg, sign_hint, false, width_hint);
-				newNode = mkconst_bits(y.bits, sign_hint);
+			if (ast_node->children[0]->type == AST_CONSTANT) {
+				RTLIL::Const y = RTLIL::const_not(ast_node->children[0]->bitsAsConst(width_hint, sign_hint), dummy_arg, sign_hint, false, width_hint);
+				newNode = AstNode::mkconst_bits(y.bits, sign_hint);
 			}
 			break;
 		case AST_TO_SIGNED:
 		case AST_TO_UNSIGNED:
-			if (children[0]->type == AST_CONSTANT) {
-				RTLIL::Const y = children[0]->bitsAsConst(width_hint, sign_hint);
-				newNode = mkconst_bits(y.bits, type == AST_TO_SIGNED);
+			if (ast_node->children[0]->type == AST_CONSTANT) {
+				RTLIL::Const y = ast_node->children[0]->bitsAsConst(width_hint, sign_hint);
+				newNode = AstNode::mkconst_bits(y.bits, ast_node->type == AST_TO_SIGNED);
 			}
 			break;
 		if (0) { case AST_BIT_AND:  const_func = RTLIL::const_and;  }
 		if (0) { case AST_BIT_OR:   const_func = RTLIL::const_or;   }
 		if (0) { case AST_BIT_XOR:  const_func = RTLIL::const_xor;  }
 		if (0) { case AST_BIT_XNOR: const_func = RTLIL::const_xnor; }
-			if (children[0]->type == AST_CONSTANT && children[1]->type == AST_CONSTANT) {
-				RTLIL::Const y = const_func(children[0]->bitsAsConst(width_hint, sign_hint),
-						children[1]->bitsAsConst(width_hint, sign_hint), sign_hint, sign_hint, width_hint);
-				newNode = mkconst_bits(y.bits, sign_hint);
+			if (ast_node->children[0]->type == AST_CONSTANT && ast_node->children[1]->type == AST_CONSTANT) {
+				RTLIL::Const y = const_func(ast_node->children[0]->bitsAsConst(width_hint, sign_hint),
+						ast_node->children[1]->bitsAsConst(width_hint, sign_hint), sign_hint, sign_hint, width_hint);
+				newNode = AstNode::mkconst_bits(y.bits, sign_hint);
 			}
 			break;
 		if (0) { case AST_REDUCE_AND:  const_func = RTLIL::const_reduce_and;  }
@@ -3859,32 +3855,32 @@
 		if (0) { case AST_REDUCE_XOR:  const_func = RTLIL::const_reduce_xor;  }
 		if (0) { case AST_REDUCE_XNOR: const_func = RTLIL::const_reduce_xnor; }
 		if (0) { case AST_REDUCE_BOOL: const_func = RTLIL::const_reduce_bool; }
-			if (children[0]->type == AST_CONSTANT) {
-				RTLIL::Const y = const_func(RTLIL::Const(children[0]->bits), dummy_arg, false, false, -1);
-				newNode = mkconst_bits(y.bits, false);
+			if (ast_node->children[0]->type == AST_CONSTANT) {
+				RTLIL::Const y = const_func(RTLIL::Const(ast_node->children[0]->bits), dummy_arg, false, false, -1);
+				newNode = AstNode::mkconst_bits(y.bits, false);
 			}
 			break;
 		case AST_LOGIC_NOT:
-			if (children[0]->type == AST_CONSTANT) {
-				RTLIL::Const y = RTLIL::const_logic_not(RTLIL::Const(children[0]->bits), dummy_arg, children[0]->is_signed, false, -1);
-				newNode = mkconst_bits(y.bits, false);
+			if (ast_node->children[0]->type == AST_CONSTANT) {
+				RTLIL::Const y = RTLIL::const_logic_not(RTLIL::Const(ast_node->children[0]->bits), dummy_arg, ast_node->children[0]->is_signed, false, -1);
+				newNode = AstNode::mkconst_bits(y.bits, false);
 			} else
-			if (children[0]->isConst()) {
-				newNode = mkconst_int(children[0]->asReal(sign_hint) == 0, false, 1);
+			if (ast_node->children[0]->isConst()) {
+				newNode = AstNode::mkconst_int(ast_node->children[0]->asReal(sign_hint) == 0, false, 1);
 			}
 			break;
 		if (0) { case AST_LOGIC_AND: const_func = RTLIL::const_logic_and; }
 		if (0) { case AST_LOGIC_OR:  const_func = RTLIL::const_logic_or;  }
-			if (children[0]->type == AST_CONSTANT && children[1]->type == AST_CONSTANT) {
-				RTLIL::Const y = const_func(RTLIL::Const(children[0]->bits), RTLIL::Const(children[1]->bits),
-						children[0]->is_signed, children[1]->is_signed, -1);
-				newNode = mkconst_bits(y.bits, false);
+			if (ast_node->children[0]->type == AST_CONSTANT && ast_node->children[1]->type == AST_CONSTANT) {
+				RTLIL::Const y = const_func(RTLIL::Const(ast_node->children[0]->bits), RTLIL::Const(ast_node->children[1]->bits),
+						ast_node->children[0]->is_signed, ast_node->children[1]->is_signed, -1);
+				newNode = AstNode::mkconst_bits(y.bits, false);
 			} else
-			if (children[0]->isConst() && children[1]->isConst()) {
-				if (type == AST_LOGIC_AND)
-					newNode = mkconst_int((children[0]->asReal(sign_hint) != 0) && (children[1]->asReal(sign_hint) != 0), false, 1);
+			if (ast_node->children[0]->isConst() && ast_node->children[1]->isConst()) {
+				if (ast_node->type == AST_LOGIC_AND)
+					newNode = AstNode::mkconst_int((ast_node->children[0]->asReal(sign_hint) != 0) && (ast_node->children[1]->asReal(sign_hint) != 0), false, 1);
 				else
-					newNode = mkconst_int((children[0]->asReal(sign_hint) != 0) || (children[1]->asReal(sign_hint) != 0), false, 1);
+					newNode = AstNode::mkconst_int((ast_node->children[0]->asReal(sign_hint) != 0) || (ast_node->children[1]->asReal(sign_hint) != 0), false, 1);
 			}
 			break;
 		if (0) { case AST_SHIFT_LEFT:   const_func = RTLIL::const_shl;  }
@@ -3892,14 +3888,14 @@
 		if (0) { case AST_SHIFT_SLEFT:  const_func = RTLIL::const_sshl; }
 		if (0) { case AST_SHIFT_SRIGHT: const_func = RTLIL::const_sshr; }
 		if (0) { case AST_POW:          const_func = RTLIL::const_pow; }
-			if (children[0]->type == AST_CONSTANT && children[1]->type == AST_CONSTANT) {
-				RTLIL::Const y = const_func(children[0]->bitsAsConst(width_hint, sign_hint),
-						RTLIL::Const(children[1]->bits), sign_hint, type == AST_POW ? children[1]->is_signed : false, width_hint);
-				newNode = mkconst_bits(y.bits, sign_hint);
+			if (ast_node->children[0]->type == AST_CONSTANT && ast_node->children[1]->type == AST_CONSTANT) {
+				RTLIL::Const y = const_func(ast_node->children[0]->bitsAsConst(width_hint, sign_hint),
+						RTLIL::Const(ast_node->children[1]->bits), sign_hint, ast_node->type == AST_POW ? ast_node->children[1]->is_signed : false, width_hint);
+				newNode = AstNode::mkconst_bits(y.bits, sign_hint);
 			} else
-			if (type == AST_POW && children[0]->isConst() && children[1]->isConst()) {
+			if (ast_node->type == AST_POW && ast_node->children[0]->isConst() && ast_node->children[1]->isConst()) {
 				newNode = new AstNode(AST_REALVALUE);
-				newNode->realvalue = pow(children[0]->asReal(sign_hint), children[1]->asReal(sign_hint));
+				newNode->realvalue = pow(ast_node->children[0]->asReal(sign_hint), ast_node->children[1]->asReal(sign_hint));
 			}
 			break;
 		if (0) { case AST_LT:  const_func = RTLIL::const_lt; }
@@ -3910,24 +3906,24 @@
 		if (0) { case AST_NEX: const_func = RTLIL::const_nex; }
 		if (0) { case AST_GE:  const_func = RTLIL::const_ge; }
 		if (0) { case AST_GT:  const_func = RTLIL::const_gt; }
-			if (children[0]->type == AST_CONSTANT && children[1]->type == AST_CONSTANT) {
-				int cmp_width = max(children[0]->bits.size(), children[1]->bits.size());
-				bool cmp_signed = children[0]->is_signed && children[1]->is_signed;
-				RTLIL::Const y = const_func(children[0]->bitsAsConst(cmp_width, cmp_signed),
-						children[1]->bitsAsConst(cmp_width, cmp_signed), cmp_signed, cmp_signed, 1);
-				newNode = mkconst_bits(y.bits, false);
+			if (ast_node->children[0]->type == AST_CONSTANT && ast_node->children[1]->type == AST_CONSTANT) {
+				int cmp_width = max(ast_node->children[0]->bits.size(), ast_node->children[1]->bits.size());
+				bool cmp_signed = ast_node->children[0]->is_signed && ast_node->children[1]->is_signed;
+				RTLIL::Const y = const_func(ast_node->children[0]->bitsAsConst(cmp_width, cmp_signed),
+						ast_node->children[1]->bitsAsConst(cmp_width, cmp_signed), cmp_signed, cmp_signed, 1);
+				newNode = AstNode::mkconst_bits(y.bits, false);
 			} else
-			if (children[0]->isConst() && children[1]->isConst()) {
-				bool cmp_signed = (children[0]->type == AST_REALVALUE || children[0]->is_signed) && (children[1]->type == AST_REALVALUE || children[1]->is_signed);
-				switch (type) {
-				case AST_LT:  newNode = mkconst_int(children[0]->asReal(cmp_signed) <  children[1]->asReal(cmp_signed), false, 1); break;
-				case AST_LE:  newNode = mkconst_int(children[0]->asReal(cmp_signed) <= children[1]->asReal(cmp_signed), false, 1); break;
-				case AST_EQ:  newNode = mkconst_int(children[0]->asReal(cmp_signed) == children[1]->asReal(cmp_signed), false, 1); break;
-				case AST_NE:  newNode = mkconst_int(children[0]->asReal(cmp_signed) != children[1]->asReal(cmp_signed), false, 1); break;
-				case AST_EQX: newNode = mkconst_int(children[0]->asReal(cmp_signed) == children[1]->asReal(cmp_signed), false, 1); break;
-				case AST_NEX: newNode = mkconst_int(children[0]->asReal(cmp_signed) != children[1]->asReal(cmp_signed), false, 1); break;
-				case AST_GE:  newNode = mkconst_int(children[0]->asReal(cmp_signed) >= children[1]->asReal(cmp_signed), false, 1); break;
-				case AST_GT:  newNode = mkconst_int(children[0]->asReal(cmp_signed) >  children[1]->asReal(cmp_signed), false, 1); break;
+			if (ast_node->children[0]->isConst() && ast_node->children[1]->isConst()) {
+				bool cmp_signed = (ast_node->children[0]->type == AST_REALVALUE || ast_node->children[0]->is_signed) && (ast_node->children[1]->type == AST_REALVALUE || ast_node->children[1]->is_signed);
+				switch (ast_node->type) {
+				case AST_LT:  newNode = AstNode::mkconst_int(ast_node->children[0]->asReal(cmp_signed) <  ast_node->children[1]->asReal(cmp_signed), false, 1); break;
+				case AST_LE:  newNode = AstNode::mkconst_int(ast_node->children[0]->asReal(cmp_signed) <= ast_node->children[1]->asReal(cmp_signed), false, 1); break;
+				case AST_EQ:  newNode = AstNode::mkconst_int(ast_node->children[0]->asReal(cmp_signed) == ast_node->children[1]->asReal(cmp_signed), false, 1); break;
+				case AST_NE:  newNode = AstNode::mkconst_int(ast_node->children[0]->asReal(cmp_signed) != ast_node->children[1]->asReal(cmp_signed), false, 1); break;
+				case AST_EQX: newNode = AstNode::mkconst_int(ast_node->children[0]->asReal(cmp_signed) == ast_node->children[1]->asReal(cmp_signed), false, 1); break;
+				case AST_NEX: newNode = AstNode::mkconst_int(ast_node->children[0]->asReal(cmp_signed) != ast_node->children[1]->asReal(cmp_signed), false, 1); break;
+				case AST_GE:  newNode = AstNode::mkconst_int(ast_node->children[0]->asReal(cmp_signed) >= ast_node->children[1]->asReal(cmp_signed), false, 1); break;
+				case AST_GT:  newNode = AstNode::mkconst_int(ast_node->children[0]->asReal(cmp_signed) >  ast_node->children[1]->asReal(cmp_signed), false, 1); break;
 				default: log_abort();
 				}
 			}
@@ -3937,19 +3933,19 @@
 		if (0) { case AST_MUL: const_func = RTLIL::const_mul; }
 		if (0) { case AST_DIV: const_func = RTLIL::const_div; }
 		if (0) { case AST_MOD: const_func = RTLIL::const_mod; }
-			if (children[0]->type == AST_CONSTANT && children[1]->type == AST_CONSTANT) {
-				RTLIL::Const y = const_func(children[0]->bitsAsConst(width_hint, sign_hint),
-						children[1]->bitsAsConst(width_hint, sign_hint), sign_hint, sign_hint, width_hint);
-				newNode = mkconst_bits(y.bits, sign_hint);
+			if (ast_node->children[0]->type == AST_CONSTANT && ast_node->children[1]->type == AST_CONSTANT) {
+				RTLIL::Const y = const_func(ast_node->children[0]->bitsAsConst(width_hint, sign_hint),
+						ast_node->children[1]->bitsAsConst(width_hint, sign_hint), sign_hint, sign_hint, width_hint);
+				newNode = AstNode::mkconst_bits(y.bits, sign_hint);
 			} else
-			if (children[0]->isConst() && children[1]->isConst()) {
+			if (ast_node->children[0]->isConst() && ast_node->children[1]->isConst()) {
 				newNode = new AstNode(AST_REALVALUE);
-				switch (type) {
-				case AST_ADD: newNode->realvalue = children[0]->asReal(sign_hint) + children[1]->asReal(sign_hint); break;
-				case AST_SUB: newNode->realvalue = children[0]->asReal(sign_hint) - children[1]->asReal(sign_hint); break;
-				case AST_MUL: newNode->realvalue = children[0]->asReal(sign_hint) * children[1]->asReal(sign_hint); break;
-				case AST_DIV: newNode->realvalue = children[0]->asReal(sign_hint) / children[1]->asReal(sign_hint); break;
-				case AST_MOD: newNode->realvalue = fmod(children[0]->asReal(sign_hint), children[1]->asReal(sign_hint)); break;
+				switch (ast_node->type) {
+				case AST_ADD: newNode->realvalue = ast_node->children[0]->asReal(sign_hint) + ast_node->children[1]->asReal(sign_hint); break;
+				case AST_SUB: newNode->realvalue = ast_node->children[0]->asReal(sign_hint) - ast_node->children[1]->asReal(sign_hint); break;
+				case AST_MUL: newNode->realvalue = ast_node->children[0]->asReal(sign_hint) * ast_node->children[1]->asReal(sign_hint); break;
+				case AST_DIV: newNode->realvalue = ast_node->children[0]->asReal(sign_hint) / ast_node->children[1]->asReal(sign_hint); break;
+				case AST_MOD: newNode->realvalue = fmod(ast_node->children[0]->asReal(sign_hint), ast_node->children[1]->asReal(sign_hint)); break;
 				default: log_abort();
 				}
 			}
@@ -3957,22 +3953,22 @@
 		if (0) { case AST_SELFSZ: const_func = RTLIL::const_pos; }
 		if (0) { case AST_POS: const_func = RTLIL::const_pos; }
 		if (0) { case AST_NEG: const_func = RTLIL::const_neg; }
-			if (children[0]->type == AST_CONSTANT) {
-				RTLIL::Const y = const_func(children[0]->bitsAsConst(width_hint, sign_hint), dummy_arg, sign_hint, false, width_hint);
-				newNode = mkconst_bits(y.bits, sign_hint);
+			if (ast_node->children[0]->type == AST_CONSTANT) {
+				RTLIL::Const y = const_func(ast_node->children[0]->bitsAsConst(width_hint, sign_hint), dummy_arg, sign_hint, false, width_hint);
+				newNode = AstNode::mkconst_bits(y.bits, sign_hint);
 			} else
-			if (children[0]->isConst()) {
+			if (ast_node->children[0]->isConst()) {
 				newNode = new AstNode(AST_REALVALUE);
-				if (type == AST_NEG)
-					newNode->realvalue = -children[0]->asReal(sign_hint);
+				if (ast_node->type == AST_NEG)
+					newNode->realvalue = -ast_node->children[0]->asReal(sign_hint);
 				else
-					newNode->realvalue = +children[0]->asReal(sign_hint);
+					newNode->realvalue = +ast_node->children[0]->asReal(sign_hint);
 			}
 			break;
 		case AST_TERNARY:
-			if (children[0]->isConst())
+			if (ast_node->children[0]->isConst())
 			{
-				auto pair = get_tern_choice();
+				auto pair = ast_node->get_tern_choice();
 				AstNode *choice = pair.first;
 				AstNode *not_choice = pair.second;
 
@@ -3988,26 +3984,26 @@
 						} else {
 							RTLIL::Const y = choice->bitsAsConst(width_hint, sign_hint);
 							if (choice->is_string && y.bits.size() % 8 == 0 && sign_hint == false)
-								newNode = mkconst_str(y.bits);
+								newNode = AstNode::mkconst_str(y.bits);
 							else
-								newNode = mkconst_bits(y.bits, sign_hint);
+								newNode = AstNode::mkconst_bits(y.bits, sign_hint);
 						}
 					} else
 					if (choice->isConst()) {
 						newNode = choice->clone();
 					}
-				} else if (children[1]->type == AST_CONSTANT && children[2]->type == AST_CONSTANT) {
-					RTLIL::Const a = children[1]->bitsAsConst(width_hint, sign_hint);
-					RTLIL::Const b = children[2]->bitsAsConst(width_hint, sign_hint);
+				} else if (ast_node->children[1]->type == AST_CONSTANT && ast_node->children[2]->type == AST_CONSTANT) {
+					RTLIL::Const a = ast_node->children[1]->bitsAsConst(width_hint, sign_hint);
+					RTLIL::Const b = ast_node->children[2]->bitsAsConst(width_hint, sign_hint);
 					log_assert(a.bits.size() == b.bits.size());
 					for (size_t i = 0; i < a.bits.size(); i++)
 						if (a.bits[i] != b.bits[i])
 							a.bits[i] = RTLIL::State::Sx;
-					newNode = mkconst_bits(a.bits, sign_hint);
-				} else if (children[1]->isConst() && children[2]->isConst()) {
+					newNode = AstNode::mkconst_bits(a.bits, sign_hint);
+				} else if (ast_node->children[1]->isConst() && ast_node->children[2]->isConst()) {
 					newNode = new AstNode(AST_REALVALUE);
-					if (children[1]->asReal(sign_hint) == children[2]->asReal(sign_hint))
-						newNode->realvalue = children[1]->asReal(sign_hint);
+					if (ast_node->children[1]->asReal(sign_hint) == ast_node->children[2]->asReal(sign_hint))
+						newNode->realvalue = ast_node->children[1]->asReal(sign_hint);
 					else
 						// IEEE Std 1800-2012 Sec. 11.4.11 states that the entry in Table 7-1 for
 						// the data type in question should be returned if the ?: is ambiguous. The
@@ -4017,33 +4013,33 @@
 			}
 			break;
 		case AST_CAST_SIZE:
-			if (children.at(0)->type == AST_CONSTANT && children.at(1)->type == AST_CONSTANT) {
-				int width = children[0]->bitsAsConst().as_int();
+			if (ast_node->children.at(0)->type == AST_CONSTANT && ast_node->children.at(1)->type == AST_CONSTANT) {
+				int width = ast_node->children[0]->bitsAsConst().as_int();
 				RTLIL::Const val;
-				if (children[1]->is_unsized)
-					val = children[1]->bitsAsUnsizedConst(width);
+				if (ast_node->children[1]->is_unsized)
+					val = ast_node->children[1]->bitsAsUnsizedConst(width);
 				else
-					val = children[1]->bitsAsConst(width);
-				newNode = mkconst_bits(val.bits, children[1]->is_signed);
+					val = ast_node->children[1]->bitsAsConst(width);
+				newNode = AstNode::mkconst_bits(val.bits, ast_node->children[1]->is_signed);
 			}
 			break;
 		case AST_CONCAT:
-			string_op = !children.empty();
-			for (auto it = children.begin(); it != children.end(); it++) {
+			string_op = !ast_node->children.empty();
+			for (auto it = ast_node->children.begin(); it != ast_node->children.end(); it++) {
 				if ((*it)->type != AST_CONSTANT)
 					goto not_const;
 				if (!(*it)->is_string)
 					string_op = false;
 				tmp_bits.insert(tmp_bits.end(), (*it)->bits.begin(), (*it)->bits.end());
 			}
-			newNode = string_op ? mkconst_str(tmp_bits) : mkconst_bits(tmp_bits, false);
+			newNode = string_op ? AstNode::mkconst_str(tmp_bits) : AstNode::mkconst_bits(tmp_bits, false);
 			break;
 		case AST_REPLICATE:
-			if (children.at(0)->type != AST_CONSTANT || children.at(1)->type != AST_CONSTANT)
+			if (ast_node->children.at(0)->type != AST_CONSTANT || ast_node->children.at(1)->type != AST_CONSTANT)
 				goto not_const;
-			for (int i = 0; i < children[0]->bitsAsConst().as_int(); i++)
-				tmp_bits.insert(tmp_bits.end(), children.at(1)->bits.begin(), children.at(1)->bits.end());
-			newNode = children.at(1)->is_string ? mkconst_str(tmp_bits) : mkconst_bits(tmp_bits, false);
+			for (int i = 0; i < ast_node->children[0]->bitsAsConst().as_int(); i++)
+				tmp_bits.insert(tmp_bits.end(), ast_node->children.at(1)->bits.begin(), ast_node->children.at(1)->bits.end());
+			newNode = ast_node->children.at(1)->is_string ? AstNode::mkconst_str(tmp_bits) : AstNode::mkconst_bits(tmp_bits, false);
 			break;
 		default:
 		not_const:
@@ -4051,22 +4047,22 @@
 		}
 	}
 
-	// if any of the above set 'newNode' -> use 'newNode' as template to update 'this'
+	// if any of the above set 'newNode' -> use 'newNode' as template to update 'ast_node'
 	if (newNode) {
 apply_newNode:
 		// fprintf(stderr, "----\n");
 		// dumpAst(stderr, "- ");
 		// newNode->dumpAst(stderr, "+ ");
 		log_assert(newNode != NULL);
-		newNode->filename = filename;
-		newNode->location = location;
-		newNode->cloneInto(this);
+		newNode->filename = ast_node->filename;
+		newNode->location = ast_node->location;
+		newNode->cloneInto(ast_node);
 		delete newNode;
 		did_something = true;
 	}
 
 	if (!did_something)
-		basic_prep = true;
+		ast_node->basic_prep = true;
 
 	recursion_counter--;
 	return did_something;