diff options
Diffstat (limited to 'src/systemc/ext/tlm_utils/simple_initiator_socket.h')
-rw-r--r-- | src/systemc/ext/tlm_utils/simple_initiator_socket.h | 503 |
1 files changed, 265 insertions, 238 deletions
diff --git a/src/systemc/ext/tlm_utils/simple_initiator_socket.h b/src/systemc/ext/tlm_utils/simple_initiator_socket.h index 0cf9c5649..abeb510e3 100644 --- a/src/systemc/ext/tlm_utils/simple_initiator_socket.h +++ b/src/systemc/ext/tlm_utils/simple_initiator_socket.h @@ -17,300 +17,327 @@ *****************************************************************************/ -#ifndef TLM_UTILS_SIMPLE_INITIATOR_SOCKET_H_INCLUDED_ -#define TLM_UTILS_SIMPLE_INITIATOR_SOCKET_H_INCLUDED_ +#ifndef __SYSTEMC_EXT_TLM_UTILS_SIMPLE_INITIATOR_SOCKET_H__ +#define __SYSTEMC_EXT_TLM_UTILS_SIMPLE_INITIATOR_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 simple_initiator_socket_b - : public tlm::tlm_initiator_socket<BUSWIDTH, TYPES, 1, POL> - , protected simple_socket_base +template <typename MODULE, unsigned int BUSWIDTH, typename TYPES, + sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND> +class simple_initiator_socket_b : + public tlm::tlm_initiator_socket<BUSWIDTH, TYPES, 1, POL>, + protected simple_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_initiator_socket<BUSWIDTH,TYPES,1,POL> base_type; - -public: - static const char* default_name() - { return sc_core::sc_gen_unique_name("simple_initiator_socket"); } - - explicit simple_initiator_socket_b(const char* n = default_name()) - : base_type(n) - , m_process(this) - { - this->m_export.bind(m_process); - } - - void register_nb_transport_bw(MODULE* mod, - sync_enum_type (MODULE::*cb)(transaction_type&, - phase_type&, - sc_core::sc_time&)) - { - m_process.set_transport_ptr(mod, cb); - } - - void register_invalidate_direct_mem_ptr(MODULE* mod, - void (MODULE::*cb)(sc_dt::uint64, sc_dt::uint64)) - { - m_process.set_invalidate_direct_mem_ptr(mod, cb); - } - -private: - class process - : public tlm::tlm_bw_transport_if<TYPES> - , protected convenience_socket_cb_holder - { public: - typedef sync_enum_type (MODULE::*TransportPtr)(transaction_type&, - phase_type&, - sc_core::sc_time&); - typedef void (MODULE::*InvalidateDirectMemPtr)(sc_dt::uint64, - sc_dt::uint64); - - explicit process(simple_socket_base* owner) - : convenience_socket_cb_holder(owner), m_mod(0) - , m_transport_ptr(0) - , m_invalidate_direct_mem_ptr(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_initiator_socket<BUSWIDTH, TYPES, 1, POL> base_type; + + public: + static const char * + default_name() { + return sc_core::sc_gen_unique_name("simple_initiator_socket"); } - void set_transport_ptr(MODULE* mod, TransportPtr p) + explicit simple_initiator_socket_b(const char *n=default_name()) : + base_type(n), m_process(this) { - if (m_transport_ptr) { - display_warning("non-blocking callback already registered"); - return; - } - sc_assert(!m_mod || m_mod == mod); - m_mod = mod; - m_transport_ptr = p; + this->m_export.bind(m_process); } - void set_invalidate_direct_mem_ptr(MODULE* mod, InvalidateDirectMemPtr p) + void + register_nb_transport_bw(MODULE *mod, + sync_enum_type (MODULE::*cb)(transaction_type &, phase_type &, + sc_core::sc_time &)) { - if (m_invalidate_direct_mem_ptr) { - display_warning("invalidate DMI callback already registered"); - return; - } - sc_assert(!m_mod || m_mod == mod); - m_mod = mod; - m_invalidate_direct_mem_ptr = p; + m_process.set_transport_ptr(mod, cb); } - sync_enum_type nb_transport_bw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t) + void + register_invalidate_direct_mem_ptr(MODULE *mod, + void (MODULE::*cb)(sc_dt::uint64, sc_dt::uint64)) { - if (m_transport_ptr) { - // forward call - sc_assert(m_mod); - return (m_mod->*m_transport_ptr)(trans, phase, t); - } - display_error("no transport callback registered"); - return tlm::TLM_COMPLETED; + m_process.set_invalidate_direct_mem_ptr(mod, cb); } - void invalidate_direct_mem_ptr(sc_dt::uint64 start_range, - sc_dt::uint64 end_range) + private: + class process : public tlm::tlm_bw_transport_if<TYPES>, + protected convenience_socket_cb_holder { - if (m_invalidate_direct_mem_ptr) { - // forward call - sc_assert(m_mod); - (m_mod->*m_invalidate_direct_mem_ptr)(start_range, end_range); - } - } + public: + typedef sync_enum_type (MODULE::*TransportPtr)( + transaction_type &, phase_type &, sc_core::sc_time &); + typedef void (MODULE::*InvalidateDirectMemPtr)( + sc_dt::uint64, sc_dt::uint64); + + explicit process(simple_socket_base *owner) : + convenience_socket_cb_holder(owner), m_mod(0), + m_transport_ptr(0), m_invalidate_direct_mem_ptr(0) + {} + + void + set_transport_ptr(MODULE *mod, TransportPtr p) + { + if (m_transport_ptr) { + display_warning("non-blocking callback already registered"); + return; + } + sc_assert(!m_mod || m_mod == mod); + m_mod = mod; + m_transport_ptr = p; + } + + void + set_invalidate_direct_mem_ptr(MODULE *mod, InvalidateDirectMemPtr p) + { + if (m_invalidate_direct_mem_ptr) { + display_warning("invalidate DMI callback already registered"); + return; + } + sc_assert(!m_mod || m_mod == mod); + m_mod = mod; + m_invalidate_direct_mem_ptr = p; + } + + sync_enum_type + nb_transport_bw(transaction_type &trans, phase_type &phase, + sc_core::sc_time &t) + { + if (m_transport_ptr) { + // Forward call. + sc_assert(m_mod); + return (m_mod->*m_transport_ptr)(trans, phase, t); + } + display_error("no transport callback registered"); + return tlm::TLM_COMPLETED; + } + + void + invalidate_direct_mem_ptr(sc_dt::uint64 start_range, + sc_dt::uint64 end_range) + { + if (m_invalidate_direct_mem_ptr) { + // Forward call. + sc_assert(m_mod); + (m_mod->*m_invalidate_direct_mem_ptr)( + start_range, end_range); + } + } + + private: + MODULE *m_mod; + TransportPtr m_transport_ptr; + InvalidateDirectMemPtr m_invalidate_direct_mem_ptr; + }; + + private: + const sc_core::sc_object *get_socket() const { return this; } private: - MODULE* m_mod; - TransportPtr m_transport_ptr; - InvalidateDirectMemPtr m_invalidate_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 simple_initiator_socket - : public simple_initiator_socket_b<MODULE,BUSWIDTH,TYPES> +template <typename MODULE, unsigned int BUSWIDTH=32, + typename TYPES=tlm::tlm_base_protocol_types> +class simple_initiator_socket : + public simple_initiator_socket_b<MODULE, BUSWIDTH, TYPES> { - typedef simple_initiator_socket_b<MODULE,BUSWIDTH,TYPES> socket_b; -public: - simple_initiator_socket() : socket_b() {} - explicit simple_initiator_socket(const char* name) : socket_b(name) {} + typedef simple_initiator_socket_b<MODULE, BUSWIDTH, TYPES> socket_b; + public: + simple_initiator_socket() : socket_b() {} + explicit simple_initiator_socket(const char *name) : socket_b(name) {} }; -template< typename MODULE, unsigned int BUSWIDTH = 32 - , typename TYPES = tlm::tlm_base_protocol_types > -class simple_initiator_socket_optional - : public simple_initiator_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 simple_initiator_socket_optional : + public simple_initiator_socket_b<MODULE, BUSWIDTH, TYPES, + sc_core::SC_ZERO_OR_MORE_BOUND> { - typedef simple_initiator_socket_b<MODULE,BUSWIDTH,TYPES,sc_core::SC_ZERO_OR_MORE_BOUND> socket_b; -public: - simple_initiator_socket_optional() : socket_b() {} - explicit simple_initiator_socket_optional(const char* name) : socket_b(name) {} + typedef simple_initiator_socket_b< + MODULE, BUSWIDTH, TYPES, sc_core::SC_ZERO_OR_MORE_BOUND> socket_b; + public: + simple_initiator_socket_optional() : socket_b() {} + explicit simple_initiator_socket_optional(const char *name) : + socket_b(name) + {} }; // Tagged version -template< typename MODULE, unsigned int BUSWIDTH, typename TYPES - , sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND > -class simple_initiator_socket_tagged_b - : public tlm::tlm_initiator_socket<BUSWIDTH, TYPES, 1, POL> - , protected simple_socket_base +template <typename MODULE, unsigned int BUSWIDTH, typename TYPES, + sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND> +class simple_initiator_socket_tagged_b : + public tlm::tlm_initiator_socket<BUSWIDTH, TYPES, 1, POL>, + protected simple_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_initiator_socket<BUSWIDTH,TYPES,1,POL> base_type; - -public: - static const char* default_name() - { return sc_core::sc_gen_unique_name("simple_initiator_socket_tagged"); } - - explicit simple_initiator_socket_tagged_b(const char* n = default_name()) - : base_type(n) - , m_process(this) - { - this->m_export.bind(m_process); - } - - void register_nb_transport_bw(MODULE* mod, - sync_enum_type (MODULE::*cb)(int, - transaction_type&, - phase_type&, - sc_core::sc_time&), - int id) - { - m_process.set_transport_ptr(mod, cb); - m_process.set_transport_user_id(id); - } - - void register_invalidate_direct_mem_ptr(MODULE* mod, - void (MODULE::*cb)(int, sc_dt::uint64, sc_dt::uint64), - int id) - { - m_process.set_invalidate_direct_mem_ptr(mod, cb); - m_process.set_invalidate_dmi_user_id(id); - } - -private: - class process - : public tlm::tlm_bw_transport_if<TYPES> - , protected convenience_socket_cb_holder - { public: - typedef sync_enum_type (MODULE::*TransportPtr)(int, - transaction_type&, - phase_type&, - sc_core::sc_time&); - typedef void (MODULE::*InvalidateDirectMemPtr)(int, - sc_dt::uint64, - sc_dt::uint64); - - explicit process(simple_socket_base* owner) - : convenience_socket_cb_holder(owner), m_mod(0) - , m_transport_ptr(0) - , m_invalidate_direct_mem_ptr(0) - , m_transport_user_id(0) - , m_invalidate_direct_mem_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_initiator_socket<BUSWIDTH, TYPES, 1, POL> base_type; + + public: + static const char * + default_name() { + return sc_core::sc_gen_unique_name("simple_initiator_socket_tagged"); } - void set_transport_user_id(int id) { m_transport_user_id = id; } - void set_invalidate_dmi_user_id(int id) { m_invalidate_direct_mem_user_id = id; } - - void set_transport_ptr(MODULE* mod, TransportPtr p) + explicit simple_initiator_socket_tagged_b(const char *n=default_name()) : + base_type(n), m_process(this) { - if (m_transport_ptr) { - display_warning("non-blocking callback already registered"); - return; - } - sc_assert(!m_mod || m_mod == mod); - m_mod = mod; - m_transport_ptr = p; + this->m_export.bind(m_process); } - void set_invalidate_direct_mem_ptr(MODULE* mod, InvalidateDirectMemPtr p) + void + register_nb_transport_bw(MODULE *mod, + sync_enum_type (MODULE::*cb)( + int, transaction_type &, phase_type &, sc_core::sc_time &), + int id) { - if (m_invalidate_direct_mem_ptr) { - display_warning("invalidate DMI callback already registered"); - return; - } - sc_assert(!m_mod || m_mod == mod); - m_mod = mod; - m_invalidate_direct_mem_ptr = p; + m_process.set_transport_ptr(mod, cb); + m_process.set_transport_user_id(id); } - sync_enum_type nb_transport_bw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t) + void + register_invalidate_direct_mem_ptr(MODULE *mod, + void (MODULE::*cb)(int, sc_dt::uint64, sc_dt::uint64), int id) { - if (m_transport_ptr) { - // forward call - sc_assert(m_mod); - return (m_mod->*m_transport_ptr)(m_transport_user_id, trans, phase, t); - } - display_error("no transport callback registered"); - return tlm::TLM_COMPLETED; + m_process.set_invalidate_direct_mem_ptr(mod, cb); + m_process.set_invalidate_dmi_user_id(id); } - void invalidate_direct_mem_ptr(sc_dt::uint64 start_range, - sc_dt::uint64 end_range) + private: + class process : public tlm::tlm_bw_transport_if<TYPES>, + protected convenience_socket_cb_holder { - if (m_invalidate_direct_mem_ptr) { - // forward call - sc_assert(m_mod); - (m_mod->*m_invalidate_direct_mem_ptr)(m_invalidate_direct_mem_user_id, start_range, end_range); - } - } + public: + typedef sync_enum_type (MODULE::*TransportPtr)( + int, transaction_type &, phase_type &, sc_core::sc_time &); + typedef void (MODULE::*InvalidateDirectMemPtr)( + int, sc_dt::uint64, sc_dt::uint64); + + explicit process(simple_socket_base *owner) : + convenience_socket_cb_holder(owner), m_mod(0), + m_transport_ptr(0), m_invalidate_direct_mem_ptr(0), + m_transport_user_id(0), m_invalidate_direct_mem_user_id(0) + {} + + void set_transport_user_id(int id) { m_transport_user_id = id; } + void + set_invalidate_dmi_user_id(int id) + { + m_invalidate_direct_mem_user_id = id; + } + + void + set_transport_ptr(MODULE *mod, TransportPtr p) + { + if (m_transport_ptr) { + display_warning("non-blocking callback already registered"); + return; + } + sc_assert(!m_mod || m_mod == mod); + m_mod = mod; + m_transport_ptr = p; + } + + void + set_invalidate_direct_mem_ptr(MODULE *mod, InvalidateDirectMemPtr p) + { + if (m_invalidate_direct_mem_ptr) { + display_warning("invalidate DMI callback already registered"); + return; + } + sc_assert(!m_mod || m_mod == mod); + m_mod = mod; + m_invalidate_direct_mem_ptr = p; + } + + sync_enum_type + nb_transport_bw(transaction_type &trans, phase_type &phase, + sc_core::sc_time &t) + { + if (m_transport_ptr) { + // Forward call. + sc_assert(m_mod); + return (m_mod->*m_transport_ptr)( + m_transport_user_id, trans, phase, t); + } + display_error("no transport callback registered"); + return tlm::TLM_COMPLETED; + } + + void + invalidate_direct_mem_ptr( + sc_dt::uint64 start_range, sc_dt::uint64 end_range) + { + if (m_invalidate_direct_mem_ptr) { + // Forward call. + sc_assert(m_mod); + (m_mod->*m_invalidate_direct_mem_ptr)( + m_invalidate_direct_mem_user_id, + start_range, end_range); + } + } + + private: + MODULE *m_mod; + TransportPtr m_transport_ptr; + InvalidateDirectMemPtr m_invalidate_direct_mem_ptr; + int m_transport_user_id; + int m_invalidate_direct_mem_user_id; + }; private: - MODULE* m_mod; - TransportPtr m_transport_ptr; - InvalidateDirectMemPtr m_invalidate_direct_mem_ptr; - int m_transport_user_id; - int m_invalidate_direct_mem_user_id; - }; - -private: - const sc_core::sc_object* get_socket() const { return this; } -private: - process m_process; + const sc_core::sc_object *get_socket() const { return this; } + + private: + process m_process; }; -template< typename MODULE, unsigned int BUSWIDTH = 32 - , typename TYPES = tlm::tlm_base_protocol_types > -class simple_initiator_socket_tagged - : public simple_initiator_socket_tagged_b<MODULE,BUSWIDTH,TYPES> +template <typename MODULE, unsigned int BUSWIDTH=32, + typename TYPES=tlm::tlm_base_protocol_types> +class simple_initiator_socket_tagged : + public simple_initiator_socket_tagged_b<MODULE, BUSWIDTH, TYPES> { - typedef simple_initiator_socket_tagged_b<MODULE,BUSWIDTH,TYPES> socket_b; -public: - simple_initiator_socket_tagged() : socket_b() {} - explicit simple_initiator_socket_tagged(const char* name) : socket_b(name) {} + typedef simple_initiator_socket_tagged_b< + MODULE, BUSWIDTH, TYPES> socket_b; + public: + simple_initiator_socket_tagged() : socket_b() {} + explicit simple_initiator_socket_tagged(const char *name) : + socket_b(name) + {} }; -template< typename MODULE, unsigned int BUSWIDTH = 32 - , typename TYPES = tlm::tlm_base_protocol_types > -class simple_initiator_socket_tagged_optional - : public simple_initiator_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 simple_initiator_socket_tagged_optional : + public simple_initiator_socket_tagged_b<MODULE, BUSWIDTH, TYPES, + sc_core::SC_ZERO_OR_MORE_BOUND> { - typedef simple_initiator_socket_tagged_b<MODULE,BUSWIDTH,TYPES,sc_core::SC_ZERO_OR_MORE_BOUND> socket_b; -public: - simple_initiator_socket_tagged_optional() : socket_b() {} - explicit simple_initiator_socket_tagged_optional(const char* name) : socket_b(name) {} + typedef simple_initiator_socket_tagged_b< + MODULE, BUSWIDTH, TYPES, sc_core::SC_ZERO_OR_MORE_BOUND> socket_b; + public: + simple_initiator_socket_tagged_optional() : socket_b() {} + explicit simple_initiator_socket_tagged_optional(const char *name) : + socket_b(name) + {} }; } // namespace tlm_utils -#endif // TLM_UTILS_SIMPLE_INITIATOR_SOCKET_H_INCLUDED_ + +#endif /* __SYSTEMC_EXT_TLM_UTILS_SIMPLE_INITIATOR_SOCKET_H__ */ |