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 +4 -4
- data/README.md +32 -2
- data/lib/systemrdl/evaluator/address_allocation.rb +37 -20
- data/lib/systemrdl/evaluator/address_operation.rb +1 -1
- data/lib/systemrdl/evaluator/addrmap.rb +18 -9
- data/lib/systemrdl/evaluator/array_component.rb +30 -2
- data/lib/systemrdl/evaluator/block_component.rb +42 -0
- data/lib/systemrdl/evaluator/builtin_properties.rb +66 -1
- data/lib/systemrdl/evaluator/component_definition.rb +21 -18
- data/lib/systemrdl/evaluator/component_insts.rb +43 -4
- data/lib/systemrdl/evaluator/field.rb +39 -25
- data/lib/systemrdl/evaluator/inst_type_aware_component.rb +17 -0
- data/lib/systemrdl/evaluator/instance.rb +21 -27
- data/lib/systemrdl/evaluator/mem.rb +190 -0
- data/lib/systemrdl/evaluator/processor.rb +11 -0
- data/lib/systemrdl/evaluator/property.rb +17 -6
- data/lib/systemrdl/evaluator/reg.rb +107 -9
- data/lib/systemrdl/evaluator/regfile.rb +21 -1
- data/lib/systemrdl/evaluator/root.rb +1 -1
- data/lib/systemrdl/model/instance.rb +83 -50
- data/lib/systemrdl/model/value.rb +27 -3
- data/lib/systemrdl/model.rb +39 -3
- data/lib/systemrdl/version.rb +1 -1
- data/lib/systemrdl.rb +3 -0
- metadata +4 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7c26a164d35f8d0c6ef03e815551d34cb353c706fce64aa6a211e64e0bd6e063
|
|
4
|
+
data.tar.gz: 7c6b7b3653f0fc07dcd131114229fda4a8f3e358e7c03f812b161dab069556fe
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
109
|
-
|
|
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
|
-
|
|
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
|
-
|
|
35
|
-
return
|
|
33
|
+
alignment = child_inst.alignment&.value
|
|
34
|
+
return alignment if alignment
|
|
36
35
|
|
|
37
36
|
alignments = [
|
|
38
|
-
inst
|
|
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
|
|
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
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
|
82
|
-
raise_evaluation_error message,
|
|
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?(
|
|
87
|
-
range_a = calc_address_range(
|
|
88
|
-
range_b = calc_address_range(
|
|
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 =
|
|
92
|
-
w_a =
|
|
93
|
-
r_b =
|
|
94
|
-
w_b =
|
|
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)}
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
41
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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
|