Address Information
Address Information.
Access can be done to addrspaces, words, fields
and addresses in a single, burst or scatter flavour using offsets, masks, etc.
create takes all these variants into account and serves a normalized information set as AddrInfo.
Classes:
| Name | Description |
|---|---|
AddrInfo |
Address Info. |
AddrInfo
Bases: Object
Address Info.
Methods:
| Name | Description |
|---|---|
create |
Create |
iter |
Iteratate over address ranges. |
create
staticmethod
Create AddrInfo.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
addrmap
|
AddrMap
|
Address Map |
required |
item
|
ToAddrMapRef
|
Thing to be resolved |
required |
Other Parameters:
| Name | Type | Description |
|---|---|---|
offset |
int | None
|
address offset in bytes |
mask |
int | None
|
Value Mask (not allowed for fields) |
Example Address Map:
>>> import ucdp as u
>>> from ucdp_addr import Addrspace, Word, Field, AddrMap
>>> addrmap = AddrMap()
>>> for idx, aname in enumerate(("uart", "spi", "owi")):
... addrspace = Addrspace(name=aname, width=32, depth=8, baseaddr=8*4*idx)
... addrmap.add(addrspace)
... word = addrspace.add_word("ctrl")
... field = word.add_field("ena", u.BitType(), "RW")
... word = addrspace.add_word("stat")
... field = word.add_field("bsy", u.BitType(), "RO", offset=9)
Addrspace:
>>> addrinfo = AddrInfo.create(addrmap, "spi")
>>> str(addrinfo)
'spi [0x20 8x32 (32 bytes)]'
>>> addrinfo.ref
AddrMapRef(..., addrspace=Addrspace(name='spi', baseaddr=Hex('0x20'), size=Bytesize('32 bytes')))
>>> addrinfo.mask
>>> tuple(addrinfo.iter())
(Hex('0x20'), Hex('0x24'), Hex('0x28'), Hex('0x2C'), Hex('0x30'), Hex('0x34'), Hex('0x38'), Hex('0x3C'))
>>> addrinfo = AddrInfo.create(addrmap, "spi", offset=8, mask=0xF0)
>>> str(addrinfo)
'spi [0x28 6x32 (24 bytes)] mask=0xF0'
>>> addrinfo.mask
Hex('0xF0')
>>> tuple(addrinfo.iter())
(Hex('0x28'), Hex('0x2C'), Hex('0x30'), Hex('0x34'), Hex('0x38'), Hex('0x3C'))
Word:
>>> addrinfo = AddrInfo.create(addrmap, "spi.stat")
>>> str(addrinfo)
'spi.stat [0x24 1x32 (4 bytes)]'
>>> addrinfo.ref
AddrMapRef(..., addrspace=Addrspace(name='spi', baseaddr=Hex('0x20'), ..., word=Word(name='stat', ...)
>>> addrinfo.mask
>>> tuple(addrinfo.iter())
(Hex('0x24'),)
>>> AddrInfo.create(addrmap, "spi.stat", offset=8)
Traceback (most recent call last):
...
ValueError: 'offset' is not allowed for words and fields
Field:
>>> addrinfo = AddrInfo.create(addrmap, "spi.stat.bsy")
>>> str(addrinfo)
'spi.stat.bsy [0x24 1x32 (4 bytes)] mask=0x200'
>>> addrinfo.ref
AddrMapRef(...Hex('0x20'), ... word=Word(name='stat', ...(name='bsy', type_=BitType(), bus=RO, offset=9))
>>> addrinfo.mask
Hex('0x200')
>>> tuple(addrinfo.iter())
(Hex('0x24'),)
>>> AddrInfo.create(addrmap, "spi.stat.bsy", offset=8)
Traceback (most recent call last):
...
ValueError: 'offset' is not allowed for words and fields
>>> AddrInfo.create(addrmap, "spi.stat.bsy", mask=8)
Traceback (most recent call last):
...
ValueError: 'mask' is not allowed for fields