Skip to content

Commit 9496234

Browse files
dhower-qcayosher
authored andcommitted
Make CRD gen check ext versions for in scope. Update CSRs with correc… (riscv-software-src#167)
* Make CRD gen check ext versions for in scope. Update CSRs with correct version info * correct S version requirement for medelegh * Fix typo Signed-off-by: Albert Yosher <[email protected]>
1 parent 6d244d9 commit 9496234

File tree

7 files changed

+36
-10
lines changed

7 files changed

+36
-10
lines changed

arch/csr/medelegh.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,7 @@ medelegh:
88
base: 32
99
description: |
1010
Alias of the upper 32 bits of `medeleg`.
11-
definedBy: I
11+
definedBy:
12+
name: S
13+
version: ">= 1.13"
1214
fields: {}

arch/csr/mseccfg.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ mseccfg:
88
description: Machine Security Configuration
99
definedBy:
1010
name: Sm
11-
version: ">=1.12"
11+
version: ">= 1.12"
1212
fields: {}
1313

arch/csr/mseccfgh.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ mseccfgh:
88
description: Machine Security Configuration
99
definedBy:
1010
name: Sm
11-
version: ">=1.12"
11+
version: ">= 1.12"
1212
fields: {}
1313

arch/csr/mstatush.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ mstatush:
77
base: 32
88
length: 32
99
description: The mstatus register tracks and controls the hart's current operating state.
10-
definedBy: Sm
10+
definedBy:
11+
name: Sm
12+
version: ">= 1.12"
1113
fields:
1214
MPV:
1315
location: 7

backends/crd_doc/templates/crd.adoc.erb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ None
176176
== CSR Summary
177177

178178
<%
179-
csrs = crd.in_scope_extensions.map { |ext_crd| ext_crd.csrs }.flatten.uniq
179+
csrs = crd.in_scope_ext_reqs.map { |ext_crd_req| ext_crd_req.csrs(crd.arch_def) }.flatten.uniq
180180
-%>
181181

182182
=== By Name
@@ -476,7 +476,7 @@ This instruction may result in the following synchronous exceptions:
476476
== CSR Details
477477

478478
<%
479-
csrs = crd.in_scope_extensions.map { |ext_crd| ext_crd.csrs }.flatten.uniq
479+
csrs = crd.in_scope_ext_reqs.map { |ext_crd_req| ext_crd_req.csrs(crd.arch_def) }.flatten.uniq
480480
csrs.sort_by!(&:name)
481481
-%>
482482

lib/arch_obj_models/extension.rb

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -419,15 +419,24 @@ def satisfying_versions(archdef)
419419
# @param extension_version [ExtensionVersion] A specific extension version
420420
# @return [Boolean] whether or not the extension_version meets this requirement
421421
# @overload
422+
# @param extension_requirement [ExtensionRequirement] A range of extension versions
423+
# @return [Boolean] whether or not extension_requirement is satisfied by this requirement
424+
# @overload
422425
# @param extension_name [#to_s] An extension name
423426
# @param extension_name [#to_s] An extension version
424427
# @return [Boolean] whether or not the extension_version meets this requirement
425428
def satisfied_by?(*args)
426429
if args.size == 1
427-
raise ArgumentError, "Single argument must be an ExtensionVersion" unless args[0].is_a?(ExtensionVersion)
428-
429-
args[0].name == @name &&
430-
@requirement.satisfied_by?(Gem::Version.new(args[0].version))
430+
if args[0].is_a?(ExtensionVersion)
431+
args[0].name == @name &&
432+
@requirement.satisfied_by?(Gem::Version.new(args[0].version))
433+
elsif args[0].is_a?(ExtensionRequirement)
434+
satisfying_versions.all? do |ext_ver|
435+
satified_by?(ext_ver)
436+
end
437+
else
438+
raise ArgumentError, "Single argument must be an ExtensionVersion or ExtensionRquirement"
439+
end
431440
elsif args.size == 2
432441
raise ArgumentError, "First parameter must be an extension name" unless args[0].respond_to?(:to_s)
433442
raise ArgumentError, "First parameter must be an extension version" unless args[1].respond_to?(:to_s)
@@ -439,6 +448,17 @@ def satisfied_by?(*args)
439448
end
440449
end
441450

451+
# @return [Array<Csr>] List of CSRs defined by any extension satisfying this requirement
452+
def csrs(arch_def)
453+
return @csrs unless @csrs.nil?
454+
455+
@csrs = arch_def.csrs.select do |csr|
456+
satisfying_versions(arch_def).any? do |ext_ver|
457+
csr.defined_by?(ext_ver)
458+
end
459+
end
460+
end
461+
442462
# sorts by name
443463
def <=>(other)
444464
raise ArgumentError, "ExtensionRequirements are only comparable to other extension requirements" unless other.is_a?(ExtensionRequirement)

lib/arch_obj_models/obj.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,8 @@ def defined_by?(*args)
151151

152152
# @return [SchemaCondition] Extension(s) that define the instruction. If *any* requirement is met, the instruction is defined.
153153
def defined_by
154+
raise "ERROR: definedBy is nul for #{name}" if @data["definedBy"].nil?
155+
154156
SchemaCondition.new(@data["definedBy"])
155157
end
156158

0 commit comments

Comments
 (0)