class OrigenARMDebug::DAP

This is the top-level model that instantiates the DP and APs

Attributes

dps[R]
ext_aps[R]
jtag_aps[R]
mem_aps[R]

Public Class Methods

new(options = {}) click to toggle source
# File lib/origen_arm_debug/dap.rb, line 8
def initialize(options = {})
  @dps = []
  @mem_aps = []         # Array of MEM-APs
  @jtag_aps = []        # Array of JTAG-APs
  @ext_aps = []         # Array of 'extension' APs

  instantiate_subblocks(options)
end

Public Instance Methods

add_ap(name, options) click to toggle source

Method to add additional Access Ports (MEM-AP)

@param [Integer] name Short name for mem_ap that is being created @param [Hash] options Implemenation specific details

@examples

arm_debug.add_ap('alt_ahbapi', { class_name: 'OrigenARMDebug::MemAP', base_address: 0x02000000 })
# File lib/origen_arm_debug/dap.rb, line 71
def add_ap(name, options)
  domain name.to_sym
  ap = sub_block(name.to_sym, options)

  if options[:class_name] == 'MemAP'
    mem_aps << ap
  elsif options[:class_name] == 'JTAGAP'
    jtag_aps << ap
  else
    ext_aps << ap
  end
end
aps() click to toggle source

Returns an array containing all APs

# File lib/origen_arm_debug/dap.rb, line 85
def aps
  mem_aps + jtag_aps + ext_aps
end
instantiate_subblocks(options = {}) click to toggle source
# File lib/origen_arm_debug/dap.rb, line 17
def instantiate_subblocks(options = {})
  if options[:swd] || parent.respond_to?(:swd)
    dps << sub_block(:sw_dp, class_name: 'SW_DP')
  end

  if options[:jtag] || parent.respond_to?(:jtag)
    options[:class_name] = 'JTAG_DP'
    dps << sub_block(:jtag_dp, options)
  end

  Array(options[:mem_aps]).each do |name, base_address|
    if base_address.is_a?(Hash)
      ap_opts = { class_name: 'MemAP' }.merge(base_address)
    else
      ap_opts = { class_name: 'MemAP', base_address: base_address }
    end

    add_ap(name, ap_opts)
  end

  Array(options[:jtag_aps]).each do |name, base_address|
    if base_address.is_a?(Hash)
      ap_opts = { class_name: 'JTAGAP' }.merge(base_address)
    else
      ap_opts = { class_name: 'JTAGAP', base_address: base_address }
    end

    add_ap(name, ap_opts)
  end

  Array(options[:aps]).each do |name, opts|
    if opts.is_a?(Hash)
      klass = opts.delete(:class_name)
      addr = opts.delete(:base_address)
      if klass.nil? || addr.nil?
        fail "[ARM DEBUG] Error: Must specify class_name and base_address if using 'aps' hash to define APs"
      end
      ap_opts = { class_name: klass, base_address: addr }.merge(opts)
    else
      fail "[ARM DEBUG] Error: Must specify class_name and base_address if using 'aps' hash to define APs"
    end

    add_ap(name, ap_opts)
  end
end