summaryrefslogtreecommitdiff
path: root/src/systemc/ext/tlm_utils/passthrough_target_socket.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/systemc/ext/tlm_utils/passthrough_target_socket.h')
-rw-r--r--src/systemc/ext/tlm_utils/passthrough_target_socket.h810
1 files changed, 423 insertions, 387 deletions
diff --git a/src/systemc/ext/tlm_utils/passthrough_target_socket.h b/src/systemc/ext/tlm_utils/passthrough_target_socket.h
index b2c97aed5..2e7de85d6 100644
--- a/src/systemc/ext/tlm_utils/passthrough_target_socket.h
+++ b/src/systemc/ext/tlm_utils/passthrough_target_socket.h
@@ -17,461 +17,497 @@
*****************************************************************************/
-#ifndef TLM_UTILS_PASSTHROUGH_TARGET_SOCKET_H_INCLUDED_
-#define TLM_UTILS_PASSTHROUGH_TARGET_SOCKET_H_INCLUDED_
+#ifndef __SYSTEMC_EXT_TLM_UTILS_PASSTHROUGH_TARGET_SOCKET_H__
+#define __SYSTEMC_EXT_TLM_UTILS_PASSTHROUGH_TARGET_SOCKET_H__
#include <tlm>
#include "tlm_utils/convenience_socket_bases.h"
-namespace tlm_utils {
+namespace tlm_utils
+{
-template< typename MODULE, unsigned int BUSWIDTH, typename TYPES
- , sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND >
-class passthrough_target_socket_b
- : public tlm::tlm_target_socket<BUSWIDTH, TYPES, 1, POL>
- , protected passthrough_socket_base
+template <typename MODULE, unsigned int BUSWIDTH, typename TYPES,
+ sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
+class passthrough_target_socket_b :
+ public tlm::tlm_target_socket<BUSWIDTH, TYPES, 1, POL>,
+ protected passthrough_socket_base
{
-public:
- typedef typename TYPES::tlm_payload_type transaction_type;
- typedef typename TYPES::tlm_phase_type phase_type;
- typedef tlm::tlm_sync_enum sync_enum_type;
- typedef tlm::tlm_fw_transport_if<TYPES> fw_interface_type;
- typedef tlm::tlm_bw_transport_if<TYPES> bw_interface_type;
- typedef tlm::tlm_target_socket<BUSWIDTH,TYPES,1,POL> base_type;
-
-public:
- static const char* default_name()
- { return sc_core::sc_gen_unique_name("passthrough_target_socket"); }
-
- explicit passthrough_target_socket_b(const char* n = default_name())
- : base_type(n)
- , m_process(this)
- {
- bind(m_process);
- }
-
- using base_type::bind;
-
- // REGISTER_XXX
- void register_nb_transport_fw(MODULE* mod,
- sync_enum_type (MODULE::*cb)(transaction_type&,
- phase_type&,
- sc_core::sc_time&))
- {
- m_process.set_nb_transport_ptr(mod, cb);
- }
-
- void register_b_transport(MODULE* mod,
- void (MODULE::*cb)(transaction_type&,
- sc_core::sc_time&))
- {
- m_process.set_b_transport_ptr(mod, cb);
- }
-
- void register_transport_dbg(MODULE* mod,
- unsigned int (MODULE::*cb)(transaction_type&))
- {
- m_process.set_transport_dbg_ptr(mod, cb);
- }
-
- void register_get_direct_mem_ptr(MODULE* mod,
- bool (MODULE::*cb)(transaction_type&,
- tlm::tlm_dmi&))
- {
- m_process.set_get_direct_mem_ptr(mod, cb);
- }
-
-private:
- class process
- : public tlm::tlm_fw_transport_if<TYPES>
- , protected convenience_socket_cb_holder
- {
public:
- typedef sync_enum_type (MODULE::*NBTransportPtr)(transaction_type&,
- phase_type&,
- sc_core::sc_time&);
- typedef void (MODULE::*BTransportPtr)(transaction_type&,
- sc_core::sc_time&);
- typedef unsigned int (MODULE::*TransportDbgPtr)(transaction_type&);
- typedef bool (MODULE::*GetDirectMem_ptr)(transaction_type&,
- tlm::tlm_dmi&);
-
- explicit process(passthrough_socket_base* owner)
- : convenience_socket_cb_holder(owner), m_mod(0)
- , m_nb_transport_ptr(0)
- , m_b_transport_ptr(0)
- , m_transport_dbg_ptr(0)
- , m_get_direct_mem_ptr(0)
- {
- }
-
- void set_nb_transport_ptr(MODULE* mod, NBTransportPtr p)
- {
- if (m_nb_transport_ptr) {
- display_warning("non-blocking callback already registered");
- return;
- }
- sc_assert(!m_mod || m_mod == mod);
- m_mod = mod;
- m_nb_transport_ptr = p;
- }
+ typedef typename TYPES::tlm_payload_type transaction_type;
+ typedef typename TYPES::tlm_phase_type phase_type;
+ typedef tlm::tlm_sync_enum sync_enum_type;
+ typedef tlm::tlm_fw_transport_if<TYPES> fw_interface_type;
+ typedef tlm::tlm_bw_transport_if<TYPES> bw_interface_type;
+ typedef tlm::tlm_target_socket<BUSWIDTH,TYPES,1,POL> base_type;
- void set_b_transport_ptr(MODULE* mod, BTransportPtr p)
+ public:
+ static const char *
+ default_name()
{
- if (m_b_transport_ptr) {
- display_warning("blocking callback already registered");
- return;
- }
- sc_assert(!m_mod || m_mod == mod);
- m_mod = mod;
- m_b_transport_ptr = p;
+ return sc_core::sc_gen_unique_name("passthrough_target_socket");
}
- void set_transport_dbg_ptr(MODULE* mod, TransportDbgPtr p)
+ explicit passthrough_target_socket_b(const char *n=default_name()) :
+ base_type(n), m_process(this)
{
- if (m_transport_dbg_ptr) {
- display_warning("debug callback already registered");
- return;
- }
- sc_assert(!m_mod || m_mod == mod);
- m_mod = mod;
- m_transport_dbg_ptr = p;
+ bind(m_process);
}
- void set_get_direct_mem_ptr(MODULE* mod, GetDirectMem_ptr p)
+ using base_type::bind;
+
+ // REGISTER_XXX
+ void
+ register_nb_transport_fw(MODULE *mod,
+ sync_enum_type (MODULE::*cb)(transaction_type &, phase_type &,
+ sc_core::sc_time &))
{
- if (m_get_direct_mem_ptr) {
- display_warning("get DMI pointer callback already registered");
- return;
- }
- sc_assert(!m_mod || m_mod == mod);
- m_mod = mod;
- m_get_direct_mem_ptr = p;
+ m_process.set_nb_transport_ptr(mod, cb);
}
- sync_enum_type nb_transport_fw(transaction_type& trans,
- phase_type& phase,
- sc_core::sc_time& t)
+ void
+ register_b_transport(MODULE *mod,
+ void (MODULE::*cb)(transaction_type &, sc_core::sc_time &))
{
- if (m_nb_transport_ptr) {
- // forward call
- sc_assert(m_mod);
- return (m_mod->*m_nb_transport_ptr)(trans, phase, t);
- }
- display_error("no non-blocking callback registered");
- return tlm::TLM_COMPLETED;
+ m_process.set_b_transport_ptr(mod, cb);
}
- void b_transport(transaction_type& trans, sc_core::sc_time& t)
+ void
+ register_transport_dbg(MODULE *mod,
+ unsigned int (MODULE::*cb)(transaction_type &))
{
- if (m_b_transport_ptr) {
- // forward call
- sc_assert(m_mod);
- return (m_mod->*m_b_transport_ptr)(trans, t);
- }
- display_error("no blocking callback registered");
+ m_process.set_transport_dbg_ptr(mod, cb);
}
- unsigned int transport_dbg(transaction_type& trans)
+ void
+ register_get_direct_mem_ptr(MODULE *mod,
+ bool (MODULE::*cb)(transaction_type &, tlm::tlm_dmi &))
{
- if (m_transport_dbg_ptr) {
- // forward call
- sc_assert(m_mod);
- return (m_mod->*m_transport_dbg_ptr)(trans);
- }
- // No debug support
- return 0;
+ m_process.set_get_direct_mem_ptr(mod, cb);
}
- bool get_direct_mem_ptr(transaction_type& trans,
- tlm::tlm_dmi& dmi_data)
+ private:
+ class process : public tlm::tlm_fw_transport_if<TYPES>,
+ protected convenience_socket_cb_holder
{
- if (m_get_direct_mem_ptr) {
- // forward call
- sc_assert(m_mod);
- return (m_mod->*m_get_direct_mem_ptr)(trans, dmi_data);
- }
- // No DMI support
- dmi_data.allow_read_write();
- dmi_data.set_start_address(0x0);
- dmi_data.set_end_address((sc_dt::uint64)-1);
- return false;
- }
+ public:
+ typedef sync_enum_type (MODULE::*NBTransportPtr)(
+ transaction_type &, phase_type &, sc_core::sc_time &);
+ typedef void (MODULE::*BTransportPtr)(
+ transaction_type &, sc_core::sc_time &);
+ typedef unsigned int (MODULE::*TransportDbgPtr)(transaction_type &);
+ typedef bool (MODULE::*GetDirectMem_ptr)(
+ transaction_type &, tlm::tlm_dmi &);
+
+ explicit process(passthrough_socket_base *owner) :
+ convenience_socket_cb_holder(owner), m_mod(0),
+ m_nb_transport_ptr(0), m_b_transport_ptr(0),
+ m_transport_dbg_ptr(0), m_get_direct_mem_ptr(0)
+ {}
+
+ void
+ set_nb_transport_ptr(MODULE *mod, NBTransportPtr p)
+ {
+ if (m_nb_transport_ptr) {
+ display_warning("non-blocking callback already registered");
+ return;
+ }
+ sc_assert(!m_mod || m_mod == mod);
+ m_mod = mod;
+ m_nb_transport_ptr = p;
+ }
+
+ void
+ set_b_transport_ptr(MODULE *mod, BTransportPtr p)
+ {
+ if (m_b_transport_ptr) {
+ display_warning("blocking callback already registered");
+ return;
+ }
+ sc_assert(!m_mod || m_mod == mod);
+ m_mod = mod;
+ m_b_transport_ptr = p;
+ }
+
+ void
+ set_transport_dbg_ptr(MODULE *mod, TransportDbgPtr p)
+ {
+ if (m_transport_dbg_ptr) {
+ display_warning("debug callback already registered");
+ return;
+ }
+ sc_assert(!m_mod || m_mod == mod);
+ m_mod = mod;
+ m_transport_dbg_ptr = p;
+ }
+
+ void
+ set_get_direct_mem_ptr(MODULE *mod, GetDirectMem_ptr p)
+ {
+ if (m_get_direct_mem_ptr) {
+ display_warning(
+ "get DMI pointer callback already registered");
+ return;
+ }
+ sc_assert(!m_mod || m_mod == mod);
+ m_mod = mod;
+ m_get_direct_mem_ptr = p;
+ }
+
+ sync_enum_type nb_transport_fw(
+ transaction_type &trans, phase_type &phase,
+ sc_core::sc_time &t)
+ {
+ if (m_nb_transport_ptr) {
+ // Forward call.
+ sc_assert(m_mod);
+ return (m_mod->*m_nb_transport_ptr)(trans, phase, t);
+ }
+ display_error("no non-blocking callback registered");
+ return tlm::TLM_COMPLETED;
+ }
+
+ void
+ b_transport(transaction_type &trans, sc_core::sc_time &t)
+ {
+ if (m_b_transport_ptr) {
+ // Forward call.
+ sc_assert(m_mod);
+ return (m_mod->*m_b_transport_ptr)(trans, t);
+ }
+ display_error("no blocking callback registered");
+ }
+
+ unsigned int
+ transport_dbg(transaction_type &trans)
+ {
+ if (m_transport_dbg_ptr) {
+ // Forward call.
+ sc_assert(m_mod);
+ return (m_mod->*m_transport_dbg_ptr)(trans);
+ }
+ // No debug support
+ return 0;
+ }
+
+ bool
+ get_direct_mem_ptr(transaction_type &trans, tlm::tlm_dmi &dmi_data)
+ {
+ if (m_get_direct_mem_ptr) {
+ // Forward call.
+ sc_assert(m_mod);
+ return (m_mod->*m_get_direct_mem_ptr)(trans, dmi_data);
+ }
+ // No DMI support
+ dmi_data.allow_read_write();
+ dmi_data.set_start_address(0x0);
+ dmi_data.set_end_address((sc_dt::uint64)-1);
+ return false;
+ }
+
+ private:
+ MODULE *m_mod;
+ NBTransportPtr m_nb_transport_ptr;
+ BTransportPtr m_b_transport_ptr;
+ TransportDbgPtr m_transport_dbg_ptr;
+ GetDirectMem_ptr m_get_direct_mem_ptr;
+ };
+
+ private:
+ const sc_core::sc_object *get_socket() const { return this; }
private:
- MODULE* m_mod;
- NBTransportPtr m_nb_transport_ptr;
- BTransportPtr m_b_transport_ptr;
- TransportDbgPtr m_transport_dbg_ptr;
- GetDirectMem_ptr m_get_direct_mem_ptr;
- };
-
-private:
- const sc_core::sc_object* get_socket() const { return this; }
-private:
- process m_process;
+ process m_process;
};
-template< typename MODULE, unsigned int BUSWIDTH = 32
- , typename TYPES = tlm::tlm_base_protocol_types >
-class passthrough_target_socket
- : public passthrough_target_socket_b<MODULE,BUSWIDTH,TYPES>
+template <typename MODULE, unsigned int BUSWIDTH=32,
+ typename TYPES=tlm::tlm_base_protocol_types>
+class passthrough_target_socket :
+ public passthrough_target_socket_b<MODULE, BUSWIDTH, TYPES>
{
- typedef passthrough_target_socket_b<MODULE,BUSWIDTH,TYPES> socket_b;
-public:
- passthrough_target_socket() : socket_b() {}
- explicit passthrough_target_socket(const char* name) : socket_b(name) {}
+ typedef passthrough_target_socket_b<MODULE, BUSWIDTH, TYPES> socket_b;
+ public:
+ passthrough_target_socket() : socket_b() {}
+ explicit passthrough_target_socket(const char *name) : socket_b(name) {}
};
-template< typename MODULE, unsigned int BUSWIDTH = 32
- , typename TYPES = tlm::tlm_base_protocol_types >
-class passthrough_target_socket_optional
- : public passthrough_target_socket_b<MODULE,BUSWIDTH,TYPES,sc_core::SC_ZERO_OR_MORE_BOUND>
+template <typename MODULE, unsigned int BUSWIDTH=32,
+ typename TYPES=tlm::tlm_base_protocol_types>
+class passthrough_target_socket_optional :
+ public passthrough_target_socket_b<
+ MODULE, BUSWIDTH, TYPES, sc_core::SC_ZERO_OR_MORE_BOUND>
{
- typedef passthrough_target_socket_b<MODULE,BUSWIDTH,TYPES,sc_core::SC_ZERO_OR_MORE_BOUND> socket_b;
-public:
- passthrough_target_socket_optional() : socket_b() {}
- explicit passthrough_target_socket_optional(const char* name) : socket_b(name) {}
+ typedef passthrough_target_socket_b<
+ MODULE, BUSWIDTH, TYPES, sc_core::SC_ZERO_OR_MORE_BOUND> socket_b;
+ public:
+ passthrough_target_socket_optional() : socket_b() {}
+ explicit passthrough_target_socket_optional(const char *name) :
+ socket_b(name) {}
};
-//ID Tagged version
-template< typename MODULE, unsigned int BUSWIDTH, typename TYPES
- , sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND >
-class passthrough_target_socket_tagged_b
- : public tlm::tlm_target_socket<BUSWIDTH, TYPES, 1, POL>
- , protected passthrough_socket_base
+// ID Tagged version
+template <typename MODULE, unsigned int BUSWIDTH, typename TYPES,
+ sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
+class passthrough_target_socket_tagged_b :
+ public tlm::tlm_target_socket<BUSWIDTH, TYPES, 1, POL>,
+ protected passthrough_socket_base
{
-public:
- typedef typename TYPES::tlm_payload_type transaction_type;
- typedef typename TYPES::tlm_phase_type phase_type;
- typedef tlm::tlm_sync_enum sync_enum_type;
- typedef tlm::tlm_fw_transport_if<TYPES> fw_interface_type;
- typedef tlm::tlm_bw_transport_if<TYPES> bw_interface_type;
- typedef tlm::tlm_target_socket<BUSWIDTH,TYPES,1,POL> base_type;
-
- static const char* default_name()
- { return sc_core::sc_gen_unique_name("passthrough_target_socket_tagged"); }
-
-public:
- explicit passthrough_target_socket_tagged_b(const char* n = default_name())
- : base_type(n)
- , m_process(this)
- {
- bind(m_process);
- }
-
- using base_type::bind;
-
- // REGISTER_XXX
- void register_nb_transport_fw(MODULE* mod,
- sync_enum_type (MODULE::*cb)(int id,
- transaction_type&,
- phase_type&,
- sc_core::sc_time&),
- int id)
- {
- m_process.set_nb_transport_ptr(mod, cb);
- m_process.set_nb_transport_user_id(id);
- }
-
- void register_b_transport(MODULE* mod,
- void (MODULE::*cb)(int id,
- transaction_type&,
- sc_core::sc_time&),
- int id)
- {
- m_process.set_b_transport_ptr(mod, cb);
- m_process.set_b_transport_user_id(id);
- }
-
- void register_transport_dbg(MODULE* mod,
- unsigned int (MODULE::*cb)(int id,
- transaction_type&),
- int id)
- {
- m_process.set_transport_dbg_ptr(mod, cb);
- m_process.set_transport_dbg_user_id(id);
- }
-
- void register_get_direct_mem_ptr(MODULE* mod,
- bool (MODULE::*cb)(int id,
- transaction_type&,
- tlm::tlm_dmi&),
- int id)
- {
- m_process.set_get_direct_mem_ptr(mod, cb);
- m_process.set_get_dmi_user_id(id);
- }
-
-private:
- class process
- : public tlm::tlm_fw_transport_if<TYPES>
- , protected convenience_socket_cb_holder
- {
public:
- typedef sync_enum_type (MODULE::*NBTransportPtr)(int id,
- transaction_type&,
- phase_type&,
- sc_core::sc_time&);
- typedef void (MODULE::*BTransportPtr)(int id,
- transaction_type&,
- sc_core::sc_time&);
- typedef unsigned int (MODULE::*TransportDbgPtr)(int id,
- transaction_type&);
- typedef bool (MODULE::*GetDirectMem_ptr)(int id,
- transaction_type&,
- tlm::tlm_dmi&);
-
- process(passthrough_socket_base* owner)
- : convenience_socket_cb_holder(owner), m_mod(0)
- , m_nb_transport_ptr(0)
- , m_b_transport_ptr(0)
- , m_transport_dbg_ptr(0)
- , m_get_direct_mem_ptr(0)
- , m_nb_transport_user_id(0)
- , m_b_transport_user_id(0)
- , m_transport_dbg_user_id(0)
- , m_get_dmi_user_id(0)
+ typedef typename TYPES::tlm_payload_type transaction_type;
+ typedef typename TYPES::tlm_phase_type phase_type;
+ typedef tlm::tlm_sync_enum sync_enum_type;
+ typedef tlm::tlm_fw_transport_if<TYPES> fw_interface_type;
+ typedef tlm::tlm_bw_transport_if<TYPES> bw_interface_type;
+ typedef tlm::tlm_target_socket<BUSWIDTH, TYPES, 1, POL> base_type;
+
+ static const char *
+ default_name()
{
+ return sc_core::sc_gen_unique_name(
+ "passthrough_target_socket_tagged");
}
- void set_nb_transport_user_id(int id) { m_nb_transport_user_id = id; }
- void set_b_transport_user_id(int id) { m_b_transport_user_id = id; }
- void set_transport_dbg_user_id(int id) { m_transport_dbg_user_id = id; }
- void set_get_dmi_user_id(int id) { m_get_dmi_user_id = id; }
-
- void set_nb_transport_ptr(MODULE* mod, NBTransportPtr p)
+ public:
+ explicit passthrough_target_socket_tagged_b(
+ const char *n=default_name()) : base_type(n), m_process(this)
{
- if (m_nb_transport_ptr) {
- display_warning("non-blocking callback already registered");
- return;
- }
- sc_assert(!m_mod || m_mod == mod);
- m_mod = mod;
- m_nb_transport_ptr = p;
+ bind(m_process);
}
- void set_b_transport_ptr(MODULE* mod, BTransportPtr p)
- {
- if (m_b_transport_ptr) {
- display_warning("blocking callback already registered");
- return;
- }
- sc_assert(!m_mod || m_mod == mod);
- m_mod = mod;
- m_b_transport_ptr = p;
- }
+ using base_type::bind;
- void set_transport_dbg_ptr(MODULE* mod, TransportDbgPtr p)
+ // REGISTER_XXX
+ void
+ register_nb_transport_fw(MODULE *mod,
+ sync_enum_type (MODULE::*cb)(int id, transaction_type &,
+ phase_type &, sc_core::sc_time &),
+ int id)
{
- if (m_transport_dbg_ptr) {
- display_warning("debug callback already registered");
- return;
- }
- sc_assert(!m_mod || m_mod == mod);
- m_mod = mod;
- m_transport_dbg_ptr = p;
+ m_process.set_nb_transport_ptr(mod, cb);
+ m_process.set_nb_transport_user_id(id);
}
- void set_get_direct_mem_ptr(MODULE* mod, GetDirectMem_ptr p)
+ void
+ register_b_transport(MODULE *mod,
+ void (MODULE::*cb)(int id, transaction_type &,
+ sc_core::sc_time &),
+ int id)
{
- if (m_get_direct_mem_ptr) {
- display_warning("get DMI pointer callback already registered");
- return;
- }
- sc_assert(!m_mod || m_mod == mod);
- m_mod = mod;
- m_get_direct_mem_ptr = p;
+ m_process.set_b_transport_ptr(mod, cb);
+ m_process.set_b_transport_user_id(id);
}
- sync_enum_type nb_transport_fw(transaction_type& trans,
- phase_type& phase,
- sc_core::sc_time& t)
+ void
+ register_transport_dbg(MODULE *mod,
+ unsigned int (MODULE::*cb)(int id, transaction_type &), int id)
{
- if (m_nb_transport_ptr) {
- // forward call
- sc_assert(m_mod);
- return (m_mod->*m_nb_transport_ptr)(m_nb_transport_user_id, trans, phase, t);
- }
- display_error("no non-blocking callback registered");
- return tlm::TLM_COMPLETED;
+ m_process.set_transport_dbg_ptr(mod, cb);
+ m_process.set_transport_dbg_user_id(id);
}
- void b_transport(transaction_type& trans, sc_core::sc_time& t)
+ void
+ register_get_direct_mem_ptr(MODULE *mod,
+ bool (MODULE::*cb)(int id, transaction_type &, tlm::tlm_dmi &),
+ int id)
{
- if (m_b_transport_ptr) {
- // forward call
- sc_assert(m_mod);
- return (m_mod->*m_b_transport_ptr)(m_b_transport_user_id, trans, t);
- }
- display_error("no blocking callback registered");
+ m_process.set_get_direct_mem_ptr(mod, cb);
+ m_process.set_get_dmi_user_id(id);
}
- unsigned int transport_dbg(transaction_type& trans)
+ private:
+ class process : public tlm::tlm_fw_transport_if<TYPES>,
+ protected convenience_socket_cb_holder
{
- if (m_transport_dbg_ptr) {
- // forward call
- sc_assert(m_mod);
- return (m_mod->*m_transport_dbg_ptr)(m_transport_dbg_user_id, trans);
- }
- // No debug support
- return 0;
- }
+ public:
+ typedef sync_enum_type (MODULE::*NBTransportPtr)(
+ int id, transaction_type &, phase_type &, sc_core::sc_time &);
+ typedef void (MODULE::*BTransportPtr)(
+ int id, transaction_type &, sc_core::sc_time &);
+ typedef unsigned int (MODULE::*TransportDbgPtr)(
+ int id, transaction_type &);
+ typedef bool (MODULE::*GetDirectMem_ptr)(
+ int id, transaction_type &, tlm::tlm_dmi &);
+
+ process(passthrough_socket_base *owner) :
+ convenience_socket_cb_holder(owner), m_mod(0),
+ m_nb_transport_ptr(0), m_b_transport_ptr(0),
+ m_transport_dbg_ptr(0), m_get_direct_mem_ptr(0),
+ m_nb_transport_user_id(0), m_b_transport_user_id(0),
+ m_transport_dbg_user_id(0), m_get_dmi_user_id(0)
+ {}
+
+ void
+ set_nb_transport_user_id(int id)
+ {
+ m_nb_transport_user_id = id;
+ }
+ void
+ set_b_transport_user_id(int id)
+ {
+ m_b_transport_user_id = id;
+ }
+ void
+ set_transport_dbg_user_id(int id)
+ {
+ m_transport_dbg_user_id = id;
+ }
+ void
+ set_get_dmi_user_id(int id)
+ {
+ m_get_dmi_user_id = id;
+ }
+
+ void
+ set_nb_transport_ptr(MODULE *mod, NBTransportPtr p)
+ {
+ if (m_nb_transport_ptr) {
+ display_warning("non-blocking callback already registered");
+ return;
+ }
+ sc_assert(!m_mod || m_mod == mod);
+ m_mod = mod;
+ m_nb_transport_ptr = p;
+ }
+
+ void
+ set_b_transport_ptr(MODULE *mod, BTransportPtr p)
+ {
+ if (m_b_transport_ptr) {
+ display_warning("blocking callback already registered");
+ return;
+ }
+ sc_assert(!m_mod || m_mod == mod);
+ m_mod = mod;
+ m_b_transport_ptr = p;
+ }
+
+ void
+ set_transport_dbg_ptr(MODULE *mod, TransportDbgPtr p)
+ {
+ if (m_transport_dbg_ptr) {
+ display_warning("debug callback already registered");
+ return;
+ }
+ sc_assert(!m_mod || m_mod == mod);
+ m_mod = mod;
+ m_transport_dbg_ptr = p;
+ }
+
+ void
+ set_get_direct_mem_ptr(MODULE *mod, GetDirectMem_ptr p)
+ {
+ if (m_get_direct_mem_ptr) {
+ display_warning(
+ "get DMI pointer callback already registered");
+ return;
+ }
+ sc_assert(!m_mod || m_mod == mod);
+ m_mod = mod;
+ m_get_direct_mem_ptr = p;
+ }
+
+ sync_enum_type
+ nb_transport_fw(transaction_type &trans, phase_type &phase,
+ sc_core::sc_time &t)
+ {
+ if (m_nb_transport_ptr) {
+ // Forward call.
+ sc_assert(m_mod);
+ return (m_mod->*m_nb_transport_ptr)(
+ m_nb_transport_user_id, trans, phase, t);
+ }
+ display_error("no non-blocking callback registered");
+ return tlm::TLM_COMPLETED;
+ }
+
+ void
+ b_transport(transaction_type &trans, sc_core::sc_time &t)
+ {
+ if (m_b_transport_ptr) {
+ // Forward call.
+ sc_assert(m_mod);
+ return (m_mod->*m_b_transport_ptr)(
+ m_b_transport_user_id, trans, t);
+ }
+ display_error("no blocking callback registered");
+ }
+
+ unsigned int
+ transport_dbg(transaction_type &trans)
+ {
+ if (m_transport_dbg_ptr) {
+ // Forward call.
+ sc_assert(m_mod);
+ return (m_mod->*m_transport_dbg_ptr)(
+ m_transport_dbg_user_id, trans);
+ }
+ // No debug support.
+ return 0;
+ }
+
+ bool
+ get_direct_mem_ptr(transaction_type &trans, tlm::tlm_dmi &dmi_data)
+ {
+ if (m_get_direct_mem_ptr) {
+ // Forward call.
+ sc_assert(m_mod);
+ return (m_mod->*m_get_direct_mem_ptr)(
+ m_get_dmi_user_id, trans, dmi_data);
+ }
+ // No DMI support
+ dmi_data.allow_read_write();
+ dmi_data.set_start_address(0x0);
+ dmi_data.set_end_address((sc_dt::uint64)-1);
+ return false;
+ }
+
+ private:
+ MODULE *m_mod;
+ NBTransportPtr m_nb_transport_ptr;
+ BTransportPtr m_b_transport_ptr;
+ TransportDbgPtr m_transport_dbg_ptr;
+ GetDirectMem_ptr m_get_direct_mem_ptr;
+ int m_nb_transport_user_id;
+ int m_b_transport_user_id;
+ int m_transport_dbg_user_id;
+ int m_get_dmi_user_id;
+ };
- bool get_direct_mem_ptr(transaction_type& trans,
- tlm::tlm_dmi& dmi_data)
- {
- if (m_get_direct_mem_ptr) {
- // forward call
- sc_assert(m_mod);
- return (m_mod->*m_get_direct_mem_ptr)(m_get_dmi_user_id, trans, dmi_data);
- }
- // No DMI support
- dmi_data.allow_read_write();
- dmi_data.set_start_address(0x0);
- dmi_data.set_end_address((sc_dt::uint64)-1);
- return false;
- }
+ private:
+ const sc_core::sc_object *get_socket() const { return this; }
private:
- MODULE* m_mod;
- NBTransportPtr m_nb_transport_ptr;
- BTransportPtr m_b_transport_ptr;
- TransportDbgPtr m_transport_dbg_ptr;
- GetDirectMem_ptr m_get_direct_mem_ptr;
- int m_nb_transport_user_id;
- int m_b_transport_user_id;
- int m_transport_dbg_user_id;
- int m_get_dmi_user_id;
- };
-
-private:
- const sc_core::sc_object* get_socket() const { return this; }
-private:
- process m_process;
+ process m_process;
};
-template< typename MODULE, unsigned int BUSWIDTH = 32
- , typename TYPES = tlm::tlm_base_protocol_types >
-class passthrough_target_socket_tagged
- : public passthrough_target_socket_tagged_b<MODULE,BUSWIDTH,TYPES>
+template <typename MODULE, unsigned int BUSWIDTH=32,
+ typename TYPES=tlm::tlm_base_protocol_types>
+class passthrough_target_socket_tagged :
+ public passthrough_target_socket_tagged_b<MODULE, BUSWIDTH, TYPES>
{
- typedef passthrough_target_socket_tagged_b<MODULE,BUSWIDTH,TYPES> socket_b;
-public:
- passthrough_target_socket_tagged() : socket_b() {}
- explicit passthrough_target_socket_tagged(const char* name) : socket_b(name) {}
+ typedef passthrough_target_socket_tagged_b<MODULE, BUSWIDTH, TYPES>
+ socket_b;
+ public:
+ passthrough_target_socket_tagged() : socket_b() {}
+ explicit passthrough_target_socket_tagged(const char *name) :
+ socket_b(name)
+ {}
};
-template< typename MODULE, unsigned int BUSWIDTH = 32
- , typename TYPES = tlm::tlm_base_protocol_types >
-class passthrough_target_socket_tagged_optional
- : public passthrough_target_socket_tagged_b<MODULE,BUSWIDTH,TYPES,sc_core::SC_ZERO_OR_MORE_BOUND>
+template <typename MODULE, unsigned int BUSWIDTH=32,
+ typename TYPES=tlm::tlm_base_protocol_types>
+class passthrough_target_socket_tagged_optional :
+ public passthrough_target_socket_tagged_b<
+ MODULE, BUSWIDTH, TYPES, sc_core::SC_ZERO_OR_MORE_BOUND>
{
- typedef passthrough_target_socket_tagged_b<MODULE,BUSWIDTH,TYPES,sc_core::SC_ZERO_OR_MORE_BOUND> socket_b;
-public:
- passthrough_target_socket_tagged_optional() : socket_b() {}
- explicit passthrough_target_socket_tagged_optional(const char* name) : socket_b(name) {}
+ typedef passthrough_target_socket_tagged_b<
+ MODULE, BUSWIDTH, TYPES, sc_core::SC_ZERO_OR_MORE_BOUND> socket_b;
+ public:
+ passthrough_target_socket_tagged_optional() : socket_b() {}
+ explicit passthrough_target_socket_tagged_optional(const char *name) :
+ socket_b(name)
+ {}
};
} // namespace tlm_utils
-#endif // TLM_UTILS_PASSTHROUGH_TARGET_SOCKET_H_INCLUDED_
+
+#endif /* __SYSTEMC_EXT_TLM_UTILS_PASSTHROUGH_TARGET_SOCKET_H__ */