X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=bitfield;h=3651677f86c29ab8a90d9a67df14fa086ffa4503;hb=27f2cb1942b6391d3081016260e0d29b0ffa74f6;hp=ae9ab29eed906e4f7015bdd396e14b963aad4cc8;hpb=ffe52a7031a2c5e5fb6566c5ecc091841e2fe45b;p=bitfield diff --git a/bitfield b/bitfield index ae9ab29..3651677 100644 --- a/bitfield +++ b/bitfield @@ -71,18 +71,21 @@ 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, 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: @@ -158,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) @@ -210,6 +213,21 @@ def parse_all_configs(configs): def usage(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:], "hlns:", \ @@ -269,8 +287,7 @@ def main(): return for value in values: - i = long(value.strip(), 0) - print r.decode(i, options['non-zero']) + decode_value(r, value.strip(), options) return 0