rggen 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +27 -17
  3. data/lib/rggen/base/component.rb +5 -1
  4. data/lib/rggen/base/component_factory.rb +12 -5
  5. data/lib/rggen/base/item.rb +19 -9
  6. data/lib/rggen/base/item_factory.rb +9 -5
  7. data/lib/rggen/builtins.rb +12 -15
  8. data/lib/rggen/builtins/bit_field/{field_model_creation.rb → field_model.rb} +12 -3
  9. data/lib/rggen/builtins/register/accessibility.rb +3 -3
  10. data/lib/rggen/builtins/register/address_decoder.rb +1 -1
  11. data/lib/rggen/builtins/register/array.rb +30 -28
  12. data/lib/rggen/builtins/register/bus_exporter.erb +28 -0
  13. data/lib/rggen/builtins/register/bus_exporter.rb +44 -0
  14. data/lib/rggen/builtins/register/{reg_model_constructor.rb → constructor.rb} +1 -1
  15. data/lib/rggen/builtins/register/external.rb +42 -0
  16. data/lib/rggen/builtins/register/field_model_creator.rb +5 -1
  17. data/lib/rggen/builtins/register/read_data.rb +4 -0
  18. data/lib/rggen/builtins/register/reg_model.rb +92 -0
  19. data/lib/rggen/builtins/register/shadow_index_configurator.rb +5 -1
  20. data/lib/rggen/builtins/register/sub_block_model.rb +34 -0
  21. data/lib/rggen/builtins/register_block/apb.erb +1 -0
  22. data/lib/rggen/builtins/register_block/axi4lite.erb +1 -0
  23. data/lib/rggen/builtins/register_block/{block_model_definition.rb → block_model.rb} +4 -2
  24. data/lib/rggen/builtins/register_block/{block_model_constructor.rb → constructor.rb} +1 -1
  25. data/lib/rggen/builtins/register_block/{block_model_default_map_creator.rb → default_map_creator.rb} +1 -1
  26. data/lib/rggen/builtins/register_block/host_if.rb +1 -0
  27. data/lib/rggen/builtins/register_block/{ral_package_definition.rb → ral_package.rb} +1 -1
  28. data/lib/rggen/builtins/register_block/response_mux.erb +15 -11
  29. data/lib/rggen/builtins/register_block/response_mux.rb +35 -4
  30. data/lib/rggen/builtins/register_block/sub_model_creator.rb +14 -0
  31. data/lib/rggen/builtins/register_block/top_module.rb +16 -0
  32. data/lib/rggen/core_components.rb +2 -0
  33. data/lib/rggen/core_components/configuration/item_factory.rb +1 -1
  34. data/lib/rggen/core_components/ral/component.rb +24 -0
  35. data/lib/rggen/core_components/ral/item.rb +50 -5
  36. data/lib/rggen/core_components/ral/setup.rb +1 -1
  37. data/lib/rggen/core_components/register_map/bit_field_factory.rb +1 -1
  38. data/lib/rggen/core_components/register_map/component.rb +4 -1
  39. data/lib/rggen/core_components/register_map/component_factory.rb +9 -0
  40. data/lib/rggen/core_components/register_map/item.rb +9 -7
  41. data/lib/rggen/core_components/register_map/item_factory.rb +2 -2
  42. data/lib/rggen/core_components/register_map/register_block_factory.rb +1 -1
  43. data/lib/rggen/core_components/register_map/register_factory.rb +1 -1
  44. data/lib/rggen/core_components/register_map/register_map_factory.rb +1 -1
  45. data/lib/rggen/core_components/rtl/item.rb +1 -1
  46. data/lib/rggen/input_base/component.rb +9 -0
  47. data/lib/rggen/output_base/code_utility.rb +6 -0
  48. data/lib/rggen/output_base/component.rb +1 -0
  49. data/lib/rggen/output_base/item_factory.rb +3 -0
  50. data/lib/rggen/output_base/verilog_utility/class_definition.rb +35 -0
  51. data/lib/rggen/output_base/verilog_utility/declaration.rb +11 -4
  52. data/lib/rggen/output_base/verilog_utility/identifier.rb +1 -1
  53. data/lib/rggen/output_base/verilog_utility/module_definition.rb +33 -7
  54. data/lib/rggen/version.rb +2 -2
  55. data/ral/rggen_ral_block.svh +3 -8
  56. data/ral/rggen_ral_macros.svh +9 -2
  57. data/rtl/register/rggen_bus_exporter.sv +96 -0
  58. data/rtl/register_block/rggen_host_if_apb.sv +2 -0
  59. data/rtl/register_block/rggen_host_if_axi4lite.sv +7 -1
  60. data/rtl/register_block/rggen_response_mux.sv +53 -23
  61. data/sample/sample.csv +15 -14
  62. data/sample/sample.xls +0 -0
  63. data/sample/sample.xlsx +0 -0
  64. data/sample/sample_0.sv +77 -14
  65. data/sample/sample_0_ral_pkg.sv +6 -2
  66. data/sample/sample_1.sv +17 -11
  67. data/sample/sample_1_ral_pkg.sv +1 -1
  68. data/sample/sample_setup.rb +6 -6
  69. data/setup/default.rb +6 -6
  70. metadata +20 -19
  71. data/lib/rggen/builtins/bit_field/field_model_declaration.rb +0 -9
  72. data/lib/rggen/builtins/register/field_model_declarations.rb +0 -7
  73. data/lib/rggen/builtins/register/reg_model_creation.rb +0 -64
  74. data/lib/rggen/builtins/register/reg_model_declaration.rb +0 -13
  75. data/lib/rggen/builtins/register/reg_model_definition.rb +0 -22
  76. data/lib/rggen/builtins/register_block/module_definition.rb +0 -13
  77. data/lib/rggen/builtins/register_block/reg_model_creator.rb +0 -14
  78. data/lib/rggen/builtins/register_block/reg_model_declarations.rb +0 -7
  79. data/lib/rggen/builtins/register_block/signal_declarations.rb +0 -9
@@ -9,6 +9,7 @@ require_relative 'core_components/register_map/loader'
9
9
  require_relative 'core_components/register_map/raise_error'
10
10
  require_relative 'core_components/register_map/component'
11
11
  require_relative 'core_components/register_map/item'
12
+ require_relative 'core_components/register_map/component_factory'
12
13
  require_relative 'core_components/register_map/register_map_factory'
13
14
  require_relative 'core_components/register_map/register_block_factory'
14
15
  require_relative 'core_components/register_map/register_factory'
@@ -20,5 +21,6 @@ require_relative 'core_components/rtl/component'
20
21
  require_relative 'core_components/rtl/item'
21
22
  require_relative 'core_components/rtl/setup'
22
23
 
24
+ require_relative 'core_components/ral/component'
23
25
  require_relative 'core_components/ral/item'
24
26
  require_relative 'core_components/ral/setup'
@@ -5,7 +5,7 @@ module RgGen
5
5
 
6
6
  def create(configuration, data = nil)
7
7
  data &&= convert(data)
8
- create_item(configuration, data).tap do |item|
8
+ create_item(configuration, data) do |item|
9
9
  item.build(data) unless data.nil?
10
10
  end
11
11
  end
@@ -0,0 +1,24 @@
1
+ module RgGen
2
+ module RAL
3
+ class Component < OutputBase::Component
4
+ def build
5
+ super
6
+ @items.each do |item|
7
+ def_object_delegators(item, *item.identifiers)
8
+ end
9
+ end
10
+
11
+ def variable_declarations(domain)
12
+ [*@items, *@children].flat_map do |item_or_child|
13
+ item_or_child.variable_declarations(domain)
14
+ end
15
+ end
16
+
17
+ def parameter_declarations(domain)
18
+ [*@items, *@children].flat_map do |item_or_child|
19
+ item_or_child.parameter_declarations(domain)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -3,13 +3,58 @@ module RgGen
3
3
  class Item < OutputBase::Item
4
4
  use_verilog_utility
5
5
 
6
+ def initialize(owner)
7
+ super(owner)
8
+ @identifiers = []
9
+ @variable_declarations = Hash.new { |h, d| h[d] = [] }
10
+ @parameter_declarations = Hash.new { |h, d| h[d] = [] }
11
+ end
12
+
13
+ attr_reader :identifiers
14
+
15
+ class << self
16
+ private
17
+
18
+ def define_declaration_method(method_name)
19
+ define_method(method_name) do |domain, handle_name, attributes = {}|
20
+ attributes[:name] ||= handle_name
21
+ add_identifier(handle_name, attributes[:name])
22
+ add_declaration(method_name, domain, attributes)
23
+ end
24
+ end
25
+ end
26
+
27
+ define_declaration_method :variable
28
+ define_declaration_method :parameter
29
+
30
+ def variable_declarations(domain = nil)
31
+ return @variable_declarations if domain.nil?
32
+ @variable_declarations[domain]
33
+ end
34
+
35
+ def parameter_declarations(domain = nil)
36
+ return @parameter_declarations if domain.nil?
37
+ @parameter_declarations[domain]
38
+ end
39
+
6
40
  private
7
41
 
8
- def model_declaration(model_class, name, attributes = {})
9
- create_declaration(
10
- :variable,
11
- attributes.merge(data_type: model_class, name: name, random: true)
12
- )
42
+ def add_identifier(handle_name, name)
43
+ create_identifier(name).tap do |i|
44
+ instance_variable_set(handle_name.variablize, i)
45
+ attr_singleton_reader(handle_name)
46
+ identifiers << handle_name
47
+ end
48
+ end
49
+
50
+ def add_declaration(type, domain, attributes)
51
+ create_declaration(type, attributes).tap do |d|
52
+ declarations = {
53
+ variable: @variable_declarations,
54
+ parameter: @parameter_declarations
55
+ }.fetch(type)
56
+ declarations[domain] << d
57
+ end
13
58
  end
14
59
  end
15
60
  end
@@ -7,7 +7,7 @@ module RgGen
7
7
  end
8
8
 
9
9
  entry [:register_block, :register, :bit_field] do
10
- component_class OutputBase::Component
10
+ component_class Component
11
11
  component_factory OutputBase::ComponentFactory
12
12
  item_base Item
13
13
  item_factory OutputBase::ItemFactory
@@ -1,6 +1,6 @@
1
1
  module RgGen
2
2
  module RegisterMap
3
- class BitFieldFactory < InputBase::ComponentFactory
3
+ class BitFieldFactory < ComponentFactory
4
4
  def create_active_items(bit_field, configuration, cells)
5
5
  active_item_factories.each_value.with_index do |factory, index|
6
6
  create_item(factory, bit_field, configuration, cells[index])
@@ -3,10 +3,13 @@ module RgGen
3
3
  class Component < InputBase::Component
4
4
  include Base::HierarchicalAccessors
5
5
 
6
- def initialize(parent)
6
+ def initialize(parent, configuration)
7
7
  super(parent)
8
+ @configuration = configuration
8
9
  define_hierarchical_accessors
9
10
  end
11
+
12
+ attr_reader :configuration
10
13
  end
11
14
  end
12
15
  end
@@ -0,0 +1,9 @@
1
+ module RgGen
2
+ module RegisterMap
3
+ class ComponentFactory < InputBase::ComponentFactory
4
+ def create_component(parent, configuration, _)
5
+ @target_component.new(parent, configuration)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -4,7 +4,6 @@ module RgGen
4
4
  include Base::HierarchicalItemAccessors
5
5
  include RaiseError
6
6
 
7
- attr_reader :configuration
8
7
  attr_reader :position
9
8
 
10
9
  def initialize(owner)
@@ -12,12 +11,15 @@ module RgGen
12
11
  define_hierarchical_item_accessors
13
12
  end
14
13
 
15
- def build(configuration, cell)
16
- @configuration = configuration
17
- unless cell.nil?
18
- @position = cell.position
19
- super(cell.value)
20
- end
14
+ def build(cell)
15
+ @position = cell.position
16
+ super(cell.value)
17
+ end
18
+
19
+ private
20
+
21
+ def configuration
22
+ @owner.configuration
21
23
  end
22
24
  end
23
25
  end
@@ -5,8 +5,8 @@ module RgGen
5
5
 
6
6
  def create(component, configuration, cell = nil)
7
7
  convert_cell_value(cell)
8
- create_item(component, cell).tap do |item|
9
- item.build(configuration, cell)
8
+ create_item(component, cell) do |item|
9
+ item.build(cell) unless cell.nil?
10
10
  end
11
11
  end
12
12
 
@@ -1,6 +1,6 @@
1
1
  module RgGen
2
2
  module RegisterMap
3
- class RegisterBlockFactory < InputBase::ComponentFactory
3
+ class RegisterBlockFactory < ComponentFactory
4
4
  def create_active_items(register_block, configuration, sheet)
5
5
  active_item_factories.each_value.with_index do |factory, index|
6
6
  cell = sheet[index, 2]
@@ -1,6 +1,6 @@
1
1
  module RgGen
2
2
  module RegisterMap
3
- class RegisterFactory < InputBase::ComponentFactory
3
+ class RegisterFactory < ComponentFactory
4
4
  def create_active_items(register, configuration, rows)
5
5
  active_item_factories.each_value.with_index do |factory, index|
6
6
  create_item(factory, register, configuration, rows.first[index])
@@ -1,6 +1,6 @@
1
1
  module RgGen
2
2
  module RegisterMap
3
- class RegisterMapFactory < InputBase::ComponentFactory
3
+ class RegisterMapFactory < ComponentFactory
4
4
  def create_children(register_map, configuration, map)
5
5
  map.sheets.each do |sheet|
6
6
  create_child(register_map, configuration, sheet)
@@ -25,7 +25,7 @@ module RgGen
25
25
 
26
26
  def define_declaration_method(method_name)
27
27
  define_method(method_name) do |handle_name, attributes = {}|
28
- attributes[:name] ||= handle_name.to_s
28
+ attributes[:name] ||= handle_name
29
29
  add_identifier(handle_name, attributes[:name])
30
30
  add_declaration(method_name, attributes)
31
31
  end
@@ -1,6 +1,15 @@
1
1
  module RgGen
2
2
  module InputBase
3
3
  class Component < Base::Component
4
+ def initialize(parent)
5
+ super(parent)
6
+ @need_children = true
7
+ end
8
+
9
+ def need_no_children
10
+ @need_children = false
11
+ end
12
+
4
13
  def add_item(item)
5
14
  super(item)
6
15
  def_object_delegators(@items.last, *item.fields)
@@ -36,6 +36,12 @@ module RgGen
36
36
  code_block.indent -= indent_size
37
37
  end
38
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
+
39
45
  def loop_index(level)
40
46
  level.times.with_object('i') { |_, index| index.next! }
41
47
  end
@@ -8,6 +8,7 @@ module RgGen
8
8
  define_hierarchical_accessors
9
9
  @configuration = configuration
10
10
  @register_map = register_map
11
+ @need_children = register_map.need_children?
11
12
  def_delegators(:@register_map, *@register_map.fields)
12
13
  end
13
14
 
@@ -1,6 +1,9 @@
1
1
  module RgGen
2
2
  module OutputBase
3
3
  class ItemFactory < Base::ItemFactory
4
+ def create(owner, *args)
5
+ create_item(owner, *args)
6
+ end
4
7
  end
5
8
  end
6
9
  end
@@ -3,12 +3,20 @@ module RgGen
3
3
  module VerilogUtility
4
4
  class ClassDefinition < StructureDefinition
5
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
6
13
 
7
14
  private
8
15
 
9
16
  def header_code
10
17
  code_block do |code|
11
18
  code << :class << space << @name
19
+ paraemter_declarations(code) if parameters?
12
20
  code << space <<:extends << space << @base unless @base.nil?
13
21
  code << semicolon
14
22
  end
@@ -17,6 +25,33 @@ module RgGen
17
25
  def footer_code
18
26
  :endclass
19
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
20
55
  end
21
56
  end
22
57
  end
@@ -30,7 +30,7 @@ module RgGen
30
30
  when :port
31
31
  @attributes[:direction] || ''
32
32
  when :parameter
33
- @attributes[:parameter_type]
33
+ @attributes[:parameter_type] || ''
34
34
  end
35
35
  end
36
36
 
@@ -39,9 +39,7 @@ module RgGen
39
39
  end
40
40
 
41
41
  def width
42
- return '' if @attributes[:width].nil?
43
- return '' if (variable? || port?) && @attributes[:width] == 1
44
- "[#{@attributes[:width] - 1}:0]"
42
+ (vector? && "[#{(@attributes[:width] || 1) - 1}:0]") || ''
45
43
  end
46
44
 
47
45
  def identifier
@@ -64,6 +62,15 @@ module RgGen
64
62
  def port?
65
63
  @declation_type == :port
66
64
  end
65
+
66
+ def parameter?
67
+ @declation_type == :parameter
68
+ end
69
+
70
+ def vector?
71
+ return true if @attributes[:vector]
72
+ @attributes[:width] && (parameter? || (@attributes[:width] > 1))
73
+ end
67
74
  end
68
75
  end
69
76
  end
@@ -7,7 +7,7 @@ module RgGen
7
7
  end
8
8
 
9
9
  def to_s
10
- @name
10
+ @name.to_s
11
11
  end
12
12
 
13
13
  def [](indexes_or_msb, lsb = indexes_or_msb)
@@ -4,6 +4,12 @@ module RgGen
4
4
  class ModuleDefinition < StructureDefinition
5
5
  attr_setter :parameters
6
6
  attr_setter :ports
7
+ attr_setter :signals
8
+
9
+ def to_code
10
+ bodies.unshift(signal_declarations) if signals?
11
+ super
12
+ end
7
13
 
8
14
  private
9
15
 
@@ -20,17 +26,37 @@ module RgGen
20
26
  :endmodule
21
27
  end
22
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
+
23
41
  def parameter_declarations(code)
24
- return if @parameters.nil? || @parameters.empty?
25
- code << '#('
26
- declarations(@parameters, code)
27
- code << ')'
42
+ return unless parameters?
43
+ wrap(code, '#(', ')') do
44
+ declarations(@parameters, code)
45
+ end
28
46
  end
29
47
 
30
48
  def port_declarations(code)
31
- code << '('
32
- declarations(@ports, code) if @ports && @ports.size > 0
33
- 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
34
60
  end
35
61
 
36
62
  def declarations(list, code)