Skip to content

Commit bacc62d

Browse files
authored
Merge pull request #345 from diffblue/random-traces-callback
random_tracest now offers callback
2 parents e41511b + a230106 commit bacc62d

File tree

2 files changed

+76
-49
lines changed

2 files changed

+76
-49
lines changed

src/ebmc/random_traces.cpp

Lines changed: 65 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,8 @@ class random_tracest
4949
{
5050
}
5151

52-
using outputt = enum { TRACE, WAVEFORM, VCD };
53-
5452
void operator()(
55-
outputt,
56-
const std::optional<std::string> &outfile_prefix,
53+
std::function<void(trans_tracet)> consumer,
5754
std::size_t random_seed,
5855
std::size_t number_of_traces,
5956
std::size_t number_of_trace_steps);
@@ -161,16 +158,39 @@ int random_traces(const cmdlinet &cmdline, message_handlert &message_handler)
161158
if(cmdline.isset("waveform") && cmdline.isset("vcd"))
162159
throw ebmc_errort() << "cannot do VCD and ASCII waveform simultaneously";
163160

164-
auto output = cmdline.isset("waveform") ? random_tracest::WAVEFORM
165-
: cmdline.isset("vcd") ? random_tracest::VCD
166-
: random_tracest::TRACE;
161+
auto consumer = [&, trace_nr = 0ull](trans_tracet trace) mutable -> void {
162+
namespacet ns(transition_system.symbol_table);
163+
if(cmdline.isset("vcd"))
164+
{
165+
PRECONDITION(outfile_prefix.has_value());
166+
auto filename = outfile_prefix.value() + std::to_string(trace_nr + 1);
167+
std::ofstream out(widen_if_needed(filename));
168+
169+
if(!out)
170+
throw ebmc_errort() << "failed to write trace to " << filename;
171+
172+
consolet::out() << "*** Writing " << filename << '\n';
173+
174+
messaget message(message_handler);
175+
show_trans_trace_vcd(trace, message, ns, out);
176+
}
177+
else if(cmdline.isset("waveform"))
178+
{
179+
consolet::out() << "*** Trace " << (trace_nr + 1) << '\n';
180+
show_waveform(trace, ns);
181+
}
182+
else // default
183+
{
184+
consolet::out() << "*** Trace " << (trace_nr + 1) << '\n';
185+
messaget message(message_handler);
186+
show_trans_trace(trace, message, ns, consolet::out());
187+
}
188+
189+
trace_nr++;
190+
};
167191

168192
random_tracest(transition_system, message_handler)(
169-
output,
170-
outfile_prefix,
171-
random_seed,
172-
number_of_traces,
173-
number_of_trace_steps);
193+
consumer, random_seed, number_of_traces, number_of_trace_steps);
174194

175195
return 0;
176196
}
@@ -234,12 +254,21 @@ int random_trace(const cmdlinet &cmdline, message_handlert &message_handler)
234254
transition_systemt transition_system =
235255
get_transition_system(cmdline, message_handler);
236256

237-
if(cmdline.isset("random-trace"))
238-
random_tracest(transition_system, message_handler)(
239-
random_tracest::TRACE, {}, random_seed, 1, number_of_trace_steps);
240-
else if(cmdline.isset("random-waveform"))
241-
random_tracest(transition_system, message_handler)(
242-
random_tracest::WAVEFORM, {}, random_seed, 1, number_of_trace_steps);
257+
auto consumer = [&](trans_tracet trace) -> void {
258+
namespacet ns(transition_system.symbol_table);
259+
if(cmdline.isset("random-waveform"))
260+
{
261+
show_waveform(trace, ns);
262+
}
263+
else // default
264+
{
265+
messaget message(message_handler);
266+
show_trans_trace(trace, message, ns, consolet::out());
267+
}
268+
};
269+
270+
random_tracest(transition_system, message_handler)(
271+
consumer, random_seed, 1, number_of_trace_steps);
243272

244273
return 0;
245274
}
@@ -264,12 +293,23 @@ void random_traces(
264293
message_handlert &message_handler)
265294
{
266295
std::size_t random_seed = 0;
296+
297+
auto consumer = [&, trace_nr = 0ull](trans_tracet trace) mutable -> void {
298+
namespacet ns(transition_system.symbol_table);
299+
auto filename = outfile_prefix + std::to_string(trace_nr + 1);
300+
std::ofstream out(widen_if_needed(filename));
301+
302+
if(!out)
303+
throw ebmc_errort() << "failed to write trace to " << filename;
304+
305+
messaget message(message_handler);
306+
show_trans_trace_vcd(trace, message, ns, out);
307+
308+
trace_nr++;
309+
};
310+
267311
random_tracest(transition_system, message_handler)(
268-
random_tracest::VCD,
269-
outfile_prefix,
270-
random_seed,
271-
number_of_traces,
272-
number_of_trace_steps);
312+
consumer, random_seed, number_of_traces, number_of_trace_steps);
273313
}
274314

275315
/*******************************************************************\
@@ -436,8 +476,7 @@ Function: random_tracest::operator()()
436476
\*******************************************************************/
437477

438478
void random_tracest::operator()(
439-
outputt output,
440-
const std::optional<std::string> &outfile_prefix,
479+
std::function<void(trans_tracet)> consumer,
441480
std::size_t random_seed,
442481
std::size_t number_of_traces,
443482
std::size_t number_of_trace_steps)
@@ -487,30 +526,7 @@ void random_tracest::operator()(
487526
{
488527
auto trace = compute_trans_trace(
489528
solver, number_of_timeframes, ns, transition_system.main_symbol->name);
490-
491-
if(output == VCD)
492-
{
493-
PRECONDITION(outfile_prefix.has_value());
494-
auto filename = outfile_prefix.value() + std::to_string(trace_nr + 1);
495-
std::ofstream out(widen_if_needed(filename));
496-
497-
if(!out)
498-
throw ebmc_errort() << "failed to write trace to " << filename;
499-
500-
consolet::out() << "*** Writing " << filename << '\n';
501-
502-
show_trans_trace_vcd(trace, message, ns, out);
503-
}
504-
else if(output == TRACE)
505-
{
506-
consolet::out() << "*** Trace " << (trace_nr + 1) << '\n';
507-
show_trans_trace(trace, message, ns, consolet::out());
508-
}
509-
else if(output == WAVEFORM)
510-
{
511-
consolet::out() << "*** Trace " << (trace_nr + 1) << '\n';
512-
show_waveform(trace, ns);
513-
}
529+
consumer(std::move(trace));
514530
}
515531
break;
516532

src/ebmc/random_traces.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Author: Daniel Kroening, [email protected]
99
#ifndef EBMC_RANDOM_TRACES_H
1010
#define EBMC_RANDOM_TRACES_H
1111

12+
#include <functional>
1213
#include <string>
1314

1415
class cmdlinet;
@@ -21,12 +22,22 @@ int random_traces(const cmdlinet &, message_handlert &);
2122
int random_trace(const cmdlinet &, message_handlert &);
2223

2324
class transition_systemt;
25+
class trans_tracet;
2426

27+
// many traces, VCD
2528
void random_traces(
2629
const transition_systemt &,
2730
const std::string &outfile_prefix,
2831
std::size_t number_of_traces,
2932
std::size_t number_of_trace_steps,
3033
message_handlert &);
3134

35+
// many traces, given to a callback
36+
void random_traces(
37+
const transition_systemt &,
38+
std::function<void(trans_tracet)> consumer,
39+
std::size_t number_of_traces,
40+
std::size_t number_of_trace_steps,
41+
message_handlert &);
42+
3243
#endif

0 commit comments

Comments
 (0)