summaryrefslogtreecommitdiff
path: root/ext/systemc/src/sysc/tracing/sc_vcd_trace.h
diff options
context:
space:
mode:
Diffstat (limited to 'ext/systemc/src/sysc/tracing/sc_vcd_trace.h')
-rw-r--r--ext/systemc/src/sysc/tracing/sc_vcd_trace.h228
1 files changed, 228 insertions, 0 deletions
diff --git a/ext/systemc/src/sysc/tracing/sc_vcd_trace.h b/ext/systemc/src/sysc/tracing/sc_vcd_trace.h
new file mode 100644
index 000000000..760949ffb
--- /dev/null
+++ b/ext/systemc/src/sysc/tracing/sc_vcd_trace.h
@@ -0,0 +1,228 @@
+/*****************************************************************************
+
+ Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
+ more contributor license agreements. See the NOTICE file distributed
+ with this work for additional information regarding copyright ownership.
+ Accellera licenses this file to you under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with the
+ License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied. See the License for the specific language governing
+ permissions and limitations under the License.
+
+ *****************************************************************************/
+
+/*****************************************************************************
+
+ sc_vcd_trace.h - Implementation of VCD tracing.
+
+ Original Author - Abhijit Ghosh, Synopsys, Inc.
+
+ *****************************************************************************/
+
+/*****************************************************************************
+
+ MODIFICATION LOG - modifiers, enter your name, affiliation, date and
+ changes you are making here.
+
+ Name, Affiliation, Date:
+ Description of Modification:
+
+ *****************************************************************************/
+
+/*****************************************************************************
+
+ Acknowledgement: The tracing mechanism is based on the tracing
+ mechanism developed at Infineon (formerly Siemens HL). Though this
+ code is somewhat different, and significantly enhanced, the basics
+ are identical to what was originally contributed by Infineon. The
+ contribution of Infineon in the development of this tracing
+ technology is hereby acknowledged.
+
+ *****************************************************************************/
+
+#ifndef SC_VCD_TRACE_H
+#define SC_VCD_TRACE_H
+
+#include "sysc/tracing/sc_trace_file_base.h"
+
+namespace sc_core {
+
+class vcd_trace; // defined in vcd_trace.cpp
+template<class T> class vcd_T_trace;
+
+
+// ----------------------------------------------------------------------------
+// CLASS : vcd_trace_file
+//
+// ...
+// ----------------------------------------------------------------------------
+
+class vcd_trace_file
+ : public sc_trace_file_base
+{
+public:
+
+ enum vcd_enum {VCD_WIRE=0, VCD_REAL=1, VCD_LAST};
+
+ // sc_set_vcd_time_unit is deprecated.
+#if 0 // deprecated
+ inline void sc_set_vcd_time_unit(int exponent10_seconds)
+ { set_time_unit(exponent10_seconds); }
+#endif
+
+ // Create a Vcd trace file.
+ // `Name' forms the base of the name to which `.vcd' is added.
+ vcd_trace_file(const char *name);
+
+ // Flush results and close file.
+ ~vcd_trace_file();
+
+protected:
+
+ // These are all virtual functions in sc_trace_file and
+ // they need to be defined here.
+
+ // Trace a boolean object (single bit)
+ void trace(const bool& object, const std::string& name);
+
+ // Trace a sc_bit object (single bit)
+ virtual void trace( const sc_dt::sc_bit& object,
+ const std::string& name);
+
+ // Trace a sc_logic object (single bit)
+ void trace(const sc_dt::sc_logic& object, const std::string& name);
+
+ // Trace an unsigned char with the given width
+ void trace(const unsigned char& object, const std::string& name,
+ int width);
+
+ // Trace an unsigned short with the given width
+ void trace(const unsigned short& object, const std::string& name,
+ int width);
+
+ // Trace an unsigned int with the given width
+ void trace(const unsigned int& object, const std::string& name,
+ int width);
+
+ // Trace an unsigned long with the given width
+ void trace(const unsigned long& object, const std::string& name,
+ int width);
+
+ // Trace a signed char with the given width
+ void trace(const char& object, const std::string& name, int width);
+
+ // Trace a signed short with the given width
+ void trace(const short& object, const std::string& name, int width);
+
+ // Trace a signed int with the given width
+ void trace(const int& object, const std::string& name, int width);
+
+ // Trace a signed long with the given width
+ void trace(const long& object, const std::string& name, int width);
+
+ // Trace an int64 with a given width
+ void trace(const sc_dt::int64& object, const std::string& name,
+ int width);
+
+ // Trace a uint64 with a given width
+ void trace(const sc_dt::uint64& object, const std::string& name,
+ int width);
+
+ // Trace a float
+ void trace(const float& object, const std::string& name);
+
+ // Trace a double
+ void trace(const double& object, const std::string& name);
+
+ // Trace sc_dt::sc_uint_base
+ void trace (const sc_dt::sc_uint_base& object,
+ const std::string& name);
+
+ // Trace sc_dt::sc_int_base
+ void trace (const sc_dt::sc_int_base& object,
+ const std::string& name);
+
+ // Trace sc_dt::sc_unsigned
+ void trace (const sc_dt::sc_unsigned& object,
+ const std::string& name);
+
+ // Trace sc_dt::sc_signed
+ void trace (const sc_dt::sc_signed& object, const std::string& name);
+
+ // Trace sc_dt::sc_fxval
+ void trace( const sc_dt::sc_fxval& object, const std::string& name );
+
+ // Trace sc_dt::sc_fxval_fast
+ void trace( const sc_dt::sc_fxval_fast& object,
+ const std::string& name );
+
+ // Trace sc_dt::sc_fxnum
+ void trace( const sc_dt::sc_fxnum& object, const std::string& name );
+
+ // Trace sc_dt::sc_fxnum_fast
+ void trace( const sc_dt::sc_fxnum_fast& object,
+ const std::string& name );
+
+ template<class T>
+ void traceT(const T& object, const std::string& name,
+ vcd_enum type=VCD_WIRE)
+ {
+ if( add_trace_check(name) )
+ traces.push_back(new vcd_T_trace<T>( object, name
+ , obtain_name(),type) );
+ }
+
+ // Trace sc_dt::sc_bv_base (sc_dt::sc_bv)
+ virtual void trace(const sc_dt::sc_bv_base& object,
+ const std::string& name);
+
+ // Trace sc_dt::sc_lv_base (sc_dt::sc_lv)
+ virtual void trace(const sc_dt::sc_lv_base& object,
+ const std::string& name);
+ // Trace an enumerated object - where possible output the enumeration literals
+ // in the trace file. Enum literals is a null terminated array of null
+ // terminated char* literal strings.
+ void trace(const unsigned& object, const std::string& name,
+ const char** enum_literals);
+
+ // Output a comment to the trace file
+ void write_comment(const std::string& comment);
+
+ // Write trace info for cycle.
+ void cycle(bool delta_cycle);
+
+private:
+
+#if SC_TRACING_PHASE_CALLBACKS_
+ // avoid hidden overload warnings
+ virtual void trace( sc_trace_file* ) const { sc_assert(false); }
+#endif // SC_TRACING_PHASE_CALLBACKS_
+
+ // Initialize the VCD tracing
+ virtual void do_initialize();
+
+ unsigned vcd_name_index; // Number of variables traced
+
+ unsigned previous_time_units_low; // Previous time unit as 64-bit integer
+ unsigned previous_time_units_high;
+
+public:
+
+ // Array to store the variables traced
+ std::vector<vcd_trace*> traces;
+
+ // Create VCD names for each variable
+ std::string obtain_name();
+
+};
+
+} // namespace sc_core
+
+#endif // SC_VCD_TRACE_H
+// Taf!