class AVR::Device

Attributes

cpu[R]
eeprom[R]
flash[R]
oscillator[R]
system_clock[R]

Public Class Methods

new() click to toggle source
# File lib/avr/device.rb, line 111
def initialize
  @cpu = T.let(CPU.new(self), CPU)
  @flash = T.let(Flash.new(flash_size), Flash)
  @eeprom = T.let(EEPROM.new(eeprom_size, cpu), EEPROM)

  @system_clock = T.let(Clock.new('system'), Clock)
  @system_clock.push_sink(cpu.clock)

  @oscillator = T.let(Oscillator.new('oscillator'), Oscillator)
  @oscillator.push_sink(system_clock)

  @data_memory_map_by_address = T.let(nil, T.nilable(T::Hash[Integer, Symbol]))
  @io_registers = T.let(nil, T.nilable(T::Array[T.nilable(Symbol)]))
end

Public Instance Methods

data_memory_map() click to toggle source
# File lib/avr/device.rb, line 20
def data_memory_map; end
data_memory_map_by_address() click to toggle source
# File lib/avr/device.rb, line 59
def data_memory_map_by_address
  @data_memory_map_by_address ||= data_memory_map.each_with_object({}) do |(n, a), h|
    h[a] = n unless n =~ /^_/
  end
end
eeprom_size() click to toggle source
# File lib/avr/device.rb, line 17
def eeprom_size; end
ext_io_register_count() click to toggle source
# File lib/avr/device.rb, line 44
def ext_io_register_count; end
ext_io_register_start() click to toggle source
# File lib/avr/device.rb, line 41
def ext_io_register_start; end
flash_size() click to toggle source
# File lib/avr/device.rb, line 14
def flash_size; end
interrupt_vector_map() click to toggle source
# File lib/avr/device.rb, line 53
def interrupt_vector_map; end
io_register_count() click to toggle source
# File lib/avr/device.rb, line 38
def io_register_count; end
io_register_start() click to toggle source
# File lib/avr/device.rb, line 35
def io_register_start; end
io_registers() click to toggle source
# File lib/avr/device.rb, line 66
def io_registers
  @io_registers ||= (0...io_register_count).map do |i|
    data_memory_map_by_address[io_register_start + i]
  end
end
port_map() click to toggle source
# File lib/avr/device.rb, line 56
def port_map; end
ram_end() click to toggle source
# File lib/avr/device.rb, line 50
def ram_end; end
ram_start() click to toggle source
# File lib/avr/device.rb, line 47
def ram_start; end
register_bit_names_map() click to toggle source
# File lib/avr/device.rb, line 29
def register_bit_names_map; end
register_count() click to toggle source
# File lib/avr/device.rb, line 26
def register_count; end
register_start() click to toggle source
# File lib/avr/device.rb, line 23
def register_start; end
sequential_interrupt_vectors(interrupts) click to toggle source
# File lib/avr/device.rb, line 91
def sequential_interrupt_vectors(interrupts)
  interrupts.each_with_index.each_with_object({}) { |(name, i), h| h[name.to_sym] = i * 2 }
end
sram_size() click to toggle source
# File lib/avr/device.rb, line 11
def sram_size; end
standard_port(port) click to toggle source
# File lib/avr/device.rb, line 73
def standard_port(port)
  {
    pin: data_memory_map["PIN#{port}".to_sym],
    ddr: data_memory_map["DDR#{port}".to_sym],
    port: data_memory_map["PORT#{port}".to_sym],
  }
end
standard_ports(ports) click to toggle source
# File lib/avr/device.rb, line 86
def standard_ports(ports)
  ports.each_with_object({}) { |m, h| h[m] = standard_port(m) }
end
trace_all() click to toggle source
# File lib/avr/device.rb, line 238
def trace_all
  trace_cpu
  trace_sram
  trace_flash
  trace_eeprom
  trace_sreg
  trace_registers
  trace_status_pre_tick
  trace_status_post_tick
end
trace_cpu() click to toggle source
# File lib/avr/device.rb, line 127
def trace_cpu
  cpu.trace do |instruction|
    puts '*** %20s: %s' % [
      'INSTRUCTION TRACE',
      instruction,
    ]
  end
end
trace_eeprom() click to toggle source
# File lib/avr/device.rb, line 201
def trace_eeprom
  eeprom.watch do |memory_byte, old_value, new_value|
    puts '*** %20s: %12s: %4s -> %4s' % [
      'MEMORY TRACE',
      '%s[%04x]' % [memory_byte.memory.name, memory_byte.address],
      memory_byte.format % old_value,
      memory_byte.format % new_value,
    ]
  end
end
trace_flash() click to toggle source
# File lib/avr/device.rb, line 189
def trace_flash
  flash.watch do |memory_byte, old_value, new_value|
    puts '*** %20s: %12s: %4s -> %4s' % [
      'MEMORY TRACE',
      '%s[%04x]' % [memory_byte.memory.name, memory_byte.address],
      memory_byte.format % old_value,
      memory_byte.format % new_value,
    ]
  end
end
trace_registers() click to toggle source
# File lib/avr/device.rb, line 137
def trace_registers
  register_addresses = {}
  cpu.registers.registers.each do |_name, register|
    case register
    when MemoryByteRegister
      register_addresses[register.memory_byte.address] ||= []
      register_addresses[register.memory_byte.address] << register
    when RegisterPair
      register_addresses[register.l.memory_byte.address] ||= []
      register_addresses[register.l.memory_byte.address] << register
      register_addresses[register.h.memory_byte.address] ||= []
      register_addresses[register.h.memory_byte.address] << register
    end
  end
  cpu.sram.watch do |memory_byte, old_value, _new_value|
    registers = register_addresses[memory_byte.address]
    registers&.each do |register|
      puts '*** %20s: %12s: %4s -> %4s' % [
        'REGISTER TRACE',
        register.name,
        register.is_a?(MemoryByteRegister) ? register.format % old_value : '',
        register.format % register.value,
      ]
    end
  end
end
trace_sram() click to toggle source
# File lib/avr/device.rb, line 177
def trace_sram
  cpu.sram.watch do |memory_byte, old_value, new_value|
    puts '*** %20s: %12s: %4s -> %4s' % [
      'MEMORY TRACE',
      '%s[%04x]' % [memory_byte.memory.name, memory_byte.address],
      memory_byte.format % old_value,
      memory_byte.format % new_value,
    ]
  end
end
trace_sreg() click to toggle source
# File lib/avr/device.rb, line 165
def trace_sreg
  cpu.sram.watch do |memory_byte, old_value, new_value|
    if memory_byte.address == cpu.sreg.memory_byte.address
      puts '*** %20s: %s' % [
        'SREG TRACE',
        cpu.sreg.diff_values(old_value, new_value),
      ]
    end
  end
end
trace_status_post_tick() click to toggle source
# File lib/avr/device.rb, line 226
def trace_status_post_tick
  oscillator.push_sink(
    Clock::Sink.new('post-execution status') do
      puts
      puts 'POST-EXECUTION STATUS'
      puts '*********************'
      cpu.print_status
    end
  )
end
trace_status_pre_tick() click to toggle source
# File lib/avr/device.rb, line 213
def trace_status_pre_tick
  oscillator.unshift_sink(
    Clock::Sink.new('pre-execution status') do
      puts
      puts
      puts 'PRE-EXECUTION STATUS'
      puts '********************'
      cpu.print_status
    end
  )
end
word_register_map() click to toggle source
# File lib/avr/device.rb, line 32
def word_register_map; end