17#ifndef SC_INCLUDE_DYNAMIC_PROCESSES
18#define SC_INCLUDE_DYNAMIC_PROCESSES
21#include "tlm_extension_recording_registry.h"
22#include "tlm_recorder.h"
23#include <fmt/format.h>
24#include <tlm/scc/tlm_id.h>
30const std::array<std::string, 3> cmd2char{{
"READ",
"WRITE",
"IGNORE"}};
31const std::array<std::string, 7> resp2char{
32 {
"OK",
"INCOMPLETE",
"GENERIC_ERROR",
"ADDRESS_ERROR",
"COMMAND_ERROR",
"BURST_ERROR",
"BYTE_ENABLE_ERROR"}};
33const std::array<std::string, 3> gp_option2char{{
"MIN_PAYLOAD",
"FULL_PAYLOAD",
"FULL_PAYLOAD_ACCEPTED"}};
34const std::array<std::string, 5> phase2char{{
"UNINITIALIZED_PHASE",
"BEGIN_REQ",
"END_REQ",
"BEGIN_RESP",
"END_RESP"}};
35const std::array<std::string, 4> dmi2char{{
"DMI_ACCESS_NONE",
"DMI_ACCESS_READ",
"DMI_ACCESS_WRITE",
"DMI_ACCESS_READ_WRITE"}};
36const std::array<std::string, 3> sync2char{{
"ACCEPTED",
"UPDATED",
"COMPLETED"}};
39void record(SCVNS scv_tr_handle& handle, tlm::tlm_generic_payload
const& o) {
40 handle.record_attribute(
"trans.ptr",
reinterpret_cast<uintptr_t
>(&o));
41 handle.record_attribute(
"trans.address", o.get_address());
42 handle.record_attribute(
"trans.cmd", cmd2char.at(o.get_command()));
43 handle.record_attribute(
"trans.data_ptr", o.get_data_ptr());
44 handle.record_attribute(
"trans.data_length", o.get_data_length());
45 handle.record_attribute(
"trans.response", resp2char.at(1 - o.get_response_status()));
46 handle.record_attribute(
"trans.dmi_allowed", o.is_dmi_allowed());
47 handle.record_attribute(
"trans.byte_enable", o.get_byte_enable_ptr());
48 handle.record_attribute(
"trans.byte_enable_length", o.get_byte_enable_length());
49 handle.record_attribute(
"trans.streaming_width", o.get_streaming_width());
50 handle.record_attribute(
"trans.gp_option", gp_option2char.at(o.get_gp_option()));
51 if(o.get_data_length() && o.get_data_length() < 9 && o.get_data_ptr()) {
53 memcpy(&buf, o.get_data_ptr(), o.get_data_length());
54 handle.record_attribute(
"trans.data_value", buf);
57void record(SCVNS scv_tr_handle& handle, tlm::tlm_phase
const& o) {
59 if(
id < phase2char.size())
60 handle.record_attribute(
"phase", phase2char[
id]);
62 handle.record_attribute(
"phase_id",
id);
64void record(SCVNS scv_tr_handle& handle, tlm::tlm_sync_enum o) { handle.record_attribute(
"tlm_sync", sync2char.at(o)); }
65void record(SCVNS scv_tr_handle& handle, tlm::tlm_dmi
const& 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 tlm_id_ext_record() {
recordBegin = &tlm_id_ext_record::recordBeginTx; }
78 static void recordBeginTx(SCVNS scv_tr_handle& handle, tlm::tlm_extension_base* e, std::string
const& prefix) {
80 handle.record_attribute(fmt::format(
"{}uid", prefix).c_str(), ext->id);
87 tlm_id_ext_recording() { recordBegin = &recordBeginTx; }
89 static void recordBeginTx(SCVNS scv_tr_handle& handle, tlm::tlm_base_protocol_types::tlm_payload_type& trans) {
96__attribute__((constructor))
98bool register_extensions() {
100 if(!tlm_extension_recording_registry<tlm::tlm_base_protocol_types>::get().is_ext_registered(ext.ID))
101 tlm_extension_recording_registry<tlm::tlm_base_protocol_types>::get().register_ext_rec(
103 util::make_unique<tlm_id_ext_recording>());
104 if(!tlm_extension_record_registry::get().is_ext_registered(ext.ID))
105 tlm_extension_record_registry::get().register_ext_rec(ext.ID, util::make_unique<tlm_id_ext_record>());
108bool registered = register_extensions();
SCC SCV4TLM classes and functions.
util::delegate< void(SCVNS scv_tr_handle &, tlm::tlm_extension_base *, std::string const &)> recordBegin
recording attributes in extensions at the beginning, it is intended to be overload as it does nothing
The TLM transaction extensions recorder interface.
void recordBeginTx(SCVNS scv_tr_handle &h, typename TYPES::tlm_payload_type &trans)
recording attributes in extensions at the beginning, it is intended to be overload as it does nothing