17 #ifndef SC_INCLUDE_DYNAMIC_PROCESSES
18 #define SC_INCLUDE_DYNAMIC_PROCESSES
20 #include "tlm_recorder.h"
21 #include "tlm_extension_recording_registry.h"
22 #include <tlm/scc/tlm_id.h>
28 const std::array<std::string, 3> cmd2char{{
"READ",
"WRITE",
"IGNORE"}};
29 const std::array<std::string, 7> resp2char{
30 {
"OK",
"INCOMPLETE",
"GENERIC_ERROR",
"ADDRESS_ERROR",
"COMMAND_ERROR",
"BURST_ERROR",
"BYTE_ENABLE_ERROR"}};
31 const std::array<std::string, 3> gp_option2char{{
"MIN_PAYLOAD",
"FULL_PAYLOAD",
"FULL_PAYLOAD_ACCEPTED"}};
32 const std::array<std::string, 5> phase2char{{
"UNINITIALIZED_PHASE",
"BEGIN_REQ",
"END_REQ",
"BEGIN_RESP",
"END_RESP"}};
33 const std::array<std::string, 4> dmi2char{{
"DMI_ACCESS_NONE",
"DMI_ACCESS_READ",
"DMI_ACCESS_WRITE",
"DMI_ACCESS_READ_WRITE"}};
34 const std::array<std::string, 3> sync2char{{
"ACCEPTED",
"UPDATED",
"COMPLETED"}};
37 void record(SCVNS scv_tr_handle& handle, tlm::tlm_generic_payload& o) {
38 handle.record_attribute(
"trans.ptr",
reinterpret_cast<uintptr_t
>(&o));
39 handle.record_attribute(
"trans.address", o.get_address());
40 handle.record_attribute(
"trans.cmd", cmd2char.at(o.get_command()));
41 handle.record_attribute(
"trans.data_ptr", o.get_data_ptr());
42 handle.record_attribute(
"trans.data_length", o.get_data_length());
43 handle.record_attribute(
"trans.response", resp2char.at(1 - o.get_response_status()));
44 handle.record_attribute(
"trans.dmi_allowed", o.is_dmi_allowed());
45 handle.record_attribute(
"trans.byte_enable", o.get_byte_enable_ptr());
46 handle.record_attribute(
"trans.byte_enable_length", o.get_byte_enable_length());
47 handle.record_attribute(
"trans.streaming_width", o.get_streaming_width());
48 handle.record_attribute(
"trans.gp_option", gp_option2char.at(o.get_gp_option()));
49 if(o.get_data_length() && o.get_data_length() < 9 && o.get_data_ptr()) {
51 memcpy(&buf, o.get_data_ptr(), o.get_data_length());
52 handle.record_attribute(
"trans.data_value", buf);
55 void record(SCVNS scv_tr_handle& handle, tlm::tlm_phase& o) {
57 if(
id < phase2char.size())
58 handle.record_attribute(
"phase", phase2char[
id]);
60 handle.record_attribute(
"phase_id",
id);
62 void record(SCVNS scv_tr_handle& handle, tlm::tlm_sync_enum o) { handle.record_attribute(
"tlm_sync", sync2char.at(o)); }
63 void record(SCVNS scv_tr_handle& handle, tlm::tlm_dmi& o) {
64 handle.record_attribute(
"trans.dmi_ptr", o.get_dmi_ptr());
65 handle.record_attribute(
"trans.start_address", o.get_start_address());
66 handle.record_attribute(
"trans.end_address", o.get_end_address());
67 handle.record_attribute(
"trans.granted_access", dmi2char.at(o.get_granted_access()));
68 handle.record_attribute(
"trans.read_latency", o.get_read_latency().to_string());
69 handle.record_attribute(
"trans.write_latency", o.get_write_latency().to_string());
74 void recordBeginTx(SCVNS scv_tr_handle& handle, tlm::tlm_base_protocol_types::tlm_payload_type& trans)
override {
76 handle.record_attribute(
"trans.uid", ext->id);
80 void recordEndTx(SCVNS scv_tr_handle& handle, tlm::tlm_base_protocol_types::tlm_payload_type& trans)
override {}
84 __attribute__((constructor))
86 bool register_extensions() {
91 bool registered = register_extensions();
The TLM transaction extensions recorder registry.
The TLM transaction extensions recorder interface.
SCC SCV4TLM classes and functions.