Register definitions can now be entered with numbering schemes other than
the current default of bit 0 being the MSB. Valid values of the order:
configuration directive are: bit-0-is-lsb, bit-0-is-msb or ibm.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
return None
@staticmethod
return None
@staticmethod
- def parse_bitfield(line):
+ def parse_bitfield(line, reg):
a = line.split(None, 1)
if len(a) != 2:
return None
a = line.split(None, 1)
if len(a) != 2:
return None
for s in range_str.split(','):
if ':' in s:
(start, end) = s.split(':')
for s in range_str.split(','):
if ':' in s:
(start, end) = s.split(':')
- bits.extend(range(int(start), int(end) + 1, 1))
+ start = reg.bit_number(int(start))
+ end = reg.bit_number(int(end))
+ bits.extend(range(start, end + 1, 1))
+ bits.append(reg.bit_number(int(s)))
return bitfield(bits, name)
return bitfield(bits, name)
- def __init__(self, id, name, width):
+ bit_0_is_msb = 0
+ bit_0_is_lsb = 1
+
+ def __init__(self, id):
- self.name = name
- self.width = width
+ # set defaults
+ self.name = None
+ self.bit_order = self.bit_0_is_msb
+ self.width = 64
def add_field(self, field):
self.fields.append(field)
def add_field(self, field):
self.fields.append(field)
str += "%*s: 0x%x\n" \
% (name_width, field.name, v)
return str
str += "%*s: 0x%x\n" \
% (name_width, field.name, v)
return str
+
+ def bit_number(self, number):
+ if self.bit_order == self.bit_0_is_lsb:
+ number = self.width - 1 - number
+ return number
def list_regs(regs):
for (id, r) in regs.iteritems():
def list_regs(regs):
for (id, r) in regs.iteritems():
tokens = bnf.parseString(f.read())
tokens = bnf.parseString(f.read())
+ order_map = {'bit-0-is-lsb': register.bit_0_is_lsb,
+ 'bit-0-is-msb': register.bit_0_is_msb,
+ 'ibm': register.bit_0_is_msb,
+ 'default': register.bit_0_is_msb}
+
for tok in tokens:
ts = tok.asList()
id = ts.pop(0)
for tok in tokens:
ts = tok.asList()
id = ts.pop(0)
raise ConfigurationError(file,
"Register %s is already defined" % id)
raise ConfigurationError(file,
"Register %s is already defined" % id)
- # default to 64 bit registers
- width = 64
- name = None
alias_id = None
fields = []
for t in ts:
if t[0] == 'name':
name = t[1]
alias_id = None
fields = []
for t in ts:
if t[0] == 'name':
name = t[1]
+ reg.name = name.strip()
- f = bitfield.parse_bitfield(t[1])
+ f = bitfield.parse_bitfield(t[1], reg)
if f is None:
raise ConfigurationError(file,
"Invalid field in %s" % id)
if f is None:
raise ConfigurationError(file,
"Invalid field in %s" % id)
"Invalid value in %s" % id)
fields[-1].add_value(v[0], v[1])
"Invalid value in %s" % id)
fields[-1].add_value(v[0], v[1])
+ elif t[0] == 'order':
+ if len(fields) != 0:
+ raise ConfigurationError(file,
+ ("bit order defined after " \
+ + "fields in %s") % id)
+
+ order_str = t[1].strip().lower()
+ if order_str not in order_map.keys():
+ raise ConfigurationError(file,
+ "Invalid bit order %s in %s" % \
+ (order_str, id))
+ reg.bit_order = order_map[order_str]
+
elif t[0] == 'alias':
alias_id = t[1].strip()
if alias_id is not None:
elif t[0] == 'alias':
alias_id = t[1].strip()
if alias_id is not None:
- if name is not None or fields != []:
+ if reg.name is not None or fields != []:
raise ConfigurationError(file, ("Definiton " \
+ "for %s is an alias, but has other " \
+ "attributes") % id)
raise ConfigurationError(file, ("Definiton " \
+ "for %s is an alias, but has other " \
+ "attributes") % id)
"non-existent register %s (from %s)" \
% (alias_id, id))
"non-existent register %s (from %s)" \
% (alias_id, id))
- regs[id] = regs[alias_id]
- if name is None or name == '':
+ if reg.name is None or reg.name == '':
raise ConfigurationError(file,
"No name for entry %s" % id)
raise ConfigurationError(file,
"No name for entry %s" % id)
raise ConfigurationError(file,
"Register %s has no fields" % id)
raise ConfigurationError(file,
"Register %s has no fields" % id)
- r = register(id, name, width)
def parse_config_dir(data, dir, fnames):
(bnf, regs) = data
def parse_config_dir(data, dir, fnames):
(bnf, regs) = data