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.
- checksums.yaml +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +127 -0
- data/lib/systemrdl/error.rb +55 -0
- data/lib/systemrdl/evaluator/address_allocation.rb +126 -0
- data/lib/systemrdl/evaluator/address_operation.rb +103 -0
- data/lib/systemrdl/evaluator/addrmap.rb +67 -0
- data/lib/systemrdl/evaluator/array_component.rb +42 -0
- data/lib/systemrdl/evaluator/builtin_properties.rb +400 -0
- data/lib/systemrdl/evaluator/common.rb +22 -0
- data/lib/systemrdl/evaluator/component_definition.rb +185 -0
- data/lib/systemrdl/evaluator/component_insts.rb +106 -0
- data/lib/systemrdl/evaluator/container_component.rb +16 -0
- data/lib/systemrdl/evaluator/field.rb +245 -0
- data/lib/systemrdl/evaluator/instance.rb +120 -0
- data/lib/systemrdl/evaluator/list.rb +26 -0
- data/lib/systemrdl/evaluator/literal.rb +173 -0
- data/lib/systemrdl/evaluator/operation.rb +241 -0
- data/lib/systemrdl/evaluator/processor.rb +166 -0
- data/lib/systemrdl/evaluator/property.rb +116 -0
- data/lib/systemrdl/evaluator/property_assignment.rb +220 -0
- data/lib/systemrdl/evaluator/reference.rb +135 -0
- data/lib/systemrdl/evaluator/reg.rb +156 -0
- data/lib/systemrdl/evaluator/regfile.rb +33 -0
- data/lib/systemrdl/evaluator/root.rb +39 -0
- data/lib/systemrdl/evaluator/value.rb +13 -0
- data/lib/systemrdl/evaluator.rb +14 -0
- data/lib/systemrdl/model/instance.rb +194 -0
- data/lib/systemrdl/model/value.rb +54 -0
- data/lib/systemrdl/model.rb +11 -0
- data/lib/systemrdl/parser/generated_parser.rb +2808 -0
- data/lib/systemrdl/parser/node.rb +17 -0
- data/lib/systemrdl/parser/parser.rb +86 -0
- data/lib/systemrdl/parser/scanner.rb +251 -0
- data/lib/systemrdl/parser/systemrdl.y +448 -0
- data/lib/systemrdl/parser/token.rb +58 -0
- data/lib/systemrdl/parser.rb +11 -0
- data/lib/systemrdl/version.rb +5 -0
- data/lib/systemrdl.rb +90 -0
- 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
|