litex/misoclib/tools/litescope/host/driver/reg.py

56 lines
1.6 KiB
Python
Raw Normal View History

2014-04-18 04:33:05 -04:00
import csv
2015-04-13 07:18:21 -04:00
2014-04-18 04:33:05 -04:00
class MappedReg:
def __init__(self, readfn, writefn, name, addr, length, busword, mode):
self.readfn = readfn
self.writefn = writefn
self.addr = addr
self.length = length
self.busword = busword
self.mode = mode
2014-04-18 04:33:05 -04:00
def read(self):
if self.mode not in ["rw", "ro"]:
raise KeyError(name + "register not readable")
datas = self.readfn(self.addr, burst_length=self.length)
if isinstance(datas, int):
return datas
else:
data = 0
for i in range(self.length):
data = data << self.busword
2015-04-20 02:16:31 -04:00
data |= datas[i]
return data
def write(self, value):
if self.mode not in ["rw", "wo"]:
raise KeyError(name + "register not writable")
datas = []
for i in range(self.length):
datas.append((value >> ((self.length-1-i)*self.busword)) & (2**self.busword-1))
self.writefn(self.addr, datas)
2014-04-18 04:33:05 -04:00
2015-04-13 07:18:21 -04:00
2014-04-18 04:33:05 -04:00
class MappedRegs:
def __init__(self, d):
self.d = d
2014-04-18 04:33:05 -04:00
def __getattr__(self, attr):
try:
return self.__dict__['d'][attr]
except KeyError:
pass
raise KeyError("No such register " + attr)
2014-04-18 04:33:05 -04:00
2015-04-13 07:18:21 -04:00
def build_map(addrmap, busword, readfn, writefn):
csv_reader = csv.reader(open(addrmap), delimiter=',', quotechar='#')
d = {}
for item in csv_reader:
name, addr, length, mode = item
addr = int(addr.replace("0x", ""), 16)
length = int(length)
d[name] = MappedReg(readfn, writefn, name, addr, length, busword, mode)
2015-04-13 07:38:35 -04:00
return MappedRegs(d)