The complete ASL owner is shown directly below.
12readonly func NextMemoryCoherenceRank(address: Word,3 size_bytes: integer {1,2,4,8})4 => MemoryCoherenceRank5begin6 var next_rank: integer {1..PTO_MODEL_MEMORY_EVENTS} = 1;7 if _MemoryEventCount > 0 then8 for event_number = 0 to _MemoryEventCount - 1 do9 let event = _MemoryEvents[[event_number as MemoryEventIndex]];10 if MemoryEventIsWrite(event) && event.address == address &&11 event.size_bytes == size_bytes &&12 event.coherence_rank >= next_rank then13 next_rank = (event.coherence_rank + 1) as14 integer {1..PTO_MODEL_MEMORY_EVENTS};15 end;16 end;17 end;18 assert next_rank < PTO_MODEL_MEMORY_EVENTS;19 return next_rank as MemoryCoherenceRank;20end;21
22func ResolveCapturedReadFrom(read: MemoryEventIndex)23begin24 let read_event = _MemoryEvents[[read]];25 var found = FALSE;26 var source: MemoryEventIndex = 0;27 if read > 0 then28 for candidate_number = 0 to read - 1 do29 let candidate_index = candidate_number as MemoryEventIndex;30 let candidate = _MemoryEvents[[candidate_index]];31 if MemoryEventIsWrite(candidate) &&32 MemoryEventsShareLocation(read_event, candidate) &&33 candidate.write_value == read_event.read_value then34 found = TRUE;35 source = candidate_index;36 end;37 end;38 end;39 if found then SetMemoryReadFrom(read, source); end;40end;41
42func RecordLoadEvent(address: Word, size_bytes: integer {1,2,4,8},43 value: Word, order: MemoryOrder)44begin45 RecordLoadEventForAgent(_CurrentMemoryAgent, address, size_bytes, value,46 order);47end;48
49func RecordLoadEventForAgent(agent: MemoryAgentId, address: Word,50 size_bytes: integer {1,2,4,8}, value: Word,51 order: MemoryOrder)52begin53 if _MemoryEventCaptureEnabled then54 let event = AddLoadEvent(agent, address, size_bytes,55 value, order);56 ResolveCapturedReadFrom(event);57 end;58end;59
60func RecordStoreEvent(address: Word, size_bytes: integer {1,2,4,8},61 value: Word, order: MemoryOrder)62begin63 RecordStoreEventForAgent(_CurrentMemoryAgent, address, size_bytes, value,64 order);65end;66
67func RecordStoreEventForAgent(agent: MemoryAgentId, address: Word,68 size_bytes: integer {1,2,4,8}, value: Word,69 order: MemoryOrder)70begin71 if _MemoryEventCaptureEnabled then72 - = AddStoreEvent(agent, address, size_bytes, value,73 order, NextMemoryCoherenceRank(address, size_bytes));74 end;75end;76
77func RecordAtomicEvent(address: Word, size_bytes: integer {1,2,4,8},78 read_value: Word, write_value: Word,79 order: MemoryOrder, write_performed: boolean)80begin81 if _MemoryEventCaptureEnabled then82 let rank = if write_performed then83 NextMemoryCoherenceRank(address, size_bytes) else 0;84 let event = AddAtomicOutcomeEvent(_CurrentMemoryAgent, address,85 size_bytes, read_value, write_value, order,86 rank as MemoryCoherenceRank, write_performed);87 ResolveCapturedReadFrom(event);88 end;89end;90
91func RecordDataFenceEvent(predecessor: bits(4), successor: bits(4))92begin93 if _MemoryEventCaptureEnabled then94 - = AddDataFenceEvent(_CurrentMemoryAgent, predecessor, successor);95 end;96end;97
98func SetMemoryReadFrom(read: MemoryEventIndex, source: MemoryEventIndex)99begin100 assert read < _MemoryEventCount && source < _MemoryEventCount;101 _MemoryEvents[[read]].read_from = source;102end;103