def set_value(self, value, addr, size, offset, **kwargs): '''Writing a value of any arbitrary size (max. unsigned int 64) and offset to a register Parameters ---------- value : int, str The register value (int, long, bit string) to be written. addr : int The register address. size : int Bit size/length of the value to be written to the register. offset : int Offset of the value to be written to the register (in number of bits). Returns ------- nothing ''' div_offset, mod_offset = divmod(offset, 8) div_size, mod_size = divmod(size + mod_offset, 8) if mod_size: div_size += 1 if mod_offset == 0 and mod_size == 0: reg = BitLogic.from_value(0, size=div_size * 8) else: ret = self._intf.read(self._base_addr + addr + div_offset, size=div_size) reg = BitLogic() reg.frombytes(ret.tostring()) reg[size + mod_offset - 1:mod_offset] = value self._intf.write(self._base_addr + addr + div_offset, data=array.array('B', reg.tobytes()))
def set_value(self, value, addr, size, offset, **kwargs): '''Writing a value of any arbitrary size (max. unsigned int 64) and offset to a register Parameters ---------- value : int, str The register value (int, long, bit string) to be written. addr : int The register address. size : int Bit size/length of the value to be written to the register. offset : int Offset of the value to be written to the register (in number of bits). Returns ------- nothing ''' div_offset, mod_offset = divmod(offset, 8) div_size, mod_size = divmod(size + mod_offset, 8) if mod_size: div_size += 1 if mod_offset == 0 and mod_size == 0: reg = BitLogic.from_value(0, size=div_size * 8) else: ret = self._intf.read(self._base_addr + addr + div_offset, size=div_size) reg = BitLogic() reg.frombytes(tobytes(ret)) reg[size + mod_offset - 1:mod_offset] = value self._intf.write(self._base_addr + addr + div_offset, data=array.array('B', reg.tobytes()))
def set_value(self, value, addr, size, offset, **kwargs): '''Writing a value of any arbitrary size (max. unsigned int 64) and offset to a register Parameters ---------- value : int, str The register value (int, long, bit string) to be written. addr : int The register address. size : int Bit size/length of the value to be written to the register. offset : int Offset of the value to be written to the register (in number of bits). Returns ------- nothing ''' if not size and isinstance(value, (int, long)): raise ValueError('Size must be greater than zero') if isinstance(value, (int, long)) and value.bit_length() > size: raise ValueError('Value is too big for given size') elif isinstance(value, basestring) and size and len(value) != size: raise ValueError('Bit string does not match to the given size') div, mod = divmod(size + offset, 8) if mod: div += 1 ret = self._intf.read(self._base_addr + addr, size=div) reg = BitLogic() reg.frombytes(ret.tostring()) if isinstance(value, (int, long)): reg[size + offset - 1:offset] = BitLogic.from_value(value, size=size) elif isinstance(value, basestring): reg[size + offset - 1:offset] = BitLogic(value) else: raise ValueError('Type not supported: %s' % type(value)) self._intf.write(self._base_addr + addr, data=array('B', reg.tobytes()))