X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;ds=sidebyside;f=bitfield;h=1a03ddb96419c9f2f77ea08830a21c6d25665d14;hb=369073ac299df29a428871938851e56c8acebe91;hp=e9be554734bb9ba37613cf9a4b3ca5ffafe41387;hpb=a8d8334c23bc35483ed5a39e5ca163c38524da2a;p=bitfield diff --git a/bitfield b/bitfield index e9be554..1a03ddb 100644 --- a/bitfield +++ b/bitfield @@ -71,23 +71,28 @@ class bitfield: 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): + 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" \ @@ -110,7 +115,7 @@ class ConfigurationError(Exception): 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() @@ -156,7 +161,7 @@ def parse_config(bnf, regs, file): 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) @@ -206,12 +211,27 @@ def parse_all_configs(configs): 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 @@ -227,6 +247,9 @@ def main(): 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]) @@ -240,6 +263,8 @@ def main(): list_regs(search_regs(regs, a)) return + if o in ("-n", "--non-zero"): + options['non-zero'] = True if not args: usage(sys.argv[0]) @@ -250,20 +275,19 @@ def main(): 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) + value_iter = iter(sys.stdin.readline, '') + + try: + for value in value_iter: + decode_value(reg, value.strip(), options) + except KeyboardInterrupt, e: + pass return 0