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,):
+ def add_field(self, field):
self.fields.append(field)
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:
def parse_config(bnf, regs, file):
f = open(file)
- tokens = bnf.parseString(f.read()))
+ 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:
print "No such register '%s'" % reg_id
return 1
- r = regs[reg_id]
- print "decoding as %s" % r.name
+ reg = regs[reg_id]
+ print "decoding as %s" % reg.name
if args:
- values = args
+ value_iter = args.__iter__()
else:
- try:
- values = sys.stdin.readlines()
- except KeyboardInterrupt, e:
- return
-
- for value in values:
- i = long(value.strip(), 0)
- print r.decode(i, options['non-zero'])
+ value_iter = iter(sys.stdin.readline, '')
+
+ try:
+ for value in value_iter:
+ decode_value(reg, value.strip(), options)
+ except KeyboardInterrupt, e:
+ pass
return 0