24
24
25
25
#include " ebmc_base.h"
26
26
#include " ebmc_error.h"
27
+ #include " waveform.h"
27
28
28
29
#include < algorithm>
29
30
#include < random>
@@ -48,7 +49,10 @@ class random_tracest
48
49
{
49
50
}
50
51
52
+ using outputt = enum { TRACE, WAVEFORM, VCD };
53
+
51
54
void operator ()(
55
+ outputt,
52
56
const optionalt<std::string> &outfile_prefix,
53
57
std::size_t random_seed,
54
58
std::size_t number_of_traces,
@@ -156,7 +160,80 @@ int random_traces(const cmdlinet &cmdline, message_handlert &message_handler)
156
160
get_transition_system (cmdline, message_handler);
157
161
158
162
random_tracest (transition_system, message_handler)(
159
- outfile_prefix, random_seed, number_of_traces, number_of_trace_steps);
163
+ outfile_prefix.has_value () ? random_tracest::VCD : random_tracest::TRACE,
164
+ outfile_prefix,
165
+ random_seed,
166
+ number_of_traces,
167
+ number_of_trace_steps);
168
+
169
+ return 0 ;
170
+ }
171
+
172
+ /* ******************************************************************\
173
+
174
+ Function: random_trace
175
+
176
+ Inputs:
177
+
178
+ Outputs:
179
+
180
+ Purpose:
181
+
182
+ \*******************************************************************/
183
+
184
+ int random_trace (const cmdlinet &cmdline, message_handlert &message_handler)
185
+ {
186
+ if (cmdline.isset (" number-of-traces" ))
187
+ throw ebmc_errort () << " must not give number-of-traces" ;
188
+
189
+ const std::size_t random_seed = [&cmdline]() -> std::size_t {
190
+ if (cmdline.isset (" random-seed" ))
191
+ {
192
+ auto random_seed_opt =
193
+ string2optional_size_t (cmdline.get_value (" random-seed" ));
194
+
195
+ if (!random_seed_opt.has_value ())
196
+ throw ebmc_errort () << " failed to parse random seed" ;
197
+
198
+ return random_seed_opt.value ();
199
+ }
200
+ else
201
+ return 0 ;
202
+ }();
203
+
204
+ const std::size_t number_of_trace_steps = [&cmdline]() -> std::size_t {
205
+ if (cmdline.isset (" trace-steps" ))
206
+ {
207
+ auto trace_steps_opt =
208
+ string2optional_size_t (cmdline.get_value (" trace-steps" ));
209
+
210
+ if (!trace_steps_opt.has_value ())
211
+ throw ebmc_errort () << " failed to parse number of trace steps" ;
212
+
213
+ return trace_steps_opt.value ();
214
+ }
215
+ else if (cmdline.isset (" bound" ))
216
+ {
217
+ auto bound_opt = string2optional_size_t (cmdline.get_value (" bound" ));
218
+
219
+ if (!bound_opt.has_value ())
220
+ throw ebmc_errort () << " failed to parse bound" ;
221
+
222
+ return bound_opt.value ();
223
+ }
224
+ else
225
+ return 10 ; // default
226
+ }();
227
+
228
+ transition_systemt transition_system =
229
+ get_transition_system (cmdline, message_handler);
230
+
231
+ if (cmdline.isset (" random-trace" ))
232
+ random_tracest (transition_system, message_handler)(
233
+ random_tracest::TRACE, {}, random_seed, 1 , number_of_trace_steps);
234
+ else if (cmdline.isset (" random-waveform" ))
235
+ random_tracest (transition_system, message_handler)(
236
+ random_tracest::WAVEFORM, {}, random_seed, 1 , number_of_trace_steps);
160
237
161
238
return 0 ;
162
239
}
@@ -182,7 +259,11 @@ void random_traces(
182
259
{
183
260
std::size_t random_seed = 0 ;
184
261
random_tracest (transition_system, message_handler)(
185
- outfile_prefix, random_seed, number_of_traces, number_of_trace_steps);
262
+ random_tracest::VCD,
263
+ outfile_prefix,
264
+ random_seed,
265
+ number_of_traces,
266
+ number_of_trace_steps);
186
267
}
187
268
188
269
/* ******************************************************************\
@@ -351,6 +432,7 @@ Function: random_tracest::operator()()
351
432
\*******************************************************************/
352
433
353
434
void random_tracest::operator ()(
435
+ outputt output,
354
436
const optionalt<std::string> &outfile_prefix,
355
437
std::size_t random_seed,
356
438
std::size_t number_of_traces,
@@ -403,8 +485,10 @@ void random_tracest::operator()(
403
485
{
404
486
auto trace = compute_trans_trace (
405
487
solver, number_of_timeframes, ns, transition_system.main_symbol ->name );
406
- if (outfile_prefix.has_value ())
488
+
489
+ if (output == VCD)
407
490
{
491
+ PRECONDITION (outfile_prefix.has_value ());
408
492
auto filename = outfile_prefix.value () + std::to_string (trace_nr + 1 );
409
493
std::ofstream out (widen_if_needed (filename));
410
494
@@ -415,11 +499,16 @@ void random_tracest::operator()(
415
499
416
500
show_trans_trace_vcd (trace, message, ns, out);
417
501
}
418
- else
502
+ else if (output == TRACE)
419
503
{
420
504
consolet::out () << " *** Trace " << (trace_nr + 1 ) << ' \n ' ;
421
505
show_trans_trace (trace, message, ns, consolet::out ());
422
506
}
507
+ else if (output == WAVEFORM)
508
+ {
509
+ consolet::out () << " *** Trace " << (trace_nr + 1 ) << ' \n ' ;
510
+ show_waveform (trace, ns);
511
+ }
423
512
}
424
513
break ;
425
514
0 commit comments