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
@@ -0,0 +1,15 @@
1
+ module RgGen
2
+ class ERBEngine < OutputBase::TemplateEngine
3
+ def file_extension
4
+ :erb
5
+ end
6
+
7
+ def parse_template(path)
8
+ BabyErubis::Text.new.from_str(File.read(path), path)
9
+ end
10
+
11
+ def render(context, template)
12
+ template.render(context)
13
+ end
14
+ end
15
+ end
@@ -1,7 +1,8 @@
1
1
  module RgGen
2
2
  module RAL
3
3
  class Item < OutputBase::Item
4
- use_verilog_utility
4
+ include VerilogUtility
5
+ template_engine ERBEngine
5
6
 
6
7
  def initialize(owner)
7
8
  super(owner)
@@ -12,7 +12,9 @@ module RgGen
12
12
  attr_reader :position
13
13
 
14
14
  def empty?
15
- value.to_s.empty?
15
+ return true if value.nil?
16
+ return false unless value.respond_to?(:empty?)
17
+ value.empty?
16
18
  end
17
19
  end
18
20
 
@@ -1,7 +1,8 @@
1
1
  module RgGen
2
2
  module RTL
3
3
  class Item < OutputBase::Item
4
- use_verilog_utility
4
+ include VerilogUtility
5
+ template_engine ERBEngine
5
6
 
6
7
  def initialize(owner)
7
8
  super(owner)
@@ -0,0 +1,69 @@
1
+ module RgGen
2
+ module VerilogUtility
3
+ include CodeUtility
4
+
5
+ def create_blank_file(path)
6
+ SourceFile.new(path)
7
+ end
8
+
9
+ private
10
+
11
+ def create_identifier(name)
12
+ Identifier.new(name)
13
+ end
14
+
15
+ def create_declaration(declaration_type, attributes)
16
+ Declaration.new(declaration_type, attributes)
17
+ end
18
+
19
+ def module_definition(name, &body)
20
+ ModuleDefinition.new(name, &body).to_code
21
+ end
22
+
23
+ def package_definition(name, &body)
24
+ PackageDefinition.new(name, &body).to_code
25
+ end
26
+
27
+ def class_definition(name, &body)
28
+ ClassDefinition.new(name, &body).to_code
29
+ end
30
+
31
+ def function_definition(name, &body)
32
+ SubroutineDefinition.new(:function, name, &body).to_code
33
+ end
34
+
35
+ def argument(name, attributes)
36
+ attributes[:name] = name
37
+ create_declaration(:port, attributes)
38
+ end
39
+
40
+ def assign(lhs, rhs)
41
+ "assign #{lhs} = #{rhs};"
42
+ end
43
+
44
+ def subroutine_call(subroutine, arguments = nil)
45
+ "#{subroutine}(#{Array(arguments).join(', ')})"
46
+ end
47
+
48
+ def concat(expression_or_expressions)
49
+ "{#{Array(expression_or_expressions).join(', ')}}"
50
+ end
51
+
52
+ def array(expression_or_expressions)
53
+ "'#{concat(expression_or_expressions)}"
54
+ end
55
+
56
+ def bin(value, width)
57
+ format("%d'b%0*b", width, width, value)
58
+ end
59
+
60
+ def dec(value, width)
61
+ format("%d'd%d", width, value)
62
+ end
63
+
64
+ def hex(value, width)
65
+ print_width = (width + 3) / 4
66
+ format("%d'h%0*x", width, print_width, value)
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,56 @@
1
+ module RgGen
2
+ module VerilogUtility
3
+ class ClassDefinition < StructureDefinition
4
+ attr_setter :base
5
+ attr_setter :parameters
6
+ attr_setter :variables
7
+
8
+ def to_code
9
+ bodies.unshift(variables_declarations) if variables?
10
+ super
11
+ end
12
+
13
+ private
14
+
15
+ def header_code
16
+ code_block do |code|
17
+ code << :class << space << @name
18
+ paraemter_declarations(code) if parameters?
19
+ code << space <<:extends << space << @base unless @base.nil?
20
+ code << semicolon
21
+ end
22
+ end
23
+
24
+ def footer_code
25
+ :endclass
26
+ end
27
+
28
+ def parameters?
29
+ !(@parameters.nil? || @parameters.empty?)
30
+ end
31
+
32
+ def variables?
33
+ !(@variables.nil? || @variables.empty?)
34
+ end
35
+
36
+ def paraemter_declarations(code)
37
+ wrap(code, '#(', ')') do
38
+ indent(code, 2) do
39
+ @parameters.each_with_index do |d, i|
40
+ code << comma << nl if i > 0
41
+ code << d
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ def variables_declarations
48
+ lambda do |code|
49
+ variables.each do |variable|
50
+ code << variable << semicolon << nl
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,66 @@
1
+ module RgGen
2
+ module VerilogUtility
3
+ class Declaration
4
+ def initialize(declation_type, attributes)
5
+ @declation_type = declation_type
6
+ @attributes = attributes
7
+ end
8
+
9
+ def to_s
10
+ code_snippets.join(' ')
11
+ end
12
+
13
+ private
14
+
15
+ def code_snippets
16
+ [
17
+ random_or_direction_or_parameter_type,
18
+ data_type,
19
+ width,
20
+ identifier,
21
+ default_value_assignment
22
+ ].select(&:itself)
23
+ end
24
+
25
+ def random_or_direction_or_parameter_type
26
+ {
27
+ variable: @attributes[:random] && :rand,
28
+ port: @attributes[:direction],
29
+ parameter: @attributes[:parameter_type]
30
+ }[@declation_type]
31
+ end
32
+
33
+ def data_type
34
+ @attributes[:data_type]
35
+ end
36
+
37
+ def width
38
+ return unless vector?
39
+ "[#{(@attributes[:width] || 1) - 1}:0]"
40
+ end
41
+
42
+ def identifier
43
+ "#{@attributes[:name]}#{dimensions}"
44
+ end
45
+
46
+ def dimensions
47
+ return if @attributes[:dimensions].nil?
48
+ @attributes[:dimensions].map { |dimension| "[#{dimension}]" }.join
49
+ end
50
+
51
+ def default_value_assignment
52
+ return if @attributes[:default].nil?
53
+ "= #{@attributes[:default]}"
54
+ end
55
+
56
+ def parameter?
57
+ @declation_type == :parameter
58
+ end
59
+
60
+ def vector?
61
+ return true if @attributes[:vector]
62
+ @attributes[:width] && (parameter? || (@attributes[:width] > 1))
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,27 @@
1
+ module RgGen
2
+ module VerilogUtility
3
+ class Identifier
4
+ def initialize(name)
5
+ @name = name
6
+ end
7
+
8
+ def to_s
9
+ @name.to_s
10
+ end
11
+
12
+ def [](indexes_or_msb, lsb = indexes_or_msb)
13
+ if indexes_or_msb.nil?
14
+ self
15
+ elsif indexes_or_msb.is_a?(Array)
16
+ indexes_or_msb.inject(self) do |identifer, index|
17
+ identifer[index]
18
+ end
19
+ elsif indexes_or_msb == lsb
20
+ Identifier.new("#{@name}[#{indexes_or_msb}]")
21
+ else
22
+ Identifier.new("#{@name}[#{indexes_or_msb}:#{lsb}]")
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,71 @@
1
+ module RgGen
2
+ module VerilogUtility
3
+ class ModuleDefinition < StructureDefinition
4
+ attr_setter :parameters
5
+ attr_setter :ports
6
+ attr_setter :signals
7
+
8
+ def to_code
9
+ bodies.unshift(signal_declarations) if signals?
10
+ super
11
+ end
12
+
13
+ private
14
+
15
+ def header_code
16
+ code_block do |code|
17
+ code << :module << space << @name << space
18
+ parameter_declarations(code)
19
+ port_declarations(code)
20
+ code << semicolon
21
+ end
22
+ end
23
+
24
+ def footer_code
25
+ :endmodule
26
+ end
27
+
28
+ def parameters?
29
+ !(@parameters.nil? || @parameters.empty?)
30
+ end
31
+
32
+ def ports?
33
+ !(@ports.nil? || @ports.empty?)
34
+ end
35
+
36
+ def signals?
37
+ !(@signals.nil? || @signals.empty?)
38
+ end
39
+
40
+ def parameter_declarations(code)
41
+ return unless parameters?
42
+ wrap(code, '#(', ')') do
43
+ declarations(@parameters, code)
44
+ end
45
+ end
46
+
47
+ def port_declarations(code)
48
+ wrap(code, '(', ')') do
49
+ declarations(@ports, code) if ports?
50
+ end
51
+ end
52
+
53
+ def signal_declarations
54
+ lambda do |code|
55
+ signals.each do |signal|
56
+ code << signal << semicolon << nl
57
+ end
58
+ end
59
+ end
60
+
61
+ def declarations(list, code)
62
+ indent(code, 2) do
63
+ list.each_with_index do |d, i|
64
+ code << comma << nl if i > 0
65
+ code << d
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,65 @@
1
+ module RgGen
2
+ module VerilogUtility
3
+ class PackageDefinition < StructureDefinition
4
+ ImportedPackage = Struct.new(:name, :items) do
5
+ def to_s
6
+ "import #{import_items.join(', ')};"
7
+ end
8
+
9
+ def import_items
10
+ (((items.nil? || items.empty?) && [:*]) || items).map do |item|
11
+ "#{name}::#{item}"
12
+ end
13
+ end
14
+ end
15
+
16
+ def import_package(name, items = nil)
17
+ import_packages << ImportedPackage.new(name, items)
18
+ end
19
+
20
+ def include_file(name)
21
+ include_files << "`include #{name.to_s.quote}"
22
+ end
23
+
24
+ def to_code
25
+ bodies.unshift(include_fiels_code ) unless @include_files.nil?
26
+ bodies.unshift(import_packges_code) unless @import_packages.nil?
27
+ super
28
+ end
29
+
30
+ private
31
+
32
+ def header_code
33
+ "package #{@name};"
34
+ end
35
+
36
+ def footer_code
37
+ :endpackage
38
+ end
39
+
40
+ def import_packages
41
+ @import_packages ||= []
42
+ end
43
+
44
+ def include_files
45
+ @include_files ||= []
46
+ end
47
+
48
+ def import_packges_code
49
+ lambda do |code|
50
+ import_packages.each do |package|
51
+ code << package << nl
52
+ end
53
+ end
54
+ end
55
+
56
+ def include_fiels_code
57
+ lambda do |code|
58
+ include_files.each do |file|
59
+ code << file << nl
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,10 @@
1
+ module RgGen
2
+ module VerilogUtility
3
+ class SourceFile < CodeUtility::SourceFile
4
+ ifndef_keyword :'`ifndef'
5
+ endif_keyword :'`endif'
6
+ define_keyword :'`define'
7
+ include_keyword :'`include'
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,50 @@
1
+ module RgGen
2
+ module VerilogUtility
3
+ class StructureDefinition
4
+ include CodeUtility
5
+
6
+ def initialize(name, &body)
7
+ @name = name
8
+ body.call(self) if block_given?
9
+ end
10
+
11
+ def body(&block)
12
+ bodies << block if block_given?
13
+ end
14
+
15
+ def to_code
16
+ code_block do |code|
17
+ code << header_code << nl
18
+ body_code(code) if body_code?
19
+ code << footer_code << nl
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def bodies
26
+ @bodies ||= []
27
+ end
28
+
29
+ def body_code(code)
30
+ bodies.each do |body|
31
+ generate_body_code(code, body)
32
+ end
33
+ end
34
+
35
+ def generate_body_code(code, body)
36
+ indent(code, 2) do
37
+ if body.arity.zero?
38
+ code << body.call
39
+ else
40
+ body.call(code)
41
+ end
42
+ end
43
+ end
44
+
45
+ def body_code?
46
+ @bodies && @bodies.size > 0
47
+ end
48
+ end
49
+ end
50
+ end