Skip to content

Commit d7e4468

Browse files
Finally able to generate MC100-32 PDF and it looks good.
1 parent dac5370 commit d7e4468

38 files changed

+1853
-1259
lines changed

Rakefile

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ require "yard"
1010
require "minitest/test_task"
1111

1212
require_relative $root / "lib" / "architecture"
13+
require_relative $root / "lib" / "base_architecture"
14+
require_relative $root / "lib" / "design"
15+
require_relative $root / "lib" / "portfolio_design"
1316

1417
directory "#{$root}/.stamps"
1518

@@ -19,6 +22,43 @@ end
1922

2023
directory "#{$root}/.stamps"
2124

25+
# @param base_isa_name [String] rv32 or rv64
26+
# @param base [Integer] 32 or 64
27+
# @return [BaseArchitecture]
28+
def base_arch_for(base_isa_name, base)
29+
Rake::Task["#{$root}/.stamps/resolve-#{base_isa_name}.stamp"].invoke
30+
31+
@base_archs ||= {}
32+
return @base_archs[base_isa_name] if @base_archs.key?(base_isa_name)
33+
34+
@base_archs[base_isa_name] =
35+
BaseArchitecture.new(
36+
base_isa_name,
37+
base,
38+
$root / "gen" / "resolved_arch" / base_isa_name,
39+
)
40+
end
41+
42+
# @param design_name [String] Profile release name for profiles and certificate model name for certificates
43+
# @param arch [Architecture] The architecture database
44+
# @param base [Integer] 32 or 64
45+
# @param portfolios [Array<Portfolio>] Portfolios in this design
46+
# @return [PortfolioDesign]
47+
def portfolio_design_for(design_name, arch, base, portfolios)
48+
Rake::Task["#{$root}/.stamps/resolve-#{design_name}.stamp"].invoke
49+
50+
@portfolio_designs ||= {}
51+
return @portfolio_designs[design_name] if @portfolio_designs.key?(design_name)
52+
53+
@portfolio_designs[design_name] =
54+
PortfolioDesign.new(
55+
design_name,
56+
arch,
57+
base,
58+
portfolios
59+
)
60+
end
61+
2262
def cfg_arch_for(config_name)
2363
Rake::Task["#{$root}/.stamps/resolve-#{config_name}.stamp"].invoke
2464

@@ -117,6 +157,7 @@ namespace :test do
117157
end
118158
task schema: "gen:resolved_arch" do
119159
puts "Checking arch files against schema.."
160+
# TODO: Needs to pass in base ISA name (rv32 or rv64).
120161
Architecture.new("#{$root}/resolved_arch").validate(show_progress: true)
121162
puts "All files validate against their schema"
122163
end

arch/profile_release/MockProfileRelease.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ $schema: profile_release_schema.json#
22
kind: profile release
33
name: MockProfileRelease
44
marketing_name: MockProfileRelease Marketing Name
5-
class: MockProfileClass
5+
class:
6+
$ref: profile_class/MockProfileClass.yaml#
67
release: 20
78
state: ratified # current status ["ratified", "development"]
89
versions:

arch/profile_release/RVA20.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ $schema: profile_release_schema.json#
22
kind: profile release
33
name: RVA20
44
marketing_name: RVA20
5-
class: RVA
5+
class:
6+
$ref: profile_class/RVA.yaml#
67
release: 20
78
state: ratified # current status ["ratified", "development"]
89
ratification_date: "2023-04-03"

arch/profile_release/RVA22.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ $schema: profile_release_schema.json#
22
kind: profile release
33
name: RVA22
44
marketing_name: RVA22
5-
class: RVA
5+
class:
6+
$ref: profile_class/RVA.yaml#
67
release: 22
78
state: ratified # current status ["ratified", "development"]
89
ratification_date: "2023-04-03"

arch/profile_release/RVA23.yaml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
$schema: profile_schema.json#
2-
kind: profile
1+
$schema: profile_release_schema.json#
2+
kind: profile release
33
name: RVA23
44
marketing_name: RVA23
5-
class: RVA
5+
class:
6+
$ref: profile_class/RVA.yaml#
67
release: 23
78
state: ratified # current status ["ratified", "development"]
89
ratification_date: "2023-04-03"

arch/profile_release/RVB23.yaml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
$schema: profile_schema.json#
2-
kind: profile
1+
$schema: profile_release_schema.json#
2+
kind: profile release
33
name: RVB23
44
marketing_name: RVB23
5-
class: RVB
5+
class:
6+
$ref: profile_class/RVA.yaml#
67
release: 23
78
state: ratified # current status ["ratified", "development"]
89
ratification_date: "2023-04-03"

arch/profile_release/RVI20.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ $schema: profile_release_schema.json#
22
kind: profile release
33
name: RVI20
44
marketing_name: RVI20
5-
class: RVI
6-
release: 20
5+
class:
6+
$ref: profile_class/RVI.yaml#
7+
base: null
78
state: ratified # current status ["ratified", "development"]
89
ratification_date: "2023-04-03"
910

backends/certificate_doc/tasks.rake

Lines changed: 58 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -18,58 +18,66 @@ Dir.glob("#{$root}/arch/certificate_model/*.yaml") do |f|
1818
base = cert_model_obj["base"]
1919
raise "Missing certificate model base" if base.nil?
2020

21+
base_isa_name = "rv#{base}"
22+
23+
puts "UPDATE: Extracted base=#{base} from #{f}"
24+
2125
file "#{$root}/gen/certificate_doc/adoc/#{cert_model_name}.adoc" => [
22-
"#{$root}/arch/certificate_model/#{cert_model_name}.yaml",
26+
__FILE__,
2327
"#{$root}/arch/certificate_class/#{cert_class_name}.yaml",
24-
"#{CERT_DOC_DIR}/templates/certificate.adoc.erb",
25-
__FILE__
28+
"#{$root}/arch/certificate_model/#{cert_model_name}.yaml",
29+
"#{$root}/lib/arch_obj_models/certificate.rb",
30+
"#{$root}/lib/arch_obj_models/portfolio.rb",
31+
"#{$root}/lib/portfolio_design.rb",
32+
"#{$root}/lib/design.rb",
33+
"#{CERT_DOC_DIR}/templates/certificate.adoc.erb"
2634
] do |t|
27-
puts "UPDATE: Creating bootstrap objects for #{cert_model_name}"
28-
29-
# Create bootstrap ConfiguredArchitecture object which also creates and contains
30-
# a PartialConfig object for the rv32/rv64 configuration.
31-
bootstrap_cfg_arch = cfg_arch_for("rv#{base}")
32-
33-
# Creates CertModel object for every certificate model in the database
34-
# using rv32/rv64 PartialConfig object and then returns named CertModel object.
35-
bootstrap_cert_model = bootstrap_cfg_arch.cert_model(cert_model_name)
36-
raise "No certificate model named '#{cert_model_name}'" if bootstrap_cert_model.nil?
37-
38-
puts "UPDATE: Creating real objects for #{cert_model_name}"
39-
40-
# Use bootstrap CertModel to create a ConfiguredArchitecture for this CertModel
41-
# to use instead of the the bootstrap one created based on the rv32/rv64 configuration.
42-
cfg_arch = bootstrap_cert_model.to_cfg_arch
43-
44-
# Use model-specific ConfiguredArchitecture to create CertModel objects again
45-
# for every certificate model in the database and then return named CertModel object.
46-
cert_model = cfg_arch.cert_model(cert_model_name)
47-
48-
# Set globals for ERB template.
49-
portfolio = cert_model
50-
cert_class = cert_model.cert_class
51-
portfolio = cert_model
52-
portfolio_class = cert_class
53-
54-
version = File.basename(t.name, '.adoc').split('-')[1..].join('-')
55-
56-
erb = ERB.new(File.read("#{CERT_DOC_DIR}/templates/certificate.adoc.erb"), trim_mode: "-")
57-
erb.filename = "#{CERT_DOC_DIR}/templates/certificate.adoc.erb"
35+
# Create BaseArchitecture object. Function located in top-level Rakefile.
36+
puts "UPDATE: Creating BaseArchitecture #{base_isa_name} for #{t}"
37+
base_arch = base_arch_for(base_isa_name, base)
38+
39+
# Create CertModel for specific certificate model as specified in its arch YAML file.
40+
# The Architecture object also creates all other portfolio-related class instances from their arch YAML files.
41+
# None of these objects are provided with a Design object when created.
42+
puts "UPDATE: Creating CertModel for #{cert_model_name} using base #{base_isa_name}"
43+
cert_model = base_arch.cert_model(cert_model_name)
44+
45+
puts "UPDATE: Creating PortfolioDesign using CertModel #{cert_model_name}"
46+
# Create the one PortfolioDesign object required for the ERB evaluation.
47+
portfolio_design = portfolio_design_for(cert_model_name, base_arch, base, [cert_model])
48+
49+
# Create empty binding and then specify explicitly which variables the ERB template can access.
50+
def create_empty_binding
51+
binding
52+
end
53+
erb_binding = create_empty_binding
54+
erb_binding.local_variable_set(:arch, base_arch)
55+
erb_binding.local_variable_set(:design, portfolio_design)
56+
erb_binding.local_variable_set(:cert_class, cert_model.cert_class)
57+
erb_binding.local_variable_set(:portfolio_class, cert_model.cert_class)
58+
erb_binding.local_variable_set(:cert_model, cert_model)
59+
erb_binding.local_variable_set(:portfolio, cert_model)
60+
61+
template_path = Pathname.new("#{CERT_DOC_DIR}/templates/certificate.adoc.erb")
62+
erb = ERB.new(File.read(template_path), trim_mode: "-")
63+
erb.filename = template_path.to_s
5864

5965
FileUtils.mkdir_p File.dirname(t.name)
6066

6167
# Convert ERB to final ASCIIDOC. Note that this code is broken up into separate function calls
6268
# each with a variable name to aid in running a command-line debugger on this code.
63-
erb_result = erb.result(binding)
64-
erb_result_monospace_converted_to_links = cfg_arch.find_replace_links(erb_result)
65-
erb_result_with_links_added = cfg_arch.find_replace_links(erb_result_monospace_converted_to_links)
69+
puts "UPDATE: Converting ERB template to adoc for #{cert_model_name}"
70+
erb_result = erb.result(erb_binding)
71+
erb_result_monospace_converted_to_links = portfolio_design.find_replace_links(erb_result)
72+
erb_result_with_links_added = portfolio_design.find_replace_links(erb_result_monospace_converted_to_links)
6673
erb_result_with_links_resolved = AsciidocUtils.resolve_links(erb_result_with_links_added)
6774

68-
File.write t.name, erb_result_with_links_resolved
69-
puts "Generated adoc source at #{t.name}"
75+
File.write(t.name, erb_result_with_links_resolved)
76+
puts "UPDATE: Generated adoc source at #{t.name}"
7077
end
7178

7279
file "#{$root}/gen/certificate_doc/pdf/#{cert_model_name}.pdf" => [
80+
__FILE__,
7381
"#{$root}/gen/certificate_doc/adoc/#{cert_model_name}.adoc"
7482
] do |t|
7583
adoc_file = "#{$root}/gen/certificate_doc/adoc/#{cert_model_name}.adoc"
@@ -88,13 +96,17 @@ Dir.glob("#{$root}/arch/certificate_model/*.yaml") do |f|
8896
"-o #{t.name}",
8997
adoc_file
9098
].join(" ")
99+
puts "UPDATE: Generated PDF at #{t.name}"
91100
end
92101

93102
file "#{$root}/gen/certificate_doc/html/#{cert_model_name}.html" => [
103+
__FILE__,
94104
"#{$root}/gen/certificate_doc/adoc/#{cert_model_name}.adoc"
95105
] do |t|
96106
adoc_file = "#{$root}/gen/certificate_doc/adoc/#{cert_model_name}.adoc"
97107
FileUtils.mkdir_p File.dirname(t.name)
108+
109+
puts "UPDATE: Generating PDF at #{t.name}"
98110
sh [
99111
"asciidoctor",
100112
"-w",
@@ -107,29 +119,30 @@ Dir.glob("#{$root}/arch/certificate_model/*.yaml") do |f|
107119
"-o #{t.name}",
108120
adoc_file
109121
].join(" ")
122+
puts "UPDATE: Generated PDF at #{t.name}"
110123
end
111-
112124
end
113125

114126
namespace :gen do
115127
desc <<~DESC
116-
Generate certificate documentation for a specific version as a PDF
128+
Generate certificate documentation for a specific version as a PDF.
117129
118130
Required options:
119131
cert_model_name - The key of the certification model under arch/certificate_model
120132
DESC
121133
task :cert_model_pdf, [:cert_model_name] do |_t, args|
122-
if args[:cert_model_name].nil?
134+
cert_model_name = args[:cert_model_name]
135+
if cert_model_name.nil?
123136
warn "Missing required option: 'cert_model_name'"
124137
exit 1
125138
end
126139

127-
unless File.exist?("#{$root}/arch/certificate_model/#{args[:cert_model_name]}.yaml")
128-
warn "No certification model named '#{args[:cert_model_name]}' found in arch/certificate_model"
140+
unless File.exist?("#{$root}/arch/certificate_model/#{cert_model_name}.yaml")
141+
warn "No certification model named '#{cert_model_name}' found in arch/certificate_model"
129142
exit 1
130143
end
131144

132-
Rake::Task["#{$root}/gen/certificate_doc/pdf/#{args[:cert_model_name]}.pdf"].invoke
145+
Rake::Task["#{$root}/gen/certificate_doc/pdf/#{cert_model_name}.pdf"].invoke
133146
end
134147

135148
task :cert_model_html, [:cert_model_name] do |_t, args|

0 commit comments

Comments
 (0)