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.
This commit is contained in:
parent
543190f2bc
commit
bc5f13bb4e
57 changed files with 11464 additions and 3 deletions
104
iface/nips/nips_vm/nipsvm.c
Normal file
104
iface/nips/nips_vm/nipsvm.c
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
#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;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue