rggen 0.3.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 (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,72 @@
1
+ module RgGen
2
+ module OutputBase
3
+ class CodeBlock
4
+ def initialize
5
+ @lines = []
6
+ @indent = 0
7
+ add_newline
8
+ end
9
+
10
+ attr_reader :indent
11
+
12
+ def indent=(value)
13
+ @indent = value
14
+ @lines.last.indent = @indent
15
+ end
16
+
17
+ def <<(other)
18
+ case other
19
+ when CodeBlock
20
+ merge_code_block(other)
21
+ when /\n/
22
+ add_multiple_lines_string(other)
23
+ when :newline
24
+ add_newline
25
+ else
26
+ @lines.last << other
27
+ end
28
+ self
29
+ end
30
+
31
+ def last_line_empty?
32
+ lines.empty? || lines.last.empty?
33
+ end
34
+
35
+ def to_s
36
+ @lines.map(&:to_s).each(&:rstrip!).join("\n")
37
+ end
38
+
39
+ private
40
+
41
+ def add_newline
42
+ line = Line.new
43
+ line.indent = @indent
44
+ @lines << line
45
+ end
46
+
47
+ def merge_code_block(other_block)
48
+ other_block.lines.each_with_index do |line, i|
49
+ line.indent += @indent
50
+ if i == 0
51
+ @lines.last.indent = line.indent if last_line_empty?
52
+ @lines.last.words.concat(line.words)
53
+ else
54
+ @lines << line
55
+ end
56
+ end
57
+ @lines.last.indent = @indent if other_block.last_line_empty?
58
+ end
59
+
60
+ def add_multiple_lines_string(other_string)
61
+ other_string.each_line.with_index do |line, i|
62
+ add_newline if i > 0
63
+ @lines.last << line
64
+ end
65
+ add_newline if other_string.end_with?("\n")
66
+ end
67
+
68
+ attr_reader :lines
69
+ protected :lines
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,44 @@
1
+ module RgGen
2
+ module OutputBase
3
+ module CodeUtility
4
+ private
5
+
6
+ def newline
7
+ :newline
8
+ end
9
+
10
+ alias_method :nl, :newline
11
+
12
+ def comma
13
+ ','
14
+ end
15
+
16
+ def semicolon
17
+ ';'
18
+ end
19
+
20
+ def space(size = 1)
21
+ ' ' * size
22
+ end
23
+
24
+ def code_block(indent_size = 0, &block)
25
+ CodeBlock.new.tap do |code|
26
+ code.indent = indent_size
27
+ block.call(code) if block_given?
28
+ end
29
+ end
30
+
31
+ def indent(code_block, indent_size, &indent_block)
32
+ code_block << nl unless code_block.last_line_empty?
33
+ code_block.indent += indent_size
34
+ indent_block.call if block_given?
35
+ code_block << nl unless code_block.last_line_empty?
36
+ code_block.indent -= indent_size
37
+ end
38
+
39
+ def loop_index(level)
40
+ level.times.with_object('i') { |_, index| index.next! }
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,88 @@
1
+ module RgGen
2
+ module OutputBase
3
+ class Component < Base::Component
4
+ include Base::HierarchicalAccessors
5
+
6
+ def initialize(parent, configuration, register_map)
7
+ super(parent)
8
+ define_hierarchical_accessors
9
+ @configuration = configuration
10
+ @register_map = register_map
11
+ def_delegators(:@register_map, *@register_map.fields)
12
+ end
13
+
14
+ attr_reader :configuration
15
+ attr_writer :output_directory
16
+
17
+ def add_item(item)
18
+ super(item)
19
+ def_object_delegators(@items.last, *item.exported_methods)
20
+ end
21
+
22
+ def build
23
+ items.each(&:build)
24
+ children.each(&:build)
25
+ end
26
+
27
+ def generate_code(kind, mode, buffer = nil)
28
+ buffer ||= CodeBlock.new
29
+ generate_pre_code(kind, buffer)
30
+ generate_main_code(kind, mode, buffer)
31
+ generate_post_code(kind, buffer)
32
+ buffer
33
+ end
34
+
35
+ def write_file(root_directory)
36
+ directory = output_directory(root_directory)
37
+ FileUtils.mkpath(directory) unless Dir.exist?(directory)
38
+ items.each do |item|
39
+ item.write_file(directory)
40
+ end
41
+ children.each do |child|
42
+ child.write_file(directory)
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ def generate_pre_code(kind, buffer)
49
+ items.each do |item|
50
+ item.generate_pre_code(kind, buffer)
51
+ end
52
+ end
53
+
54
+ def generate_main_code(kind, mode, buffer)
55
+ case mode
56
+ when :top_down
57
+ generate_item_code(kind, buffer)
58
+ generate_child_code(kind, mode, buffer)
59
+ when :bottom_up
60
+ generate_child_code(kind, mode, buffer)
61
+ generate_item_code(kind, buffer)
62
+ end
63
+ end
64
+
65
+ def generate_child_code(kind, mode, buffer)
66
+ children.each do |child|
67
+ child.generate_code(kind, mode, buffer)
68
+ end
69
+ end
70
+
71
+ def generate_item_code(kind, buffer)
72
+ items.each do |item|
73
+ item.generate_code(kind, buffer)
74
+ end
75
+ end
76
+
77
+ def generate_post_code(kind, buffer)
78
+ items.reverse_each do |item|
79
+ item.generate_post_code(kind, buffer)
80
+ end
81
+ end
82
+
83
+ def output_directory(root_directory)
84
+ File.join([root_directory, @output_directory.to_s].reject(&:empty?))
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,32 @@
1
+ module RgGen
2
+ module OutputBase
3
+ class ComponentFactory < Base::ComponentFactory
4
+ attr_writer :output_directory
5
+
6
+ def create(*args)
7
+ component = super(*args)
8
+ if @root_factory
9
+ component.build
10
+ component.output_directory = @output_directory
11
+ end
12
+ component
13
+ end
14
+
15
+ def create_component(parent, configuration, register_map)
16
+ @target_component.new(parent, configuration, register_map)
17
+ end
18
+
19
+ def create_items(generator, configuration, soruce)
20
+ @item_factories.each_value do |item_factory|
21
+ create_item(item_factory, generator, configuration, soruce)
22
+ end
23
+ end
24
+
25
+ def create_children(generator, configuration, source)
26
+ source.children.each do |child_source|
27
+ create_child(generator, configuration, child_source)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,175 @@
1
+ module RgGen
2
+ module OutputBase
3
+ class Item < Base::Item
4
+ include Base::HierarchicalItemAccessors
5
+ include CodeUtility
6
+ include TemplateUtility
7
+
8
+ class CodeGenerator
9
+ def []=(kind, body)
10
+ @bodies ||= {}
11
+ @bodies[kind] = body
12
+ end
13
+
14
+ def generate_code(item, kind, buffer)
15
+ return unless @bodies && @bodies.key?(kind)
16
+ if @bodies[kind].arity.zero?
17
+ buffer << item.instance_exec(&@bodies[kind])
18
+ else
19
+ item.instance_exec(buffer, &@bodies[kind])
20
+ end
21
+ end
22
+
23
+ def copy
24
+ CodeGenerator.new.tap do |g|
25
+ g.instance_variable_set(:@bodies, Hash[@bodies]) if @bodies
26
+ end
27
+ end
28
+ end
29
+
30
+ class FileWriter
31
+ def initialize(name_pattern, body)
32
+ @name_pattern = BabyErubis::Text.new.from_str(name_pattern)
33
+ @body = body
34
+ end
35
+
36
+ def write_file(item, outptu_directory)
37
+ code = generate_code(item)
38
+ path = file_path(item, outptu_directory)
39
+ File.write(path, code, nil, binmode: true)
40
+ end
41
+
42
+ private
43
+
44
+ def generate_code(item)
45
+ code = CodeBlock.new.tap do |c|
46
+ if @body.arity.zero?
47
+ c << item.instance_exec(&@body)
48
+ else
49
+ item.instance_exec(c, &@body)
50
+ end
51
+ end
52
+ code.to_s
53
+ end
54
+
55
+ def file_path(item, outptu_directory)
56
+ path = [outptu_directory, file_name(item)].reject(&:empty?)
57
+ File.join(*path)
58
+ end
59
+
60
+ def file_name(item)
61
+ @name_pattern.render(item)
62
+ end
63
+ end
64
+
65
+ define_helpers do
66
+ attr_reader :builders
67
+ attr_reader :pre_code_generator
68
+ attr_reader :code_generator
69
+ attr_reader :post_code_generator
70
+ attr_reader :file_writer
71
+
72
+ def use_verilog_utility
73
+ include VerilogUtility
74
+ end
75
+
76
+ def build(&body)
77
+ @builders ||= []
78
+ @builders << body
79
+ end
80
+
81
+ def generate_pre_code(kind, &body)
82
+ @pre_code_generator ||= CodeGenerator.new
83
+ @pre_code_generator[kind] = body
84
+ end
85
+
86
+ def generate_code(kind, &body)
87
+ @code_generator ||= CodeGenerator.new
88
+ @code_generator[kind] = body
89
+ end
90
+
91
+ def generate_code_from_template(kind, path = nil)
92
+ path ||= File.ext(caller.first[/^(.+?):\d/, 1], 'erb')
93
+ generate_code(kind) { process_template(path) }
94
+ end
95
+
96
+ def generate_post_code(kind, &body)
97
+ @post_code_generator ||= CodeGenerator.new
98
+ @post_code_generator[kind] = body
99
+ end
100
+
101
+ def write_file(name_pattern, &body)
102
+ @file_writer ||= FileWriter.new(name_pattern, body)
103
+ end
104
+
105
+ def export(*exporting_methods)
106
+ exported_methods.concat(
107
+ exporting_methods.reject(&exported_methods.method(:include?))
108
+ )
109
+ end
110
+
111
+ def exported_methods
112
+ @exported_methods ||= []
113
+ end
114
+ end
115
+
116
+ def self.inherited(subclass)
117
+ [:@builders, :@exported_methods].each do |v|
118
+ subclass.inherit_class_instance_variable(v, self, &:dup)
119
+ end
120
+ [
121
+ :@pre_code_generator,
122
+ :@code_generator,
123
+ :@post_code_generator
124
+ ].each do |v|
125
+ subclass.inherit_class_instance_variable(v, self, &:copy)
126
+ end
127
+ end
128
+
129
+ def initialize(owner)
130
+ super(owner)
131
+ define_hierarchical_item_accessors
132
+ end
133
+
134
+ class_delegator :builders
135
+ class_delegator :pre_code_generator
136
+ class_delegator :code_generator
137
+ class_delegator :file_writer
138
+ class_delegator :post_code_generator
139
+ class_delegator :exported_methods
140
+
141
+ def build
142
+ return if builders.nil?
143
+ builders.each do |builder|
144
+ instance_exec(&builder)
145
+ end
146
+ end
147
+
148
+ def generate_pre_code(kind, buffer)
149
+ return if pre_code_generator.nil?
150
+ pre_code_generator.generate_code(self, kind, buffer)
151
+ end
152
+
153
+ def generate_code(kind, buffer)
154
+ return if code_generator.nil?
155
+ code_generator.generate_code(self, kind, buffer)
156
+ end
157
+
158
+ def generate_post_code(kind, buffer)
159
+ return if post_code_generator.nil?
160
+ post_code_generator.generate_code(self, kind, buffer)
161
+ end
162
+
163
+ def write_file(output_directory = '')
164
+ return if file_writer.nil?
165
+ file_writer.write_file(self, output_directory)
166
+ end
167
+
168
+ private
169
+
170
+ def configuration
171
+ @owner.configuration
172
+ end
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,6 @@
1
+ module RgGen
2
+ module OutputBase
3
+ class ItemFactory < Base::ItemFactory
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,28 @@
1
+ module RgGen
2
+ module OutputBase
3
+ class Line
4
+ def initialize
5
+ @words = []
6
+ @not_empty = false
7
+ @indent = 0
8
+ end
9
+
10
+ attr_reader :words
11
+ attr_accessor :indent
12
+
13
+ def <<(word)
14
+ @words << word.to_s
15
+ self
16
+ end
17
+
18
+ def empty?
19
+ @words.all?(&:empty?)
20
+ end
21
+
22
+ def to_s
23
+ return '' if @words.empty?
24
+ @words.join.indent(@indent)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,29 @@
1
+ module RgGen
2
+ module OutputBase
3
+ module TemplateUtility
4
+ module Extensions
5
+ def template_engines
6
+ @template_engines ||= Hash.new do |engines, path|
7
+ engines[path] = create_engine(path)
8
+ end
9
+ end
10
+
11
+ private
12
+
13
+ def create_engine(path)
14
+ template = File.read(path)
15
+ BabyErubis::Text.new.from_str(template, path)
16
+ end
17
+ end
18
+
19
+ def self.included(klass)
20
+ klass.extend(Extensions)
21
+ end
22
+
23
+ def process_template(path = nil)
24
+ path ||= File.ext(caller.first[/^(.+?):\d/, 1], 'erb')
25
+ self.class.template_engines[path].render(self)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,23 @@
1
+ module RgGen
2
+ module OutputBase
3
+ module VerilogUtility
4
+ class ClassDefinition < StructureDefinition
5
+ attr_setter :base
6
+
7
+ private
8
+
9
+ def header_code
10
+ code_block do |code|
11
+ code << :class << space << @name
12
+ code << space <<:extends << space << @base unless @base.nil?
13
+ code << semicolon
14
+ end
15
+ end
16
+
17
+ def footer_code
18
+ :endclass
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,70 @@
1
+ module RgGen
2
+ module OutputBase
3
+ module VerilogUtility
4
+ class Declaration
5
+ def initialize(declation_type, attributes)
6
+ @declation_type = declation_type
7
+ @attributes = attributes
8
+ end
9
+
10
+ def to_s
11
+ code_snippets.join(' ')
12
+ end
13
+
14
+ private
15
+
16
+ def code_snippets
17
+ [
18
+ random_or_direction_or_parameter_type,
19
+ data_type,
20
+ width,
21
+ identifier,
22
+ default_value_assignment
23
+ ].reject(&:empty?)
24
+ end
25
+
26
+ def random_or_direction_or_parameter_type
27
+ case @declation_type
28
+ when :variable
29
+ (@attributes[:random] && 'rand') || ''
30
+ when :port
31
+ @attributes[:direction] || ''
32
+ when :parameter
33
+ @attributes[:parameter_type]
34
+ end
35
+ end
36
+
37
+ def data_type
38
+ @attributes[:data_type] || ''
39
+ end
40
+
41
+ def width
42
+ return '' if @attributes[:width].nil?
43
+ return '' if (variable? || port?) && @attributes[:width] == 1
44
+ "[#{@attributes[:width] - 1}:0]"
45
+ end
46
+
47
+ def identifier
48
+ "#{@attributes[:name]}#{dimensions}"
49
+ end
50
+
51
+ def dimensions
52
+ return '' if @attributes[:dimensions].nil?
53
+ @attributes[:dimensions].map { |dimension| "[#{dimension}]" }.join
54
+ end
55
+
56
+ def default_value_assignment
57
+ (@attributes[:default].nil? && '') || "= #{@attributes[:default]}"
58
+ end
59
+
60
+ def variable?
61
+ @declation_type == :variable
62
+ end
63
+
64
+ def port?
65
+ @declation_type == :port
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,29 @@
1
+ module RgGen
2
+ module OutputBase
3
+ module VerilogUtility
4
+ class Identifier
5
+ def initialize(name)
6
+ @name = name
7
+ end
8
+
9
+ def to_s
10
+ @name
11
+ end
12
+
13
+ def [](indexes_or_msb, lsb = indexes_or_msb)
14
+ if indexes_or_msb.nil?
15
+ self
16
+ elsif indexes_or_msb.is_a?(Array)
17
+ indexes_or_msb.inject(self) do |identifer, index|
18
+ identifer[index]
19
+ end
20
+ elsif indexes_or_msb == lsb
21
+ Identifier.new("#{@name}[#{indexes_or_msb}]")
22
+ else
23
+ Identifier.new("#{@name}[#{indexes_or_msb}:#{lsb}]")
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,47 @@
1
+ module RgGen
2
+ module OutputBase
3
+ module VerilogUtility
4
+ class ModuleDefinition < StructureDefinition
5
+ attr_setter :parameters
6
+ attr_setter :ports
7
+
8
+ private
9
+
10
+ def header_code
11
+ code_block do |code|
12
+ code << :module << space << @name << space
13
+ parameter_declarations(code)
14
+ port_declarations(code)
15
+ code << semicolon
16
+ end
17
+ end
18
+
19
+ def footer_code
20
+ :endmodule
21
+ end
22
+
23
+ def parameter_declarations(code)
24
+ return if @parameters.nil? || @parameters.empty?
25
+ code << '#('
26
+ declarations(@parameters, code)
27
+ code << ')'
28
+ end
29
+
30
+ def port_declarations(code)
31
+ code << '('
32
+ declarations(@ports, code) if @ports && @ports.size > 0
33
+ code << ')'
34
+ end
35
+
36
+ def declarations(list, code)
37
+ indent(code, 2) do
38
+ list.each_with_index do |d, i|
39
+ code << comma << nl if i > 0
40
+ code << d
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end