rggen-systemverilog 0.15.0 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +2 -2
  4. data/lib/rggen/systemverilog/common.rb +2 -2
  5. data/lib/rggen/systemverilog/common/component.rb +2 -6
  6. data/lib/rggen/systemverilog/common/feature.rb +39 -26
  7. data/lib/rggen/systemverilog/common/utility.rb +9 -4
  8. data/lib/rggen/systemverilog/common/utility/data_object.rb +2 -2
  9. data/lib/rggen/systemverilog/common/utility/interface_instance.rb +2 -2
  10. data/lib/rggen/systemverilog/common/utility/interface_port.rb +9 -5
  11. data/lib/rggen/systemverilog/common/utility/local_scope.rb +8 -2
  12. data/lib/rggen/systemverilog/common/utility/structure_definition.rb +3 -5
  13. data/lib/rggen/systemverilog/ral.rb +4 -1
  14. data/lib/rggen/systemverilog/ral/bit_field/type.rb +23 -19
  15. data/lib/rggen/systemverilog/ral/bit_field/type/rwe_rwl.rb +1 -11
  16. data/lib/rggen/systemverilog/ral/feature.rb +5 -7
  17. data/lib/rggen/systemverilog/ral/register/type.rb +12 -54
  18. data/lib/rggen/systemverilog/ral/register/type/default.erb +1 -1
  19. data/lib/rggen/systemverilog/ral/register/type/external.rb +6 -10
  20. data/lib/rggen/systemverilog/ral/register/type/indirect.erb +3 -3
  21. data/lib/rggen/systemverilog/ral/register/type/indirect.rb +5 -2
  22. data/lib/rggen/systemverilog/ral/register_block/sv_ral_model.erb +8 -0
  23. data/lib/rggen/systemverilog/ral/register_block/sv_ral_model.rb +36 -0
  24. data/lib/rggen/systemverilog/ral/register_block/sv_ral_package.rb +1 -32
  25. data/lib/rggen/systemverilog/ral/register_common.rb +46 -0
  26. data/lib/rggen/systemverilog/ral/register_file/sv_ral_model.erb +8 -0
  27. data/lib/rggen/systemverilog/ral/register_file/sv_ral_model.rb +57 -0
  28. data/lib/rggen/systemverilog/ral/setup.rb +2 -1
  29. data/lib/rggen/systemverilog/rtl.rb +5 -2
  30. data/lib/rggen/systemverilog/rtl/bit_field/sv_rtl_top.rb +92 -16
  31. data/lib/rggen/systemverilog/rtl/bit_field/type.rb +5 -8
  32. data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c.rb +3 -3
  33. data/lib/rggen/systemverilog/rtl/bit_field/type/ro.rb +1 -1
  34. data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s.rb +2 -2
  35. data/lib/rggen/systemverilog/rtl/bit_field/type/{rw_wo.erb → rw_w1_wo_wo1.erb} +4 -2
  36. data/lib/rggen/systemverilog/rtl/bit_field/type/rw_w1_wo_wo1.rb +24 -0
  37. data/lib/rggen/systemverilog/rtl/bit_field/type/rwc.rb +2 -2
  38. data/lib/rggen/systemverilog/rtl/bit_field/type/rwe.rb +2 -2
  39. data/lib/rggen/systemverilog/rtl/bit_field/type/rwl.rb +2 -2
  40. data/lib/rggen/systemverilog/rtl/bit_field/type/rws.rb +3 -3
  41. data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w1crs.rb +1 -1
  42. data/lib/rggen/systemverilog/rtl/bit_field/type/w0src_w1src.rb +1 -1
  43. data/lib/rggen/systemverilog/rtl/bit_field/type/w0trg_w1trg.rb +1 -1
  44. data/lib/rggen/systemverilog/rtl/feature.rb +13 -16
  45. data/lib/rggen/systemverilog/rtl/global/array_port_format.rb +2 -0
  46. data/lib/rggen/systemverilog/rtl/global/fold_sv_interface_port.rb +4 -0
  47. data/lib/rggen/systemverilog/rtl/partial_sum.rb +29 -0
  48. data/lib/rggen/systemverilog/rtl/register/sv_rtl_top.rb +10 -47
  49. data/lib/rggen/systemverilog/rtl/register/type.rb +30 -5
  50. data/lib/rggen/systemverilog/rtl/register/type/external.rb +15 -15
  51. data/lib/rggen/systemverilog/rtl/register/type/indirect.rb +3 -3
  52. data/lib/rggen/systemverilog/rtl/register_block/protocol.rb +14 -4
  53. data/lib/rggen/systemverilog/rtl/register_block/protocol/apb.erb +5 -3
  54. data/lib/rggen/systemverilog/rtl/register_block/protocol/apb.rb +14 -15
  55. data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.erb +6 -4
  56. data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.rb +23 -25
  57. data/lib/rggen/systemverilog/rtl/register_block/sv_rtl_top.rb +11 -13
  58. data/lib/rggen/systemverilog/rtl/register_file/sv_rtl_top.rb +30 -0
  59. data/lib/rggen/systemverilog/rtl/register_index.rb +112 -0
  60. data/lib/rggen/systemverilog/rtl/setup.rb +1 -0
  61. data/lib/rggen/systemverilog/version.rb +1 -1
  62. metadata +16 -9
  63. data/lib/rggen/systemverilog/ral/register_block/sv_ral_block_model.erb +0 -11
  64. data/lib/rggen/systemverilog/rtl/bit_field/type/rw_wo.rb +0 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cc0fa0eebf47d5df307cb4c9ed64ab2946267979155d84d2ff9f946f5fe73276
4
- data.tar.gz: 329fa0ec20a90177423cabe340b82e1b351f4464cffddd3bd67079eb023f4ca0
3
+ metadata.gz: 2074da98933b8ffc3d433d76d62acf272535b39d75db5322d4268ff4e80a9aa2
4
+ data.tar.gz: 17b8d6a0250efcf5f1f29f12445b1b08940b6abb2dc9811b77a5ed0865e92693
5
5
  SHA512:
6
- metadata.gz: 3d549ee0707e59423177fb364ebd95d65008930c712816720322fbf9ed11fc87fa59aed077c422b9aac85853c93d631d46c2c98be12bdd7788a974e0a14d099e
7
- data.tar.gz: 32ad0b9fb29df9625232ada4c7952a26ff384db80faccfdb1b3bedd9ae22effa60c34dc3cb252b87f3b9f6384c3eafec6a66fccacd761ebc996ba4fd856aef93
6
+ metadata.gz: fcb60eb491c928338cc398fab428b80c3b3a132d3f6395b4ac73765d1503c2d403653d4285f8740079cc9f8155ef8d36042bf2c3f1b0d481fef2f3d08ab0a6f2
7
+ data.tar.gz: 97f26f59a360bfcd36fb47e2aa1455396d5b93e978c3de18a0395cb65bbdeab5ac3820f28a57dec8401af836064b3aace1f34241541ef59bb8fbd236cdf0e896
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2019 Taichi Ishitani
3
+ Copyright (c) 2019-2020 Taichi Ishitani
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  [![Gem Version](https://badge.fury.io/rb/rggen-systemverilog.svg)](https://badge.fury.io/rb/rggen-systemverilog)
2
- [![Build Status](https://travis-ci.com/rggen/rggen-systemverilog.svg?branch=master)](https://travis-ci.com/rggen/rggen-systemverilog)
2
+ [![CI](https://github.com/rggen/rggen-systemverilog/workflows/CI/badge.svg)](https://github.com/rggen/rggen-systemverilog/actions?query=workflow%3ACI)
3
3
  [![Maintainability](https://api.codeclimate.com/v1/badges/88086c5be538a1564a35/maintainability)](https://codeclimate.com/github/rggen/rggen-systemverilog/maintainability)
4
4
  [![codecov](https://codecov.io/gh/rggen/rggen-systemverilog/branch/master/graph/badge.svg)](https://codecov.io/gh/rggen/rggen-systemverilog)
5
5
  [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=rggen_rggen-systemverilog&metric=alert_status)](https://sonarcloud.io/dashboard?id=rggen_rggen-systemverilog)
@@ -34,7 +34,7 @@ Feedbacks, bug reports, questions and etc. are wellcome! You can post them by us
34
34
 
35
35
  ## Copyright & License
36
36
 
37
- Copyright © 2019 Taichi Ishitani. RgGen::SystemVerilog is licensed under the [MIT License](https://opensource.org/licenses/MIT), see [LICENSE](LICENSE) for futher details.
37
+ Copyright © 2019-2020 Taichi Ishitani. RgGen::SystemVerilog is licensed under the [MIT License](https://opensource.org/licenses/MIT), see [LICENSE](LICENSE) for futher details.
38
38
 
39
39
  ## Code of Conduct
40
40
 
@@ -28,10 +28,10 @@ module RgGen
28
28
  def self.register_component(builder, name, feature_class)
29
29
  builder.output_component_registry(name) do
30
30
  register_component [
31
- :register_map, :register_block, :register, :bit_field
31
+ :root, :register_block, :register_file, :register, :bit_field
32
32
  ] do |category|
33
33
  component Component, ComponentFactory
34
- feature feature_class, FeatureFactory if category != :register_map
34
+ feature feature_class, FeatureFactory if category != :root
35
35
  end
36
36
  end
37
37
  end
@@ -4,12 +4,8 @@ module RgGen
4
4
  module SystemVerilog
5
5
  module Common
6
6
  class Component < Core::OutputBase::Component
7
- def declarations(domain, type)
8
- body = ->(r) { r.declarations(domain, type) }
9
- [
10
- @features.each_value.map(&body),
11
- @children.map(&body)
12
- ].flatten
7
+ def declarations
8
+ @declarations ||= Hash.new { |h, k| h[k] = [] }
13
9
  end
14
10
 
15
11
  def package_imports(domain)
@@ -8,26 +8,25 @@ module RgGen
8
8
  template_engine Core::OutputBase::ERBEngine
9
9
 
10
10
  EntityContext =
11
- Struct.new(:entity_type, :creation_method, :declaration_type)
11
+ Struct.new(:entity_type, :method, :declaration_type, :default_layer)
12
12
 
13
13
  class << self
14
14
  private
15
15
 
16
- def define_entity(entity_type, creation_method, declaration_type)
16
+ def define_entity(entity_type, method, declaration_type, default_layer)
17
17
  context =
18
- EntityContext.new(entity_type, creation_method, declaration_type)
19
- define_method(entity_type) do |domain, name, **attributes, &block|
20
- entity =
21
- create_entity(context, { name: name }.merge(attributes), block)
22
- add_entity(entity, context, domain, name)
18
+ EntityContext.new(entity_type, method, declaration_type, default_layer)
19
+ define_method(entity_type) do |name, *args, &block|
20
+ if args.size >= 3
21
+ message = 'wrong number of arguments ' \
22
+ "(given #{args.size + 1}, expected 1..3)"
23
+ raise ArgumentError.new(message)
24
+ end
25
+ define_entity(context, name, args, &block)
23
26
  end
24
27
  end
25
28
  end
26
29
 
27
- def declarations(domain, type)
28
- @declarations[domain][type]
29
- end
30
-
31
30
  def package_imports(domain)
32
31
  @package_imports[domain]
33
32
  end
@@ -36,30 +35,44 @@ module RgGen
36
35
 
37
36
  def post_initialize
38
37
  super
39
- @declarations = Hash.new do |h0, k0|
40
- h0[k0] = Hash.new { |h1, k1| h1[k1] = [] }
41
- end
42
38
  @package_imports = Hash.new { |h, k| h[k] = [] }
43
39
  end
44
40
 
45
- def create_entity(context, attributes, block)
46
- creation_method = context.creation_method
47
- entity_type = context.entity_type
48
- __send__(creation_method, entity_type, attributes, block)
41
+ def define_entity(context, name, args, &block)
42
+ layer, attributes = parse_entity_arguments(args)
43
+ entity = create_entity(context, name, attributes, &block)
44
+ add_entity(context, entity, name, layer)
45
+ end
46
+
47
+ def parse_entity_arguments(args)
48
+ if args.empty?
49
+ [nil, nil]
50
+ elsif args.size == 1 && args.first.is_a?(Hash)
51
+ [nil, args.first]
52
+ elsif args.size == 1
53
+ [args.first, nil]
54
+ else
55
+ args[0..1]
56
+ end
57
+ end
58
+
59
+ def create_entity(context, name, attributes, &block)
60
+ merged_attributes = { name: name }.merge(Hash(attributes))
61
+ __send__(context.method, context.entity_type, merged_attributes, &block)
49
62
  end
50
63
 
51
- def add_entity(entity, context, domain, name)
52
- add_declaration(context, domain, entity.declaration)
53
- add_identifier(name, entity.identifier)
64
+ def add_entity(context, entity, name, layer)
65
+ add_declaration(context, entity, layer)
66
+ add_identifier(entity, name)
54
67
  end
55
68
 
56
- def add_declaration(context, domain, declaration)
57
- declaration_type = context.declaration_type
58
- @declarations[domain][declaration_type] << declaration
69
+ def add_declaration(context, entity, layer)
70
+ (layer || instance_exec(&context.default_layer))
71
+ .declarations[context.declaration_type] << entity.declaration
59
72
  end
60
73
 
61
- def add_identifier(name, identifier)
62
- instance_variable_set("@#{name}", identifier)
74
+ def add_identifier(entity, name)
75
+ instance_variable_set("@#{name}", entity.identifier)
63
76
  attr_singleton_reader(name)
64
77
  export(name)
65
78
  end
@@ -24,8 +24,13 @@ module RgGen
24
24
  "{#{Array(expressions).join(', ')}}"
25
25
  end
26
26
 
27
- def array(expressions)
28
- "'#{concat(expressions)}"
27
+ def repeat(count, expression)
28
+ "{#{count}{#{expression}}}"
29
+ end
30
+
31
+ def array(expressions = nil, default: nil)
32
+ default_item = default && "default: #{default}"
33
+ "'#{concat([*Array(expressions), default_item].compact)}"
29
34
  end
30
35
 
31
36
  def function_call(name, expressions = nil)
@@ -74,7 +79,7 @@ module RgGen
74
79
  [width, bit_length].max
75
80
  end
76
81
 
77
- def argument(name, **attribute)
82
+ def argument(name, attribute = {})
78
83
  DataObject.new(:argument, attribute.merge(name: name)).declaration
79
84
  end
80
85
 
@@ -85,7 +90,7 @@ module RgGen
85
90
  module_definition: ModuleDefinition,
86
91
  package_definition: PackageDefinition
87
92
  }.each do |method_name, definition|
88
- define_method(method_name) do |name, **attributes, &block|
93
+ define_method(method_name) do |name, attributes = {}, &block|
89
94
  definition.new(attributes.merge(name: name), &block).to_code
90
95
  end
91
96
  end
@@ -7,9 +7,9 @@ module RgGen
7
7
  class DataObject
8
8
  include Core::Utility::AttributeSetter
9
9
 
10
- def initialize(object_type, **default_attributes)
10
+ def initialize(object_type, default_attributes = {})
11
11
  @object_type = object_type
12
- apply_attributes(default_attributes)
12
+ apply_attributes(**default_attributes)
13
13
  block_given? && yield(self)
14
14
  end
15
15
 
@@ -7,8 +7,8 @@ module RgGen
7
7
  class InterfaceInstance
8
8
  include Core::Utility::AttributeSetter
9
9
 
10
- def initialize(**default_attributes)
11
- apply_attributes(default_attributes)
10
+ def initialize(default_attributes = {})
11
+ apply_attributes(**default_attributes)
12
12
  block_given? && yield(self)
13
13
  end
14
14
 
@@ -7,8 +7,8 @@ module RgGen
7
7
  class InterfacePort
8
8
  include Core::Utility::AttributeSetter
9
9
 
10
- def initialize(**default_attributes)
11
- apply_attributes(default_attributes)
10
+ def initialize(default_attributes = {})
11
+ apply_attributes(**default_attributes)
12
12
  block_given? && yield(self)
13
13
  end
14
14
 
@@ -17,9 +17,13 @@ module RgGen
17
17
  define_attribute :modport
18
18
  define_attribute :array_size
19
19
 
20
- def modport(name, ports = nil)
21
- @modport_name = name
22
- @modport_ports = ports
20
+ def modport(name_and_ports, ports = nil)
21
+ @modport_name, @modport_ports =
22
+ if ports
23
+ [name_and_ports, ports]
24
+ else
25
+ Array(name_and_ports)[0..1]
26
+ end
23
27
  end
24
28
 
25
29
  def declaration
@@ -6,11 +6,12 @@ module RgGen
6
6
  module Utility
7
7
  class LocalScope < StructureDefinition
8
8
  define_attribute :name
9
+ define_attribute :parameters
9
10
  define_attribute :variables
10
11
  define_attribute :loop_size
11
12
 
12
- def top_scope
13
- @top_scope = true
13
+ def top_scope(value = true)
14
+ @top_scope = value
14
15
  end
15
16
 
16
17
  private
@@ -28,6 +29,7 @@ module RgGen
28
29
  def pre_body_code(code)
29
30
  genvar_declarations(code)
30
31
  generate_for_header(code)
32
+ parameter_declarations(code)
31
33
  variable_declarations(code)
32
34
  end
33
35
 
@@ -47,6 +49,10 @@ module RgGen
47
49
  "for (#{genvar} = 0;#{genvar} < #{size};++#{genvar}) begin : g"
48
50
  end
49
51
 
52
+ def parameter_declarations(code)
53
+ add_declarations_to_body(code, Array(parameters))
54
+ end
55
+
50
56
  def variable_declarations(code)
51
57
  add_declarations_to_body(code, Array(variables))
52
58
  end
@@ -4,13 +4,11 @@ module RgGen
4
4
  module SystemVerilog
5
5
  module Common
6
6
  module Utility
7
- class StructureDefinition <
8
- Core::Utility::CodeUtility::StructureDefinition
9
-
7
+ class StructureDefinition < Core::Utility::CodeUtility::StructureDefinition
10
8
  include Core::Utility::AttributeSetter
11
9
 
12
- def initialize(**default_attributes, &block)
13
- apply_attributes(default_attributes)
10
+ def initialize(default_attributes = {}, &block)
11
+ apply_attributes(**default_attributes)
14
12
  super(&block)
15
13
  end
16
14
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative 'common'
4
4
  require_relative 'ral/feature'
5
+ require_relative 'ral/register_common'
5
6
 
6
7
  module RgGen
7
8
  module SystemVerilog
@@ -15,7 +16,9 @@ module RgGen
15
16
  'ral/register/type',
16
17
  'ral/register/type/external',
17
18
  'ral/register/type/indirect',
18
- 'ral/register_block/sv_ral_package'
19
+ 'ral/register_block/sv_ral_model',
20
+ 'ral/register_block/sv_ral_package',
21
+ 'ral/register_file/sv_ral_model'
19
22
  ].freeze
20
23
 
21
24
  def self.version
@@ -17,11 +17,9 @@ RgGen.define_list_feature(:bit_field, :type) do
17
17
  export :constructors
18
18
 
19
19
  build do
20
- variable :register, :ral_model, {
21
- name: bit_field.name,
22
- data_type: model_name,
23
- array_size: array_size,
24
- random: true
20
+ variable :ral_model, {
21
+ name: bit_field.name, data_type: model_name,
22
+ array_size: array_size, random: true
25
23
  }
26
24
  end
27
25
 
@@ -30,18 +28,13 @@ RgGen.define_list_feature(:bit_field, :type) do
30
28
  end
31
29
 
32
30
  def model_name
33
- if helper.model_name&.is_a?(Proc)
34
- instance_eval(&helper.model_name)
35
- else
36
- helper.model_name || :rggen_ral_field
37
- end
31
+ name = helper.model_name
32
+ name&.is_a?(Proc) && instance_eval(&name) || name || :rggen_ral_field
38
33
  end
39
34
 
40
35
  def constructors
41
36
  (bit_field.sequence_size&.times || [nil]).map do |index|
42
- macro_call(
43
- :rggen_ral_create_field_model, arguments(index)
44
- )
37
+ macro_call(:rggen_ral_create_field, arguments(index))
45
38
  end
46
39
  end
47
40
 
@@ -53,8 +46,8 @@ RgGen.define_list_feature(:bit_field, :type) do
53
46
 
54
47
  def arguments(index)
55
48
  [
56
- ral_model[index], bit_field.lsb(index), bit_field.width,
57
- access, volatile, reset_value, valid_reset
49
+ ral_model[index], bit_field.lsb(index), bit_field.width, string(access),
50
+ volatile, reset_value(index), valid_reset, index || -1, string(reference)
58
51
  ]
59
52
  end
60
53
 
@@ -62,21 +55,32 @@ RgGen.define_list_feature(:bit_field, :type) do
62
55
  bit_field.volatile? && 1 || 0
63
56
  end
64
57
 
65
- def reset_value
66
- hex(bit_field.initial_value, bit_field.width)
58
+ def reset_value(index)
59
+ value =
60
+ bit_field.initial_values&.at(index) || bit_field.initial_value || 0
61
+ hex(value, bit_field.width)
67
62
  end
68
63
 
69
64
  def valid_reset
70
65
  bit_field.initial_value? && 1 || 0
71
66
  end
67
+
68
+ def reference
69
+ if bit_field.reference?
70
+ reference_field = bit_field.reference
71
+ [reference_field.register.full_name('.'), reference_field.name].join('.')
72
+ else
73
+ ''
74
+ end
75
+ end
72
76
  end
73
77
 
74
78
  default_feature do
75
79
  end
76
80
 
77
81
  factory do
78
- def select_feature(_configuration, bit_field)
79
- target_features[bit_field.type]
82
+ def target_feature_key(_configuration, bit_field)
83
+ bit_field.type
80
84
  end
81
85
  end
82
86
  end
@@ -3,17 +3,7 @@
3
3
  RgGen.define_list_item_feature(:bit_field, :type, [:rwe, :rwl]) do
4
4
  sv_ral do
5
5
  model_name do
6
- "rggen_ral_#{bit_field.type}_field #(#{reference_names})"
7
- end
8
-
9
- private
10
-
11
- def reference_names
12
- reference = bit_field.reference
13
- register = reference&.register
14
- [register&.name, reference&.name]
15
- .map { |name| string(name) }
16
- .join(', ')
6
+ "rggen_ral_#{bit_field.type}_field"
17
7
  end
18
8
  end
19
9
  end
@@ -6,20 +6,18 @@ module RgGen
6
6
  class Feature < Common::Feature
7
7
  private
8
8
 
9
- def create_variable(_, attributes, block)
9
+ def create_variable(_, attributes, &block)
10
10
  DataObject.new(
11
11
  :variable, attributes.merge(array_format: :unpacked), &block
12
12
  )
13
13
  end
14
14
 
15
- def create_parameter(_, attributes, block)
16
- DataObject.new(
17
- :parameter, attributes, &block
18
- )
15
+ def create_parameter(_, attributes, &block)
16
+ DataObject.new(:parameter, attributes, &block)
19
17
  end
20
18
 
21
- define_entity :variable, :create_variable, :variable
22
- define_entity :parameter, :create_parameter, :parameter
19
+ define_entity :variable, :create_variable, :variable, -> { component.parent }
20
+ define_entity :parameter, :create_parameter, :parameter, -> { component.parent }
23
21
  end
24
22
  end
25
23
  end