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() < 8 && o.get_data_ptr()) {
52 for(
size_t i = 0; i < o.get_data_length(); i++)
53 buf += (*o.get_data_ptr()) << i * 8;
54 handle.record_attribute(
"trans.data_value", buf);
57 void record(SCVNS scv_tr_handle& handle, tlm::tlm_phase& o) {
59 if(
id < phase2char.size())
60 handle.record_attribute(
"phase", phase2char[
id]);
62 handle.record_attribute(
"phase_id",
id);
64 void record(SCVNS scv_tr_handle& handle, tlm::tlm_sync_enum o) { handle.record_attribute(
"tlm_sync", sync2char.at(o)); }
65 void record(SCVNS scv_tr_handle& handle, tlm::tlm_dmi& o) {
66 handle.record_attribute(
"trans.dmi_ptr", o.get_dmi_ptr());
67 handle.record_attribute(
"trans.start_address", o.get_start_address());
68 handle.record_attribute(
"trans.end_address", o.get_end_address());
69 handle.record_attribute(
"trans.granted_access", dmi2char.at(o.get_granted_access()));
70 handle.record_attribute(
"trans.read_latency", o.get_read_latency().to_string());
71 handle.record_attribute(
"trans.write_latency", o.get_write_latency().to_string());
76 void recordBeginTx(SCVNS scv_tr_handle& handle, tlm::tlm_base_protocol_types::tlm_payload_type& trans)
override {
78 handle.record_attribute(
"trans.uid", ext->id);
82 void recordEndTx(SCVNS scv_tr_handle& handle, tlm::tlm_base_protocol_types::tlm_payload_type& trans)
override {}
86 __attribute__((constructor))
88 bool register_extensions() {
93 bool registered = register_extensions();
The TLM transaction extensions recorder registry.
The TLM transaction extensions recorder interface.
SCC SCV4TLM classes and functions.