diff --git a/amaranth/hdl/ast.py b/amaranth/hdl/ast.py index 8dd42cc..6a6cbee 100644 --- a/amaranth/hdl/ast.py +++ b/amaranth/hdl/ast.py @@ -582,7 +582,9 @@ class Const(Value): """ src_loc = None + # TODO(amaranth-0.5): remove @staticmethod + @deprecated("instead of `Const.normalize(value, shape)`, use `Const(value, shape).value`") def normalize(value, shape): mask = (1 << shape.width) - 1 value &= mask @@ -601,7 +603,10 @@ class Const(Value): shape = Shape.cast(shape, src_loc_at=1 + src_loc_at) self.width = shape.width self.signed = shape.signed - self.value = self.normalize(self.value, shape) + if self.signed and self.value >> (self.width - 1): + self.value |= -(1 << self.width) + else: + self.value &= (1 << self.width) - 1 def shape(self): return Shape(self.width, self.signed) diff --git a/amaranth/lib/data.py b/amaranth/lib/data.py index a9dcc6a..44831d6 100644 --- a/amaranth/lib/data.py +++ b/amaranth/lib/data.py @@ -100,9 +100,10 @@ class Layout(ShapeCastable, metaclass=ABCMeta): """Convert ``value``, which may be a dict or an array of field values, to an integer using the representation defined by this layout. - This method is roughly equivalent to :meth:`Const.normalize`. It is private because - Amaranth does not currently have a concept of a constant initializer; this requires - an RFC. It will be renamed or removed in a future version.""" + This method is private because Amaranth does not currently have a concept of + a constant initializer; this requires an RFC. It will be renamed or removed + in a future version. + """ if isinstance(value, Mapping): iterator = value.items() elif isinstance(value, Sequence): @@ -116,7 +117,7 @@ class Layout(ShapeCastable, metaclass=ABCMeta): field = self[key] if isinstance(field.shape, Layout): key_value = field.shape._convert_to_int(key_value) - int_value |= Const.normalize(key_value, Shape.cast(field.shape)) << field.offset + int_value |= Const(key_value, Shape.cast(field.shape)).value << field.offset return int_value diff --git a/amaranth/sim/_pycoro.py b/amaranth/sim/_pycoro.py index 6e8d696..f1d724b 100644 --- a/amaranth/sim/_pycoro.py +++ b/amaranth/sim/_pycoro.py @@ -69,7 +69,7 @@ class PyCoroProcess(BaseProcess): if isinstance(command, Value): exec(_RHSValueCompiler.compile(self.state, command, mode="curr"), self.exec_locals) - response = Const.normalize(self.exec_locals["result"], command.shape()) + response = Const(self.exec_locals["result"], command.shape()).value elif isinstance(command, Statement): exec(_StatementCompiler.compile(self.state, command), diff --git a/docs/changes.rst b/docs/changes.rst index 9523a88..6dc6b17 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -33,6 +33,7 @@ Language changes * Changed: :meth:`Value.cast` casts :class:`ValueCastable` objects recursively. * Changed: :meth:`Value.cast` treats instances of classes derived from both :class:`enum.Enum` and :class:`int` (including :class:`enum.IntEnum`) as enumerations rather than integers. * Changed: :class:`Cat` accepts instances of classes derived from both :class:`enum.Enum` and :class:`int` (including :class:`enum.IntEnum`) without warning. +* Deprecated: :meth:`Const.normalize`. * Removed: (deprecated in 0.1) casting of :class:`Shape` to and from a ``(width, signed)`` tuple. * Removed: (deprecated in 0.3) :class:`ast.UserValue`. * Removed: (deprecated in 0.3) support for ``# nmigen:`` linter instructions at the beginning of file.