16a98d91a9eef0031e1b6df7df1acad4d81ec809
[litex.git] / miscope / host / regs.py
1 import csv
2
3 class MappedReg:
4 def __init__(self, readfn, writefn, name, addr, length, busword, mode):
5 self.readfn = readfn
6 self.writefn = writefn
7 self.addr = addr
8 self.length = length
9 self.busword = busword
10 self.mode = mode
11
12 def read(self):
13 if self.mode not in ["rw", "ro"]:
14 raise KeyError(name + "register not readable")
15 r = 0
16 for i in range(self.length):
17 r |= self.readfn(self.addr + 4*i)
18 if i != (self.length-1):
19 r <<= self.busword
20 return r
21
22 def write(self, value):
23 if self.mode not in ["rw", "wo"]:
24 raise KeyError(name + "register not writable")
25 for i in range(self.length):
26 dat = (value >> ((self.length-1-i)*self.busword)) & (2**self.busword-1)
27 self.writefn(self.addr + 4*i, dat)
28
29 class MappedRegs:
30 def __init__(self, d):
31 self.d = d
32
33 def __getattr__(self, attr):
34 try:
35 return self.__dict__['d'][attr]
36 except KeyError:
37 pass
38 raise KeyError("No such register " + attr)
39
40 def build_map(addrmap, busword, readfn, writefn):
41 csv_reader = csv.reader(open(addrmap), delimiter=',', quotechar='#')
42 d = {}
43 for item in csv_reader:
44 name, addr, length, mode = item
45 addr = int(addr.replace("0x", ""), 16)
46 length = int(length)
47 d[name] = MappedReg(readfn, writefn, name, addr, length, busword, mode)
48 return MappedRegs(d)