Module: RgGen::SystemVerilog::RTL::BitFieldIndex

Defined in:
lib/rggen/systemverilog/rtl/bit_field_index.rb

Constant Summary collapse

EXPORTED_METHODS =
[
  :local_index, :local_indexes, :loop_variables, :flat_loop_index, :array_size
].freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(feature) ⇒ Object



11
12
13
14
15
# File 'lib/rggen/systemverilog/rtl/bit_field_index.rb', line 11

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

Instance Method Details

#array_sizeObject



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

def array_size
  return unless inside_loop?

  [*register.array_size(hierarchical: true), *bit_field.sequence_size]
end

#flat_loop_indexObject



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

def flat_loop_index
  return unless inside_loop?

  size = array_size
  factors =
    Array.new(size.size) { |i| size[(i + 1)..].inject(1, :*) }
  factors
    .zip(loop_variables)
    .map { |f, v| f == 1 && v || "#{f}*#{v}" }
    .join('+')
end

#local_indexObject



17
18
19
# File 'lib/rggen/systemverilog/rtl/bit_field_index.rb', line 17

def local_index
  create_identifier(local_index_name)
end

#local_indexesObject



21
22
23
# File 'lib/rggen/systemverilog/rtl/bit_field_index.rb', line 21

def local_indexes
  [*register.local_indexes, local_index_name]
end

#loop_variablesObject



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

def loop_variables
  (inside_loop? || nil) &&
    [*register.loop_variables, local_index].compact
end