Exemple #1
0
	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
Exemple #2
0
	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
Exemple #3
0
	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)