rggen-core 0.15.0 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +2 -2
  4. data/exe/rggen +0 -0
  5. data/lib/rggen/core.rb +4 -4
  6. data/lib/rggen/core/base/component.rb +25 -4
  7. data/lib/rggen/core/base/component_factory.rb +22 -9
  8. data/lib/rggen/core/base/component_layer_extension.rb +194 -0
  9. data/lib/rggen/core/base/feature.rb +16 -3
  10. data/lib/rggen/core/base/feature_factory.rb +7 -5
  11. data/lib/rggen/core/base/feature_layer_extension.rb +158 -0
  12. data/lib/rggen/core/builder/builder.rb +25 -25
  13. data/lib/rggen/core/builder/component_entry.rb +6 -1
  14. data/lib/rggen/core/builder/component_registry.rb +24 -18
  15. data/lib/rggen/core/builder/{category.rb → layer.rb} +27 -26
  16. data/lib/rggen/core/builder/plugins.rb +5 -3
  17. data/lib/rggen/core/configuration/component.rb +5 -0
  18. data/lib/rggen/core/configuration/component_factory.rb +1 -5
  19. data/lib/rggen/core/configuration/input_data.rb +15 -0
  20. data/lib/rggen/core/input_base/component_factory.rb +37 -6
  21. data/lib/rggen/core/input_base/feature.rb +15 -5
  22. data/lib/rggen/core/input_base/input_data.rb +13 -10
  23. data/lib/rggen/core/input_base/input_matcher.rb +15 -16
  24. data/lib/rggen/core/input_base/loader.rb +2 -3
  25. data/lib/rggen/core/input_base/verifier.rb +6 -7
  26. data/lib/rggen/core/input_base/yaml_loader.rb +22 -17
  27. data/lib/rggen/core/output_base/code_generator.rb +10 -23
  28. data/lib/rggen/core/output_base/component.rb +42 -39
  29. data/lib/rggen/core/output_base/component_factory.rb +6 -2
  30. data/lib/rggen/core/output_base/feature.rb +6 -7
  31. data/lib/rggen/core/printers.rb +2 -2
  32. data/lib/rggen/core/register_map.rb +3 -3
  33. data/lib/rggen/core/register_map/component.rb +4 -3
  34. data/lib/rggen/core/register_map/component_factory.rb +20 -3
  35. data/lib/rggen/core/register_map/feature.rb +2 -2
  36. data/lib/rggen/core/register_map/hash_loader.rb +16 -23
  37. data/lib/rggen/core/register_map/input_data.rb +30 -16
  38. data/lib/rggen/core/register_map/loader.rb +1 -1
  39. data/lib/rggen/core/register_map/ruby_loader.rb +1 -1
  40. data/lib/rggen/core/utility/code_utility.rb +8 -2
  41. data/lib/rggen/core/version.rb +1 -1
  42. metadata +9 -9
  43. data/lib/rggen/core/base/hierarchical_accessors.rb +0 -91
  44. data/lib/rggen/core/base/hierarchical_feature_accessors.rb +0 -83
  45. data/lib/rggen/core/core_extensions/casecmp.rb +0 -12
@@ -4,22 +4,21 @@ module RgGen
4
4
  module Core
5
5
  module OutputBase
6
6
  class Component < Base::Component
7
- include Base::HierarchicalAccessors
7
+ include Base::ComponentLayerExtension
8
8
 
9
9
  attr_reader :configuration
10
- attr_reader :source
10
+ attr_reader :register_map
11
11
 
12
- def post_initialize(_paren, configuration, source)
12
+ def post_initialize(configuration, register_map)
13
13
  @configuration = configuration
14
- @source = source
15
- @need_children = source.need_children?
16
- define_hierarchical_accessors
17
- define_children_presense_indicator
18
- define_proxy_calls(@source, @source.properties)
14
+ @register_map = register_map
15
+ @need_children = register_map.need_children?
16
+ define_layer_methods
17
+ define_proxy_calls(@register_map, @register_map.properties)
19
18
  end
20
19
 
21
20
  def children?
22
- !source.children.empty?
21
+ !register_map.children.empty?
23
22
  end
24
23
 
25
24
  def add_feature(feature)
@@ -28,7 +27,7 @@ module RgGen
28
27
  end
29
28
 
30
29
  def printables
31
- @source.printables
30
+ register_map.printables
32
31
  end
33
32
 
34
33
  def pre_build
@@ -40,8 +39,9 @@ module RgGen
40
39
  @children.each(&:build)
41
40
  end
42
41
 
43
- def generate_code(kind, mode, code = nil)
44
- code_generators(kind, mode).inject(code) { |c, g| g[c] }
42
+ def generate_code(code, kind, mode, target_or_range = nil, depth = 0)
43
+ code_generator_contexts(kind, mode, target_or_range, depth)
44
+ .each { |context| context.generate(code) }
45
45
  end
46
46
 
47
47
  def write_file(directory = nil)
@@ -51,18 +51,6 @@ module RgGen
51
51
 
52
52
  private
53
53
 
54
- INDICATOR_NAMES = {
55
- register_map: :register_blocks?,
56
- register_block: :registers?,
57
- register: :bit_fields?
58
- }.freeze
59
-
60
- def define_children_presense_indicator
61
- indicator_name = INDICATOR_NAMES[hierarchy]
62
- indicator_name &&
63
- singleton_exec { alias_method indicator_name, :children? }
64
- end
65
-
66
54
  def build_feature(feature)
67
55
  feature.build
68
56
  import_feature_methods(feature, :object)
@@ -73,25 +61,40 @@ module RgGen
73
61
  define_proxy_calls(feature, methods)
74
62
  end
75
63
 
76
- def code_generators(kind, mode)
64
+ CodeGeneratorContext = Struct.new(:receivers, :args) do
65
+ def generate(code)
66
+ receivers.each { |receiver| receiver.generate_code(code, *args) }
67
+ end
68
+ end
69
+
70
+ def code_generator_contexts(kind, mode, target_or_range, depth)
77
71
  [
78
- [@features.each_value, [:pre_code, kind]],
79
- *main_code_contexts(kind, mode),
80
- [@features.each_value, [:post_code, kind]]
81
- ].map do |receivers, args|
82
- lambda do |code|
83
- receivers.inject(code) { |c, r| r.generate_code(*args, c) }
84
- end
72
+ feature_code_generator_context(:pre_code, kind, target_or_range, depth),
73
+ *main_code_generator_contexts(kind, mode, target_or_range, depth),
74
+ feature_code_generator_context(:post_code, kind, target_or_range, depth)
75
+ ].compact
76
+ end
77
+
78
+ def feature_code_generator_context(phase, kind, target_or_range, depth)
79
+ (target_depth?(depth, target_or_range) || nil) &&
80
+ CodeGeneratorContext.new(@features.each_value, [phase, kind])
81
+ end
82
+
83
+ def target_depth?(depth, target_or_range)
84
+ if target_or_range.nil?
85
+ true
86
+ elsif target_or_range.respond_to?(:include?)
87
+ target_or_range.include?(depth)
88
+ else
89
+ depth == target_or_range
85
90
  end
86
91
  end
87
92
 
88
- def main_code_contexts(kind, mode)
89
- contexts = [
90
- [@features.each_value, [:main_code, kind]],
91
- [@children, [kind, mode]]
92
- ]
93
- contexts.reverse! if mode == :bottom_up
94
- contexts
93
+ def main_code_generator_contexts(kind, mode, target_or_range, depth)
94
+ [
95
+ feature_code_generator_context(:main_code, kind, target_or_range, depth),
96
+ CodeGeneratorContext.new(@children, [kind, mode, target_or_range, depth + 1])
97
+ ].tap { |contexts| mode == :bottom_up && contexts.reverse! }
95
98
  end
96
99
  end
97
100
  end
@@ -6,8 +6,8 @@ module RgGen
6
6
  class ComponentFactory < Base::ComponentFactory
7
7
  private
8
8
 
9
- def create_component(parent, configuration, register_map, &block)
10
- target_component.new(parent, configuration, register_map, &block)
9
+ def select_actual_sources(configuration, register_map)
10
+ [configuration, register_map]
11
11
  end
12
12
 
13
13
  def create_features(component, configuration, register_map)
@@ -22,6 +22,10 @@ module RgGen
22
22
  end
23
23
  end
24
24
 
25
+ def find_child_factory(_configuration, register_map)
26
+ component_factories[register_map.layer]
27
+ end
28
+
25
29
  def post_build(component)
26
30
  component.pre_build
27
31
  end
@@ -4,7 +4,7 @@ module RgGen
4
4
  module Core
5
5
  module OutputBase
6
6
  class Feature < Base::Feature
7
- include Base::HierarchicalFeatureAccessors
7
+ include Base::FeatureLayerExtension
8
8
  include RaiseError
9
9
 
10
10
  class << self
@@ -64,9 +64,8 @@ module RgGen
64
64
 
65
65
  def export(*methods)
66
66
  methods.each do |method|
67
- exported_methods.include?(method) || (
68
- exported_methods << method
69
- )
67
+ exported_methods.include?(method) ||
68
+ (exported_methods << method)
70
69
  end
71
70
  end
72
71
  end
@@ -90,7 +89,7 @@ module RgGen
90
89
  end
91
90
 
92
91
  def post_initialize
93
- define_hierarchical_accessors
92
+ define_layer_methods
94
93
  end
95
94
 
96
95
  def pre_build
@@ -122,9 +121,9 @@ module RgGen
122
121
  end
123
122
  end
124
123
 
125
- def generate_code(phase, kind, code = nil)
124
+ def generate_code(code, phase, kind)
126
125
  generator = self.class.code_generators[phase]
127
- (generator&.generate(self, kind, code)) || code
126
+ generator&.generate(self, code, kind)
128
127
  end
129
128
 
130
129
  def write_file(directory = nil)
@@ -19,7 +19,7 @@ module RgGen
19
19
 
20
20
  def run(builder, options)
21
21
  verbose? && load_setup_file(builder, options[:setup])
22
- puts help_message(builder)
22
+ puts version_message(builder)
23
23
  end
24
24
 
25
25
  private
@@ -32,7 +32,7 @@ module RgGen
32
32
  file.nil? || file.empty? || builder.load_setup_file(file, false)
33
33
  end
34
34
 
35
- def help_message(builder)
35
+ def version_message(builder)
36
36
  [
37
37
  simple_version,
38
38
  *(verbose? && verbose_version(builder) || nil)
@@ -6,10 +6,10 @@ 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
15
  base_loader Loader
@@ -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,14 +4,31 @@ 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
- def create_component(parent, configuration, _, &block)
10
- @target_component.new(parent, configuration, &block)
11
+ def select_actual_sources(configuration, *_)
12
+ configuration
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
@@ -5,41 +5,34 @@ module RgGen
5
5
  module RegisterMap
6
6
  module HashLoader
7
7
  def format(read_data, file)
8
- format_data(:register_map, register_map, read_data, file)
8
+ format_data(:root, root, read_data, file)
9
9
  rescue TypeError => e
10
10
  raise Core::LoadError.new(e.message, file)
11
11
  end
12
12
 
13
13
  private
14
14
 
15
- CHILD_HIERARCHY = {
16
- register_map: :register_block,
17
- register_block: :register,
18
- register: :bit_field
15
+ LAYER_MAP = {
16
+ root: { register_blocks: :register_block },
17
+ register_block: { register_files: :register_file, registers: :register },
18
+ register_file: { register_files: :register_file, registers: :register },
19
+ register: { bit_fields: :bit_field }
19
20
  }.freeze
20
21
 
21
- CHILD_HIERARCHY_KEY = {
22
- register_map: :register_blocks,
23
- register_block: :registers,
24
- register: :bit_fields
25
- }.freeze
26
-
27
- def format_data(hierarchy, input_data, read_data, file)
22
+ def format_data(layer, input_data, read_data, file)
28
23
  read_data = Hash(read_data)
29
24
  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
- )
37
- end
25
+ format_next_layer_data(layer, input_data, read_data, file)
38
26
  end
39
27
 
40
- def read_data_for_child(hierarchy, read_data)
41
- key = CHILD_HIERARCHY_KEY[hierarchy]
42
- Array(key && read_data[key])
28
+ def format_next_layer_data(layer, input_data, read_data, file)
29
+ LAYER_MAP[layer]&.each do |key, next_layer|
30
+ Array(read_data[key]).each do |data|
31
+ format_data(
32
+ next_layer, input_data.child(next_layer), data, file
33
+ )
34
+ end
35
+ end
43
36
  end
44
37
  end
45
38
  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
@@ -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