return self.values[value]
return None
- def __str__(self):
- return "[%2d:%-2d] %s 0x%x" % (int(self.start_bit),
- int(self.end_bit), self.name, self.mask())
-
@staticmethod
def parse_bitfield(line):
a = line.split(None, 1)
return a
class register:
- def __init__(self, name, width):
+ def __init__(self, id, name, width):
+ self.id = id
self.name = name
self.width = width
self.fields = []
def add_field(self, field,):
self.fields.append(field)
- def decode(self, value):
+ def decode(self, value, ignore_zero):
field_width = (self.width + 3) / 4
name_width = max(map(lambda f: len(f.name), self.fields))
str = "0x%0*lx [%d]\n" % (field_width, value, value)
for field in self.fields:
v = field.mask(self.width, value);
+ if ignore_zero and v == 0:
+ continue
desc = field.value(v)
if desc is not None:
- str += "%*s: 0x%s [%s]\n" \
+ str += "%*s: 0x%x [%s]\n" \
% (name_width, field.name, v, desc)
else:
str += "%*s: 0x%x\n" \
% (name_width, field.name, v)
return str
- def __str__(self):
- str = self.name + "\n"
- for f in self.fields:
- str += "\t%s\n" % f
- return str
-
def list_regs(regs):
for (id, r) in regs.iteritems():
print "%18s : %s" % (id, r.name)
def parse_config(bnf, regs, file):
f = open(file)
- tokens = bnf.parseString("".join(f.readlines()))
+ tokens = bnf.parseString(f.read())
for tok in tokens:
ts = tok.asList()
raise ConfigurationError(file,
"Register %s has no fields" % id)
- r = register(name, width)
+ r = register(id, name, width)
for f in fields:
r.add_field(f)
return regs
def usage(prog):
- print "Usage: %s <-l> | <-s pattern> | register [value...]" % prog
+ print "Usage: %s <-l> | <-s pattern> | [-n] register [value...]" % prog
+
+def decode_value(reg, value, options):
+ try:
+ i = long(value, 0)
+ except ValueError, e:
+ print "error: invalid value '%s'" % value
+ return
+
+ if i > ((1 << reg.width) - 1):
+ print ("error: value '%s' is too large " + \
+ "for %d-bit register '%s'") % (value, reg.width, reg.id)
+ return
+
+ print reg.decode(i, options.has_key('non_zero'))
+
def main():
try:
- (opts, args) = getopt(sys.argv[1:], "hls:", \
- ["help", "list", "search="])
+ (opts, args) = getopt(sys.argv[1:], "hlns:", \
+ ["help", "list", "non-zero", "search="])
except GetoptError:
usage(sys.argv[0])
return 1
print "No configuration available"
return 1
+ options = {}
+ options['non-zero'] = False
+
for o, a in opts:
if o in ("-h", "--help"):
usage(sys.argv[0])
list_regs(search_regs(regs, a))
return
+ if o in ("-n", "--non-zero"):
+ options['non-zero'] = True
if not args:
usage(sys.argv[0])
reg_id = args.pop(0)
if not regs.has_key(reg_id):
- print "No such register '%s'. Valid regs are:" % reg_id
- list_regs(regs)
+ print "No such register '%s'" % reg_id
return 1
r = regs[reg_id]
return
for value in values:
- i = long(value.strip(), 0)
- print r.decode(i)
+ decode_value(r, value.strip(), options)
return 0