diff options
Diffstat (limited to 'frontends/ast')
| -rw-r--r-- | frontends/ast/genrtlil.cc | 2 | ||||
| -rw-r--r-- | frontends/ast/simplify.cc | 19 | 
2 files changed, 20 insertions, 1 deletions
| diff --git a/frontends/ast/genrtlil.cc b/frontends/ast/genrtlil.cc index d4e9baa5f..cdc3adc9c 100644 --- a/frontends/ast/genrtlil.cc +++ b/frontends/ast/genrtlil.cc @@ -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); diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc index f629df387..3314819fb 100644 --- a/frontends/ast/simplify.cc +++ b/frontends/ast/simplify.cc @@ -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) | 
