rggen 0.4.4 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +3 -2
  4. data/c/rggen.h +17 -0
  5. data/lib/rggen.rb +7 -16
  6. data/lib/rggen/base/item_factory.rb +2 -0
  7. data/lib/rggen/builtins.rb +15 -13
  8. data/lib/rggen/builtins/bit_field/{reserved.rb → types/reserved.rb} +0 -0
  9. data/lib/rggen/builtins/bit_field/{ro.erb → types/ro.erb} +0 -0
  10. data/lib/rggen/builtins/bit_field/{ro.rb → types/ro.rb} +0 -0
  11. data/lib/rggen/builtins/bit_field/{rw.erb → types/rw.erb} +0 -0
  12. data/lib/rggen/builtins/bit_field/{rw.rb → types/rw.rb} +0 -0
  13. data/lib/rggen/builtins/bit_field/{rwl_rwe.erb → types/rwl_rwe.erb} +0 -0
  14. data/lib/rggen/builtins/bit_field/{rwl_rwe.rb → types/rwl_rwe.rb} +0 -0
  15. data/lib/rggen/builtins/bit_field/{w0c_w1c.erb → types/w0c_w1c.erb} +0 -0
  16. data/lib/rggen/builtins/bit_field/{w0c_w1c.rb → types/w0c_w1c.rb} +0 -0
  17. data/lib/rggen/builtins/bit_field/{w0s_w1s.erb → types/w0s_w1s.erb} +0 -0
  18. data/lib/rggen/builtins/bit_field/{w0s_w1s.rb → types/w0s_w1s.rb} +0 -0
  19. data/lib/rggen/builtins/bit_field/{wo.rb → types/wo.rb} +0 -0
  20. data/lib/rggen/builtins/register/address_decoder.erb +9 -9
  21. data/lib/rggen/builtins/register/address_decoder.rb +24 -24
  22. data/lib/rggen/builtins/register/array.rb +0 -22
  23. data/lib/rggen/builtins/register/bus_exporter.rb +10 -2
  24. data/lib/rggen/builtins/register/indirect_index_configurator.rb +54 -0
  25. data/lib/rggen/builtins/register/offset_address.rb +21 -15
  26. data/lib/rggen/builtins/register/read_data.rb +1 -1
  27. data/lib/rggen/builtins/register/reg_model.rb +5 -5
  28. data/lib/rggen/builtins/register/sub_block_model.rb +1 -1
  29. data/lib/rggen/builtins/register/type.rb +207 -0
  30. data/lib/rggen/builtins/register/types/external.rb +15 -0
  31. data/lib/rggen/builtins/register/types/indirect.rb +134 -0
  32. data/lib/rggen/builtins/register/uniqueness_validator.rb +10 -7
  33. data/lib/rggen/builtins/register_block/address_struct.rb +56 -0
  34. data/lib/rggen/builtins/register_block/c_header_file.rb +15 -0
  35. data/lib/rggen/builtins/register_block/{apb.erb → host_ifs/apb.erb} +0 -0
  36. data/lib/rggen/builtins/register_block/{apb.rb → host_ifs/apb.rb} +0 -0
  37. data/lib/rggen/builtins/register_block/{axi4lite.erb → host_ifs/axi4lite.erb} +0 -0
  38. data/lib/rggen/builtins/register_block/{axi4lite.rb → host_ifs/axi4lite.rb} +0 -0
  39. data/lib/rggen/builtins/register_block/ral_package.rb +6 -1
  40. data/lib/rggen/builtins/register_block/response_mux.rb +2 -2
  41. data/lib/rggen/builtins/register_block/top_module.rb +5 -1
  42. data/lib/rggen/core_components.rb +25 -0
  43. data/lib/rggen/core_components/c_header/item.rb +8 -0
  44. data/lib/rggen/core_components/c_header/setup.rb +19 -0
  45. data/lib/rggen/core_components/c_utility.rb +19 -0
  46. data/lib/rggen/core_components/c_utility/data_structure_definition.rb +62 -0
  47. data/lib/rggen/core_components/c_utility/source_file.rb +10 -0
  48. data/lib/rggen/core_components/c_utility/variable_declaration.rb +35 -0
  49. data/lib/rggen/core_components/code_utility.rb +56 -0
  50. data/lib/rggen/{output_base → core_components/code_utility}/code_block.rb +1 -1
  51. data/lib/rggen/{output_base → core_components/code_utility}/line.rb +1 -1
  52. data/lib/rggen/core_components/code_utility/source_file.rb +97 -0
  53. data/lib/rggen/core_components/erb_engine.rb +15 -0
  54. data/lib/rggen/core_components/ral/item.rb +2 -1
  55. data/lib/rggen/core_components/register_map/generic_map.rb +3 -1
  56. data/lib/rggen/core_components/rtl/item.rb +2 -1
  57. data/lib/rggen/core_components/verilog_utility.rb +69 -0
  58. data/lib/rggen/core_components/verilog_utility/class_definition.rb +56 -0
  59. data/lib/rggen/core_components/verilog_utility/declaration.rb +66 -0
  60. data/lib/rggen/core_components/verilog_utility/identifier.rb +27 -0
  61. data/lib/rggen/core_components/verilog_utility/module_definition.rb +71 -0
  62. data/lib/rggen/core_components/verilog_utility/package_definition.rb +65 -0
  63. data/lib/rggen/core_components/verilog_utility/source_file.rb +10 -0
  64. data/lib/rggen/core_components/verilog_utility/structure_definition.rb +50 -0
  65. data/lib/rggen/core_components/verilog_utility/subroutine_definition.rb +41 -0
  66. data/lib/rggen/core_extensions/facets.rb +5 -0
  67. data/lib/rggen/generator.rb +19 -5
  68. data/lib/rggen/input_base/item.rb +6 -6
  69. data/lib/rggen/output_base/code_generator.rb +36 -0
  70. data/lib/rggen/output_base/component.rb +27 -41
  71. data/lib/rggen/output_base/file_writer.rb +36 -0
  72. data/lib/rggen/output_base/item.rb +34 -100
  73. data/lib/rggen/output_base/template_engine.rb +24 -0
  74. data/lib/rggen/rggen_home.rb +3 -0
  75. data/lib/rggen/version.rb +2 -2
  76. data/ral/rggen_ral_block.svh +1 -1
  77. data/ral/rggen_ral_indirect_reg.svh +193 -0
  78. data/ral/rggen_ral_map.svh +20 -20
  79. data/ral/rggen_ral_pkg.sv +1 -1
  80. data/rtl/register/rggen_address_decoder.sv +14 -14
  81. data/sample/sample.csv +21 -22
  82. data/sample/sample.xls +0 -0
  83. data/sample/sample.xlsx +0 -0
  84. data/sample/sample_0.h +17 -0
  85. data/sample/sample_0.sv +92 -92
  86. data/sample/sample_0_ral_pkg.sv +8 -5
  87. data/sample/sample_1.h +9 -0
  88. data/sample/sample_1.sv +27 -27
  89. data/sample/sample_1_ral_pkg.sv +3 -0
  90. data/sample/sample_setup.rb +4 -2
  91. data/setup/default.rb +4 -2
  92. metadata +53 -36
  93. data/lib/rggen/builtins/register/accessibility.rb +0 -23
  94. data/lib/rggen/builtins/register/external.rb +0 -42
  95. data/lib/rggen/builtins/register/shadow.rb +0 -130
  96. data/lib/rggen/builtins/register/shadow_index_configurator.rb +0 -56
  97. data/lib/rggen/output_base/code_utility.rb +0 -50
  98. data/lib/rggen/output_base/template_utility.rb +0 -29
  99. data/lib/rggen/output_base/verilog_utility.rb +0 -69
  100. data/lib/rggen/output_base/verilog_utility/class_definition.rb +0 -58
  101. data/lib/rggen/output_base/verilog_utility/declaration.rb +0 -68
  102. data/lib/rggen/output_base/verilog_utility/identifier.rb +0 -29
  103. data/lib/rggen/output_base/verilog_utility/module_definition.rb +0 -73
  104. data/lib/rggen/output_base/verilog_utility/package_definition.rb +0 -67
  105. data/lib/rggen/output_base/verilog_utility/structure_definition.rb +0 -52
  106. data/lib/rggen/output_base/verilog_utility/subroutine_definition.rb +0 -43
  107. data/ral/rggen_ral_shadow_reg.svh +0 -193
@@ -1,50 +0,0 @@
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 wrap(code_block, head, tail, &block)
40
- code_block << head
41
- block.call if block_given?
42
- code_block << tail
43
- end
44
-
45
- def loop_index(level)
46
- level.times.with_object('i') { |_, index| index.next! }
47
- end
48
- end
49
- end
50
- end
@@ -1,29 +0,0 @@
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
@@ -1,69 +0,0 @@
1
- module RgGen
2
- module OutputBase
3
- module VerilogUtility
4
- private
5
-
6
- def create_identifier(name)
7
- Identifier.new(name)
8
- end
9
-
10
- def create_declaration(declaration_type, attributes)
11
- Declaration.new(declaration_type, attributes)
12
- end
13
-
14
- def module_definition(name, &body)
15
- ModuleDefinition.new(name, &body).to_code
16
- end
17
-
18
- def package_definition(name, &body)
19
- PackageDefinition.new(name, &body).to_code
20
- end
21
-
22
- def class_definition(name, &body)
23
- ClassDefinition.new(name, &body).to_code
24
- end
25
-
26
- def function_definition(name, &body)
27
- SubroutineDefinition.new(:function, name, &body).to_code
28
- end
29
-
30
- def argument(name, attributes)
31
- attributes[:name] = name
32
- create_declaration(:port, attributes)
33
- end
34
-
35
- def assign(lhs, rhs)
36
- "assign #{lhs} = #{rhs};"
37
- end
38
-
39
- def subroutine_call(subroutine, arguments = nil)
40
- "#{subroutine}(#{Array(arguments).join(', ')})"
41
- end
42
-
43
- def concat(expression_or_expressions)
44
- "{#{Array(expression_or_expressions).join(', ')}}"
45
- end
46
-
47
- def array(expression_or_expressions)
48
- "'#{concat(expression_or_expressions)}"
49
- end
50
-
51
- def string(expression)
52
- "\"#{expression}\""
53
- end
54
-
55
- def bin(value, width)
56
- format("%d'b%0*b", width, width, value)
57
- end
58
-
59
- def dec(value, width)
60
- format("%d'd%d", width, value)
61
- end
62
-
63
- def hex(value, width)
64
- print_width = (width + 3) / 4
65
- format("%d'h%0*x", width, print_width, value)
66
- end
67
- end
68
- end
69
- end
@@ -1,58 +0,0 @@
1
- module RgGen
2
- module OutputBase
3
- module VerilogUtility
4
- class ClassDefinition < StructureDefinition
5
- attr_setter :base
6
- attr_setter :parameters
7
- attr_setter :variables
8
-
9
- def to_code
10
- bodies.unshift(variables_declarations) if variables?
11
- super
12
- end
13
-
14
- private
15
-
16
- def header_code
17
- code_block do |code|
18
- code << :class << space << @name
19
- paraemter_declarations(code) if parameters?
20
- code << space <<:extends << space << @base unless @base.nil?
21
- code << semicolon
22
- end
23
- end
24
-
25
- def footer_code
26
- :endclass
27
- end
28
-
29
- def parameters?
30
- !(@parameters.nil? || @parameters.empty?)
31
- end
32
-
33
- def variables?
34
- !(@variables.nil? || @variables.empty?)
35
- end
36
-
37
- def paraemter_declarations(code)
38
- wrap(code, '#(', ')') do
39
- indent(code, 2) do
40
- @parameters.each_with_index do |d, i|
41
- code << comma << nl if i > 0
42
- code << d
43
- end
44
- end
45
- end
46
- end
47
-
48
- def variables_declarations
49
- lambda do |code|
50
- variables.each do |variable|
51
- code << variable << semicolon << nl
52
- end
53
- end
54
- end
55
- end
56
- end
57
- end
58
- end
@@ -1,68 +0,0 @@
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
- ].select(&:itself)
24
- end
25
-
26
- def random_or_direction_or_parameter_type
27
- {
28
- variable: @attributes[:random] && :rand,
29
- port: @attributes[:direction],
30
- parameter: @attributes[:parameter_type]
31
- }[@declation_type]
32
- end
33
-
34
- def data_type
35
- @attributes[:data_type]
36
- end
37
-
38
- def width
39
- return unless vector?
40
- "[#{(@attributes[:width] || 1) - 1}:0]"
41
- end
42
-
43
- def identifier
44
- "#{@attributes[:name]}#{dimensions}"
45
- end
46
-
47
- def dimensions
48
- return if @attributes[:dimensions].nil?
49
- @attributes[:dimensions].map { |dimension| "[#{dimension}]" }.join
50
- end
51
-
52
- def default_value_assignment
53
- return if @attributes[:default].nil?
54
- "= #{@attributes[:default]}"
55
- end
56
-
57
- def parameter?
58
- @declation_type == :parameter
59
- end
60
-
61
- def vector?
62
- return true if @attributes[:vector]
63
- @attributes[:width] && (parameter? || (@attributes[:width] > 1))
64
- end
65
- end
66
- end
67
- end
68
- end
@@ -1,29 +0,0 @@
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.to_s
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
@@ -1,73 +0,0 @@
1
- module RgGen
2
- module OutputBase
3
- module VerilogUtility
4
- class ModuleDefinition < StructureDefinition
5
- attr_setter :parameters
6
- attr_setter :ports
7
- attr_setter :signals
8
-
9
- def to_code
10
- bodies.unshift(signal_declarations) if signals?
11
- super
12
- end
13
-
14
- private
15
-
16
- def header_code
17
- code_block do |code|
18
- code << :module << space << @name << space
19
- parameter_declarations(code)
20
- port_declarations(code)
21
- code << semicolon
22
- end
23
- end
24
-
25
- def footer_code
26
- :endmodule
27
- end
28
-
29
- def parameters?
30
- !(@parameters.nil? || @parameters.empty?)
31
- end
32
-
33
- def ports?
34
- !(@ports.nil? || @ports.empty?)
35
- end
36
-
37
- def signals?
38
- !(@signals.nil? || @signals.empty?)
39
- end
40
-
41
- def parameter_declarations(code)
42
- return unless parameters?
43
- wrap(code, '#(', ')') do
44
- declarations(@parameters, code)
45
- end
46
- end
47
-
48
- def port_declarations(code)
49
- wrap(code, '(', ')') do
50
- declarations(@ports, code) if ports?
51
- end
52
- end
53
-
54
- def signal_declarations
55
- lambda do |code|
56
- signals.each do |signal|
57
- code << signal << semicolon << nl
58
- end
59
- end
60
- end
61
-
62
- def declarations(list, code)
63
- indent(code, 2) do
64
- list.each_with_index do |d, i|
65
- code << comma << nl if i > 0
66
- code << d
67
- end
68
- end
69
- end
70
- end
71
- end
72
- end
73
- end
@@ -1,67 +0,0 @@
1
- module RgGen
2
- module OutputBase
3
- module VerilogUtility
4
- class PackageDefinition < StructureDefinition
5
- ImportedPackage = Struct.new(:name, :items) do
6
- def to_s
7
- "import #{import_items.join(', ')};"
8
- end
9
-
10
- def import_items
11
- (((items.nil? || items.empty?) && [:*]) || items).map do |item|
12
- "#{name}::#{item}"
13
- end
14
- end
15
- end
16
-
17
- def import_package(name, items = nil)
18
- import_packages << ImportedPackage.new(name, items)
19
- end
20
-
21
- def include_file(name)
22
- include_files << "`include #{name.to_s.quote}"
23
- end
24
-
25
- def to_code
26
- bodies.unshift(include_fiels_code ) unless @include_files.nil?
27
- bodies.unshift(import_packges_code) unless @import_packages.nil?
28
- super
29
- end
30
-
31
- private
32
-
33
- def header_code
34
- "package #{@name};"
35
- end
36
-
37
- def footer_code
38
- :endpackage
39
- end
40
-
41
- def import_packages
42
- @import_packages ||= []
43
- end
44
-
45
- def include_files
46
- @include_files ||= []
47
- end
48
-
49
- def import_packges_code
50
- lambda do |code|
51
- import_packages.each do |package|
52
- code << package << nl
53
- end
54
- end
55
- end
56
-
57
- def include_fiels_code
58
- lambda do |code|
59
- include_files.each do |file|
60
- code << file << nl
61
- end
62
- end
63
- end
64
- end
65
- end
66
- end
67
- end