mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-03 21:09:12 +00:00 
			
		
		
		
	
							parent
							
								
									2d573a0ff6
								
							
						
					
					
						commit
						aee439360b
					
				
					 43 changed files with 258 additions and 27 deletions
				
			
		| 
						 | 
				
			
			@ -1055,7 +1055,7 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)
 | 
			
		|||
			if (!range_valid)
 | 
			
		||||
				log_file_error(filename, location.first_line, "Signal `%s' with non-constant width!\n", str.c_str());
 | 
			
		||||
 | 
			
		||||
			if (!(range_left >= range_right || (range_left == -1 && range_right == 0)))
 | 
			
		||||
			if (!(range_left + 1 >= range_right))
 | 
			
		||||
				log_file_error(filename, location.first_line, "Signal `%s' with invalid width range %d!\n", str.c_str(), range_left - range_right + 1);
 | 
			
		||||
 | 
			
		||||
			RTLIL::Wire *wire = current_module->addWire(str, range_left - range_right + 1);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1098,6 +1098,25 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
 | 
			
		|||
				range_swapped = children[0]->range_swapped;
 | 
			
		||||
				range_left = children[0]->range_left;
 | 
			
		||||
				range_right = children[0]->range_right;
 | 
			
		||||
				bool force_upto = false, force_downto = false;
 | 
			
		||||
				if (attributes.count(ID::force_upto)) {
 | 
			
		||||
					AstNode *val = attributes[ID::force_upto];
 | 
			
		||||
					if (val->type != AST_CONSTANT)
 | 
			
		||||
						log_file_error(filename, location.first_line, "Attribute `force_upto' with non-constant value!\n");
 | 
			
		||||
					force_upto = val->asAttrConst().as_bool();
 | 
			
		||||
				}
 | 
			
		||||
				if (attributes.count(ID::force_downto)) {
 | 
			
		||||
					AstNode *val = attributes[ID::force_downto];
 | 
			
		||||
					if (val->type != AST_CONSTANT)
 | 
			
		||||
						log_file_error(filename, location.first_line, "Attribute `force_downto' with non-constant value!\n");
 | 
			
		||||
					force_downto = val->asAttrConst().as_bool();
 | 
			
		||||
				}
 | 
			
		||||
				if (force_upto && force_downto)
 | 
			
		||||
					log_file_error(filename, location.first_line, "Attributes `force_downto' and `force_upto' cannot be both set!\n");
 | 
			
		||||
				if ((force_upto && !range_swapped) || (force_downto && range_swapped)) {
 | 
			
		||||
					std::swap(range_left, range_right);
 | 
			
		||||
					range_swapped = force_upto;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			if (!range_valid)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue