mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-29 18:52:30 +00:00 
			
		
		
		
	Remove auto_wire framework (smarter than the verilog standard)
This commit is contained in:
		
							parent
							
								
									609caa23b5
								
							
						
					
					
						commit
						f71e27dbf1
					
				
					 9 changed files with 5 additions and 126 deletions
				
			
		|  | @ -118,8 +118,6 @@ void ILANG_BACKEND::dump_wire(FILE *f, std::string indent, const RTLIL::Wire *wi | ||||||
| 		fprintf(f, "\n"); | 		fprintf(f, "\n"); | ||||||
| 	} | 	} | ||||||
| 	fprintf(f, "%s" "wire ", indent.c_str()); | 	fprintf(f, "%s" "wire ", indent.c_str()); | ||||||
| 	if (wire->auto_width) |  | ||||||
| 		fprintf(f, "auto "); |  | ||||||
| 	if (wire->width != 1) | 	if (wire->width != 1) | ||||||
| 		fprintf(f, "width %d ", wire->width); | 		fprintf(f, "width %d ", wire->width); | ||||||
| 	if (wire->start_offset != 0) | 	if (wire->start_offset != 0) | ||||||
|  |  | ||||||
|  | @ -876,44 +876,6 @@ RTLIL::IdString AstModule::derive(RTLIL::Design *design, std::map<RTLIL::IdStrin | ||||||
| 	return modname; | 	return modname; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // recompile a module from AST with updated widths for auto-wires
 |  | ||||||
| // (auto-wires are wires that are used but not declared an thus have an automatically determined width)
 |  | ||||||
| void AstModule::update_auto_wires(std::map<RTLIL::IdString, int> auto_sizes) |  | ||||||
| { |  | ||||||
| 	log_header("Executing AST frontend in update_auto_wires mode using pre-parsed AST for module `%s'.\n", name.c_str()); |  | ||||||
| 
 |  | ||||||
| 	current_ast = NULL; |  | ||||||
| 	flag_dump_ast1 = false; |  | ||||||
| 	flag_dump_ast2 = false; |  | ||||||
| 	flag_dump_vlog = false; |  | ||||||
| 	flag_nolatches = nolatches; |  | ||||||
| 	flag_nomem2reg = nomem2reg; |  | ||||||
| 	flag_mem2reg = mem2reg; |  | ||||||
| 	flag_lib = lib; |  | ||||||
| 	flag_noopt = noopt; |  | ||||||
| 	use_internal_line_num(); |  | ||||||
| 
 |  | ||||||
| 	for (auto it = auto_sizes.begin(); it != auto_sizes.end(); it++) { |  | ||||||
| 		log("Adding extra wire declaration to AST: wire [%d:0] %s\n", it->second - 1, it->first.c_str()); |  | ||||||
| 		AstNode *wire = new AstNode(AST_WIRE, new AstNode(AST_RANGE, AstNode::mkconst_int(it->second - 1, true), AstNode::mkconst_int(0, true))); |  | ||||||
| 		wire->str = it->first; |  | ||||||
| 		ast->children.insert(ast->children.begin(), wire); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	AstModule *newmod =  process_module(ast); |  | ||||||
| 
 |  | ||||||
| 	delete ast; |  | ||||||
| 	ast = newmod->ast; |  | ||||||
| 	newmod->ast = NULL; |  | ||||||
| 
 |  | ||||||
| 	wires.swap(newmod->wires); |  | ||||||
| 	cells.swap(newmod->cells); |  | ||||||
| 	processes.swap(newmod->processes); |  | ||||||
| 	connections.swap(newmod->connections); |  | ||||||
| 	attributes.swap(newmod->attributes); |  | ||||||
| 	delete newmod; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| RTLIL::Module *AstModule::clone() const | RTLIL::Module *AstModule::clone() const | ||||||
| { | { | ||||||
| 	AstModule *new_mod = new AstModule; | 	AstModule *new_mod = new AstModule; | ||||||
|  |  | ||||||
|  | @ -228,7 +228,6 @@ namespace AST | ||||||
| 		bool nolatches, nomem2reg, mem2reg, lib, noopt; | 		bool nolatches, nomem2reg, mem2reg, lib, noopt; | ||||||
| 		virtual ~AstModule(); | 		virtual ~AstModule(); | ||||||
| 		virtual RTLIL::IdString derive(RTLIL::Design *design, std::map<RTLIL::IdString, RTLIL::Const> parameters, std::set<RTLIL::IdString> signed_parameters); | 		virtual RTLIL::IdString derive(RTLIL::Design *design, std::map<RTLIL::IdString, RTLIL::Const> parameters, std::set<RTLIL::IdString> signed_parameters); | ||||||
| 		virtual void update_auto_wires(std::map<RTLIL::IdString, int> auto_sizes); |  | ||||||
| 		virtual RTLIL::Module *clone() const; | 		virtual RTLIL::Module *clone() const; | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
|  | @ -239,9 +238,8 @@ namespace AST | ||||||
| 	extern void (*set_line_num)(int); | 	extern void (*set_line_num)(int); | ||||||
| 	extern int (*get_line_num)(); | 	extern int (*get_line_num)(); | ||||||
| 
 | 
 | ||||||
| 	// set set_line_num and get_line_num to internal dummy functions
 | 	// set set_line_num and get_line_num to internal dummy functions (done by simplify() and AstModule::derive
 | ||||||
| 	// (done by simplify(), AstModule::derive and AstModule::update_auto_wires to control
 | 	// to control the filename and linenum properties of new nodes not generated by a frontend parser)
 | ||||||
| 	// the filename and linenum properties of new nodes not generated by a frontend parser)
 |  | ||||||
| 	void use_internal_line_num(); | 	void use_internal_line_num(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -917,15 +917,7 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint) | ||||||
| 				RTLIL::Wire *wire = new RTLIL::Wire; | 				RTLIL::Wire *wire = new RTLIL::Wire; | ||||||
| 				wire->attributes["\\src"] = stringf("%s:%d", filename.c_str(), linenum); | 				wire->attributes["\\src"] = stringf("%s:%d", filename.c_str(), linenum); | ||||||
| 				wire->name = str; | 				wire->name = str; | ||||||
| 				if (width_hint >= 0) { | 				log("Warning: Identifier `%s' is implicitly declared at %s:%d.\n", str.c_str(), filename.c_str(), linenum); | ||||||
| 					wire->width = width_hint; |  | ||||||
| 					log("Warning: Identifier `%s' is implicitly declared with width %d at %s:%d.\n", |  | ||||||
| 							str.c_str(), width_hint, filename.c_str(), linenum); |  | ||||||
| 				} else { |  | ||||||
| 					log("Warning: Identifier `%s' is implicitly declared at %s:%d.\n", |  | ||||||
| 							str.c_str(), filename.c_str(), linenum); |  | ||||||
| 				} |  | ||||||
| 				wire->auto_width = true; |  | ||||||
| 				current_module->wires[str] = wire; | 				current_module->wires[str] = wire; | ||||||
| 			} | 			} | ||||||
| 			else if (id2ast->type == AST_PARAMETER || id2ast->type == AST_LOCALPARAM) { | 			else if (id2ast->type == AST_PARAMETER || id2ast->type == AST_LOCALPARAM) { | ||||||
|  |  | ||||||
|  | @ -41,7 +41,6 @@ | ||||||
| "parameter"	{ return TOK_PARAMETER; } | "parameter"	{ return TOK_PARAMETER; } | ||||||
| "wire"		{ return TOK_WIRE; } | "wire"		{ return TOK_WIRE; } | ||||||
| "memory"	{ return TOK_MEMORY; } | "memory"	{ return TOK_MEMORY; } | ||||||
| "auto"		{ return TOK_AUTO; } |  | ||||||
| "width"		{ return TOK_WIDTH; } | "width"		{ return TOK_WIDTH; } | ||||||
| "offset"	{ return TOK_OFFSET; } | "offset"	{ return TOK_OFFSET; } | ||||||
| "size"		{ return TOK_SIZE; } | "size"		{ return TOK_SIZE; } | ||||||
|  |  | ||||||
|  | @ -54,7 +54,7 @@ using namespace ILANG_FRONTEND; | ||||||
| %token TOK_CELL TOK_CONNECT TOK_SWITCH TOK_CASE TOK_ASSIGN TOK_SYNC | %token TOK_CELL TOK_CONNECT TOK_SWITCH TOK_CASE TOK_ASSIGN TOK_SYNC | ||||||
| %token TOK_LOW TOK_HIGH TOK_POSEDGE TOK_NEGEDGE TOK_EDGE TOK_ALWAYS TOK_INIT | %token TOK_LOW TOK_HIGH TOK_POSEDGE TOK_NEGEDGE TOK_EDGE TOK_ALWAYS TOK_INIT | ||||||
| %token TOK_UPDATE TOK_PROCESS TOK_END TOK_INVALID TOK_EOL TOK_OFFSET | %token TOK_UPDATE TOK_PROCESS TOK_END TOK_INVALID TOK_EOL TOK_OFFSET | ||||||
| %token TOK_PARAMETER TOK_ATTRIBUTE TOK_AUTO TOK_MEMORY TOK_SIZE | %token TOK_PARAMETER TOK_ATTRIBUTE TOK_MEMORY TOK_SIZE | ||||||
| 
 | 
 | ||||||
| %type <sigspec> sigspec sigspec_list | %type <sigspec> sigspec sigspec_list | ||||||
| %type <integer> sync_type | %type <integer> sync_type | ||||||
|  | @ -124,9 +124,6 @@ wire_stmt: | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| wire_options: | wire_options: | ||||||
| 	wire_options TOK_AUTO { |  | ||||||
| 		current_wire->auto_width = true; |  | ||||||
| 	} | |  | ||||||
| 	wire_options TOK_WIDTH TOK_INT { | 	wire_options TOK_WIDTH TOK_INT { | ||||||
| 		current_wire->width = $3; | 		current_wire->width = $3; | ||||||
| 	} | | 	} | | ||||||
|  |  | ||||||
|  | @ -265,11 +265,6 @@ RTLIL::IdString RTLIL::Module::derive(RTLIL::Design*, std::map<RTLIL::IdString, | ||||||
| 	log_error("Module `%s' is used with parameters but is not parametric!\n", id2cstr(name)); | 	log_error("Module `%s' is used with parameters but is not parametric!\n", id2cstr(name)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RTLIL::Module::update_auto_wires(std::map<RTLIL::IdString, int>) |  | ||||||
| { |  | ||||||
| 	log_error("Module `%s' has automatic wires bu no HDL backend to handle it!\n", id2cstr(name)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| size_t RTLIL::Module::count_id(RTLIL::IdString id) | size_t RTLIL::Module::count_id(RTLIL::IdString id) | ||||||
| { | { | ||||||
| 	return wires.count(id) + memories.count(id) + cells.count(id) + processes.count(id); | 	return wires.count(id) + memories.count(id) + cells.count(id) + processes.count(id); | ||||||
|  | @ -779,7 +774,6 @@ RTLIL::Wire::Wire() | ||||||
| 	port_id = 0; | 	port_id = 0; | ||||||
| 	port_input = false; | 	port_input = false; | ||||||
| 	port_output = false; | 	port_output = false; | ||||||
| 	auto_width = false; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| RTLIL::Memory::Memory() | RTLIL::Memory::Memory() | ||||||
|  |  | ||||||
|  | @ -265,7 +265,6 @@ struct RTLIL::Module { | ||||||
| 	RTLIL_ATTRIBUTE_MEMBERS | 	RTLIL_ATTRIBUTE_MEMBERS | ||||||
| 	virtual ~Module(); | 	virtual ~Module(); | ||||||
| 	virtual RTLIL::IdString derive(RTLIL::Design *design, std::map<RTLIL::IdString, RTLIL::Const> parameters, std::set<RTLIL::IdString> signed_parameters); | 	virtual RTLIL::IdString derive(RTLIL::Design *design, std::map<RTLIL::IdString, RTLIL::Const> parameters, std::set<RTLIL::IdString> signed_parameters); | ||||||
| 	virtual void update_auto_wires(std::map<RTLIL::IdString, int> auto_sizes); |  | ||||||
| 	virtual size_t count_id(RTLIL::IdString id); | 	virtual size_t count_id(RTLIL::IdString id); | ||||||
| 	virtual void check(); | 	virtual void check(); | ||||||
| 	virtual void optimize(); | 	virtual void optimize(); | ||||||
|  | @ -283,7 +282,7 @@ struct RTLIL::Module { | ||||||
| struct RTLIL::Wire { | struct RTLIL::Wire { | ||||||
| 	RTLIL::IdString name; | 	RTLIL::IdString name; | ||||||
| 	int width, start_offset, port_id; | 	int width, start_offset, port_id; | ||||||
| 	bool port_input, port_output, auto_width; | 	bool port_input, port_output; | ||||||
| 	RTLIL_ATTRIBUTE_MEMBERS | 	RTLIL_ATTRIBUTE_MEMBERS | ||||||
| 	Wire(); | 	Wire(); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -155,66 +155,6 @@ static bool expand_module(RTLIL::Design *design, RTLIL::Module *module, bool fla | ||||||
| 		did_something = true; | 		did_something = true; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (did_something) |  | ||||||
| 		return did_something; |  | ||||||
| 
 |  | ||||||
| 	std::map<RTLIL::SigSpec, int> auto_wires; |  | ||||||
| 
 |  | ||||||
| 	for (auto &wire_it : module->wires) { |  | ||||||
| 		if (wire_it.second->auto_width) |  | ||||||
| 			auto_wires[RTLIL::SigSpec(wire_it.second)] = -1; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	for (auto &cell_it : module->cells) |  | ||||||
| 	for (auto &conn : cell_it.second->connections) |  | ||||||
| 	for (auto &awit : auto_wires) { |  | ||||||
| 		if (awit.second >= 0 || conn.second != awit.first) |  | ||||||
| 			continue; |  | ||||||
| 		if (design->modules.count(cell_it.second->type) == 0) { |  | ||||||
| 			log("WARNING: Module `%s' used in auto-delaration of the wire `%s.%s' cannot be found.\n", |  | ||||||
| 					cell_it.second->type.c_str(), module->name.c_str(), log_signal(awit.first)); |  | ||||||
| 			continue; |  | ||||||
| 		} |  | ||||||
| 		RTLIL::Module *mod = design->modules[cell_it.second->type]; |  | ||||||
| 		RTLIL::Wire *wire = NULL; |  | ||||||
| 		if (mod->wires.count(conn.first) == 0) { |  | ||||||
| 			for (auto &wire_it : mod->wires) { |  | ||||||
| 				if (wire_it.second->port_id == 0) |  | ||||||
| 					continue; |  | ||||||
| 				char buffer[100]; |  | ||||||
| 				snprintf(buffer, 100, "$%d", wire_it.second->port_id); |  | ||||||
| 				if (buffer == conn.first) { |  | ||||||
| 					wire = wire_it.second; |  | ||||||
| 					break; |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} else |  | ||||||
| 			wire = mod->wires[conn.first]; |  | ||||||
| 		if (!wire || wire->port_id == 0) |  | ||||||
| 			log_error("No port `%s' found in `%s' but used by instanciation in `%s'!\n", |  | ||||||
| 					conn.first.c_str(), mod->name.c_str(), module->name.c_str()); |  | ||||||
| 		if (wire->auto_width) |  | ||||||
| 			log_error("Signal `%s' found in `%s' and used by instanciation in `%s' for an auto wire is an auto-wire itself!\n", |  | ||||||
| 					log_signal(awit.first), mod->name.c_str(), module->name.c_str()); |  | ||||||
| 		awit.second = wire->width; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	std::map<RTLIL::IdString, int> auto_sizes; |  | ||||||
| 	for (auto &awit : auto_wires) { |  | ||||||
| 		if (awit.second < 0) |  | ||||||
| 			log("Can't further resolve auto-wire `%s.%s' (width %d) using cell ports.\n", |  | ||||||
| 					module->name.c_str(), awit.first.chunks[0].wire->name.c_str(), |  | ||||||
| 					awit.first.chunks[0].wire->width); |  | ||||||
| 		else |  | ||||||
| 			auto_sizes[awit.first.chunks[0].wire->name] = awit.second; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (auto_sizes.size() > 0) { |  | ||||||
| 		module->update_auto_wires(auto_sizes); |  | ||||||
| 		log_header("Continuing HIERARCHY pass.\n"); |  | ||||||
| 		did_something = true; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return did_something; | 	return did_something; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue