X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=bitfield;h=8bb8d352d7663aafdfbeae782ff19e6063ad5c5c;hb=8554371abcda4bc7904c79f79c9ff9dfa0d699e8;hp=3b34aeb5b7514befdd0b9edc277cec373f9997fa;hpb=f67af38751822cf0abd0c9c5ac2956d2869f9530;p=bitfield diff --git a/bitfield b/bitfield index 3b34aeb..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)