Skip to content

Commit 76fdecd

Browse files
committed
Move bank instrumentation to bank.{read/write}
1 parent 861f518 commit 76fdecd

File tree

1 file changed

+146
-140
lines changed

1 file changed

+146
-140
lines changed

lib/1.4/dml-builtins.dml

Lines changed: 146 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,8 @@ template device {
568568
// this carried semantics in DML 1.2; deprecated in 1.4
569569
param _confidentiality = undefined;
570570

571+
session conf_object_t *_current_initiator;
572+
571573
method _init() { _rec_init(); }
572574
method _post_init() { _rec_post_init(); }
573575
method init() default {}
@@ -2007,52 +2009,78 @@ template bank is (object, shown_desc) {
20072009
return 0;
20082010
}
20092011

2010-
local register hits[8];
2011-
local int num_hits;
2012-
local uint64 unmapped_bytes;
2012+
local uint64 readval = 0;
2013+
local bool ok = true;
20132014

20142015
local uint64 size = _enabled_bytes_to_size(enabled_bytes);
2015-
(num_hits, unmapped_bytes) = this._dispatch(offset, size, hits, false);
2016+
local bool inquiry_override = false;
2017+
_callback_before_read(this._bank_obj(), dev._current_initiator,
2018+
&inquiry_override, &offset,
2019+
size, &_connections, &_before_read_callbacks);
2020+
if (inquiry_override) {
2021+
try {
2022+
readval = this.get(offset, size);
2023+
} catch {
2024+
ok = false;
2025+
}
2026+
} else {
2027+
try {
2028+
local register hits[8];
2029+
local int num_hits;
2030+
local uint64 unmapped_bytes;
20162031

2017-
local uint64 readval = 0;
2018-
if ((unmapped_bytes & enabled_bytes) != 0) {
2019-
readval[size * 8 - 1 : 0] = this.unmapped_read(
2020-
offset, unmapped_bytes & enabled_bytes, aux);
2021-
}
2032+
(num_hits, unmapped_bytes) = this._dispatch(
2033+
offset, size, hits, false);
20222034

2023-
for (local int r = 0; r < num_hits; ++r) {
2024-
local int r_start;
2025-
local int r_end;
2026-
(r_start, r_end) = this._intersect(
2027-
hits[r].offset, hits[r]._size(), offset, size, true);
2035+
if ((unmapped_bytes & enabled_bytes) != 0) {
2036+
readval[size * 8 - 1 : 0] = this.unmapped_read(
2037+
offset, unmapped_bytes & enabled_bytes, aux);
2038+
}
20282039

2029-
local int start;
2030-
local int end;
2031-
(start, end) = this._intersect(
2032-
offset, size, hits[r].offset, hits[r]._size(), true);
2040+
for (local int r = 0; r < num_hits; ++r) {
2041+
local int r_start;
2042+
local int r_end;
2043+
(r_start, r_end) = this._intersect(
2044+
hits[r].offset, hits[r]._size(), offset, size, true);
2045+
2046+
local int start;
2047+
local int end;
2048+
(start, end) = this._intersect(
2049+
offset, size, hits[r].offset, hits[r]._size(), true);
2050+
2051+
local uint64 r_enabled_bytes = 0;
2052+
r_enabled_bytes[r_end * 8 - 1 : r_start * 8] =
2053+
enabled_bytes[end * 8 - 1 : start * 8];
2054+
if (r_enabled_bytes == 0) {
2055+
continue;
2056+
}
20332057

2034-
local uint64 r_enabled_bytes = 0;
2035-
r_enabled_bytes[r_end * 8 - 1 : r_start * 8] =
2036-
enabled_bytes[end * 8 - 1 : start * 8];
2037-
if (r_enabled_bytes == 0) {
2038-
continue;
2039-
}
2058+
local uint64 r_val = hits[r].read_register(r_enabled_bytes, aux);
2059+
if (r_end - r_start == hits[r]._size()) {
2060+
log info, 4, Register_Read:
2061+
"Read from register %s -> 0x%0*x",
2062+
hits[r]._qname(), cast(size*2, int), r_val;
2063+
} else {
2064+
log info, 4, Register_Read:
2065+
"Partial read from register %s: bytes %d-%d -> 0x%0*x",
2066+
hits[r]._qname(), r_start, r_end-1,
2067+
cast(r_end - r_start, int),
2068+
r_val[r_end * 8 - 1 : r_start * 8];
2069+
}
20402070

2041-
local uint64 r_val = hits[r].read_register(r_enabled_bytes, aux);
2042-
if (r_end - r_start == hits[r]._size()) {
2043-
log info, 4, Register_Read:
2044-
"Read from register %s -> 0x%0*x",
2045-
hits[r]._qname(), cast(size*2, int), r_val;
2046-
} else {
2047-
log info, 4, Register_Read:
2048-
"Partial read from register %s: bytes %d-%d -> 0x%0*x",
2049-
hits[r]._qname(), r_start, r_end-1,
2050-
cast(r_end - r_start, int),
2051-
r_val[r_end * 8 - 1 : r_start * 8];
2071+
readval[end * 8 - 1 : start * 8] =
2072+
(r_val & r_enabled_bytes)[r_end * 8 - 1 : r_start * 8];
2073+
}
2074+
} catch {
2075+
ok = false;
20522076
}
2053-
2054-
readval[end * 8 - 1 : start * 8] =
2055-
(r_val & r_enabled_bytes)[r_end * 8 - 1 : r_start * 8];
2077+
}
2078+
_callback_after_read(this._bank_obj(), dev._current_initiator,
2079+
&offset, size,
2080+
&readval, &ok, &_connections,
2081+
&_after_read_callbacks);
2082+
if (!ok) {
2083+
throw;
20562084
}
20572085

20582086
return readval;
@@ -2100,52 +2128,72 @@ template bank is (object, shown_desc) {
21002128
return;
21012129
}
21022130

2103-
local register hits[8];
2104-
local int num_hits;
2105-
local uint64 unmapped_bytes;
2106-
2131+
local bool suppress = false;
21072132
local uint64 size = _enabled_bytes_to_size(enabled_bytes);
2108-
(num_hits, unmapped_bytes) = this._dispatch(offset, size, hits, false);
2109-
if ((unmapped_bytes & enabled_bytes) != 0) {
2110-
this.unmapped_write(
2111-
offset, value, unmapped_bytes & enabled_bytes, aux);
2112-
}
2113-
2114-
for (local int r = 0; r < num_hits; ++r) {
2115-
local int r_start;
2116-
local int r_end;
2117-
(r_start, r_end) = this._intersect(
2118-
hits[r].offset, hits[r]._size(), offset, size, true);
2133+
_callback_before_write(
2134+
this._bank_obj(), dev._current_initiator, &offset, size,
2135+
&value,
2136+
&suppress, &_connections, &_before_write_callbacks);
2137+
local bool ok = true;
2138+
if (!suppress) {
2139+
try {
2140+
local register hits[8];
2141+
local int num_hits;
2142+
local uint64 unmapped_bytes;
2143+
2144+
(num_hits, unmapped_bytes) = this._dispatch(
2145+
offset, size, hits, false);
2146+
if ((unmapped_bytes & enabled_bytes) != 0) {
2147+
this.unmapped_write(
2148+
offset, value, unmapped_bytes & enabled_bytes, aux);
2149+
}
21192150

2120-
local int start;
2121-
local int end;
2122-
(start, end) = this._intersect(
2123-
offset, size, hits[r].offset, hits[r]._size(), true);
2151+
for (local int r = 0; r < num_hits; ++r) {
2152+
local int r_start;
2153+
local int r_end;
2154+
(r_start, r_end) = this._intersect(
2155+
hits[r].offset, hits[r]._size(), offset, size, true);
2156+
2157+
local int start;
2158+
local int end;
2159+
(start, end) = this._intersect(
2160+
offset, size, hits[r].offset, hits[r]._size(), true);
2161+
2162+
local uint64 r_enabled_bytes = 0;
2163+
r_enabled_bytes[r_end * 8 - 1 : r_start * 8] =
2164+
enabled_bytes[end * 8 - 1 : start * 8];
2165+
if (r_enabled_bytes == 0) {
2166+
continue;
2167+
}
21242168

2125-
local uint64 r_enabled_bytes = 0;
2126-
r_enabled_bytes[r_end * 8 - 1 : r_start * 8] =
2127-
enabled_bytes[end * 8 - 1 : start * 8];
2128-
if (r_enabled_bytes == 0) {
2129-
continue;
2130-
}
2169+
local uint64 r_value = 0;
2170+
r_value[r_end * 8 - 1 : r_start * 8]
2171+
= value[end * 8 - 1 : start * 8];
2172+
if (r_end - r_start == hits[r]._size()) {
2173+
log info, 4, Register_Write:
2174+
"Write to register %s <- 0x%0*x",
2175+
hits[r]._qname(), cast(size*2, int), r_value;
2176+
} else {
2177+
log info, 4, Register_Write:
2178+
"Partial write to register %s: bytes %d-%d <- 0x%0*x",
2179+
hits[r]._qname(), r_start, r_end-1,
2180+
cast(r_end - r_start, int),
2181+
r_value[r_end * 8 - 1 : r_start * 8];
2182+
}
21312183

2132-
local uint64 r_value = 0;
2133-
r_value[r_end * 8 - 1 : r_start * 8]
2134-
= value[end * 8 - 1 : start * 8];
2135-
if (r_end - r_start == hits[r]._size()) {
2136-
log info, 4, Register_Write:
2137-
"Write to register %s <- 0x%0*x",
2138-
hits[r]._qname(), cast(size*2, int), r_value;
2139-
} else {
2140-
log info, 4, Register_Write:
2141-
"Partial write to register %s: bytes %d-%d <- 0x%0*x",
2142-
hits[r]._qname(), r_start, r_end-1,
2143-
cast(r_end - r_start, int),
2144-
r_value[r_end * 8 - 1 : r_start * 8];
2184+
hits[r].write_register(
2185+
r_value & r_enabled_bytes, r_enabled_bytes, aux);
2186+
}
2187+
} catch {
2188+
ok = false;
21452189
}
2190+
}
2191+
_callback_after_write(
2192+
this._bank_obj(), dev._current_initiator, &offset, size,
2193+
&ok, &_connections, &_after_write_callbacks);
21462194

2147-
hits[r].write_register(r_value & r_enabled_bytes, r_enabled_bytes,
2148-
aux);
2195+
if (!ok) {
2196+
throw;
21492197
}
21502198
}
21512199

@@ -2240,7 +2288,8 @@ template bank is (object, shown_desc) {
22402288
default {
22412289
local uint64 size = SIM_get_mem_op_size(memop);
22422290
local bool inquiry = SIM_get_mem_op_inquiry(memop);
2243-
local conf_object_t *ini = SIM_get_mem_op_initiator(memop);
2291+
local conf_object_t *prev_initiator = dev._current_initiator;
2292+
dev._current_initiator = SIM_get_mem_op_initiator(memop);
22442293

22452294
local bool success = true;
22462295
if (inquiry) {
@@ -2262,53 +2311,33 @@ template bank is (object, shown_desc) {
22622311
} else {
22632312
if (SIM_mem_op_is_read(memop)) {
22642313
local uint64 value = 0;
2265-
local bool inquiry_override = false;
2266-
_callback_before_read(
2267-
this._bank_obj(), ini, &inquiry_override,
2268-
&offset, size, &_connections, &_before_read_callbacks);
22692314
try {
2270-
if (inquiry_override) {
2271-
value = this.get(offset, size);
2272-
} else {
2273-
value = this.read(offset, _mask(size), aux);
2274-
}
2315+
value = this.read(offset, _mask(size), aux);
22752316
} catch {
22762317
success = false;
22772318
}
2278-
_callback_after_read(this._bank_obj(), ini, &offset, size,
2279-
&value, &success, &_connections,
2280-
&_after_read_callbacks);
22812319

22822320
if (success) {
22832321
this._memop_set_read_value(memop, value);
22842322
}
22852323
} else {
22862324
local uint64 writevalue = this._memop_write_value(memop);
2287-
2288-
local bool suppress = false;
2289-
_callback_before_write(
2290-
this._bank_obj(), ini, &offset, size, &writevalue,
2291-
&suppress, &_connections, &_before_write_callbacks);
2292-
if (!suppress) {
2293-
try {
2294-
this.write(offset, writevalue, _mask(size), aux);
2295-
} catch {
2296-
success = false;
2297-
}
2325+
try {
2326+
this.write(offset, writevalue, _mask(size), aux);
2327+
} catch {
2328+
success = false;
22982329
}
2299-
_callback_after_write(this._bank_obj(), ini, &offset, size,
2300-
&success, &_connections,
2301-
&_after_write_callbacks);
23022330
}
23032331
}
23042332

2333+
dev._current_initiator = prev_initiator;
23052334
return success;
23062335
}
23072336

23082337
shared method transaction_access(transaction_t *t, uint64 offset,
23092338
void *aux) -> (exception_type_t) default {
23102339
local uint64 size = SIM_transaction_size(t);
2311-
local conf_object_t *ini = SIM_transaction_initiator(t);
2340+
local conf_object_t *ini = dev._current_initiator;
23122341
local uint8 buf[size];
23132342
if (SIM_transaction_is_write(t)) {
23142343
local buffer_t bytes;
@@ -2346,7 +2375,8 @@ template bank is (object, shown_desc) {
23462375
shared method _transaction_access(
23472376
conf_object_t *ini, bool is_read, bool inquiry,
23482377
uint64 offset, uint64 size, uint8 *buf, void *aux) -> (bool) {
2349-
2378+
local conf_object_t *prev_ini = dev._current_initiator;
2379+
dev._current_initiator = ini;
23502380
local bool success = true;
23512381
if (inquiry) {
23522382
if (is_read) {
@@ -2366,47 +2396,23 @@ template bank is (object, shown_desc) {
23662396
}
23672397
} else {
23682398
if (is_read) {
2369-
local bool inquiry_override = false;
2370-
_callback_before_read(this._bank_obj(), ini,
2371-
&inquiry_override, &offset,
2372-
size, &_connections, &_before_read_callbacks);
2373-
local uint64 value = 0;
23742399
try {
2375-
if (inquiry_override) {
2376-
value = this.get(offset, size);
2377-
} else {
2378-
value = this.read(offset, _mask(size), aux);
2379-
}
2380-
} catch {
2381-
success = false;
2382-
}
2383-
2384-
_callback_after_read(this._bank_obj(), ini, &offset, size,
2385-
&value, &success, &_connections,
2386-
&_after_read_callbacks);
2387-
2388-
if (success) {
2400+
local uint64 value = this.read(offset, _mask(size), aux);
23892401
this._set_read_value(size, buf, value);
2402+
return true;
2403+
} catch {
2404+
return false;
23902405
}
23912406
} else {
23922407
local uint64 writevalue = this._write_value(size, buf);
2393-
2394-
local bool suppress = false;
2395-
_callback_before_write(
2396-
this._bank_obj(), ini, &offset, size, &writevalue,
2397-
&suppress, &_connections, &_before_write_callbacks);
2398-
if (!suppress) {
2399-
try {
2400-
this.write(offset, writevalue, _mask(size), aux);
2401-
} catch {
2402-
success = false;
2403-
}
2408+
try {
2409+
this.write(offset, writevalue, _mask(size), aux);
2410+
} catch {
2411+
success = false;
24042412
}
2405-
_callback_after_write(this._bank_obj(), ini, &offset, size,
2406-
&success, &_connections,
2407-
&_after_write_callbacks);
24082413
}
24092414
}
2415+
dev._current_initiator = prev_ini;
24102416

24112417
return success;
24122418
}

0 commit comments

Comments
 (0)