Skip to content

Commit 6341566

Browse files
authored
Merge pull request #369 from diffblue/numbered-trace
ebmc: traces with identifiers numbered with time frames
2 parents 0faf7ae + 9e5c3ed commit 6341566

File tree

8 files changed

+109
-1
lines changed

8 files changed

+109
-1
lines changed

regression/ebmc/traces/numbered1.desc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
CORE broken-smt-backend
2+
waveform1.smv
3+
--bound 20 --numbered-trace
4+
^EXIT=10$
5+
^SIGNAL=0$
6+
^\[smv::main::spec1\] .* REFUTED$
7+
^Counterexample:$
8+
^smv::main::var::y@0 = 0$
9+
^smv::main::var::y@10 = 100$
10+
^smv::main::var::y@20 = 200$
11+
--
12+
^warning: ignoring

regression/ebmc/traces/numbered1.smv

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
MODULE main
2+
3+
VAR x: 0..20;
4+
VAR y: 0..200;
5+
VAR z: 0..20;
6+
7+
INIT x=0
8+
INIT y=0
9+
INIT z=0
10+
11+
ASSIGN next(x):=x + 1;
12+
ASSIGN next(y):=y + 10;
13+
ASSIGN next(z):=z;
14+
15+
SPEC AG x!=20

src/ebmc/ebmc_parse_options.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,7 @@ void ebmc_parse_optionst::help()
359359
" {y--trace} \t generate a trace for failing properties\n"
360360
" {y--vcd} {ufile name} \t generate traces in VCD format\n"
361361
" {y--waveform} \t show a waveform for failing properties\n"
362+
" {y--numbered-trace} \t give a trace with identifiers numbered by timeframe\n"
362363
" {y--show-properties} \t list the properties in the model\n"
363364
" {y--property} {uid} \t check the property with given ID\n"
364365
" {y-I} {upath} \t set include path\n"

src/ebmc/ebmc_parse_options.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class ebmc_parse_optionst:public parse_options_baset
2828
"(show-ldg)(show-modules)(show-module-hierarchy)"
2929
"(show-trans)(show-bdds)(show-formula)"
3030
"(modules-xml):"
31-
"(show-properties)(property):p:(trace)(waveform)"
31+
"(show-properties)(property):p:(trace)(waveform)(numbered-trace)"
3232
"(dimacs)(module):(top):"
3333
"(po)(cegar)(k-induction)(2pi)(bound2):"
3434
"(outfile):(xml-ui)(verbosity):(gui)(json-result):"

src/ebmc/random_traces.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,12 @@ int random_traces(const cmdlinet &cmdline, message_handlert &message_handler)
179179
consolet::out() << "*** Trace " << (trace_nr + 1) << '\n';
180180
show_waveform(trace, ns);
181181
}
182+
else if(cmdline.isset("numbered-trace"))
183+
{
184+
consolet::out() << "*** Trace " << (trace_nr + 1) << '\n';
185+
messaget message(message_handler);
186+
show_trans_trace_numbered(trace, message, ns, consolet::out());
187+
}
182188
else // default
183189
{
184190
consolet::out() << "*** Trace " << (trace_nr + 1) << '\n';

src/ebmc/report_results.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,12 @@ void report_results(
129129
show_trans_trace(
130130
property.counterexample.value(), message, ns, std::cout);
131131
}
132+
else if(cmdline.isset("numbered-trace"))
133+
{
134+
message.status() << "Counterexample:\n" << messaget::eom;
135+
show_trans_trace_numbered(
136+
property.counterexample.value(), message, ns, std::cout);
137+
}
132138
else if(cmdline.isset("waveform"))
133139
{
134140
message.status() << "Counterexample:" << messaget::eom;

src/trans-netlist/trans_trace.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -811,3 +811,65 @@ void show_trans_trace_vcd(
811811
show_trans_state_vcd(t, trace.states[t-1], trace.states[t], ns, out);
812812
}
813813

814+
/*******************************************************************\
815+
816+
Function: show_trans_state_numbered
817+
818+
Inputs:
819+
820+
Outputs:
821+
822+
Purpose:
823+
824+
\*******************************************************************/
825+
826+
void show_trans_state_numbered(
827+
std::size_t timeframe,
828+
const trans_tracet::statet &state,
829+
const namespacet &ns)
830+
{
831+
for(const auto &a : state.assignments)
832+
{
833+
DATA_INVARIANT(
834+
a.lhs.id() == ID_symbol, "trace assignment lhs must be symbol");
835+
836+
const symbolt &symbol = ns.lookup(to_symbol_expr(a.lhs));
837+
838+
std::cout << symbol.display_name() << '@' << timeframe << " = ";
839+
840+
const exprt &rhs = a.rhs;
841+
842+
if(rhs.is_nil())
843+
std::cout << "?";
844+
else
845+
std::cout << from_expr(ns, symbol.name, rhs);
846+
847+
std::cout << '\n';
848+
}
849+
}
850+
851+
/*******************************************************************\
852+
853+
Function: show_trans_trace_numbered
854+
855+
Inputs:
856+
857+
Outputs:
858+
859+
Purpose:
860+
861+
\*******************************************************************/
862+
863+
void show_trans_trace_numbered(
864+
const trans_tracet &trace,
865+
messaget &message,
866+
const namespacet &ns,
867+
std::ostream &out)
868+
{
869+
PRECONDITION(!trace.states.empty());
870+
871+
auto l = trace.get_min_failing_timeframe().value_or(trace.states.size() - 1);
872+
873+
for(std::size_t t = 0; t <= l; t++)
874+
show_trans_state_numbered(t, trace.states[t], ns);
875+
}

src/trans-netlist/trans_trace.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,4 +88,10 @@ void show_trans_trace_vcd(
8888
const namespacet &,
8989
std::ostream &);
9090

91+
void show_trans_trace_numbered(
92+
const trans_tracet &,
93+
messaget &,
94+
const namespacet &,
95+
std::ostream &);
96+
9197
#endif

0 commit comments

Comments
 (0)