parent
84dff93786
commit
49a8a942e8
|
@ -14,14 +14,14 @@ for _member in py_enum.__all__:
|
||||||
del _member
|
del _member
|
||||||
|
|
||||||
|
|
||||||
class EnumMeta(ShapeCastable, py_enum.EnumMeta):
|
class EnumType(ShapeCastable, py_enum.EnumMeta):
|
||||||
"""Subclass of the standard :class:`enum.EnumMeta` that implements the :class:`ShapeCastable`
|
"""Subclass of the standard :class:`enum.EnumType` that implements the :class:`ShapeCastable`
|
||||||
protocol.
|
protocol.
|
||||||
|
|
||||||
This metaclass provides the :meth:`as_shape` method, making its instances
|
This metaclass provides the :meth:`as_shape` method, making its instances
|
||||||
:ref:`shape-like <lang-shapelike>`, and accepts a ``shape=`` keyword argument
|
:ref:`shape-like <lang-shapelike>`, and accepts a ``shape=`` keyword argument
|
||||||
to specify a shape explicitly. Other than this, it acts the same as the standard
|
to specify a shape explicitly. Other than this, it acts the same as the standard
|
||||||
:class:`enum.EnumMeta` class; if the ``shape=`` argument is not specified and
|
:class:`enum.EnumType` class; if the ``shape=`` argument is not specified and
|
||||||
:meth:`as_shape` is never called, it places no restrictions on the enumeration class
|
:meth:`as_shape` is never called, it places no restrictions on the enumeration class
|
||||||
or the values of its members.
|
or the values of its members.
|
||||||
|
|
||||||
|
@ -180,32 +180,37 @@ class EnumMeta(ShapeCastable, py_enum.EnumMeta):
|
||||||
yield Repr(FormatEnum(cls), value)
|
yield Repr(FormatEnum(cls), value)
|
||||||
|
|
||||||
|
|
||||||
|
# In 3.11, Python renamed EnumMeta to EnumType. Like Python itself, we support both for
|
||||||
|
# compatibility.
|
||||||
|
EnumMeta = EnumType
|
||||||
|
|
||||||
|
|
||||||
class Enum(py_enum.Enum):
|
class Enum(py_enum.Enum):
|
||||||
"""Subclass of the standard :class:`enum.Enum` that has :class:`EnumMeta` as
|
"""Subclass of the standard :class:`enum.Enum` that has :class:`EnumType` as
|
||||||
its metaclass and :class:`EnumView` as its view class."""
|
its metaclass and :class:`EnumView` as its view class."""
|
||||||
|
|
||||||
|
|
||||||
class IntEnum(py_enum.IntEnum):
|
class IntEnum(py_enum.IntEnum):
|
||||||
"""Subclass of the standard :class:`enum.IntEnum` that has :class:`EnumMeta` as
|
"""Subclass of the standard :class:`enum.IntEnum` that has :class:`EnumType` as
|
||||||
its metaclass."""
|
its metaclass."""
|
||||||
|
|
||||||
|
|
||||||
class Flag(py_enum.Flag):
|
class Flag(py_enum.Flag):
|
||||||
"""Subclass of the standard :class:`enum.Flag` that has :class:`EnumMeta` as
|
"""Subclass of the standard :class:`enum.Flag` that has :class:`EnumType` as
|
||||||
its metaclass and :class:`FlagView` as its view class."""
|
its metaclass and :class:`FlagView` as its view class."""
|
||||||
|
|
||||||
|
|
||||||
class IntFlag(py_enum.IntFlag):
|
class IntFlag(py_enum.IntFlag):
|
||||||
"""Subclass of the standard :class:`enum.IntFlag` that has :class:`EnumMeta` as
|
"""Subclass of the standard :class:`enum.IntFlag` that has :class:`EnumType` as
|
||||||
its metaclass."""
|
its metaclass."""
|
||||||
|
|
||||||
|
|
||||||
# Fix up the metaclass after the fact: the metaclass __new__ requires these classes
|
# Fix up the metaclass after the fact: the metaclass __new__ requires these classes
|
||||||
# to already be present, and also would not install itself on them due to lack of shape.
|
# to already be present, and also would not install itself on them due to lack of shape.
|
||||||
Enum.__class__ = EnumMeta
|
Enum.__class__ = EnumType
|
||||||
IntEnum.__class__ = EnumMeta
|
IntEnum.__class__ = EnumType
|
||||||
Flag.__class__ = EnumMeta
|
Flag.__class__ = EnumType
|
||||||
IntFlag.__class__ = EnumMeta
|
IntFlag.__class__ = EnumType
|
||||||
|
|
||||||
|
|
||||||
class EnumView(ValueCastable):
|
class EnumView(ValueCastable):
|
||||||
|
@ -219,7 +224,7 @@ class EnumView(ValueCastable):
|
||||||
"""Constructs a view with the given enum type and target
|
"""Constructs a view with the given enum type and target
|
||||||
(a :ref:`value-like <lang-valuelike>`).
|
(a :ref:`value-like <lang-valuelike>`).
|
||||||
"""
|
"""
|
||||||
if not isinstance(enum, EnumMeta) or not hasattr(enum, "_amaranth_shape_"):
|
if not isinstance(enum, EnumType) or not hasattr(enum, "_amaranth_shape_"):
|
||||||
raise TypeError(f"EnumView type must be an enum with shape, not {enum!r}")
|
raise TypeError(f"EnumView type must be an enum with shape, not {enum!r}")
|
||||||
try:
|
try:
|
||||||
cast_target = Value.cast(target)
|
cast_target = Value.cast(target)
|
||||||
|
|
|
@ -114,7 +114,7 @@ It is also possible to define a custom view class for a given enum:
|
||||||
Metaclass
|
Metaclass
|
||||||
=========
|
=========
|
||||||
|
|
||||||
.. autoclass:: EnumMeta()
|
.. autoclass:: EnumType()
|
||||||
|
|
||||||
|
|
||||||
Base classes
|
Base classes
|
||||||
|
|
|
@ -5,7 +5,7 @@ import unittest
|
||||||
|
|
||||||
from amaranth import *
|
from amaranth import *
|
||||||
from amaranth.hdl import *
|
from amaranth.hdl import *
|
||||||
from amaranth.lib.enum import Enum, EnumMeta, Flag, IntEnum, EnumView, FlagView
|
from amaranth.lib.enum import Enum, EnumType, Flag, IntEnum, EnumView, FlagView
|
||||||
|
|
||||||
from .utils import *
|
from .utils import *
|
||||||
|
|
||||||
|
@ -100,7 +100,7 @@ class EnumTestCase(FHDLTestCase):
|
||||||
Z = 0
|
Z = 0
|
||||||
A = 10
|
A = 10
|
||||||
B = 20
|
B = 20
|
||||||
self.assertNotIsInstance(EnumA, EnumMeta)
|
self.assertNotIsInstance(EnumA, EnumType)
|
||||||
self.assertIsInstance(EnumA, py_enum.EnumMeta)
|
self.assertIsInstance(EnumA, py_enum.EnumMeta)
|
||||||
|
|
||||||
def test_const_shape(self):
|
def test_const_shape(self):
|
||||||
|
|
Loading…
Reference in a new issue