Commit 3692bae4 authored by Matthieu Cattin's avatar Matthieu Cattin

Add register access function using register map dictionary.

 - get/set register
 - get/set field in register
 - print register map
parent f80aa990
......@@ -16,18 +16,23 @@ import rr
# Class to access 32-bit wishbone registers on BAR0
class CSRDeviceOperationError(Exception):
def __init__(self, addr, msg):
def __init__(self, addr, reg_map, msg):
self.msg = msg
self.addr = addr
self.reg_map = reg_map
def __str__(self):
return ("CSR [Wishbone core base address:0x%08X]: %s" %(self.addr, self.msg))
return ("CSR [Wishbone core base address:0x%08X (%s)]: %s" %(self.addr, self.reg_map[0], self.msg))
class CCSR:
def __init__(self, bus, base_addr):
self.base_addr = base_addr;
self.bus = bus;
def __init__(self, bus, base_addr, reg_map=None):
self.base_addr = base_addr
self.bus = bus
self.reg_map = reg_map
###########################################################################
# The following functions accesses registers with the address offset only,
# the register map is not used.
def wr_reg(self, addr, val):
#print '[CSR] wr:%.8X reg:%.8X' % (val,(self.base_addr+addr))
......@@ -54,3 +59,71 @@ class CCSR:
return 1
else:
return 0
###########################################################################
# The following functions are based on the register map
# This file is stored in an external file and might be generated by wbgen
# Get register's field value
def get_field(self, reg, field):
if(reg in self.reg_map): # test if register exist in register map
if(field in self.reg_map[1][reg][2]): # test if field exist in register
reg_addr = self.reg_map[1][reg][0]
field_mask = self.reg_map[1][reg][2][field][2]
field_offset = self.reg_map[1][reg][2][field][0]
reg_val = self.rd_reg(reg_addr)
reg_val = (field_mask & (reg_val >> field_offset))
return reg_val
else:
raise CSRDeviceOperationError(self.addr, self.reg_map, 'Requested field (%s) doesn\'t exist.'%field)
else:
raise CSRDeviceOperationError(self.addr, self.reg_map, 'Requested register (%s) doesn\'t exist.'%reg)
# Set register's field value
def set_field(self, reg, field, value):
if(reg in self.reg_map): # test if register exist in register map
if(field in self.reg_map[1][reg][2]): # test if field exist in register
reg_addr = self.reg_map[1][reg][0]
field_mask = self.reg_map[1][reg][2][field][2]
field_offset = self.reg_map[1][reg][2][field][0]
reg_val = self.rd_reg(reg_addr)
reg_val &= ~(field_mask << field_offset)
reg_val |= ((field_maks & value) << field_offset)
self.wr_reg(reg_addr, reg_val)
return reg_val
else:
raise CSRDeviceOperationError(self.addr, self.reg_map, 'Requested field (%s) doesn\'t exist.'%field)
else:
raise CSRDeviceOperationError(self.addr, self.reg_map, 'Requested register (%s) doesn\'t exist.'%reg)
# Get register value
def get_reg(self, wb_core, reg_map, reg):
if(reg in self.reg_map): # test if register exist in register map
return self.rd_reg(self.reg_map[1][reg][0])
else:
raise CSRDeviceOperationError(self.addr, self.reg_map, 'Requested register (%s) doesn\'t exist.'%reg)
# Set register value
def set_reg(self, wb_core, reg_map, reg, value):
if(reg in self.reg_map): # test if register exist in register map
self.wr_reg(self.reg_map[reg][0], value)
else:
raise CSRDeviceOperationError(self.addr, self.reg_map, 'Requested register (%s) doesn\'t exist.'%reg)
# Print all register map
def print_reg_map(self):
# loop over registers and sort them by address offset
for reg in sorted(self.reg_map.iteritems(), key=lambda (k,v): v[0]):
print("%s register:") % (reg[1][1])
# loop over fields and sort them by position
for field in sorted(reg[1][2].iteritems(), key=lambda (k,v): v[0]):
value = self.get_field(reg[0], field[0])
print(" - %-30s:0x%X (%d)") % (field[1][1],value, value)
print ''
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment