Skip to content

Commit 6e40ed8

Browse files
Added links from test procedures to coverage points.
1 parent 0fbbf50 commit 6e40ed8

File tree

8 files changed

+70
-30
lines changed

8 files changed

+70
-30
lines changed

backends/portfolio/templates/coverage_points.adoc.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Coverage Points for `<%= nice_name %>`: ::
1111
| ID | Name | Description | Links
1212

1313
<% db_obj.cert_coverage_points.each do |cp| -%>
14-
| <%= cp.id %>
14+
| <%= defined?(org) ? anchor_for_udb_cert_cov_pt(org, cp.id) : "" %><%= cp.id %>
1515
| <%= cp.name %>
1616
| <%= cp.description %>
1717
a| <% cp.cert_links.each do |link| -%>

backends/portfolio/templates/csr_appendix.adoc.erb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,8 @@ Reset value: ::
141141
<%= field.reset_value_pretty(design) %>
142142
143143
<% if defined?(gen_ctp_content) && gen_ctp_content -%>
144-
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => field, "use_description_list" => true }) %>
145-
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => field, "use_description_list" => true }) %>
144+
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => field, "org" => "appendix", "use_description_list" => true }) %>
145+
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => field, "org" => "appendix", "use_description_list" => true }) %>
146146
<% end # if gen_ctp_content -%>
147147
148148
****
@@ -182,8 +182,8 @@ This CSR may return a value that is different from what is stored in hardware.
182182
<% end -%>
183183
184184
<% if defined?(gen_ctp_content) && gen_ctp_content -%>
185-
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => csr }) %>
186-
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => csr }) %>
185+
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => csr, "org" => "appendix" }) %>
186+
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => csr, "org" => "appendix" }) %>
187187
<% end # if gen_ctp_content -%>
188188
189189
<% end # do in_scope_csrs -%>

backends/portfolio/templates/ext_appendix.adoc.erb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,8 @@ This extension has the following parameters (AKA implementation options):
123123
<% end # unless table -%>
124124
125125
<% if defined?(gen_ctp_content) && gen_ctp_content -%>
126-
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => ext }) %>
127-
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => ext }) %>
126+
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => ext, "org" => "appendix"}) %>
127+
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => ext, "org" => "appendix"}) %>
128128
<% end # if gen_ctp_content -%>
129129
130130
<% end # do ext_req -%>

backends/portfolio/templates/inst_appendix.adoc.erb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ This instruction may result in the following synchronous exceptions:
133133
<% end -%>
134134

135135
<% if defined?(gen_ctp_content) && gen_ctp_content -%>
136-
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => inst }) %>
137-
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => inst }) %>
136+
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => inst, "org" => "appendix" }) %>
137+
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => inst, "org" => "appendix" }) %>
138138
<% end # if gen_ctp_content -%>
139139
140140
<% end # each in_scope instruction -%>

backends/portfolio/templates/test_procedures.adoc.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Test Procedures for `<%= nice_name %>`: ::
1616
| *Coverage Points*
1717
a|
1818
<% tp.cert_coverage_points.each do |cp| -%>
19-
* <%= cp.id %>
19+
* <%= defined?(org) ? link_to_udb_cert_cov_pt(org, cp.id) : cp.id %>
2020
<% end # each cp -%>
2121
| *Steps*
2222
a|

backends/proc_ctp/templates/proc_ctp.adoc.erb

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -91,21 +91,21 @@ This document is generated by a database backend so all views of the information
9191
=== Extension Coverage Points
9292

9393
<% proc_cert_model.in_scope_extensions.each do |ext| -%>
94-
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => ext }) %>
94+
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => ext, "org" => "sep"}) %>
9595
<% end -%>
9696

9797
=== Instruction Coverage Points
9898

9999
<% proc_cert_model.in_scope_instructions(design).each do |inst| -%>
100-
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => inst }) %>
100+
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => inst, "org" => "sep"}) %>
101101
<% end -%>
102102

103103
=== CSR Coverage Points
104104

105105
<% proc_cert_model.in_scope_csrs(design).each do |csr| -%>
106-
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => csr }) %>
106+
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => csr, "org" => "sep" }) %>
107107
<% csr.implemented_fields(design).each do |field| -%>
108-
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => field }) %>
108+
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => field, "org" => "sep" }) %>
109109
<% end -%>
110110
<% end -%>
111111

@@ -118,21 +118,21 @@ This document is generated by a database backend so all views of the information
118118
=== Extension Test Procedures
119119

120120
<% proc_cert_model.in_scope_extensions.each do |ext| -%>
121-
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => ext }) %>
121+
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => ext, "org" => "sep" }) %>
122122
<% end -%>
123123

124124
=== Instruction Test Procedures
125125

126126
<% proc_cert_model.in_scope_instructions(design).each do |inst| -%>
127-
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => inst }) %>
127+
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => inst, "org" => "sep" }) %>
128128
<% end -%>
129129

130130
=== CSR Test Procedures
131131

132132
<% proc_cert_model.in_scope_csrs(design).each do |csr| -%>
133-
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => csr }) %>
133+
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => csr, "org" => "sep" }) %>
134134
<% csr.implemented_fields(design).each do |field| -%>
135-
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => field }) %>
135+
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => field, "org" => "sep" }) %>
136136
<% end -%>
137137
<% end -%>
138138

@@ -145,25 +145,25 @@ This document is generated by a database backend so all views of the information
145145
=== Extension Coverage Points & Test Procedures
146146

147147
<% proc_cert_model.in_scope_extensions.each do |ext| -%>
148-
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => ext }) %>
149-
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => ext }) %>
148+
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => ext, "org" => "combo"}) %>
149+
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => ext, "org" => "combo"}) %>
150150
<% end -%>
151151

152152
=== Instruction Coverage Points & Test Procedures
153153

154154
<% proc_cert_model.in_scope_instructions(design).each do |inst| -%>
155-
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => inst }) %>
156-
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => inst }) %>
155+
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => inst, "org" => "combo"}) %>
156+
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => inst, "org" => "combo"}) %>
157157
<% end -%>
158158

159159
=== CSR Coverage Points & Test Procedures
160160

161161
<% proc_cert_model.in_scope_csrs(design).each do |csr| -%>
162-
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => csr }) %>
163-
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => csr }) %>
162+
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => csr, "org" => "combo"}) %>
163+
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => csr, "org" => "combo"}) %>
164164
<% csr.implemented_fields(design).each do |field| -%>
165-
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => field, "use_description_list" => true }) %>
166-
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => field, "use_description_list" => true }) %>
165+
<%= portfolio_design.include_erb("coverage_points.adoc.erb", { "db_obj" => field, "use_description_list" => true, "org" => "combo"}) %>
166+
<%= portfolio_design.include_erb("test_procedures.adoc.erb", { "db_obj" => field, "use_description_list" => true, "org" => "combo"}) %>
167167
<% end -%>
168168
<% end -%>
169169

lib/backend_helpers.rb

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ class String
1010
# Should be called on all RISC-V extension, instruction, CSR, and CSR field names.
1111
# Parameters never have periods in their names so they don't need to be sanitized.
1212
#
13-
# @param name [String] Some RISC-V name which might have periods in it
14-
# @return [String] New String with periods replaced with underscores
15-
def sanitize = String.new(self).gsub(".", "_")
13+
# @param name [String] Some RISC-V name which might have periods in it or ampersand
14+
# @return [String] New String with periods replaced with underscores and ampersands replaced with "_and_"
15+
def sanitize = String.new(self).gsub(".", "_").gsub("&", "_and_")
1616
end
1717

1818
# This module is included in the Design class so its methods are available to be called directly
@@ -94,6 +94,14 @@ def link_into_idl_inst_code(inst_name, loc_name)
9494
end
9595
# TODO: Add csr and csr_field support
9696

97+
# @return [String] A hyperlink to a UDB certification coverage point (separate chapters for cov pts and test procs)
98+
# @param org [String] Organization of coverage points and test procedures (sep=separate chapters, combo=combined chapters, appendix=appendix)
99+
# @param id [String] ID of the coverage point
100+
def link_to_udb_cert_cov_pt(org, id)
101+
raise ArgumentError, "Unknown org value of '#{org}' for ID '#{id}'" unless org == "sep" || org == "combo" || org == "appendix"
102+
"%%UDB_CERT_COV_PT_LINK%#{org};#{id.sanitize};#{id}%%"
103+
end
104+
97105
###########
98106
# ANCHORS #
99107
###########
@@ -137,14 +145,23 @@ def anchor_for_udb_doc_idl_func(name)
137145
"[#udb:doc:func:#{name.sanitize}]"
138146
end
139147

140-
# @return [String] A anchor inside IDL instruction code
148+
# @return [String] An anchor inside IDL instruction code
141149
# @param func_name [String] Name of the instruction
142150
# @param func_name [String] Name of the location within the instruction code
143151
def anchor_inside_idl_inst_code(inst_name, loc_name)
144152
"[#idl:code:inst:#{inst_name.sanitize}:#{loc_name.sanitize}]"
145153
end
146154
# TODO: Add csr and csr_field support
147155

156+
# @return [String] An anchor for a UDB certification coverage point (separate chapters for cov pts and test procs)
157+
# @param org [String] Organization of coverage points and test procedures (sep=separate chapters, combo=combined chapters, appendix=appendix)
158+
# @param id [String] ID of the coverage point
159+
# Have to use [[anchor]] instead of [#anchor] since only the former works when in a table cell.
160+
def anchor_for_udb_cert_cov_pt(org, id)
161+
raise ArgumentError, "Unknown org value of '#{org}' for ID '#{id}'" unless org == "sep" || org == "combo" || org == "appendix"
162+
"[[udb:cert:cov_pt:#{org}:#{id.sanitize}]]"
163+
end
164+
148165
private
149166
#@ param s [String]
150167
def check_no_periods(s)
@@ -208,6 +225,14 @@ def resolve_links(path_or_str)
208225
else
209226
raise "Unhandled link type of '#{type}' for '#{name}' with link_text '#{link_text}'"
210227
end
228+
end.gsub(/%%UDB_CERT_COV_PT_LINK%([^;%]+)\s*;\s*([^;%]+)\s*;\s*([^%]+)%%/) do
229+
org = Regexp.last_match[1] # sep or combo
230+
id = Regexp.last_match[2]
231+
link_text = Regexp.last_match[3]
232+
233+
raise "Unhandled link org of '#{org}' for ID '#{id}' with link_text '#{link_text}'" unless org == "sep" || org == "combo" || org == "appendix"
234+
235+
"<<udb:cert:cov_pt:#{org}:#{id},#{link_text}>>"
211236
end
212237
end
213238
end

lib/test/test_backend_helpers.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,14 @@ def test_idl_code
5959
assert_equal("%%IDL_CODE_LINK%inst;fo_o.ba_r;fo.o.ba.r%%", link_into_idl_inst_code("fo.o","ba.r"))
6060
assert_equal("[#idl:code:inst:fo_o:ba_r]", anchor_inside_idl_inst_code("fo.o","ba.r"))
6161
end
62+
63+
def test_cert_cov_pt
64+
assert_equal("%%UDB_CERT_COV_PT_LINK%sep;foo_and_bar;foo&bar%%", link_to_udb_cert_cov_pt("sep", "foo&bar"))
65+
assert_equal("[[udb:cert:cov_pt:sep:foo]]", anchor_for_udb_cert_cov_pt("sep", "foo"))
66+
assert_equal("%%UDB_CERT_COV_PT_LINK%combo;fo_o;fo.o%%", link_to_udb_cert_cov_pt("combo", "fo.o"))
67+
assert_equal("[[udb:cert:cov_pt:combo:fo_o]]", anchor_for_udb_cert_cov_pt("combo", "fo.o"))
68+
assert_raises(ArgumentError) { link_to_udb_cert_cov_pt("bad-org-value","abc") }
69+
end
6270
end
6371

6472
class TestAsciidocUtils < Minitest::Test
@@ -96,6 +104,13 @@ def test_resolve_links_idl_code
96104
assert_equal("<<idl:code:inst:foo:bar,zort>>", AsciidocUtils.resolve_links("%%IDL_CODE_LINK%inst;foo.bar;zort%%"))
97105
assert_equal("<<idl:code:inst:foo:bar,foo.bar>>", AsciidocUtils.resolve_links(link_into_idl_inst_code("foo","bar")))
98106
end
107+
108+
def test_resolve_links_cert_cov_pt
109+
assert_equal("<<udb:cert:cov_pt:sep:foo,bar>>", AsciidocUtils.resolve_links("%%UDB_CERT_COV_PT_LINK%sep;foo;bar%%"))
110+
assert_equal("<<udb:cert:cov_pt:sep:foo,foo>>", AsciidocUtils.resolve_links(link_to_udb_cert_cov_pt("sep", "foo")))
111+
assert_equal("<<udb:cert:cov_pt:combo:foo,bar>>", AsciidocUtils.resolve_links("%%UDB_CERT_COV_PT_LINK%combo;foo;bar%%"))
112+
assert_equal("<<udb:cert:cov_pt:combo:foo,foo>>", AsciidocUtils.resolve_links(link_to_udb_cert_cov_pt("combo", "foo")))
113+
end
99114
end
100115

101116
class TestAntoraUtils < Minitest::Test

0 commit comments

Comments
 (0)