scc 2025.09
SystemC components library
vcd_mt_trace.hh
1/*******************************************************************************
2 * Copyright 2021 MINRES Technologies GmbH
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *******************************************************************************/
16
17#ifndef SCC_VCD_MT_TRACE_H
18#define SCC_VCD_MT_TRACE_H
19
20#include <deque>
21#include <functional>
22#include <scc/observer.h>
23#include <sysc/kernel/sc_ver.h>
24#include <sysc/tracing/sc_trace.h>
25#include <util/thread_pool.h>
26#include <vector>
27
28namespace sc_core {
29class sc_time;
30}
36namespace scc {
37namespace trace {
38class vcd_trace;
39class gz_writer;
40} // namespace trace
41struct vcd_mt_trace_file : public sc_core::sc_trace_file, public observer {
42
43 vcd_mt_trace_file(const char* name, std::function<bool()>& enable);
44
45 virtual ~vcd_mt_trace_file();
46
47protected:
48#define DECL_TRACE_METHOD_A(tp) void trace(const tp& object, const std::string& name) override;
49#define DECL_TRACE_METHOD_B(tp) void trace(const tp& object, const std::string& name, int width) override;
50#if(SYSTEMC_VERSION >= 20171012) || defined(NCSC)
51 DECL_TRACE_METHOD_A(sc_core::sc_event)
52 DECL_TRACE_METHOD_A(sc_core::sc_time)
53#endif
54 DECL_TRACE_METHOD_A(bool)
55 DECL_TRACE_METHOD_A(sc_dt::sc_bit)
56 DECL_TRACE_METHOD_A(sc_dt::sc_logic)
57 DECL_TRACE_METHOD_B(unsigned char)
58 DECL_TRACE_METHOD_B(unsigned short)
59 DECL_TRACE_METHOD_B(unsigned int)
60 DECL_TRACE_METHOD_B(unsigned long)
61#ifdef SYSTEMC_64BIT_PATCHES
62 DECL_TRACE_METHOD_B(unsigned long long)
63#endif
64 DECL_TRACE_METHOD_B(char)
65 DECL_TRACE_METHOD_B(short)
66 DECL_TRACE_METHOD_B(int)
67 DECL_TRACE_METHOD_B(long)
68 DECL_TRACE_METHOD_B(sc_dt::int64)
69 DECL_TRACE_METHOD_B(sc_dt::uint64)
70 DECL_TRACE_METHOD_A(float)
71 DECL_TRACE_METHOD_A(double)
72 DECL_TRACE_METHOD_A(sc_dt::sc_int_base)
73 DECL_TRACE_METHOD_A(sc_dt::sc_uint_base)
74 DECL_TRACE_METHOD_A(sc_dt::sc_signed)
75 DECL_TRACE_METHOD_A(sc_dt::sc_unsigned)
76 DECL_TRACE_METHOD_A(sc_dt::sc_fxval)
77 DECL_TRACE_METHOD_A(sc_dt::sc_fxval_fast)
78 DECL_TRACE_METHOD_A(sc_dt::sc_fxnum)
79 DECL_TRACE_METHOD_A(sc_dt::sc_fxnum_fast)
80 DECL_TRACE_METHOD_A(sc_dt::sc_bv_base)
81 DECL_TRACE_METHOD_A(sc_dt::sc_lv_base)
82#undef DECL_TRACE_METHOD_A
83#undef DECL_TRACE_METHOD_B
84
85 void trace(const unsigned int& object, const std::string& name, const char** enum_literals) override;
86
87#define DECL_REGISTER_METHOD_A(tp) observer::notification_handle* observe(tp const& o, std::string const& nm) override;
88#if(SYSTEMC_VERSION >= 20171012)
89 DECL_REGISTER_METHOD_A(sc_core::sc_event)
90 DECL_REGISTER_METHOD_A(sc_core::sc_time)
91#endif
92 DECL_REGISTER_METHOD_A(bool)
93 DECL_REGISTER_METHOD_A(sc_dt::sc_bit)
94 DECL_REGISTER_METHOD_A(sc_dt::sc_logic)
95
96 DECL_REGISTER_METHOD_A(unsigned char)
97 DECL_REGISTER_METHOD_A(unsigned short)
98 DECL_REGISTER_METHOD_A(unsigned int)
99 DECL_REGISTER_METHOD_A(unsigned long)
100 DECL_REGISTER_METHOD_A(char)
101 DECL_REGISTER_METHOD_A(short)
102 DECL_REGISTER_METHOD_A(int)
103 DECL_REGISTER_METHOD_A(long)
104 DECL_REGISTER_METHOD_A(sc_dt::int64)
105 DECL_REGISTER_METHOD_A(sc_dt::uint64)
106
107 DECL_REGISTER_METHOD_A(float)
108 DECL_REGISTER_METHOD_A(double)
109 DECL_REGISTER_METHOD_A(sc_dt::sc_int_base)
110 DECL_REGISTER_METHOD_A(sc_dt::sc_uint_base)
111 DECL_REGISTER_METHOD_A(sc_dt::sc_signed)
112 DECL_REGISTER_METHOD_A(sc_dt::sc_unsigned)
113
114 DECL_REGISTER_METHOD_A(sc_dt::sc_fxval)
115 DECL_REGISTER_METHOD_A(sc_dt::sc_fxval_fast)
116 DECL_REGISTER_METHOD_A(sc_dt::sc_fxnum)
117 DECL_REGISTER_METHOD_A(sc_dt::sc_fxnum_fast)
118
119 DECL_REGISTER_METHOD_A(sc_dt::sc_bv_base)
120 DECL_REGISTER_METHOD_A(sc_dt::sc_lv_base)
121#undef DECL_REGISTER_METHOD_A
122
123 // Output a comment to the trace file
124 void write_comment(const std::string& comment) override;
125
126 // Write trace info for cycle.
127 void cycle(bool delta_cycle) override;
128
129 void set_time_unit(double v, sc_core::sc_time_unit tu) override;
130
131private:
132#if WITH_SC_TRACING_PHASE_CALLBACKS
133 // avoid hidden overload warnings
134 virtual void trace(sc_trace_file*) const;
135#endif
136
137 void init();
138 std::string prune_name(std::string const& name);
139 std::string obtain_name();
140 std::function<bool()> check_enabled;
141 std::unique_ptr<trace::gz_writer> vcd_out{nullptr};
142 struct trace_entry : public observer::notification_handle {
143 bool (*compare_and_update)(trace::vcd_trace*);
144 trace::vcd_trace* trc;
145 vcd_mt_trace_file* that;
146 bool notify() override;
147 trace_entry(vcd_mt_trace_file* owner, bool (*compare_and_update)(trace::vcd_trace*), trace::vcd_trace* trc)
148 : compare_and_update{compare_and_update}
149 , trc{trc}
150 , that{owner} {}
151 virtual ~trace_entry() {}
152 };
153 std::deque<trace_entry> all_traces;
154 std::vector<trace_entry> active_traces;
155 std::vector<trace::vcd_trace*> changed_traces;
156 std::vector<trace::vcd_trace*> triggered_traces;
157 std::vector<trace::vcd_trace*> record_traces;
158 bool initialized{false};
159 unsigned vcd_name_index{0};
160 std::string name;
161 std::future<bool> res;
162};
163
164} // namespace scc // end of scc-sysc
166#endif // SCC_VCD_MT_TRACE_H
SCC SystemC tracing utilities.
Definition fst_trace.cpp:33
SCC TLM utilities.
A handle to be used be the observed object to notify the observer about a change.
Definition observer.h:57
The interface defining an observer.
Definition observer.h:53