Skip to content

Commit a592233

Browse files
lwaern-intelmandolaerik
authored andcommitted
Permit custom implementations of register_view
1 parent 8618e07 commit a592233

File tree

1 file changed

+81
-73
lines changed

1 file changed

+81
-73
lines changed

lib/1.4/dml-builtins.dml

Lines changed: 81 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -2444,91 +2444,99 @@ template bank is (object, shown_desc) {
24442444
}
24452445
}
24462446

2447-
implement register_view {
2448-
method description() -> (const char *) {
2449-
// TODO: it would make sense to return NULL for no desc, but
2450-
// iface docs doesn't explicitly specify whether this is
2451-
// allowed.
2452-
return bank.shown_desc == NULL ? "" : bank.shown_desc;
2453-
}
2454-
method big_endian_bitorder() -> (bool) {
2455-
return bank.be_bitorder;
2456-
}
2457-
method number_of_registers() -> (uint32) {
2458-
return _num_registers();
2459-
}
2460-
method register_info(uint32 reg) -> (attr_value_t) {
2461-
local register r;
2462-
try {
2463-
r = bank._get_register(reg);
2464-
} catch {
2465-
return SIM_make_attr_nil();
2447+
// Warning: This parameter is meant for enabling some experiments with
2448+
// custom register_view implementations. It should not be used in
2449+
// production code.
2450+
param _provide_register_view default true;
2451+
#if (_provide_register_view) {
2452+
implement register_view {
2453+
method description() -> (const char *) {
2454+
// TODO: it would make sense to return NULL for no desc, but
2455+
// iface docs doesn't explicitly specify whether this is
2456+
// allowed.
2457+
return bank.shown_desc == NULL ? "" : bank.shown_desc;
24662458
}
2459+
method big_endian_bitorder() -> (bool) {
2460+
return bank.be_bitorder;
2461+
}
2462+
method number_of_registers() -> (uint32) {
2463+
return _num_registers();
2464+
}
2465+
method register_info(uint32 reg) -> (attr_value_t) {
2466+
local register r;
2467+
try {
2468+
r = bank._get_register(reg);
2469+
} catch {
2470+
return SIM_make_attr_nil();
2471+
}
24672472

2468-
local attr_value_t fields = SIM_alloc_attr_list(
2469-
r._num_fields());
2473+
local attr_value_t fields = SIM_alloc_attr_list(
2474+
r._num_fields());
2475+
2476+
local uint32 idx = 0;
2477+
foreach f in (r.fields) {
2478+
local attr_value_t elem = SIM_make_attr_list(
2479+
4,
2480+
SIM_make_attr_string(
2481+
f._qname() + strlen(r._qname()) + 1),
2482+
// TODO: NULL should give a nil value
2483+
SIM_make_attr_string(f.shown_desc == NULL ? ""
2484+
: f.shown_desc),
2485+
SIM_make_attr_uint64(f.lsb),
2486+
SIM_make_attr_uint64(f.lsb + f.bitsize - 1));
2487+
SIM_attr_list_set_item(&fields, idx, elem);
2488+
idx++;
2489+
}
24702490

2471-
local uint32 idx = 0;
2472-
foreach f in (r.fields) {
2473-
local attr_value_t elem = SIM_make_attr_list(
2474-
4,
2475-
SIM_make_attr_string(f._qname() + strlen(r._qname()) + 1),
2491+
local attr_value_t ret;
2492+
ret = SIM_make_attr_list(
2493+
6,
2494+
SIM_make_attr_string(
2495+
r._qname() + strlen(bank._qname()) + 1),
24762496
// TODO: NULL should give a nil value
2477-
SIM_make_attr_string(f.shown_desc == NULL ? ""
2478-
: f.shown_desc),
2479-
SIM_make_attr_uint64(f.lsb),
2480-
SIM_make_attr_uint64(f.lsb + f.bitsize - 1));
2481-
SIM_attr_list_set_item(&fields, idx, elem);
2482-
idx++;
2497+
SIM_make_attr_string(r.shown_desc == NULL ? ""
2498+
: r.shown_desc),
2499+
SIM_make_attr_uint64(r._size()),
2500+
SIM_make_attr_uint64(r.offset),
2501+
fields,
2502+
SIM_make_attr_boolean(
2503+
byte_order == "big-endian" #? true #: false));
2504+
2505+
return ret;
24832506
}
2507+
method get_register_value(uint32 reg) -> (uint64) {
2508+
local register r;
2509+
try {
2510+
r = bank._get_register(reg);
2511+
} catch {
2512+
return 0;
2513+
}
24842514

2485-
local attr_value_t ret;
2486-
ret = SIM_make_attr_list(
2487-
6,
2488-
SIM_make_attr_string(r._qname() + strlen(bank._qname()) + 1),
2489-
// TODO: NULL should give a nil value
2490-
SIM_make_attr_string(r.shown_desc == NULL ? ""
2491-
: r.shown_desc),
2492-
SIM_make_attr_uint64(r._size()),
2493-
SIM_make_attr_uint64(r.offset),
2494-
fields,
2495-
SIM_make_attr_boolean(
2496-
byte_order == "big-endian" #? true #: false));
2497-
2498-
return ret;
2499-
}
2500-
method get_register_value(uint32 reg) -> (uint64) {
2501-
local register r;
2502-
try {
2503-
r = bank._get_register(reg);
2504-
} catch {
2505-
return 0;
2515+
return r.get();
25062516
}
2517+
method set_register_value(uint32 reg, uint64 val) {
2518+
local register r;
2519+
try {
2520+
r = bank._get_register(reg);
2521+
} catch {
2522+
return;
2523+
}
25072524

2508-
return r.get();
2509-
}
2510-
method set_register_value(uint32 reg, uint64 val) {
2511-
local register r;
2512-
try {
2513-
r = bank._get_register(reg);
2514-
} catch {
2515-
return;
2525+
r.set(val);
25162526
}
2517-
2518-
r.set(val);
25192527
}
2520-
}
25212528

2522-
implement register_view_read_only {
2523-
method is_read_only(uint32 reg) -> (bool) {
2524-
local register r;
2525-
try {
2526-
r = bank._get_register(reg);
2527-
} catch {
2528-
return false;
2529-
}
2529+
implement register_view_read_only {
2530+
method is_read_only(uint32 reg) -> (bool) {
2531+
local register r;
2532+
try {
2533+
r = bank._get_register(reg);
2534+
} catch {
2535+
return false;
2536+
}
25302537

2531-
return r._is_read_only;
2538+
return r._is_read_only;
2539+
}
25322540
}
25332541
}
25342542

0 commit comments

Comments
 (0)