Implement new SVInt object to defer literal expansion and allow bit-fiddling operations. Fix invalid bit-slicing of literals if field reset value is a constant. #71
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
from typing import TYPE_CHECKING
|
||||
from typing import TYPE_CHECKING, Union
|
||||
|
||||
from systemrdl.rdltypes import PrecedenceType, InterruptType
|
||||
|
||||
@@ -11,6 +11,7 @@ from . import hw_set_clr
|
||||
from . import hw_interrupts
|
||||
|
||||
from ..utils import get_indexed_path
|
||||
from ..sv_int import SVInt
|
||||
|
||||
from .generators import CombinationalStructGenerator, FieldStorageStructGenerator, FieldLogicGenerator
|
||||
|
||||
@@ -99,12 +100,12 @@ class FieldLogic:
|
||||
"""
|
||||
prop_value = field.get_property('incr')
|
||||
if prop_value:
|
||||
return self.exp.dereferencer.get_value(prop_value)
|
||||
return str(self.exp.dereferencer.get_value(prop_value))
|
||||
|
||||
# unset by the user, points to the implied input signal
|
||||
return self.exp.hwif.get_implied_prop_input_identifier(field, "incr")
|
||||
|
||||
def get_counter_incrvalue(self, field: 'FieldNode') -> str:
|
||||
def get_counter_incrvalue(self, field: 'FieldNode') -> Union[SVInt, str]:
|
||||
"""
|
||||
Return the string that represents the field's increment value
|
||||
"""
|
||||
@@ -115,7 +116,7 @@ class FieldLogic:
|
||||
return self.exp.hwif.get_implied_prop_input_identifier(field, "incrvalue")
|
||||
return "1'b1"
|
||||
|
||||
def get_counter_incrsaturate_value(self, field: 'FieldNode') -> str:
|
||||
def get_counter_incrsaturate_value(self, field: 'FieldNode') -> Union[SVInt, str]:
|
||||
prop_value = field.get_property('incrsaturate')
|
||||
if prop_value is True:
|
||||
return self.exp.dereferencer.get_value(2**field.width - 1, field.width)
|
||||
@@ -127,7 +128,7 @@ class FieldLogic:
|
||||
"""
|
||||
return field.get_property('incrsaturate') is not False
|
||||
|
||||
def get_counter_incrthreshold_value(self, field: 'FieldNode') -> str:
|
||||
def get_counter_incrthreshold_value(self, field: 'FieldNode') -> Union[SVInt, str]:
|
||||
prop_value = field.get_property('incrthreshold')
|
||||
if isinstance(prop_value, bool):
|
||||
# No explicit value set. use max
|
||||
@@ -140,12 +141,12 @@ class FieldLogic:
|
||||
"""
|
||||
prop_value = field.get_property('decr')
|
||||
if prop_value:
|
||||
return self.exp.dereferencer.get_value(prop_value)
|
||||
return str(self.exp.dereferencer.get_value(prop_value))
|
||||
|
||||
# unset by the user, points to the implied input signal
|
||||
return self.exp.hwif.get_implied_prop_input_identifier(field, "decr")
|
||||
|
||||
def get_counter_decrvalue(self, field: 'FieldNode') -> str:
|
||||
def get_counter_decrvalue(self, field: 'FieldNode') -> Union[SVInt, str]:
|
||||
"""
|
||||
Return the string that represents the field's decrement value
|
||||
"""
|
||||
@@ -156,7 +157,7 @@ class FieldLogic:
|
||||
return self.exp.hwif.get_implied_prop_input_identifier(field, "decrvalue")
|
||||
return "1'b1"
|
||||
|
||||
def get_counter_decrsaturate_value(self, field: 'FieldNode') -> str:
|
||||
def get_counter_decrsaturate_value(self, field: 'FieldNode') -> Union[SVInt, str]:
|
||||
prop_value = field.get_property('decrsaturate')
|
||||
if prop_value is True:
|
||||
return f"{field.width}'d0"
|
||||
@@ -168,7 +169,7 @@ class FieldLogic:
|
||||
"""
|
||||
return field.get_property('decrsaturate') is not False
|
||||
|
||||
def get_counter_decrthreshold_value(self, field: 'FieldNode') -> str:
|
||||
def get_counter_decrthreshold_value(self, field: 'FieldNode') -> Union[SVInt, str]:
|
||||
prop_value = field.get_property('decrthreshold')
|
||||
if isinstance(prop_value, bool):
|
||||
# No explicit value set. use min
|
||||
|
||||
Reference in New Issue
Block a user