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.
- checksums.yaml +4 -4
- data/exe/rggen +0 -0
- data/lib/rggen/core.rb +4 -3
- data/lib/rggen/core/base/component.rb +16 -7
- data/lib/rggen/core/base/component_factory.rb +12 -9
- data/lib/rggen/core/base/component_layer_extension.rb +194 -0
- data/lib/rggen/core/base/feature_layer_extension.rb +158 -0
- data/lib/rggen/core/builder/builder.rb +25 -25
- data/lib/rggen/core/builder/component_entry.rb +3 -2
- data/lib/rggen/core/builder/component_registry.rb +22 -17
- data/lib/rggen/core/builder/{category.rb → layer.rb} +27 -26
- data/lib/rggen/core/builder/plugins.rb +5 -3
- data/lib/rggen/core/configuration/component.rb +5 -0
- data/lib/rggen/core/configuration/component_factory.rb +1 -1
- data/lib/rggen/core/configuration/input_data.rb +15 -0
- data/lib/rggen/core/input_base/component_factory.rb +37 -6
- data/lib/rggen/core/input_base/feature.rb +3 -3
- data/lib/rggen/core/input_base/input_data.rb +13 -10
- data/lib/rggen/core/input_base/loader.rb +2 -3
- data/lib/rggen/core/input_base/yaml_loader.rb +5 -4
- data/lib/rggen/core/output_base/code_generator.rb +10 -23
- data/lib/rggen/core/output_base/component.rb +42 -39
- data/lib/rggen/core/output_base/component_factory.rb +4 -0
- data/lib/rggen/core/output_base/feature.rb +6 -7
- data/lib/rggen/core/register_map.rb +3 -3
- data/lib/rggen/core/register_map/component.rb +4 -3
- data/lib/rggen/core/register_map/component_factory.rb +18 -1
- data/lib/rggen/core/register_map/feature.rb +2 -2
- data/lib/rggen/core/register_map/hash_loader.rb +16 -23
- data/lib/rggen/core/register_map/input_data.rb +30 -16
- data/lib/rggen/core/register_map/loader.rb +1 -1
- data/lib/rggen/core/register_map/ruby_loader.rb +1 -1
- data/lib/rggen/core/utility/code_utility.rb +8 -2
- data/lib/rggen/core/version.rb +1 -1
- metadata +7 -6
- data/lib/rggen/core/base/hierarchical_accessors.rb +0 -91
- data/lib/rggen/core/base/hierarchical_feature_accessors.rb +0 -83
@@ -25,9 +25,8 @@ module RgGen
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def load_file(file)
|
28
|
-
File.readable?(file) ||
|
29
|
-
raise Core::LoadError.new('cannot load such file', file)
|
30
|
-
)
|
28
|
+
File.readable?(file) ||
|
29
|
+
(raise Core::LoadError.new('cannot load such file', file))
|
31
30
|
format(read_file(file), file)
|
32
31
|
end
|
33
32
|
|
@@ -26,13 +26,14 @@ module RgGen
|
|
26
26
|
|
27
27
|
def symbolize_keys(result)
|
28
28
|
if result.is_a? Hash
|
29
|
-
result.
|
30
|
-
|
29
|
+
result.each_with_object({}) do |(key, value), hash|
|
30
|
+
hash[key.to_sym] = symbolize_keys(value)
|
31
31
|
end
|
32
32
|
elsif result.is_a? Array
|
33
|
-
result.map
|
33
|
+
result.map(&method(:symbolize_keys))
|
34
|
+
else
|
35
|
+
result
|
34
36
|
end
|
35
|
-
result
|
36
37
|
end
|
37
38
|
end
|
38
39
|
|
@@ -9,11 +9,10 @@ module RgGen
|
|
9
9
|
code_blocks[kind] << block
|
10
10
|
end
|
11
11
|
|
12
|
-
def generate(context,
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
)
|
12
|
+
def generate(context, code, kind)
|
13
|
+
code_blocks[kind].each do |block|
|
14
|
+
execute_code_block(context, code, block)
|
15
|
+
end
|
17
16
|
end
|
18
17
|
|
19
18
|
def copy
|
@@ -28,30 +27,18 @@ module RgGen
|
|
28
27
|
@code_blocks ||= Hash.new { |blocks, kind| blocks[kind] = [] }
|
29
28
|
end
|
30
29
|
|
31
|
-
def
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
code_blocks[kind].each(&code_block_executor(context, code))
|
37
|
-
code
|
38
|
-
end
|
39
|
-
|
40
|
-
def code_block_executor(context, code)
|
41
|
-
lambda do |block|
|
42
|
-
if block.arity.zero?
|
43
|
-
code << context.instance_exec(&block)
|
44
|
-
else
|
45
|
-
context.instance_exec(code, &block)
|
46
|
-
end
|
30
|
+
def execute_code_block(context, code, block)
|
31
|
+
if block.arity.zero?
|
32
|
+
code << context.instance_exec(&block)
|
33
|
+
else
|
34
|
+
context .instance_exec(code, &block)
|
47
35
|
end
|
48
36
|
end
|
49
37
|
|
50
38
|
protected
|
51
39
|
|
52
40
|
def copy_code_blocks(original_blocks)
|
53
|
-
original_blocks
|
54
|
-
.each { |kind, blocks| code_blocks[kind] = blocks.dup }
|
41
|
+
original_blocks.each { |kind, blocks| code_blocks[kind] = blocks.dup }
|
55
42
|
end
|
56
43
|
end
|
57
44
|
end
|
@@ -4,22 +4,21 @@ module RgGen
|
|
4
4
|
module Core
|
5
5
|
module OutputBase
|
6
6
|
class Component < Base::Component
|
7
|
-
include Base::
|
7
|
+
include Base::ComponentLayerExtension
|
8
8
|
|
9
9
|
attr_reader :configuration
|
10
|
-
attr_reader :
|
10
|
+
attr_reader :register_map
|
11
11
|
|
12
|
-
def post_initialize(
|
12
|
+
def post_initialize(configuration, register_map)
|
13
13
|
@configuration = configuration
|
14
|
-
@
|
15
|
-
@need_children =
|
16
|
-
|
17
|
-
|
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
|
-
!
|
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
|
-
|
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,
|
44
|
-
|
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
|
-
|
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
|
-
|
79
|
-
*
|
80
|
-
|
81
|
-
].
|
82
|
-
|
83
|
-
|
84
|
-
|
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
|
89
|
-
|
90
|
-
|
91
|
-
|
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
|
@@ -4,7 +4,7 @@ module RgGen
|
|
4
4
|
module Core
|
5
5
|
module OutputBase
|
6
6
|
class Feature < Base::Feature
|
7
|
-
include Base::
|
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
|
-
|
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
|
124
|
+
def generate_code(code, phase, kind)
|
126
125
|
generator = self.class.code_generators[phase]
|
127
|
-
|
126
|
+
generator&.generate(self, code, kind)
|
128
127
|
end
|
129
128
|
|
130
129
|
def write_file(directory = 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
|
-
:
|
10
|
-
] do |
|
9
|
+
:root, :register_block, :register_file, :register, :bit_field
|
10
|
+
] do |layer|
|
11
11
|
component Component, ComponentFactory
|
12
|
-
feature Feature, FeatureFactory if
|
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::
|
7
|
+
include Base::ComponentLayerExtension
|
8
8
|
|
9
9
|
attr_reader :configuration
|
10
10
|
|
11
11
|
private
|
12
12
|
|
13
|
-
def post_initialize(
|
13
|
+
def post_initialize(configuration)
|
14
14
|
@configuration = configuration
|
15
|
-
|
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
|
-
|
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::
|
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
|
-
|
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(:
|
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
|
-
|
16
|
-
|
17
|
-
register_block: :register,
|
18
|
-
|
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
|
-
|
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
|
-
|
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
|
41
|
-
key
|
42
|
-
|
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
|
7
|
-
|
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
|
-
|
10
|
-
|
13
|
+
module RegisterBlockRegisterFile
|
14
|
+
def register_file(value_list = nil, &block)
|
15
|
+
child(:register_file, value_list, &block)
|
16
|
+
end
|
11
17
|
|
12
|
-
|
13
|
-
|
18
|
+
def register(value_list = nil, &block)
|
19
|
+
child(:register, value_list, &block)
|
20
|
+
end
|
14
21
|
end
|
15
|
-
end
|
16
22
|
|
17
|
-
|
18
|
-
|
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
|
-
|
21
|
-
|
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
|
-
|
26
|
-
|
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
|
29
|
-
|
41
|
+
def initialize(layer, valid_value_list)
|
42
|
+
extend(LAYER_EXTENSIONS[layer])
|
43
|
+
super
|
30
44
|
end
|
31
45
|
end
|
32
46
|
end
|