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