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,26 @@
1
+ simple_item :register_block, :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 register block 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 register block name: #{cell.inspect}"
17
+ end
18
+ end
19
+
20
+ def repeated_name?
21
+ register_map.register_blocks.any? do |block|
22
+ @name == block.name
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,19 @@
1
+ simple_item :register_block, :ral_package_definition do
2
+ ral do
3
+ delegate :name => :register_block
4
+
5
+ write_file '<%= name %>_ral_pkg.sv' do
6
+ package_definition "#{name}_ral_pkg" do |pkg|
7
+ pkg.import_package :uvm_pkg
8
+ pkg.import_package :rggen_ral_pkg
9
+ pkg.include_file 'uvm_macros.svh'
10
+ pkg.include_file 'rggen_ral_macros.svh'
11
+ pkg.body { |code| body_code(code) }
12
+ end
13
+ end
14
+
15
+ def body_code(code)
16
+ register_block.generate_code(:package_item, :bottom_up, code)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ simple_item :register_block, :reg_model_creator do
2
+ ral do
3
+ generate_code :block_model_item do
4
+ function_definition :create_registers do |f|
5
+ f.return_type :void
6
+ f.body { |buffer| function_body(buffer) }
7
+ end
8
+ end
9
+
10
+ def function_body(buffer)
11
+ register_block.generate_code(:reg_model_creation, :top_down, buffer)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ simple_item :register_block, :reg_model_declarations do
2
+ ral do
3
+ generate_code :block_model_item do |buffer|
4
+ register_block.generate_code(:reg_model_declaration, :top_down, buffer)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,14 @@
1
+ rggen_response_mux #(
2
+ .DATA_WIDTH (<%= data_width %>),
3
+ .TOTAL_REGISTERS (<%= total_registers %>)
4
+ ) u_response_mux (
5
+ .clk (<%= register_block.clock %>),
6
+ .rst_n (<%= register_block.reset %>),
7
+ .i_command_valid (<%= register_block.host_if.command_valid %>),
8
+ .i_read (<%= register_block.host_if.read %>),
9
+ .o_response_ready (<%= register_block.host_if.response_ready %>),
10
+ .o_read_data (<%= register_block.host_if.read_data %>),
11
+ .o_status (<%= register_block.host_if.status %>),
12
+ .i_register_select (<%= register_select %>),
13
+ .i_register_read_data (<%= register_read_data %>)
14
+ );
@@ -0,0 +1,16 @@
1
+ simple_item :register_block, :response_mux do
2
+ rtl do
3
+ build do
4
+ logic :register_select , width: total_registers
5
+ logic :register_read_data, width: data_width, dimensions: [total_registers]
6
+ end
7
+
8
+ generate_code_from_template :module_item
9
+
10
+ delegate data_width: :configuration
11
+
12
+ def total_registers
13
+ register_block.registers.map(&:count).sum(0)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ define_simple_item :register_block, :signal_declarations do
2
+ rtl do
3
+ generate_code :module_item do |buffer|
4
+ register_block.signal_declarations.each do |declaration|
5
+ buffer << declaration << semicolon << nl
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,52 @@
1
+ require_relative 'builtins/loaders/configuration/json_loader'
2
+ require_relative 'builtins/loaders/configuration/yaml_loader'
3
+ require_relative 'builtins/loaders/register_map/csv_loader'
4
+ require_relative 'builtins/loaders/register_map/xls_loader'
5
+ require_relative 'builtins/loaders/register_map/xlsx_ods_loader'
6
+
7
+ require_relative 'builtins/global/address_width'
8
+ require_relative 'builtins/global/data_width'
9
+
10
+ require_relative 'builtins/bit_field/bit_assignment'
11
+ require_relative 'builtins/bit_field/field_model_creation'
12
+ require_relative 'builtins/bit_field/field_model_declaration'
13
+ require_relative 'builtins/bit_field/initial_value'
14
+ require_relative 'builtins/bit_field/name'
15
+ require_relative 'builtins/bit_field/reference'
16
+ require_relative 'builtins/bit_field/type'
17
+ require_relative 'builtins/bit_field/rw'
18
+ require_relative 'builtins/bit_field/ro'
19
+ require_relative 'builtins/bit_field/wo'
20
+ require_relative 'builtins/bit_field/reserved'
21
+
22
+ require_relative 'builtins/register/accessibility'
23
+ require_relative 'builtins/register/address_decoder'
24
+ require_relative 'builtins/register/array'
25
+ require_relative 'builtins/register/field_model_creator'
26
+ require_relative 'builtins/register/field_model_declarations'
27
+ require_relative 'builtins/register/offset_address'
28
+ require_relative 'builtins/register/name'
29
+ require_relative 'builtins/register/read_data'
30
+ require_relative 'builtins/register/reg_model_constructor'
31
+ require_relative 'builtins/register/reg_model_creation'
32
+ require_relative 'builtins/register/reg_model_declaration'
33
+ require_relative 'builtins/register/reg_model_definition'
34
+ require_relative 'builtins/register/shadow'
35
+ require_relative 'builtins/register/shadow_index_configurator'
36
+ require_relative 'builtins/register/uniqueness_validator'
37
+
38
+ require_relative 'builtins/register_block/base_address'
39
+ require_relative 'builtins/register_block/block_model_constructor'
40
+ require_relative 'builtins/register_block/block_model_default_map_creator'
41
+ require_relative 'builtins/register_block/block_model_definition'
42
+ require_relative 'builtins/register_block/byte_size'
43
+ require_relative 'builtins/register_block/clock_reset'
44
+ require_relative 'builtins/register_block/host_if'
45
+ require_relative 'builtins/register_block/apb'
46
+ require_relative 'builtins/register_block/module_definition'
47
+ require_relative 'builtins/register_block/name'
48
+ require_relative 'builtins/register_block/ral_package_definition'
49
+ require_relative 'builtins/register_block/reg_model_creator'
50
+ require_relative 'builtins/register_block/reg_model_declarations'
51
+ require_relative 'builtins/register_block/response_mux'
52
+ require_relative 'builtins/register_block/signal_declarations'
@@ -0,0 +1,23 @@
1
+ module RgGen
2
+ def self.builder
3
+ @builder ||= Builder::Builder.new
4
+ end
5
+
6
+ module Commands
7
+ extend Forwardable
8
+
9
+ [
10
+ [:input_component_store , :input_component_store ],
11
+ [:output_component_store, :output_component_store],
12
+ [:define_simple_item , :simple_item ],
13
+ [:define_list_item , :list_item ],
14
+ [:enable , :enable ],
15
+ [:define_loader , :loader ]
16
+ ].each do |method_name, alias_name|
17
+ def_delegator('RgGen.builder', method_name)
18
+ alias_method(alias_name, method_name) if method_name != alias_name
19
+ end
20
+ end
21
+ end
22
+
23
+ include RgGen::Commands
@@ -0,0 +1,23 @@
1
+ module RgGen
2
+ module Configuration
3
+ class ConfigurationFactory < InputBase::ComponentFactory
4
+ def create_active_items(configuration, hash)
5
+ active_item_factories.each do |name, factory|
6
+ create_item(factory, configuration, hash[name])
7
+ end
8
+ end
9
+
10
+ def load(file)
11
+ return {} if file.nil? || file.empty?
12
+
13
+ data = load_file(file)
14
+ if data.is_a?(Hash)
15
+ data.symbolize_keys!
16
+ else
17
+ message = "Hash type required for configuration: #{data.class}"
18
+ fail RgGen::LoadError, message
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ module RgGen
2
+ module Configuration
3
+ class ItemFactory < InputBase::ItemFactory
4
+ include RaiseError
5
+
6
+ def create(configuration, data = nil)
7
+ item = create_item(configuration, data)
8
+ item.build(data) unless data.nil?
9
+ item
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ module RgGen
2
+ module Configuration
3
+ module RaiseError
4
+ private
5
+
6
+ def error(message = nil)
7
+ fail RgGen::ConfigurationError, message
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ module RgGen
2
+ module Configuration
3
+ input_component_store :configuration do
4
+ entry do
5
+ component_class InputBase::Component
6
+ component_factory ConfigurationFactory
7
+ item_base InputBase::Item, include: RaiseError
8
+ item_factory ItemFactory
9
+ end
10
+
11
+ loader_base InputBase::Loader
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ module RgGen
2
+ module RAL
3
+ class Item < OutputBase::Item
4
+ use_verilog_utility
5
+
6
+ private
7
+
8
+ def model_declaration(model_class, name, attributes = {})
9
+ create_declaration(
10
+ :variable,
11
+ attributes.merge(data_type: model_class, name: name, random: true)
12
+ )
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ module RgGen
2
+ module RAL
3
+ output_component_store :ral do
4
+ entry do
5
+ component_class OutputBase::Component
6
+ component_factory OutputBase::ComponentFactory
7
+ end
8
+
9
+ entry [:register_block, :register, :bit_field] do
10
+ component_class OutputBase::Component
11
+ component_factory OutputBase::ComponentFactory
12
+ item_base Item
13
+ item_factory OutputBase::ItemFactory
14
+ end
15
+
16
+ output_directory 'ral'
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ module RgGen
2
+ module RegisterMap
3
+ class BitFieldFactory < InputBase::ComponentFactory
4
+ def create_active_items(bit_field, configuration, cells)
5
+ active_item_factories.each_value.with_index do |factory, index|
6
+ create_item(factory, bit_field, configuration, cells[index])
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ module RgGen
2
+ module RegisterMap
3
+ class Component < InputBase::Component
4
+ include Base::HierarchicalAccessors
5
+
6
+ def initialize(parent)
7
+ super(parent)
8
+ define_hierarchical_accessors
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,69 @@
1
+ module RgGen
2
+ module RegisterMap
3
+ class GenericMap
4
+ class Cell
5
+ Position = Struct.new(:file, :sheet, :row, :column)
6
+
7
+ def initialize(file, sheet, row, column)
8
+ @position = Position.new(file, sheet, row, column)
9
+ end
10
+
11
+ attr_accessor :value
12
+ attr_reader :position
13
+
14
+ def empty?
15
+ value.to_s.empty?
16
+ end
17
+ end
18
+
19
+ class Sheet
20
+ def initialize(file, name)
21
+ @file = file
22
+ @name = name
23
+ @rows = []
24
+ end
25
+
26
+ attr_reader :name
27
+ attr_reader :rows
28
+
29
+ def [](row, column)
30
+ rows[row] ||= []
31
+ rows[row][column] ||= Cell.new(@file, name, row, column)
32
+ end
33
+
34
+ def []=(row, column, value)
35
+ self[row, column].value = value
36
+ end
37
+ end
38
+
39
+ def initialize(file)
40
+ @file = file
41
+ @sheets = {}
42
+ end
43
+
44
+ attr_reader :file
45
+
46
+ def [](sheet_name_or_index)
47
+ case sheet_name_or_index
48
+ when String
49
+ @sheets[sheet_name_or_index] ||= Sheet.new(file, sheet_name_or_index)
50
+ when Integer
51
+ sheets[sheet_name_or_index]
52
+ end
53
+ end
54
+
55
+ def []=(sheet_name, table)
56
+ @sheets[sheet_name] = Sheet.new(file, sheet_name)
57
+ table.each_with_index do |values, row|
58
+ values.each_with_index do |value, column|
59
+ @sheets[sheet_name][row, column] = value
60
+ end
61
+ end
62
+ end
63
+
64
+ def sheets
65
+ @sheets.values
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,22 @@
1
+ module RgGen
2
+ module RegisterMap
3
+ class Item < InputBase::Item
4
+ include Base::HierarchicalItemAccessors
5
+ include RaiseError
6
+
7
+ attr_reader :configuration
8
+ attr_reader :position
9
+
10
+ def initialize(owner)
11
+ super(owner)
12
+ define_hierarchical_item_accessors
13
+ end
14
+
15
+ def build(configuration, cell)
16
+ @configuration = configuration
17
+ @position = cell.position
18
+ super(cell.value)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,13 @@
1
+ module RgGen
2
+ module RegisterMap
3
+ class ItemFactory < InputBase::ItemFactory
4
+ include RaiseError
5
+
6
+ def create(component, configuration, cell = nil)
7
+ item = create_item(component, cell)
8
+ item.build(configuration, cell) unless cell.nil?
9
+ item
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module RgGen
2
+ module RegisterMap
3
+ class Loader < InputBase::Loader
4
+ private
5
+
6
+ def create_map(file, &block)
7
+ map = GenericMap.new(file)
8
+ block.call(map) if block_given?
9
+ map
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ module RgGen
2
+ module RegisterMap
3
+ module RaiseError
4
+ private
5
+
6
+ def error(message, cell_or_position = nil)
7
+ error_position =
8
+ case cell_or_position
9
+ when GenericMap::Cell::Position then cell_or_position
10
+ when GenericMap::Cell then cell_or_position.position
11
+ else @position
12
+ end
13
+ fail RgGen::RegisterMapError.new(message, error_position)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,29 @@
1
+ module RgGen
2
+ module RegisterMap
3
+ class RegisterBlockFactory < InputBase::ComponentFactory
4
+ def create_active_items(register_block, configuration, sheet)
5
+ active_item_factories.each_value.with_index do |factory, index|
6
+ cell = sheet[index, 2]
7
+ create_item(factory, register_block, configuration, cell)
8
+ end
9
+ end
10
+
11
+ def create_children(register_block, configuration, sheet)
12
+ cell_blocks(sheet).each do |block|
13
+ create_child(register_block, configuration, block)
14
+ end
15
+ end
16
+
17
+ def cell_blocks(sheet)
18
+ drop_row_size = active_item_factories.size + 2
19
+ drop_column_size = 1
20
+ sheet.rows.drop(drop_row_size).each_with_object([]) do |row, blocks|
21
+ valid_cells = row.drop(drop_column_size)
22
+ next if valid_cells.all?(&:empty?)
23
+ blocks << [] unless valid_cells.first.empty?
24
+ blocks.last << valid_cells
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,18 @@
1
+ module RgGen
2
+ module RegisterMap
3
+ class RegisterFactory < InputBase::ComponentFactory
4
+ def create_active_items(register, configuration, rows)
5
+ active_item_factories.each_value.with_index do |factory, index|
6
+ create_item(factory, register, configuration, rows.first[index])
7
+ end
8
+ end
9
+
10
+ def create_children(register, configuration, rows)
11
+ drop_size = active_item_factories.size
12
+ rows.each do |row|
13
+ create_child(register, configuration, row.drop(drop_size))
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,21 @@
1
+ module RgGen
2
+ module RegisterMap
3
+ class RegisterMapFactory < InputBase::ComponentFactory
4
+ def create_children(register_map, configuration, map)
5
+ map.sheets.each do |sheet|
6
+ create_child(register_map, configuration, sheet)
7
+ end
8
+ end
9
+
10
+ def load(file)
11
+ map = load_file(file)
12
+ if map.is_a?(GenericMap)
13
+ map
14
+ else
15
+ message = "GenericMap type required for register map: #{map.class}"
16
+ fail RgGen::LoadError, message
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,33 @@
1
+ module RgGen
2
+ module RegisterMap
3
+ input_component_store :register_map do
4
+ entry do
5
+ component_class Component
6
+ component_factory RegisterMapFactory
7
+ end
8
+
9
+ entry :register_block do
10
+ component_class Component
11
+ component_factory RegisterBlockFactory
12
+ item_base Item
13
+ item_factory ItemFactory
14
+ end
15
+
16
+ entry :register do
17
+ component_class Component
18
+ component_factory RegisterFactory
19
+ item_base Item
20
+ item_factory ItemFactory
21
+ end
22
+
23
+ entry :bit_field do
24
+ component_class Component
25
+ component_factory BitFieldFactory
26
+ item_base Item
27
+ item_factory ItemFactory
28
+ end
29
+
30
+ loader_base Loader
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,28 @@
1
+ module RgGen
2
+ module RTL
3
+ class Component < OutputBase::Component
4
+ def build
5
+ super
6
+ @items.each do |item|
7
+ def_object_delegators(item, *item.identifiers)
8
+ end
9
+ end
10
+
11
+ def signal_declarations
12
+ [*@items, *@children].flat_map(&:signal_declarations)
13
+ end
14
+
15
+ def port_declarations
16
+ [*@items, *@children].flat_map(&:port_declarations)
17
+ end
18
+
19
+ def parameter_declarations
20
+ [*@items, *@children].flat_map(&:parameter_declarations)
21
+ end
22
+
23
+ def localparam_declarations
24
+ [*@items, *@children].flat_map(&:localparam_declarations)
25
+ end
26
+ end
27
+ end
28
+ end