Initial code for TGBA (Transition Generalized Bchi Automata).
Contains tgba_bdd, a BDD-encoded TGBA, and ltl_to_tgba, a LTL-to-TGBA translator using Couvreur's algorithm. * src/Makefile.am (SUBDIRS): Add tgba. (libspot_la_LIBADD): Add tgba/libtgba.la. * src/tgba/Makefile.am, src/tgba/bddfactory.cc, src/tgba/bddfactory.hh, src/tgba/dictunion.cc, src/tgba/dictunion.hh, src/tgba/ltl2tgba.cc, src/tgba/ltl2tgba.hh, src/tgba/state.hh, src/tgba/statebdd.cc, src/tgba/statebdd.hh, src/tgba/succiter.hh, src/tgba/succiterconcrete.cc, src/tgba/succiterconcrete.hh, src/tgba/succlist.hh, src/tgba/tgba.hh, src/tgba/tgbabddconcrete.cc, src/tgba/tgbabddconcrete.hh, src/tgba/tgbabddconcretefactory.cc, src/tgba/tgbabddconcretefactory.hh, src/tgba/tgbabddconcreteproduct.cc, src/tgba/tgbabddconcreteproduct.hh, src/tgba/tgbabddcoredata.cc, src/tgba/tgbabddcoredata.hh, src/tgba/tgbabdddict.cc, src/tgba/tgbabdddict.hh, src/tgba/tgbabddfactory.hh, src/tgba/tgbabddtranslatefactory.cc, src/tgba/tgbabddtranslatefactory.hh: New files.
This commit is contained in:
parent
5100c197a2
commit
c03934140f
32 changed files with 1263 additions and 2 deletions
75
src/tgba/dictunion.cc
Normal file
75
src/tgba/dictunion.cc
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
#include <set>
|
||||
#include "dictunion.hh"
|
||||
#include <bdd.h>
|
||||
|
||||
namespace spot
|
||||
{
|
||||
|
||||
tgba_bdd_dict
|
||||
tgba_bdd_dict_union(const tgba_bdd_dict& l, const tgba_bdd_dict& r)
|
||||
{
|
||||
tgba_bdd_dict res;
|
||||
|
||||
std::set<const ltl::formula*> now;
|
||||
std::set<const ltl::formula*> var;
|
||||
std::set<const ltl::formula*> prom;
|
||||
|
||||
tgba_bdd_dict::fv_map::const_iterator i;
|
||||
|
||||
// Merge Now variables.
|
||||
for (i = l.now_map.begin(); i != l.now_map.end(); ++i)
|
||||
now.insert(i->first);
|
||||
for (i = r.now_map.begin(); i != r.now_map.end(); ++i)
|
||||
now.insert(i->first);
|
||||
|
||||
// Merge atomic propositions.
|
||||
for (i = l.var_map.begin(); i != l.var_map.end(); ++i)
|
||||
var.insert(i->first);
|
||||
for (i = r.var_map.begin(); i != r.var_map.end(); ++i)
|
||||
var.insert(i->first);
|
||||
|
||||
// Merge promises.
|
||||
for (i = l.prom_map.begin(); i != l.prom_map.end(); ++i)
|
||||
prom.insert(i->first);
|
||||
for (i = r.prom_map.begin(); i != r.prom_map.end(); ++i)
|
||||
prom.insert(i->first);
|
||||
|
||||
// Ensure we have enough BDD variables.
|
||||
int have = bdd_extvarnum(0);
|
||||
int want = now.size() * 2 + var.size() + prom.size();
|
||||
if (have < want)
|
||||
bdd_setvarnum(want);
|
||||
|
||||
// Fill in the "defragmented" union dictionary.
|
||||
|
||||
// FIXME: Make some experiments with ordering of prom/var/now variables.
|
||||
// Maybe there is one order that usually produces smaller BDDs?
|
||||
|
||||
// Next BDD variable to use.
|
||||
int v = 0;
|
||||
|
||||
std::set<const ltl::formula*>::const_iterator f;
|
||||
for (f = prom.begin(); f != prom.end(); ++f)
|
||||
{
|
||||
res.prom_map[*f] = v;
|
||||
res.prom_formula_map[v] = *f;
|
||||
++v;
|
||||
}
|
||||
for (f = var.begin(); f != var.end(); ++f)
|
||||
{
|
||||
res.var_map[*f] = v;
|
||||
res.var_formula_map[v] = *f;
|
||||
++v;
|
||||
}
|
||||
for (f = now.begin(); f != now.end(); ++f)
|
||||
{
|
||||
res.now_map[*f] = v;
|
||||
res.now_formula_map[v] = *f;
|
||||
v += 2;
|
||||
}
|
||||
|
||||
assert (v == want);
|
||||
return res;
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue