systemrdl 0.1.0 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ef8e253b49ef4971248d9e4ad7b1938ff69952613de40fb985e993653ebd37f2
4
- data.tar.gz: f7c11c7334b79e9c93e81a5b2ccc211d15c3e7991ca514385f3525deb9316bd8
3
+ metadata.gz: 7c26a164d35f8d0c6ef03e815551d34cb353c706fce64aa6a211e64e0bd6e063
4
+ data.tar.gz: 7c6b7b3653f0fc07dcd131114229fda4a8f3e358e7c03f812b161dab069556fe
5
5
  SHA512:
6
- metadata.gz: 60382cdccb4df5c4d9df37a988e0d62d0986c7d2bb7de98add2f706f93349f57e4b0783f2f1660ccb039c7f463c3cfb03b439c2d5429a535063f8344743a152f
7
- data.tar.gz: 766461e671109a8813e5a39a4f5a4cdd640ebdc2c32de76a31969404317a709aa7a52fbc580ec42229317ecae4fe98f1c7c9ac326c686df70eb4cf42e6146acc
6
+ metadata.gz: 5d8f19e9cdc2c8bea6ecb1b4ac033ea32951c4bde4b081764cdb4001f8fb83e44e5757974fb431434c85ee1b37a5bea2a2955d8c1548df39db02609baf0ce97e
7
+ data.tar.gz: dbd41133f3cce67afcd3ec353fb851e233840d834eb8396c27a50bd8779082bbe11538c6836d5c9689b20b83d50310bb4119989175366e632df9c3016799e7b4
data/README.md CHANGED
@@ -105,8 +105,38 @@ end
105
105
 
106
106
  ## Scope
107
107
 
108
- This gem currently supports only the basic syntax needed to describe register maps that consist of address maps, registers, and fields.
109
- More advanced constructs of the SystemRDL language are not supported yet.
108
+ ### Supported Features
109
+
110
+ The following SystemRDL 2.0 language features are supported (parsed and evaluated).
111
+
112
+ #### Components
113
+
114
+ * The `addrmap`, `regfile`, `reg`, `field`, and `mem` components
115
+ * Definitive and anonymous component definitions/instances
116
+ * Arrays of instances
117
+ * Address allocation operators (`@`, `+=`, `%=`)
118
+ * `internal` / `external` instance types
119
+
120
+ #### Properties
121
+
122
+ * Most built-in properties of the supported components, except the `counter` and `interrupt` property groups (see below)
123
+ * Property assignment in all three forms: direct assignment, default assignment (`default`), and dynamic assignment (`->`)
124
+ * Property references and instance references as property values
125
+
126
+ ### Unsupported Features
127
+
128
+ The following features are not supported. Some of their keywords are recognized by the lexer (reserved), but they are not evaluated.
129
+
130
+ * `signal` component
131
+ * User-defined properties (`property` definitions)
132
+ * Enumerations (`enum`) and `encode`
133
+ * `struct` types
134
+ * `constraint`
135
+ * `alias` registers
136
+ * Counter field properties
137
+ * Interrupt field properties
138
+ * Component parameters
139
+ * Preprocessing, both embedded Perl preprocessing and Verilog-style directives
110
140
 
111
141
  ## Design notes
112
142
 
@@ -8,8 +8,7 @@ module SystemRDL
8
8
  def allocate_addresses(instance)
9
9
  address = 0
10
10
  instance.instances.each do |child_inst|
11
- # For now, support reg only
12
- next unless child_inst.reg?
11
+ next unless addressable_inst?(child_inst)
13
12
 
14
13
  assign_address(address, instance, child_inst)
15
14
  address = calc_next_address(child_inst)
@@ -31,19 +30,29 @@ module SystemRDL
31
30
  end
32
31
 
33
32
  def calc_alignment(inst, child_inst)
34
- inst_alignment = child_inst.alignment&.value
35
- return inst_alignment if inst_alignment
33
+ alignment = child_inst.alignment&.value
34
+ return alignment if alignment
36
35
 
37
36
  alignments = [
38
- inst.property_value(:alignment)&.value || 0,
37
+ inst_alignment(inst),
39
38
  child_inst.accesswidth / 8,
40
39
  alignment_by_addressing(inst, child_inst)
41
40
  ]
42
41
  alignments.max
43
42
  end
44
43
 
44
+ def inst_alignment(inst)
45
+ alignment =
46
+ if inst.mem?
47
+ inst.parent.property_value(:alignment)
48
+ else
49
+ inst.property_value(:alignment)
50
+ end
51
+ alignment&.value || 0
52
+ end
53
+
45
54
  def alignment_by_addressing(inst, child_inst)
46
- addressing = inst.property_value(:addressing).value
55
+ addressing = effective_addressing(inst)
47
56
  case addressing
48
57
  when :compact then child_inst.accesswidth / 8
49
58
  when :regalign then aligned_size(child_inst)
@@ -51,6 +60,11 @@ module SystemRDL
51
60
  end
52
61
  end
53
62
 
63
+ def effective_addressing(inst)
64
+ addrmap = inst.find_addrmap
65
+ addrmap.property_value(:addressing).value
66
+ end
67
+
54
68
  def calc_fullalign_alignment(child_inst)
55
69
  return aligned_size(child_inst) unless child_inst.array?
56
70
 
@@ -72,26 +86,25 @@ module SystemRDL
72
86
  child_inst.address.value + delta
73
87
  end
74
88
 
75
- def check_overlapping_regs(instance)
76
- # For now, support reg only but not regfile
77
- regs = instance.instances.select { |reg| reg.reg? && reg.first_element? }
78
- regs.combination(2).each do |(reg_a, reg_b)|
79
- next unless overlapping_pair?(reg_a, reg_b)
89
+ def check_overlapping_address_ranges(instance)
90
+ insts = instance.instances.select { |inst| addressable_inst?(inst) && inst.first_element? }
91
+ insts.combination(2).each do |(inst_a, inst_b)|
92
+ next unless overlapping_pair?(inst_a, inst_b)
80
93
 
81
- message = 'overlapping regs not allowed'
82
- raise_evaluation_error message, reg_a.token_range, reg_b.token_range
94
+ message = 'overlapping address ranges not allowed'
95
+ raise_evaluation_error message, inst_a.token_range, inst_b.token_range
83
96
  end
84
97
  end
85
98
 
86
- def overlapping_pair?(reg_a, reg_b)
87
- range_a = calc_address_range(reg_a)
88
- range_b = calc_address_range(reg_b)
99
+ def overlapping_pair?(inst_a, inst_b)
100
+ range_a = calc_address_range(inst_a)
101
+ range_b = calc_address_range(inst_b)
89
102
  return false unless range_a.include?(range_b.begin) || range_b.include?(range_a.begin)
90
103
 
91
- r_a = reg_a.sw_readable?
92
- w_a = reg_a.sw_writable?
93
- r_b = reg_b.sw_readable?
94
- w_b = reg_b.sw_writable?
104
+ r_a = inst_a.sw_readable?
105
+ w_a = inst_a.sw_writable?
106
+ r_b = inst_b.sw_readable?
107
+ w_b = inst_b.sw_writable?
95
108
  (r_a && r_b) || (w_a && w_b)
96
109
  end
97
110
 
@@ -121,6 +134,10 @@ module SystemRDL
121
134
  def element_stride(child_inst)
122
135
  child_inst.stride&.value || aligned_size(child_inst)
123
136
  end
137
+
138
+ def addressable_inst?(inst)
139
+ inst.addrmap? || inst.regfile? || inst.mem? || inst.reg?
140
+ end
124
141
  end
125
142
  end
126
143
  end
@@ -77,7 +77,7 @@ module SystemRDL
77
77
 
78
78
  message =
79
79
  "stride less than #{instance.layer} size: " \
80
- "stride 0x#{stride.value.to_s(16)} #{instance.layer} size #{size}"
80
+ "stride 0x#{stride.value.to_s(16)} size #{size}"
81
81
  raise_evaluation_error message, stride.token_range
82
82
  end
83
83
 
@@ -3,12 +3,11 @@
3
3
  module SystemRDL
4
4
  module Evaluator
5
5
  class AddrMapDefinition < ComponentDefinition
6
- include AddressAllocation
7
- include ContainerComponent
6
+ include BlockComponent
8
7
 
9
8
  def evaluate(instance, **optargs)
10
9
  if instance.root?
11
- create_instance(instance, @id, nil, nil, nil, **optargs)
10
+ create_instance(instance, InstArgs.new(@id, nil, nil), nil, nil, **optargs)
12
11
  else
13
12
  super
14
13
  end
@@ -16,7 +15,7 @@ module SystemRDL
16
15
 
17
16
  def validate(instance)
18
17
  check_structural_component_instances(instance)
19
- check_alignment(instance)
18
+ check_alignment_property(instance)
20
19
  check_endianness_exclusivity(instance)
21
20
  check_rsvdset_exclusivity(instance)
22
21
  check_bit_ordering_exclusivity(instance)
@@ -24,21 +23,29 @@ module SystemRDL
24
23
 
25
24
  def finalize(instance)
26
25
  allocate_addresses(instance)
27
- check_overlapping_regs(instance)
26
+ check_address_operations(instance)
27
+ check_overlapping_address_ranges(instance)
28
28
  end
29
29
 
30
30
  def layer
31
31
  :addrmap
32
32
  end
33
33
 
34
+ def support_inst_type?(inst_type)
35
+ inst_type.nil?
36
+ end
37
+
34
38
  private
35
39
 
36
40
  def instance_class
37
41
  AddrMapInstance
38
42
  end
39
43
 
40
- def check_alignment(instance)
41
- check_power_of_2(instance, :alignment, 1)
44
+ def apply_inst_values(instance, inst_values)
45
+ return if instance.parent.root?
46
+
47
+ apply_address_operations(instance, inst_values)
48
+ check_range(inst_values)
42
49
  end
43
50
 
44
51
  def check_endianness_exclusivity(instance)
@@ -55,12 +62,14 @@ module SystemRDL
55
62
  end
56
63
 
57
64
  class AddrMapInstance < Instance
65
+ include BlockInstance
66
+
58
67
  def definable?(definition)
59
- definition.layer in :addrmap | :regfile | :reg | :field
68
+ definition.layer in :addrmap | :regfile | :mem | :reg | :field
60
69
  end
61
70
 
62
71
  def instantiable?(definition)
63
- definition.layer in :addrmap | :regfile | :reg
72
+ definition.layer in :addrmap | :regfile | :mem | :reg
64
73
  end
65
74
  end
66
75
  end
@@ -11,6 +11,10 @@ module SystemRDL
11
11
  module ArrayComponent
12
12
  private
13
13
 
14
+ def apply_array(instance, array_info)
15
+ instance.array_info = array_info
16
+ end
17
+
14
18
  def eval_array(inst_values)
15
19
  array = inst_values[:array]
16
20
  return super unless array
@@ -24,8 +28,8 @@ module SystemRDL
24
28
 
25
29
  index_list =
26
30
  sizes
27
- .map { |size| size.times.to_a }
28
- .then { |list| list[0].product(*list[1..]) }
31
+ .map { |size| size.times.to_a }
32
+ .then { |list| list[0].product(*list[1..]) }
29
33
  id = array_id
30
34
  index_list.each.with_index(1) do |indices, i|
31
35
  info = ArrayInfo.new(id, indices, sizes, i == 1, i == index_list.size)
@@ -38,5 +42,29 @@ module SystemRDL
38
42
  @array_id += 1
39
43
  end
40
44
  end
45
+
46
+ module ArrayInstance
47
+ attr_accessor :array_info
48
+
49
+ def array?
50
+ !array_info.nil?
51
+ end
52
+
53
+ def array_indices
54
+ array_info&.indices
55
+ end
56
+
57
+ def array_sizes
58
+ array_info&.sizes
59
+ end
60
+
61
+ def first_element?
62
+ !array? || array_info.first
63
+ end
64
+
65
+ def last_element?
66
+ !array? || array_info.last
67
+ end
68
+ end
41
69
  end
42
70
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SystemRDL
4
+ module Evaluator
5
+ module BlockComponent
6
+ include ArrayComponent
7
+ include AddressOperation
8
+ include ContainerComponent
9
+ include AddressAllocation
10
+
11
+ private
12
+
13
+ def check_alignment_property(instance)
14
+ check_power_of_2(instance, :alignment, 1)
15
+ end
16
+ end
17
+
18
+ module BlockInstance
19
+ include ArrayInstance
20
+
21
+ attr_accessor :address
22
+ attr_accessor :stride
23
+ attr_accessor :alignment
24
+
25
+ def accesswidth
26
+ @accesswidth ||= instances.map(&:accesswidth).max
27
+ end
28
+
29
+ def size
30
+ @size ||= instances.map { |inst| inst.address.value + inst.size }.max
31
+ end
32
+
33
+ def sw_readable?
34
+ true
35
+ end
36
+
37
+ def sw_writable?
38
+ true
39
+ end
40
+ end
41
+ end
42
+ end
@@ -23,6 +23,7 @@ module SystemRDL
23
23
  #
24
24
  def_property :accesswidth do |prop|
25
25
  prop.targets = [:reg]
26
+ prop.exist = true
26
27
  prop.types = [:longint]
27
28
  prop.dynamic_assign = true
28
29
  prop.ref_target = false
@@ -31,6 +32,7 @@ module SystemRDL
31
32
 
32
33
  def_property :addressing do |prop|
33
34
  prop.targets = [:addrmap]
35
+ prop.exist = true
34
36
  prop.types = [:addressingtype]
35
37
  prop.dynamic_assign = false
36
38
  prop.ref_target = false
@@ -40,14 +42,19 @@ module SystemRDL
40
42
 
41
43
  def_property :alignment do |prop|
42
44
  prop.targets = [:addrmap, :regfile]
45
+ prop.exist = true
43
46
  prop.types = [:longint]
44
47
  prop.dynamic_assign = false
45
48
  prop.ref_target = false
46
49
  prop.per_element_assign = false
50
+ prop.default_value = proc do |inst|
51
+ (inst.regfile? && inst.parent.property_value(:alignment)) || nil
52
+ end
47
53
  end
48
54
 
49
55
  def_property :anded do |prop|
50
56
  prop.targets = [:field]
57
+ prop.exist = true
51
58
  prop.types = [:boolean]
52
59
  prop.dynamic_assign = true
53
60
  prop.ref_target = true
@@ -57,6 +64,7 @@ module SystemRDL
57
64
 
58
65
  def_property :bigendian do |prop|
59
66
  prop.targets = [:addrmap]
67
+ prop.exist = true
60
68
  prop.types = [:boolean]
61
69
  prop.dynamic_assign = true
62
70
  prop.ref_target = false
@@ -66,6 +74,7 @@ module SystemRDL
66
74
 
67
75
  def_property :desc do |prop|
68
76
  prop.types = [:string]
77
+ prop.exist = true
69
78
  prop.dynamic_assign = true
70
79
  prop.ref_target = false
71
80
  prop.per_element_assign = true
@@ -74,6 +83,7 @@ module SystemRDL
74
83
 
75
84
  def_property :errextbus do |prop|
76
85
  prop.targets = [:addrmap, :regfile, :reg]
86
+ prop.exist = true
77
87
  prop.types = [:boolean]
78
88
  prop.dynamic_assign = false
79
89
  prop.ref_target = false
@@ -83,6 +93,7 @@ module SystemRDL
83
93
 
84
94
  def_property :fieldwidth do |prop|
85
95
  prop.targets = [:field]
96
+ prop.exist = true
86
97
  prop.types = [:longint]
87
98
  prop.dynamic_assign = false
88
99
  prop.per_element_assign = false
@@ -91,6 +102,7 @@ module SystemRDL
91
102
 
92
103
  def_property :hw do |prop|
93
104
  prop.targets = [:field]
105
+ prop.exist = true
94
106
  prop.types = [:accesstype]
95
107
  prop.dynamic_assign = false
96
108
  prop.ref_target = false
@@ -100,6 +112,7 @@ module SystemRDL
100
112
 
101
113
  def_property :hwclr do |prop|
102
114
  prop.targets = [:field]
115
+ prop.exist = true
103
116
  prop.types = [:boolean, :field_reference, :property_reference]
104
117
  prop.dynamic_assign = true
105
118
  prop.ref_target = proc { set? }
@@ -109,6 +122,7 @@ module SystemRDL
109
122
 
110
123
  def_property :hwenable do |prop|
111
124
  prop.targets = [:field]
125
+ prop.exist = true
112
126
  prop.types = [:field_reference, :property_reference]
113
127
  prop.dynamic_assign = true
114
128
  prop.ref_target = proc { set? }
@@ -117,6 +131,7 @@ module SystemRDL
117
131
 
118
132
  def_property :hwmask do |prop|
119
133
  prop.targets = [:field]
134
+ prop.exist = true
120
135
  prop.types = [:field_reference, :property_reference]
121
136
  prop.dynamic_assign = true
122
137
  prop.ref_target = proc { set? }
@@ -125,6 +140,7 @@ module SystemRDL
125
140
 
126
141
  def_property :hwset do |prop|
127
142
  prop.targets = [:field]
143
+ prop.exist = true
128
144
  prop.types = [:boolean, :field_reference, :property_reference]
129
145
  prop.dynamic_assign = true
130
146
  prop.ref_target = proc { set? }
@@ -134,6 +150,7 @@ module SystemRDL
134
150
 
135
151
  def_property :littleendian do |prop|
136
152
  prop.targets = [:addrmap]
153
+ prop.exist = true
137
154
  prop.types = [:boolean]
138
155
  prop.dynamic_assign = true
139
156
  prop.ref_target = false
@@ -143,6 +160,7 @@ module SystemRDL
143
160
 
144
161
  def_property :lsb0 do |prop|
145
162
  prop.targets = [:addrmap]
163
+ prop.exist = true
146
164
  prop.types = [:boolean]
147
165
  prop.dynamic_assign = false
148
166
  prop.ref_target = false
@@ -150,8 +168,28 @@ module SystemRDL
150
168
  prop.default_value = false
151
169
  end
152
170
 
171
+ def_property :mementries do |prop|
172
+ prop.targets = [:mem]
173
+ prop.exist = true
174
+ prop.types = [:longint]
175
+ prop.dynamic_assign = false
176
+ prop.ref_target = false
177
+ prop.per_element_assign = false
178
+ prop.default_value = 1
179
+ end
180
+
181
+ def_property :memwidth do |prop|
182
+ prop.targets = [:mem]
183
+ prop.exist = true
184
+ prop.types = [:longint]
185
+ prop.dynamic_assign = false
186
+ prop.ref_target = false
187
+ prop.per_element_assign = false
188
+ end
189
+
153
190
  def_property :msb0 do |prop|
154
191
  prop.targets = [:addrmap]
192
+ prop.exist = true
155
193
  prop.types = [:boolean]
156
194
  prop.dynamic_assign = false
157
195
  prop.ref_target = false
@@ -161,6 +199,7 @@ module SystemRDL
161
199
 
162
200
  def_property :name do |prop|
163
201
  prop.types = [:string]
202
+ prop.exist = true
164
203
  prop.dynamic_assign = true
165
204
  prop.ref_target = false
166
205
  prop.per_element_assign = true
@@ -169,6 +208,7 @@ module SystemRDL
169
208
 
170
209
  def_property :next do |prop|
171
210
  prop.targets = [:field]
211
+ prop.exist = true
172
212
  prop.types = [:field_reference, :property_reference]
173
213
  prop.dynamic_assign = true
174
214
  prop.per_element_assign = false
@@ -177,6 +217,7 @@ module SystemRDL
177
217
 
178
218
  def_property :onread do |prop|
179
219
  prop.targets = [:field]
220
+ prop.exist = proc { |inst| !inst.virtual_field? }
180
221
  prop.types = [:onreadtype]
181
222
  prop.dynamic_assign = true
182
223
  prop.ref_target = false
@@ -185,6 +226,7 @@ module SystemRDL
185
226
 
186
227
  def_property :onwrite do |prop|
187
228
  prop.targets = [:field]
229
+ prop.exist = proc { |inst| !inst.virtual_field? }
188
230
  prop.types = [:onwritetype]
189
231
  prop.dynamic_assign = true
190
232
  prop.ref_target = false
@@ -193,6 +235,7 @@ module SystemRDL
193
235
 
194
236
  def_property :ored do |prop|
195
237
  prop.targets = [:field]
238
+ prop.exist = true
196
239
  prop.types = [:boolean]
197
240
  prop.dynamic_assign = true
198
241
  prop.ref_target = true
@@ -202,6 +245,7 @@ module SystemRDL
202
245
 
203
246
  def_property :paritycheck do |prop|
204
247
  prop.targets = [:field]
248
+ prop.exist = true
205
249
  prop.types = [:boolean]
206
250
  prop.dynamic_assign = false
207
251
  prop.ref_target = false
@@ -211,6 +255,7 @@ module SystemRDL
211
255
 
212
256
  def_property :precedence do |prop|
213
257
  prop.targets = [:field]
258
+ prop.exist = true
214
259
  prop.types = [:precedencetype]
215
260
  prop.dynamic_assign = true
216
261
  prop.ref_target = false
@@ -220,6 +265,7 @@ module SystemRDL
220
265
 
221
266
  def_property :rclr do |prop|
222
267
  prop.targets = [:field]
268
+ prop.exist = proc { |inst| !inst.virtual_field? }
223
269
  prop.types = [:boolean]
224
270
  prop.dynamic_assign = true
225
271
  prop.ref_target = false
@@ -229,6 +275,7 @@ module SystemRDL
229
275
 
230
276
  def_property :regwidth do |prop|
231
277
  prop.targets = [:reg]
278
+ prop.exist = true
232
279
  prop.types = [:longint]
233
280
  prop.dynamic_assign = false
234
281
  prop.ref_target = false
@@ -238,6 +285,7 @@ module SystemRDL
238
285
 
239
286
  def_property :reset do |prop|
240
287
  prop.targets = [:field]
288
+ prop.exist = true
241
289
  prop.types = [:bit, :field_reference, :property_reference]
242
290
  prop.dynamic_assign = true
243
291
  prop.ref_target = proc { set? }
@@ -246,6 +294,7 @@ module SystemRDL
246
294
 
247
295
  def_property :resetsignal do |prop|
248
296
  prop.targets = [:field]
297
+ prop.exist = true
249
298
  prop.types = [:field_reference, :property_reference]
250
299
  prop.dynamic_assign = true
251
300
  prop.ref_target = proc { set? }
@@ -254,6 +303,7 @@ module SystemRDL
254
303
 
255
304
  def_property :rset do |prop|
256
305
  prop.targets = [:field]
306
+ prop.exist = proc { |inst| !inst.virtual_field? }
257
307
  prop.types = [:boolean]
258
308
  prop.dynamic_assign = true
259
309
  prop.ref_target = false
@@ -263,6 +313,7 @@ module SystemRDL
263
313
 
264
314
  def_property :rsvdset do |prop|
265
315
  prop.targets = [:addrmap]
316
+ prop.exist = true
266
317
  prop.types = [:boolean]
267
318
  prop.dynamic_assign = false
268
319
  prop.ref_target = false
@@ -272,6 +323,7 @@ module SystemRDL
272
323
 
273
324
  def_property :rsvdsetX do |prop|
274
325
  prop.targets = [:addrmap]
326
+ prop.exist = true
275
327
  prop.types = [:boolean]
276
328
  prop.dynamic_assign = false
277
329
  prop.ref_target = false
@@ -281,6 +333,7 @@ module SystemRDL
281
333
 
282
334
  def_property :shared do |prop|
283
335
  prop.targets = [:reg]
336
+ prop.exist = true
284
337
  prop.types = [:boolean]
285
338
  prop.dynamic_assign = false
286
339
  prop.ref_target = false
@@ -290,6 +343,7 @@ module SystemRDL
290
343
 
291
344
  def_property :sharedextbus do |prop|
292
345
  prop.targets = [:addrmap, :regfile]
346
+ prop.exist = true
293
347
  prop.types = [:boolean]
294
348
  prop.dynamic_assign = false
295
349
  prop.ref_target = false
@@ -299,6 +353,7 @@ module SystemRDL
299
353
 
300
354
  def_property :singlepulse do |prop|
301
355
  prop.targets = [:field]
356
+ prop.exist = proc { |inst| !inst.virtual_field? }
302
357
  prop.types = [:boolean]
303
358
  prop.dynamic_assign = true
304
359
  prop.ref_target = false
@@ -307,7 +362,8 @@ module SystemRDL
307
362
  end
308
363
 
309
364
  def_property :sw do |prop|
310
- prop.targets = [:field]
365
+ prop.targets = [:mem, :field]
366
+ prop.exist = true
311
367
  prop.types = [:accesstype]
312
368
  prop.dynamic_assign = true
313
369
  prop.ref_target = false
@@ -317,6 +373,7 @@ module SystemRDL
317
373
 
318
374
  def_property :swacc do |prop|
319
375
  prop.targets = [:field]
376
+ prop.exist = proc { |inst| !inst.virtual_field? }
320
377
  prop.types = [:boolean]
321
378
  prop.dynamic_assign = true
322
379
  prop.ref_target = true
@@ -326,6 +383,7 @@ module SystemRDL
326
383
 
327
384
  def_property :swmod do |prop|
328
385
  prop.targets = [:field]
386
+ prop.exist = proc { |inst| !inst.virtual_field? }
329
387
  prop.types = [:boolean]
330
388
  prop.dynamic_assign = true
331
389
  prop.ref_target = true
@@ -335,6 +393,7 @@ module SystemRDL
335
393
 
336
394
  def_property :swwe do |prop|
337
395
  prop.targets = [:field]
396
+ prop.exist = proc { |inst| !inst.virtual_field? }
338
397
  prop.types = [:boolean, :field_reference, :property_reference]
339
398
  prop.dynamic_assign = true
340
399
  prop.ref_target = proc { set? }
@@ -344,6 +403,7 @@ module SystemRDL
344
403
 
345
404
  def_property :swwel do |prop|
346
405
  prop.targets = [:field]
406
+ prop.exist = proc { |inst| !inst.virtual_field? }
347
407
  prop.types = [:boolean, :field_reference, :property_reference]
348
408
  prop.dynamic_assign = true
349
409
  prop.ref_target = proc { set? }
@@ -353,6 +413,7 @@ module SystemRDL
353
413
 
354
414
  def_property :we do |prop|
355
415
  prop.targets = [:field]
416
+ prop.exist = true
356
417
  prop.types = [:boolean, :field_reference, :property_reference]
357
418
  prop.dynamic_assign = true
358
419
  prop.ref_target = proc { set? }
@@ -362,6 +423,7 @@ module SystemRDL
362
423
 
363
424
  def_property :wel do |prop|
364
425
  prop.targets = [:field]
426
+ prop.exist = true
365
427
  prop.types = [:boolean, :field_reference, :property_reference]
366
428
  prop.dynamic_assign = true
367
429
  prop.ref_target = proc { set? }
@@ -371,6 +433,7 @@ module SystemRDL
371
433
 
372
434
  def_property :woclr do |prop|
373
435
  prop.targets = [:field]
436
+ prop.exist = proc { |inst| !inst.virtual_field? }
374
437
  prop.types = [:boolean]
375
438
  prop.dynamic_assign = true
376
439
  prop.ref_target = false
@@ -380,6 +443,7 @@ module SystemRDL
380
443
 
381
444
  def_property :woset do |prop|
382
445
  prop.targets = [:field]
446
+ prop.exist = proc { |inst| !inst.virtual_field? }
383
447
  prop.types = [:boolean]
384
448
  prop.dynamic_assign = true
385
449
  prop.ref_target = false
@@ -389,6 +453,7 @@ module SystemRDL
389
453
 
390
454
  def_property :xored do |prop|
391
455
  prop.targets = [:field]
456
+ prop.exist = true
392
457
  prop.types = [:boolean]
393
458
  prop.dynamic_assign = true
394
459
  prop.ref_target = true