mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	Bugfixes in $readmem[hb]
This commit is contained in:
		
							parent
							
								
									4ac202e2a5
								
							
						
					
					
						commit
						f9d7df0869
					
				
					 1 changed files with 7 additions and 4 deletions
				
			
		| 
						 | 
					@ -2211,6 +2211,9 @@ static void replace_result_wire_name_in_function(AstNode *node, std::string &fro
 | 
				
			||||||
// replace a readmem[bh] TCALL ast node with a block of memory assignments
 | 
					// replace a readmem[bh] TCALL ast node with a block of memory assignments
 | 
				
			||||||
AstNode *AstNode::readmem(bool is_readmemh, std::string mem_filename, AstNode *memory, int start_addr, int finish_addr, bool unconditional_init)
 | 
					AstNode *AstNode::readmem(bool is_readmemh, std::string mem_filename, AstNode *memory, int start_addr, int finish_addr, bool unconditional_init)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						int mem_width, mem_size, addr_bits;
 | 
				
			||||||
 | 
						memory->meminfo(mem_width, mem_size, addr_bits);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	AstNode *block = new AstNode(AST_BLOCK);
 | 
						AstNode *block = new AstNode(AST_BLOCK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	AstNode *meminit = nullptr;
 | 
						AstNode *meminit = nullptr;
 | 
				
			||||||
| 
						 | 
					@ -2232,7 +2235,7 @@ AstNode *AstNode::readmem(bool is_readmemh, std::string mem_filename, AstNode *m
 | 
				
			||||||
		start_addr = range_min;
 | 
							start_addr = range_min;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (finish_addr < 0)
 | 
						if (finish_addr < 0)
 | 
				
			||||||
		finish_addr = range_max;
 | 
							finish_addr = range_max + 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool in_comment = false;
 | 
						bool in_comment = false;
 | 
				
			||||||
	int increment = start_addr <= finish_addr ? +1 : -1;
 | 
						int increment = start_addr <= finish_addr ? +1 : -1;
 | 
				
			||||||
| 
						 | 
					@ -2272,7 +2275,7 @@ AstNode *AstNode::readmem(bool is_readmemh, std::string mem_filename, AstNode *m
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			AstNode *value = VERILOG_FRONTEND::const2ast((is_readmemh ? "'h" : "'b") + token);
 | 
								AstNode *value = VERILOG_FRONTEND::const2ast(stringf("%d'%c", mem_width, is_readmemh ? 'h' : 'b') + token);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (unconditional_init)
 | 
								if (unconditional_init)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
| 
						 | 
					@ -2308,12 +2311,12 @@ AstNode *AstNode::readmem(bool is_readmemh, std::string mem_filename, AstNode *m
 | 
				
			||||||
				block->children.back()->children[0]->id2ast = memory;
 | 
									block->children.back()->children[0]->id2ast = memory;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if ((cursor == finish_addr) || (increment > 0 && cursor >= range_max) || (increment < 0 && cursor <= range_min))
 | 
								if ((cursor == finish_addr) || (increment > 0 && cursor > range_max) || (increment < 0 && cursor < range_min))
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			cursor += increment;
 | 
								cursor += increment;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if ((cursor == finish_addr) || (increment > 0 && cursor >= range_max) || (increment < 0 && cursor <= range_min))
 | 
							if ((cursor == finish_addr) || (increment > 0 && cursor > range_max) || (increment < 0 && cursor < range_min))
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue