@@ -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