* m4/gspnlib.m4: New file.

* configure.ac: Call AX_CHECK_GSPNLIB.
* Makefile.am (EXTRA_DIST): Add m4/gspnlib.m4.
* iface/gspn/Makefile.am (AM_CPPFLAGS): Add $(LIBGSPN_CPPFLAGS).
(libspotgspn_la_LIBADD, check_PROGRAMS, dottygspn_SOURCES,
dottygspn_LDADD): New variables.
* iface/gspn/gspn.hh (gspn_interface): New class.
(gspn_exeption): Take a string argument and adjust all callers.
(operator<<): Define for gspn_exeption.
* iface/gspn/gspn.cc (gspn_interface::gspn_interface,
gspn_interface::~gspn_interface): New.
* iface/gspn/gspnlib.h: Delete, it belongs to GSPN.
* iface/gspn/dottygspn.cc: New file.
This commit is contained in:
Alexandre Duret-Lutz 2003-07-16 12:56:38 +00:00
parent 49fd9579da
commit 4ac192ac1e
9 changed files with 137 additions and 120 deletions

View file

@ -1,3 +1,19 @@
2003-07-16 Alexandre Duret-Lutz <aduret@src.lip6.fr>
* m4/gspnlib.m4: New file.
* configure.ac: Call AX_CHECK_GSPNLIB.
* Makefile.am (EXTRA_DIST): Add m4/gspnlib.m4.
* iface/gspn/Makefile.am (AM_CPPFLAGS): Add $(LIBGSPN_CPPFLAGS).
(libspotgspn_la_LIBADD, check_PROGRAMS, dottygspn_SOURCES,
dottygspn_LDADD): New variables.
* iface/gspn/gspn.hh (gspn_interface): New class.
(gspn_exeption): Take a string argument and adjust all callers.
(operator<<): Define for gspn_exeption.
* iface/gspn/gspn.cc (gspn_interface::gspn_interface,
gspn_interface::~gspn_interface): New.
* iface/gspn/gspnlib.h: Delete, it belongs to GSPN.
* iface/gspn/dottygspn.cc: New file.
2003-07-15 Alexandre Duret-Lutz <aduret@src.lip6.fr> 2003-07-15 Alexandre Duret-Lutz <aduret@src.lip6.fr>
* m4/lbtt.m4 (AX_CHECK_LBTT): Set LBTT and LBTT_TRANSLATE * m4/lbtt.m4 (AX_CHECK_LBTT): Set LBTT and LBTT_TRANSLATE

View file

@ -8,4 +8,10 @@ endif WITH_INCLUDED_LBTT
SUBDIRS = $(MAYBE_BUDDY) $(MAYBE_LBTT) doc src wrap iface SUBDIRS = $(MAYBE_BUDDY) $(MAYBE_LBTT) doc src wrap iface
ACLOCAL_AMFLAGS = -I m4 ACLOCAL_AMFLAGS = -I m4
EXTRA_DIST = m4/gccwarn.m4 m4/pypath.m4 m4/buddy.m4 m4/lbtt.m4 HACKING EXTRA_DIST = \
m4/gccwarn.m4 \
m4/pypath.m4 \
m4/buddy.m4 \
m4/lbtt.m4 \
m4/gspnlib.m4 \
HACKING

View file

@ -14,6 +14,7 @@ AC_LANG(C++)
AX_CHECK_BUDDY AX_CHECK_BUDDY
AX_CHECK_LBTT AX_CHECK_LBTT
AX_CHECK_GSPNLIB
AC_PROG_LIBTOOL AC_PROG_LIBTOOL

View file

@ -1,8 +1,14 @@
AM_CPPFLAGS = -I$(top_srcdir)/src $(BUDDY_CPPFLAGS) AM_CPPFLAGS = -I$(top_srcdir)/src $(BUDDY_CPPFLAGS) $(LIBGSPN_CPPFLAGS)
AM_CXXFLAGS = $(WARNING_CXXFLAGS) AM_CXXFLAGS = $(WARNING_CXXFLAGS)
lib_LTLIBRARIES = libspotgspn.la lib_LTLIBRARIES = libspotgspn.la
libspotgspn_la_LIBADD = $(top_builddir)/src/libspot.la
libspotgspn_la_SOURCES = \ libspotgspn_la_SOURCES = \
gspn.hh \ gspn.hh \
gspn.cc \ gspn.cc \
gspnlib.h gspnlib.h
check_PROGRAMS = dottygspn
dottygspn_SOURCES = dottygspn.cc
dottygspn_LDADD = libspotgspn.la $(LIBGSPN_LDFLAGS)

26
iface/gspn/dottygspn.cc Normal file
View file

@ -0,0 +1,26 @@
#include "gspn.hh"
#include "tgbaalgos/dotty.hh"
int
main(int argc, char **argv)
try
{
spot::gspn_interface gspn(argc, argv);
spot::gspn_environment env;
env.declare("obs");
spot::bdd_dict* dict = new spot::bdd_dict();
spot::tgba_gspn a(dict, env);
spot::dotty_reachable(std::cout, &a);
delete dict;
}
catch (spot::gspn_exeption e)
{
std::cerr << e << std::endl;
throw;
}

View file

@ -8,6 +8,21 @@
namespace spot namespace spot
{ {
gspn_interface::gspn_interface(int argc, char **argv)
{
int res = initialize(argc, argv);
if (res)
throw gspn_exeption("initialize()", res);
}
gspn_interface::~gspn_interface()
{
int res = finalize();
if (res)
throw gspn_exeption("finalize()", res);
}
// tgba_gspn_private_ // tgba_gspn_private_
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
@ -36,11 +51,11 @@ namespace spot
AtomicProp index; AtomicProp index;
int err = prop_index(i->first.c_str(), &index); int err = prop_index(i->first.c_str(), &index);
if (err) if (err)
throw gspn_exeption(err); throw gspn_exeption("prop_index()", err);
AtomicPropKind kind; AtomicPropKind kind;
err = prop_kind(index, &kind); err = prop_kind(index, &kind);
if (err) if (err)
throw gspn_exeption(err); throw gspn_exeption("prop_kind()", err);
prop_dict[index] = ab_pair(kind, bdd_ithvar(var)); prop_dict[index] = ab_pair(kind, bdd_ithvar(var));
} }
@ -97,7 +112,8 @@ namespace spot
{ {
const state_gspn* o = dynamic_cast<const state_gspn*>(other); const state_gspn* o = dynamic_cast<const state_gspn*>(other);
assert(o); assert(o);
return o->get_state() - get_state(); return reinterpret_cast<char*>(o->get_state())
- reinterpret_cast<char*>(get_state());
} }
virtual state_gspn* clone() const virtual state_gspn* clone() const
@ -130,11 +146,9 @@ namespace spot
current_(0), current_(0),
data_(data) data_(data)
{ {
AtomicProp want[] = { EVENT_TRUE }; int res = succ(state, &successors_, &size_);
int res = succ(state, want, sizeof(want) / sizeof(*want),
&successors_, &size_);
if (res) if (res)
throw res; throw gspn_exeption("succ()", res);
assert(successors_); assert(successors_);
// GSPN is expected to return a looping "dead" transition where // GSPN is expected to return a looping "dead" transition where
// there is no successor, // there is no successor,
@ -278,7 +292,7 @@ namespace spot
State s; State s;
int err = initial_state(&s); int err = initial_state(&s);
if (err) if (err)
throw gspn_exeption(err); throw gspn_exeption("initial_state()", err);
return new state_gspn(s); return new state_gspn(s);
} }
@ -293,7 +307,7 @@ namespace spot
int res = satisfy(s->get_state(), int res = satisfy(s->get_state(),
data_->all_indexes, &cube, data_->index_count); data_->all_indexes, &cube, data_->index_count);
if (res) if (res)
throw res; throw gspn_exeption("satisfy()", res);
assert(cube); assert(cube);
bdd state_conds = bddtrue; bdd state_conds = bddtrue;
for (size_t i = 0; i < data_->index_count; ++i) for (size_t i = 0; i < data_->index_count; ++i)

View file

@ -4,6 +4,7 @@
// Try not to include gspnlib.h here, or it will polute the user's // Try not to include gspnlib.h here, or it will polute the user's
// namespace with internal C symbols. // namespace with internal C symbols.
# include <iostream>
# include <string> # include <string>
# include "tgba/tgba.hh" # include "tgba/tgba.hh"
# include "ltlast/atomic_prop.hh" # include "ltlast/atomic_prop.hh"
@ -12,24 +13,46 @@
namespace spot namespace spot
{ {
class gspn_interface
{
public:
gspn_interface(int argc, char **argv);
~gspn_interface();
tgba* get_automata();
};
/// An exeption used to forward GSPN errors. /// An exeption used to forward GSPN errors.
class gspn_exeption class gspn_exeption
{ {
public: public:
gspn_exeption(int err) gspn_exeption(const std::string& where, int err)
: err(err) : err_(err), where_(where)
{ {
} }
int int
get_err() const get_err() const
{ {
return err; return err_;
} }
std::string
get_where() const
{
return where_;
}
private: private:
int err; int err_;
std::string where_;
}; };
std::ostream& operator<<(std::ostream& os, const gspn_exeption& e)
{
os << e.get_where() << " exited with " << e.get_err();
return os;
}
class gspn_environment : public ltl::environment class gspn_environment : public ltl::environment
{ {

View file

@ -1,104 +0,0 @@
#ifndef __GSPN_LIB_H__
#define __GSPN_LIB_H__
/* Header file defining functions for Spot API */
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
/* -------------- Interface type definitions -------------- */
typedef unsigned long AtomicProp;
typedef AtomicProp * pAtomicProp;
typedef enum {STATE_PROP,EVENT_PROP} AtomicPropKind;
typedef AtomicPropKind * pAtomicPropKind;
typedef unsigned long State;
typedef State * pState;
typedef struct EventPropSucc {
State s;
AtomicProp p;
} EventPropSucc;
#define EVENT_TRUE 0
/* ----------------- Utility Functions --------------------*/
/* Initialize data structures to work with model and properties
MANDATORY : should be called before any other function in this library
Non 0 return correspond to errors in initialization
Call with arguments similar to WNRG/WNSRG/WNERG
*/
int initialize (int argc, char **argv);
/* Close and cleanup after using the library */
int finalize (void);
/* ----------------- Property related Functions ----------------*/
/* Returns the index of the property given as "name"
Non zero return = error codes */
int prop_index (const char * name, pAtomicProp propindex);
/* Returns the type of "prop" in "kind"
non zero return = error codes
*/
int prop_kind (const AtomicProp prop, pAtomicPropKind kind);
/* ------------------ State Space Exploration -----------------*/
/* Returns the identifier of the initial marking state */
int initial_state (pState M0);
/* Given a state "s" and a list of "props_size" property indexes
"props" checks the truth value of every atomic property in "props"
and returns in "truth" the truth value of these properties in the
same order as the input, ONE CHAR PER TRUTH VALUE
(i.e. sizeof(truth[]) = props_size).
NB : the vector "truth" is allocated in this function
*/
int satisfy (const State s, const AtomicProp props [],
unsigned char ** truth, size_t props_size);
/* free the "truth" vector allocated by satisfy
!!! NB: Don't forget to call me, or you will get a memory leak !!!
*/
int satisfy_free (unsigned char * truth);
/* Calculates successors of a state "s" that can be reached by
verifying at least one event property specified in
"enabled_events". In our first implementation enabled events is
discarded, and ALL successors will be returned. This behavior is
also obtained by giving "TRUE" in the list of enabled events. Each
successor is returned in a struct that gives the Event property
verified by the transition fired to reach this marking; If a
marking is reached by firing a transition observed by more than one
event property, it will be returned in many copies: i.e. E1 and E2
observe different firngs of transition t1; M1 is reached from M0
by firing t1 with a binding observable by both E1 and E2 : succ
(M0, [E1,E2] , ...) will return {[M1,E1],[M1,E2]}
NB : "succ" vector is allocated in the function, use succ_free for
memory release
*/
int succ (const State s,
const AtomicProp enabled_events [], size_t enabled_events_size,
EventPropSucc ** succ, size_t * succ_size);
/* free the "succ" vector allocated by succ
!!! NB: Don't forget to call me, or you will get a memory leak !!!
*/
int succ_free (EventPropSucc * succ);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __GSPN_LIB_H__ */

29
m4/gspnlin.m4 Normal file
View file

@ -0,0 +1,29 @@
AC_DEFUN([AX_CHECK_GSPNLIB], [
AC_ARG_WITH([gspn],
[AC_HELP_STRING([--with-gpsn=/root/of/greatspn],
[build interface with GreadSPN])])
if test x${with_gspn-no} != xno; then
ax_tmp_LDFLAGS=$LDFLAGS
ax_tmp_LIBS=$LIBS
LIBGSPN_LDFLAGS=
if test x${with_gspn-yes} != xyes; then
# Try to locate the headers and libraries.
gspn_version_sh=$with_gspn/SOURCES/contrib/version.sh;
AC_CHECK_FILE($gspn_version_sh,,
[AC_MSG_ERROR(
[Cannot find $gspn_version_sh. Check --with-gspn's argument.])])
gspn_version=`$gspn_version_sh`
LIBGSPN_LDFLAGS="-L$with_gspn/$gspn_version/2bin/lib"
LIBGSPN_CPPFLAGS="-I$with_gspn/SOURCES/WN/INCLUDE"
fi
LDFLAGS="$LDFLAGS $LIBGSPN_LDFLAGS"
AC_CHECK_LIB([gspnRG], [initialize], [],
[AC_MSG_ERROR([Cannot find libgspnRG. Check --with-gspn's argument.])], [-lm -lfl])
LIBGSPN_LDFLAGS="$LIBGSPN_LDFLAGS -lgspnRG -lm -lfl"
LDFLAGS="$ax_tmp_LDFLAGS"
LIBS="$ax_tmp_LIBS"
fi
AM_CONDITIONAL([WITH_GSPN], [test x${with_gspn+set} = xset])
AC_SUBST([LIBGSPN_CPPFLAGS])
AC_SUBST([LIBGSPN_LDFLAGS])
])