mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	cxxrtl: make ROMs writable, document memory::operator[].
There is no practical benefit from using `const memory` for ROMs; it uses an std::vector internally, which prevents contemporary compilers from constant-propagating ROM contents. (It is not clear whether they are permitted to do so.) However, there is a major benefit from using non-const `memory` for ROMs, which is the ability to dynamically fill the ROM for each individual simulation.
This commit is contained in:
		
							parent
							
								
									9043632dcc
								
							
						
					
					
						commit
						06c0338f2c
					
				
					 2 changed files with 6 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -1166,8 +1166,7 @@ struct CxxrtlWorker {
 | 
			
		|||
		});
 | 
			
		||||
 | 
			
		||||
		dump_attrs(memory);
 | 
			
		||||
		f << indent << (writable_memories[memory] ? "" : "const ")
 | 
			
		||||
		            << "memory<" << memory->width << "> " << mangle(memory)
 | 
			
		||||
		f << indent << "memory<" << memory->width << "> " << mangle(memory)
 | 
			
		||||
		            << " { " << memory->size << "u";
 | 
			
		||||
		if (init_cells.empty()) {
 | 
			
		||||
			f << " };\n";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -604,12 +604,15 @@ struct memory {
 | 
			
		|||
		auto _ = {std::move(std::begin(init.data), std::end(init.data), data.begin() + init.offset)...};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	value<Width> &operator [](size_t index) {
 | 
			
		||||
	// An operator for direct memory reads. May be used at any time during the simulation.
 | 
			
		||||
	const value<Width> &operator [](size_t index) const {
 | 
			
		||||
		assert(index < data.size());
 | 
			
		||||
		return data[index];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const value<Width> &operator [](size_t index) const {
 | 
			
		||||
	// An operator for direct memory writes. May only be used before the simulation is started. If used
 | 
			
		||||
	// after the simulation is started, the design may malfunction.
 | 
			
		||||
	value<Width> &operator [](size_t index) {
 | 
			
		||||
		assert(index < data.size());
 | 
			
		||||
		return data[index];
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue