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
|
// Collection of synchronisation states -*- c++ -*-
#ifndef SYNCSTATES_H_
# define SYNCSTATES_H_
# ifdef __GNUC__
# pragma interface
# endif // __GNUC__
# include <map>
# include <set>
# include "BitBuffer.h"
/** @file SyncStates.h
* Collection of synchronisation states for modular analysis
*/
/* Copyright 2002-2003 Marko Mkel (msmakela@tcs.hut.fi).
This file is part of MARIA, a reachability analyzer and model checker
for high-level Petri nets.
MARIA is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
MARIA is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
The GNU General Public License is often shipped with GNU software, and
is generally kept in a file called COPYING or LICENSE. If you do not
have a copy of the license, write to the Free Software Foundation,
59 Temple Place, Suite 330, Boston, MA 02111 USA. */
/** Collection of synchronisation states for modular analysis */
class SyncStates
{
public:
/** Map of synchronisation labels to label numbers */
typedef std::map<const class Transition*,unsigned> TransitionMap;
/** Comparison operator for encoded states */
struct ltstate
{
/** Less-than comparison
* @param s1 first state to be compared
* @param s2 second state to be compared
* @return true if s1 < s2
*/
bool operator() (const word_t* s1,
const word_t* s2) const {
return *s1 == *s2
? memcmp (s1 + 1, s2 + 1, *s1 * sizeof *s1)
: (*s1 < *s2);
}
};
/** Set of encoded states */
typedef std::set<word_t*,struct ltstate> StateSet;
# ifdef SYNC_CACHE
/** Map from (child,state) pairs to basic indexes to state sets */
typedef std::map<word_t*,unsigned,struct ltstate> StateMap;
# endif // SYNC_CACHE
/** Constructor
* @param net the net whose children are being synchronised
*/
SyncStates (const class Net& net);
private:
/** Copy constructor */
SyncStates (const class SyncStates& old);
/** Assignment operator */
class SyncStates& operator= (const class SyncStates& old);
public:
/** Destructor */
~SyncStates ();
# ifdef SYNC_CACHE
/** Look up the synchronisation states of a module at a specific state
* @param module the index of the module
* @param buf the encoded source state
* @param size length of the encoded state in words
* @return whether the state has been already explored
*/
bool lookup (unsigned module,
const word_t* buf,
word_t size);
# else // SYNC_CACHE
/** Clean up the set of synchronisation states and labels */
void cleanup ();
# endif // SYNC_CACHE
/** Add a synchronisation state
* @param transition the child transition
* @param buf the encoded source state
* @param size length of the encoded state in words
*/
void add (const class Transition& transition,
const word_t* buf,
word_t size);
/** Synchronise on a label
* @param m the source marking
* @param transition the synchronisation label
* @param reporter the interface for reporting successor states
*/
void sync (const class GlobalMarking& m,
const class Transition& transition,
class StateReporter& reporter) const;
# ifdef EXPR_COMPILE
/** Synchronise on a label
* @param transition the synchronisation label
* @param reporter the interface for reporting successor states
* @param srcs encoded inflated states (for restoring the state)
*/
void sync (const class Transition& transition,
class StateReporter& reporter,
word_t** srcs) const;
# endif // EXPR_COMPILE
private:
/** Number of modules */
const unsigned myNumModules;
/** Map from synchronisation labels to index numbers */
const TransitionMap myTransitionMap;
# ifdef SYNC_CACHE
/** Maps from states to myStateSet[] base indexes, indexed by module */
StateMap* myStateMap;
/** Sets of synchronisation states indexed by (src,child)+label numbers */
StateSet** myStateSet;
/** myStateSet[] base indexes corresponding to the current (child,src) */
unsigned* myStateIndex;
/** Used number of entries in myStateSet */
unsigned myStateUsed;
/** Allocated number of entries for myStateSet */
unsigned myStateAlloc;
# else // SYNC_CACHE
/** Sets of synchronisation states indexed by module+myNumModules*label */
StateSet** const myStateSet;
/** Enabled labels */
bool* const myEnabled;
# endif // SYNC_CACHE
# ifdef ADD_CACHE
/** Synchronisation states that have already been processed */
mutable class FullSet* mySync;
# endif // ADD_CACHE
};
#endif // SYNCSTATES_H_
|