mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 11:42:30 +00:00 
			
		
		
		
	opt_mem, memory_*: Refuse to operate in presence of processes
Processes can contain `MemWriteAction` entries which are invisible to most passes operating on memories but which will be lowered to write ports later on by `proc_memwr`. For that reason we can get corrupted RTLIL if we sequence the memory passes before `proc`. Address that by making the affected memory passes ignore modules with processes.
This commit is contained in:
		
							parent
							
								
									975517b022
								
							
						
					
					
						commit
						030d639201
					
				
					 6 changed files with 20 additions and 1 deletions
				
			
		|  | @ -39,6 +39,9 @@ struct MemoryCollectPass : public Pass { | ||||||
| 		log_header(design, "Executing MEMORY_COLLECT pass (generating $mem cells).\n"); | 		log_header(design, "Executing MEMORY_COLLECT pass (generating $mem cells).\n"); | ||||||
| 		extra_args(args, 1, design); | 		extra_args(args, 1, design); | ||||||
| 		for (auto module : design->selected_modules()) { | 		for (auto module : design->selected_modules()) { | ||||||
|  | 			if (module->has_processes_warn()) | ||||||
|  | 				continue; | ||||||
|  | 
 | ||||||
| 			for (auto &mem : Mem::get_selected_memories(module)) { | 			for (auto &mem : Mem::get_selected_memories(module)) { | ||||||
| 				if (!mem.packed) { | 				if (!mem.packed) { | ||||||
| 					mem.packed = true; | 					mem.packed = true; | ||||||
|  |  | ||||||
|  | @ -2229,6 +2229,9 @@ struct MemoryLibMapPass : public Pass { | ||||||
| 		Library lib = parse_library(lib_files, defines); | 		Library lib = parse_library(lib_files, defines); | ||||||
| 
 | 
 | ||||||
| 		for (auto module : design->selected_modules()) { | 		for (auto module : design->selected_modules()) { | ||||||
|  | 			if (module->has_processes_warn()) | ||||||
|  | 				continue; | ||||||
|  | 
 | ||||||
| 			MapWorker worker(module); | 			MapWorker worker(module); | ||||||
| 			auto mems = Mem::get_selected_memories(module); | 			auto mems = Mem::get_selected_memories(module); | ||||||
| 			for (auto &mem : mems) | 			for (auto &mem : mems) | ||||||
|  |  | ||||||
|  | @ -493,6 +493,9 @@ struct MemoryMapPass : public Pass { | ||||||
| 		extra_args(args, argidx, design); | 		extra_args(args, argidx, design); | ||||||
| 
 | 
 | ||||||
| 		for (auto mod : design->selected_modules()) { | 		for (auto mod : design->selected_modules()) { | ||||||
|  | 			if (mod->has_processes_warn()) | ||||||
|  | 				continue; | ||||||
|  | 
 | ||||||
| 			MemoryMapWorker worker(design, mod); | 			MemoryMapWorker worker(design, mod); | ||||||
| 			worker.attr_icase = attr_icase; | 			worker.attr_icase = attr_icase; | ||||||
| 			worker.attributes = attributes; | 			worker.attributes = attributes; | ||||||
|  |  | ||||||
|  | @ -46,6 +46,9 @@ struct MemoryNarrowPass : public Pass { | ||||||
| 		extra_args(args, argidx, design); | 		extra_args(args, argidx, design); | ||||||
| 
 | 
 | ||||||
| 		for (auto module : design->selected_modules()) { | 		for (auto module : design->selected_modules()) { | ||||||
|  | 			if (module->has_processes_warn()) | ||||||
|  | 				continue; | ||||||
|  | 
 | ||||||
| 			for (auto &mem : Mem::get_selected_memories(module)) | 			for (auto &mem : Mem::get_selected_memories(module)) | ||||||
| 			{ | 			{ | ||||||
| 				bool wide = false; | 				bool wide = false; | ||||||
|  |  | ||||||
|  | @ -558,9 +558,13 @@ struct MemorySharePass : public Pass { | ||||||
| 		extra_args(args, argidx, design); | 		extra_args(args, argidx, design); | ||||||
| 		MemoryShareWorker msw(design, flag_widen, flag_sat); | 		MemoryShareWorker msw(design, flag_widen, flag_sat); | ||||||
| 
 | 
 | ||||||
| 		for (auto module : design->selected_modules()) | 		for (auto module : design->selected_modules()) { | ||||||
|  | 			if (module->has_processes_warn()) | ||||||
|  | 				continue; | ||||||
|  | 
 | ||||||
| 			msw(module); | 			msw(module); | ||||||
| 		} | 		} | ||||||
|  | 	} | ||||||
| } MemorySharePass; | } MemorySharePass; | ||||||
| 
 | 
 | ||||||
| PRIVATE_NAMESPACE_END | PRIVATE_NAMESPACE_END | ||||||
|  |  | ||||||
|  | @ -52,6 +52,9 @@ struct OptMemPass : public Pass { | ||||||
| 
 | 
 | ||||||
| 		int total_count = 0; | 		int total_count = 0; | ||||||
| 		for (auto module : design->selected_modules()) { | 		for (auto module : design->selected_modules()) { | ||||||
|  | 			if (module->has_processes_warn()) | ||||||
|  | 				continue; | ||||||
|  | 
 | ||||||
| 			SigMap sigmap(module); | 			SigMap sigmap(module); | ||||||
| 			FfInitVals initvals(&sigmap, module); | 			FfInitVals initvals(&sigmap, module); | ||||||
| 			for (auto &mem : Mem::get_selected_memories(module)) { | 			for (auto &mem : Mem::get_selected_memories(module)) { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue