spot/iface/nips/nips_vm/nipsvm.c
Guillaume Sadegh bc5f13bb4e NIPS VM added to the SPOT distribution.
2008-05-29  Guillaume SADEGH  <sadegh@lrde.epita.fr>

	* iface/nips/nips.cc, iface/nips/nips.hh, iface/nips/common.cc,
	iface/nips/common.hh, iface/nips/Makefile.am: TGBA implementation
	with the NIPS library.
	* iface/nips/emptiness_check.cc: Emptiness check on a Promela
	interface.
	* iface/nips/dottynips.cc: Dot printer on the NIPS interface.
	* iface/nips/compile.sh: Add. Wrapper around nips compiler to
	compile Promela to NIPS bytecode.
	* iface/nips/nips_vm,iface/nips/nips_vm/bytecode.h,
	iface/nips/nips_vm/ChangeLog, iface/nips/nips_vm/COPYING,
	iface/nips/nips_vm/hashtab.c, iface/nips/nips_vm/hashtab.h,
	iface/nips/nips_vm/INSTALL, iface/nips/nips_vm/instr.c,
	iface/nips/nips_vm/instr.h, iface/nips/nips_vm/instr_step.c,
	iface/nips/nips_vm/instr_step.h,
	iface/nips/nips_vm/instr_tools.c,
	iface/nips/nips_vm/instr_tools.h,
	iface/nips/nips_vm/instr_wrap.c,
	iface/nips/nips_vm/instr_wrap.h,
	iface/nips/nips_vm/interactive.c,
	iface/nips/nips_vm/interactive.h, iface/nips/nips_vm/main.c,
	iface/nips/nips_vm/Makefile, iface/nips/nips_vm/Makefile.am,
	iface/nips/nips_vm/nips_asm_help.pl,
	iface/nips/nips_vm/nips_asm_instr.pl,
	iface/nips/nips_vm/nips_asm.pl,
	iface/nips/nips_vm/nips_disasm.pl, iface/nips/nips_vm/nipsvm.c,
	iface/nips/nips_vm/nipsvm.h, iface/nips/nips_vm/README,
	iface/nips/nips_vm/rt_err.c, iface/nips/nips_vm/rt_err.h,
	iface/nips/nips_vm/search.c, iface/nips/nips_vm/search.h,
	iface/nips/nips_vm/split.c, iface/nips/nips_vm/split.h,
	iface/nips/nips_vm/state.c, iface/nips/nips_vm/state.h,
	iface/nips/nips_vm/state_inline.h,
	iface/nips/nips_vm/state_parts.c,
	iface/nips/nips_vm/state_parts.h, iface/nips/nips_vm/timeval.h,
	iface/nips/nips_vm/tools.h: NIPS VM added to the SPOT
	distribution.
	* configure.ac, iface/Makefile.am: Build system updated for the
	NIPS front-end.
2008-05-30 13:22:00 +02:00

104 lines
2.6 KiB
C

#include <assert.h>
#include "bytecode.h"
#include "instr_step.h"
#include "nipsvm.h"
struct nipsvm_transition_information_t {
uint8_t label[2];
t_flag_reg flags[2];
unsigned int succ_cb_flags;
st_instr_succ_output *p_succ_out;
};
static et_ic_status
simple_scheduler_cb( st_global_state_header *succ,
uint8_t label_1st, uint8_t label,
t_flag_reg flag_reg_1st, t_flag_reg flag_reg,
unsigned int succ_cb_flags,
st_instr_succ_output *p_succ_out,
void *priv_context )
{
nipsvm_t *vm = (nipsvm_t *)priv_context;
nipsvm_transition_information_t transition_info = {
.label = { label_1st, label },
.flags = { flag_reg_1st, flag_reg },
.succ_cb_flags = succ_cb_flags,
.p_succ_out = p_succ_out,
};
return (*vm->callback)(nipsvm_state_size (succ), succ,
&transition_info, vm->callback_context);
}
static et_ic_status
simple_error_cb (et_instr_err err, t_pid pid, t_pc pc, void *priv_context)
{
nipsvm_t *vm = (nipsvm_t *)priv_context;
return (*vm->error_callback)(err, pid, pc, vm->callback_context);
}
extern int
nipsvm_module_init() { return 0; }
extern int
nipsvm_init (nipsvm_t *vm,
nipsvm_bytecode_t *bytecode,
nipsvm_scheduler_callback_t *s_callback,
nipsvm_error_callback_t *e_callback)
{
assert (vm != NULL);
vm->callback = s_callback;
vm->error_callback = e_callback != NULL ? e_callback : nipsvm_default_error_cb;
instr_succ_context_default (&vm->insn_context, bytecode);
vm->insn_context.priv_context = vm;
vm->insn_context.succ_cb = &simple_scheduler_cb;
vm->insn_context.err_cb = &simple_error_cb;
return 0;
}
extern void *
nipsvm_finalize (nipsvm_t *vm)
{
return vm;
}
extern unsigned int
nipsvm_scheduler_iter (nipsvm_t *vm,
nipsvm_state_t *state,
void *callback_context)
{
assert (vm != NULL);
vm->callback_context = callback_context;
return instr_succ (state, 0, &vm->insn_context);
}
extern nipsvm_state_t *
nipsvm_initial_state (nipsvm_t *vm)
{
assert (vm != NULL);
static char initial_state_buf[NIPSVM_INITIAL_STATE_SIZE];
char *buf = initial_state_buf;
unsigned long sz = sizeof initial_state_buf;
return global_state_initial (&buf, &sz);
}
// standard runtime error callback function
extern nipsvm_status_t
nipsvm_default_error_cb (nipsvm_errorcode_t err, nipsvm_pid_t pid,
nipsvm_pc_t pc, void *priv_context)
{
char str[256];
// print runtime error to stderr
nipsvm_errorstring (str, sizeof str, err, pid, pc);
fprintf (stderr, "RUNTIME ERROR: %s\n", str);
// do not try to find successor states
return IC_STOP;
// keep compiler happy
priv_context = NULL;
}