class Object

Public Instance Methods

add_terminator(declarations) click to toggle source
# File lib/rggen/vhdl/register_block/vhdl_top.rb, line 96
def add_terminator(declarations)
  declarations.map.with_index do |declaration, i|
    (i == declarations.size - 1) && declaration ||
      declaration + semicolon
  end
end
address_width() click to toggle source
# File lib/rggen/vhdl/register_block/vhdl_top.rb, line 49
def address_width
  register_block.local_address_width
end
architecture_body_code() click to toggle source
# File lib/rggen/vhdl/register_block/vhdl_top.rb, line 78
def architecture_body_code
  code_block(2) do |code|
    register_block.generate_code(code, :register_block, :top_down)
    register_block.generate_code(code, :register_file, :top_down, 1)
  end
end
array_initial_value_rhs() click to toggle source
# File lib/rggen/vhdl/bit_field/vhdl_top.rb, line 71
def array_initial_value_rhs
  value =
    bit_field.initial_values
      .map.with_index { |v, i| v << bit_field.width * i }
      .inject(:|)
  hex(value, bit_field.sequence_size * bit_field.width)
end
array_size() click to toggle source
# File lib/rggen/vhdl/bit_field/type.rb, line 20
def array_size
  bit_field.array_size
end
bit_field_read_data() click to toggle source
# File lib/rggen/vhdl/bit_field/type.rb, line 53
def bit_field_read_data
  register.bit_field_read_data[lsb, width]
end
bit_field_read_mask() click to toggle source
# File lib/rggen/vhdl/bit_field/type.rb, line 41
def bit_field_read_mask
  register.bit_field_read_mask[lsb, width]
end
bit_field_valid() click to toggle source
# File lib/rggen/vhdl/bit_field/type.rb, line 37
def bit_field_valid
  register.bit_field_valid
end
bit_field_value() click to toggle source
# File lib/rggen/vhdl/bit_field/type.rb, line 57
def bit_field_value
  register.bit_field_value[lsb, width]
end
bit_field_write_data() click to toggle source
# File lib/rggen/vhdl/bit_field/type.rb, line 49
def bit_field_write_data
  register.bit_field_write_data[lsb, width]
end
bit_field_write_mask() click to toggle source
# File lib/rggen/vhdl/bit_field/type.rb, line 45
def bit_field_write_mask
  register.bit_field_write_mask[lsb, width]
end
body_code(code) click to toggle source
# File lib/rggen/vhdl/bit_field/vhdl_top.rb, line 89
def body_code(code)
  bit_field.generate_code(code, :bit_field, :top_down)
end
bus_width() click to toggle source
# File lib/rggen/vhdl/register_block/protocol.rb, line 25
def bus_width
  configuration.bus_width
end
byte_size() click to toggle source
# File lib/rggen/vhdl/register/type/external.rb, line 40
def byte_size
  register.byte_size
end
clear_signal() click to toggle source
# File lib/rggen/vhdl/bit_field/type/rwc.rb, line 20
def clear_signal
  reference_bit_field || clear[loop_variables]
end
clock() click to toggle source
# File lib/rggen/vhdl/bit_field/type.rb, line 29
def clock
  register_block.clock
end
clock_or_reset?(declaration) click to toggle source
# File lib/rggen/vhdl/register_block/vhdl_top.rb, line 91
def clock_or_reset?(declaration)
  [clock.to_s, reset.to_s]
    .any? { |port_name| declaration.include?(port_name) }
end
control_signal() click to toggle source
# File lib/rggen/vhdl/bit_field/type/rwe_rwl.rb, line 29
def control_signal
  reference_bit_field || control[loop_variables]
end
control_signal_polarity() click to toggle source
# File lib/rggen/vhdl/bit_field/type/rwe_rwl.rb, line 25
def control_signal_polarity
  { rwe: 'RGGEN_ACTIVE_HIGH', rwl: 'RGGEN_ACTIVE_LOW' }[bit_field.type]
end
default_initial_value() click to toggle source
# File lib/rggen/vhdl/bit_field/vhdl_top.rb, line 50
def default_initial_value
  width = bit_field.width
  repeat_size = bit_field.sequence_size || 1
  value = initial_value_rhs_default
  "repeat(#{value}, #{width}, #{repeat_size})"
end
define_accessor_for_initial_value() click to toggle source
# File lib/rggen/vhdl/bit_field/vhdl_top.rb, line 57
def define_accessor_for_initial_value
  define_singleton_method(:initial_value) do
    if bit_field.initial_value_array?
      array_initial_value_rhs
    elsif bit_field.initial_value?
      initial_value_rhs_default
    end
  end
end
enable_or_lock() click to toggle source
# File lib/rggen/vhdl/bit_field/type/rwe_rwl.rb, line 21
def enable_or_lock
  { rwe: 'enable', rwl: 'lock' }[bit_field.type]
end
full_name() click to toggle source
# File lib/rggen/vhdl/bit_field/type.rb, line 8
def full_name
  bit_field.full_name('_')
end
generic_declarations() click to toggle source
# File lib/rggen/vhdl/register_block/vhdl_top.rb, line 61
def generic_declarations
  register_block
    .declarations[:generic]
    .yield_self(&method(:add_terminator))
end
id_width_value() click to toggle source
# File lib/rggen/vhdl/register_block/protocol/axi4lite.rb, line 38
def id_width_value
  "clip_id_width(#{id_width})"
end
index_fields() click to toggle source
# File lib/rggen/vhdl/register/type/indirect.rb, line 17
def index_fields
  register
    .collect_index_fields(register_block.bit_fields)
    .map(&:value)
end
index_fields_and_values() click to toggle source
# File lib/rggen/vhdl/register/type/indirect.rb, line 30
def index_fields_and_values
  index_fields.zip(index_values)
end
index_values() click to toggle source
# File lib/rggen/vhdl/register/type/indirect.rb, line 23
def index_values
  loop_variables = register.local_loop_variables
  register.index_entries.map do |entry|
    entry.array_index? && loop_variables.shift || entry.value
  end
end
initial_value() click to toggle source
# File lib/rggen/vhdl/bit_field/type.rb, line 24
def initial_value
  index = bit_field.initial_value_array? && bit_field.local_index || 0
  "slice(#{bit_field.initial_value}, #{width}, #{index})"
end
initial_value_name() click to toggle source
# File lib/rggen/vhdl/bit_field/vhdl_top.rb, line 40
def initial_value_name
  "#{bit_field.full_name('_')}_initial_value".upcase
end
initial_value_rhs_default() click to toggle source
# File lib/rggen/vhdl/bit_field/vhdl_top.rb, line 67
def initial_value_rhs_default
  hex(bit_field.register_map.initial_value, bit_field.width)
end
initial_value_width() click to toggle source
# File lib/rggen/vhdl/bit_field/vhdl_top.rb, line 44
def initial_value_width
  width = bit_field.width
  repeat_size = bit_field.sequence_size || 1
  width * repeat_size
end
local_address_width() click to toggle source
# File lib/rggen/vhdl/register_block/protocol.rb, line 29
def local_address_width
  register_block.local_address_width
end
loop_size() click to toggle source
# File lib/rggen/vhdl/bit_field/vhdl_top.rb, line 84
def loop_size
  loop_variable = local_index
  loop_variable && { loop_variable => bit_field.sequence_size }
end
loop_variables() click to toggle source
# File lib/rggen/vhdl/bit_field/type.rb, line 72
def loop_variables
  bit_field.loop_variables
end
lsb() click to toggle source
# File lib/rggen/vhdl/bit_field/type.rb, line 12
def lsb
  bit_field.lsb(bit_field.local_index)
end
mask() click to toggle source
# File lib/rggen/vhdl/bit_field/type.rb, line 61
def mask
  reference_bit_field || "(others => '1')"
end
match_width() click to toggle source
# File lib/rggen/vhdl/register/type/indirect.rb, line 13
def match_width
  register.index_entries.size
end
parameterized_initial_value?() click to toggle source
# File lib/rggen/vhdl/bit_field/vhdl_top.rb, line 36
def parameterized_initial_value?
  bit_field.initial_value? && !bit_field.fixed_initial_value?
end
port_declarations() click to toggle source
# File lib/rggen/vhdl/register_block/vhdl_top.rb, line 67
def port_declarations
  register_block
    .declarations[:port]
    .yield_self(&method(:sort_port_declarations))
    .yield_self(&method(:add_terminator))
end
read_action() click to toggle source
# File lib/rggen/vhdl/bit_field/type/rc_w0c_w1c_wc_woc.rb, line 23
def read_action
  {
    rc: 'RGGEN_READ_CLEAR',
    w0c: 'RGGEN_READ_DEFAULT',
    w1c: 'RGGEN_READ_DEFAULT',
    wc: 'RGGEN_READ_DEFAULT',
    woc: 'RGGEN_READ_NONE'
  }[bit_field.type]
end
read_set?() click to toggle source
# File lib/rggen/vhdl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc.rb, line 21
def read_set?
  [:w0crs, :w1crs, :wcrs].include?(bit_field.type)
end
readable?() click to toggle source
# File lib/rggen/vhdl/register/type.rb, line 10
def readable?
  register.readable?
end
reference_bit_field() click to toggle source
# File lib/rggen/vhdl/bit_field/type.rb, line 65
def reference_bit_field
  bit_field.reference? &&
    bit_field
      .find_reference(register_block.bit_fields)
      .value(bit_field.local_indices, bit_field.reference_width)
end
reference_or_value_in() click to toggle source
# File lib/rggen/vhdl/bit_field/type/ro.rb, line 17
def reference_or_value_in
  bit_field.reference? && reference_bit_field || value_in[loop_variables]
end
register_access() click to toggle source
# File lib/rggen/vhdl/register/type.rb, line 30
def register_access
  register_block.register_access
end
register_active() click to toggle source
# File lib/rggen/vhdl/register/type.rb, line 46
def register_active
  register_block.register_active[[register.index]]
end
register_address() click to toggle source
# File lib/rggen/vhdl/register/type.rb, line 34
def register_address
  register_block.register_address
end
register_read_data() click to toggle source
# File lib/rggen/vhdl/register/type.rb, line 58
def register_read_data
  register_block.register_read_data[[register.index]]
end
register_ready() click to toggle source
# File lib/rggen/vhdl/register/type.rb, line 50
def register_ready
  register_block.register_ready[[register.index]]
end
register_status() click to toggle source
# File lib/rggen/vhdl/register/type.rb, line 54
def register_status
  register_block.register_status[[register.index]]
end
register_strobe() click to toggle source
# File lib/rggen/vhdl/register/type.rb, line 42
def register_strobe
  register_block.register_strobe
end
register_valid() click to toggle source
# File lib/rggen/vhdl/register/type.rb, line 26
def register_valid
  register_block.register_valid
end
register_value(offsets, lsb, width) click to toggle source
# File lib/rggen/vhdl/bit_field/vhdl_top.rb, line 79
def register_value(offsets, lsb, width)
  index = register.index(offsets || register.local_indices)
  register_block.register_value[[index], lsb, width]
end
register_write_data() click to toggle source
# File lib/rggen/vhdl/register/type.rb, line 38
def register_write_data
  register_block.register_write_data
end
reset() click to toggle source
# File lib/rggen/vhdl/bit_field/type.rb, line 33
def reset
  register_block.reset
end
set_signal() click to toggle source
# File lib/rggen/vhdl/bit_field/type/rws.rb, line 23
def set_signal
  reference_bit_field || set[loop_variables]
end
signal_declarations() click to toggle source
# File lib/rggen/vhdl/register_block/vhdl_top.rb, line 74
def signal_declarations
  register_block.declarations[:signal]
end
signals() click to toggle source
# File lib/rggen/vhdl/register/vhdl_top.rb, line 32
def signals
  register.declarations[:signal]
end
sort_port_declarations(declarations) click to toggle source
# File lib/rggen/vhdl/register_block/vhdl_top.rb, line 85
def sort_port_declarations(declarations)
  declarations
    .partition(&method(:clock_or_reset?))
    .flatten
end
start_address() click to toggle source
# File lib/rggen/vhdl/register/type/external.rb, line 36
def start_address
  hex(register.offset_address, address_width)
end
target_feature_key(_configuration, bit_field) click to toggle source
# File lib/rggen/vhdl/bit_field/type.rb, line 78
def target_feature_key(_configuration, bit_field)
  type = bit_field.type
  target_features.key?(type) && type ||
    (error "code generator for #{type} bit field type is not implemented")
end
total_registers() click to toggle source
# File lib/rggen/vhdl/register_block/protocol.rb, line 33
def total_registers
  register_block.files_and_registers.sum(&:count)
end
valid_type?(type) click to toggle source
# File lib/rggen/vhdl/register/type.rb, line 104
def valid_type?(type)
  target_features.key?(type) || type == :default
end
value(offsets = nil, width = nil) click to toggle source
# File lib/rggen/vhdl/bit_field/vhdl_top.rb, line 28
def value(offsets = nil, width = nil)
  value_lsb = bit_field.lsb(offsets&.last || local_index)
  value_width = width || bit_field.width
  register_value(offsets&.slice(0..-2), value_lsb, value_width)
end
value_out_unmasked() click to toggle source
# File lib/rggen/vhdl/bit_field/type/rc_w0c_w1c_wc_woc.rb, line 47
def value_out_unmasked
  bit_field.reference? && value_unmasked[loop_variables] || 'open'
end
value_width() click to toggle source
# File lib/rggen/vhdl/register_block/vhdl_top.rb, line 57
def value_width
  register_block.registers.map(&:width).max
end
width() click to toggle source
# File lib/rggen/vhdl/bit_field/type.rb, line 16
def width
  bit_field.width
end
writable?() click to toggle source
# File lib/rggen/vhdl/register/type.rb, line 14
def writable?
  register.writable?
end
write_action() click to toggle source
# File lib/rggen/vhdl/bit_field/type/rc_w0c_w1c_wc_woc.rb, line 33
def write_action
  {
    rc: 'RGGEN_WRITE_NONE',
    w0c: 'RGGEN_WRITE_0_CLEAR',
    w1c: 'RGGEN_WRITE_1_CLEAR',
    wc: 'RGGEN_WRITE_CLEAR',
    woc: 'RGGEN_WRITE_CLEAR'
  }[bit_field.type]
end
write_enable() click to toggle source
# File lib/rggen/vhdl/bit_field/type/rc_w0c_w1c_wc_woc.rb, line 43
def write_enable
  bit_field.writable? && bin(1, 1) || bin(0, 1)
end
write_once() click to toggle source
# File lib/rggen/vhdl/bit_field/type/rw_w1_wo_wo1.rb, line 19
def write_once
  [:w1, :wo1].include?(bit_field.type)
end
write_one_trigger?() click to toggle source
# File lib/rggen/vhdl/bit_field/type/w0trg_w1trg.rb, line 15
def write_one_trigger?
  bit_field.type == :w1trg
end