csr/fields: add access parameter
This commit is contained in:
parent
23b01f8f02
commit
4e84729cf9
|
@ -123,24 +123,32 @@ class _CompoundCSR(_CSRBase, Module):
|
||||||
|
|
||||||
|
|
||||||
class CSRField(Signal):
|
class CSRField(Signal):
|
||||||
def __init__(self, name, size=1, offset=None, reset=0, description=None, pulse=False, 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 name == name.lower()
|
||||||
|
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
|
||||||
self.reset_value = reset
|
self.reset_value = reset
|
||||||
self.description = description
|
self.description = description
|
||||||
|
self.access = access
|
||||||
self.pulse = pulse
|
self.pulse = pulse
|
||||||
self.values = values
|
self.values = values
|
||||||
Signal.__init__(self, size, name=name, reset=reset)
|
Signal.__init__(self, size, name=name, reset=reset)
|
||||||
|
|
||||||
|
|
||||||
class CSRFieldCompound:
|
class CSRFieldCompound:
|
||||||
def __init__(self, fields):
|
def __init__(self, fields, access):
|
||||||
self.check_names(fields)
|
self.check_names(fields)
|
||||||
self.check_ordering_overlap(fields)
|
self.check_ordering_overlap(fields)
|
||||||
self.fields = fields
|
self.fields = fields
|
||||||
for field in fields:
|
for field in fields:
|
||||||
|
if field.access is None:
|
||||||
|
field.access = access
|
||||||
|
elif access == "read-only":
|
||||||
|
assert field.access == "read-only"
|
||||||
|
elif access == "read-write":
|
||||||
|
assert field.access in ["read-write", "write-only"]
|
||||||
setattr(self, field.name, field)
|
setattr(self, field.name, field)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -210,7 +218,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 = CSRFieldCompound(fields)
|
self.fields = CSRFieldCompound(fields, "read-only")
|
||||||
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)
|
||||||
|
@ -287,7 +295,7 @@ class CSRStorage(_CompoundCSR):
|
||||||
|
|
||||||
def __init__(self, size=1, reset=0, fields=[], atomic_write=False, write_from_dev=False, alignment_bits=0, name=None, description=None):
|
def __init__(self, size=1, reset=0, fields=[], atomic_write=False, write_from_dev=False, alignment_bits=0, name=None, description=None):
|
||||||
if fields != []:
|
if fields != []:
|
||||||
self.fields = CSRFieldCompound(fields)
|
self.fields = CSRFieldCompound(fields, "read-write")
|
||||||
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