From 19a5b01f0b2a4a3609a8a8ed32fba8dd376e1905 Mon Sep 17 00:00:00 2001 From: Johannes Stoelp Date: Fri, 27 Oct 2023 00:37:29 +0200 Subject: move utils into subfolder and different files --- src/utils/log.h | 32 +++++++++++++++ src/utils/range.h | 25 ++++++++++++ src/utils/sysc.h | 24 ++++++++++++ src/utils/tlm_initiator_socket_tagged.h | 48 +++++++++++++++++++++++ src/utils/tlm_target_socket_tagged.h | 69 +++++++++++++++++++++++++++++++++ src/utils/types.h | 11 ++++++ 6 files changed, 209 insertions(+) create mode 100644 src/utils/log.h create mode 100644 src/utils/range.h create mode 100644 src/utils/sysc.h create mode 100644 src/utils/tlm_initiator_socket_tagged.h create mode 100644 src/utils/tlm_target_socket_tagged.h create mode 100644 src/utils/types.h (limited to 'src/utils') diff --git a/src/utils/log.h b/src/utils/log.h new file mode 100644 index 0000000..49b7ca8 --- /dev/null +++ b/src/utils/log.h @@ -0,0 +1,32 @@ +#ifndef SYSC_PLAYGROUND_LOG +#define SYSC_PLAYGROUND_LOG + +#include + +#define LOG(FMT, ...) \ + do { \ + std::fprintf(stderr, "%10s | %4lld:%2lld | %16s | " FMT "\n", \ + sc_core::sc_time_stamp().to_string().c_str(), \ + sc_core::sc_delta_count(), \ + sc_core::sc_delta_count_at_current_time(), __FUNCTION__, \ + ##__VA_ARGS__); \ + } while (0) + +#define LOGM(FMT, ...) LOG("%12s | " FMT, name(), ##__VA_ARGS__) + +// -- COLOR LOGS --------------------------------------------------------------- + +#define RESET "\e[0m" +#define BLACK "\e[0;30m" +#define RED "\e[0;31m" +#define GREEN "\e[0;32m" +#define YELLOW "\e[0;33m" +#define BLUE "\e[0;34m" +#define MAGENTA "\e[0;35m" +#define CYAN "\e[0;36m" +#define WHITE "\e[0;37m" + +#define CLOG(COL, FMT, ...) LOG(COL FMT "\e[0m", ##__VA_ARGS__) +#define CLOGM(COL, FMT, ...) LOGM(COL FMT "\e[0m", ##__VA_ARGS__) + +#endif diff --git a/src/utils/range.h b/src/utils/range.h new file mode 100644 index 0000000..ce25298 --- /dev/null +++ b/src/utils/range.h @@ -0,0 +1,25 @@ +#ifndef SYSC_PLAYGROUND_RANGE +#define SYSC_PLAYGROUND_RANGE + +#include "utils/types.h" + +#include + +struct range { + constexpr explicit range(u64 start, u64 end) : start{start}, end{end} { + assert(start < end); + } + + constexpr bool overlaps(range rhs) const { + return start <= rhs.end && rhs.start <= end; + } + + constexpr bool contains(range rhs) const { + return start <= rhs.start && rhs.end <= end; + } + + u64 start; + u64 end; +}; + +#endif diff --git a/src/utils/sysc.h b/src/utils/sysc.h new file mode 100644 index 0000000..02ad412 --- /dev/null +++ b/src/utils/sysc.h @@ -0,0 +1,24 @@ +#ifndef SYSC_PLAYGROUND_SYSC +#define SYSC_PLAYGROUND_SYSC + +#include +#include + +struct scoped_push_hierarchy { + [[nodiscard]] explicit scoped_push_hierarchy(sc_core::sc_module& mod) + : m_mod(mod), m_simctx(sc_core::sc_get_curr_simcontext()) { + assert(m_simctx); + m_simctx->hierarchy_push(&m_mod); + } + + ~scoped_push_hierarchy() { + const auto* top = m_simctx->hierarchy_pop(); + assert(top == &m_mod); + } + + private: + sc_core::sc_simcontext* m_simctx{nullptr}; + sc_core::sc_module& m_mod; +}; + +#endif diff --git a/src/utils/tlm_initiator_socket_tagged.h b/src/utils/tlm_initiator_socket_tagged.h new file mode 100644 index 0000000..f85ed91 --- /dev/null +++ b/src/utils/tlm_initiator_socket_tagged.h @@ -0,0 +1,48 @@ +#ifndef SYSC_PLAYGROUND_TAGGED_INITIATOR +#define SYSC_PLAYGROUND_TAGGED_INITIATOR + +#include + +template +class tlm_initiator_socket_tagged : public tlm::tlm_initiator_socket<>, + public tlm::tlm_bw_transport_if<> { + using cb_invalidate_direct_mem_ptr = void (Module::*)(std::size_t, + sc_dt::uint64, + sc_dt::uint64); + + public: + explicit tlm_initiator_socket_tagged(const char* name, + std::size_t id, + Module* mod, + cb_invalidate_direct_mem_ptr i) + : tlm_initiator_socket<>{name}, + m_mod{mod}, + m_id{id}, + m_invalidate_direct_mem_ptr{i} { + bind(*static_cast*>(this)); + } + + private: + // -- TLM_BW_TRANSPORT_IF ---------------------------------------------------- + + virtual void invalidate_direct_mem_ptr(sc_dt::uint64 start, + sc_dt::uint64 end) override { + (m_mod->*m_invalidate_direct_mem_ptr)(m_id, start, end); + } + + virtual tlm::tlm_sync_enum nb_transport_bw(tlm::tlm_generic_payload&, + tlm::tlm_phase&, + sc_core::sc_time&) override { + std::fprintf( + stderr, "tlm_initiator_socket_tagged: nb_transport_bw not supported\n"); + std::abort(); + } + + // -- MEMBER ----------------------------------------------------------------- + + std::size_t m_id{0}; + Module* m_mod{nullptr}; + cb_invalidate_direct_mem_ptr m_invalidate_direct_mem_ptr{nullptr}; +}; + +#endif diff --git a/src/utils/tlm_target_socket_tagged.h b/src/utils/tlm_target_socket_tagged.h new file mode 100644 index 0000000..99ed547 --- /dev/null +++ b/src/utils/tlm_target_socket_tagged.h @@ -0,0 +1,69 @@ +#ifndef SYSC_PLAYGROUND_TAGGED_TARGET +#define SYSC_PLAYGROUND_TAGGED_TARGET + +#include + +template +class tlm_target_socket_tagged : public tlm::tlm_target_socket<>, + public tlm::tlm_fw_transport_if<> { + using cb_b_transport = void (Module::*)(std::size_t, + tlm::tlm_generic_payload&, + sc_core::sc_time&); + + using cb_get_direct_mem_ptr = bool (Module::*)(std::size_t, + tlm::tlm_generic_payload&, + tlm::tlm_dmi&); + using cb_transport_dbg = unsigned int (Module::*)(std::size_t, + tlm::tlm_generic_payload&); + + public: + explicit tlm_target_socket_tagged(const char* name, + std::size_t id, + Module* mod, + cb_b_transport b, + cb_get_direct_mem_ptr m, + cb_transport_dbg d) + : tlm_target_socket<>{name}, + m_mod{mod}, + m_id{id}, + m_b_transport{b}, + m_get_direct_mem_ptr{m}, + m_transport_dbg{d} { + bind(*static_cast*>(this)); + } + + private: + // -- TLM_FW_TRANSPORT_IF ---------------------------------------------------- + + virtual void b_transport(tlm::tlm_generic_payload& tx, + sc_core::sc_time& t) override { + return (m_mod->*m_b_transport)(m_id, tx, t); + } + + virtual bool get_direct_mem_ptr(tlm::tlm_generic_payload& tx, + tlm::tlm_dmi& dmi_data) override { + return (m_mod->*m_get_direct_mem_ptr)(m_id, tx, dmi_data); + } + + virtual unsigned int transport_dbg(tlm::tlm_generic_payload& tx) override { + return (m_mod->*m_transport_dbg)(m_id, tx); + } + + virtual tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload& tx, + tlm::tlm_phase& phase, + sc_core::sc_time& t) override { + std::fprintf(stderr, + "tlm_target_socket_tagged: nb_transport_fw not supported\n"); + std::abort(); + } + + // -- MEMBER ----------------------------------------------------------------- + + std::size_t m_id{0}; + Module* m_mod{nullptr}; + cb_b_transport m_b_transport{nullptr}; + cb_get_direct_mem_ptr m_get_direct_mem_ptr{nullptr}; + cb_transport_dbg m_transport_dbg{nullptr}; +}; + +#endif diff --git a/src/utils/types.h b/src/utils/types.h new file mode 100644 index 0000000..a13b8ef --- /dev/null +++ b/src/utils/types.h @@ -0,0 +1,11 @@ +#ifndef SYSC_PLAYGROUND_TYPES +#define SYSC_PLAYGROUND_TYPES + +#include + +using u32 = std::uint32_t; +using u64 = std::uint64_t; + +using usize = std::size_t; + +#endif -- cgit v1.2.3