Mercurial > lcfOS
view python/ppci/target/token.py @ 391:a139da1f44f6
Merge
author | Windel Bouwman |
---|---|
date | Fri, 16 May 2014 12:30:10 +0200 |
parents | 86b02c98a717 |
children | 988f3fb861e4 |
line wrap: on
line source
import struct def u16(h): return struct.pack('<H', h) def u32(x): return struct.pack('<I', x) def val2bit(v, bits): b = [] for i in range(bits): b.append(bool((1<<i) & v)) #b.reverse() return b def bit_range(b, e): """ Property generator function """ getter = lambda s: s[b:e] def setter(s, v): s[b:e] = v return property(getter, setter) class Token: def __init__(self, bitsize): self.bitsize = bitsize self.bit_value = 0 def set_bit(self, i, value): value = bool(value) assert i in range(0, self.bitsize) mask = 1 << i if value: self.bit_value |= mask else: self.bit_value &= (~mask) def __getitem__(self, key): return False def __setitem__(self, key, value): if type(key) is int: self.set_bit(key, value) elif type(key) is slice: assert key.step is None bits = key.stop - key.start value_bits = val2bit(value, bits) for i in range(key.start, key.stop): self.set_bit(i, value_bits[i - key.start]) else: raise KeyError()