Skip to content

Commit 90cdf54

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

File tree

1 file changed

+142
-140
lines changed

1 file changed

+142
-140
lines changed

lib/1.4/dml-builtins.dml

+142-140
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,74 @@ 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+
readval = this.get(offset, size);
2022+
} else {
2023+
try {
2024+
local register hits[8];
2025+
local int num_hits;
2026+
local uint64 unmapped_bytes;
20162027

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-
}
2028+
(num_hits, unmapped_bytes) = this._dispatch(
2029+
offset, size, hits, false);
20222030

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);
2031+
if ((unmapped_bytes & enabled_bytes) != 0) {
2032+
readval[size * 8 - 1 : 0] = this.unmapped_read(
2033+
offset, unmapped_bytes & enabled_bytes, aux);
2034+
}
20282035

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

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-
}
2054+
local uint64 r_val = hits[r].read_register(r_enabled_bytes, aux);
2055+
if (r_end - r_start == hits[r]._size()) {
2056+
log info, 4, Register_Read:
2057+
"Read from register %s -> 0x%0*x",
2058+
hits[r]._qname(), cast(size*2, int), r_val;
2059+
} else {
2060+
log info, 4, Register_Read:
2061+
"Partial read from register %s: bytes %d-%d -> 0x%0*x",
2062+
hits[r]._qname(), r_start, r_end-1,
2063+
cast(r_end - r_start, int),
2064+
r_val[r_end * 8 - 1 : r_start * 8];
2065+
}
20402066

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];
2067+
readval[end * 8 - 1 : start * 8] =
2068+
(r_val & r_enabled_bytes)[r_end * 8 - 1 : r_start * 8];
2069+
}
2070+
} catch {
2071+
ok = false;
20522072
}
2053-
2054-
readval[end * 8 - 1 : start * 8] =
2055-
(r_val & r_enabled_bytes)[r_end * 8 - 1 : r_start * 8];
2073+
}
2074+
_callback_after_read(this._bank_obj(), dev._current_initiator,
2075+
&offset, size,
2076+
&readval, &ok, &_connections,
2077+
&_after_read_callbacks);
2078+
if (!ok) {
2079+
throw;
20562080
}
20572081

20582082
return readval;
@@ -2100,52 +2124,72 @@ template bank is (object, shown_desc) {
21002124
return;
21012125
}
21022126

2103-
local register hits[8];
2104-
local int num_hits;
2105-
local uint64 unmapped_bytes;
2106-
2127+
local bool suppress = false;
21072128
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);
2129+
_callback_before_write(
2130+
this._bank_obj(), dev._current_initiator, &offset, size,
2131+
&value,
2132+
&suppress, &_connections, &_before_write_callbacks);
2133+
local bool ok = true;
2134+
if (!suppress) {
2135+
try {
2136+
local register hits[8];
2137+
local int num_hits;
2138+
local uint64 unmapped_bytes;
2139+
2140+
(num_hits, unmapped_bytes) = this._dispatch(
2141+
offset, size, hits, false);
2142+
if ((unmapped_bytes & enabled_bytes) != 0) {
2143+
this.unmapped_write(
2144+
offset, value, unmapped_bytes & enabled_bytes, aux);
2145+
}
21192146

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

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-
}
2165+
local uint64 r_value = 0;
2166+
r_value[r_end * 8 - 1 : r_start * 8]
2167+
= value[end * 8 - 1 : start * 8];
2168+
if (r_end - r_start == hits[r]._size()) {
2169+
log info, 4, Register_Write:
2170+
"Write to register %s <- 0x%0*x",
2171+
hits[r]._qname(), cast(size*2, int), r_value;
2172+
} else {
2173+
log info, 4, Register_Write:
2174+
"Partial write to register %s: bytes %d-%d <- 0x%0*x",
2175+
hits[r]._qname(), r_start, r_end-1,
2176+
cast(r_end - r_start, int),
2177+
r_value[r_end * 8 - 1 : r_start * 8];
2178+
}
21312179

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];
2180+
hits[r].write_register(
2181+
r_value & r_enabled_bytes, r_enabled_bytes, aux);
2182+
}
2183+
} catch {
2184+
ok = false;
21452185
}
2186+
}
2187+
_callback_after_write(
2188+
this._bank_obj(), dev._current_initiator, &offset, size,
2189+
&ok, &_connections, &_after_write_callbacks);
21462190

2147-
hits[r].write_register(r_value & r_enabled_bytes, r_enabled_bytes,
2148-
aux);
2191+
if (!ok) {
2192+
throw;
21492193
}
21502194
}
21512195

@@ -2240,7 +2284,8 @@ template bank is (object, shown_desc) {
22402284
default {
22412285
local uint64 size = SIM_get_mem_op_size(memop);
22422286
local bool inquiry = SIM_get_mem_op_inquiry(memop);
2243-
local conf_object_t *ini = SIM_get_mem_op_initiator(memop);
2287+
local conf_object_t *prev_initiator = dev._current_initiator;
2288+
dev._current_initiator = SIM_get_mem_op_initiator(memop);
22442289

22452290
local bool success = true;
22462291
if (inquiry) {
@@ -2262,53 +2307,33 @@ template bank is (object, shown_desc) {
22622307
} else {
22632308
if (SIM_mem_op_is_read(memop)) {
22642309
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);
22692310
try {
2270-
if (inquiry_override) {
2271-
value = this.get(offset, size);
2272-
} else {
2273-
value = this.read(offset, _mask(size), aux);
2274-
}
2311+
value = this.read(offset, _mask(size), aux);
22752312
} catch {
22762313
success = false;
22772314
}
2278-
_callback_after_read(this._bank_obj(), ini, &offset, size,
2279-
&value, &success, &_connections,
2280-
&_after_read_callbacks);
22812315

22822316
if (success) {
22832317
this._memop_set_read_value(memop, value);
22842318
}
22852319
} else {
22862320
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-
}
2321+
try {
2322+
this.write(offset, writevalue, _mask(size), aux);
2323+
} catch {
2324+
success = false;
22982325
}
2299-
_callback_after_write(this._bank_obj(), ini, &offset, size,
2300-
&success, &_connections,
2301-
&_after_write_callbacks);
23022326
}
23032327
}
23042328

2329+
dev._current_initiator = prev_initiator;
23052330
return success;
23062331
}
23072332

23082333
shared method transaction_access(transaction_t *t, uint64 offset,
23092334
void *aux) -> (exception_type_t) default {
23102335
local uint64 size = SIM_transaction_size(t);
2311-
local conf_object_t *ini = SIM_transaction_initiator(t);
2336+
local conf_object_t *ini = dev._current_initiator;
23122337
local uint8 buf[size];
23132338
if (SIM_transaction_is_write(t)) {
23142339
local buffer_t bytes;
@@ -2346,7 +2371,8 @@ template bank is (object, shown_desc) {
23462371
shared method _transaction_access(
23472372
conf_object_t *ini, bool is_read, bool inquiry,
23482373
uint64 offset, uint64 size, uint8 *buf, void *aux) -> (bool) {
2349-
2374+
local conf_object_t *prev_ini = dev._current_initiator;
2375+
dev._current_initiator = ini;
23502376
local bool success = true;
23512377
if (inquiry) {
23522378
if (is_read) {
@@ -2366,47 +2392,23 @@ template bank is (object, shown_desc) {
23662392
}
23672393
} else {
23682394
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;
23742395
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) {
2396+
local uint64 value = this.read(offset, _mask(size), aux);
23892397
this._set_read_value(size, buf, value);
2398+
return true;
2399+
} catch {
2400+
return false;
23902401
}
23912402
} else {
23922403
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-
}
2404+
try {
2405+
this.write(offset, writevalue, _mask(size), aux);
2406+
} catch {
2407+
success = false;
24042408
}
2405-
_callback_after_write(this._bank_obj(), ini, &offset, size,
2406-
&success, &_connections,
2407-
&_after_write_callbacks);
24082409
}
24092410
}
2411+
dev._current_initiator = prev_ini;
24102412

24112413
return success;
24122414
}

0 commit comments

Comments
 (0)