Module: RgGen::SystemVerilog::RTL::RegisterIndex

Includes:
PartialSum
Defined in:
lib/rggen/systemverilog/rtl/register_index.rb

Constant Summary collapse

EXPORTED_METHODS =
[
  :loop_variables, :local_loop_variables,
  :local_index, :local_indexes,
  :index, :inside_loop?
].freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(feature) ⇒ Object



15
16
17
18
19
20
21
22
23
# File 'lib/rggen/systemverilog/rtl/register_index.rb', line 15

def self.included(feature)
  feature.module_eval do
    EXPORTED_METHODS.each { |m| export m }

    pre_build do
      @base_index = files_and_registers.sum(&:count)
    end
  end
end

Instance Method Details

#index(offset_or_offsets = nil) ⇒ Object



52
53
54
55
56
57
# File 'lib/rggen/systemverilog/rtl/register_index.rb', line 52

def index(offset_or_offsets = nil)
  offset_or_offsets
    .then(&method(:index_operands))
    .then(&method(:partial_sums))
    .then(&method(:reduce_indexes))
end

#inside_loop?Boolean

Returns:

  • (Boolean)


59
60
61
# File 'lib/rggen/systemverilog/rtl/register_index.rb', line 59

def inside_loop?
  component.array? || upper_register_file&.inside_loop? || false
end

#local_indexObject



40
41
42
43
44
45
46
# File 'lib/rggen/systemverilog/rtl/register_index.rb', line 40

def local_index
  (component.array? || nil) &&
    local_index_coefficients
      .zip(local_loop_variables)
      .map { |operands| product(operands, false) }
      .join('+')
end

#local_indexesObject



48
49
50
# File 'lib/rggen/systemverilog/rtl/register_index.rb', line 48

def local_indexes
  [*upper_register_file&.local_indexes, local_index]
end

#local_loop_variablesObject



30
31
32
33
34
35
36
37
38
# File 'lib/rggen/systemverilog/rtl/register_index.rb', line 30

def local_loop_variables
  (component.array? || nil) &&
    begin
      start_depth = (upper_register_file&.loop_variables&.size || 0) + 1
      Array.new(component.array_size.size) do |i|
        create_identifier(loop_index(i + start_depth))
      end
    end
end

#loop_variablesObject



25
26
27
28
# File 'lib/rggen/systemverilog/rtl/register_index.rb', line 25

def loop_variables
  (inside_loop? || nil) &&
    [*upper_register_file&.loop_variables, *local_loop_variables]
end