mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	write_rtlil: dump in insertion order
This commit is contained in:
		
							parent
							
								
									fcc9a1ee43
								
							
						
					
					
						commit
						0e11271868
					
				
					 2 changed files with 62 additions and 83 deletions
				
			
		|  | @ -24,12 +24,23 @@ | ||||||
| 
 | 
 | ||||||
| #include "rtlil_backend.h" | #include "rtlil_backend.h" | ||||||
| #include "kernel/yosys.h" | #include "kernel/yosys.h" | ||||||
|  | #include "kernel/utils.h" | ||||||
| #include <errno.h> | #include <errno.h> | ||||||
|  | #include <iterator> | ||||||
| 
 | 
 | ||||||
| USING_YOSYS_NAMESPACE | USING_YOSYS_NAMESPACE | ||||||
| using namespace RTLIL_BACKEND; | using namespace RTLIL_BACKEND; | ||||||
| YOSYS_NAMESPACE_BEGIN | YOSYS_NAMESPACE_BEGIN | ||||||
| 
 | 
 | ||||||
|  | void RTLIL_BACKEND::dump_attributes(std::ostream &f, std::string indent, const RTLIL::AttrObject *obj) | ||||||
|  | { | ||||||
|  | 	for (const auto& [name, value] : reversed(obj->attributes)) { | ||||||
|  | 		f << stringf("%s" "attribute %s ", indent.c_str(), name.c_str()); | ||||||
|  | 		dump_const(f, value); | ||||||
|  | 		f << stringf("\n"); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void RTLIL_BACKEND::dump_const(std::ostream &f, const RTLIL::Const &data, int width, int offset, bool autoint) | void RTLIL_BACKEND::dump_const(std::ostream &f, const RTLIL::Const &data, int width, int offset, bool autoint) | ||||||
| { | { | ||||||
| 	if (width < 0) | 	if (width < 0) | ||||||
|  | @ -110,8 +121,8 @@ void RTLIL_BACKEND::dump_sigspec(std::ostream &f, const RTLIL::SigSpec &sig, boo | ||||||
| 		dump_sigchunk(f, sig.as_chunk(), autoint); | 		dump_sigchunk(f, sig.as_chunk(), autoint); | ||||||
| 	} else { | 	} else { | ||||||
| 		f << stringf("{ "); | 		f << stringf("{ "); | ||||||
| 		for (auto it = sig.chunks().rbegin(); it != sig.chunks().rend(); ++it) { | 		for (const auto& chunk : reversed(sig.chunks())) { | ||||||
| 			dump_sigchunk(f, *it, false); | 			dump_sigchunk(f, chunk, false); | ||||||
| 			f << stringf(" "); | 			f << stringf(" "); | ||||||
| 		} | 		} | ||||||
| 		f << stringf("}"); | 		f << stringf("}"); | ||||||
|  | @ -120,11 +131,7 @@ void RTLIL_BACKEND::dump_sigspec(std::ostream &f, const RTLIL::SigSpec &sig, boo | ||||||
| 
 | 
 | ||||||
| void RTLIL_BACKEND::dump_wire(std::ostream &f, std::string indent, const RTLIL::Wire *wire) | void RTLIL_BACKEND::dump_wire(std::ostream &f, std::string indent, const RTLIL::Wire *wire) | ||||||
| { | { | ||||||
| 	for (auto &it : wire->attributes) { | 	dump_attributes(f, indent, wire); | ||||||
| 		f << stringf("%s" "attribute %s ", indent.c_str(), it.first.c_str()); |  | ||||||
| 		dump_const(f, it.second); |  | ||||||
| 		f << stringf("\n"); |  | ||||||
| 	} |  | ||||||
| 	if (wire->driverCell_) { | 	if (wire->driverCell_) { | ||||||
| 		f << stringf("%s" "# driver %s %s\n", indent.c_str(), | 		f << stringf("%s" "# driver %s %s\n", indent.c_str(), | ||||||
| 				wire->driverCell()->name.c_str(), wire->driverPort().c_str()); | 				wire->driverCell()->name.c_str(), wire->driverPort().c_str()); | ||||||
|  | @ -149,11 +156,7 @@ void RTLIL_BACKEND::dump_wire(std::ostream &f, std::string indent, const RTLIL:: | ||||||
| 
 | 
 | ||||||
| void RTLIL_BACKEND::dump_memory(std::ostream &f, std::string indent, const RTLIL::Memory *memory) | void RTLIL_BACKEND::dump_memory(std::ostream &f, std::string indent, const RTLIL::Memory *memory) | ||||||
| { | { | ||||||
| 	for (auto &it : memory->attributes) { | 	dump_attributes(f, indent, memory); | ||||||
| 		f << stringf("%s" "attribute %s ", indent.c_str(), it.first.c_str()); |  | ||||||
| 		dump_const(f, it.second); |  | ||||||
| 		f << stringf("\n"); |  | ||||||
| 	} |  | ||||||
| 	f << stringf("%s" "memory ", indent.c_str()); | 	f << stringf("%s" "memory ", indent.c_str()); | ||||||
| 	if (memory->width != 1) | 	if (memory->width != 1) | ||||||
| 		f << stringf("width %d ", memory->width); | 		f << stringf("width %d ", memory->width); | ||||||
|  | @ -166,23 +169,19 @@ void RTLIL_BACKEND::dump_memory(std::ostream &f, std::string indent, const RTLIL | ||||||
| 
 | 
 | ||||||
| void RTLIL_BACKEND::dump_cell(std::ostream &f, std::string indent, const RTLIL::Cell *cell) | void RTLIL_BACKEND::dump_cell(std::ostream &f, std::string indent, const RTLIL::Cell *cell) | ||||||
| { | { | ||||||
| 	for (auto &it : cell->attributes) { | 	dump_attributes(f, indent, cell); | ||||||
| 		f << stringf("%s" "attribute %s ", indent.c_str(), it.first.c_str()); |  | ||||||
| 		dump_const(f, it.second); |  | ||||||
| 		f << stringf("\n"); |  | ||||||
| 	} |  | ||||||
| 	f << stringf("%s" "cell %s %s\n", indent.c_str(), cell->type.c_str(), cell->name.c_str()); | 	f << stringf("%s" "cell %s %s\n", indent.c_str(), cell->type.c_str(), cell->name.c_str()); | ||||||
| 	for (auto &it : cell->parameters) { | 	for (const auto& [name, param] : reversed(cell->parameters)) { | ||||||
| 		f << stringf("%s  parameter%s%s %s ", indent.c_str(), | 		f << stringf("%s  parameter%s%s %s ", indent.c_str(), | ||||||
| 				(it.second.flags & RTLIL::CONST_FLAG_SIGNED) != 0 ? " signed" : "", | 				(param.flags & RTLIL::CONST_FLAG_SIGNED) != 0 ? " signed" : "", | ||||||
| 				(it.second.flags & RTLIL::CONST_FLAG_REAL) != 0 ? " real" : "", | 				(param.flags & RTLIL::CONST_FLAG_REAL) != 0 ? " real" : "", | ||||||
| 				it.first.c_str()); | 				name.c_str()); | ||||||
| 		dump_const(f, it.second); | 		dump_const(f, param); | ||||||
| 		f << stringf("\n"); | 		f << stringf("\n"); | ||||||
| 	} | 	} | ||||||
| 	for (auto &it : cell->connections()) { | 	for (const auto& [port, sig] : reversed(cell->connections_)) { | ||||||
| 		f << stringf("%s  connect %s ", indent.c_str(), it.first.c_str()); | 		f << stringf("%s  connect %s ", indent.c_str(), port.c_str()); | ||||||
| 		dump_sigspec(f, it.second); | 		dump_sigspec(f, sig); | ||||||
| 		f << stringf("\n"); | 		f << stringf("\n"); | ||||||
| 	} | 	} | ||||||
| 	f << stringf("%s" "end\n", indent.c_str()); | 	f << stringf("%s" "end\n", indent.c_str()); | ||||||
|  | @ -190,47 +189,38 @@ void RTLIL_BACKEND::dump_cell(std::ostream &f, std::string indent, const RTLIL:: | ||||||
| 
 | 
 | ||||||
| void RTLIL_BACKEND::dump_proc_case_body(std::ostream &f, std::string indent, const RTLIL::CaseRule *cs) | void RTLIL_BACKEND::dump_proc_case_body(std::ostream &f, std::string indent, const RTLIL::CaseRule *cs) | ||||||
| { | { | ||||||
| 	for (auto it = cs->actions.begin(); it != cs->actions.end(); ++it) | 	for (const auto& [lhs, rhs] : cs->actions) { | ||||||
| 	{ |  | ||||||
| 		f << stringf("%s" "assign ", indent.c_str()); | 		f << stringf("%s" "assign ", indent.c_str()); | ||||||
| 		dump_sigspec(f, it->first); | 		dump_sigspec(f, lhs); | ||||||
| 		f << stringf(" "); | 		f << stringf(" "); | ||||||
| 		dump_sigspec(f, it->second); | 		dump_sigspec(f, rhs); | ||||||
| 		f << stringf("\n"); | 		f << stringf("\n"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	for (auto it = cs->switches.begin(); it != cs->switches.end(); ++it) | 	for (const auto& sw : cs->switches) | ||||||
| 		dump_proc_switch(f, indent, *it); | 		dump_proc_switch(f, indent, sw); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RTLIL_BACKEND::dump_proc_switch(std::ostream &f, std::string indent, const RTLIL::SwitchRule *sw) | void RTLIL_BACKEND::dump_proc_switch(std::ostream &f, std::string indent, const RTLIL::SwitchRule *sw) | ||||||
| { | { | ||||||
| 	for (auto it = sw->attributes.begin(); it != sw->attributes.end(); ++it) { | 	dump_attributes(f, indent, sw); | ||||||
| 		f << stringf("%s" "attribute %s ", indent.c_str(), it->first.c_str()); |  | ||||||
| 		dump_const(f, it->second); |  | ||||||
| 		f << stringf("\n"); |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	f << stringf("%s" "switch ", indent.c_str()); | 	f << stringf("%s" "switch ", indent.c_str()); | ||||||
| 	dump_sigspec(f, sw->signal); | 	dump_sigspec(f, sw->signal); | ||||||
| 	f << stringf("\n"); | 	f << stringf("\n"); | ||||||
| 
 | 
 | ||||||
| 	for (auto it = sw->cases.begin(); it != sw->cases.end(); ++it) | 	for (const auto case_ : sw->cases) | ||||||
| 	{ | 	{ | ||||||
| 		for (auto ait = (*it)->attributes.begin(); ait != (*it)->attributes.end(); ++ait) { | 		dump_attributes(f, indent, case_); | ||||||
| 			f << stringf("%s  attribute %s ", indent.c_str(), ait->first.c_str()); |  | ||||||
| 			dump_const(f, ait->second); |  | ||||||
| 			f << stringf("\n"); |  | ||||||
| 		} |  | ||||||
| 		f << stringf("%s  case ", indent.c_str()); | 		f << stringf("%s  case ", indent.c_str()); | ||||||
| 		for (size_t i = 0; i < (*it)->compare.size(); i++) { | 		for (size_t i = 0; i < case_->compare.size(); i++) { | ||||||
| 			if (i > 0) | 			if (i > 0) | ||||||
| 				f << stringf(" , "); | 				f << stringf(" , "); | ||||||
| 			dump_sigspec(f, (*it)->compare[i]); | 			dump_sigspec(f, case_->compare[i]); | ||||||
| 		} | 		} | ||||||
| 		f << stringf("\n"); | 		f << stringf("\n"); | ||||||
| 
 | 
 | ||||||
| 		dump_proc_case_body(f, indent + "    ", *it); | 		dump_proc_case_body(f, indent + "    ", case_); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	f << stringf("%s" "end\n", indent.c_str()); | 	f << stringf("%s" "end\n", indent.c_str()); | ||||||
|  | @ -253,20 +243,16 @@ void RTLIL_BACKEND::dump_proc_sync(std::ostream &f, std::string indent, const RT | ||||||
| 	case RTLIL::STi: f << stringf("init\n"); break; | 	case RTLIL::STi: f << stringf("init\n"); break; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	for (auto &it: sy->actions) { | 	for (const auto& [lhs, rhs] : sy->actions) { | ||||||
| 		f << stringf("%s  update ", indent.c_str()); | 		f << stringf("%s  update ", indent.c_str()); | ||||||
| 		dump_sigspec(f, it.first); | 		dump_sigspec(f, lhs); | ||||||
| 		f << stringf(" "); | 		f << stringf(" "); | ||||||
| 		dump_sigspec(f, it.second); | 		dump_sigspec(f, rhs); | ||||||
| 		f << stringf("\n"); | 		f << stringf("\n"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	for (auto &it: sy->mem_write_actions) { | 	for (auto &it: sy->mem_write_actions) { | ||||||
| 		for (auto it2 = it.attributes.begin(); it2 != it.attributes.end(); ++it2) { | 		dump_attributes(f, indent, &it); | ||||||
| 			f << stringf("%s  attribute %s ", indent.c_str(), it2->first.c_str()); |  | ||||||
| 			dump_const(f, it2->second); |  | ||||||
| 			f << stringf("\n"); |  | ||||||
| 		} |  | ||||||
| 		f << stringf("%s  memwr %s ", indent.c_str(), it.memid.c_str()); | 		f << stringf("%s  memwr %s ", indent.c_str(), it.memid.c_str()); | ||||||
| 		dump_sigspec(f, it.address); | 		dump_sigspec(f, it.address); | ||||||
| 		f << stringf(" "); | 		f << stringf(" "); | ||||||
|  | @ -281,15 +267,11 @@ void RTLIL_BACKEND::dump_proc_sync(std::ostream &f, std::string indent, const RT | ||||||
| 
 | 
 | ||||||
| void RTLIL_BACKEND::dump_proc(std::ostream &f, std::string indent, const RTLIL::Process *proc) | void RTLIL_BACKEND::dump_proc(std::ostream &f, std::string indent, const RTLIL::Process *proc) | ||||||
| { | { | ||||||
| 	for (auto it = proc->attributes.begin(); it != proc->attributes.end(); ++it) { | 	dump_attributes(f, indent, proc); | ||||||
| 		f << stringf("%s" "attribute %s ", indent.c_str(), it->first.c_str()); |  | ||||||
| 		dump_const(f, it->second); |  | ||||||
| 		f << stringf("\n"); |  | ||||||
| 	} |  | ||||||
| 	f << stringf("%s" "process %s\n", indent.c_str(), proc->name.c_str()); | 	f << stringf("%s" "process %s\n", indent.c_str(), proc->name.c_str()); | ||||||
| 	dump_proc_case_body(f, indent + "  ", &proc->root_case); | 	dump_proc_case_body(f, indent + "  ", &proc->root_case); | ||||||
| 	for (auto it = proc->syncs.begin(); it != proc->syncs.end(); ++it) | 	for (auto* sync : proc->syncs) | ||||||
| 		dump_proc_sync(f, indent + "  ", *it); | 		dump_proc_sync(f, indent + "  ", sync); | ||||||
| 	f << stringf("%s" "end\n", indent.c_str()); | 	f << stringf("%s" "end\n", indent.c_str()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -309,11 +291,7 @@ void RTLIL_BACKEND::dump_module(std::ostream &f, std::string indent, RTLIL::Modu | ||||||
| 
 | 
 | ||||||
| 	if (print_header) | 	if (print_header) | ||||||
| 	{ | 	{ | ||||||
| 		for (auto it = module->attributes.begin(); it != module->attributes.end(); ++it) { | 		dump_attributes(f, indent, module); | ||||||
| 			f << stringf("%s" "attribute %s ", indent.c_str(), it->first.c_str()); |  | ||||||
| 			dump_const(f, it->second); |  | ||||||
| 			f << stringf("\n"); |  | ||||||
| 		} |  | ||||||
| 
 | 
 | ||||||
| 		f << stringf("%s" "module %s\n", indent.c_str(), module->name.c_str()); | 		f << stringf("%s" "module %s\n", indent.c_str(), module->name.c_str()); | ||||||
| 
 | 
 | ||||||
|  | @ -335,40 +313,40 @@ void RTLIL_BACKEND::dump_module(std::ostream &f, std::string indent, RTLIL::Modu | ||||||
| 
 | 
 | ||||||
| 	if (print_body) | 	if (print_body) | ||||||
| 	{ | 	{ | ||||||
| 		for (auto it : module->wires()) | 		for (const auto& [_, wire] : reversed(module->wires_)) | ||||||
| 			if (!only_selected || design->selected(module, it)) { | 			if (!only_selected || design->selected(module, wire)) { | ||||||
| 				if (only_selected) | 				if (only_selected) | ||||||
| 					f << stringf("\n"); | 					f << stringf("\n"); | ||||||
| 				dump_wire(f, indent + "  ", it); | 				dump_wire(f, indent + "  ", wire); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 		for (auto it : module->memories) | 		for (const auto& [_, mem] : reversed(module->memories)) | ||||||
| 			if (!only_selected || design->selected(module, it.second)) { | 			if (!only_selected || design->selected(module, mem)) { | ||||||
| 				if (only_selected) | 				if (only_selected) | ||||||
| 					f << stringf("\n"); | 					f << stringf("\n"); | ||||||
| 				dump_memory(f, indent + "  ", it.second); | 				dump_memory(f, indent + "  ", mem); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 		for (auto it : module->cells()) | 		for (const auto& [_, cell] : reversed(module->cells_)) | ||||||
| 			if (!only_selected || design->selected(module, it)) { | 			if (!only_selected || design->selected(module, cell)) { | ||||||
| 				if (only_selected) | 				if (only_selected) | ||||||
| 					f << stringf("\n"); | 					f << stringf("\n"); | ||||||
| 				dump_cell(f, indent + "  ", it); | 				dump_cell(f, indent + "  ", cell); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 		for (auto it : module->processes) | 		for (const auto& [_, process] : reversed(module->processes)) | ||||||
| 			if (!only_selected || design->selected(module, it.second)) { | 			if (!only_selected || design->selected(module, process)) { | ||||||
| 				if (only_selected) | 				if (only_selected) | ||||||
| 					f << stringf("\n"); | 					f << stringf("\n"); | ||||||
| 				dump_proc(f, indent + "  ", it.second); | 				dump_proc(f, indent + "  ", process); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 		bool first_conn_line = true; | 		bool first_conn_line = true; | ||||||
| 		for (auto it = module->connections().begin(); it != module->connections().end(); ++it) { | 		for (const auto& [lhs, rhs] : module->connections()) { | ||||||
| 			bool show_conn = !only_selected || design->selected_whole_module(module->name); | 			bool show_conn = !only_selected || design->selected_whole_module(module->name); | ||||||
| 			if (!show_conn) { | 			if (!show_conn) { | ||||||
| 				RTLIL::SigSpec sigs = it->first; | 				RTLIL::SigSpec sigs = lhs; | ||||||
| 				sigs.append(it->second); | 				sigs.append(rhs); | ||||||
| 				for (auto &c : sigs.chunks()) { | 				for (auto &c : sigs.chunks()) { | ||||||
| 					if (c.wire == NULL || !design->selected(module, c.wire)) | 					if (c.wire == NULL || !design->selected(module, c.wire)) | ||||||
| 						continue; | 						continue; | ||||||
|  | @ -378,7 +356,7 @@ void RTLIL_BACKEND::dump_module(std::ostream &f, std::string indent, RTLIL::Modu | ||||||
| 			if (show_conn) { | 			if (show_conn) { | ||||||
| 				if (only_selected && first_conn_line) | 				if (only_selected && first_conn_line) | ||||||
| 					f << stringf("\n"); | 					f << stringf("\n"); | ||||||
| 				dump_conn(f, indent + "  ", it->first, it->second); | 				dump_conn(f, indent + "  ", lhs, rhs); | ||||||
| 				first_conn_line = false; | 				first_conn_line = false; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | @ -394,7 +372,7 @@ void RTLIL_BACKEND::dump_design(std::ostream &f, RTLIL::Design *design, bool onl | ||||||
| 
 | 
 | ||||||
| 	if (!flag_m) { | 	if (!flag_m) { | ||||||
| 		int count_selected_mods = 0; | 		int count_selected_mods = 0; | ||||||
| 		for (auto module : design->modules()) { | 		for (auto* module : design->modules()) { | ||||||
| 			if (design->selected_whole_module(module->name)) | 			if (design->selected_whole_module(module->name)) | ||||||
| 				flag_m = true; | 				flag_m = true; | ||||||
| 			if (design->selected(module)) | 			if (design->selected(module)) | ||||||
|  | @ -410,7 +388,7 @@ void RTLIL_BACKEND::dump_design(std::ostream &f, RTLIL::Design *design, bool onl | ||||||
| 		f << stringf("autoidx %d\n", autoidx); | 		f << stringf("autoidx %d\n", autoidx); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	for (auto module : design->modules()) { | 	for (const auto& [_, module] : reversed(design->modules_)) { | ||||||
| 		if (!only_selected || design->selected(module)) { | 		if (!only_selected || design->selected(module)) { | ||||||
| 			if (only_selected) | 			if (only_selected) | ||||||
| 				f << stringf("\n"); | 				f << stringf("\n"); | ||||||
|  |  | ||||||
|  | @ -31,6 +31,7 @@ | ||||||
| YOSYS_NAMESPACE_BEGIN | YOSYS_NAMESPACE_BEGIN | ||||||
| 
 | 
 | ||||||
| namespace RTLIL_BACKEND { | namespace RTLIL_BACKEND { | ||||||
|  | 	void dump_attributes(std::ostream &f, std::string indent, const RTLIL::AttrObject *obj); | ||||||
| 	void dump_const(std::ostream &f, const RTLIL::Const &data, int width = -1, int offset = 0, bool autoint = true); | 	void dump_const(std::ostream &f, const RTLIL::Const &data, int width = -1, int offset = 0, bool autoint = true); | ||||||
| 	void dump_sigchunk(std::ostream &f, const RTLIL::SigChunk &chunk, bool autoint = true); | 	void dump_sigchunk(std::ostream &f, const RTLIL::SigChunk &chunk, bool autoint = true); | ||||||
| 	void dump_sigspec(std::ostream &f, const RTLIL::SigSpec &sig, bool autoint = true); | 	void dump_sigspec(std::ostream &f, const RTLIL::SigSpec &sig, bool autoint = true); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue