(tgba_bdd_concrete_factory::~tgba_bdd_concrete_factory): destroy the formulae used as keys in prom_. (tgba_bdd_concrete_factory::create_promise): Delete. (tgba_bdd_concrete_factory::declare_promise, tgba_bdd_concrete_factory::finish): New functions. * src/tgba/tgbabddconcretefactory.hh (tgba_bdd_concrete_factory::create_promise): Delete. (tgba_bdd_concrete_factory::declare_promise, tgba_bdd_concrete_factory::finish): New functions. (tgba_bdd_concrete_factory::prom_): New map. * src/tgba/ltl2tgba.cc (ltl_trad_visitor::visit): Adjust the Fx and aUb cases to register promises with tgba_bdd_concrete_factory::declare_promise(). (ltl2tgba): Call tgba_bdd_concrete_factory::finish().
116 lines
2.8 KiB
C++
116 lines
2.8 KiB
C++
#include "ltlvisit/clone.hh"
|
|
#include "ltlvisit/destroy.hh"
|
|
#include "tgbabddconcretefactory.hh"
|
|
|
|
namespace spot
|
|
{
|
|
tgba_bdd_concrete_factory::~tgba_bdd_concrete_factory()
|
|
{
|
|
promise_map_::iterator pi;
|
|
for (pi = prom_.begin(); pi != prom_.end(); ++pi)
|
|
destroy(pi->first);
|
|
}
|
|
|
|
int
|
|
tgba_bdd_concrete_factory::create_state(const ltl::formula* f)
|
|
{
|
|
// Do not build a state that already exists.
|
|
tgba_bdd_dict::fv_map::iterator sii = dict_.now_map.find(f);
|
|
if (sii != dict_.now_map.end())
|
|
return sii->second;
|
|
|
|
f = clone(f);
|
|
|
|
int num = create_pair();
|
|
dict_.now_map[f] = num;
|
|
dict_.now_formula_map[num] = f;
|
|
|
|
// Record that num+1 should be renamed as num when
|
|
// the next state becomes current.
|
|
bdd_setpair(data_.next_to_now, num + 1, num);
|
|
|
|
// Keep track of all "Now" variables for easy
|
|
// existential quantification.
|
|
data_.declare_now_next (ithvar(num), ithvar(num + 1));
|
|
return num;
|
|
}
|
|
|
|
int
|
|
tgba_bdd_concrete_factory::create_atomic_prop(const ltl::formula* f)
|
|
{
|
|
// Do not build a variable that already exists.
|
|
tgba_bdd_dict::fv_map::iterator sii = dict_.var_map.find(f);
|
|
if (sii != dict_.var_map.end())
|
|
return sii->second;
|
|
|
|
f = clone(f);
|
|
|
|
int num = create_node();
|
|
dict_.var_map[f] = num;
|
|
dict_.var_formula_map[num] = f;
|
|
|
|
// Keep track of all atomic proposition for easy
|
|
// existential quantification.
|
|
data_.declare_atomic_prop(ithvar(num));
|
|
return num;
|
|
}
|
|
|
|
void
|
|
tgba_bdd_concrete_factory::declare_promise(bdd b,
|
|
const ltl::formula* p)
|
|
{
|
|
// Maintain a disjunction of BDDs associated to P.
|
|
// We will latter (in tgba_bdd_concrete_factory::finish())
|
|
// record this disjunction as equivalant to P.
|
|
promise_map_::iterator pi = prom_.find(p);
|
|
if (pi == prom_.end())
|
|
{
|
|
p = clone(p);
|
|
prom_[p] = b;
|
|
}
|
|
else
|
|
{
|
|
pi->second |= b;
|
|
}
|
|
}
|
|
|
|
void
|
|
tgba_bdd_concrete_factory::finish()
|
|
{
|
|
promise_map_::iterator pi;
|
|
for (pi = prom_.begin(); pi != prom_.end(); ++pi)
|
|
{
|
|
// Register a BDD variable for this promise.
|
|
int p = create_node();
|
|
const ltl::formula* f = clone(pi->first); // The promised formula.
|
|
dict_.prom_map[f] = p;
|
|
dict_.prom_formula_map[p] = f;
|
|
|
|
bdd prom = ithvar(p);
|
|
// Keep track of all promises for easy existential quantification.
|
|
data_.declare_promise(prom);
|
|
|
|
// The promise P must hold if we have to verify any of the
|
|
// (BDD) formulae registered.
|
|
add_relation(bdd_apply(prom, pi->second, bddop_biimp));
|
|
}
|
|
}
|
|
|
|
const tgba_bdd_core_data&
|
|
tgba_bdd_concrete_factory::get_core_data() const
|
|
{
|
|
return data_;
|
|
}
|
|
|
|
const tgba_bdd_dict&
|
|
tgba_bdd_concrete_factory::get_dict() const
|
|
{
|
|
return dict_;
|
|
}
|
|
|
|
void
|
|
tgba_bdd_concrete_factory::add_relation(bdd new_rel)
|
|
{
|
|
data_.relation &= new_rel;
|
|
}
|
|
}
|