scc 2025.09
SystemC components library
vcd_push_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_PUSH_TRACE_H
18#define SCC_VCD_PUSH_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 <vector>
26
27namespace sc_core {
28class sc_time;
29}
35namespace scc {
36namespace trace {
37class vcd_trace;
38}
39struct vcd_push_trace_file : public sc_core::sc_trace_file, public observer {
40
41 vcd_push_trace_file(const char* name, std::function<bool()>& enable);
42
43 virtual ~vcd_push_trace_file();
44
45protected:
46#define DECL_TRACE_METHOD_A(tp) void trace(const tp& object, const std::string& name) override;
47#define DECL_TRACE_METHOD_B(tp) void trace(const tp& object, const std::string& name, int width) override;
48#if(SYSTEMC_VERSION >= 20171012) || defined(NCSC)
49 DECL_TRACE_METHOD_A(sc_core::sc_event)
50 DECL_TRACE_METHOD_A(sc_core::sc_time)
51#endif
52 DECL_TRACE_METHOD_A(bool)
53 DECL_TRACE_METHOD_A(sc_dt::sc_bit)
54 DECL_TRACE_METHOD_A(sc_dt::sc_logic)
55 DECL_TRACE_METHOD_B(unsigned char)
56 DECL_TRACE_METHOD_B(unsigned short)
57 DECL_TRACE_METHOD_B(unsigned int)
58 DECL_TRACE_METHOD_B(unsigned long)
59#ifdef SYSTEMC_64BIT_PATCHES
60 DECL_TRACE_METHOD_B(unsigned long long)
61#endif
62 DECL_TRACE_METHOD_B(char)
63 DECL_TRACE_METHOD_B(short)
64 DECL_TRACE_METHOD_B(int)
65 DECL_TRACE_METHOD_B(long)
66 DECL_TRACE_METHOD_B(sc_dt::int64)
67 DECL_TRACE_METHOD_B(sc_dt::uint64)
68 DECL_TRACE_METHOD_A(float)
69 DECL_TRACE_METHOD_A(double)
70 DECL_TRACE_METHOD_A(sc_dt::sc_int_base)
71 DECL_TRACE_METHOD_A(sc_dt::sc_uint_base)
72 DECL_TRACE_METHOD_A(sc_dt::sc_signed)
73 DECL_TRACE_METHOD_A(sc_dt::sc_unsigned)
74 DECL_TRACE_METHOD_A(sc_dt::sc_fxval)
75 DECL_TRACE_METHOD_A(sc_dt::sc_fxval_fast)
76 DECL_TRACE_METHOD_A(sc_dt::sc_fxnum)
77 DECL_TRACE_METHOD_A(sc_dt::sc_fxnum_fast)
78 DECL_TRACE_METHOD_A(sc_dt::sc_bv_base)
79 DECL_TRACE_METHOD_A(sc_dt::sc_lv_base)
80#undef DECL_TRACE_METHOD_A
81#undef DECL_TRACE_METHOD_B
82
83 void trace(const unsigned int& object, const std::string& name, const char** enum_literals) override;
84
85#define DECL_REGISTER_METHOD_A(tp) observer::notification_handle* observe(tp const& o, std::string const& nm) override;
86#if(SYSTEMC_VERSION >= 20171012)
87 DECL_REGISTER_METHOD_A(sc_core::sc_event)
88 DECL_REGISTER_METHOD_A(sc_core::sc_time)
89#endif
90 DECL_REGISTER_METHOD_A(bool)
91 DECL_REGISTER_METHOD_A(sc_dt::sc_bit)
92 DECL_REGISTER_METHOD_A(sc_dt::sc_logic)
93
94 DECL_REGISTER_METHOD_A(unsigned char)
95 DECL_REGISTER_METHOD_A(unsigned short)
96 DECL_REGISTER_METHOD_A(unsigned int)
97 DECL_REGISTER_METHOD_A(unsigned long)
98 DECL_REGISTER_METHOD_A(char)
99 DECL_REGISTER_METHOD_A(short)
100 DECL_REGISTER_METHOD_A(int)
101 DECL_REGISTER_METHOD_A(long)
102 DECL_REGISTER_METHOD_A(sc_dt::int64)
103 DECL_REGISTER_METHOD_A(sc_dt::uint64)
104
105 DECL_REGISTER_METHOD_A(float)
106 DECL_REGISTER_METHOD_A(double)
107 DECL_REGISTER_METHOD_A(sc_dt::sc_int_base)
108 DECL_REGISTER_METHOD_A(sc_dt::sc_uint_base)
109 DECL_REGISTER_METHOD_A(sc_dt::sc_signed)
110 DECL_REGISTER_METHOD_A(sc_dt::sc_unsigned)
111
112 DECL_REGISTER_METHOD_A(sc_dt::sc_fxval)
113 DECL_REGISTER_METHOD_A(sc_dt::sc_fxval_fast)
114 DECL_REGISTER_METHOD_A(sc_dt::sc_fxnum)
115 DECL_REGISTER_METHOD_A(sc_dt::sc_fxnum_fast)
116
117 DECL_REGISTER_METHOD_A(sc_dt::sc_bv_base)
118 DECL_REGISTER_METHOD_A(sc_dt::sc_lv_base)
119#undef DECL_REGISTER_METHOD_A
120
121 // Output a comment to the trace file
122 void write_comment(const std::string& comment) override;
123
124 // Write trace info for cycle.
125 void cycle(bool delta_cycle) override;
126
127 void set_time_unit(double v, sc_core::sc_time_unit tu) override;
128
129private:
130#if WITH_SC_TRACING_PHASE_CALLBACKS
131 // avoid hidden overload warnings
132 virtual void trace(sc_trace_file*) const;
133#endif
134
135 void init();
136 std::string prune_name(std::string const& name);
137 std::string obtain_name();
138 std::function<bool()> check_enabled;
139
140 FILE* vcd_out{nullptr};
141 struct trace_entry : public observer::notification_handle {
142 bool (*compare_and_update)(trace::vcd_trace*);
143 trace::vcd_trace* trc;
144 vcd_push_trace_file* that;
145 bool notify() override;
146 trace_entry(vcd_push_trace_file* owner, bool (*compare_and_update)(trace::vcd_trace*), trace::vcd_trace* trc)
147 : compare_and_update{compare_and_update}
148 , trc{trc}
149 , that{owner} {}
150 virtual ~trace_entry() {}
151 };
152 std::deque<trace_entry> all_traces;
153 std::vector<trace_entry*> pull_traces;
154 std::vector<trace::vcd_trace*> changed_traces;
155 std::vector<trace::vcd_trace*> triggered_traces;
156 uint64_t last_emitted_ts{std::numeric_limits<uint64_t>::max()};
157 unsigned vcd_name_index{0};
158 std::string name;
159};
160
161} // namespace scc // end of scc-sysc
163
164#endif // SCC_VCD_PUSH_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