aboutsummaryrefslogtreecommitdiff
path: root/src/utils
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils')
-rw-r--r--src/utils/log.h32
-rw-r--r--src/utils/range.h25
-rw-r--r--src/utils/sysc.h24
-rw-r--r--src/utils/tlm_initiator_socket_tagged.h48
-rw-r--r--src/utils/tlm_target_socket_tagged.h69
-rw-r--r--src/utils/types.h11
6 files changed, 209 insertions, 0 deletions
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 <cstdio>
+
+#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 <cassert>
+
+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 <sysc/kernel/sc_module.h>
+#include <sysc/kernel/sc_simcontext.h>
+
+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 <tlm_core/tlm_2/tlm_sockets/tlm_initiator_socket.h>
+
+template <typename Module>
+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<tlm::tlm_bw_transport_if<>*>(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 <tlm_core/tlm_2/tlm_sockets/tlm_target_socket.h>
+
+template <typename Module>
+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<tlm::tlm_fw_transport_if<>*>(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 <cstdint>
+
+using u32 = std::uint32_t;
+using u64 = std::uint64_t;
+
+using usize = std::size_t;
+
+#endif