mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	Fix _TECHMAP_REMOVEINIT_ handling.
Previously, this wire was handled in the code that populated the "do or do not" techmap cache, resulting in init value removal being performed only for the first use of a given template. Fixes the problem identified in #1396.
This commit is contained in:
		
							parent
							
								
									4b15cf5f76
								
							
						
					
					
						commit
						fd0e3a2c43
					
				
					 2 changed files with 29 additions and 15 deletions
				
			
		|  | @ -935,19 +935,6 @@ struct TechmapWorker | |||
| 							for (auto &it2 : it.second) | ||||
| 								if (!it2.value.is_fully_const()) | ||||
| 									log_error("Techmap yielded config wire %s with non-const value %s.\n", RTLIL::id2cstr(it2.wire->name), log_signal(it2.value)); | ||||
| 						if (it.first.substr(0, 20) == "_TECHMAP_REMOVEINIT_" && techmap_do_cache[tpl]) { | ||||
| 							for (auto &it2 : it.second) { | ||||
| 								auto val = it2.value.as_const(); | ||||
| 								auto wirename = RTLIL::escape_id(it.first.substr(20, it.first.size() - 20 - 1)); | ||||
| 								auto it = cell->connections().find(wirename); | ||||
| 								if (it != cell->connections().end()) { | ||||
| 									auto sig = sigmap(it->second); | ||||
| 									for (int i = 0; i < sig.size(); i++) | ||||
| 										if (val[i] == State::S1) | ||||
| 											remove_init_bits.insert(sig[i]); | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 						techmap_wire_names.erase(it.first); | ||||
| 					} | ||||
| 
 | ||||
|  | @ -973,6 +960,23 @@ struct TechmapWorker | |||
| 					mkdebug.off(); | ||||
| 				} | ||||
| 
 | ||||
| 				TechmapWires twd = techmap_find_special_wires(tpl); | ||||
| 				for (auto &it : twd) { | ||||
| 					if (it.first.substr(0, 20) == "_TECHMAP_REMOVEINIT_") { | ||||
| 						for (auto &it2 : it.second) { | ||||
| 							auto val = it2.value.as_const(); | ||||
| 							auto wirename = RTLIL::escape_id(it.first.substr(20, it.first.size() - 20 - 1)); | ||||
| 							auto it = cell->connections().find(wirename); | ||||
| 							if (it != cell->connections().end()) { | ||||
| 								auto sig = sigmap(it->second); | ||||
| 								for (int i = 0; i < sig.size(); i++) | ||||
| 									if (val[i] == State::S1) | ||||
| 										remove_init_bits.insert(sig[i]); | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 
 | ||||
| 				if (extern_mode && !in_recursion) | ||||
| 				{ | ||||
| 					std::string m_name = stringf("$extern:%s", log_id(tpl)); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue