def get_global_register_bitsets(self, register_addresses): # TOTO: add sorting """Calculating register bitsets from register addresses. Usage: get_global_register_bitsets([regaddress_1, regaddress_2, ...]) Receives: list of register addresses Returns: list of register bitsets """ register_bitsets = [] for register_address in register_addresses: register_objects = self.get_global_register_objects(addresses=register_address) register_bitset = bitarray(16, endian='little') # TODO remove hardcoded register size, see also below register_bitset.setall(0) register_littleendian = False for register_object in register_objects: if register_object['register_littleendian']: # check for register endianness register_littleendian = True if (16 * register_object['address'] + register_object['offset'] < 16 * (register_address + 1) and 16 * register_object['address'] + register_object['offset'] + register_object['bitlength'] > 16 * register_address): reg = register_utils.bitarray_from_value(value=register_object['value'], size=register_object['bitlength']) if register_object['littleendian']: reg.reverse() # register_bitset[max(0, 16 * (register_object['address'] - register_address) + register_object['offset']):min(16, 16 * (register_object['address'] - register_address) + register_object['offset'] + register_object['bitlength'])] |= reg[max(0, 16 * (register_address - register_object['address']) - register_object['offset']):min(register_object['bitlength'], 16 * (register_address - register_object['address'] + 1) - register_object['offset'])] # [ bit(n) bit(n-1)... bit(0) ] register_bitset[max(0, 16 - 16 * (register_object['address'] - register_address) - register_object['offset'] - register_object['bitlength']):min(16, 16 - 16 * (register_object['address'] - register_address) - register_object['offset'])] |= reg[max(0, register_object['bitlength'] - 16 - 16 * (register_address - register_object['address']) + register_object['offset']):min(register_object['bitlength'], register_object['bitlength'] + 16 - 16 * (register_address - register_object['address'] + 1) + register_object['offset'])] # [ bit(0)... bit(n-1) bit(n) ] else: raise Exception("wrong register object") if register_littleendian: register_bitset.reverse() register_bitsets.append(register_bitset) return register_bitsets
def build_command(self, command_name, **kwargs): """build command from command_name and keyword values Returns ------- command_bitvector : list List of bitarrays. Usage ----- Receives: command name as defined inside xml file, key-value-pairs as defined inside bit stream filed for each command """ # command_name = command_name.lower() command_bitvector = bitarray(0, endian='little') if command_name not in self.commands: raise ValueError('Unknown command %s' % command_name) command_object = self.commands[command_name] command_parts = re.split(r'\s*[+]\s*', command_object['bitstream']) # for index, part in enumerate(command_parts, start = 1): # loop over command parts for part in command_parts: # loop over command parts try: command_part_object = self.commands[part] except KeyError: command_part_object = None if command_part_object and 'bitstream' in command_part_object: # command parts of defined content and length, e.g. Slow, ... if string_is_binary(command_part_object['bitstream']): command_bitvector += bitarray( command_part_object['bitstream'], endian='little') else: command_bitvector += self.build_command(part, **kwargs) elif command_part_object: # Command parts with any content of defined length, e.g. ChipID, Address, ... if part in kwargs: value = kwargs[part] else: raise ValueError('Value of command part %s not given' % part) try: command_bitvector += value except TypeError: # value is no bitarray if string_is_binary(value): value = int(value, 2) try: command_bitvector += register_utils.bitarray_from_value( value=int(value), size=command_part_object['bitlength'], fmt='I') except: raise TypeError("Type of value not supported") elif string_is_binary(part): command_bitvector += bitarray(part, endian='little') # elif part in kwargs.keys(): # command_bitvector += kwargs[command_name] else: raise ValueError("Cannot process command part %s" % part) if command_bitvector.length() != command_object['bitlength']: raise ValueError("Command has unexpected length") if command_bitvector.length() == 0: raise ValueError("Command has length 0") return command_bitvector
def set_chip_address(self, chip_address): if 7 < chip_address < 0: raise ValueError('Chip address out of range: %i' % chip_address) self.chip_id_initialized = True self.chip_address = chip_address self.chip_id = chip_address if self.broadcast: self.chip_id += 0x8 self.chip_id_bitarray = register_utils.bitarray_from_value(value=self.chip_id, size=4, fmt='I') logging.info('Setting chip address to %d (broadcast bit %s)', self.chip_address, 'set' if self.broadcast else 'not set')
def build_command(self, command_name, **kwargs): """build command from command_name and keyword values Returns ------- command_bitvector : list List of bitarrays. Usage ----- Receives: command name as defined inside xml file, key-value-pairs as defined inside bit stream filed for each command """ # command_name = command_name.lower() command_bitvector = bitarray(0, endian='little') if command_name not in self.commands: raise ValueError('Unknown command %s' % command_name) command_object = self.commands[command_name] command_parts = re.split(r'\s*[+]\s*', command_object['bitstream']) # for index, part in enumerate(command_parts, start = 1): # loop over command parts for part in command_parts: # loop over command parts try: command_part_object = self.commands[part] except KeyError: command_part_object = None if command_part_object and 'bitstream'in command_part_object: # command parts of defined content and length, e.g. Slow, ... if string_is_binary(command_part_object['bitstream']): command_bitvector += bitarray(command_part_object['bitstream'], endian='little') else: command_bitvector += self.build_command(part, **kwargs) elif command_part_object: # Command parts with any content of defined length, e.g. ChipID, Address, ... if part in kwargs: value = kwargs[part] else: raise ValueError('Value of command part %s not given' % part) try: command_bitvector += value except TypeError: # value is no bitarray if string_is_binary(value): value = int(value, 2) try: command_bitvector += register_utils.bitarray_from_value(value=int(value), size=command_part_object['bitlength'], fmt='I') except: raise TypeError("Type of value not supported") elif string_is_binary(part): command_bitvector += bitarray(part, endian='little') # elif part in kwargs.keys(): # command_bitvector += kwargs[command_name] else: raise ValueError("Cannot process command part %s" % part) if command_bitvector.length() != command_object['bitlength']: raise ValueError("Command has unexpected length") if command_bitvector.length() == 0: raise ValueError("Command has length 0") return command_bitvector