Skip to content

Commit 3b8dcfa

Browse files
committed
Implement register_view_catalog
1 parent 663c7da commit 3b8dcfa

File tree

5 files changed

+68
-4
lines changed

5 files changed

+68
-4
lines changed

RELEASENOTES.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,3 +192,7 @@
192192
(equivalent to `ATOM_list_end(0)`) (fixes SIMICS-22363).
193193
- `release 6 6336`
194194
- `release 7 7045`
195+
- `note 6` Added the new `register_view_catalog` interface to all banks. This speeds up
196+
various operations that rely on the `register_view` interface, such as the
197+
`dev_util.bank_regs` function and the `write-device-reg` and `probe-address`
198+
CLI commands.

doc/1.4/language.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,8 +338,8 @@ A *register bank* (or simply *bank*) is an abstraction that is used to
338338
group *registers* in DML, and to expose these to the outside
339339
world. Registers are exposed to the rest of the simulated system
340340
through the Simics interface `io_memory`, and exposed to scripting and
341-
user interfaces through the `register_view`, `register_view_read_only`
342-
and `bank_instrumentation_subscribe` Simics interfaces.
341+
user interfaces through the `register_view`, `register_view_read_only`,
342+
`register_view_catalog` and `bank_instrumentation_subscribe` Simics interfaces.
343343

344344
It is possible to define *bank arrays* to model a row of similar banks. Each
345345
element in the bank array is a separate configuration object in Simics, and can

lib/1.2/dml-builtins.dml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,6 +1112,36 @@ template bank {
11121112
SIM_attr_free(&args);
11131113
}
11141114
}
1115+
implement register_view_catalog {
1116+
method register_names() -> (attr_value_t ret) {
1117+
local uint64 table_size;
1118+
call $register_view.number_of_registers() -> (table_size);
1119+
ret = SIM_alloc_attr_list(table_size);
1120+
local int i;
1121+
for (i = 0; i < table_size; i++) {
1122+
local attr_value_t full_info
1123+
= $register_view.register_info(i);
1124+
SIM_attr_list_set_item(
1125+
&ret, i,
1126+
SIM_attr_copy(SIM_attr_list_item(full_info, 0)));
1127+
SIM_attr_free(&full_info);
1128+
}
1129+
}
1130+
method register_offsets() -> (attr_value_t ret) {
1131+
local uint64 table_size;
1132+
call $register_view.number_of_registers() -> (table_size);
1133+
ret = SIM_alloc_attr_list(table_size);
1134+
local int i;
1135+
for (i = 0; i < table_size; i++) {
1136+
local attr_value_t full_info
1137+
= $register_view.register_info(i);
1138+
SIM_attr_list_set_item(
1139+
&ret, i,
1140+
SIM_attr_copy(SIM_attr_list_item(full_info, 3)));
1141+
SIM_attr_free(&full_info);
1142+
}
1143+
}
1144+
}
11151145
}
11161146
}
11171147

lib/1.4/dml-builtins.dml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2622,6 +2622,29 @@ template bank is (object, shown_desc) {
26222622
}
26232623
}
26242624

2625+
implement register_view_catalog {
2626+
method register_names() -> (attr_value_t) {
2627+
local (const register *table, uint64 table_size) = _reginfo_table();
2628+
local attr_value_t ret = SIM_alloc_attr_list(table_size);
2629+
local size_t bank_prefix_len = strlen(bank._qname()) + 1;
2630+
for (local int i = 0; i < table_size; i++) {
2631+
SIM_attr_list_set_item(
2632+
&ret, i, SIM_make_attr_string(
2633+
table[i]._qname() + bank_prefix_len));
2634+
}
2635+
return ret;
2636+
}
2637+
method register_offsets() -> (attr_value_t) {
2638+
local (const register *table, uint64 table_size) = _reginfo_table();
2639+
local attr_value_t ret = SIM_alloc_attr_list(table_size);
2640+
for (local int i = 0; i < table_size; i++) {
2641+
SIM_attr_list_set_item(
2642+
&ret, i, SIM_make_attr_uint64(table[i].offset));
2643+
}
2644+
return ret;
2645+
}
2646+
}
2647+
26252648
// TODO: we should implement int_register automatically; define a dummy
26262649
// parameter to reserve the name
26272650
param int_register = undefined;

test/common/test_register_view.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,10 @@ def test_register_value(bank, register):
4141
expect_equal(bank.get_register_value(0), 0x01020304)
4242

4343
def test_array_names(bg):
44+
regnames = [bg.iface.register_view.register_info(i)[0]
45+
for i in range(bg.iface.register_view.number_of_registers())]
4446
expect_equal(
45-
sorted([bg.register_info(i)[0] for i in range(0, bg.number_of_registers())]),
47+
sorted(regnames),
4648
['g[0].h.i[0].r',
4749
'g[0].h.i[0].rma[0][0]',
4850
'g[0].h.i[0].rma[0][1]',
@@ -71,6 +73,11 @@ def test_array_names(bg):
7173
'g[1].h.i[1].rma[1][1]',
7274
'g[1].h.i[1].ru[0]',
7375
'g[1].h.i[1].ru[2]'])
76+
expect_equal(bg.iface.register_view_catalog.register_names(), regnames)
77+
expect_equal(
78+
bg.iface.register_view_catalog.register_offsets(),
79+
[bg.iface.register_view.register_info(i)[3]
80+
for i in range(bg.iface.register_view.number_of_registers())])
7481

7582
def test(obj):
7683
test_description(obj.bank.b.iface.register_view, "Description for b")
@@ -90,7 +97,7 @@ def test(obj):
9097
test_register_info(obj.bank.baa[1][1].iface.register_view)
9198
test_register_info(obj.bank.u.iface.register_view)
9299

93-
test_array_names(obj.bank.bg.iface.register_view)
100+
test_array_names(obj.bank.bg)
94101

95102
test_register_value(obj.bank.le.iface.register_view,
96103
dev_util.Register_LE(obj.bank.le, 0x0, 4))

0 commit comments

Comments
 (0)