systemrdl 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +127 -0
  4. data/lib/systemrdl/error.rb +55 -0
  5. data/lib/systemrdl/evaluator/address_allocation.rb +126 -0
  6. data/lib/systemrdl/evaluator/address_operation.rb +103 -0
  7. data/lib/systemrdl/evaluator/addrmap.rb +67 -0
  8. data/lib/systemrdl/evaluator/array_component.rb +42 -0
  9. data/lib/systemrdl/evaluator/builtin_properties.rb +400 -0
  10. data/lib/systemrdl/evaluator/common.rb +22 -0
  11. data/lib/systemrdl/evaluator/component_definition.rb +185 -0
  12. data/lib/systemrdl/evaluator/component_insts.rb +106 -0
  13. data/lib/systemrdl/evaluator/container_component.rb +16 -0
  14. data/lib/systemrdl/evaluator/field.rb +245 -0
  15. data/lib/systemrdl/evaluator/instance.rb +120 -0
  16. data/lib/systemrdl/evaluator/list.rb +26 -0
  17. data/lib/systemrdl/evaluator/literal.rb +173 -0
  18. data/lib/systemrdl/evaluator/operation.rb +241 -0
  19. data/lib/systemrdl/evaluator/processor.rb +166 -0
  20. data/lib/systemrdl/evaluator/property.rb +116 -0
  21. data/lib/systemrdl/evaluator/property_assignment.rb +220 -0
  22. data/lib/systemrdl/evaluator/reference.rb +135 -0
  23. data/lib/systemrdl/evaluator/reg.rb +156 -0
  24. data/lib/systemrdl/evaluator/regfile.rb +33 -0
  25. data/lib/systemrdl/evaluator/root.rb +39 -0
  26. data/lib/systemrdl/evaluator/value.rb +13 -0
  27. data/lib/systemrdl/evaluator.rb +14 -0
  28. data/lib/systemrdl/model/instance.rb +194 -0
  29. data/lib/systemrdl/model/value.rb +54 -0
  30. data/lib/systemrdl/model.rb +11 -0
  31. data/lib/systemrdl/parser/generated_parser.rb +2808 -0
  32. data/lib/systemrdl/parser/node.rb +17 -0
  33. data/lib/systemrdl/parser/parser.rb +86 -0
  34. data/lib/systemrdl/parser/scanner.rb +251 -0
  35. data/lib/systemrdl/parser/systemrdl.y +448 -0
  36. data/lib/systemrdl/parser/token.rb +58 -0
  37. data/lib/systemrdl/parser.rb +11 -0
  38. data/lib/systemrdl/version.rb +5 -0
  39. data/lib/systemrdl.rb +90 -0
  40. metadata +96 -0
@@ -0,0 +1,194 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SystemRDL
4
+ module Model
5
+ class Instance
6
+ def initialize(inst, parent)
7
+ @name = inst.element_name
8
+ @layer = inst.layer
9
+ @parent = parent
10
+ @instances = build_sub_instances(inst)
11
+ @properties = build_properties(inst)
12
+ @token_range = inst.token_range
13
+ freeze
14
+ end
15
+
16
+ attr_reader :name
17
+ attr_reader :layer
18
+ attr_reader :parent
19
+ attr_reader :instances
20
+ attr_reader :token_range
21
+
22
+ class << self
23
+ attr_reader :properties
24
+
25
+ private
26
+
27
+ def def_property(property_name)
28
+ (@properties ||= []) << property_name
29
+ class_eval(<<~M, __FILE__, __LINE__ + 1)
30
+ # def display_name
31
+ # @properties[:display_name]&.value
32
+ # end
33
+ def #{property_name}
34
+ @properties[:#{property_name}]&.value
35
+ end
36
+ M
37
+ end
38
+ end
39
+
40
+ def_property :display_name
41
+ def_property :desc
42
+
43
+ def to_s
44
+ "#{name} (#{layer})"
45
+ end
46
+
47
+ def full_name
48
+ elements = [self]
49
+ current = @parent
50
+ while current
51
+ elements.unshift(current)
52
+ current = current.parent
53
+ end
54
+
55
+ elements.map(&:name).join('.')
56
+ end
57
+
58
+ def pretty_print(pp)
59
+ pp.group(2, "#{self} {", '}') do
60
+ @properties.each_value do |prop_value|
61
+ pp.breakable
62
+ pp.pp(prop_value)
63
+ end
64
+ @instances.each do |inst|
65
+ pp.breakable
66
+ pp.pp(inst)
67
+ end
68
+ end
69
+ end
70
+
71
+ def property(property_name)
72
+ @properties[property_name]
73
+ end
74
+
75
+ private
76
+
77
+ def build_sub_instances(inst)
78
+ inst.instances.map do |sub_inst|
79
+ case sub_inst.layer
80
+ when :addrmap then AddrMap.new(sub_inst, self)
81
+ when :regfile then RegFile.new(sub_inst, self)
82
+ when :reg then Reg.new(sub_inst, self)
83
+ when :field then Field.new(sub_inst, self)
84
+ end
85
+ end
86
+ end
87
+
88
+ def build_properties(inst)
89
+ properties.to_h do |prop_name|
90
+ prop_value =
91
+ if prop_name == :display_name
92
+ inst.property_value(:name)
93
+ elsif (property = inst.property(prop_name))
94
+ property.value
95
+ else
96
+ inst.__send__(prop_name)
97
+ end
98
+ [prop_name, create_property_value(prop_name, prop_value)]
99
+ end
100
+ end
101
+
102
+ def properties
103
+ klass = self.class
104
+ [klass.superclass, klass].flat_map(&:properties)
105
+ end
106
+
107
+ def create_property_value(name, value)
108
+ klass =
109
+ if reference_value?(value)
110
+ ReferenceValue
111
+ elsif hex_value?(name, value)
112
+ HexValue
113
+ else
114
+ Value
115
+ end
116
+ klass.new(name.to_s, value&.value, self, value&.token_range)
117
+ end
118
+
119
+ def reference_value?(value)
120
+ return false unless value
121
+
122
+ value.type in :property_reference | :field_reference
123
+ end
124
+
125
+ def hex_value?(_name, _value)
126
+ false
127
+ end
128
+ end
129
+
130
+ class AddrMap < Instance
131
+ def_property :sharedextbus
132
+ def_property :errextbus
133
+ def_property :bigendian
134
+ def_property :littleendian
135
+ def_property :rsvdset
136
+ def_property :rsvdsetX
137
+
138
+ alias_method :regs, :instances
139
+ end
140
+
141
+ class Reg < Instance
142
+ def_property :address
143
+ def_property :accesswidth
144
+ def_property :errextbus
145
+ def_property :shared
146
+
147
+ alias_method :fields, :instances
148
+
149
+ private
150
+
151
+ def hex_value?(name, _value)
152
+ name == :address
153
+ end
154
+ end
155
+
156
+ class Field < Instance
157
+ def_property :msb
158
+ def_property :lsb
159
+ def_property :hw
160
+ def_property :sw
161
+ def_property :next
162
+ def_property :reset
163
+ def_property :resetsignal
164
+ def_property :rclr
165
+ def_property :rset
166
+ def_property :onread
167
+ def_property :woset
168
+ def_property :woclr
169
+ def_property :onwrite
170
+ def_property :swwe
171
+ def_property :swwel
172
+ def_property :swmod
173
+ def_property :swacc
174
+ def_property :singlepulse
175
+ def_property :we
176
+ def_property :wel
177
+ def_property :anded
178
+ def_property :ored
179
+ def_property :xored
180
+ def_property :hwclr
181
+ def_property :hwset
182
+ def_property :hwenable
183
+ def_property :hwmask
184
+ def_property :precedence
185
+ def_property :paritycheck
186
+
187
+ private
188
+
189
+ def hex_value?(name, value)
190
+ name == :reset && value&.type == :bit
191
+ end
192
+ end
193
+ end
194
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SystemRDL
4
+ module Model
5
+ Value = Data.define(:name, :value, :instance, :token_range) do
6
+ def full_name
7
+ "#{instance.full_name}.#{name}"
8
+ end
9
+
10
+ def to_s
11
+ value.to_s
12
+ end
13
+
14
+ def inspect
15
+ to_s
16
+ end
17
+
18
+ def pretty_print(pp)
19
+ pp.text("#{name}: ")
20
+ pp_value(pp)
21
+ end
22
+
23
+ private
24
+
25
+ def pp_value(pp)
26
+ pp.pp(value)
27
+ end
28
+ end
29
+
30
+ class ReferenceValue < Value
31
+ def to_s
32
+ full_name
33
+ end
34
+
35
+ private
36
+
37
+ def pp_value(pp)
38
+ pp.text(value.full_name)
39
+ end
40
+ end
41
+
42
+ class HexValue < Value
43
+ def to_s
44
+ "0x#{value.to_s(16)}"
45
+ end
46
+
47
+ private
48
+
49
+ def pp_value(pp)
50
+ pp.text(to_s)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SystemRDL
4
+ module Model
5
+ def self.build(root)
6
+ root.instances.map do |addrmap|
7
+ AddrMap.new(addrmap, nil)
8
+ end
9
+ end
10
+ end
11
+ end