Skip to content

Commit 9d7921d

Browse files
Switching to desktop workspace from Codespace.
1 parent c7a9658 commit 9d7921d

File tree

7 files changed

+157
-54
lines changed

7 files changed

+157
-54
lines changed

Rakefile

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -302,42 +302,56 @@ task :regress do
302302
end
303303

304304
desc <<~DESC
305-
Generate all certificates and profile PDFs.
305+
Generate all portfolio-based PDFs (certificates and profiles).
306306
DESC
307-
task :cert_profile_pdfs do
307+
task :portfolio_pdfs do
308+
puts ""
308309
puts "==================================="
309-
puts "cert_profile_pdfs: Generating MC100"
310-
puts " 1st target"
310+
puts "Generating MC100"
311311
puts "==================================="
312+
puts ""
312313
Rake::Task["#{$root}/gen/certificate_doc/pdf/MC100.pdf"].invoke
313314

315+
puts ""
314316
puts "=================================================="
315-
puts "cert_profile_pdfs: Generating MockCertificateModel"
316-
puts " 2nd target"
317+
puts "Generating MockCertificateModel"
317318
puts "=================================================="
319+
puts ""
318320
Rake::Task["#{$root}/gen/certificate_doc/pdf/MockCertificateModel.pdf"].invoke
319321

322+
puts ""
320323
puts "==================================="
321-
puts "cert_profile_pdfs: Generating RVA20"
322-
puts " 3rd target"
324+
puts "Generating RVA20"
323325
puts "==================================="
326+
puts ""
324327
Rake::Task["#{$root}/gen/profile_doc/pdf/RVA20.pdf"].invoke
325328

329+
puts ""
326330
puts "==================================="
327-
puts "cert_profile_pdfs: Generating RVA22"
328-
puts " 4th target"
331+
puts "Generating RVA22"
329332
puts "==================================="
333+
puts ""
330334
Rake::Task["#{$root}/gen/profile_doc/pdf/RVA22.pdf"].invoke
331335

336+
puts ""
332337
puts "==================================="
333-
puts "cert_profile_pdfs: Generating RVI20"
334-
puts " 5th target"
338+
puts "Generating RVI20"
335339
puts "==================================="
340+
puts ""
336341
Rake::Task["#{$root}/gen/profile_doc/pdf/RVI20.pdf"].invoke
337342

343+
puts ""
338344
puts "==================================="
339-
puts "cert_profile_pdfs: Generating MockProfileRelease"
340-
puts " 6th target"
345+
puts "Generating MockProfileRelease"
341346
puts "==================================="
347+
puts ""
342348
Rake::Task["#{$root}/gen/profile_doc/pdf/MockProfileRelease.pdf"].invoke
343-
end
349+
end
350+
351+
# Shortcut targets for building profiles and certificates.
352+
task MC100: "#{$root}/gen/certificate_doc/pdf/MC100.pdf"
353+
task MockCertificateModel: "#{$root}/gen/certificate_doc/pdf/MockCertificateModel.pdf"
354+
task RVI20: "#{$root}/gen/profile_doc/pdf/RVI20.pdf"
355+
task RVA20: "#{$root}/gen/profile_doc/pdf/RVA20.pdf"
356+
task RVA22: "#{$root}/gen/profile_doc/pdf/RVA22.pdf"
357+
task MockProfileRelease: "#{$root}/gen/profile_doc/pdf/MockProfileRelease.pdf"

arch/profile_release/MockProfileRelease.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ MockProfileRelease:
6868
optional: transitory
6969
version: "~> 1.11"
7070
note: Made this a transitory option
71+
MockExt:
72+
presence: mandatory
73+
version: "~> 0.9.9"
7174
extra_notes:
7275
- presence: mandatory
7376
text: |

backends/profile_doc/tasks.rake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ rule %r{#{$root}/gen/profile_doc/adoc/.*\.adoc} => proc { |tname|
44
profile_release_name = Pathname.new(tname).basename(".adoc")
55

66
[
7-
"#{$root}/.stamps/arch-gen.stamp",
7+
"#{$root}/.stamps/arch-gen-_64.stamp",
88
__FILE__,
99
"#{$root}/lib/arch_obj_models/profile.rb",
1010
"#{$root}/backends/profile_doc/templates/profile.adoc.erb"

backends/profile_doc/templates/profile.adoc.erb

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
:description: <%= profile_release.marketing_name %> Profile
33
:revdate: <%= profile_release.ratification_date.nil? ? Date.today : profile_release.ratification_date %>
44

5-
// XXX - Figure out what we really want here - Change percent hash to percent equals.
5+
// TODO - Figure out what we really want here - Change percent hash to percent equals.
66
// :revnumber: <%# profile_release.map(&:version).sort.last %>
77

88
:revmark: "TODO: revmark"
@@ -311,6 +311,7 @@ optional profile extensions for a new profile might be prototyped as
311311
non-profile extensions on an earlier profile.
312312

313313
// XXX - Need to create render() Ruby function.
314+
// See https://github.com/riscv-software-src/riscv-unified-db/issues/59
314315
// <%# render("#{$root}/backends/portfolio_doc/templates/family_intro.erb", portfolio_class: profile_class) %>
315316

316317
== <%= profile_class.name %> Profile Class
@@ -344,21 +345,6 @@ Ratification date:: <%= profile_release.ratification_date %>
344345
--
345346
<% end # each profile_release -%>
346347
347-
=== Extension Presence
348-
349-
The <%= profile_class.marketing_name %> Profile Class references
350-
<%= profile_class.referenced_extensions.size %> extensions.
351-
352-
.Status
353-
|===
354-
| Extension | <%= profile_class.profiles.map(&:marketing_name).join(" | ") -%>
355-
356-
<% profile_class.referenced_extensions.sort_by(&:name).each do |ext| -%>
357-
| <%= ext.name %> | <%= profile_class.profiles.map { |profile| profile.extension_presence(ext.name) }.join(" | ") -%>
358-
<% end -%>
359-
360-
|===
361-
362348
== <%= profile_release.name %> Profile Release
363349
364350
<%= profile_release.introduction %>
@@ -370,8 +356,8 @@ associated implementation-defined parameters across all its defined profiles.
370356
=== <%= profile_release.name %> Description
371357
372358
<%= profile_release.description %>
373-
374359
<% end # unless -%>
360+
375361
<% profile_release.profiles.each do |profile| -%>
376362
=== <%= profile.marketing_name %> Profile
377363
@@ -411,6 +397,41 @@ associated implementation-defined parameters.
411397
412398
<% end # each profile -%>
413399
400+
<<<
401+
[appendix]
402+
== Profile Comparisons
403+
404+
=== Release Comparison
405+
406+
The <%= profile_class.marketing_name %> Profile Class has <%= profile_class.profile_releases.size %> releases that
407+
reference a total of <%= profile_class.referenced_extensions.size %> extensions.
408+
409+
.Extension Presence
410+
|===
411+
| Extension | <%= profile_class.profile_releases.map(&:marketing_name).join(" | ") %>
412+
413+
<% profile_class.referenced_extensions.sort_by(&:name).each do |ext| -%>
414+
| <%= ext.name %> | <%= profile_class.profile_releases.map { |profile_release| profile_release.extension_presence(ext.name) }.join(" | ") %>
415+
<% end -%>
416+
|===
417+
418+
=== Profile Comparison
419+
420+
The <%= profile_release.marketing_name %> Profile Release has <%= profile_release.profiles.size %> profiles that
421+
reference a total of <%= profile_release.referenced_extensions.size %> extensions.
422+
423+
[NOTE]
424+
Extensions present in a profile are also present in higher-privileged profiles in the same profile release.
425+
426+
.Extension Presence
427+
|===
428+
| Extension | <%= profile_release.profiles.map(&:marketing_name).join(" | ") %>
429+
430+
<% profile_release.referenced_extensions.sort_by(&:name).each do |ext| -%>
431+
| <%= ext.name %> | <%= profile_release.profiles.map { |profile| profile.extension_presence(ext.name) }.join(" | ") %>
432+
<% end -%>
433+
|===
434+
414435
<<<
415436
[appendix]
416437
== Extension Details
@@ -420,12 +441,12 @@ associated implementation-defined parameters.
420441
=== <%= ext.name %> Extension
421442
<%= ext.long_name %>
422443
423-
.Status
444+
.Presence
424445
|===
425446
| Profile | v<%= ext.versions.map { |v| v.version }.join(" | v") %>
426447
427448
<% profile_release.profiles.each do |profile| -%>
428-
| <%= profile.marketing_name %> | <%= profile.version_strongest_presence(ext.name, ext.versions).join(" | ") -%>
449+
| <%= profile.marketing_name %> | <%= profile.version_greatest_presence(ext.name, ext.versions).join(" | ") -%>
429450
<% end -%>
430451
431452
|===

lib/arch_obj_models/extension.rb

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -476,8 +476,8 @@ def initialize(data)
476476
end
477477
end
478478

479-
def mandatory? = (@presence == mandatory)
480-
def optional? = (@presence == optional)
479+
def mandatory? = (@presence == "mandatory")
480+
def optional? = (@presence == "optional")
481481

482482
# Class methods
483483
def self.mandatory = "mandatory"
@@ -522,6 +522,17 @@ def to_s
522522
@optional_type.nil? ? "#{presence}" : "#{presence} (#{optional_type})"
523523
end
524524

525+
def to_s_concise
526+
"#{presence}"
527+
end
528+
529+
#
530+
# Overloaded comparison operators following these rules:
531+
# - "mandatory" is greater than "optional"
532+
# - optional_types all have same rank
533+
# - equals compares presence and then optional_type
534+
#
535+
525536
# @overload ==(other)
526537
# @param other [String] A presence string
527538
# @return [Boolean] whether or not this ExtensionPresence has the same presence (ignores optional_type)
@@ -539,6 +550,26 @@ def ==(other)
539550
end
540551
end
541552

553+
# @overload >(other)
554+
# @param other [ExtensionPresence] An extension presence object
555+
# @return [Boolean] Whether or not this ExtensionPresence is greater-than the other
556+
def >(other) = (self.mandatory? && other.optional?)
557+
558+
# @overload >=(other)
559+
# @param other [ExtensionPresence] An extension presence object
560+
# @return [Boolean] Whether or not this ExtensionPresence is greater-than or equal to the other
561+
def >=(other) = (self > other) || (self == other)
562+
563+
# @overload <(other)
564+
# @param other [ExtensionPresence] An extension presence object
565+
# @return [Boolean] Whether or not this ExtensionPresence is less-than the other
566+
def <(other) = (self.optional? && other.mandatory?)
567+
568+
# @overload <=(other)
569+
# @param other [ExtensionPresence] An extension presence object
570+
# @return [Boolean] Whether or not this ExtensionPresence is less-than or equal to the other
571+
def <=(other) = (self < other) || (self == other)
572+
542573
# Sorts by presence, then by optional_type
543574
def <=>(other)
544575
raise ArgumentError, "ExtensionPresence is only comparable to other ExtensionPresence classes" unless other.is_a?(ExtensionPresence)

lib/arch_obj_models/portfolio.rb

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -61,35 +61,48 @@ def description = @data["description"]
6161
# @return [Gem::Version] Semantic version of the PortfolioInstance
6262
def version = Gem::Version.new(@data["version"])
6363

64+
# @return [ExtensionPresence] Given an extension +ext_name+, return the presence.
65+
# If the extension name isn't found in the portfolio, return nil.
66+
def extension_presence_obj(ext_name)
67+
# Get extension information from YAML for passed in extension name.
68+
ext_data = @data["extensions"][ext_name]
69+
70+
ext_data.nil? ? nil : ExtensionPresence.new(ext_data["presence"])
71+
end
72+
6473
# @return [String] Given an extension +ext_name+, return the presence as a string.
6574
# If the extension name isn't found in the portfolio, return "-".
6675
def extension_presence(ext_name)
67-
# Get extension information from YAML for passed in extension name.
68-
ext_data = @data["extensions"][ext_name]
76+
ext_presence_obj = extension_presence_obj(ext_name)
6977

70-
ext_data.nil? ? "-" : ExtensionPresence.new(ext_data["presence"]).to_s
78+
ext_presence_obj.nil? ? "-" : ext_presence_obj.to_s
7179
end
7280

73-
# Returns the strongest presence string for each of the specified versions.
81+
# Returns the greatest presence string for each of the specified versions.
7482
# @param ext_name [String]
7583
# @param ext_versions [Array<ExtensionVersion>]
7684
# @return [Array<String>]
77-
def version_strongest_presence(ext_name, ext_versions)
85+
def version_greatest_presence(ext_name, ext_versions)
7886
presences = []
7987

80-
# See if any extension requirement in this profile lists this version as either mandatory or optional.
8188
ext_versions.map do |v|
82-
mandatory = mandatory_ext_reqs.any? { |ext_req| ext_req.satisfied_by?(ext_name, v.version) }
83-
optional = optional_ext_reqs.any? { |ext_req| ext_req.satisfied_by?(ext_name, v.version) }
84-
85-
# Just show strongest presence (mandatory stronger than optional).
86-
if mandatory
87-
presences << ExtensionPresence.mandatory
88-
elsif optional
89-
presences << ExtensionPresence.optional
90-
else
91-
presences << "-"
89+
greatest_presence = nil
90+
91+
in_scope_ext_reqs.each do |ext_req|
92+
if ext_req.satisfied_by?(ext_name, v.version)
93+
presence = extension_presence_obj(ext_name)
94+
95+
unless presence.nil?
96+
if greatest_presence.nil?
97+
greatest_presence = presence
98+
elsif presence > greatest_presence
99+
greatest_presence = presence
100+
end
101+
end
102+
end
92103
end
104+
105+
presences << (greatest_presence.nil? ? "-" : greatest_presence.to_s_concise)
93106
end
94107

95108
presences
@@ -194,7 +207,7 @@ def to_arch_def
194207
end
195208
arch_def_data["params"] = all_in_scope_ext_params.select(&:single_value?).map { |p| [p.name, p.value] }.to_h
196209

197-
# XXX Add list of prohibited_extensions
210+
# TODO: Add list of prohibited_extensions
198211

199212
file = Tempfile.new("archdef")
200213
file.write(YAML.safe_dump(arch_def_data, permitted_classes: [Date]))

lib/arch_obj_models/profile.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,27 @@ def referenced_extensions
126126

127127
@referenced_extensions
128128
end
129+
130+
# @return [String] Given an extension +ext_name+, return the presence as a string.
131+
# Returns the greatest presence string across all profiles in the release.
132+
# If the extension name isn't found in the release, return "-".
133+
def extension_presence(ext_name)
134+
greatest_presence = nil
135+
136+
profiles.each do |profile|
137+
presence = profile.extension_presence_obj(ext_name)
138+
139+
unless presence.nil?
140+
if greatest_presence.nil?
141+
greatest_presence = presence
142+
elsif presence > greatest_presence
143+
greatest_presence = presence
144+
end
145+
end
146+
end
147+
148+
greatest_presence.nil? ? "-" : greatest_presence.to_s_concise
149+
end
129150
end
130151

131152
# Representation of a specific profile in a profile release.

0 commit comments

Comments
 (0)