* src/tgba/statebdd.hh (state_bdd::as_bdd): Add non-const variant.

* src/tgba/tgbabddtranslateproxy.cc,
src/tgba/tgbabddtranslateproxy.hh: New files.
* src/tgba/Makefile.am (libtgba_la_SOURCES): Add them.
This commit is contained in:
Alexandre Duret-Lutz 2003-05-28 15:13:56 +00:00
parent 4034f9a3d6
commit 331738d644
8 changed files with 226 additions and 9 deletions

View file

@ -1,3 +1,10 @@
2003-05-28 Alexandre Duret-Lutz <aduret@src.lip6.fr>
* src/tgba/statebdd.hh (state_bdd::as_bdd): Add non-const variant.
* src/tgba/tgbabddtranslateproxy.cc,
src/tgba/tgbabddtranslateproxy.hh: New files.
* src/tgba/Makefile.am (libtgba_la_SOURCES): Add them.
2003-05-27 Alexandre Duret-Lutz <aduret@src.lip6.fr>
* src/tgba/bddprint.cc, src/tgba/bddprint.hh,

View file

@ -31,4 +31,6 @@ libtgba_la_SOURCES = \
tgbabdddict.hh \
tgbabddfactory.hh \
tgbabddtranslatefactory.cc \
tgbabddtranslatefactory.hh
tgbabddtranslatefactory.hh \
tgbabddtranslateproxy.cc \
tgbabddtranslateproxy.hh

View file

@ -22,6 +22,13 @@ namespace spot
return state_;
}
/// Return the BDD part of the state.
bdd&
as_bdd()
{
return state_;
}
virtual int compare(const state* other) const;
protected:

View file

@ -0,0 +1,137 @@
#include "tgbabddtranslateproxy.hh"
#include "bddprint.hh"
namespace spot
{
// tgba_bdd_translate_proxy_succ_iterator
// --------------------------------------
tgba_bdd_translate_proxy_succ_iterator::
tgba_bdd_translate_proxy_succ_iterator(tgba_succ_iterator_concrete* it,
bddPair* rewrite)
: iter_(it), rewrite_(rewrite)
{
}
void
tgba_bdd_translate_proxy_succ_iterator::first()
{
iter_->first();
}
void
tgba_bdd_translate_proxy_succ_iterator::next()
{
iter_->next();
}
bool
tgba_bdd_translate_proxy_succ_iterator::done()
{
return iter_->done();
}
state_bdd*
tgba_bdd_translate_proxy_succ_iterator::current_state()
{
state_bdd* s = iter_->current_state();
s->as_bdd() = bdd_replace(s->as_bdd(), rewrite_);
return s;
}
bdd
tgba_bdd_translate_proxy_succ_iterator::current_condition()
{
return bdd_replace(iter_->current_condition(), rewrite_);
}
bdd
tgba_bdd_translate_proxy_succ_iterator::current_promise()
{
return bdd_replace(iter_->current_promise(), rewrite_);
}
// tgba_bdd_translate_proxy
// ------------------------
tgba_bdd_translate_proxy::tgba_bdd_translate_proxy(const tgba& from,
const tgba_bdd_dict& to)
: from_(from), to_(to)
{
const tgba_bdd_dict& f = from.get_dict();
rewrite_to_ = bdd_newpair();
rewrite_from_ = bdd_newpair();
tgba_bdd_dict::fv_map::const_iterator i_from;
tgba_bdd_dict::fv_map::const_iterator i_to;
for (i_from = f.now_map.begin(); i_from != f.now_map.end(); ++i_from)
{
i_to = to_.now_map.find(i_from->first);
assert(i_to != to_.now_map.end());
bdd_setpair(rewrite_to_, i_from->second, i_to->second);
bdd_setpair(rewrite_to_, i_from->second + 1, i_to->second + 1);
bdd_setpair(rewrite_from_, i_to->second, i_from->second);
bdd_setpair(rewrite_from_, i_to->second + 1, i_from->second + 1);
}
for (i_from = f.var_map.begin(); i_from != f.var_map.end(); ++i_from)
{
i_to = to_.var_map.find(i_from->first);
assert(i_to != to_.var_map.end());
bdd_setpair(rewrite_to_, i_from->second, i_to->second);
bdd_setpair(rewrite_from_, i_to->second, i_from->second);
}
for (i_from = f.prom_map.begin(); i_from != f.prom_map.end(); ++i_from)
{
i_to = to_.prom_map.find(i_from->first);
assert(i_to != to_.prom_map.end());
bdd_setpair(rewrite_to_, i_from->second, i_to->second);
bdd_setpair(rewrite_from_, i_to->second, i_from->second);
}
}
tgba_bdd_translate_proxy::~tgba_bdd_translate_proxy()
{
bdd_freepair(rewrite_from_);
bdd_freepair(rewrite_to_);
}
state_bdd*
tgba_bdd_translate_proxy::get_init_state() const
{
state_bdd* s = dynamic_cast<state_bdd*>(from_.get_init_state());
assert(s);
s->as_bdd() = bdd_replace(s->as_bdd(), rewrite_to_);
return s;
}
tgba_bdd_translate_proxy_succ_iterator*
tgba_bdd_translate_proxy::succ_iter(const state* state) const
{
const state_bdd* s = dynamic_cast<const state_bdd*>(state);
assert(s);
state_bdd s2(bdd_replace(s->as_bdd(), rewrite_from_));
tgba_succ_iterator_concrete* it =
dynamic_cast<tgba_succ_iterator_concrete*>(from_.succ_iter(&s2));
assert(it);
return new tgba_bdd_translate_proxy_succ_iterator(it, rewrite_to_);
}
const tgba_bdd_dict&
tgba_bdd_translate_proxy::get_dict() const
{
return to_;
}
std::string
tgba_bdd_translate_proxy::format_state(const state* state) const
{
const state_bdd* s = dynamic_cast<const state_bdd*>(state);
assert(s);
return bdd_format_set(to_, s->as_bdd());
}
}

View file

@ -0,0 +1,64 @@
#ifndef SPOT_TGBA_TGBABDDTRANSLATEPROXY_HH
# define SPOT_TGBA_TGBABDDTRANSLATEPROXY_HH
#include "tgba.hh"
#include "succiterconcrete.hh"
namespace spot
{
/// \brief Proxy for a spot::tgba_succ_iterator_concrete that renumber
/// BDD variables on the fly.
class tgba_bdd_translate_proxy_succ_iterator: public tgba_succ_iterator
{
public:
tgba_bdd_translate_proxy_succ_iterator
(tgba_succ_iterator_concrete* it, bddPair* rewrite);
// iteration
void first();
void next();
bool done();
// inspection
state_bdd* current_state();
bdd current_condition();
bdd current_promise();
protected:
tgba_succ_iterator_concrete* iter_;
bddPair* rewrite_;
};
/// \brief Proxy for a spot::tgba_bdd_concrete that renumber BDD variables
/// on the fly.
class tgba_bdd_translate_proxy: public tgba
{
public:
/// \brief Construcor.
/// \param from The spot::tgba to masquerade.
/// \param to The new dictionary to use.
tgba_bdd_translate_proxy(const tgba& from,
const tgba_bdd_dict& to);
virtual ~tgba_bdd_translate_proxy();
virtual state_bdd* get_init_state() const;
virtual tgba_bdd_translate_proxy_succ_iterator*
succ_iter(const state* state) const;
virtual const tgba_bdd_dict& get_dict() const;
virtual std::string
tgba_bdd_translate_proxy::format_state(const state* state) const;
private:
const tgba& from_; ///< The spot::tgba to masquerade.
tgba_bdd_dict to_; ///< The new dictionar to use.
bddPair* rewrite_to_; ///< The rewriting pair for from->to.
bddPair* rewrite_from_; ///< The rewriting pair for to->from.
};
}
#endif // SPOT_TGBA_TGBABDDTRANSLATEPROXY_HH