rggen-core 0.19.0 → 0.20.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 (37) hide show
  1. checksums.yaml +4 -4
  2. data/exe/rggen +0 -0
  3. data/lib/rggen/core.rb +4 -3
  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 +25 -25
  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/{category.rb → layer.rb} +27 -26
  12. data/lib/rggen/core/builder/plugins.rb +5 -3
  13. data/lib/rggen/core/configuration/component.rb +5 -0
  14. data/lib/rggen/core/configuration/component_factory.rb +1 -1
  15. data/lib/rggen/core/configuration/input_data.rb +15 -0
  16. data/lib/rggen/core/input_base/component_factory.rb +37 -6
  17. data/lib/rggen/core/input_base/feature.rb +3 -3
  18. data/lib/rggen/core/input_base/input_data.rb +13 -10
  19. data/lib/rggen/core/input_base/loader.rb +2 -3
  20. data/lib/rggen/core/input_base/yaml_loader.rb +5 -4
  21. data/lib/rggen/core/output_base/code_generator.rb +10 -23
  22. data/lib/rggen/core/output_base/component.rb +42 -39
  23. data/lib/rggen/core/output_base/component_factory.rb +4 -0
  24. data/lib/rggen/core/output_base/feature.rb +6 -7
  25. data/lib/rggen/core/register_map.rb +3 -3
  26. data/lib/rggen/core/register_map/component.rb +4 -3
  27. data/lib/rggen/core/register_map/component_factory.rb +18 -1
  28. data/lib/rggen/core/register_map/feature.rb +2 -2
  29. data/lib/rggen/core/register_map/hash_loader.rb +16 -23
  30. data/lib/rggen/core/register_map/input_data.rb +30 -16
  31. data/lib/rggen/core/register_map/loader.rb +1 -1
  32. data/lib/rggen/core/register_map/ruby_loader.rb +1 -1
  33. data/lib/rggen/core/utility/code_utility.rb +8 -2
  34. data/lib/rggen/core/version.rb +1 -1
  35. metadata +7 -6
  36. data/lib/rggen/core/base/hierarchical_accessors.rb +0 -91
  37. data/lib/rggen/core/base/hierarchical_feature_accessors.rb +0 -83
@@ -6,7 +6,7 @@ module RgGen
6
6
  class Builder
7
7
  def initialize
8
8
  initialize_component_registries
9
- initialize_categories
9
+ initialize_layers
10
10
  @plugins = Plugins.new
11
11
  end
12
12
 
@@ -32,15 +32,15 @@ module RgGen
32
32
  @component_registries[:input][component].define_loader(&body)
33
33
  end
34
34
 
35
- def add_feature_registry(name, target_category, registry)
36
- target_categories =
37
- if target_category
38
- Array(@categories[target_category])
35
+ def add_feature_registry(name, target_layer, registry)
36
+ target_layers =
37
+ if target_layer
38
+ Array(@layers[target_layer])
39
39
  else
40
- @categories.values
40
+ @layers.values
41
41
  end
42
- target_categories.each do |category|
43
- category.add_feature_registry(name, registry)
42
+ target_layers.each do |layer|
43
+ layer.add_feature_registry(name, registry)
44
44
  end
45
45
  end
46
46
 
@@ -49,21 +49,21 @@ module RgGen
49
49
  :define_list_feature,
50
50
  :define_list_item_feature
51
51
  ].each do |method_name|
52
- define_method(method_name) do |category, *args, &body|
53
- @categories[category].__send__(__method__, *args, &body)
52
+ define_method(method_name) do |layer, *args, &body|
53
+ @layers[layer].__send__(__method__, *args, &body)
54
54
  end
55
55
  end
56
56
 
57
- def enable(category, *args)
58
- @categories[category].enable(*args)
57
+ def enable(layer, *args)
58
+ @layers[layer].enable(*args)
59
59
  end
60
60
 
61
61
  def disable_all
62
- @categories.each_value(&:disable)
62
+ @layers.each_value(&:disable)
63
63
  end
64
64
 
65
- def disable(category, *args)
66
- @categories.key?(category) && @categories[category].disable(*args)
65
+ def disable(layer, *args)
66
+ @layers.key?(layer) && @layers[layer].disable(*args)
67
67
  end
68
68
 
69
69
  def build_factory(type, component)
@@ -81,8 +81,8 @@ module RgGen
81
81
  registries.each_value.map(&:build_factory)
82
82
  end
83
83
 
84
- def delete(category, *args)
85
- @categories.key?(category) && @categories[category].delete(*args)
84
+ def delete(layer, *args)
85
+ @layers.key?(layer) && @layers[layer].delete(*args)
86
86
  end
87
87
 
88
88
  def register_input_components
@@ -94,8 +94,8 @@ module RgGen
94
94
  plugins.add(name, module_or_version, &block)
95
95
  end
96
96
 
97
- def activate_plugins
98
- plugins.activate(self)
97
+ def activate_plugins(**options)
98
+ plugins.activate(self, **options)
99
99
  end
100
100
 
101
101
  def load_setup_file(file, activation = true)
@@ -119,14 +119,14 @@ module RgGen
119
119
  end
120
120
  end
121
121
 
122
- def initialize_categories
123
- @categories = Hash.new do |_, category_name|
124
- raise BuilderError.new("unknown category: #{category_name}")
122
+ def initialize_layers
123
+ @layers = Hash.new do |_, layer_name|
124
+ raise BuilderError.new("unknown layer: #{layer_name}")
125
125
  end
126
126
  [
127
- :global, :register_map, :register_block, :register, :bit_field
128
- ].each do |category|
129
- @categories[category] = Category.new(category)
127
+ :global, :root, :register_block, :register_file, :register, :bit_field
128
+ ].each do |layer|
129
+ @layers[layer] = Layer.new(layer)
130
130
  end
131
131
  end
132
132
 
@@ -6,8 +6,9 @@ module RgGen
6
6
  class ComponentEntry
7
7
  Entry = Struct.new(:target, :factory)
8
8
 
9
- def initialize(component_name)
9
+ def initialize(component_name, layer)
10
10
  @component_name = component_name
11
+ @layer = layer
11
12
  end
12
13
 
13
14
  [:component, :feature].each do |entry_name|
@@ -22,7 +23,7 @@ module RgGen
22
23
  end
23
24
 
24
25
  def build_factory
25
- @component.factory.new(@component_name) do |f|
26
+ @component.factory.new(@component_name, @layer) do |f|
26
27
  f.target_component(@component.target)
27
28
  f.feature_factories(feature_registry&.build_factories)
28
29
  end
@@ -10,10 +10,10 @@ module RgGen
10
10
  @entries = []
11
11
  end
12
12
 
13
- def register_component(categories = nil, &block)
14
- if categories
15
- Array(categories).each do |category|
16
- @entries << create_new_entry(category, block)
13
+ def register_component(layers = nil, &block)
14
+ if layers
15
+ Array(layers).each do |layer|
16
+ @entries << create_new_entry(layer, block)
17
17
  end
18
18
  else
19
19
  @entries << create_new_entry(nil, block)
@@ -21,26 +21,31 @@ module RgGen
21
21
  end
22
22
 
23
23
  def build_factory
24
- factories = @entries.map(&:build_factory)
25
- factories.each_cons(2) { |(f0, f1)| f0.child_factory(f1) }
26
- root_factory = factories.first
27
- root_factory.root_factory
28
- root_factory
24
+ build_factories.first.tap(&:root_factory)
29
25
  end
30
26
 
31
27
  private
32
28
 
33
- def create_new_entry(category, block)
34
- entry = ComponentEntry.new(@component_name)
35
- Docile.dsl_eval(entry, category, &block)
36
- add_feature_registry(category, entry.feature_registry)
29
+ def create_new_entry(layer, block)
30
+ entry = ComponentEntry.new(@component_name, layer)
31
+ Docile.dsl_eval(entry, layer, &block)
32
+ add_feature_registry(layer, entry.feature_registry)
37
33
  entry
38
34
  end
39
35
 
40
- def add_feature_registry(category, feature_registry)
41
- feature_registry || return
42
- @builder
43
- .add_feature_registry(@component_name, category, feature_registry)
36
+ def add_feature_registry(layer, feature_registry)
37
+ feature_registry &&
38
+ @builder
39
+ .add_feature_registry(@component_name, layer, feature_registry)
40
+ end
41
+
42
+ def build_factories
43
+ factories =
44
+ @entries
45
+ .map(&:build_factory)
46
+ .map { |f| [f.layer, f] }.to_h
47
+ factories.each_value { |f| f.component_factories factories }
48
+ factories.values
44
49
  end
45
50
  end
46
51
  end
@@ -3,13 +3,14 @@
3
3
  module RgGen
4
4
  module Core
5
5
  module Builder
6
- class Category
6
+ class Layer
7
7
  class Proxy
8
- def initialize(body)
9
- body.call(self)
8
+ def initialize
9
+ block_given? && yield(self)
10
10
  end
11
11
 
12
- attr_setter :method
12
+ attr_setter :body
13
+ attr_setter :method_name
13
14
  attr_setter :list_names
14
15
  attr_setter :feature_names
15
16
 
@@ -21,25 +22,22 @@ module RgGen
21
22
  @shared_context
22
23
  end
23
24
 
24
- def register_execution(registry, args, body)
25
+ def register_execution(registry, &body)
25
26
  @executions ||= []
26
- @executions << { registry: registry, args: args, body: body }
27
+ @executions << { registry: registry, body: body }
27
28
  end
28
29
 
29
- def execute(category, body)
30
- Docile.dsl_eval(category, &body)
31
- Array(@executions).each { |execution| call_execution(execution) }
30
+ def execute(layer)
31
+ Docile.dsl_eval(layer, &body)
32
+ @executions&.each(&method(:call_execution))
32
33
  end
33
34
 
34
35
  private
35
36
 
36
37
  def call_execution(execution)
37
- send_args = [
38
- list_names, feature_names, shared_context, *execution[:args]
39
- ].compact
40
- execution[:registry].__send__(
41
- method, *send_args, &execution[:body]
42
- )
38
+ args = [list_names, feature_names, shared_context].compact
39
+ execution[:registry]
40
+ .__send__(method_name, *args, &execution[:body])
43
41
  end
44
42
  end
45
43
 
@@ -58,22 +56,25 @@ module RgGen
58
56
  end
59
57
 
60
58
  def define_simple_feature(feature_names, &body)
61
- do_proxy_call(body) do |proxy|
62
- proxy.method(__method__)
59
+ do_proxy_call do |proxy|
60
+ proxy.body(body)
61
+ proxy.method_name(__method__)
63
62
  proxy.feature_names(feature_names)
64
63
  end
65
64
  end
66
65
 
67
66
  def define_list_feature(list_names, &body)
68
- do_proxy_call(body) do |proxy|
69
- proxy.method(__method__)
67
+ do_proxy_call do |proxy|
68
+ proxy.body(body)
69
+ proxy.method_name(__method__)
70
70
  proxy.list_names(list_names)
71
71
  end
72
72
  end
73
73
 
74
74
  def define_list_item_feature(list_name, feature_names, &body)
75
- do_proxy_call(body) do |proxy|
76
- proxy.method(__method__)
75
+ do_proxy_call do |proxy|
76
+ proxy.body(body)
77
+ proxy.method_name(__method__)
77
78
  proxy.list_names(list_name)
78
79
  proxy.feature_names(feature_names)
79
80
  end
@@ -100,14 +101,14 @@ module RgGen
100
101
  private
101
102
 
102
103
  def define_proxy_call(name)
103
- define_singleton_method(name) do |*args, &body|
104
- @proxy.register_execution(@feature_registries[name], args, body)
104
+ define_singleton_method(name) do |&body|
105
+ @proxy.register_execution(@feature_registries[__method__], &body)
105
106
  end
106
107
  end
107
108
 
108
- def do_proxy_call(body, &proxy_block)
109
- @proxy = Proxy.new(proxy_block)
110
- @proxy.execute(self, body)
109
+ def do_proxy_call(&block)
110
+ @proxy = Proxy.new(&block)
111
+ @proxy.execute(self)
111
112
  remove_instance_variable(:@proxy)
112
113
  end
113
114
  end
@@ -63,9 +63,11 @@ module RgGen
63
63
  @plugins << Plugin.new(name, module_or_version, &block)
64
64
  end
65
65
 
66
- def activate(builder)
67
- @plugins.each { |plugin| plugin.default_setup(builder) }
68
- @plugins.each { |plugin| plugin.optional_setup(builder) }
66
+ def activate(builder, **options)
67
+ options[:no_default_setup] ||
68
+ @plugins.each { |plugin| plugin.default_setup(builder) }
69
+ options[:no_optional_setup] ||
70
+ @plugins.each { |plugin| plugin.optional_setup(builder) }
69
71
  end
70
72
 
71
73
  def version_info
@@ -4,6 +4,11 @@ module RgGen
4
4
  module Core
5
5
  module Configuration
6
6
  class Component < InputBase::Component
7
+ private
8
+
9
+ def post_initialize
10
+ need_no_children
11
+ end
7
12
  end
8
13
  end
9
14
  end
@@ -7,7 +7,7 @@ module RgGen
7
7
  private
8
8
 
9
9
  def create_input_data(&block)
10
- InputBase::InputData.new(valid_value_lists, &block)
10
+ InputData.new(valid_value_lists, &block)
11
11
  end
12
12
  end
13
13
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module Core
5
+ module Configuration
6
+ class InputData < InputBase::InputData
7
+ def initialize(valid_value_lists, &block)
8
+ super(nil, valid_value_lists, &block)
9
+ end
10
+
11
+ undef_method :child
12
+ end
13
+ end
14
+ end
15
+ end
@@ -4,6 +4,20 @@ module RgGen
4
4
  module Core
5
5
  module InputBase
6
6
  class ComponentFactory < Base::ComponentFactory
7
+ class << self
8
+ def enable_no_children_error
9
+ @enable_no_children_error = true
10
+ end
11
+
12
+ def disable_no_children_error
13
+ @enable_no_children_error = false
14
+ end
15
+
16
+ def enable_no_children_error?
17
+ @enable_no_children_error.nil? || @enable_no_children_error
18
+ end
19
+ end
20
+
7
21
  attr_setter :loaders
8
22
 
9
23
  private
@@ -27,8 +41,13 @@ module RgGen
27
41
  end
28
42
 
29
43
  def find_loader(file)
30
- loader = loaders.find { |l| l.support?(file) }
31
- loader || (raise Core::LoadError.new('unsupported file type', file))
44
+ loaders.find { |l| l.support?(file) } ||
45
+ (raise Core::LoadError.new('unsupported file type', file))
46
+ end
47
+
48
+ def valid_value_lists
49
+ component_factories
50
+ .transform_values(&->(f) { f.valid_value_list })
32
51
  end
33
52
 
34
53
  def create_input_data(&block)
@@ -58,9 +77,23 @@ module RgGen
58
77
  end
59
78
 
60
79
  def post_build(component)
80
+ exist_no_children?(component) &&
81
+ raise_no_children_error(component)
61
82
  component.verify(:component)
62
83
  end
63
84
 
85
+ def exist_no_children?(component)
86
+ enable_no_children_error? &&
87
+ component.need_children? && component.children.empty?
88
+ end
89
+
90
+ def enable_no_children_error?
91
+ self.class.enable_no_children_error?
92
+ end
93
+
94
+ def raise_no_children_error(_component)
95
+ end
96
+
64
97
  def finalize(component)
65
98
  component.verify(:all)
66
99
  end
@@ -77,10 +110,8 @@ module RgGen
77
110
 
78
111
  protected
79
112
 
80
- def valid_value_lists
81
- list = [Array(active_feature_factories&.keys)]
82
- list.concat(Array(child_factory&.valid_value_lists))
83
- list
113
+ def valid_value_list
114
+ Array(active_feature_factories&.keys)
84
115
  end
85
116
  end
86
117
  end
@@ -80,9 +80,9 @@ module RgGen
80
80
  end
81
81
 
82
82
  def export_verifiers(subclass)
83
- copied_verifiers =
84
- @verifiers.map { |scope, blocks| [scope, blocks.dup] }.to_h
85
- subclass.instance_variable_set(:@verifiers, copied_verifiers)
83
+ subclass.instance_variable_set(
84
+ :@verifiers, @verifiers.transform_values(&:dup)
85
+ )
86
86
  end
87
87
  end
88
88
 
@@ -4,7 +4,8 @@ module RgGen
4
4
  module Core
5
5
  module InputBase
6
6
  class InputData
7
- def initialize(valid_value_lists)
7
+ def initialize(layer, valid_value_lists)
8
+ @layer = layer
8
9
  @valid_value_lists = valid_value_lists
9
10
  @values = Hash.new(NAValue)
10
11
  @children = []
@@ -12,6 +13,8 @@ module RgGen
12
13
  block_given? && yield(self)
13
14
  end
14
15
 
16
+ attr_reader :layer
17
+
15
18
  def value(value_name, value, position = nil)
16
19
  symbolized_name = value_name.to_sym
17
20
  return unless valid_value?(symbolized_name)
@@ -24,8 +27,8 @@ module RgGen
24
27
  end
25
28
  end
26
29
 
27
- def []=(value_name, position = nil, value)
28
- value(value_name, value, position)
30
+ def []=(value_name, position_or_value, value = nil)
31
+ value(value_name, value || position_or_value, position_or_value)
29
32
  end
30
33
 
31
34
  def [](value_name)
@@ -39,8 +42,8 @@ module RgGen
39
42
 
40
43
  attr_reader :children
41
44
 
42
- def child(value_list = nil, &block)
43
- create_child_data do |child_data|
45
+ def child(layer, value_list = nil, &block)
46
+ create_child_data(layer) do |child_data|
44
47
  child_data.build_by_block(block)
45
48
  child_data.values(value_list)
46
49
  @children << child_data
@@ -56,11 +59,11 @@ module RgGen
56
59
  private
57
60
 
58
61
  def valid_value?(value_name)
59
- @valid_value_lists.first.include?(value_name)
62
+ @valid_value_lists[layer].include?(value_name)
60
63
  end
61
64
 
62
65
  def define_setter_methods
63
- @valid_value_lists.first.each(&method(:define_setter_method))
66
+ @valid_value_lists[layer].each(&method(:define_setter_method))
64
67
  end
65
68
 
66
69
  def define_setter_method(value_name)
@@ -79,12 +82,12 @@ module RgGen
79
82
  locations[0].path.include?('docile') ? locations[1] : locations[0]
80
83
  end
81
84
 
82
- def create_child_data(&block)
83
- child_data_class.new(@valid_value_lists[1..-1], &block)
85
+ def create_child_data(layer, &block)
86
+ child_data_class.new(layer, @valid_value_lists, &block)
84
87
  end
85
88
 
86
89
  def child_data_class
87
- InputData
90
+ self.class
88
91
  end
89
92
 
90
93
  protected