rggen 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +7 -0
  3. data/.rubocop_todo.yml +91 -0
  4. data/CODE_OF_CONDUCT.md +49 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +31 -0
  7. data/bin/rggen +6 -0
  8. data/lib/rggen/base/component.rb +27 -0
  9. data/lib/rggen/base/component_factory.rb +46 -0
  10. data/lib/rggen/base/hierarchical_accessors.rb +87 -0
  11. data/lib/rggen/base/hierarchical_item_accessors.rb +79 -0
  12. data/lib/rggen/base/item.rb +24 -0
  13. data/lib/rggen/base/item_factory.rb +20 -0
  14. data/lib/rggen/builder/builder.rb +69 -0
  15. data/lib/rggen/builder/category.rb +52 -0
  16. data/lib/rggen/builder/component_entry.rb +50 -0
  17. data/lib/rggen/builder/component_store.rb +42 -0
  18. data/lib/rggen/builder/input_component_store.rb +25 -0
  19. data/lib/rggen/builder/item_store.rb +89 -0
  20. data/lib/rggen/builder/list_item_entry.rb +81 -0
  21. data/lib/rggen/builder/output_component_store.rb +13 -0
  22. data/lib/rggen/builder/simple_item_entry.rb +33 -0
  23. data/lib/rggen/builtins/bit_field/bit_assignment.rb +39 -0
  24. data/lib/rggen/builtins/bit_field/field_model_creation.rb +25 -0
  25. data/lib/rggen/builtins/bit_field/field_model_declaration.rb +9 -0
  26. data/lib/rggen/builtins/bit_field/initial_value.rb +36 -0
  27. data/lib/rggen/builtins/bit_field/name.rb +26 -0
  28. data/lib/rggen/builtins/bit_field/reference.rb +42 -0
  29. data/lib/rggen/builtins/bit_field/reserved.rb +9 -0
  30. data/lib/rggen/builtins/bit_field/ro.rb +19 -0
  31. data/lib/rggen/builtins/bit_field/rw.erb +13 -0
  32. data/lib/rggen/builtins/bit_field/rw.rb +25 -0
  33. data/lib/rggen/builtins/bit_field/type.rb +205 -0
  34. data/lib/rggen/builtins/bit_field/wo.rb +5 -0
  35. data/lib/rggen/builtins/global/address_width.rb +17 -0
  36. data/lib/rggen/builtins/global/data_width.rb +20 -0
  37. data/lib/rggen/builtins/loaders/configuration/json_loader.rb +7 -0
  38. data/lib/rggen/builtins/loaders/configuration/yaml_loader.rb +7 -0
  39. data/lib/rggen/builtins/loaders/register_map/csv_loader.rb +14 -0
  40. data/lib/rggen/builtins/loaders/register_map/xls_loader.rb +19 -0
  41. data/lib/rggen/builtins/loaders/register_map/xlsx_ods_loader.rb +24 -0
  42. data/lib/rggen/builtins/register/accessibility.rb +23 -0
  43. data/lib/rggen/builtins/register/address_decoder.erb +16 -0
  44. data/lib/rggen/builtins/register/address_decoder.rb +92 -0
  45. data/lib/rggen/builtins/register/array.rb +133 -0
  46. data/lib/rggen/builtins/register/field_model_creator.rb +10 -0
  47. data/lib/rggen/builtins/register/field_model_declarations.rb +7 -0
  48. data/lib/rggen/builtins/register/name.rb +26 -0
  49. data/lib/rggen/builtins/register/offset_address.rb +55 -0
  50. data/lib/rggen/builtins/register/read_data.rb +36 -0
  51. data/lib/rggen/builtins/register/reg_model_constructor.rb +17 -0
  52. data/lib/rggen/builtins/register/reg_model_creation.rb +64 -0
  53. data/lib/rggen/builtins/register/reg_model_declaration.rb +13 -0
  54. data/lib/rggen/builtins/register/reg_model_definition.rb +22 -0
  55. data/lib/rggen/builtins/register/shadow.rb +130 -0
  56. data/lib/rggen/builtins/register/shadow_index_configurator.rb +53 -0
  57. data/lib/rggen/builtins/register/uniqueness_validator.rb +48 -0
  58. data/lib/rggen/builtins/register_block/apb.erb +27 -0
  59. data/lib/rggen/builtins/register_block/apb.rb +20 -0
  60. data/lib/rggen/builtins/register_block/base_address.rb +64 -0
  61. data/lib/rggen/builtins/register_block/block_model_constructor.rb +14 -0
  62. data/lib/rggen/builtins/register_block/block_model_default_map_creator.rb +39 -0
  63. data/lib/rggen/builtins/register_block/block_model_definition.rb +18 -0
  64. data/lib/rggen/builtins/register_block/byte_size.rb +37 -0
  65. data/lib/rggen/builtins/register_block/clock_reset.rb +8 -0
  66. data/lib/rggen/builtins/register_block/host_if.rb +46 -0
  67. data/lib/rggen/builtins/register_block/module_definition.rb +13 -0
  68. data/lib/rggen/builtins/register_block/name.rb +26 -0
  69. data/lib/rggen/builtins/register_block/ral_package_definition.rb +19 -0
  70. data/lib/rggen/builtins/register_block/reg_model_creator.rb +14 -0
  71. data/lib/rggen/builtins/register_block/reg_model_declarations.rb +7 -0
  72. data/lib/rggen/builtins/register_block/response_mux.erb +14 -0
  73. data/lib/rggen/builtins/register_block/response_mux.rb +16 -0
  74. data/lib/rggen/builtins/register_block/signal_declarations.rb +9 -0
  75. data/lib/rggen/builtins.rb +52 -0
  76. data/lib/rggen/commands.rb +23 -0
  77. data/lib/rggen/core_components/configuration/configuration_factory.rb +23 -0
  78. data/lib/rggen/core_components/configuration/item_factory.rb +13 -0
  79. data/lib/rggen/core_components/configuration/raise_error.rb +11 -0
  80. data/lib/rggen/core_components/configuration/setup.rb +14 -0
  81. data/lib/rggen/core_components/ral/item.rb +16 -0
  82. data/lib/rggen/core_components/ral/setup.rb +19 -0
  83. data/lib/rggen/core_components/register_map/bit_field_factory.rb +11 -0
  84. data/lib/rggen/core_components/register_map/component.rb +12 -0
  85. data/lib/rggen/core_components/register_map/generic_map.rb +69 -0
  86. data/lib/rggen/core_components/register_map/item.rb +22 -0
  87. data/lib/rggen/core_components/register_map/item_factory.rb +13 -0
  88. data/lib/rggen/core_components/register_map/loader.rb +13 -0
  89. data/lib/rggen/core_components/register_map/raise_error.rb +17 -0
  90. data/lib/rggen/core_components/register_map/register_block_factory.rb +29 -0
  91. data/lib/rggen/core_components/register_map/register_factory.rb +18 -0
  92. data/lib/rggen/core_components/register_map/register_map_factory.rb +21 -0
  93. data/lib/rggen/core_components/register_map/setup.rb +33 -0
  94. data/lib/rggen/core_components/rtl/component.rb +28 -0
  95. data/lib/rggen/core_components/rtl/item.rb +83 -0
  96. data/lib/rggen/core_components/rtl/setup.rb +19 -0
  97. data/lib/rggen/core_components.rb +23 -0
  98. data/lib/rggen/core_extensions/facets.rb +17 -0
  99. data/lib/rggen/core_extensions/forwardable.rb +26 -0
  100. data/lib/rggen/core_extensions/integer.rb +5 -0
  101. data/lib/rggen/core_extensions/math.rb +7 -0
  102. data/lib/rggen/exceptions.rb +22 -0
  103. data/lib/rggen/generator.rb +185 -0
  104. data/lib/rggen/input_base/component.rb +19 -0
  105. data/lib/rggen/input_base/component_factory.rb +58 -0
  106. data/lib/rggen/input_base/item.rb +170 -0
  107. data/lib/rggen/input_base/item_factory.rb +13 -0
  108. data/lib/rggen/input_base/loader.rb +14 -0
  109. data/lib/rggen/input_base/regexp_patterns.rb +29 -0
  110. data/lib/rggen/output_base/code_block.rb +72 -0
  111. data/lib/rggen/output_base/code_utility.rb +44 -0
  112. data/lib/rggen/output_base/component.rb +88 -0
  113. data/lib/rggen/output_base/component_factory.rb +32 -0
  114. data/lib/rggen/output_base/item.rb +175 -0
  115. data/lib/rggen/output_base/item_factory.rb +6 -0
  116. data/lib/rggen/output_base/line.rb +28 -0
  117. data/lib/rggen/output_base/template_utility.rb +29 -0
  118. data/lib/rggen/output_base/verilog_utility/class_definition.rb +23 -0
  119. data/lib/rggen/output_base/verilog_utility/declaration.rb +70 -0
  120. data/lib/rggen/output_base/verilog_utility/identifier.rb +29 -0
  121. data/lib/rggen/output_base/verilog_utility/module_definition.rb +47 -0
  122. data/lib/rggen/output_base/verilog_utility/package_definition.rb +67 -0
  123. data/lib/rggen/output_base/verilog_utility/structure_definition.rb +52 -0
  124. data/lib/rggen/output_base/verilog_utility/subroutine_definition.rb +43 -0
  125. data/lib/rggen/output_base/verilog_utility.rb +66 -0
  126. data/lib/rggen/version.rb +6 -0
  127. data/lib/rggen.rb +65 -0
  128. data/ral/compile.f +4 -0
  129. data/ral/rggen_ral_block.svh +84 -0
  130. data/ral/rggen_ral_field.svh +47 -0
  131. data/ral/rggen_ral_macros.svh +22 -0
  132. data/ral/rggen_ral_map.svh +124 -0
  133. data/ral/rggen_ral_pkg.sv +14 -0
  134. data/ral/rggen_ral_reg.svh +52 -0
  135. data/ral/rggen_ral_shadow_reg.svh +188 -0
  136. data/rggen.gemspec +45 -0
  137. data/rtl/bit_field/rggen_bit_field_rw.sv +28 -0
  138. data/rtl/register/rggen_address_decoder.sv +49 -0
  139. data/rtl/register_block/rggen_host_if_apb.sv +40 -0
  140. data/rtl/register_block/rggen_response_mux.sv +82 -0
  141. data/sample/sample.csv +14 -0
  142. data/sample/sample.json +4 -0
  143. data/sample/sample.xls +0 -0
  144. data/sample/sample.xlsx +0 -0
  145. data/sample/sample.yaml +2 -0
  146. data/sample/sample_0.sv +285 -0
  147. data/sample/sample_0_ral_pkg.sv +99 -0
  148. data/sample/sample_1.sv +172 -0
  149. data/sample/sample_1_ral_pkg.sv +53 -0
  150. data/sample/sample_setup.rb +21 -0
  151. data/setup/default.rb +11 -0
  152. metadata +296 -0
@@ -0,0 +1,42 @@
1
+ module RgGen
2
+ module Builder
3
+ class ComponentStore
4
+ def initialize(builder, component_name)
5
+ @builder = builder
6
+ @component_name = component_name
7
+ @entries = []
8
+ end
9
+
10
+ def entry(associated_category_or_categories = nil, &body)
11
+ if associated_category_or_categories.nil?
12
+ @entries << create_new_entry(nil, body)
13
+ else
14
+ Array(associated_category_or_categories).each do |category|
15
+ @entries << create_new_entry(category, body)
16
+ end
17
+ end
18
+ end
19
+
20
+ def build_factory
21
+ factories = @entries.map(&:build_factory)
22
+ factories.each_cons(2) do |factory_pair|
23
+ factory_pair[0].child_factory = factory_pair[1]
24
+ end
25
+ factories.first.root_factory
26
+ factories.first
27
+ end
28
+
29
+ private
30
+
31
+ def create_new_entry(associated_category, body)
32
+ ComponentEntry.new.tap do |new_entry|
33
+ new_entry.instance_exec(&body)
34
+ @builder.categories.each do |name, category|
35
+ next if associated_category && name != associated_category
36
+ category.add_item_store(@component_name, new_entry.item_store)
37
+ end if new_entry.item_store
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,25 @@
1
+ module RgGen
2
+ module Builder
3
+ class InputComponentStore < ComponentStore
4
+ def initialize(builder, component_name)
5
+ super(builder, component_name)
6
+ @loaders = []
7
+ end
8
+
9
+ attr_setter :loader_base
10
+
11
+ def define_loader(type_or_types, &body)
12
+ return unless loader_base
13
+ @loaders << Class.new(loader_base, &body).tap do |l|
14
+ l.supported_types = Array(type_or_types)
15
+ end
16
+ end
17
+
18
+ def build_factory
19
+ super.tap do |f|
20
+ f.loaders = @loaders
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,89 @@
1
+ module RgGen
2
+ module Builder
3
+ class ItemStore
4
+ def initialize(base, factory)
5
+ @base = base
6
+ @factory = factory
7
+ @simple_item_entries = {}
8
+ @list_item_entries = {}
9
+ @enabled_entries = []
10
+ end
11
+
12
+ attr_reader :base
13
+ attr_reader :factory
14
+
15
+ def define_simple_item(context, item_name, &body)
16
+ create_item_entry(:simple, item_name, context, body)
17
+ end
18
+
19
+ def define_list_item(context, list_name, item_name = nil, &body)
20
+ if item_name.nil?
21
+ create_item_entry(:list, list_name, context, body)
22
+ else
23
+ define_list_item_class(list_name, item_name, context, body)
24
+ end
25
+ end
26
+
27
+ def enable(*args)
28
+ case args.size
29
+ when 1
30
+ enable_item_entries(args[0])
31
+ when 2
32
+ enable_list_item(args[0], args[1])
33
+ else
34
+ message = "wrong number of arguments (#{args.size} for 1..2)"
35
+ fail ArgumentError, message
36
+ end
37
+ end
38
+
39
+ def build_factories
40
+ @enabled_entries.each_with_object({}) do |entry_name, factories|
41
+ factories[entry_name] = (
42
+ @simple_item_entries[entry_name] || @list_item_entries[entry_name]
43
+ ).build_factory
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def create_item_entry(entry_type, entry_name, context, body)
50
+ klass = { simple: SimpleItemEntry, list: ListItemEntry }[entry_type]
51
+ entry = klass.new(base, factory, context, &body)
52
+ update_entries(entry_type, entry_name, entry)
53
+ end
54
+
55
+ def update_entries(entry_type, entry_name, entry)
56
+ if entry_type == :simple
57
+ @list_item_entries.delete(entry_name)
58
+ @simple_item_entries[entry_name] = entry
59
+ else
60
+ @simple_item_entries.delete(entry_name)
61
+ @list_item_entries[entry_name] = entry
62
+ end
63
+ end
64
+
65
+ def define_list_item_class(list_name, item_name, context, body)
66
+ unless @list_item_entries.key?(list_name)
67
+ message = "undefined list item entry: #{list_name}"
68
+ fail RgGen::BuilderError, message
69
+ end
70
+ entry = @list_item_entries[list_name]
71
+ entry.define_list_item(item_name, context, &body)
72
+ end
73
+
74
+ def enable_item_entries(entry_name_or_names)
75
+ Array(entry_name_or_names).each do |entry_name|
76
+ next if @enabled_entries.include?(entry_name)
77
+ next unless @simple_item_entries.key?(entry_name) ||
78
+ @list_item_entries.key?(entry_name)
79
+ @enabled_entries << entry_name
80
+ end
81
+ end
82
+
83
+ def enable_list_item(list_name, item_name_or_names)
84
+ return unless @list_item_entries.key?(list_name)
85
+ @list_item_entries[list_name].enable(item_name_or_names)
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,81 @@
1
+ module RgGen
2
+ module Builder
3
+ class ListItemEntry
4
+ def initialize(item_base, factory_base, context, &body)
5
+ @item_base = Class.new(item_base)
6
+ @factory = Class.new(factory_base)
7
+ @items = {}
8
+ @enabled_items = []
9
+ unless context.nil?
10
+ set_context(@item_base , context)
11
+ set_context(@factory , context)
12
+ set_context(singleton_class, context)
13
+ end
14
+ instance_exec(&body) if block_given?
15
+ end
16
+
17
+ def item_base(&body)
18
+ @item_base.class_exec(&body) if block_given?
19
+ @item_base
20
+ end
21
+
22
+ def item_class(&body)
23
+ @item_class ||= Class.new(@item_base)
24
+ @item_class.class_exec(&body) if block_given?
25
+ @item_class
26
+ end
27
+
28
+ alias_method :default_item, :item_class
29
+
30
+ def factory(&body)
31
+ @factory.class_exec(&body) if block_given?
32
+ @factory
33
+ end
34
+
35
+ def define_list_item(item_name, context, &body)
36
+ klass = Class.new(item_base)
37
+ unless context.nil?
38
+ if item_base.private_method_defined?(:shared_context)
39
+ fail BuilderError, 'base class already has #shared_context'
40
+ end
41
+ set_context(klass, context)
42
+ end
43
+ klass.class_exec(&body)
44
+ @items[item_name] = klass
45
+ end
46
+
47
+ def enable(item_or_items)
48
+ Array(item_or_items).each do |item|
49
+ next unless @items.key?(item)
50
+ next if @enabled_items.include?(item)
51
+ @enabled_items << item
52
+ end
53
+ end
54
+
55
+ def build_factory
56
+ @factory.new.tap do |f|
57
+ f.target_items = target_items
58
+ f.target_item = @item_class unless @item_class.nil?
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def target_items
65
+ return nil if @enabled_items.empty?
66
+ @enabled_items.each_with_object({}) do |item_name, items|
67
+ items[item_name] = @items[item_name]
68
+ end
69
+ end
70
+
71
+ def set_context(klass, context)
72
+ klass.class_exec do
73
+ define_method(:shared_context) do
74
+ context
75
+ end
76
+ private :shared_context
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,13 @@
1
+ module RgGen
2
+ module Builder
3
+ class OutputComponentStore < ComponentStore
4
+ attr_setter :output_directory
5
+
6
+ def build_factory
7
+ super.tap do |f|
8
+ f.output_directory = @output_directory
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,33 @@
1
+ module RgGen
2
+ module Builder
3
+ class SimpleItemEntry
4
+ def initialize(base, factory, context, &body)
5
+ @item_class = define_item_class(base, context, body)
6
+ @factory = factory
7
+ end
8
+
9
+ attr_reader :item_class
10
+ attr_reader :factory
11
+
12
+ def build_factory
13
+ @factory.new.tap do |f|
14
+ f.target_item = @item_class
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def define_item_class(base, context, body)
21
+ klass = Class.new(base)
22
+ klass.class_exec do
23
+ define_method(:shared_context) do
24
+ context
25
+ end
26
+ private :shared_context
27
+ end unless context.nil?
28
+ klass.class_exec(&body) unless body.nil?
29
+ klass
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,39 @@
1
+ simple_item :bit_field, :bit_assignment do
2
+ register_map do
3
+ field :msb
4
+ field :lsb
5
+ field :width do
6
+ msb - lsb + 1
7
+ end
8
+
9
+ input_pattern %r{\[(#{number})(?::(#{number}))?\]}
10
+
11
+ build do |cell|
12
+ parse_bit_assignment(cell)
13
+ case
14
+ when @lsb > @msb
15
+ error "lsb is larger than msb: #{cell}"
16
+ when @msb >= configuration.data_width
17
+ error "exceeds the data width(#{configuration.data_width}): #{cell}"
18
+ when overlapped_bit_assignment?
19
+ error "overlapped bit assignment: #{cell}"
20
+ end
21
+ end
22
+
23
+ def parse_bit_assignment(cell)
24
+ if pattern_matched?
25
+ @msb, @lsb = captures.compact.map(&method(:Integer))
26
+ @lsb ||= @msb
27
+ else
28
+ error "invalid value for bit assignment: #{cell.inspect}"
29
+ end
30
+ end
31
+
32
+ def overlapped_bit_assignment?
33
+ own_range = @lsb..@msb
34
+ register.bit_fields.any? do |bit_field|
35
+ own_range.overlap?(bit_field.lsb..bit_field.msb)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,25 @@
1
+ simple_item :bit_field, :field_model_creation do
2
+ ral do
3
+ delegate [:name, :width, :lsb, :access] => :bit_field
4
+
5
+ generate_code :field_model_creation do
6
+ "`rggen_ral_create_field_model(#{arguments.join(', ')})\n"
7
+ end
8
+
9
+ def arguments
10
+ [name, string(name), width, lsb, access, volatile, reset, has_reset]
11
+ end
12
+
13
+ def volatile
14
+ 0
15
+ end
16
+
17
+ def reset
18
+ hex(bit_field.initial_value || 0, width)
19
+ end
20
+
21
+ def has_reset
22
+ (bit_field.initial_value? && 1) || 0
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,9 @@
1
+ simple_item :bit_field, :field_model_declaration do
2
+ ral do
3
+ delegate [:name] => :bit_field
4
+
5
+ generate_code :field_model_declaration do |buffer|
6
+ buffer << model_declaration(:rggen_ral_field, name) << semicolon << nl
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,36 @@
1
+ simple_item :bit_field, :initial_value do
2
+ register_map do
3
+ field :initial_value
4
+ field :initial_value? do
5
+ @initial_value.not_nil?
6
+ end
7
+
8
+ build do |cell|
9
+ @initial_value = parse_initial_value(cell)
10
+ end
11
+
12
+ validate do
13
+ if initial_value? && valid_range.exclude?(@initial_value)
14
+ error "out of valid initial value range(#{valid_range}):" \
15
+ " #{@initial_value}"
16
+ end
17
+ end
18
+
19
+ def parse_initial_value(cell)
20
+ return if empty?(cell)
21
+ Integer(cell)
22
+ rescue
23
+ error "invalid value for initial value: #{cell.inspect}"
24
+ end
25
+
26
+ def empty?(cell)
27
+ cell.to_s.strip.empty?
28
+ end
29
+
30
+ def valid_range
31
+ min_value = -1 * (2**bit_field.width) / 2
32
+ max_value = 2**bit_field.width - 1
33
+ (min_value..max_value)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,26 @@
1
+ simple_item :bit_field, :name do
2
+ register_map do
3
+ field :name
4
+
5
+ input_pattern %r{(#{variable_name})}
6
+
7
+ build do |cell|
8
+ @name = parse_name(cell)
9
+ error "repeated bit field name: #{@name}" if repeated_name?
10
+ end
11
+
12
+ def parse_name(cell)
13
+ if pattern_matched?
14
+ captures.first
15
+ else
16
+ error "invalid value for bit field name: #{cell.inspect}"
17
+ end
18
+ end
19
+
20
+ def repeated_name?
21
+ register_block.bit_fields.any? do |bit_field|
22
+ @name == bit_field.name
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,42 @@
1
+ simple_item :bit_field, :reference do
2
+ register_map do
3
+ field :reference, need_validation: true, forward_to: :find_reference
4
+ field :has_reference? do
5
+ @reference.not.empty?
6
+ end
7
+
8
+ build do |cell|
9
+ @reference = cell.to_s
10
+ end
11
+
12
+ validate do
13
+ case
14
+ when @reference == bit_field.name
15
+ error "self reference: #{@reference}"
16
+ when not_find_reference?
17
+ error "no such reference bit field: #{@reference}"
18
+ when refer_reserved_bit_field?
19
+ error "reserved bit field is refered: #{@reference}"
20
+ end
21
+ end
22
+
23
+ def not_find_reference?
24
+ return false unless has_reference?
25
+ find_reference.nil?
26
+ end
27
+
28
+ def refer_reserved_bit_field?
29
+ return false unless has_reference?
30
+ find_reference.reserved?
31
+ end
32
+
33
+ private
34
+
35
+ def find_reference
36
+ return nil unless has_reference?
37
+ @found_reference ||= register_block.bit_fields.find do |bit_field|
38
+ bit_field.name == @reference
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,9 @@
1
+ list_item :bit_field, :type, :reserved do
2
+ register_map do
3
+ reserved
4
+ end
5
+
6
+ ral do
7
+ access :ro
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ list_item :bit_field, :type, :ro do
2
+ register_map do
3
+ read_only
4
+ end
5
+
6
+ rtl do
7
+ build do
8
+ input :value_in, name: port_name, width: width, dimensions: dimensions
9
+ end
10
+
11
+ generate_code :module_item do |buffer|
12
+ buffer << assign(value[loop_variables], value_in[loop_variables]) << nl
13
+ end
14
+
15
+ def port_name
16
+ "i_#{bit_field.name}"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ rggen_bit_field_rw #(
2
+ .WIDTH (<%= bit_field.width %>),
3
+ .INITIAL_VALUE (<%= initial_value %>)
4
+ ) u_<%= bit_field.name %> (
5
+ .clk (<%= register_block.clock %>),
6
+ .rst_n (<%= register_block.reset %>),
7
+ .i_command_valid (<%= register_block.host_if.command_valid %>),
8
+ .i_select (<%= register_block.register_select[index] %>),
9
+ .i_write (<%= register_block.host_if.write %>),
10
+ .i_write_data (<%= register_block.host_if.write_data[bit_field.msb, bit_field.lsb] %>),
11
+ .i_write_mask (<%= register_block.host_if.write_mask[bit_field.msb, bit_field.lsb] %>),
12
+ .o_value (<%= value[loop_variables] %>)
13
+ );
@@ -0,0 +1,25 @@
1
+ list_item :bit_field, :type, :rw do
2
+ register_map do
3
+ read_write
4
+ need_initial_value
5
+ end
6
+
7
+ rtl do
8
+ build do
9
+ output :value_out, name: port_name, width: width, dimensions: dimensions
10
+ end
11
+
12
+ generate_code :module_item do |buffer|
13
+ buffer << assign(value_out[loop_variables], value[loop_variables]) << nl
14
+ buffer << process_template
15
+ end
16
+
17
+ def port_name
18
+ "o_#{bit_field.name}"
19
+ end
20
+
21
+ def initial_value
22
+ hex(bit_field.initial_value, bit_field.width)
23
+ end
24
+ end
25
+ end