1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
/*******************************************************************************/
/* Cruise controller */
/* Author: Peter Schrammel */
/*******************************************************************************/
/* modelled after */
/* Robert Bosch GmbH: Bosch Automotive Handbook. Bentley (2007) */
/* if you reuse this code, please cite also */
/* Peter Schrammel, Tom Melham, Daniel Kroening. Chaining Test Cases for
Reactive System Testing. In Testing Software and Systems
LNCS Volume 8254, 2013, pp 133-148 */
/*******************************************************************************/
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct state
{
int mode;
int speed;
int button;
} t_state;
#define I_BUTTON 1
#define I_ACC 2
#define I_DEC 3
#define I_GAS 4
#define I_BRAKE 5
typedef struct input
{
int signal;
} t_input;
void init(t_state *s)
{
s->mode = 0;
s->speed = 0;
s->button = 0;
}
void compute(t_input *i, t_state *s)
{
if((s->mode == 0) && (s->speed == 0) && (s->button == 0))
{
if((i->signal == I_ACC) || (i->signal == I_GAS))
s->speed = 1;
else if(i->signal == I_BUTTON)
s->button = 1;
}
else if((s->mode == 0) && (s->speed == 1) && (s->button == 0))
{
if((i->signal == I_BRAKE) || (i->signal == I_DEC))
s->speed = 0;
else if((i->signal == I_GAS) || (i->signal == I_ACC))
s->speed = 2;
else if(i->signal == I_BUTTON)
{
s->button = 1;
s->mode = 1;
}
}
else if((s->mode == 0) && (s->speed == 0) && (s->button == 1))
{
if((i->signal == I_GAS) || (i->signal == I_ACC))
{
s->speed = 1;
s->mode = 1;
}
else if(i->signal == I_BUTTON)
s->button = 0;
}
else if((s->mode == 1) && (s->speed == 1) && (s->button == 1))
{
if(i->signal == I_GAS)
{
s->speed = 2;
s->mode = 2;
}
else if(i->signal == I_BRAKE)
{
s->speed = 0;
s->mode = 2;
}
else if(i->signal == I_BUTTON)
{
s->mode = 0;
s->button = 0;
}
}
else if((s->mode == 2) && (s->speed == 2) && (s->button == 1))
{
if((i->signal == I_BRAKE) /*||(i->signal==I_DEC)*/)
{
s->speed = 1;
s->mode = 1;
}
else if(i->signal == I_BUTTON)
{
s->mode = 0;
s->button = 0;
}
}
else if((s->mode == 2) && (s->speed == 0) && (s->button == 1))
{
if((i->signal == I_GAS) || (i->signal == I_ACC))
{
s->speed = 1;
s->mode = 1;
}
else if(i->signal == I_BUTTON)
{
s->mode = 0;
s->button = 0;
}
}
else if((s->mode == 0) && (s->speed == 2) && (s->button == 0))
{
if((i->signal == I_BRAKE) || (i->signal == I_DEC))
s->speed = 1;
else if(i->signal == I_BUTTON)
s->button = 1;
}
else if((s->mode == 0) && (s->speed == 2) && (s->button == 1))
{
if((i->signal == I_BRAKE) || (i->signal == I_DEC))
{
s->speed = 1;
s->mode = 1;
}
else if(i->signal == I_BUTTON)
s->button = 0;
}
}
extern t_input nondet_input();
void main()
{
t_state s;
init(&s);
while(1)
{
t_input i = nondet_input();
__CPROVER_assume((1 <= i.signal) && (i.signal <= 5));
t_state s_old = s;
compute(&i, &s);
assert(
!(s_old.mode == 2 && s_old.speed == 2 && i.signal == I_DEC) ||
s.mode == 1);
}
}
|