X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=bitfield;h=8bb8d352d7663aafdfbeae782ff19e6063ad5c5c;hb=8554371abcda4bc7904c79f79c9ff9dfa0d699e8;hp=5ade7af4fac6e03832e4d294cc7bae86aa14e284;hpb=d9bbf176f2c7bc78746e2817d481b2bcbb8ab699;p=bitfield diff --git a/bitfield b/bitfield index 5ade7af..8bb8d35 100644 --- a/bitfield +++ b/bitfield @@ -48,6 +48,15 @@ class bitfield: return self.values[value] return None + @staticmethod + def mask_and_shift_to_bits(width, mask, shift): + bits = [] + val = mask << shift + for i in range(0, width): + if mask & (1 << i): + bits.append(width - i - 1 - shift) + return bits + @staticmethod def parse_bitfield(line, reg): a = line.split(None, 1) @@ -58,15 +67,24 @@ class bitfield: bits = [] for s in range_str.split(','): if ':' in s: - (start, end) = s.split(':') + (start, end) = map( \ + lambda s: reg.bit_number(int(s)), + s.split(':')) start = reg.bit_number(int(start)) end = reg.bit_number(int(end)) bits.extend(range(start, end + 1, 1)) + elif '<<' in s: + (mask, shift) = map(lambda s: int(s.strip()), + s.split('<<')) + bits.extend(bitfield.mask_and_shift_to_bits( \ + reg.width, mask, shift)) else: bits.append(reg.bit_number(int(s))) return bitfield(bits, name) + + @staticmethod def parse_value(line): a = line.split(None, 1) @@ -178,6 +196,8 @@ def parse_config(bnf, regs, file): + "fields in %s") % id) order_str = t[1].strip().lower() + order_str = order_str.replace(' ', '-') + if order_str not in order_map.keys(): raise ConfigurationError(file, "Invalid bit order %s in %s" % \