mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 11:42:30 +00:00 
			
		
		
		
	kernel/mem: Use delayed removal for inits as well.
This commit is contained in:
		
							parent
							
								
									6d7d9ab077
								
							
						
					
					
						commit
						0565c642a0
					
				
					 2 changed files with 20 additions and 4 deletions
				
			
		|  | @ -76,6 +76,17 @@ void Mem::emit() { | |||
| 			wr_left.push_back(i); | ||||
| 		} | ||||
| 	} | ||||
| 	std::vector<int> init_left; | ||||
| 	for (int i = 0; i < GetSize(inits); i++) { | ||||
| 		auto &init = inits[i]; | ||||
| 		if (init.removed) { | ||||
| 			if (init.cell) { | ||||
| 				module->remove(init.cell); | ||||
| 			} | ||||
| 		} else { | ||||
| 			init_left.push_back(i); | ||||
| 		} | ||||
| 	} | ||||
| 	for (int i = 0; i < GetSize(rd_left); i++) | ||||
| 		if (i != rd_left[i]) | ||||
| 			std::swap(rd_ports[i], rd_ports[rd_left[i]]); | ||||
|  | @ -84,6 +95,10 @@ void Mem::emit() { | |||
| 		if (i != wr_left[i]) | ||||
| 			std::swap(wr_ports[i], wr_ports[wr_left[i]]); | ||||
| 	wr_ports.resize(GetSize(wr_left)); | ||||
| 	for (int i = 0; i < GetSize(init_left); i++) | ||||
| 		if (i != init_left[i]) | ||||
| 			std::swap(inits[i], inits[init_left[i]]); | ||||
| 	inits.resize(GetSize(init_left)); | ||||
| 
 | ||||
| 	// for future: handle transparency mask here
 | ||||
| 
 | ||||
|  | @ -264,14 +279,14 @@ void Mem::emit() { | |||
| 
 | ||||
| void Mem::clear_inits() { | ||||
| 	for (auto &init : inits) | ||||
| 		if (init.cell) | ||||
| 			module->remove(init.cell); | ||||
| 	inits.clear(); | ||||
| 		init.removed = true; | ||||
| } | ||||
| 
 | ||||
| Const Mem::get_init_data() const { | ||||
| 	Const init_data(State::Sx, width * size); | ||||
| 	for (auto &init : inits) { | ||||
| 		if (init.removed) | ||||
| 			continue; | ||||
| 		int offset = (init.addr.as_int() - start_offset) * width; | ||||
| 		for (int i = 0; i < GetSize(init.data); i++) | ||||
| 			if (0 <= i+offset && i+offset < GetSize(init_data)) | ||||
|  |  | |||
|  | @ -65,10 +65,11 @@ struct MemWr : RTLIL::AttrObject { | |||
| }; | ||||
| 
 | ||||
| struct MemInit : RTLIL::AttrObject { | ||||
| 	bool removed; | ||||
| 	Cell *cell; | ||||
| 	Const addr; | ||||
| 	Const data; | ||||
| 	MemInit() : cell(nullptr) {} | ||||
| 	MemInit() : removed(false), cell(nullptr) {} | ||||
| }; | ||||
| 
 | ||||
| struct Mem : RTLIL::AttrObject { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue