rggen 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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