rggen-core 0.19.0 → 0.23.1

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/exe/rggen +2 -2
  3. data/lib/rggen/core.rb +7 -4
  4. data/lib/rggen/core/base/component.rb +16 -7
  5. data/lib/rggen/core/base/component_factory.rb +12 -9
  6. data/lib/rggen/core/base/component_layer_extension.rb +194 -0
  7. data/lib/rggen/core/base/feature_layer_extension.rb +158 -0
  8. data/lib/rggen/core/builder/builder.rb +38 -52
  9. data/lib/rggen/core/builder/component_entry.rb +3 -2
  10. data/lib/rggen/core/builder/component_registry.rb +22 -17
  11. data/lib/rggen/core/builder/feature_registry.rb +6 -9
  12. data/lib/rggen/core/builder/input_component_registry.rb +43 -10
  13. data/lib/rggen/core/builder/layer.rb +132 -0
  14. data/lib/rggen/core/builder/loader_registry.rb +48 -0
  15. data/lib/rggen/core/builder/plugin_manager.rb +140 -0
  16. data/lib/rggen/core/configuration.rb +3 -2
  17. data/lib/rggen/core/configuration/component.rb +5 -0
  18. data/lib/rggen/core/configuration/component_factory.rb +1 -1
  19. data/lib/rggen/core/configuration/hash_loader.rb +4 -2
  20. data/lib/rggen/core/configuration/input_data.rb +15 -0
  21. data/lib/rggen/core/dsl.rb +3 -1
  22. data/lib/rggen/core/exceptions.rb +9 -4
  23. data/lib/rggen/core/generator.rb +3 -3
  24. data/lib/rggen/core/input_base/component_factory.rb +37 -6
  25. data/lib/rggen/core/input_base/feature.rb +3 -3
  26. data/lib/rggen/core/input_base/input_data.rb +13 -10
  27. data/lib/rggen/core/input_base/input_value_extractor.rb +34 -0
  28. data/lib/rggen/core/input_base/loader.rb +64 -21
  29. data/lib/rggen/core/input_base/yaml_loader.rb +5 -4
  30. data/lib/rggen/core/options.rb +18 -14
  31. data/lib/rggen/core/output_base/code_generator.rb +10 -23
  32. data/lib/rggen/core/output_base/component.rb +42 -39
  33. data/lib/rggen/core/output_base/component_factory.rb +4 -0
  34. data/lib/rggen/core/output_base/feature.rb +6 -7
  35. data/lib/rggen/core/printers.rb +11 -7
  36. data/lib/rggen/core/register_map.rb +6 -5
  37. data/lib/rggen/core/register_map/component.rb +4 -3
  38. data/lib/rggen/core/register_map/component_factory.rb +18 -1
  39. data/lib/rggen/core/register_map/feature.rb +2 -2
  40. data/lib/rggen/core/register_map/hash_loader.rb +61 -27
  41. data/lib/rggen/core/register_map/input_data.rb +30 -16
  42. data/lib/rggen/core/register_map/loader.rb +1 -1
  43. data/lib/rggen/core/register_map/ruby_loader.rb +1 -1
  44. data/lib/rggen/core/utility/attribute_setter.rb +4 -0
  45. data/lib/rggen/core/utility/code_utility.rb +8 -2
  46. data/lib/rggen/core/utility/error_utility.rb +33 -6
  47. data/lib/rggen/core/version.rb +2 -2
  48. metadata +10 -7
  49. data/lib/rggen/core/base/hierarchical_accessors.rb +0 -91
  50. data/lib/rggen/core/base/hierarchical_feature_accessors.rb +0 -83
  51. data/lib/rggen/core/builder/category.rb +0 -116
  52. data/lib/rggen/core/builder/plugins.rb +0 -77
@@ -6,14 +6,15 @@ module RgGen
6
6
  def self.setup(builder)
7
7
  builder.input_component_registry(:register_map) do
8
8
  register_component [
9
- :register_map, :register_block, :register, :bit_field
10
- ] do |category|
9
+ :root, :register_block, :register_file, :register, :bit_field
10
+ ] do |layer|
11
11
  component Component, ComponentFactory
12
- feature Feature, FeatureFactory if category != :register_map
12
+ feature Feature, FeatureFactory if layer != :root
13
13
  end
14
14
 
15
- base_loader Loader
16
- register_loaders [RubyLoader, JSONLoader, YAMLLoader]
15
+ register_loader :ruby, RubyLoader
16
+ register_loader :yaml, YAMLLoader
17
+ register_loader :json, JSONLoader
17
18
  end
18
19
  end
19
20
  end
@@ -4,15 +4,16 @@ module RgGen
4
4
  module Core
5
5
  module RegisterMap
6
6
  class Component < InputBase::Component
7
- include Base::HierarchicalAccessors
7
+ include Base::ComponentLayerExtension
8
8
 
9
9
  attr_reader :configuration
10
10
 
11
11
  private
12
12
 
13
- def post_initialize(_parent, configuration)
13
+ def post_initialize(configuration)
14
14
  @configuration = configuration
15
- define_hierarchical_accessors
15
+ define_layer_methods
16
+ layer == :bit_field && need_no_children
16
17
  end
17
18
  end
18
19
  end
@@ -4,6 +4,8 @@ module RgGen
4
4
  module Core
5
5
  module RegisterMap
6
6
  class ComponentFactory < InputBase::ComponentFactory
7
+ include RaiseError
8
+
7
9
  private
8
10
 
9
11
  def select_actual_sources(configuration, *_)
@@ -11,7 +13,22 @@ module RgGen
11
13
  end
12
14
 
13
15
  def create_input_data(&block)
14
- RegisterMapData.new(valid_value_lists, &block)
16
+ InputData.new(:root, valid_value_lists, &block)
17
+ end
18
+
19
+ def find_child_factory(_configuration, register_map)
20
+ component_factories[register_map.layer]
21
+ end
22
+
23
+ NO_CHILDREN_ERROR_MESSAGES = {
24
+ root: 'no register blocks are given',
25
+ register_block: 'neither register files nor registers are given',
26
+ register_file: 'neither register files nor registers are given',
27
+ register: 'no bit fields are given'
28
+ }.freeze
29
+
30
+ def raise_no_children_error(comoponent)
31
+ error(NO_CHILDREN_ERROR_MESSAGES[comoponent.layer])
15
32
  end
16
33
  end
17
34
  end
@@ -4,7 +4,7 @@ module RgGen
4
4
  module Core
5
5
  module RegisterMap
6
6
  class Feature < InputBase::Feature
7
- include Base::HierarchicalFeatureAccessors
7
+ include Base::FeatureLayerExtension
8
8
  include RaiseError
9
9
 
10
10
  private
@@ -14,7 +14,7 @@ module RgGen
14
14
  end
15
15
 
16
16
  def post_initialize
17
- define_hierarchical_accessors
17
+ define_layer_methods
18
18
  end
19
19
  end
20
20
  end
@@ -4,42 +4,76 @@ module RgGen
4
4
  module Core
5
5
  module RegisterMap
6
6
  module HashLoader
7
- def format(read_data, file)
8
- format_data(:register_map, register_map, read_data, file)
9
- rescue TypeError => e
10
- raise Core::LoadError.new(e.message, file)
11
- end
12
-
13
7
  private
14
8
 
15
- CHILD_HIERARCHY = {
16
- register_map: :register_block,
17
- register_block: :register,
18
- register: :bit_field
9
+ SUB_LAYER_KEYS = {
10
+ root: [:register_block, :register_blocks],
11
+ register_block: [:register_file, :register_files, :register, :registers],
12
+ register_file: [:register_file, :register_files, :register, :registers],
13
+ register: [:bit_field, :bit_fields]
19
14
  }.freeze
20
15
 
21
- CHILD_HIERARCHY_KEY = {
22
- register_map: :register_blocks,
23
- register_block: :registers,
24
- register: :bit_fields
16
+ SUB_LAYER_KEY_MAP = {
17
+ root: { register_blocks: :register_block },
18
+ register_block: { register_files: :register_file, registers: :register },
19
+ register_file: { register_files: :register_file, registers: :register },
20
+ register: { bit_fields: :bit_field }
25
21
  }.freeze
26
22
 
27
- def format_data(hierarchy, input_data, read_data, file)
28
- read_data = Hash(read_data)
29
- input_data.values(read_data, file)
30
- read_data_for_child(hierarchy, read_data).each do |data|
31
- format_data(
32
- CHILD_HIERARCHY[hierarchy],
33
- input_data.child,
34
- data,
35
- file
36
- )
23
+ def format_layer_data(read_data, layer, file)
24
+ if read_data.is_a?(Array)
25
+ format_array_layer_data(read_data, layer, file)
26
+ else
27
+ fomrat_hash_layer_data(read_data, layer, file)
28
+ end
29
+ end
30
+
31
+ def format_array_layer_data(read_data, layer, file)
32
+ read_data.each_with_object({}) do |data, layer_data|
33
+ layer_data.merge!(fomrat_hash_layer_data(data, layer, file))
34
+ end
35
+ end
36
+
37
+ def fomrat_hash_layer_data(read_data, layer, file)
38
+ convert_to_hash(read_data, file)
39
+ .reject { |key, _| SUB_LAYER_KEYS[layer]&.include?(key) }
40
+ end
41
+
42
+ def format_sub_layer_data(read_data, layer, file)
43
+ if read_data.is_a?(Array)
44
+ format_array_sub_layer_data(read_data, layer, file)
45
+ else
46
+ format_hash_sub_layer_data(read_data, layer, file)
47
+ end
48
+ end
49
+
50
+ def format_array_sub_layer_data(read_data, layer, file)
51
+ read_data.each_with_object({}) do |data, sub_layer_data|
52
+ format_hash_sub_layer_data(data, layer, file, sub_layer_data)
37
53
  end
38
54
  end
39
55
 
40
- def read_data_for_child(hierarchy, read_data)
41
- key = CHILD_HIERARCHY_KEY[hierarchy]
42
- Array(key && read_data[key])
56
+ def format_hash_sub_layer_data(read_data, layer, file, sub_layer_data = {})
57
+ convert_to_hash(read_data, file)
58
+ .select { |key, _| SUB_LAYER_KEYS[layer]&.include?(key) }
59
+ .each do |key, value|
60
+ merge_sub_layer_data(sub_layer_data, layer, key, value)
61
+ end
62
+ sub_layer_data
63
+ end
64
+
65
+ def merge_sub_layer_data(sub_layer_data, layer, key, value)
66
+ if SUB_LAYER_KEY_MAP[layer].key?(key)
67
+ (sub_layer_data[SUB_LAYER_KEY_MAP[layer][key]] ||= []).concat(value)
68
+ else
69
+ (sub_layer_data[key] ||= []) << value
70
+ end
71
+ end
72
+
73
+ def convert_to_hash(read_data, file)
74
+ Hash(read_data)
75
+ rescue TypeError => e
76
+ raise Core::LoadError.new(e.message, file)
43
77
  end
44
78
  end
45
79
  end
@@ -3,30 +3,44 @@
3
3
  module RgGen
4
4
  module Core
5
5
  module RegisterMap
6
- class BitFieldData < InputBase::InputData
7
- end
6
+ class InputData < InputBase::InputData
7
+ module Root
8
+ def register_block(value_list = nil, &block)
9
+ child(:register_block, value_list, &block)
10
+ end
11
+ end
8
12
 
9
- class RegisterData < InputBase::InputData
10
- alias_method :bit_field, :child
13
+ module RegisterBlockRegisterFile
14
+ def register_file(value_list = nil, &block)
15
+ child(:register_file, value_list, &block)
16
+ end
11
17
 
12
- def child_data_class
13
- BitFieldData
18
+ def register(value_list = nil, &block)
19
+ child(:register, value_list, &block)
20
+ end
14
21
  end
15
- end
16
22
 
17
- class RegisterBlockData < InputBase::InputData
18
- alias_method :register, :child
23
+ module Register
24
+ def bit_field(value_list = nil, &block)
25
+ child(:bit_field, value_list, &block)
26
+ end
27
+ end
19
28
 
20
- def child_data_class
21
- RegisterData
29
+ module BitField
30
+ def self.extended(object)
31
+ object.singleton_exec { undef_method :child }
32
+ end
22
33
  end
23
- end
24
34
 
25
- class RegisterMapData < InputBase::InputData
26
- alias_method :register_block, :child
35
+ LAYER_EXTENSIONS = {
36
+ root: Root, register_block: RegisterBlockRegisterFile,
37
+ register_file: RegisterBlockRegisterFile, register: Register,
38
+ bit_field: BitField
39
+ }.freeze
27
40
 
28
- def child_data_class
29
- RegisterBlockData
41
+ def initialize(layer, valid_value_list)
42
+ extend(LAYER_EXTENSIONS[layer])
43
+ super
30
44
  end
31
45
  end
32
46
  end
@@ -6,7 +6,7 @@ module RgGen
6
6
  class Loader < InputBase::Loader
7
7
  private
8
8
 
9
- def register_map
9
+ def root
10
10
  input_data
11
11
  end
12
12
  end
@@ -7,7 +7,7 @@ module RgGen
7
7
  support_types [:rb]
8
8
 
9
9
  def read_file(file)
10
- register_map.load_file(file)
10
+ root.load_file(file)
11
11
  end
12
12
  end
13
13
  end
@@ -24,6 +24,10 @@ module RgGen
24
24
  end
25
25
  end
26
26
  end
27
+
28
+ def inherited(subclass)
29
+ export_instance_variable(:@attributes, subclass, &:dup)
30
+ end
27
31
  end
28
32
 
29
33
  def self.included(class_or_module)
@@ -8,13 +8,15 @@ module RgGen
8
8
  code_block
9
9
  end
10
10
 
11
- private
11
+ module_function
12
12
 
13
13
  def newline
14
14
  "\n"
15
15
  end
16
16
 
17
- alias_method :nl, :newline
17
+ def nl
18
+ newline
19
+ end
18
20
 
19
21
  def comma
20
22
  ','
@@ -36,6 +38,10 @@ module RgGen
36
38
  "\"#{expression}\""
37
39
  end
38
40
 
41
+ def array_name(name, size)
42
+ [name, *size&.map { |s| "[#{s}]" }].join
43
+ end
44
+
39
45
  def code_block(indent = 0, &body)
40
46
  CodeBlock.new(indent, &body)
41
47
  end
@@ -4,14 +4,41 @@ module RgGen
4
4
  module Core
5
5
  module Utility
6
6
  module ErrorUtility
7
- module_function
7
+ class MessageComposer
8
+ def compose(error, verbose, backtrace)
9
+ lines = []
10
+ add_basic_info(error, lines)
11
+ add_verbose_info(error, lines) if verbose
12
+ add_backtrace(error, lines) if backtrace
13
+ lines.join("\n")
14
+ end
15
+
16
+ private
17
+
18
+ def add_basic_info(error, lines)
19
+ lines << "[#{error.class.lastname}] #{error}"
20
+ end
21
+
22
+ def add_verbose_info(error, lines)
23
+ return unless error.respond_to?(:verbose_info)
24
+ return unless error.verbose_info
25
+
26
+ lines << 'verbose information:'
27
+ error
28
+ .verbose_info.lines(chomp: true)
29
+ .each { |info| lines << " #{info}" }
30
+ end
8
31
 
9
- def compose_error_message(error, verbose)
10
- lines = []
11
- lines << "[#{error.class.lastname}] #{error.message}"
12
- verbose &&
32
+ def add_backtrace(error, lines)
33
+ lines << 'backtrace:'
13
34
  error.backtrace.each { |trace| lines << " #{trace}" }
14
- lines.join("\n")
35
+ end
36
+ end
37
+
38
+ module_function
39
+
40
+ def compose_error_message(error, verbose, backtrace)
41
+ MessageComposer.new.compose(error, verbose, backtrace)
15
42
  end
16
43
  end
17
44
  end
@@ -3,8 +3,8 @@
3
3
  module RgGen
4
4
  module Core
5
5
  MAJOR = 0
6
- MINOR = 19
7
- PATCH = 0
6
+ MINOR = 23
7
+ PATCH = 1
8
8
  VERSION = "#{MAJOR}.#{MINOR}.#{PATCH}"
9
9
  end
10
10
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rggen-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.19.0
4
+ version: 0.23.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taichi Ishitani
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-17 00:00:00.000000000 Z
11
+ date: 2020-10-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: docile
@@ -81,23 +81,24 @@ files:
81
81
  - lib/rggen/core.rb
82
82
  - lib/rggen/core/base/component.rb
83
83
  - lib/rggen/core/base/component_factory.rb
84
+ - lib/rggen/core/base/component_layer_extension.rb
84
85
  - lib/rggen/core/base/feature.rb
85
86
  - lib/rggen/core/base/feature_factory.rb
86
- - lib/rggen/core/base/hierarchical_accessors.rb
87
- - lib/rggen/core/base/hierarchical_feature_accessors.rb
87
+ - lib/rggen/core/base/feature_layer_extension.rb
88
88
  - lib/rggen/core/base/internal_struct.rb
89
89
  - lib/rggen/core/base/proxy_call.rb
90
90
  - lib/rggen/core/base/shared_context.rb
91
91
  - lib/rggen/core/builder.rb
92
92
  - lib/rggen/core/builder/builder.rb
93
- - lib/rggen/core/builder/category.rb
94
93
  - lib/rggen/core/builder/component_entry.rb
95
94
  - lib/rggen/core/builder/component_registry.rb
96
95
  - lib/rggen/core/builder/feature_registry.rb
97
96
  - lib/rggen/core/builder/input_component_registry.rb
97
+ - lib/rggen/core/builder/layer.rb
98
98
  - lib/rggen/core/builder/list_feature_entry.rb
99
+ - lib/rggen/core/builder/loader_registry.rb
99
100
  - lib/rggen/core/builder/output_component_registry.rb
100
- - lib/rggen/core/builder/plugins.rb
101
+ - lib/rggen/core/builder/plugin_manager.rb
101
102
  - lib/rggen/core/builder/simple_feature_entry.rb
102
103
  - lib/rggen/core/cli.rb
103
104
  - lib/rggen/core/configuration.rb
@@ -107,6 +108,7 @@ files:
107
108
  - lib/rggen/core/configuration/feature.rb
108
109
  - lib/rggen/core/configuration/feature_factory.rb
109
110
  - lib/rggen/core/configuration/hash_loader.rb
111
+ - lib/rggen/core/configuration/input_data.rb
110
112
  - lib/rggen/core/configuration/json_loader.rb
111
113
  - lib/rggen/core/configuration/loader.rb
112
114
  - lib/rggen/core/configuration/ruby_loader.rb
@@ -123,6 +125,7 @@ files:
123
125
  - lib/rggen/core/input_base/input_data.rb
124
126
  - lib/rggen/core/input_base/input_matcher.rb
125
127
  - lib/rggen/core/input_base/input_value.rb
128
+ - lib/rggen/core/input_base/input_value_extractor.rb
126
129
  - lib/rggen/core/input_base/json_loader.rb
127
130
  - lib/rggen/core/input_base/loader.rb
128
131
  - lib/rggen/core/input_base/property.rb
@@ -186,5 +189,5 @@ requirements: []
186
189
  rubygems_version: 3.1.2
187
190
  signing_key:
188
191
  specification_version: 4
189
- summary: rggen-core-0.19.0
192
+ summary: rggen-core-0.23.1
190
193
  test_files: []
@@ -1,91 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RgGen
4
- module Core
5
- module Base
6
- module HierarchicalAccessors
7
- module RegisterMap
8
- def hierarchy
9
- :register_map
10
- end
11
-
12
- def register_blocks
13
- children
14
- end
15
-
16
- def registers
17
- register_blocks.flat_map(&:children)
18
- end
19
-
20
- def bit_fields
21
- registers.flat_map(&:children)
22
- end
23
- end
24
-
25
- module RegisterBlock
26
- def hierarchy
27
- :register_block
28
- end
29
-
30
- def register_map
31
- parent
32
- end
33
-
34
- def registers
35
- children
36
- end
37
-
38
- def bit_fields
39
- registers.flat_map(&:children)
40
- end
41
- end
42
-
43
- module Register
44
- def hierarchy
45
- :register
46
- end
47
-
48
- def register_map
49
- register_block.parent
50
- end
51
-
52
- def register_block
53
- parent
54
- end
55
-
56
- def bit_fields
57
- children
58
- end
59
- end
60
-
61
- module BitField
62
- def hierarchy
63
- :bit_field
64
- end
65
-
66
- def register_map
67
- register_block.parent
68
- end
69
-
70
- def register_block
71
- register.parent
72
- end
73
-
74
- def register
75
- parent
76
- end
77
- end
78
-
79
- private
80
-
81
- ACCESSOR_EXTENSIONS = [
82
- RegisterMap, RegisterBlock, Register, BitField
83
- ].freeze
84
-
85
- def define_hierarchical_accessors
86
- extend ACCESSOR_EXTENSIONS[level]
87
- end
88
- end
89
- end
90
- end
91
- end