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,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