Skip to content

Commit 99832a9

Browse files
79088371747908837174
andauthored
Fix issue riscv-software-src#85: Make instruction access mode display conditional (riscv-software-src#911)
Instruction AsciiDoc templates always display access modes for M, S, and U modes (and VS, VU when H extension is present), even when U/S modes aren't implemented in the system. - Modify instruction AsciiDoc templates to conditionally display only the privilege modes that are actually implemented - Check for S, U, and H extension presence before showing corresponding access modes - Always display M-mode as it's always present in RISC-V systems - Show S-mode (or HS-mode when H extension is present) only when S extension is implemented - Show U-mode only when U extension is implemented - Show VS/VU modes only when H extension is implemented --------- Co-authored-by: 7908837174 <[email protected]>
1 parent 9a9804f commit 99832a9

File tree

3 files changed

+148
-35
lines changed

3 files changed

+148
-35
lines changed

backends/cfg_html_doc/templates/inst.adoc.erb

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -42,21 +42,55 @@ RV64::
4242
<%= inst.description %>
4343

4444
== Access
45-
<%- if cfg_arch.ext?(:H) -%>
46-
[cols="^,^,^,^,^"]
47-
<%- else -%>
48-
[cols="^,^,^"]
49-
<%- end -%>
45+
<%-
46+
# Determine which privilege modes to display based on implemented extensions
47+
modes = ["M"] # M-mode is always present
48+
mode_headers = ["M"]
49+
mode_values = ["[.access-always]#Always#"]
50+
51+
# Add S-mode if S extension is implemented
52+
if cfg_arch.ext?(:S)
53+
if cfg_arch.ext?(:H)
54+
modes << "HS"
55+
mode_headers << "HS"
56+
else
57+
modes << "S"
58+
mode_headers << "S"
59+
end
60+
mode_values << "[.access-#{inst.access['s']}]##{inst.access['s'].capitalize}#"
61+
end
62+
63+
# Add U-mode if U extension is implemented
64+
if cfg_arch.ext?(:U)
65+
modes << "U"
66+
mode_headers << "U"
67+
mode_values << "[.access-#{inst.access['u']}]##{inst.access['u'].capitalize}#"
68+
end
69+
70+
# Add virtual modes if H extension is implemented
71+
if cfg_arch.ext?(:H)
72+
# Always add VS mode when H extension is present
73+
modes << "VS"
74+
mode_headers << "VS"
75+
mode_values << "[.access-#{inst.access['vs']}]##{inst.access['vs'].capitalize}#"
76+
77+
# Only add VU mode if both H and U extensions are present
78+
if cfg_arch.ext?(:U)
79+
modes << "VU"
80+
mode_headers << "VU"
81+
mode_values << "[.access-#{inst.access['vu']}]##{inst.access['vu'].capitalize}#"
82+
end
83+
end
84+
85+
# Generate column specification
86+
col_spec = "^," * modes.size
87+
col_spec = col_spec.chomp(",")
88+
-%>
89+
[cols="<%= col_spec %>"]
5090
|===
51-
| M | <%- if cfg_arch.ext?(:H) -%>HS<%- else -%>S<%- end -%> | U <%- if cfg_arch.ext?(:H) -%> | VS | VU <%- end -%>
52-
53-
| [.access-always]#Always#
54-
| [.access-<%=inst.access['s']%>]#<%= inst.access['s'].capitalize %>#
55-
| [.access-<%=inst.access['u']%>]#<%= inst.access['u'].capitalize %>#
56-
<% if cfg_arch.ext?(:H) %>
57-
| [.access-<%=inst.access['vs']%>]#<%= inst.access['vs'].capitalize %>#
58-
| [.access-<%=inst.access['vu']%>]#<%= inst.access['vu'].capitalize %>#
59-
<% end %>
91+
| <%= mode_headers.join(" | ") %>
92+
93+
| <%= mode_values.join("\n| ") %>
6094
|===
6195

6296
<%- if inst.access_detail? -%>

backends/manual/templates/instruction.adoc.erb

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -116,15 +116,55 @@ RV64::
116116
<%= inst.fix_entities(inst.defined_by_condition.to_asciidoc) %>
117117

118118
== Access
119-
[cols="^,^,^,^,^"]
119+
<%-
120+
# Determine which privilege modes to display based on implemented extensions
121+
modes = ["M"] # M-mode is always present
122+
mode_headers = ["M"]
123+
mode_values = ["[.access-always]#Always#"]
124+
125+
# Add S-mode if S extension is implemented
126+
if cfg_arch.ext?(:S)
127+
if cfg_arch.ext?(:H)
128+
modes << "HS"
129+
mode_headers << "HS"
130+
else
131+
modes << "S"
132+
mode_headers << "S"
133+
end
134+
mode_values << "[.access-#{inst.access['s']}]##{inst.access['s'].capitalize}#"
135+
end
136+
137+
# Add U-mode if U extension is implemented
138+
if cfg_arch.ext?(:U)
139+
modes << "U"
140+
mode_headers << "U"
141+
mode_values << "[.access-#{inst.access['u']}]##{inst.access['u'].capitalize}#"
142+
end
143+
144+
# Add virtual modes if H extension is implemented
145+
if cfg_arch.ext?(:H)
146+
# Always add VS mode when H extension is present
147+
modes << "VS"
148+
mode_headers << "VS"
149+
mode_values << "[.access-#{inst.access['vs']}]##{inst.access['vs'].capitalize}#"
150+
151+
# Only add VU mode if both H and U extensions are present
152+
if cfg_arch.ext?(:U)
153+
modes << "VU"
154+
mode_headers << "VU"
155+
mode_values << "[.access-#{inst.access['vu']}]##{inst.access['vu'].capitalize}#"
156+
end
157+
end
158+
159+
# Generate column specification
160+
col_spec = "^," * modes.size
161+
col_spec = col_spec.chomp(",")
162+
-%>
163+
[cols="<%= col_spec %>"]
120164
|===
121-
| M | HS | U | VS | VU
165+
| <%= mode_headers.join(" | ") %>
122166

123-
| [.access-always]#Always#
124-
| [.access-<%=inst.access['s']%>]#<%= inst.access['s'].capitalize %>#
125-
| [.access-<%=inst.access['u']%>]#<%= inst.access['u'].capitalize %>#
126-
| [.access-<%=inst.access['vs']%>]#<%= inst.access['vs'].capitalize %>#
127-
| [.access-<%=inst.access['vu']%>]#<%= inst.access['vu'].capitalize %>#
167+
| <%= mode_values.join("\n| ") %>
128168
|===
129169

130170
<%- if inst.access_detail? -%>

backends/portfolio/templates/inst_appendix.adoc.erb

Lines changed: 53 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -47,21 +47,60 @@ RV64::
4747
<%= inst.description %>
4848

4949
==== Access
50-
<% if portfolio_design.in_scope_extensions.any? { |e| e.name == "H" } -%>
51-
[cols="^,^,^,^,^"]
52-
<% else -%>
53-
[cols="^,^,^"]
54-
<% end -%>
50+
<%-
51+
# Determine which privilege modes to display based on in-scope extensions
52+
modes = ["M"] # M-mode is always present
53+
mode_headers = ["M"]
54+
mode_values = ["[.access-always]#Always#"]
55+
56+
# Check for S extension
57+
has_s_ext = portfolio_design.in_scope_extensions.any? { |e| e.name == "S" }
58+
has_h_ext = portfolio_design.in_scope_extensions.any? { |e| e.name == "H" }
59+
has_u_ext = portfolio_design.in_scope_extensions.any? { |e| e.name == "U" }
60+
61+
# Add S-mode if S extension is in scope
62+
if has_s_ext
63+
if has_h_ext
64+
modes << "HS"
65+
mode_headers << "HS"
66+
else
67+
modes << "S"
68+
mode_headers << "S"
69+
end
70+
mode_values << "[.access-#{inst.access['s']}]##{inst.access['s'].capitalize}#"
71+
end
72+
73+
# Add U-mode if U extension is in scope
74+
if has_u_ext
75+
modes << "U"
76+
mode_headers << "U"
77+
mode_values << "[.access-#{inst.access['u']}]##{inst.access['u'].capitalize}#"
78+
end
79+
80+
# Add virtual modes if H extension is in scope
81+
if has_h_ext
82+
# Always add VS mode when H extension is present
83+
modes << "VS"
84+
mode_headers << "VS"
85+
mode_values << "[.access-#{inst.access['vs']}]##{inst.access['vs'].capitalize}#"
86+
87+
# Only add VU mode if both H and U extensions are present
88+
if has_u_ext
89+
modes << "VU"
90+
mode_headers << "VU"
91+
mode_values << "[.access-#{inst.access['vu']}]##{inst.access['vu'].capitalize}#"
92+
end
93+
end
94+
95+
# Generate column specification
96+
col_spec = "^," * modes.size
97+
col_spec = col_spec.chomp(",")
98+
-%>
99+
[cols="<%= col_spec %>"]
55100
|===
56-
| M | <% if portfolio_design.in_scope_extensions.any? { |e| e.name == "H" } -%>HS<% else -%>S<% end -%> | U <% if portfolio_design.in_scope_extensions.any? { |e| e.name == "H" } -%> | VS | VU <% end -%>
57-
58-
| [.access-always]#Always#
59-
| [.access-<%=inst.access['s']%>]#<%= inst.access['s'].capitalize %>#
60-
| [.access-<%=inst.access['u']%>]#<%= inst.access['u'].capitalize %>#
61-
<% if portfolio_design.in_scope_extensions.any? { |e| e.name == "H" } %>
62-
| [.access-<%=inst.access['vs']%>]#<%= inst.access['vs'].capitalize %>#
63-
| [.access-<%=inst.access['vu']%>]#<%= inst.access['vu'].capitalize %>#
64-
<% end %>
101+
| <%= mode_headers.join(" | ") %>
102+
103+
| <%= mode_values.join("\n| ") %>
65104
|===
66105

67106
<% if inst.access_detail? -%>

0 commit comments

Comments
 (0)