1 | /****************************************************************************** |
---|
2 | |
---|
3 | PackageName [bdd] |
---|
4 | |
---|
5 | Synopsis [Package-independent BDD interface functions.] |
---|
6 | |
---|
7 | Description [] |
---|
8 | |
---|
9 | SeeAlso [] |
---|
10 | |
---|
11 | Author [Thomas R. Shiple. Modified by Rajeev K. Ranjan.] |
---|
12 | |
---|
13 | Copyright [Copyright (c) 1994-1996 The Regents of the Univ. of California. |
---|
14 | All rights reserved. |
---|
15 | |
---|
16 | Permission is hereby granted, without written agreement and without license |
---|
17 | or royalty fees, to use, copy, modify, and distribute this software and its |
---|
18 | documentation for any purpose, provided that the above copyright notice and |
---|
19 | the following two paragraphs appear in all copies of this software. |
---|
20 | |
---|
21 | IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR |
---|
22 | DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT |
---|
23 | OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF |
---|
24 | CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
---|
25 | |
---|
26 | THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, |
---|
27 | INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
---|
28 | FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN |
---|
29 | "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE |
---|
30 | MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.] |
---|
31 | |
---|
32 | Revision [$Id: bdd.h,v 1.79 2007/02/10 01:09:52 fabio Exp $] |
---|
33 | |
---|
34 | ******************************************************************************/ |
---|
35 | |
---|
36 | #ifndef _BDD_H |
---|
37 | #define _BDD_H |
---|
38 | #include "util.h" |
---|
39 | #include "array.h" |
---|
40 | #include "st.h" |
---|
41 | #include "var_set.h" |
---|
42 | #include "avl.h" |
---|
43 | #ifndef EPD_MAX_BIN |
---|
44 | #include "epd.h" |
---|
45 | #endif |
---|
46 | |
---|
47 | /*---------------------------------------------------------------------------*/ |
---|
48 | /* Constant declarations */ |
---|
49 | /*---------------------------------------------------------------------------*/ |
---|
50 | |
---|
51 | |
---|
52 | /*---------------------------------------------------------------------------*/ |
---|
53 | /* Type declarations */ |
---|
54 | /*---------------------------------------------------------------------------*/ |
---|
55 | typedef int boolean; |
---|
56 | typedef void bdd_manager; |
---|
57 | typedef unsigned int bdd_variableId; /* the id of the variable in a bdd node */ |
---|
58 | typedef void bdd_mgr_init; /* Typecasting to void to avoid error messages */ |
---|
59 | typedef int bdd_literal; /* integers in the set { 0, 1, 2 } */ |
---|
60 | typedef struct bdd_t bdd_t; |
---|
61 | typedef void bdd_node; |
---|
62 | typedef void bdd_gen; |
---|
63 | typedef struct bdd_external_hooks_struct bdd_external_hooks; |
---|
64 | typedef void bdd_block; |
---|
65 | typedef double BDD_VALUE_TYPE; |
---|
66 | |
---|
67 | /*---------------------------------------------------------------------------*/ |
---|
68 | /* Enumerated type declarations */ |
---|
69 | /*---------------------------------------------------------------------------*/ |
---|
70 | |
---|
71 | /* |
---|
72 | * Dynamic reordering. |
---|
73 | */ |
---|
74 | typedef enum { |
---|
75 | BDD_REORDER_SIFT, |
---|
76 | BDD_REORDER_WINDOW, |
---|
77 | BDD_REORDER_SAME, |
---|
78 | BDD_REORDER_RANDOM, |
---|
79 | BDD_REORDER_RANDOM_PIVOT, |
---|
80 | BDD_REORDER_SIFT_CONVERGE, |
---|
81 | BDD_REORDER_SYMM_SIFT, |
---|
82 | BDD_REORDER_SYMM_SIFT_CONV, |
---|
83 | BDD_REORDER_LINEAR, |
---|
84 | BDD_REORDER_LINEAR_CONVERGE, |
---|
85 | BDD_REORDER_EXACT, |
---|
86 | BDD_REORDER_WINDOW2, |
---|
87 | BDD_REORDER_WINDOW3, |
---|
88 | BDD_REORDER_WINDOW4, |
---|
89 | BDD_REORDER_WINDOW2_CONV, |
---|
90 | BDD_REORDER_WINDOW3_CONV, |
---|
91 | BDD_REORDER_WINDOW4_CONV, |
---|
92 | BDD_REORDER_GROUP_SIFT, |
---|
93 | BDD_REORDER_GROUP_SIFT_CONV, |
---|
94 | BDD_REORDER_ANNEALING, |
---|
95 | BDD_REORDER_GENETIC, |
---|
96 | BDD_REORDER_LAZY_SIFT, |
---|
97 | BDD_REORDER_NONE |
---|
98 | } bdd_reorder_type_t; |
---|
99 | |
---|
100 | typedef enum { |
---|
101 | CMU, |
---|
102 | CAL, |
---|
103 | CUDD |
---|
104 | } bdd_package_type_t; |
---|
105 | |
---|
106 | typedef enum { |
---|
107 | bdd_EMPTY, |
---|
108 | bdd_NONEMPTY |
---|
109 | } bdd_gen_status; |
---|
110 | |
---|
111 | typedef enum { |
---|
112 | BDD_PRE_GC_HOOK, |
---|
113 | BDD_POST_GC_HOOK, |
---|
114 | BDD_PRE_REORDERING_HOOK, |
---|
115 | BDD_POST_REORDERING_HOOK |
---|
116 | } bdd_hook_type_t; |
---|
117 | |
---|
118 | typedef enum { |
---|
119 | BDD_OVER_APPROX, |
---|
120 | BDD_UNDER_APPROX |
---|
121 | } bdd_approx_dir_t; |
---|
122 | |
---|
123 | typedef enum { |
---|
124 | BDD_CONJUNCTS, |
---|
125 | BDD_DISJUNCTS |
---|
126 | } bdd_partition_type_t; |
---|
127 | |
---|
128 | typedef enum { |
---|
129 | BDD_REORDER_VERBOSITY_DEFAULT, |
---|
130 | BDD_REORDER_NO_VERBOSITY, |
---|
131 | BDD_REORDER_VERBOSITY |
---|
132 | }bdd_reorder_verbosity_t; |
---|
133 | |
---|
134 | typedef enum { |
---|
135 | BDD_APPROX_HB, |
---|
136 | BDD_APPROX_SP, |
---|
137 | BDD_APPROX_COMP, |
---|
138 | BDD_APPROX_UA, |
---|
139 | BDD_APPROX_RUA, |
---|
140 | BDD_APPROX_BIASED_RUA |
---|
141 | } bdd_approx_type_t; |
---|
142 | |
---|
143 | |
---|
144 | /*---------------------------------------------------------------------------*/ |
---|
145 | /* Structure declarations */ |
---|
146 | /*---------------------------------------------------------------------------*/ |
---|
147 | struct bdd_external_hooks_struct { |
---|
148 | char *network; |
---|
149 | char *mdd; |
---|
150 | char *undef1; |
---|
151 | }; |
---|
152 | |
---|
153 | |
---|
154 | /*---------------------------------------------------------------------------*/ |
---|
155 | /* Variable declarations */ |
---|
156 | /*---------------------------------------------------------------------------*/ |
---|
157 | |
---|
158 | |
---|
159 | /*---------------------------------------------------------------------------*/ |
---|
160 | /* Macro declarations */ |
---|
161 | /*---------------------------------------------------------------------------*/ |
---|
162 | /* |
---|
163 | ** It is assumed that dynamic reordering will not occur while there are open |
---|
164 | ** generators. It is the user's responsibility to make sure dynamic |
---|
165 | ** reordering doesn't occur. As long as new nodes are not created during |
---|
166 | ** generation, and you don't explicitly call dynamic reordering, you should be |
---|
167 | ** okay. |
---|
168 | */ |
---|
169 | |
---|
170 | /* |
---|
171 | * foreach_bdd_cube(fn, gen, cube) |
---|
172 | * bdd_t *fn; |
---|
173 | * bdd_gen *gen; |
---|
174 | * array_t *cube; - return |
---|
175 | * |
---|
176 | * foreach_bdd_cube(fn, gen, cube) { |
---|
177 | * ... |
---|
178 | * } |
---|
179 | */ |
---|
180 | #define foreach_bdd_cube(fn, gen, cube)\ |
---|
181 | for((gen) = bdd_first_cube(fn, &cube);\ |
---|
182 | (bdd_gen_read_status(gen) != bdd_EMPTY) ? TRUE: bdd_gen_free(gen);\ |
---|
183 | (void) bdd_next_cube(gen, &cube)) |
---|
184 | |
---|
185 | /* |
---|
186 | * foreach_bdd_disjoint_cube(fn, gen, cube) |
---|
187 | * bdd_t *fn; |
---|
188 | * bdd_gen *gen; |
---|
189 | * array_t *cube; - return |
---|
190 | * |
---|
191 | * foreach_bdd_disjoint_cube(fn, gen, cube) { |
---|
192 | * ... |
---|
193 | * } |
---|
194 | */ |
---|
195 | #define foreach_bdd_disjoint_cube(fn, gen, cube)\ |
---|
196 | for((gen) = bdd_first_disjoint_cube(fn, &cube);\ |
---|
197 | (bdd_gen_read_status(gen) != bdd_EMPTY) ? TRUE: bdd_gen_free(gen);\ |
---|
198 | (void) bdd_next_disjoint_cube(gen, &cube)) |
---|
199 | |
---|
200 | /* |
---|
201 | * foreach_bdd_node(fn, gen, node) |
---|
202 | * bdd_t *fn; |
---|
203 | * bdd_gen *gen; |
---|
204 | * bdd_node *node; - return |
---|
205 | */ |
---|
206 | #define foreach_bdd_node(fn, gen, node)\ |
---|
207 | for((gen) = bdd_first_node(fn, &node);\ |
---|
208 | (bdd_gen_read_status(gen) != bdd_EMPTY) ? TRUE: bdd_gen_free(gen);\ |
---|
209 | (void) bdd_next_node(gen, &node)) |
---|
210 | |
---|
211 | |
---|
212 | /**AutomaticStart*************************************************************/ |
---|
213 | |
---|
214 | /*---------------------------------------------------------------------------*/ |
---|
215 | /* Function prototypes */ |
---|
216 | /*---------------------------------------------------------------------------*/ |
---|
217 | |
---|
218 | |
---|
219 | /**AutomaticEnd***************************************************************/ |
---|
220 | |
---|
221 | EXTERN bdd_package_type_t bdd_get_package_name ARGS((void)); |
---|
222 | |
---|
223 | /* |
---|
224 | * BDD Manager Allocation And Destruction |
---|
225 | */ |
---|
226 | EXTERN bdd_manager *bdd_start ARGS((int)); |
---|
227 | EXTERN void bdd_end ARGS((bdd_manager *)); |
---|
228 | |
---|
229 | /* |
---|
230 | * BDD variable management |
---|
231 | */ |
---|
232 | EXTERN bdd_t *bdd_create_variable ARGS((bdd_manager *)); |
---|
233 | EXTERN bdd_t *bdd_create_variable_after ARGS((bdd_manager *, bdd_variableId)); |
---|
234 | EXTERN bdd_t *bdd_get_variable ARGS((bdd_manager *, bdd_variableId)); |
---|
235 | EXTERN bdd_t *bdd_create_variable_after ARGS((bdd_manager *, bdd_variableId)); |
---|
236 | EXTERN bdd_t * bdd_var_with_index ARGS((bdd_manager *manager, int index)); |
---|
237 | EXTERN bdd_node *bdd_add_ith_var ARGS((bdd_manager *mgr, int i)); |
---|
238 | |
---|
239 | |
---|
240 | /* |
---|
241 | * BDD Formula Management |
---|
242 | */ |
---|
243 | EXTERN bdd_t *bdd_dup ARGS((bdd_t *)); |
---|
244 | EXTERN void bdd_free ARGS((bdd_t *)); |
---|
245 | |
---|
246 | /* |
---|
247 | * Operations on BDD Formulas |
---|
248 | */ |
---|
249 | EXTERN bdd_t *bdd_and ARGS((bdd_t *, bdd_t *, boolean, boolean)); |
---|
250 | EXTERN bdd_t *bdd_and_with_limit ARGS((bdd_t *, bdd_t *, boolean, boolean, unsigned int)); |
---|
251 | EXTERN bdd_t *bdd_and_array ARGS((bdd_t *, array_t *, boolean, boolean)); |
---|
252 | EXTERN bdd_t *bdd_and_smooth ARGS((bdd_t *, bdd_t *, array_t *)); |
---|
253 | EXTERN bdd_t *bdd_and_smooth_with_limit ARGS((bdd_t *, bdd_t *, array_t *, unsigned int)); |
---|
254 | EXTERN bdd_t *bdd_and_smooth_with_cube ARGS((bdd_t *, bdd_t *, bdd_t *)); |
---|
255 | EXTERN bdd_t *bdd_clipping_and_smooth ARGS((bdd_t *, bdd_t *, array_t *, int , int )); |
---|
256 | EXTERN bdd_t *bdd_xor_smooth ARGS((bdd_t *, bdd_t *, array_t *)); |
---|
257 | EXTERN bdd_t *bdd_between ARGS((bdd_t *, bdd_t *)); |
---|
258 | EXTERN bdd_t *bdd_cofactor ARGS((bdd_t *, bdd_t *)); |
---|
259 | EXTERN bdd_t *bdd_cofactor_array ARGS((bdd_t *, array_t *)); |
---|
260 | EXTERN bdd_t *bdd_var_cofactor ARGS((bdd_t *, bdd_t *)); |
---|
261 | EXTERN bdd_t *bdd_compose ARGS((bdd_t *, bdd_t *, bdd_t *)); |
---|
262 | EXTERN bdd_t *bdd_vector_compose ARGS((bdd_t *, array_t *, array_t *)); |
---|
263 | EXTERN bdd_t *bdd_consensus ARGS((bdd_t *, array_t *)); |
---|
264 | EXTERN bdd_t *bdd_consensus_with_cube ARGS((bdd_t *, bdd_t *)); |
---|
265 | EXTERN bdd_t *bdd_cproject ARGS((bdd_t *, array_t *)); |
---|
266 | EXTERN bdd_t *bdd_else ARGS((bdd_t *)); |
---|
267 | EXTERN bdd_t *bdd_ite ARGS((bdd_t *, bdd_t *, bdd_t *, boolean, boolean, boolean)); |
---|
268 | EXTERN bdd_t *bdd_minimize ARGS((bdd_t *, bdd_t *)); |
---|
269 | EXTERN bdd_t *bdd_minimize_array ARGS((bdd_t *, array_t *)); |
---|
270 | EXTERN bdd_t *bdd_compact ARGS((bdd_t *, bdd_t *)); |
---|
271 | EXTERN bdd_t *bdd_squeeze ARGS((bdd_t *, bdd_t *)); |
---|
272 | EXTERN bdd_t *bdd_not ARGS((bdd_t *)); |
---|
273 | EXTERN bdd_t *bdd_one ARGS((bdd_manager *)); |
---|
274 | EXTERN bdd_t *bdd_or ARGS((bdd_t *, bdd_t *, boolean, boolean)); |
---|
275 | EXTERN bdd_t *bdd_smooth ARGS((bdd_t *, array_t *)); |
---|
276 | EXTERN bdd_t *bdd_smooth_with_cube ARGS((bdd_t *, bdd_t *)); |
---|
277 | EXTERN bdd_t *bdd_substitute ARGS((bdd_t *, array_t *, array_t *)); |
---|
278 | EXTERN bdd_t *bdd_substitute_with_permut ARGS((bdd_t *, int *)); |
---|
279 | EXTERN array_t *bdd_substitute_array ARGS((array_t *, array_t *, array_t *)); |
---|
280 | EXTERN array_t *bdd_substitute_array_with_permut ARGS((array_t *, int *)); |
---|
281 | EXTERN void *bdd_pointer ARGS((bdd_t *)); |
---|
282 | EXTERN bdd_t *bdd_then ARGS((bdd_t *)); |
---|
283 | EXTERN bdd_t *bdd_top_var ARGS((bdd_t *)); |
---|
284 | EXTERN bdd_t *bdd_xnor ARGS((bdd_t *, bdd_t *)); |
---|
285 | EXTERN bdd_t *bdd_xor ARGS((bdd_t *, bdd_t *)); |
---|
286 | EXTERN bdd_t *bdd_zero ARGS((bdd_manager *)); |
---|
287 | EXTERN bdd_t *bdd_multiway_and ARGS((bdd_manager *, array_t *)); |
---|
288 | EXTERN bdd_t *bdd_multiway_or ARGS((bdd_manager *, array_t *)); |
---|
289 | EXTERN bdd_t *bdd_multiway_xor ARGS((bdd_manager *, array_t *)); |
---|
290 | EXTERN array_t * bdd_pairwise_or ARGS((bdd_manager *manager, array_t *bddArray1, array_t *bddArray2)); |
---|
291 | EXTERN array_t * bdd_pairwise_and ARGS((bdd_manager *manager, array_t *bddArray1, array_t *bddArray2)); |
---|
292 | EXTERN array_t * bdd_pairwise_xor ARGS((bdd_manager *manager, array_t *bddArray1, array_t *bddArray2)); |
---|
293 | EXTERN bdd_t *bdd_approx_hb ARGS((bdd_t *, bdd_approx_dir_t , int , int )); |
---|
294 | EXTERN bdd_t *bdd_approx_sp ARGS((bdd_t *, bdd_approx_dir_t , int , int , int )); |
---|
295 | EXTERN bdd_t *bdd_approx_ua ARGS((bdd_t *, bdd_approx_dir_t , int , int , int , double )); |
---|
296 | EXTERN bdd_t *bdd_approx_remap_ua ARGS((bdd_t *, bdd_approx_dir_t , int , int , double )); |
---|
297 | EXTERN bdd_t *bdd_approx_biased_rua ARGS((bdd_t *, bdd_approx_dir_t , bdd_t *, int , int , double, double )); |
---|
298 | EXTERN bdd_t *bdd_approx_compress ARGS((bdd_t *, bdd_approx_dir_t , int , int )); |
---|
299 | EXTERN int bdd_var_decomp ARGS((bdd_t *, bdd_partition_type_t , bdd_t ***)); |
---|
300 | EXTERN int bdd_gen_decomp ARGS((bdd_t *, bdd_partition_type_t , bdd_t ***)); |
---|
301 | EXTERN int bdd_approx_decomp ARGS((bdd_t *, bdd_partition_type_t , bdd_t ***)); |
---|
302 | EXTERN int bdd_iter_decomp ARGS((bdd_t *, bdd_partition_type_t , bdd_t ***)); |
---|
303 | EXTERN bdd_t *bdd_solve_eqn ARGS((bdd_t *f, array_t *g, array_t *unknowns)); |
---|
304 | EXTERN bdd_t *bdd_shortest_path ARGS((bdd_t *f, int *weight, int *support, int *length)); |
---|
305 | |
---|
306 | EXTERN bdd_t *bdd_compute_cube ARGS((bdd_manager *mgr, array_t *vars)); |
---|
307 | EXTERN bdd_t *bdd_compute_cube_with_phase ARGS((bdd_manager *mgr, array_t *vars, array_t *phase)); |
---|
308 | EXTERN bdd_node *bdd_add_compose ARGS((bdd_manager *mgr, bdd_node *fn1, bdd_node *fn2, int var)); |
---|
309 | EXTERN bdd_node *bdd_add_xnor ARGS((bdd_manager *mgr, bdd_node **fn1, bdd_node **fn2 )); |
---|
310 | EXTERN bdd_node *bdd_add_times ARGS((bdd_manager *mgr, bdd_node **fn1, bdd_node **fn2)); |
---|
311 | EXTERN bdd_node *bdd_add_vector_compose ARGS((bdd_manager *mgr, bdd_node *fn, bdd_node **vector)); |
---|
312 | EXTERN bdd_node *bdd_add_residue ARGS((bdd_manager *mgr, int n, int m, int options, int top)); |
---|
313 | EXTERN bdd_node *bdd_add_nonsim_compose ARGS((bdd_manager *mgr, bdd_node *fn, bdd_node **vector)); |
---|
314 | EXTERN bdd_node *bdd_add_apply ARGS((bdd_manager *mgr, bdd_node *(*operation)(bdd_manager *, bdd_node **, bdd_node **), bdd_node *fn1, bdd_node *fn2)); |
---|
315 | EXTERN bdd_node *bdd_add_exist_abstract ARGS((bdd_manager *mgr, bdd_node *fn, bdd_node *vars)); |
---|
316 | EXTERN void bdd_recursive_deref ARGS((bdd_manager *mgr, bdd_node *f)); |
---|
317 | EXTERN void bdd_ref ARGS((bdd_node *fn)); |
---|
318 | EXTERN bdd_node *bdd_bdd_to_add ARGS((bdd_manager *mgr, bdd_node *fn)); |
---|
319 | EXTERN bdd_node *bdd_add_permute ARGS((bdd_manager *mgr, bdd_node *fn, int *permut)); |
---|
320 | EXTERN bdd_node *bdd_bdd_permute ARGS((bdd_manager *mgr, bdd_node *fn, int *permut)); |
---|
321 | EXTERN bdd_node * bdd_bdd_exist_abstract ARGS((bdd_manager *mgr, bdd_node *fn, bdd_node *cube)); |
---|
322 | /* Added by Balakrishna Kumthekar. There are potential duplicates. */ |
---|
323 | |
---|
324 | EXTERN int bdd_equal_sup_norm ARGS((bdd_manager *mgr, bdd_node *fn, bdd_node *gn, BDD_VALUE_TYPE tolerance, int pr)); |
---|
325 | EXTERN bdd_node * bdd_read_logic_zero ARGS((bdd_manager *mgr)); |
---|
326 | EXTERN bdd_node * bdd_bdd_ith_var ARGS((bdd_manager *mgr, int i)); |
---|
327 | EXTERN bdd_node * bdd_add_divide ARGS((bdd_manager *mgr, bdd_node **fn1, bdd_node **fn2)); |
---|
328 | EXTERN bdd_node * bdd_bdd_constrain ARGS((bdd_manager *mgr, bdd_node *f, bdd_node *c)); |
---|
329 | EXTERN bdd_node * bdd_bdd_restrict ARGS((bdd_manager *mgr, bdd_node *f, bdd_node *c)); |
---|
330 | EXTERN bdd_node * bdd_add_hamming ARGS((bdd_manager *mgr, bdd_node **xVars, bdd_node **yVars, int nVars)); |
---|
331 | EXTERN bdd_node * bdd_add_ite ARGS((bdd_manager *mgr, bdd_node *f, bdd_node *g, bdd_node *h)); |
---|
332 | EXTERN bdd_node * bdd_add_find_max ARGS((bdd_manager *mgr, bdd_node *f)); |
---|
333 | EXTERN int bdd_bdd_pick_one_cube ARGS((bdd_manager *mgr, bdd_node *node, char *string)); |
---|
334 | EXTERN bdd_node * bdd_add_swap_variables ARGS((bdd_manager *mgr, bdd_node *f, bdd_node **x, bdd_node **y, int n)); |
---|
335 | EXTERN bdd_node * bdd_bdd_or ARGS((bdd_manager *mgr, bdd_node *f, bdd_node *g)); |
---|
336 | EXTERN bdd_node * bdd_bdd_compute_cube ARGS((bdd_manager *mgr, bdd_node **vars, int *phase, int n)); |
---|
337 | EXTERN bdd_node * bdd_indices_to_cube ARGS((bdd_manager *mgr, int *idArray, int n)); |
---|
338 | EXTERN bdd_node * bdd_bdd_and ARGS((bdd_manager *mgr, bdd_node *f, bdd_node *g)); |
---|
339 | EXTERN bdd_node * bdd_add_matrix_multiply ARGS((bdd_manager *mgr, bdd_node *A, bdd_node *B, bdd_node **z, int nz)); |
---|
340 | EXTERN bdd_node * bdd_add_compute_cube ARGS((bdd_manager *mgr, bdd_node **vars, int *phase, int n)); |
---|
341 | EXTERN bdd_node * bdd_add_const ARGS((bdd_manager *mgr, BDD_VALUE_TYPE c)); |
---|
342 | EXTERN bdd_node * bdd_bdd_swap_variables ARGS((bdd_manager *mgr, bdd_node *f, bdd_node **x, bdd_node **y, int n)); |
---|
343 | EXTERN double bdd_count_minterm ARGS((bdd_manager *mgr, bdd_node *f, int n)); |
---|
344 | EXTERN bdd_node * bdd_add_bdd_threshold ARGS((bdd_manager *mgr, bdd_node *f, BDD_VALUE_TYPE value)); |
---|
345 | EXTERN bdd_node * bdd_add_bdd_strict_threshold ARGS((bdd_manager *mgr,bdd_node *f,BDD_VALUE_TYPE value)); |
---|
346 | EXTERN BDD_VALUE_TYPE bdd_read_epsilon ARGS((bdd_manager *mgr)); |
---|
347 | EXTERN bdd_node * bdd_read_one ARGS((bdd_manager *mgr)); |
---|
348 | EXTERN bdd_node * bdd_bdd_pick_one_minterm ARGS((bdd_manager *mgr, bdd_node *f, bdd_node **vars, int n)); |
---|
349 | EXTERN bdd_t * bdd_pick_one_minterm ARGS((bdd_t *f, array_t *varsArray)); |
---|
350 | EXTERN array_t * bdd_bdd_pick_arbitrary_minterms ARGS((bdd_t *f, array_t *varsArray, int n, int k)); |
---|
351 | EXTERN bdd_t * bdd_subset_with_mask_vars ARGS((bdd_t *f, array_t *varsArray, array_t *maskVarsArray)); |
---|
352 | EXTERN bdd_node * bdd_read_zero ARGS((bdd_manager *mgr)); |
---|
353 | EXTERN bdd_node * bdd_bdd_new_var ARGS((bdd_manager *mgr)); |
---|
354 | EXTERN bdd_node * bdd_bdd_and_abstract ARGS((bdd_manager *mgr, bdd_node *f, bdd_node *g, bdd_node *cube)); |
---|
355 | |
---|
356 | EXTERN int bdd_test_unate ARGS((bdd_t *f, int varId, int phase)); |
---|
357 | EXTERN array_t * bdd_find_essential ARGS((bdd_t *)); |
---|
358 | EXTERN bdd_t * bdd_find_essential_cube ARGS((bdd_t *)); |
---|
359 | EXTERN void bdd_deref ARGS((bdd_node *f)); |
---|
360 | EXTERN bdd_node * bdd_add_plus ARGS((bdd_manager *mgr, bdd_node **fn1, bdd_node **fn2)); |
---|
361 | EXTERN int bdd_read_reorderings ARGS((bdd_manager *mgr)); |
---|
362 | EXTERN int bdd_read_next_reordering ARGS((bdd_manager *mgr)); |
---|
363 | EXTERN void bdd_set_next_reordering ARGS((bdd_manager *mgr, int next)); |
---|
364 | EXTERN bdd_node * bdd_bdd_xnor ARGS((bdd_manager *mgr, bdd_node *f, bdd_node *g)); |
---|
365 | EXTERN bdd_node * bdd_bdd_xor ARGS((bdd_manager *mgr, bdd_node *f, bdd_node *g)); |
---|
366 | EXTERN bdd_node * bdd_bdd_vector_compose ARGS((bdd_manager *mgr, bdd_node *f, bdd_node **vector)); |
---|
367 | |
---|
368 | EXTERN bdd_node * bdd_zdd_get_node ARGS((bdd_manager *mgr, int id, bdd_node *g, bdd_node *h)); |
---|
369 | EXTERN bdd_node * bdd_zdd_product ARGS((bdd_manager *mgr, bdd_node *f, bdd_node *g)); |
---|
370 | EXTERN bdd_node * bdd_zdd_product_recur ARGS((bdd_manager *mgr, bdd_node *f, bdd_node *g)); |
---|
371 | EXTERN bdd_node * bdd_zdd_union ARGS((bdd_manager *mgr, bdd_node *f, bdd_node *g)); |
---|
372 | EXTERN bdd_node * bdd_zdd_union_recur ARGS((bdd_manager *mgr, bdd_node *f, bdd_node *g)); |
---|
373 | EXTERN bdd_node * bdd_zdd_weak_div ARGS((bdd_manager *mgr, bdd_node *f, bdd_node *g)); |
---|
374 | EXTERN bdd_node * bdd_zdd_weak_div_recur ARGS((bdd_manager *mgr, bdd_node *f, bdd_node *g)); |
---|
375 | EXTERN bdd_node * bdd_zdd_isop_recur ARGS((bdd_manager *mgr, bdd_node *L, bdd_node *U, bdd_node **zdd_I)); |
---|
376 | EXTERN bdd_node * bdd_zdd_isop ARGS((bdd_manager *mgr, bdd_node *L, bdd_node *U, bdd_node **zdd_I)); |
---|
377 | EXTERN int bdd_zdd_get_cofactors3 ARGS((bdd_manager *mgr, bdd_node *f, int v, bdd_node **f1, bdd_node **f0, bdd_node **fd)); |
---|
378 | EXTERN bdd_node * bdd_bdd_and_recur ARGS((bdd_manager *mgr, bdd_node *f, bdd_node *g)); |
---|
379 | EXTERN bdd_node * bdd_unique_inter ARGS((bdd_manager *mgr, int v, bdd_node *f, bdd_node *g)); |
---|
380 | EXTERN bdd_node * bdd_unique_inter_ivo ARGS((bdd_manager *mgr, int v, bdd_node *f, bdd_node *g)); |
---|
381 | EXTERN bdd_node * bdd_zdd_diff ARGS((bdd_manager *mgr, bdd_node *f, bdd_node *g)); |
---|
382 | EXTERN bdd_node * bdd_zdd_diff_recur ARGS((bdd_manager *mgr, bdd_node *f, bdd_node *g)); |
---|
383 | EXTERN int bdd_num_zdd_vars ARGS((bdd_manager *mgr)); |
---|
384 | EXTERN bdd_node * bdd_regular ARGS((bdd_node *f)); |
---|
385 | EXTERN int bdd_is_constant ARGS((bdd_node *f)); |
---|
386 | EXTERN int bdd_is_complement ARGS((bdd_node *f)); |
---|
387 | EXTERN bdd_node * bdd_bdd_T ARGS((bdd_node *f)); |
---|
388 | EXTERN bdd_node * bdd_bdd_E ARGS((bdd_node *f)); |
---|
389 | EXTERN bdd_node * bdd_not_bdd_node ARGS((bdd_node *f)); |
---|
390 | EXTERN void bdd_recursive_deref_zdd ARGS((bdd_manager *mgr, bdd_node *f)); |
---|
391 | EXTERN int bdd_zdd_count ARGS((bdd_manager *mgr, bdd_node *f)); |
---|
392 | EXTERN int bdd_read_zdd_level ARGS((bdd_manager *mgr, int index)); |
---|
393 | EXTERN int bdd_zdd_vars_from_bdd_vars ARGS((bdd_manager *mgr, int multiplicity)); |
---|
394 | EXTERN void bdd_zdd_realign_enable ARGS((bdd_manager *mgr)); |
---|
395 | EXTERN void bdd_zdd_realign_disable ARGS((bdd_manager *mgr)); |
---|
396 | EXTERN int bdd_zdd_realignment_enabled ARGS((bdd_manager *mgr)); |
---|
397 | EXTERN void bdd_realign_enable ARGS((bdd_manager *mgr)); |
---|
398 | EXTERN void bdd_realign_disable ARGS((bdd_manager *mgr)); |
---|
399 | EXTERN int bdd_realignment_enabled ARGS((bdd_manager *mgr)); |
---|
400 | EXTERN int bdd_node_read_index ARGS((bdd_node *f)); |
---|
401 | EXTERN bdd_node * bdd_read_next ARGS((bdd_node *f)); |
---|
402 | /* This function should not be used by an external user. This will not be a |
---|
403 | * part of any future releases. |
---|
404 | */ |
---|
405 | EXTERN void bdd_set_next ARGS((bdd_node *f, bdd_node *g)); |
---|
406 | EXTERN bdd_node * bdd_add_apply_recur ARGS((bdd_manager *mgr, bdd_node *(*operation)(bdd_manager *, bdd_node **, bdd_node **), bdd_node *fn1, bdd_node *fn2)); |
---|
407 | EXTERN BDD_VALUE_TYPE bdd_add_value ARGS((bdd_node *f)); |
---|
408 | |
---|
409 | EXTERN bdd_node * bdd_read_plus_infinity ARGS((bdd_manager *mgr)); |
---|
410 | EXTERN bdd_node * bdd_priority_select ARGS((bdd_manager *mgr,bdd_node *R,bdd_node **x,bdd_node **y,bdd_node **z,bdd_node *Pi,int n, bdd_node *(*Pifunc)(bdd_manager *, int, bdd_node **, bdd_node **, bdd_node **))); |
---|
411 | EXTERN void bdd_set_background ARGS((bdd_manager *mgr,bdd_node *f)); |
---|
412 | EXTERN bdd_node * bdd_read_background ARGS((bdd_manager *mgr)); |
---|
413 | EXTERN bdd_node * bdd_bdd_cofactor ARGS((bdd_manager *mgr,bdd_node *f,bdd_node *g)); |
---|
414 | EXTERN bdd_node * bdd_bdd_ite ARGS((bdd_manager *mgr,bdd_node *f,bdd_node *g,bdd_node *h)); |
---|
415 | EXTERN bdd_node * bdd_add_minus ARGS((bdd_manager *mgr,bdd_node **fn1,bdd_node **fn2)); |
---|
416 | EXTERN bdd_node * bdd_dxygtdxz ARGS((bdd_manager *mgr,int N,bdd_node **x, bdd_node **y, bdd_node **z)); |
---|
417 | EXTERN bdd_node * bdd_bdd_univ_abstract ARGS((bdd_manager *mgr,bdd_node *fn,bdd_node *vars)); |
---|
418 | EXTERN bdd_node * bdd_bdd_cprojection ARGS((bdd_manager *mgr,bdd_node *R,bdd_node *Y)); |
---|
419 | EXTERN double *bdd_cof_minterm ARGS((bdd_t *)); |
---|
420 | EXTERN int bdd_var_is_dependent ARGS((bdd_t *, bdd_t *)); |
---|
421 | EXTERN int bdd_debug_check ARGS((bdd_manager *mgr)); |
---|
422 | EXTERN bdd_node * bdd_xeqy ARGS((bdd_manager *mgr, int N, bdd_node **x, bdd_node **y)); |
---|
423 | EXTERN bdd_node * bdd_add_roundoff ARGS((bdd_manager *mgr, bdd_node *f, int N)); |
---|
424 | EXTERN bdd_node * bdd_xgty ARGS((bdd_manager *mgr, int N, bdd_node **x, bdd_node **y)); |
---|
425 | EXTERN bdd_node * bdd_add_cmpl ARGS((bdd_manager *mgr, bdd_node *f)); |
---|
426 | EXTERN bdd_node * bdd_split_set ARGS((bdd_manager *mgr, bdd_node *f, bdd_node ** x, int n, double m)); |
---|
427 | |
---|
428 | /* |
---|
429 | * Queries about BDD Formulas |
---|
430 | */ |
---|
431 | EXTERN boolean bdd_equal ARGS((bdd_t *, bdd_t *)); |
---|
432 | EXTERN boolean bdd_equal_mod_care_set ARGS((bdd_t *, bdd_t *, bdd_t *)); |
---|
433 | EXTERN boolean bdd_equal_mod_care_set_array ARGS((bdd_t *, bdd_t *, array_t *)); |
---|
434 | EXTERN bdd_t *bdd_intersects ARGS((bdd_t *, bdd_t *)); |
---|
435 | EXTERN bdd_t *bdd_closest_cube ARGS((bdd_t *, bdd_t *, int *)); |
---|
436 | EXTERN boolean bdd_is_tautology ARGS((bdd_t *, boolean)); |
---|
437 | EXTERN boolean bdd_leq ARGS((bdd_t *, bdd_t *, boolean, boolean)); |
---|
438 | EXTERN boolean bdd_lequal_mod_care_set ARGS((bdd_t *, bdd_t *, boolean, boolean, bdd_t *)); |
---|
439 | EXTERN boolean bdd_lequal_mod_care_set_array ARGS((bdd_t *, bdd_t *, boolean, boolean, array_t *)); |
---|
440 | EXTERN boolean bdd_leq_array ARGS((bdd_t *, array_t *, boolean, boolean)); |
---|
441 | EXTERN double bdd_count_onset ARGS((bdd_t *, array_t *)); |
---|
442 | EXTERN int bdd_epd_count_onset ARGS((bdd_t *, array_t *, EpDouble *epd)); |
---|
443 | EXTERN int bdd_print_apa_minterm ARGS((FILE *, bdd_t *, int, int)); |
---|
444 | EXTERN int bdd_apa_compare_ratios ARGS((int, bdd_t *, bdd_t *, int, int)); |
---|
445 | |
---|
446 | EXTERN double bdd_correlation ARGS((bdd_t *, bdd_t *)); |
---|
447 | EXTERN int bdd_get_free ARGS((bdd_t *)); |
---|
448 | EXTERN bdd_manager *bdd_get_manager ARGS((bdd_t *)); |
---|
449 | EXTERN bdd_node *bdd_get_node ARGS((bdd_t *, boolean *)); |
---|
450 | EXTERN bdd_node *bdd_extract_node_as_is ARGS((bdd_t *)); |
---|
451 | EXTERN var_set_t *bdd_get_support ARGS((bdd_t *)); |
---|
452 | EXTERN int bdd_is_support_var ARGS((bdd_t *, bdd_t *)); |
---|
453 | EXTERN int bdd_is_support_var_id ARGS((bdd_t *, int)); |
---|
454 | EXTERN array_t *bdd_get_varids ARGS((array_t *)); |
---|
455 | EXTERN unsigned int bdd_num_vars ARGS((bdd_manager *)); |
---|
456 | EXTERN int bdd_read_node_count ARGS((bdd_manager *mgr)); |
---|
457 | EXTERN void bdd_print ARGS((bdd_t *)); |
---|
458 | EXTERN int bdd_print_minterm ARGS((bdd_t *)); |
---|
459 | EXTERN int bdd_print_cover ARGS((bdd_t *)); |
---|
460 | EXTERN void bdd_print_stats ARGS((bdd_manager *, FILE *)); |
---|
461 | EXTERN int bdd_set_parameters ARGS((bdd_manager *, avl_tree *valueTable, FILE *)); |
---|
462 | EXTERN int bdd_size ARGS((bdd_t *)); |
---|
463 | EXTERN int bdd_node_size ARGS((bdd_node *)); |
---|
464 | EXTERN long bdd_size_multiple ARGS((array_t *)); |
---|
465 | EXTERN boolean bdd_is_cube ARGS((bdd_t*)); |
---|
466 | EXTERN bdd_block * bdd_new_var_block(bdd_t *f, long length); |
---|
467 | EXTERN long bdd_top_var_level ARGS((bdd_manager *manager, bdd_t *fn)); |
---|
468 | EXTERN bdd_variableId bdd_get_id_from_level ARGS((bdd_manager *, long)); |
---|
469 | EXTERN bdd_variableId bdd_top_var_id ARGS((bdd_t *)); |
---|
470 | EXTERN int bdd_get_level_from_id ARGS((bdd_manager *mgr, int id)); |
---|
471 | EXTERN int bdd_check_zero_ref ARGS((bdd_manager *mgr)); |
---|
472 | EXTERN int bdd_estimate_cofactor ARGS((bdd_t *, bdd_t *, int )); |
---|
473 | /* Reordering related stuff */ |
---|
474 | EXTERN void bdd_dynamic_reordering ARGS((bdd_manager *, bdd_reorder_type_t, bdd_reorder_verbosity_t)); |
---|
475 | EXTERN void bdd_dynamic_reordering_zdd ARGS((bdd_manager *, bdd_reorder_type_t, bdd_reorder_verbosity_t)); |
---|
476 | EXTERN int bdd_reordering_status ARGS((bdd_manager *mgr, bdd_reorder_type_t *method)); |
---|
477 | EXTERN int bdd_reordering_zdd_status ARGS((bdd_manager *mgr, bdd_reorder_type_t *method)); |
---|
478 | EXTERN void bdd_reorder ARGS((bdd_manager *)); |
---|
479 | EXTERN int bdd_shuffle_heap ARGS((bdd_manager *mgr, int *permut)); |
---|
480 | EXTERN void bdd_dynamic_reordering_disable ARGS((bdd_manager *mgr)); |
---|
481 | EXTERN void bdd_dynamic_reordering_zdd_disable ARGS((bdd_manager *mgr)); |
---|
482 | EXTERN int bdd_read_reordered_field ARGS((bdd_manager *mgr)); |
---|
483 | EXTERN int bdd_add_hook ARGS((bdd_manager *, int (*procedure)(bdd_manager *, char *, void *), bdd_hook_type_t )); |
---|
484 | EXTERN int bdd_remove_hook ARGS((bdd_manager *, int (*procedure)(bdd_manager *, char *, void *), bdd_hook_type_t )); |
---|
485 | EXTERN int bdd_enable_reordering_reporting ARGS((bdd_manager *)); |
---|
486 | EXTERN int bdd_disable_reordering_reporting ARGS((bdd_manager *)); |
---|
487 | EXTERN bdd_reorder_verbosity_t bdd_reordering_reporting ARGS((bdd_manager *)); |
---|
488 | /* This function should not be used by an external user. It will |
---|
489 | * not be a part of any future release. |
---|
490 | */ |
---|
491 | EXTERN void bdd_set_reordered_field ARGS((bdd_manager *mgr, int n)); |
---|
492 | EXTERN bdd_node *bdd_bdd_vector_support ARGS((bdd_manager *mgr,bdd_node **F,int n)); |
---|
493 | EXTERN int bdd_bdd_vector_support_size ARGS((bdd_manager *mgr,bdd_node **F, int n)); |
---|
494 | EXTERN int bdd_bdd_support_size ARGS((bdd_manager *mgr,bdd_node *F)); |
---|
495 | EXTERN bdd_node *bdd_bdd_support ARGS((bdd_manager *mgr,bdd_node *F)); |
---|
496 | EXTERN bdd_node *bdd_add_general_vector_compose ARGS((bdd_manager *mgr,bdd_node *f,bdd_node **vectorOn,bdd_node **vectorOff)); |
---|
497 | EXTERN int bdd_bdd_leq ARGS((bdd_manager *mgr,bdd_node *f,bdd_node *g)); |
---|
498 | EXTERN bdd_node *bdd_bdd_boolean_diff ARGS((bdd_manager *mgr,bdd_node *f,int x)); |
---|
499 | |
---|
500 | /* |
---|
501 | ** Generator related functions. |
---|
502 | ** These are NOT to be used directly; only indirectly in the macros. |
---|
503 | */ |
---|
504 | EXTERN bdd_gen_status bdd_gen_read_status ARGS((bdd_gen *gen)); |
---|
505 | EXTERN bdd_gen *bdd_first_cube ARGS((bdd_t *, array_t **)); |
---|
506 | EXTERN boolean bdd_next_cube ARGS((bdd_gen *, array_t **)); |
---|
507 | EXTERN bdd_gen *bdd_first_disjoint_cube ARGS((bdd_t *, array_t **)); |
---|
508 | EXTERN boolean bdd_next_disjoint_cube ARGS((bdd_gen *, array_t **)); |
---|
509 | EXTERN bdd_gen *bdd_first_node ARGS((bdd_t *, bdd_node **)); |
---|
510 | EXTERN boolean bdd_next_node ARGS((bdd_gen *, bdd_node **)); |
---|
511 | EXTERN int bdd_gen_free ARGS((bdd_gen *)); |
---|
512 | |
---|
513 | /* |
---|
514 | * Miscellaneous |
---|
515 | */ |
---|
516 | EXTERN void bdd_set_gc_mode ARGS((bdd_manager *, boolean)); |
---|
517 | EXTERN bdd_external_hooks *bdd_get_external_hooks ARGS((bdd_manager *)); |
---|
518 | EXTERN bdd_t *bdd_construct_bdd_t ARGS((bdd_manager *mgr, bdd_node * fn)); |
---|
519 | EXTERN void bdd_dump_blif ARGS((bdd_manager *mgr, int nBdds, bdd_node **bdds, char **inames, char **onames, char *model, FILE *fp)); |
---|
520 | EXTERN void bdd_dump_blif_body ARGS((bdd_manager *mgr, int nBdds, bdd_node **bdds, char **inames, char **onames, FILE *fp)); |
---|
521 | EXTERN void bdd_dump_dot ARGS((bdd_manager *mgr, int nBdds, bdd_node **bdds, char **inames, char **onames, FILE *fp)); |
---|
522 | EXTERN bdd_node *bdd_make_bdd_from_zdd_cover ARGS((bdd_manager *mgr, bdd_node *node)); |
---|
523 | EXTERN bdd_node *bdd_zdd_complement ARGS((bdd_manager *mgr, bdd_node *node)); |
---|
524 | EXTERN int bdd_ptrcmp ARGS((bdd_t *f, bdd_t *g)); |
---|
525 | EXTERN int bdd_ptrhash ARGS((bdd_t *f,int size)); |
---|
526 | EXTERN long bdd_read_peak_memory ARGS (( bdd_manager *mgr)); |
---|
527 | EXTERN int bdd_read_peak_live_node ARGS (( bdd_manager *mgr)); |
---|
528 | EXTERN int bdd_set_pi_var ARGS((bdd_manager *mgr, int index)); |
---|
529 | EXTERN int bdd_set_ps_var ARGS((bdd_manager *mgr, int index)); |
---|
530 | EXTERN int bdd_set_ns_var ARGS((bdd_manager *mgr, int index)); |
---|
531 | EXTERN int bdd_is_pi_var ARGS((bdd_manager *mgr, int index)); |
---|
532 | EXTERN int bdd_is_ps_var ARGS((bdd_manager *mgr, int index)); |
---|
533 | EXTERN int bdd_is_ns_var ARGS((bdd_manager *mgr, int index)); |
---|
534 | EXTERN int bdd_set_pair_index ARGS((bdd_manager *mgr, int index, int pairIndex)); |
---|
535 | EXTERN int bdd_read_pair_index ARGS((bdd_manager *mgr, int index)); |
---|
536 | EXTERN int bdd_set_var_to_be_grouped ARGS((bdd_manager *mgr, int index)); |
---|
537 | EXTERN int bdd_set_var_hard_group ARGS((bdd_manager *mgr, int index)); |
---|
538 | EXTERN int bdd_reset_var_to_be_grouped ARGS((bdd_manager *mgr, int index)); |
---|
539 | EXTERN int bdd_is_var_to_be_grouped ARGS((bdd_manager *mgr, int index)); |
---|
540 | EXTERN int bdd_is_var_hard_group ARGS((bdd_manager *mgr, int index)); |
---|
541 | EXTERN int bdd_is_var_to_be_ungrouped ARGS((bdd_manager *mgr, int index)); |
---|
542 | EXTERN int bdd_set_var_to_be_ungrouped ARGS((bdd_manager *mgr, int index)); |
---|
543 | EXTERN int bdd_bind_var ARGS((bdd_manager *mgr, int index)); |
---|
544 | EXTERN int bdd_unbind_var ARGS((bdd_manager *mgr, int index)); |
---|
545 | EXTERN int bdd_is_lazy_sift ARGS((bdd_manager *mgr)); |
---|
546 | EXTERN void bdd_discard_all_var_groups ARGS((bdd_manager *mgr)); |
---|
547 | #endif |
---|
548 | |
---|