17#ifndef TLM_RECORDER_REGISTRY_H_
18#define TLM_RECORDER_REGISTRY_H_
22#include <unordered_set>
23#include <util/delegate.h>
32#define SCVNS ::scv_tr::
57struct tlm_extension_record_registry {
58 using recording_vector = std::vector<std::unique_ptr<tlm_extension_record_if>>;
60 static tlm_extension_record_registry& get() {
61 static tlm_extension_record_registry reg;
65 void register_ext_rec(
size_t id, std::unique_ptr<tlm_extension_record_if> ext) {
68 if(
id >= ext_rec.size())
69 ext_rec.resize(
id + 1);
70 ext_rec.at(
id) = std::move(ext);
73 bool is_ext_registered(
size_t id) {
return id == 0 || (
id < ext_rec.size() && ext_rec[
id]); }
75 size_t size()
const {
return ext_rec.size(); }
77 typename recording_vector::iterator begin() {
return ext_rec.begin(); }
79 typename recording_vector::iterator end() {
return ext_rec.end(); }
83 return ext_rec[n].get();
85 return ext_rec.at(n).get();
91 inline void recordBeginTx(
size_t id, SCVNS scv_tr_handle& handle, tlm::tlm_extension_base* ext, std::string
const& prefix =
"") {
92 assert(ext_rec.size() >
id);
93 if(ext && ext_rec[
id] && ext_rec[
id]->recordBegin)
94 ext_rec[id]->recordBegin(handle, ext, prefix);
99 inline void recordEndTx(
size_t id, SCVNS scv_tr_handle& handle, tlm::tlm_extension_base* ext, std::string
const& prefix =
"") {
100 assert(ext_rec.size() >
id);
101 if(ext && ext_rec[
id] && ext_rec[
id]->recordEnd)
102 ext_rec[id]->recordEnd(handle, ext, prefix);
109 recording_vector ext_rec{};
120 using record_tx_fct =
util::delegate<void(SCVNS scv_tr_handle&,
typename TYPES::tlm_payload_type&)>;
125 void recordBeginTx(SCVNS scv_tr_handle& h,
typename TYPES::tlm_payload_type& trans) {
127 recordBegin(h, trans);
133 void recordEndTx(SCVNS scv_tr_handle& h,
typename TYPES::tlm_payload_type& trans) {
139 record_tx_fct recordBegin;
140 record_tx_fct recordEnd;
149template <
typename TYPES = tlm::tlm_base_protocol_types>
class tlm_extension_recording_registry {
151 using recording_vector = std::vector<std::unique_ptr<tlm_extensions_recording_if<TYPES>>>;
152 static tlm_extension_recording_registry& get() {
153 static tlm_extension_recording_registry reg;
157 ext_rec.push_back(std::move(ext));
158 registered_ids.insert(
id);
161 bool is_ext_registered(
size_t id) {
return registered_ids.count(
id); }
163 typename recording_vector::iterator begin() {
return ext_rec.begin(); }
165 typename recording_vector::iterator end() {
return ext_rec.end(); }
168 tlm_extension_recording_registry() =
default;
169 recording_vector ext_rec{};
170 std::unordered_set<size_t> registered_ids;
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
util::delegate< void(SCVNS scv_tr_handle &, tlm::tlm_extension_base *, std::string const &)> recordEnd
recording attributes in extensions at the end, it is intended to be overload as it does nothing
void recordBeginTx(size_t id, SCVNS scv_tr_handle &handle, tlm::tlm_extension_base *ext, std::string const &prefix="")
recording attributes in extensions at the beginning
void recordEndTx(size_t id, SCVNS scv_tr_handle &handle, tlm::tlm_extension_base *ext, std::string const &prefix="")
recording attributes in extensions at the end
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
void recordEndTx(SCVNS scv_tr_handle &h, typename TYPES::tlm_payload_type &trans)
recording attributes in extensions at the end, it is intended to be overload as it does nothing