@@ -49,11 +49,8 @@ class random_tracest
49
49
{
50
50
}
51
51
52
- using outputt = enum { TRACE, WAVEFORM, VCD };
53
-
54
52
void operator ()(
55
- outputt,
56
- const std::optional<std::string> &outfile_prefix,
53
+ std::function<void (trans_tracet)> consumer,
57
54
std::size_t random_seed,
58
55
std::size_t number_of_traces,
59
56
std::size_t number_of_trace_steps);
@@ -161,16 +158,39 @@ int random_traces(const cmdlinet &cmdline, message_handlert &message_handler)
161
158
if (cmdline.isset (" waveform" ) && cmdline.isset (" vcd" ))
162
159
throw ebmc_errort () << " cannot do VCD and ASCII waveform simultaneously" ;
163
160
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
+ };
167
191
168
192
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);
174
194
175
195
return 0 ;
176
196
}
@@ -234,12 +254,21 @@ int random_trace(const cmdlinet &cmdline, message_handlert &message_handler)
234
254
transition_systemt transition_system =
235
255
get_transition_system (cmdline, message_handler);
236
256
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);
243
272
244
273
return 0 ;
245
274
}
@@ -264,12 +293,23 @@ void random_traces(
264
293
message_handlert &message_handler)
265
294
{
266
295
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
+
267
311
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);
273
313
}
274
314
275
315
/* ******************************************************************\
@@ -436,8 +476,7 @@ Function: random_tracest::operator()()
436
476
\*******************************************************************/
437
477
438
478
void random_tracest::operator ()(
439
- outputt output,
440
- const std::optional<std::string> &outfile_prefix,
479
+ std::function<void (trans_tracet)> consumer,
441
480
std::size_t random_seed,
442
481
std::size_t number_of_traces,
443
482
std::size_t number_of_trace_steps)
@@ -487,30 +526,7 @@ void random_tracest::operator()(
487
526
{
488
527
auto trace = compute_trans_trace (
489
528
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));
514
530
}
515
531
break ;
516
532
0 commit comments