1/*========================================================================
2               Copyright (C) 1996-2001 by Jorn Lind-Nielsen
3                            All rights reserved
4
5    Permission is hereby granted, without written agreement and without
6    license or royalty fees, to use, reproduce, prepare derivative
7    works, distribute, and display this software and its documentation
8    for any purpose, provided that (1) the above copyright notice and
9    the following two paragraphs appear in all copies of the source code
10    and (2) redistributions, including without limitation binaries,
11    reproduce these notices in the supporting documentation. Substantial
12    modifications to this software may be copyrighted by their authors
13    and need not follow the licensing terms described here, provided
14    that the new terms are clearly indicated in all files where they apply.
15
16    IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS
17    SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
18    INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS
19    SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE
20    ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
21
22    JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING,
23    BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
24    FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
25    ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO
26    OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
27    MODIFICATIONS.
28========================================================================*/
29
30/*************************************************************************
31  $Header$
32  FILE:  fdd.h
33  DESCR: Finite domain data with BDDs
34  AUTH:  Jorn Lind
35  DATE:  (C) february 1999
36*************************************************************************/
37
38#ifndef _FDD_H
39#define _FDD_H
40
41#include "bdd.h"
42
43
44#ifdef CPLUSPLUS
45extern "C" {
46#endif
47
48/* In file fdd.c */
49
50extern int  fdd_extdomain(int*, int);
51extern int  fdd_overlapdomain(int, int);
52extern void fdd_clearall(void);
53extern int  fdd_domainnum(void);
54extern int  fdd_domainsize(int);
55extern int  fdd_varnum(int);
56extern int* fdd_vars(int);
57extern BDD  fdd_ithvar(int, int);
58extern int  fdd_scanvar(BDD, int);
59extern int* fdd_scanallvar(BDD);
60extern BDD  fdd_ithset(int);
61extern BDD  fdd_domain(int);
62extern BDD  fdd_equals(int, int);
63extern bddfilehandler fdd_file_hook(bddfilehandler);
64#ifdef CPLUSPLUS
65extern bddstrmhandler fdd_strm_hook(bddstrmhandler);
66#endif
67extern void fdd_printset(BDD);
68extern void fdd_fprintset(FILE*, BDD);
69extern int  fdd_scanset(BDD, int**, int*);
70extern BDD  fdd_makeset(int*, int);
71extern int  fdd_intaddvarblock(int, int, int);
72extern int  fdd_setpair(bddPair*, int, int);
73extern int  fdd_setpairs(bddPair*, int*, int*, int);
74
75#ifdef CPLUSPLUS
76}
77#endif
78
79/*************************************************************************
80   If this file is included from a C++ compiler then the following
81   classes, wrappers and hacks are supplied.
82*************************************************************************/
83#ifdef CPLUSPLUS
84
85   /* FDD extensions */
86
87inline bdd fdd_ithvarpp(int var, int val)
88{ return fdd_ithvar(var, val); }
89
90inline bdd fdd_ithsetpp(int var)
91{ return fdd_ithset(var); }
92
93inline bdd fdd_domainpp(int var)
94{ return fdd_domain(var); }
95
96inline int fdd_scanvar(const bdd &r, int var)
97{ return fdd_scanvar(r.root, var); }
98
99inline int* fdd_scanallvar(const bdd &r)
100{ return fdd_scanallvar(r.root); }
101
102inline bdd fdd_equalspp(int left, int right)
103{ return fdd_equals(left, right); }
104
105inline void fdd_printset(const bdd &r)
106{ fdd_printset(r.root); }
107
108inline void fdd_fprintset(FILE* ofile, const bdd &r)
109{ fdd_fprintset(ofile, r.root); }
110
111inline int fdd_scanset(const bdd &r, int *&v, int &n)
112{ return fdd_scanset(r.root, &v, &n); }
113
114inline bdd fdd_makesetpp(int *v, int n)
115{ return fdd_makeset(v,n); }
116
117#if 0
118inline bdd* fdd_conpp(int bitnum, int var)
119{ return fdd_transfer( bitnum, fdd_con(bitnum, var) ); }
120
121inline bdd* fdd_varpp(int bitnum, int var)
122{ return fdd_transfer( bitnum, fdd_var(bitnum, var) ); }
123
124extern int fdd_isconst(int bitnum, bdd *e);
125extern int fdd_val(int bitnum, bdd *e);
126
127inline bdd* fdd_add(int bitnum, bdd *left, bdd *right)
128{ return fdd_termopr(bitnum, left, right,bdd::fddAdd); }
129
130inline bdd* fdd_sub(int bitnum, bdd *left, bdd *right)
131{ return fdd_termopr(bitnum, left, right,bdd::fddSub); }
132
133inline bdd* fdd_shl(int bitnum, bdd *expr, bdd c)
134{ return fdd_shift(bitnum, expr, c, bdd::fddShl); }
135
136inline bdd* fdd_shr(int bitnum, bdd *expr, bdd c)
137{ return fdd_shift(bitnum, expr, c, bdd::fddShr); }
138
139inline bdd fdd_lth(int bitnum, bdd *left, bdd *right)
140{ return fdd_relopr(bitnum, left, right, bdd::fddLth); }
141
142inline bdd fdd_lte(int bitnum, bdd *left, bdd *right)
143{ return fdd_relopr(bitnum, left, right, bdd::fddLte); }
144
145inline bdd fdd_gth(int bitnum, bdd *left, bdd *right)
146{ return fdd_relopr(bitnum, left, right, bdd::fddGth); }
147
148inline bdd fdd_gte(int bitnum, bdd *left, bdd *right)
149{ return fdd_relopr(bitnum, left, right, bdd::fddGte); }
150
151inline bdd fdd_equ(int bitnum, bdd *left, bdd *right)
152{ return fdd_relopr(bitnum, left, right, bdd::fddEqu); }
153
154inline bdd fdd_neq(int bitnum, bdd *left, bdd *right)
155{ return fdd_relopr(bitnum, left, right, bdd::fddNeq); }
156#endif
157
158   /* Hacks to allow for overloading of return-types only */
159#define fdd_ithvar fdd_ithvarpp
160#define fdd_ithset fdd_ithsetpp
161#define fdd_domain fdd_domainpp
162#define fdd_equals fdd_equalspp
163#define fdd_makeset fdd_makesetpp
164#define fdd_con fdd_conpp
165#define fdd_var fdd_varpp
166
167
168#endif /* CPLUSPLUS */
169
170#endif /* _FDD_H */
171
172
173/* EOF */
174