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,56 @@
1
+ simple_item :register_block, :address_struct do
2
+ c_header do
3
+ delegate [:data_width, :byte_width] => :configuration
4
+ delegate [:registers, :name] => :register_block
5
+
6
+ generate_code :c_header_item do
7
+ struct_definition(stuct_name) do |s|
8
+ s.with_typedef
9
+ s.members address_struct_members
10
+ end
11
+ end
12
+
13
+ def stuct_name
14
+ "s_#{name}_address_struct"
15
+ end
16
+
17
+ def address_struct_members
18
+ address_struct_entries.each_cons(2).with_object([]) do |entries, members|
19
+ dummy_size = entries[1].start_address - entries[0].end_address - 1
20
+ members << dummy_member(dummy_size) if dummy_size > 0
21
+ members << entries[1].address_struct_member
22
+ end
23
+ end
24
+
25
+ def dummy_member(size)
26
+ variable_declaration(
27
+ data_type: "rggen_uint#{data_width}",
28
+ name: "__dummy_#{dummy_index}",
29
+ dimensions: [size / byte_width]
30
+ )
31
+ end
32
+
33
+ def dummy_index
34
+ @dummy_index ||= -1
35
+ @dummy_index += 1
36
+ end
37
+
38
+ def address_struct_entries
39
+ [].tap do |entries|
40
+ entries << dummy_entry
41
+ entries.concat(non_reserved_registers)
42
+ end
43
+ end
44
+
45
+ def dummy_entry
46
+ Object.new.tap do |dummy|
47
+ dummy.attr_singleton_accessor :end_address
48
+ dummy.end_address = -1
49
+ end
50
+ end
51
+
52
+ def non_reserved_registers
53
+ registers.reject(&:reserved?).sort_by(&:start_address)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,15 @@
1
+ simple_item :register_block, :c_header_file do
2
+ c_header do
3
+ delegate [:name] => :register_block
4
+
5
+ write_file '<%= name %>.h' do |f|
6
+ f.include_guard
7
+ f.include_file 'rggen.h'
8
+ f.body { |code| source_file_body(code) }
9
+ end
10
+
11
+ def source_file_body(code)
12
+ register_block.generate_code(:c_header_item, :top_down, code)
13
+ end
14
+ end
15
+ end
@@ -2,7 +2,12 @@ simple_item :register_block, :ral_package do
2
2
  ral do
3
3
  delegate :name => :register_block
4
4
 
5
- write_file '<%= name %>_ral_pkg.sv' do
5
+ write_file '<%= name %>_ral_pkg.sv' do |f|
6
+ f.include_guard
7
+ f.body { source_file_body }
8
+ end
9
+
10
+ def source_file_body
6
11
  package_definition "#{name}_ral_pkg" do |pkg|
7
12
  pkg.import_package :uvm_pkg
8
13
  pkg.import_package :rggen_ral_pkg
@@ -25,11 +25,11 @@ simple_item :register_block, :response_mux do
25
25
  end
26
26
 
27
27
  def external_registers?
28
- register_block.registers.any?(&:external?)
28
+ register_block.registers.any? { |r| r.type?(:external) }
29
29
  end
30
30
 
31
31
  def total_external_registers
32
- register_block.registers.count(&:external?)
32
+ register_block.registers.count { |r| r.type?(:external) }
33
33
  end
34
34
 
35
35
  def actual_external_register_select
@@ -1,6 +1,10 @@
1
1
  define_simple_item :register_block, :top_module do
2
2
  rtl do
3
- write_file '<%= register_block.name %>.sv' do
3
+ write_file '<%= register_block.name %>.sv' do |f|
4
+ f.body { source_file_body }
5
+ end
6
+
7
+ def source_file_body
4
8
  module_definition register_block.name do |m|
5
9
  m.parameters register_block.parameter_declarations
6
10
  m.ports register_block.port_declarations
@@ -1,3 +1,25 @@
1
+ require_relative 'core_components/erb_engine'
2
+
3
+ require_relative 'core_components/code_utility/line'
4
+ require_relative 'core_components/code_utility/code_block'
5
+ require_relative 'core_components/code_utility/source_file'
6
+ require_relative 'core_components/code_utility'
7
+
8
+ require_relative 'core_components/verilog_utility/identifier'
9
+ require_relative 'core_components/verilog_utility/declaration'
10
+ require_relative 'core_components/verilog_utility/structure_definition'
11
+ require_relative 'core_components/verilog_utility/module_definition'
12
+ require_relative 'core_components/verilog_utility/package_definition'
13
+ require_relative 'core_components/verilog_utility/class_definition'
14
+ require_relative 'core_components/verilog_utility/subroutine_definition'
15
+ require_relative 'core_components/verilog_utility/source_file'
16
+ require_relative 'core_components/verilog_utility'
17
+
18
+ require_relative 'core_components/c_utility/variable_declaration'
19
+ require_relative 'core_components/c_utility/data_structure_definition'
20
+ require_relative 'core_components/c_utility/source_file'
21
+ require_relative 'core_components/c_utility'
22
+
1
23
  require_relative 'core_components/configuration/raise_error'
2
24
  require_relative 'core_components/configuration/item'
3
25
  require_relative 'core_components/configuration/configuration_factory'
@@ -24,3 +46,6 @@ require_relative 'core_components/rtl/setup'
24
46
  require_relative 'core_components/ral/component'
25
47
  require_relative 'core_components/ral/item'
26
48
  require_relative 'core_components/ral/setup'
49
+
50
+ require_relative 'core_components/c_header/item'
51
+ require_relative 'core_components/c_header/setup'
@@ -0,0 +1,8 @@
1
+ module RgGen
2
+ module CHeader
3
+ class Item < OutputBase::Item
4
+ include CUtility
5
+ template_engine ERBEngine
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,19 @@
1
+ module RgGen
2
+ module CHeader
3
+ output_component_store :c_header do
4
+ entry do
5
+ component_class OutputBase::Component
6
+ component_factory OutputBase::ComponentFactory
7
+ end
8
+
9
+ entry [:register_block, :register, :bit_field] do
10
+ component_class OutputBase::Component
11
+ component_factory OutputBase::ComponentFactory
12
+ item_base Item
13
+ item_factory OutputBase::ItemFactory
14
+ end
15
+
16
+ output_directory 'c_header'
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module RgGen
2
+ module CUtility
3
+ include CodeUtility
4
+
5
+ def create_blank_file(path)
6
+ SourceFile.new(path)
7
+ end
8
+
9
+ private
10
+
11
+ def variable_declaration(attributes)
12
+ VariableDeclaration.new(attributes)
13
+ end
14
+
15
+ def struct_definition(type_name, &body)
16
+ DataStructureDefinition.new(:struct, type_name, &body).to_code
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,62 @@
1
+ module RgGen
2
+ module CUtility
3
+ class DataStructureDefinition
4
+ include CodeUtility
5
+
6
+ def initialize(type_keyword, type_name, &body)
7
+ @type_keyword = type_keyword
8
+ @type_name = type_name
9
+ body.call(self) if block_given?
10
+ end
11
+
12
+ attr_setter :members
13
+
14
+ def with_typedef(typedef_name = nil)
15
+ @with_typedef = true
16
+ @typedef_name = typedef_name
17
+ end
18
+
19
+ def to_code
20
+ code_block do |code|
21
+ header_code(code)
22
+ body_code(code)
23
+ footer_code(code)
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def header_code(code)
30
+ code << [
31
+ typedef, @type_keyword, type_name, '{'
32
+ ].compact.join(space) << nl
33
+ end
34
+
35
+ def body_code(code)
36
+ indent(code, 2) do
37
+ @members.each do |member, i|
38
+ code << member << semicolon << nl
39
+ end
40
+ end
41
+ end
42
+
43
+ def footer_code(code)
44
+ code << ['}', typedef_name].compact.join(space) << semicolon << nl
45
+ end
46
+
47
+ def typedef
48
+ @with_typedef && :typedef
49
+ end
50
+
51
+ def type_name
52
+ return @type_name unless @with_typedef
53
+ @typedef_name && @type_name
54
+ end
55
+
56
+ def typedef_name
57
+ return nil unless @with_typedef
58
+ @typedef_name || @type_name
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,10 @@
1
+ module RgGen
2
+ module CUtility
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,35 @@
1
+ module RgGen
2
+ module CUtility
3
+ class VariableDeclaration
4
+ def initialize(attributes)
5
+ @attributes = attributes
6
+ end
7
+
8
+ def to_s
9
+ [
10
+ data_type, identifier, default_value_assignment
11
+ ].compact.join(' ')
12
+ end
13
+
14
+ private
15
+
16
+ def data_type
17
+ @attributes[:data_type]
18
+ end
19
+
20
+ def identifier
21
+ "#{@attributes[:name]}#{dimensions}"
22
+ end
23
+
24
+ def dimensions
25
+ return unless @attributes[:dimensions]
26
+ @attributes[:dimensions].map { |d| "[#{d}]" }.join
27
+ end
28
+
29
+ def default_value_assignment
30
+ return unless @attributes[:default]
31
+ "= #{@attributes[:default]}"
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,56 @@
1
+ module RgGen
2
+ module CodeUtility
3
+ def create_blank_code
4
+ CodeBlock.new
5
+ end
6
+
7
+ private
8
+
9
+ def newline
10
+ :newline
11
+ end
12
+
13
+ alias_method :nl, :newline
14
+
15
+ def comma
16
+ ','
17
+ end
18
+
19
+ def semicolon
20
+ ';'
21
+ end
22
+
23
+ def space(size = 1)
24
+ ' ' * size
25
+ end
26
+
27
+ def string(expression)
28
+ "\"#{expression}\""
29
+ end
30
+
31
+ def code_block(indent_size = 0, &block)
32
+ CodeBlock.new.tap do |code|
33
+ code.indent = indent_size
34
+ block.call(code) if block_given?
35
+ end
36
+ end
37
+
38
+ def indent(code_block, indent_size, &indent_block)
39
+ code_block << nl unless code_block.last_line_empty?
40
+ code_block.indent += indent_size
41
+ indent_block.call if block_given?
42
+ code_block << nl unless code_block.last_line_empty?
43
+ code_block.indent -= indent_size
44
+ end
45
+
46
+ def wrap(code_block, head, tail, &block)
47
+ code_block << head
48
+ block.call if block_given?
49
+ code_block << tail
50
+ end
51
+
52
+ def loop_index(level)
53
+ level.times.with_object('i') { |_, index| index.next! }
54
+ end
55
+ end
56
+ end
@@ -1,5 +1,5 @@
1
1
  module RgGen
2
- module OutputBase
2
+ module CodeUtility
3
3
  class CodeBlock
4
4
  def initialize
5
5
  @lines = []
@@ -1,5 +1,5 @@
1
1
  module RgGen
2
- module OutputBase
2
+ module CodeUtility
3
3
  class Line
4
4
  def initialize
5
5
  @words = []
@@ -0,0 +1,97 @@
1
+ module RgGen
2
+ module CodeUtility
3
+ class SourceFile
4
+ include CodeUtility
5
+
6
+ class << self
7
+ attr_setter :ifndef_keyword
8
+ attr_setter :endif_keyword
9
+ attr_setter :define_keyword
10
+ attr_setter :include_keyword
11
+ end
12
+
13
+ def initialize(path, &body)
14
+ @path = path
15
+ body.call(self) if block_given?
16
+ end
17
+
18
+ attr_reader :path
19
+
20
+ def header(&block)
21
+ @header_block ||= block
22
+ end
23
+
24
+ def include_guard(prefix = nil, suffix = prefix, &block)
25
+ @guard_macro ||= (
26
+ block || method(:default_guard_macro)
27
+ ).call(prefix, suffix)
28
+ end
29
+
30
+ def include_file(file)
31
+ include_files << file
32
+ end
33
+
34
+ def body(&block)
35
+ @body_block ||= block
36
+ end
37
+
38
+ def to_code
39
+ code_block do |c|
40
+ blocks.each { |b| generate_code(c, b) }
41
+ end
42
+ end
43
+
44
+ def to_s
45
+ to_code.to_s
46
+ end
47
+
48
+ private
49
+
50
+ def blocks
51
+ [
52
+ @header_block,
53
+ include_guard_header,
54
+ include_files_block,
55
+ @body_block,
56
+ include_guard_footer
57
+ ].compact
58
+ end
59
+
60
+ def include_files
61
+ @include_files ||= []
62
+ end
63
+
64
+ def default_guard_macro(prefix, suffix)
65
+ "#{prefix}#{path.basename.to_s.upcase.gsub(/\W/, '_')}#{suffix}"
66
+ end
67
+
68
+ def include_guard_header
69
+ @guard_macro && lambda do |c|
70
+ c << "#{self.class.ifndef_keyword} #{@guard_macro}" << nl
71
+ c << "#{self.class.define_keyword} #{@guard_macro}" << nl
72
+ end
73
+ end
74
+
75
+ def include_guard_footer
76
+ @guard_macro && lambda { |c| c << self.class.endif_keyword << nl }
77
+ end
78
+
79
+ def include_files_block
80
+ @include_files && lambda do |c|
81
+ include_files.each do |f|
82
+ c << "#{self.class.include_keyword} #{f.to_s.quote}" << nl
83
+ end
84
+ end
85
+ end
86
+
87
+ def generate_code(code, block)
88
+ if block.arity.zero?
89
+ code << block.call
90
+ else
91
+ block.call(code)
92
+ end
93
+ code << nl unless code.last_line_empty?
94
+ end
95
+ end
96
+ end
97
+ end