diff options
Diffstat (limited to 'omega/omega_lib/include/omega/pres_form.h')
-rw-r--r-- | omega/omega_lib/include/omega/pres_form.h | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/omega/omega_lib/include/omega/pres_form.h b/omega/omega_lib/include/omega/pres_form.h new file mode 100644 index 0000000..ed3258e --- /dev/null +++ b/omega/omega_lib/include/omega/pres_form.h @@ -0,0 +1,112 @@ +#if ! defined _pres_form_h +#define _pres_form_h 1 + +#include <omega/pres_gen.h> + +namespace omega { + +typedef enum {Op_Relation, Op_Not, Op_And, Op_Or, + Op_Conjunct, Op_Forall, Op_Exists} Node_Type; + + +// +// Presburger Formula base class +// + +class Formula { +public: + virtual Node_Type node_type()=0; + + F_Forall *add_forall(); + F_Exists *add_exists(); + virtual F_And *and_with(); + F_And *add_and(); + F_Or *add_or(); + F_Not *add_not(); + void add_unknown(); + + virtual void finalize(); + virtual void print(FILE *output_file); + + Rel_Body *relation() { return myRelation; } + +protected: + virtual ~Formula(); +private: + Formula(Formula *, Rel_Body *); + + // The relational operations need to work with formula trees + friend class Relation; + friend_rel_ops; + // as do the functions that build DNF's + friend class DNF; + // or other parts of the tree + friend class Conjunct; + friend class F_Declaration; + friend class F_Exists; + friend class F_Forall; + friend class F_Or; + friend class F_And; + friend class F_Not; + friend class Rel_Body; + + + // Operations needed for manipulation of formula trees: + + void remove_child(Formula *); + void replace_child(Formula *child, Formula *new_child); + virtual bool can_add_child(); + void add_child(Formula *); + + Conjunct *add_conjunct(); + virtual Conjunct *find_available_conjunct() = 0; + + virtual Formula *copy(Formula *parent, Rel_Body *reln); + F_Exists *add_exists(Variable_ID_Tuple &S); + virtual void push_exists(Variable_ID_Tuple &S); + + // Accessor functions for tree building + + List<Formula*> &children() {return myChildren;} + int n_children() const {return myChildren.length();} + const List<Formula*> &get_children() const {return myChildren;} + Formula &parent() {return *myParent;} + void set_parent(Formula *p) {myParent = p;} + + + virtual int priority(); + + void verify_tree(); // should be const, but iterators are used + + virtual void reverse_leading_dir_info(); + virtual void invalidate_leading_info(int changed = -1); + virtual void enforce_leading_info(int guaranteed, int possible, int dir); + + virtual void remap(); + virtual DNF* DNFize() = 0; + virtual void beautify(); + virtual void rearrange(); + virtual void setup_names(); + + virtual void print_separator(FILE *output_file); + virtual void combine_columns(); + virtual void prefix_print(FILE *output_file, int debug = 1); + void print_head(FILE *output_file); + + void set_relation(Rel_Body *r); + void set_parent(Formula *parent, Rel_Body *reln); + + void assert_not_finalized(); + + virtual Conjunct *really_conjunct(); // until we get RTTI + +private: + List<Formula*> myChildren; + Formula *myParent; + Rel_Body *myRelation; + +}; + +} // namespace + +#endif |