CBMC
Loading...
Searching...
No Matches
vcd_goto_trace.cpp
Go to the documentation of this file.
1/*******************************************************************\
2
3Module: Traces of GOTO Programs in VCD (Value Change Dump) Format
4
5Author: Daniel Kroening
6
7Date: June 2011
8
9\*******************************************************************/
10
13
14#include "vcd_goto_trace.h"
15
16#include <ctime>
17
18#include <util/arith_tools.h>
19#include <util/numbering.h>
21
22#include "goto_trace.h"
23
24std::string as_vcd_binary(
25 const exprt &expr,
26 const namespacet &ns)
27{
28 const typet &type = expr.type();
29
30 if(expr.is_constant())
31 {
32 if(type.id()==ID_unsignedbv ||
33 type.id()==ID_signedbv ||
34 type.id()==ID_bv ||
35 type.id()==ID_fixedbv ||
36 type.id()==ID_floatbv ||
37 type.id()==ID_pointer)
38 return expr.get_string(ID_value);
39 }
40 else if(expr.id()==ID_array)
41 {
42 std::string result;
43
44 for(const auto &op : expr.operands())
45 result += as_vcd_binary(op, ns);
46
47 return result;
48 }
49 else if(expr.id()==ID_struct)
50 {
51 std::string result;
52
53 for(const auto &op : expr.operands())
54 result += as_vcd_binary(op, ns);
55
56 return result;
57 }
58 else if(expr.id()==ID_union)
59 {
60 return as_vcd_binary(to_union_expr(expr).op(), ns);
61 }
62
63 // build "xxx"
64
65 const auto width = pointer_offset_bits(type, ns);
66
67 if(width.has_value())
68 return std::string(numeric_cast_v<std::size_t>(*width), 'x');
69 else
70 return "";
71}
72
74 const namespacet &ns,
76 std::ostream &out)
77{
78 time_t t;
79 time(&t);
80 out << "$date\n " << ctime(&t) << "$end" << "\n";
81
82 // this is pretty arbitrary
83 out << "$timescale 1 ns $end" << "\n";
84
85 // we first collect all variables that are assigned
86
88
89 for(const auto &step : goto_trace.steps)
90 {
91 if(step.is_assignment())
92 {
93 auto lhs_object=step.get_lhs_object();
94 if(lhs_object.has_value())
95 {
96 irep_idt identifier=lhs_object->get_identifier();
97 const typet &type=lhs_object->type();
98
99 const auto number=n.number(identifier);
100
101 const auto width = pointer_offset_bits(type, ns);
102
103 if(width.has_value() && (*width) >= 1)
104 out << "$var reg " << (*width) << " V" << number << " " << identifier
105 << " $end"
106 << "\n";
107 }
108 }
109 }
110
111 // end of header
112 out << "$enddefinitions $end" << "\n";
113
114 unsigned timestamp=0;
115
116 for(const auto &step : goto_trace.steps)
117 {
118 if(step.is_assignment())
119 {
120 auto lhs_object = step.get_lhs_object();
121 if(lhs_object.has_value())
122 {
123 irep_idt identifier = lhs_object->get_identifier();
124 const typet &type = lhs_object->type();
125
126 out << '#' << timestamp << "\n";
127 timestamp++;
128
129 const auto number = n.number(identifier);
130
131 // booleans are special in VCD
132 if(type.id() == ID_bool)
133 {
134 if(step.full_lhs_value.is_true())
135 out << "1"
136 << "V" << number << "\n";
137 else if(step.full_lhs_value.is_false())
138 out << "0"
139 << "V" << number << "\n";
140 else
141 out << "x"
142 << "V" << number << "\n";
143 }
144 else
145 {
146 std::string binary = as_vcd_binary(step.full_lhs_value, ns);
147
148 if(!binary.empty())
149 out << "b" << binary << " V" << number << " "
150 << "\n";
151 }
152 }
153 }
154 }
155}
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
Definition ai.h:562
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition dstring.h:38
Base class for all expressions.
Definition expr.h:56
bool is_constant() const
Return whether the expression is a constant.
Definition expr.h:212
typet & type()
Return the type of the expression.
Definition expr.h:84
operandst & operands()
Definition expr.h:94
Trace of a GOTO program.
Definition goto_trace.h:177
const irep_idt & id() const
Definition irep.h:388
const std::string & get_string(const irep_idt &name) const
Definition irep.h:401
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition namespace.h:91
The type of an expression, extends irept.
Definition type.h:29
Traces of GOTO Programs.
static std::string binary(const constant_exprt &src)
std::optional< mp_integer > pointer_offset_bits(const typet &type, const namespacet &ns)
Pointer Logic.
const union_exprt & to_union_expr(const exprt &expr)
Cast an exprt to a union_exprt.
Definition std_expr.h:1816
char * ctime(const time_t *clock)
Definition time.c:223
time_t time(time_t *tloc)
Definition time.c:13
std::string as_vcd_binary(const exprt &expr, const namespacet &ns)
void output_vcd(const namespacet &ns, const goto_tracet &goto_trace, std::ostream &out)
Traces of GOTO Programs in VCD (Value Change Dump) Format.