source: vis_dev/glu-2.3/src/cmuBdd/bddapply.c

Last change on this file was 13, checked in by cecile, 15 years ago

library glu 2.3

File size: 2.2 KB
Line 
1/* BDD generic apply routines */
2
3
4#include "bddint.h"
5
6
7static
8bdd
9bdd_apply2_step(cmu_bdd_manager bddm,
10 bdd (*terminal_fn)(cmu_bdd_manager, bdd *, bdd *, pointer),
11 long op,
12 bdd f,
13 bdd g,
14 pointer env)
15{
16 bdd_indexindex_type top_indexindex;
17 bdd f1, f2;
18 bdd g1, g2;
19 bdd temp1, temp2;
20 bdd result;
21
22 if ((result=(*terminal_fn)(bddm, &f, &g, env)))
23 {
24 BDD_SETUP(result);
25 BDD_TEMP_INCREFS(result);
26 return (result);
27 }
28 if (bdd_lookup_in_cache2(bddm, op, f, g, &result))
29 return (result);
30 {
31 BDD_SETUP(f);
32 BDD_SETUP(g);
33 BDD_TOP_VAR2(top_indexindex, bddm, f, g);
34 BDD_COFACTOR(top_indexindex, f, f1, f2);
35 BDD_COFACTOR(top_indexindex, g, g1, g2);
36 temp1=bdd_apply2_step(bddm, terminal_fn, op, f1, g1, env);
37 temp2=bdd_apply2_step(bddm, terminal_fn, op, f2, g2, env);
38 result=bdd_find(bddm, top_indexindex, temp1, temp2);
39 bdd_insert_in_cache2(bddm, op, f, g, result);
40 return (result);
41 }
42}
43
44
45bdd
46bdd_apply2(cmu_bdd_manager bddm, bdd (*terminal_fn)(cmu_bdd_manager, bdd *, bdd *, pointer), bdd f, bdd g, pointer env)
47{
48 long op;
49
50 if (bdd_check_arguments(2, f, g))
51 {
52 FIREWALL(bddm);
53 op=bddm->temp_op--;
54 RETURN_BDD(bdd_apply2_step(bddm, terminal_fn, op, f, g, env));
55 }
56 return ((bdd)0);
57}
58
59
60static
61bdd
62bdd_apply1_step(cmu_bdd_manager bddm, bdd (*terminal_fn)(cmu_bdd_manager, bdd *, pointer), long op, bdd f, pointer env)
63{
64 bdd temp1, temp2;
65 bdd result;
66
67 if ((result=(*terminal_fn)(bddm, &f, env)))
68 {
69 BDD_SETUP(result);
70 BDD_TEMP_INCREFS(result);
71 return (result);
72 }
73 if (bdd_lookup_in_cache1(bddm, op, f, &result))
74 return (result);
75 {
76 BDD_SETUP(f);
77 temp1=bdd_apply1_step(bddm, terminal_fn, op, BDD_THEN(f), env);
78 temp2=bdd_apply1_step(bddm, terminal_fn, op, BDD_ELSE(f), env);
79 result=bdd_find(bddm, BDD_INDEXINDEX(f), temp1, temp2);
80 bdd_insert_in_cache1(bddm, op, f, result);
81 return (result);
82 }
83}
84
85
86bdd
87bdd_apply1(cmu_bdd_manager bddm, bdd (*terminal_fn)(cmu_bdd_manager, bdd *, pointer), bdd f, pointer env)
88{
89 long op;
90
91 if (bdd_check_arguments(1, f))
92 {
93 FIREWALL(bddm);
94 op=bddm->temp_op--;
95 RETURN_BDD(bdd_apply1_step(bddm, terminal_fn, op, f, env));
96 }
97 return ((bdd)0);
98}
Note: See TracBrowser for help on using the repository browser.