ABC: A System for Sequential Synthesis and Verification
Loading...
Searching...
No Matches
sharp.c
Go to the documentation of this file.
1
/*
2
* Revision Control Information
3
*
4
* $Source$
5
* $Author$
6
* $Revision$
7
* $Date$
8
*
9
*/
10
/*
11
sharp.c -- perform sharp, disjoint sharp, and intersection
12
*/
13
14
#include "
espresso.h
"
15
16
ABC_NAMESPACE_IMPL_START
17
18
19
long
start_time
;
20
21
22
/* cv_sharp -- form the sharp product between two covers */
23
pcover
cv_sharp
(A, B)
24
pcover
A, B;
25
{
26
pcube
last,
p
;
27
pcover
T;
28
29
T =
new_cover
(0);
30
foreach_set
(A, last,
p
)
31
T =
sf_union
(T,
cb_sharp
(
p
, B));
32
return
T;
33
}
34
35
36
/* cb_sharp -- form the sharp product between a cube and a cover */
37
pcover
cb_sharp
(c, T)
38
pcube
c;
39
pcover
T;
40
{
41
if
(T->count == 0) {
42
T =
sf_addset
(
new_cover
(1), c);
43
}
else
{
44
start_time
=
ptime
();
45
T =
cb_recur_sharp
(c, T, 0, T->count-1, 0);
46
}
47
return
T;
48
}
49
50
51
/* recursive formulation to provide balanced merging */
52
pcover
cb_recur_sharp
(c, T, first, last, level)
53
pcube
c;
54
pcover
T;
55
int
first, last, level;
56
{
57
pcover
temp, left, right;
58
int
middle;
59
60
if
(first == last) {
61
temp =
sharp
(c,
GETSET
(T, first));
62
}
else
{
63
middle = (first + last) / 2;
64
left =
cb_recur_sharp
(c, T, first, middle, level+1);
65
right =
cb_recur_sharp
(c, T, middle+1, last, level+1);
66
temp =
cv_intersect
(left, right);
67
if
((
debug
&
SHARP
) && level < 4) {
68
printf(
"# SHARP[%d]: %4d = %4d x %4d, time = %s\n"
,
69
level, temp->count, left->count, right->count,
70
print_time
(
ptime
() -
start_time
));
71
(void) fflush(stdout);
72
}
73
free_cover
(left);
74
free_cover
(right);
75
}
76
return
temp;
77
}
78
79
80
/* sharp -- form the sharp product between two cubes */
81
pcover
sharp
(a, b)
82
pcube
a, b;
83
{
84
register
int
var;
85
register
pcube
d=
cube
.temp[0], temp=
cube
.temp[1], temp1=
cube
.temp[2];
86
pcover
r =
new_cover
(
cube
.num_vars);
87
88
if
(
cdist0
(a, b)) {
89
set_diff
(d, a, b);
90
for
(var = 0; var <
cube
.num_vars; var++) {
91
if
(!
setp_empty
(
set_and
(temp, d,
cube
.var_mask[var]))) {
92
set_diff
(temp1, a,
cube
.var_mask[var]);
93
set_or
(
GETSET
(r, r->count++), temp, temp1);
94
}
95
}
96
}
else
{
97
r =
sf_addset
(r, a);
98
}
99
return
r;
100
}
101
␌
102
pcover
make_disjoint
(A)
103
pcover
A;
104
{
105
pcover
R,
new
;
106
register
pset
last,
p
;
107
108
R =
new_cover
(0);
109
foreach_set
(A, last,
p
) {
110
new
=
cb_dsharp
(
p
, R);
111
R =
sf_append
(R,
new
);
112
}
113
return
R;
114
}
115
116
117
/* cv_dsharp -- disjoint-sharp product between two covers */
118
pcover
cv_dsharp
(A, B)
119
pcover
A, B;
120
{
121
register
pcube
last,
p
;
122
pcover
T;
123
124
T =
new_cover
(0);
125
foreach_set
(A, last,
p
) {
126
T =
sf_union
(T,
cb_dsharp
(
p
, B));
127
}
128
return
T;
129
}
130
131
132
/* cb1_dsharp -- disjoint-sharp product between a cover and a cube */
133
pcover
cb1_dsharp
(T, c)
134
pcover
T;
135
pcube
c;
136
{
137
pcube
last,
p
;
138
pcover
R;
139
140
R =
new_cover
(T->count);
141
foreach_set
(T, last,
p
) {
142
R =
sf_union
(R,
dsharp
(
p
, c));
143
}
144
return
R;
145
}
146
147
148
/* cb_dsharp -- disjoint-sharp product between a cube and a cover */
149
pcover
cb_dsharp
(c, T)
150
pcube
c;
151
pcover
T;
152
{
153
pcube
last,
p
;
154
pcover
Y, Y1;
155
156
if
(T->count == 0) {
157
Y =
sf_addset
(
new_cover
(1), c);
158
}
else
{
159
Y =
new_cover
(T->count);
160
set_copy
(
GETSET
(Y,Y->count++), c);
161
foreach_set
(T, last,
p
) {
162
Y1 =
cb1_dsharp
(Y,
p
);
163
free_cover
(Y);
164
Y = Y1;
165
}
166
}
167
return
Y;
168
}
169
170
171
/* dsharp -- form the disjoint-sharp product between two cubes */
172
pcover
dsharp
(a, b)
173
pcube
a, b;
174
{
175
register
pcube
mask, diff, and, temp, temp1 =
cube
.temp[0];
176
int
var;
177
pcover
r;
178
179
r =
new_cover
(
cube
.num_vars);
180
181
if
(
cdist0
(a, b)) {
182
diff =
set_diff
(
new_cube
(), a, b);
183
and =
set_and
(
new_cube
(), a, b);
184
mask =
new_cube
();
185
for
(var = 0; var <
cube
.num_vars; var++) {
186
/* check if position var of "a and not b" is not empty */
187
if
(!
setp_disjoint
(diff,
cube
.var_mask[var])) {
188
189
/* coordinate var equals the difference between a and b */
190
temp =
GETSET
(r, r->count++);
191
(void)
set_and
(temp, diff,
cube
.var_mask[var]);
192
193
/* coordinates 0 ... var-1 equal the intersection */
194
INLINEset_and
(temp1, and, mask);
195
INLINEset_or
(temp, temp, temp1);
196
197
/* coordinates var+1 .. cube.num_vars equal a */
198
set_or
(mask, mask,
cube
.var_mask[var]);
199
INLINEset_diff
(temp1, a, mask);
200
INLINEset_or
(temp, temp, temp1);
201
}
202
}
203
free_cube
(diff);
204
free_cube
(and);
205
free_cube
(mask);
206
}
else
{
207
r =
sf_addset
(r, a);
208
}
209
return
r;
210
}
211
␌
212
/* cv_intersect -- form the intersection of two covers */
213
214
#define MAGIC 500
/* save 500 cubes before containment */
215
216
pcover
cv_intersect
(A, B)
217
pcover
A, B;
218
{
219
register
pcube
pi, pj, lasti, lastj, pt;
220
pcover
T, Tsave = NULL;
221
222
/* How large should each temporary result cover be ? */
223
T =
new_cover
(
MAGIC
);
224
pt = T->data;
225
226
/* Form pairwise intersection of each cube of A with each cube of B */
227
foreach_set
(A, lasti, pi) {
228
foreach_set
(B, lastj, pj) {
229
if
(
cdist0
(pi, pj)) {
230
(void)
set_and
(pt, pi, pj);
231
if
(++T->count >= T->capacity) {
232
if
(Tsave == NULL)
233
Tsave =
sf_contain
(T);
234
else
235
Tsave =
sf_union
(Tsave,
sf_contain
(T));
236
T =
new_cover
(
MAGIC
);
237
pt = T->data;
238
}
else
239
pt += T->wsize;
240
}
241
}
242
}
243
244
245
if
(Tsave == NULL)
246
Tsave =
sf_contain
(T);
247
else
248
Tsave =
sf_union
(Tsave,
sf_contain
(T));
249
return
Tsave;
250
}
251
ABC_NAMESPACE_IMPL_END
252
ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_START
Definition
abc_namespaces.h:54
ABC_NAMESPACE_IMPL_END
#define ABC_NAMESPACE_IMPL_END
Definition
abc_namespaces.h:55
espresso.h
pcover
#define pcover
Definition
espresso.h:264
sf_addset
pset_family sf_addset()
new_cube
#define new_cube()
Definition
espresso.h:262
INLINEset_diff
#define INLINEset_diff(r, a, b)
Definition
espresso.h:208
INLINEset_or
#define INLINEset_or(r, a, b)
Definition
espresso.h:205
setp_disjoint
bool setp_disjoint()
dsharp
pcover dsharp()
set_and
pset set_and()
sf_contain
pset_family sf_contain()
sharp
pcover sharp()
print_time
#define print_time(t)
Definition
espresso.h:22
cv_intersect
pcover cv_intersect()
cb_dsharp
pcover cb_dsharp()
cv_sharp
pcover cv_sharp()
cb1_dsharp
pcover cb1_dsharp()
pcube
#define pcube
Definition
espresso.h:261
make_disjoint
pcover make_disjoint()
free_cover
#define free_cover(r)
Definition
espresso.h:266
cb_recur_sharp
pcover cb_recur_sharp()
GETSET
#define GETSET(family, index)
Definition
espresso.h:161
set_diff
pset set_diff()
sf_union
pset_family sf_union()
free_cube
#define free_cube(r)
Definition
espresso.h:263
foreach_set
#define foreach_set(R, last, p)
Definition
espresso.h:135
debug
unsigned int debug
Definition
globals.c:19
cb_sharp
pcover cb_sharp()
cv_dsharp
pcover cv_dsharp()
setp_empty
bool setp_empty()
INLINEset_and
#define INLINEset_and(r, a, b)
Definition
espresso.h:202
SHARP
#define SHARP
Definition
espresso.h:364
pset
unsigned int * pset
Definition
espresso.h:73
set_or
pset set_or()
sf_append
pset_family sf_append()
cdist0
bool cdist0()
set_copy
pset set_copy()
new_cover
#define new_cover(i)
Definition
espresso.h:265
p
Cube * p
Definition
exorList.c:222
start_time
ABC_NAMESPACE_IMPL_START long start_time
Definition
sharp.c:19
MAGIC
#define MAGIC
Definition
sharp.c:214
cube
Definition
exor.h:123
ptime
#define ptime()
Definition
util_old.h:283
src
misc
espresso
sharp.c
Generated by Doxygen 1.13.2 © 2025 EPTansuo. All rights reserved.
鲁ICP备2021046540号