csr: use IntEnum for CSRAccess
This commit is contained in:
parent
d2646f138e
commit
5dc440e80d
|
@ -30,6 +30,8 @@ class, which provides ``get_csrs`` and ``get_memories`` methods that scan for
|
||||||
CSR and memory attributes and return their list.
|
CSR and memory attributes and return their list.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from enum import IntEnum
|
||||||
|
|
||||||
from migen import *
|
from migen import *
|
||||||
from migen.util.misc import xdir
|
from migen.util.misc import xdir
|
||||||
from migen.fhdl.tracer import get_obj_var_name
|
from migen.fhdl.tracer import get_obj_var_name
|
||||||
|
@ -124,6 +126,13 @@ class _CompoundCSR(_CSRBase, Module):
|
||||||
def do_finalize(self, busword):
|
def do_finalize(self, busword):
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
|
# CSRAccess ----------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class CSRAccess(IntEnum):
|
||||||
|
WriteOnly = 0
|
||||||
|
ReadOnly = 1
|
||||||
|
ReadWrite = 2
|
||||||
|
|
||||||
# CSRField -----------------------------------------------------------------------------------------
|
# CSRField -----------------------------------------------------------------------------------------
|
||||||
|
|
||||||
class CSRField(Signal):
|
class CSRField(Signal):
|
||||||
|
@ -156,8 +165,7 @@ class CSRField(Signal):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, name, size=1, offset=None, reset=0, description=None, pulse=False, access=None, values=None):
|
def __init__(self, name, size=1, offset=None, reset=0, description=None, pulse=False, access=None, values=None):
|
||||||
assert name == name.lower()
|
assert access is None or (access in CSRAccess.values())
|
||||||
assert access in [None, "write-only", "read-only", "read-write"]
|
|
||||||
self.name = name
|
self.name = name
|
||||||
self.size = size
|
self.size = size
|
||||||
self.offset = offset
|
self.offset = offset
|
||||||
|
@ -179,10 +187,13 @@ class CSRFieldAggregate:
|
||||||
for field in fields:
|
for field in fields:
|
||||||
if field.access is None:
|
if field.access is None:
|
||||||
field.access = access
|
field.access = access
|
||||||
elif access == "read-only":
|
elif field.access == CSRAccess.ReadOnly:
|
||||||
assert field.access == "read-only"
|
assert not field.pulse
|
||||||
elif access == "read-write":
|
assert field.access == CSRAccess.ReadOnly
|
||||||
assert field.access in ["read-write", "write-only"]
|
elif field.access == CSRAccess.ReadWrite:
|
||||||
|
assert field.access in [CSRAccess.ReadWrite, CSRAccess.WriteOnly]
|
||||||
|
if field.pulse:
|
||||||
|
field.access = CSRAccess.WriteOnly
|
||||||
setattr(self, field.name, field)
|
setattr(self, field.name, field)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -252,7 +263,7 @@ class CSRStatus(_CompoundCSR):
|
||||||
|
|
||||||
def __init__(self, size=1, reset=0, fields=[], name=None, description=None):
|
def __init__(self, size=1, reset=0, fields=[], name=None, description=None):
|
||||||
if fields != []:
|
if fields != []:
|
||||||
self.fields = CSRFieldAggregate(fields, "read-only")
|
self.fields = CSRFieldAggregate(fields, CSRAccess.ReadOnly)
|
||||||
size = self.fields.get_size()
|
size = self.fields.get_size()
|
||||||
reset = self.fields.get_reset()
|
reset = self.fields.get_reset()
|
||||||
_CompoundCSR.__init__(self, size, name)
|
_CompoundCSR.__init__(self, size, name)
|
||||||
|
@ -324,7 +335,7 @@ class CSRStorage(_CompoundCSR):
|
||||||
|
|
||||||
def __init__(self, size=1, reset=0, fields=[], atomic_write=False, write_from_dev=False, name=None, description=None):
|
def __init__(self, size=1, reset=0, fields=[], atomic_write=False, write_from_dev=False, name=None, description=None):
|
||||||
if fields != []:
|
if fields != []:
|
||||||
self.fields = CSRFieldAggregate(fields, "read-write")
|
self.fields = CSRFieldAggregate(fields, CSRAccess.ReadWrite)
|
||||||
size = self.fields.get_size()
|
size = self.fields.get_size()
|
||||||
reset = self.fields.get_reset()
|
reset = self.fields.get_reset()
|
||||||
_CompoundCSR.__init__(self, size, name)
|
_CompoundCSR.__init__(self, size, name)
|
||||||
|
|
Loading…
Reference in New Issue