def read_memory(self, memory, elem_size_words, addr, length): """ Read from a memory as given in the Architecture. Returns a list of elements as integers of the number of words specified. If a location cannot be read, -1s are returned. """ assert (elem_size_words > 0) assert (length > 0) with self.device_lock: self.assert_not_killed() try: self.resync() # Size of elements to read elem_size_bits = elem_size_words * memory.word_width_bits width_bytes = bits_to_bytes(xxx_pad_width(elem_size_bits)) # Read the data from memory data = self.back_end.memory_read(memory.index, width_bytes, addr, length) # Decode into ints out = [] for element in range(length): out.append(b2i(data[:width_bytes])) data = data[width_bytes:] # Return the value return out except BackEndError, e: self.log(e, source = "Device Communication") return [-1] * length
def read_register(self, register): """ Read a register as given in the Architecture. Returns -1 on error. """ with self.device_lock: self.assert_not_killed() # Get the value from the cache if possible with self.cache_lock: if register in self.cached_registers: return self.cached_registers[register] try: self.resync() # Read the register width_bytes = bits_to_bytes(xxx_pad_width(register.width_bits)) addr = register.addr length = 1 value = b2i(self.back_end.register_read(width_bytes, addr, length)) # Cache and return the value with self.cache_lock: self.cached_registers[register] = value return value except BackEndError, e: self.log(e, source = "Device Communication") return -1
def evaluate(self, expr): """ Evaluate an expression within the context of the system. Expressions should be valid python expressions with various variables defined. """ # When the prefix is not shown, change the prefix of non-prefixed numbers to # the current prefix if not format.format_show_prefix: expr = self._change_default_base(expr, format.format_prefix) # Add the symbols to the evaluation variables local_vars = self.evaluator_local_vars.copy() local_vars.update(self.evaluator_symbol_vars) value = eval(expr, self.evaluator_global_vars, local_vars) if type(value) is str: # Convert strings (of bytes/chars) into an int return b2i(value) else: # Cast everything else to an int return int(value)