Skip to content

Commit b0aba9e

Browse files
dhower-qchenrikg-qc
authored andcommitted
feat: support CSR[name].reset_value() in IDL
1 parent c36d038 commit b0aba9e

File tree

4 files changed

+27
-2
lines changed

4 files changed

+27
-2
lines changed

backends/cpp_hart_gen/lib/gen_cpp.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,8 @@ def gen_cpp(symtab, indent = 2, indent_spaces: 2)
270270
if csr_obj.nil?
271271
if function_name == "sw_read"
272272
"#{' ' * indent}__UDB_CSR_BY_ADDR(#{csr.idx_expr.gen_cpp(symtab, 0, indent_spaces:)}).#{function_name}(__UDB_XLEN)"
273+
elsif function_name == "reset_value"
274+
"#{' ' * indent}__UDB_CSR_BY_ADDR(#{csr.idx_expr.gen_cpp(symtab, 0, indent_spaces:)})._#{function_name}()"
273275
else
274276
"#{' ' * indent}__UDB_CSR_BY_ADDR(#{csr.idx_expr.gen_cpp(symtab, 0, indent_spaces:)}).#{function_name.gsub('?', '_Q_')}(#{args_cpp.join(', ')})"
275277
end
@@ -280,6 +282,8 @@ def gen_cpp(symtab, indent = 2, indent_spaces: 2)
280282
else
281283
"#{' ' * indent}__UDB_CSR_BY_NAME(#{csr_obj.name})._#{function_name}()"
282284
end
285+
elsif function_name == "reset_value"
286+
"#{' ' * indent}__UDB_CSR_BY_NAME(#{csr_obj.name})._#{function_name}()"
283287
else
284288
"#{' ' * indent}__UDB_CSR_BY_NAME(#{csr_obj.name}).#{function_name.gsub('?', '_Q_')}(#{args_cpp.join(', ')})"
285289
end

backends/cpp_hart_gen/templates/csrs.hxx.erb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,17 @@ namespace udb {
213213
const std::string name() const override { return "<%= csr.name %>"; }
214214
PrivilegeMode mode() const override { return PrivilegeMode::<%= csr.priv_mode %>; }
215215
bool writable() const override { return <%= csr.writable %>; }
216+
ValueType _reset_value() const {
217+
if (defined()) {
218+
return 0_b
219+
<%- fields_for_xlen.each do |field| -%>
220+
| (m_<%= field.name %>.reset_value() << _Bits<64, false>(m_<%= field.name %>.location().lsb))
221+
<%- end -%>
222+
;
223+
} else {
224+
"x"_xb;
225+
}
226+
}
216227

217228
bool defined() override {
218229
return <%= csr.defined_by_condition.to_cxx { |ext_name, ext_req|

spec/std/isa/csr/sstatus.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ fields:
2828
Alias of `mstatus.SD`.
2929
3030
type: RO-H
31-
reset_value: UNDEFINED_LEGAL
31+
reset_value(): return CSR[mstatus].reset_value();
3232
affectedBy: [F, D, V]
3333
UXL:
3434
location: 33-32

tools/ruby-gems/idlc/lib/idlc/ast.rb

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7450,6 +7450,8 @@ def type_check(symtab)
74507450
elsif ["implemented_without?"].include?(function_name)
74517451
type_error "Expecting one argument" unless args.size == 1
74527452
type_error "Expecting an ExtensionName" unless args[0].type(symtab).kind == :enum_ref && args[0].class_name == "ExtensionName"
7453+
elsif function_name == "reset_value"
7454+
type_error "unexpected argument(s)" unless args.empty?
74537455
else
74547456
type_error "'#{function_name}' is not a supported CSR function call"
74557457
end
@@ -7458,7 +7460,7 @@ def type_check(symtab)
74587460
def type(symtab)
74597461

74607462
case function_name
7461-
when "sw_read"
7463+
when "sw_read", "reset_value"
74627464
if csr_known?(symtab)
74637465
l = symtab.csr(csr.csr_name).length
74647466
Type.new(:bits, width: (l.nil? ? :unknown : l))
@@ -7506,6 +7508,14 @@ def value(symtab)
75067508
ext_name = extension_name_enum_type.element_names[idx]
75077509

75087510
cd.implemented_without?(ext_name)
7511+
when "reset_value"
7512+
value_error "CSR not knowable" unless csr_known?(symtab)
7513+
cd = csr_def(symtab)
7514+
v = cd.reset_value
7515+
if v == "UNDEFINED_LEGAL"
7516+
value_error "undefined reset value"
7517+
end
7518+
v
75097519
else
75107520
internal_error "TODO: #{function_name}"
75117521
end

0 commit comments

Comments
 (0)