rggen-systemverilog 0.21.1 → 0.25.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +2 -2
  4. data/lib/rggen/systemverilog/common.rb +0 -24
  5. data/lib/rggen/systemverilog/common/factories.rb +1 -1
  6. data/lib/rggen/systemverilog/common/feature.rb +3 -3
  7. data/lib/rggen/systemverilog/common/utility.rb +5 -1
  8. data/lib/rggen/systemverilog/common/utility/class_definition.rb +12 -4
  9. data/lib/rggen/systemverilog/common/utility/data_object.rb +1 -2
  10. data/lib/rggen/systemverilog/common/utility/function_definition.rb +16 -4
  11. data/lib/rggen/systemverilog/common/utility/identifier.rb +25 -22
  12. data/lib/rggen/systemverilog/common/utility/local_scope.rb +9 -7
  13. data/lib/rggen/systemverilog/common/utility/module_definition.rb +12 -4
  14. data/lib/rggen/systemverilog/common/utility/package_definition.rb +4 -4
  15. data/lib/rggen/systemverilog/ral.rb +20 -26
  16. data/lib/rggen/systemverilog/ral/bit_field/type.rb +2 -2
  17. data/lib/rggen/systemverilog/ral/bit_field/type/rof.rb +5 -0
  18. data/lib/rggen/systemverilog/ral/setup.rb +1 -1
  19. data/lib/rggen/systemverilog/rtl.rb +37 -41
  20. data/lib/rggen/systemverilog/rtl/bit_field/sv_rtl_top.rb +11 -47
  21. data/lib/rggen/systemverilog/rtl/bit_field/type.rb +1 -2
  22. data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c_wc_woc.erb +19 -0
  23. data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c_wc_woc.rb +54 -0
  24. data/lib/rggen/systemverilog/rtl/bit_field/type/ro.erb +15 -4
  25. data/lib/rggen/systemverilog/rtl/bit_field/type/ro.rb +1 -1
  26. data/lib/rggen/systemverilog/rtl/bit_field/type/rof.erb +15 -4
  27. data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s_ws_wos.erb +19 -0
  28. data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s_ws_wos.rb +44 -0
  29. data/lib/rggen/systemverilog/rtl/bit_field/type/rw_w1_wo_wo1.erb +15 -7
  30. data/lib/rggen/systemverilog/rtl/bit_field/type/rw_w1_wo_wo1.rb +3 -3
  31. data/lib/rggen/systemverilog/rtl/bit_field/type/rwc.erb +15 -7
  32. data/lib/rggen/systemverilog/rtl/bit_field/type/rwc.rb +2 -2
  33. data/lib/rggen/systemverilog/rtl/bit_field/type/rwe_rwl.erb +18 -0
  34. data/lib/rggen/systemverilog/rtl/bit_field/type/rwe_rwl.rb +34 -0
  35. data/lib/rggen/systemverilog/rtl/bit_field/type/rws.erb +13 -7
  36. data/lib/rggen/systemverilog/rtl/bit_field/type/rws.rb +3 -3
  37. data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc.erb +19 -0
  38. data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc.rb +37 -0
  39. data/lib/rggen/systemverilog/rtl/bit_field/type/w0t_w1t.erb +18 -0
  40. data/lib/rggen/systemverilog/rtl/bit_field/type/{w0crs_w1crs.rb → w0t_w1t.rb} +7 -5
  41. data/lib/rggen/systemverilog/rtl/bit_field/type/w0trg_w1trg.rb +1 -1
  42. data/lib/rggen/systemverilog/rtl/bit_field/type/wrc_wrs.erb +18 -0
  43. data/lib/rggen/systemverilog/rtl/bit_field/type/{w0src_w1src.rb → wrc_wrs.rb} +7 -5
  44. data/lib/rggen/systemverilog/rtl/bit_field_index.rb +52 -0
  45. data/lib/rggen/systemverilog/rtl/feature.rb +8 -6
  46. data/lib/rggen/systemverilog/rtl/indirect_index.rb +35 -0
  47. data/lib/rggen/systemverilog/rtl/partial_sum.rb +5 -6
  48. data/lib/rggen/systemverilog/rtl/register/type.rb +1 -56
  49. data/lib/rggen/systemverilog/rtl/register/type/external.rb +8 -20
  50. data/lib/rggen/systemverilog/rtl/register/type/indirect.rb +2 -26
  51. data/lib/rggen/systemverilog/rtl/register_block/protocol.rb +14 -8
  52. data/lib/rggen/systemverilog/rtl/register_block/protocol/apb.rb +10 -10
  53. data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.rb +52 -50
  54. data/lib/rggen/systemverilog/rtl/register_block/sv_rtl_top.rb +3 -7
  55. data/lib/rggen/systemverilog/rtl/register_index.rb +17 -15
  56. data/lib/rggen/systemverilog/rtl/register_type.rb +69 -0
  57. data/lib/rggen/systemverilog/rtl/setup.rb +1 -1
  58. data/lib/rggen/systemverilog/version.rb +1 -1
  59. metadata +21 -48
  60. data/lib/rggen/systemverilog/ral/bit_field/type/reserved_rof.rb +0 -5
  61. data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c.erb +0 -15
  62. data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c.rb +0 -43
  63. data/lib/rggen/systemverilog/rtl/bit_field/type/reserved.erb +0 -3
  64. data/lib/rggen/systemverilog/rtl/bit_field/type/reserved.rb +0 -7
  65. data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s.erb +0 -13
  66. data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s.rb +0 -32
  67. data/lib/rggen/systemverilog/rtl/bit_field/type/rwe.erb +0 -10
  68. data/lib/rggen/systemverilog/rtl/bit_field/type/rwe.rb +0 -26
  69. data/lib/rggen/systemverilog/rtl/bit_field/type/rwl.erb +0 -10
  70. data/lib/rggen/systemverilog/rtl/bit_field/type/rwl.rb +0 -26
  71. data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w1crs.erb +0 -10
  72. data/lib/rggen/systemverilog/rtl/bit_field/type/w0src_w1src.erb +0 -10
@@ -1,11 +1,19 @@
1
- rggen_bit_field_rw_wo #(
1
+ rggen_bit_field #(
2
2
  .WIDTH (<%= width %>),
3
3
  .INITIAL_VALUE (<%= initial_value %>),
4
- .WRITE_ONLY (<%= write_only %>),
5
- .WRITE_ONCE (<%= write_once %>)
4
+ .SW_READ_ACTION (<%= read_action %>),
5
+ .SW_WRITE_ONCE (<%= write_once %>)
6
6
  ) u_bit_field (
7
- .i_clk (<%= clock %>),
8
- .i_rst_n (<%= reset %>),
9
- .bit_field_if (<%= bit_field_if %>),
10
- .o_value (<%= value_out[loop_variables] %>)
7
+ .i_clk (<%= clock %>),
8
+ .i_rst_n (<%= reset %>),
9
+ .bit_field_if (<%= bit_field_if %>),
10
+ .i_sw_write_enable ('1),
11
+ .i_hw_write_enable ('0),
12
+ .i_hw_write_data ('0),
13
+ .i_hw_set ('0),
14
+ .i_hw_clear ('0),
15
+ .i_value ('0),
16
+ .i_mask ('1),
17
+ .o_value (<%= value_out[loop_variables] %>),
18
+ .o_value_unmasked ()
11
19
  );
@@ -4,7 +4,7 @@ RgGen.define_list_item_feature(:bit_field, :type, [:rw, :w1, :wo, :wo1]) do
4
4
  sv_rtl do
5
5
  build do
6
6
  output :value_out, {
7
- name: "o_#{full_name}", data_type: :logic, width: width,
7
+ name: "o_#{full_name}", width: width,
8
8
  array_size: array_size, array_format: array_port_format
9
9
  }
10
10
  end
@@ -13,8 +13,8 @@ RgGen.define_list_item_feature(:bit_field, :type, [:rw, :w1, :wo, :wo1]) do
13
13
 
14
14
  private
15
15
 
16
- def write_only
17
- bit_field.write_only? && 1 || 0
16
+ def read_action
17
+ bit_field.readable? && 'RGGEN_READ_DEFAULT' || 'RGGEN_READ_NONE'
18
18
  end
19
19
 
20
20
  def write_once
@@ -1,10 +1,18 @@
1
- rggen_bit_field_rwc #(
1
+ rggen_bit_field #(
2
2
  .WIDTH (<%= width %>),
3
- .INITIAL_VALUE (<%= initial_value %>)
3
+ .INITIAL_VALUE (<%= initial_value %>),
4
+ .HW_CLEAR_WIDTH (1)
4
5
  ) u_bit_field (
5
- .i_clk (<%= clock %>),
6
- .i_rst_n (<%= reset %>),
7
- .bit_field_if (<%= bit_field_if %>),
8
- .i_clear (<%= clear_signal %>),
9
- .o_value (<%= value_out[loop_variables] %>)
6
+ .i_clk (<%= clock %>),
7
+ .i_rst_n (<%= reset %>),
8
+ .bit_field_if (<%= bit_field_if %>),
9
+ .i_sw_write_enable ('1),
10
+ .i_hw_write_enable ('0),
11
+ .i_hw_write_data ('0),
12
+ .i_hw_set ('0),
13
+ .i_hw_clear (<%= clear_signal %>),
14
+ .i_value ('0),
15
+ .i_mask ('1),
16
+ .o_value (<%= value_out[loop_variables] %>),
17
+ .o_value_unmasked ()
10
18
  );
@@ -5,12 +5,12 @@ RgGen.define_list_item_feature(:bit_field, :type, :rwc) do
5
5
  build do
6
6
  unless bit_field.reference?
7
7
  input :clear, {
8
- name: "i_#{full_name}_clear", data_type: :logic, width: 1,
8
+ name: "i_#{full_name}_clear", width: 1,
9
9
  array_size: array_size, array_format: array_port_format
10
10
  }
11
11
  end
12
12
  output :value_out, {
13
- name: "o_#{full_name}", data_type: :logic, width: width,
13
+ name: "o_#{full_name}", width: width,
14
14
  array_size: array_size, array_format: array_port_format
15
15
  }
16
16
  end
@@ -0,0 +1,18 @@
1
+ rggen_bit_field #(
2
+ .WIDTH (<%= width %>),
3
+ .INITIAL_VALUE (<%= initial_value %>),
4
+ .SW_WRITE_ENABLE_POLARITY (<%= polarity %>)
5
+ ) u_bit_field (
6
+ .i_clk (<%= clock %>),
7
+ .i_rst_n (<%= reset %>),
8
+ .bit_field_if (<%= bit_field_if %>),
9
+ .i_sw_write_enable (<%= control_signal %>),
10
+ .i_hw_write_enable ('0),
11
+ .i_hw_write_data ('0),
12
+ .i_hw_set ('0),
13
+ .i_hw_clear ('0),
14
+ .i_value ('0),
15
+ .i_mask ('1),
16
+ .o_value (<%= value_out[loop_variables] %>),
17
+ .o_value_unmasked ()
18
+ );
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:rwe, :rwl]) do
4
+ sv_rtl do
5
+ build do
6
+ unless bit_field.reference?
7
+ input :control, {
8
+ name: "i_#{full_name}_#{enable_or_lock}", width: 1,
9
+ array_size: array_size, array_format: array_port_format
10
+ }
11
+ end
12
+ output :value_out, {
13
+ name: "o_#{full_name}", width: width,
14
+ array_size: array_size, array_format: array_port_format
15
+ }
16
+ end
17
+
18
+ main_code :bit_field, from_template: true
19
+
20
+ private
21
+
22
+ def enable_or_lock
23
+ { rwe: :enable, rwl: :lock }[bit_field.type]
24
+ end
25
+
26
+ def control_signal
27
+ reference_bit_field || control[loop_variables]
28
+ end
29
+
30
+ def polarity
31
+ { rwe: 'RGGEN_ACTIVE_HIGH', rwl: 'RGGEN_ACTIVE_LOW' }[bit_field.type]
32
+ end
33
+ end
34
+ end
@@ -1,11 +1,17 @@
1
- rggen_bit_field_rws #(
1
+ rggen_bit_field #(
2
2
  .WIDTH (<%= width %>),
3
3
  .INITIAL_VALUE (<%= initial_value %>)
4
4
  ) u_bit_field (
5
- .i_clk (<%= clock %>),
6
- .i_rst_n (<%= reset %>),
7
- .bit_field_if (<%= bit_field_if %>),
8
- .i_set (<%= set_signal %>),
9
- .i_value (<%= value_in[loop_variables] %>),
10
- .o_value (<%= value_out[loop_variables] %>)
5
+ .i_clk (<%= clock %>),
6
+ .i_rst_n (<%= reset %>),
7
+ .bit_field_if (<%= bit_field_if %>),
8
+ .i_sw_write_enable ('1),
9
+ .i_hw_write_enable (<%= set_signal %>),
10
+ .i_hw_write_data (<%= value_in[loop_variables] %>),
11
+ .i_hw_set ('0),
12
+ .i_hw_clear ('0),
13
+ .i_value ('0),
14
+ .i_mask ('1),
15
+ .o_value (<%= value_out[loop_variables] %>),
16
+ .o_value_unmasked ()
11
17
  );
@@ -5,16 +5,16 @@ RgGen.define_list_item_feature(:bit_field, :type, :rws) do
5
5
  build do
6
6
  unless bit_field.reference?
7
7
  input :set, {
8
- name: "i_#{full_name}_set", data_type: :logic, width: 1,
8
+ name: "i_#{full_name}_set", width: 1,
9
9
  array_size: array_size, array_format: array_port_format
10
10
  }
11
11
  end
12
12
  input :value_in, {
13
- name: "i_#{full_name}", data_type: :logic, width: width,
13
+ name: "i_#{full_name}", width: width,
14
14
  array_size: array_size, array_format: array_port_format
15
15
  }
16
16
  output :value_out, {
17
- name: "o_#{full_name}", data_type: :logic, width: width,
17
+ name: "o_#{full_name}", width: width,
18
18
  array_size: array_size, array_format: array_port_format
19
19
  }
20
20
  end
@@ -0,0 +1,19 @@
1
+ rggen_bit_field #(
2
+ .WIDTH (<%= width %>),
3
+ .INITIAL_VALUE (<%= initial_value %>),
4
+ .SW_READ_ACTION (<%= read_action %>),
5
+ .SW_WRITE_ACTION (<%= write_action %>)
6
+ ) u_bit_field (
7
+ .i_clk (<%= clock %>),
8
+ .i_rst_n (<%= reset %>),
9
+ .bit_field_if (<%= bit_field_if %>),
10
+ .i_sw_write_enable ('1),
11
+ .i_hw_write_enable ('0),
12
+ .i_hw_write_data ('0),
13
+ .i_hw_set ('0),
14
+ .i_hw_clear ('0),
15
+ .i_value ('0),
16
+ .i_mask ('1),
17
+ .o_value (<%= value_out[loop_variables] %>),
18
+ .o_value_unmasked ()
19
+ );
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(
4
+ :bit_field, :type, [:w0crs, :w0src, :w1crs, :w1src, :wcrs, :wsrc]
5
+ ) do
6
+ sv_rtl do
7
+ build do
8
+ output :value_out, {
9
+ name: "o_#{full_name}", width: width,
10
+ array_size: array_size, array_format: array_port_format
11
+ }
12
+ end
13
+
14
+ main_code :bit_field, from_template: true
15
+
16
+ private
17
+
18
+ def read_action
19
+ read_set? && 'RGGEN_READ_SET' || 'RGGEN_READ_CLEAR'
20
+ end
21
+
22
+ def read_set?
23
+ [:w0crs, :w1crs, :wcrs].include?(bit_field.type)
24
+ end
25
+
26
+ def write_action
27
+ {
28
+ w0crs: 'RGGEN_WRITE_0_CLEAR',
29
+ w0src: 'RGGEN_WRITE_0_SET',
30
+ w1crs: 'RGGEN_WRITE_1_CLEAR',
31
+ w1src: 'RGGEN_WRITE_1_SET',
32
+ wcrs: 'RGGEN_WRITE_CLEAR',
33
+ wsrc: 'RGGEN_WRITE_SET'
34
+ }[bit_field.type]
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,18 @@
1
+ rggen_bit_field #(
2
+ .WIDTH (<%= width %>),
3
+ .INITIAL_VALUE (<%= initial_value %>),
4
+ .SW_WRITE_ACTION (<%= write_action %>)
5
+ ) u_bit_field (
6
+ .i_clk (<%= clock %>),
7
+ .i_rst_n (<%= reset %>),
8
+ .bit_field_if (<%= bit_field_if %>),
9
+ .i_sw_write_enable ('1),
10
+ .i_hw_write_enable ('0),
11
+ .i_hw_write_data ('0),
12
+ .i_hw_set ('0),
13
+ .i_hw_clear ('0),
14
+ .i_value ('0),
15
+ .i_mask ('1),
16
+ .o_value (<%= value_out[loop_variables] %>),
17
+ .o_value_unmasked ()
18
+ );
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- RgGen.define_list_item_feature(:bit_field, :type, [:w0crs, :w1crs]) do
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:w0t, :w1t]) do
4
4
  sv_rtl do
5
5
  build do
6
6
  output :value_out, {
7
- name: "o_#{full_name}", data_type: :logic, width: width,
7
+ name: "o_#{full_name}", width: width,
8
8
  array_size: array_size, array_format: array_port_format
9
9
  }
10
10
  end
@@ -13,9 +13,11 @@ RgGen.define_list_item_feature(:bit_field, :type, [:w0crs, :w1crs]) do
13
13
 
14
14
  private
15
15
 
16
- def clear_value
17
- value = (bit_field.type == :w0crs && 0) || 1
18
- bin(value, 1)
16
+ def write_action
17
+ {
18
+ w0t: 'RGGEN_WRITE_0_TOGGLE',
19
+ w1t: 'RGGEN_WRITE_1_TOGGLE'
20
+ }[bit_field.type]
19
21
  end
20
22
  end
21
23
  end
@@ -4,7 +4,7 @@ RgGen.define_list_item_feature(:bit_field, :type, [:w0trg, :w1trg]) do
4
4
  sv_rtl do
5
5
  build do
6
6
  output :trigger, {
7
- name: "o_#{full_name}_trigger", data_type: :logic, width: width,
7
+ name: "o_#{full_name}_trigger", width: width,
8
8
  array_size: array_size, array_format: array_port_format
9
9
  }
10
10
  end
@@ -0,0 +1,18 @@
1
+ rggen_bit_field #(
2
+ .WIDTH (<%= width %>),
3
+ .INITIAL_VALUE (<%= initial_value %>),
4
+ .SW_READ_ACTION (<%= read_action %>)
5
+ ) u_bit_field (
6
+ .i_clk (<%= clock %>),
7
+ .i_rst_n (<%= reset %>),
8
+ .bit_field_if (<%= bit_field_if %>),
9
+ .i_sw_write_enable ('1),
10
+ .i_hw_write_enable ('0),
11
+ .i_hw_write_data ('0),
12
+ .i_hw_set ('0),
13
+ .i_hw_clear ('0),
14
+ .i_value ('0),
15
+ .i_mask ('1),
16
+ .o_value (<%= value_out[loop_variables] %>),
17
+ .o_value_unmasked ()
18
+ );
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- RgGen.define_list_item_feature(:bit_field, :type, [:w0src, :w1src]) do
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:wrc, :wrs]) do
4
4
  sv_rtl do
5
5
  build do
6
6
  output :value_out, {
7
- name: "o_#{full_name}", data_type: :logic, width: width,
7
+ name: "o_#{full_name}", width: width,
8
8
  array_size: array_size, array_format: array_port_format
9
9
  }
10
10
  end
@@ -13,9 +13,11 @@ RgGen.define_list_item_feature(:bit_field, :type, [:w0src, :w1src]) do
13
13
 
14
14
  private
15
15
 
16
- def set_value
17
- value = (bit_field.type == :w0src && 0) || 1
18
- bin(value, 1)
16
+ def read_action
17
+ {
18
+ wrc: 'RGGEN_READ_CLEAR',
19
+ wrs: 'RGGEN_READ_SET'
20
+ }[bit_field.type]
19
21
  end
20
22
  end
21
23
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module SystemVerilog
5
+ module RTL
6
+ module BitFieldIndex
7
+ EXPORTED_METHODS = [
8
+ :local_index, :local_indices, :loop_variables, :array_size
9
+ ].freeze
10
+
11
+ def self.included(feature)
12
+ feature.module_eval do
13
+ EXPORTED_METHODS.each { |m| export m }
14
+ end
15
+ end
16
+
17
+ def local_index
18
+ create_identifier(local_index_name)
19
+ end
20
+
21
+ def local_indices
22
+ [*register.local_indices, local_index_name]
23
+ end
24
+
25
+ def loop_variables
26
+ (inside_loop? || nil) &&
27
+ [*register.loop_variables, local_index].compact
28
+ end
29
+
30
+ def array_size
31
+ (inside_loop? || nil) &&
32
+ [
33
+ *register_files.flat_map(&:array_size),
34
+ *register.array_size,
35
+ *bit_field.sequence_size
36
+ ].compact
37
+ end
38
+
39
+ private
40
+
41
+ def local_index_name
42
+ (bit_field.sequential? || nil) &&
43
+ loop_index((register.loop_variables&.size || 0) + 1)
44
+ end
45
+
46
+ def inside_loop?
47
+ register.inside_loop? || bit_field.sequential?
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -16,10 +16,12 @@ module RgGen
16
16
  InterfaceInstance.new(attributes, &block)
17
17
  end
18
18
 
19
- def create_argument(direction, attributes, &block)
20
- DataObject.new(
21
- :argument, attributes.merge(direction: direction), &block
22
- )
19
+ def create_port(direction, attributes, &block)
20
+ attributes =
21
+ { data_type: 'logic' }
22
+ .merge(attributes)
23
+ .merge(direction: direction)
24
+ DataObject.new(:argument, attributes, &block)
23
25
  end
24
26
 
25
27
  def create_if_port(_, attributes, &block)
@@ -34,8 +36,8 @@ module RgGen
34
36
 
35
37
  define_entity :logic, :create_variable, :variable, -> { component }
36
38
  define_entity :interface, :create_if_instance, :variable, -> { component }
37
- define_entity :input, :create_argument, :port, -> { register_block }
38
- define_entity :output, :create_argument, :port, -> { register_block }
39
+ define_entity :input, :create_port, :port, -> { register_block }
40
+ define_entity :output, :create_port, :port, -> { register_block }
39
41
  define_entity :interface_port, :create_if_port, :port, -> { register_block }
40
42
  define_entity :parameter, :create_parameter, :parameter, -> { register_block }
41
43
  define_entity :localparam, :create_parameter, :parameter, -> { component }
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module SystemVerilog
5
+ module RTL
6
+ module IndirectIndex
7
+ private
8
+
9
+ def index_fields
10
+ @index_fields ||=
11
+ register.collect_index_fields(register_block.bit_fields)
12
+ end
13
+
14
+ def index_width
15
+ @index_width ||= index_fields.sum(&:width)
16
+ end
17
+
18
+ def index_values
19
+ loop_variables = register.local_loop_variables
20
+ register.index_entries.zip(index_fields).map do |entry, field|
21
+ if entry.array_index?
22
+ loop_variables.shift[0, field.width]
23
+ else
24
+ hex(entry.value, field.width)
25
+ end
26
+ end
27
+ end
28
+
29
+ def indirect_index_assignment
30
+ assign(indirect_index, concat(index_fields.map(&:value)))
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end