ABC: A System for Sequential Synthesis and Verification
Loading...
Searching...
No Matches
extraUtilBitMatrix.c
Go to the documentation of this file.
1
18
19
#include "
extra.h
"
20
21
ABC_NAMESPACE_IMPL_START
22
23
24
/*---------------------------------------------------------------------------*/
25
/* Constant declarations */
26
/*---------------------------------------------------------------------------*/
27
28
/*---------------------------------------------------------------------------*/
29
/* Stucture declarations */
30
/*---------------------------------------------------------------------------*/
31
32
struct
Extra_BitMat_t_
33
{
34
unsigned
**
ppData
;
// bit data
35
int
nSize
;
// the number of bits in one dimension
36
int
nWords
;
// the number of words in one dimension
37
int
nBitShift
;
// the number of bits to shift to get words
38
unsigned
uMask
;
// the mask to get the number of bits in the word
39
int
nLookups
;
// the number of lookups
40
int
nInserts
;
// the number of inserts
41
int
nDeletes
;
// the number of deletions
42
};
43
44
/*---------------------------------------------------------------------------*/
45
/* Type declarations */
46
/*---------------------------------------------------------------------------*/
47
48
/*---------------------------------------------------------------------------*/
49
/* Variable declarations */
50
/*---------------------------------------------------------------------------*/
51
52
/*---------------------------------------------------------------------------*/
53
/* Macro declarations */
54
/*---------------------------------------------------------------------------*/
55
56
58
59
/*---------------------------------------------------------------------------*/
60
/* Static function prototypes */
61
/*---------------------------------------------------------------------------*/
62
64
65
66
/*---------------------------------------------------------------------------*/
67
/* Definition of exported functions */
68
/*---------------------------------------------------------------------------*/
69
81
Extra_BitMat_t
*
Extra_BitMatrixStart
(
int
nSize )
82
{
83
Extra_BitMat_t
*
p
;
84
int
i;
85
p
=
ABC_ALLOC
(
Extra_BitMat_t
, 1 );
86
memset
(
p
, 0,
sizeof
(
Extra_BitMat_t
) );
87
p
->nSize = nSize;
88
p
->nBitShift = (
sizeof
(unsigned) == 4) ? 5: 6;
89
p
->uMask = (
sizeof
(unsigned) == 4) ? 31: 63;
90
p
->nWords = nSize / (8 *
sizeof
(unsigned)) + ((nSize % (8 *
sizeof
(
unsigned
))) > 0);
91
p
->ppData =
ABC_ALLOC
(
unsigned
*, nSize );
92
p
->ppData[0] =
ABC_ALLOC
(
unsigned
, nSize *
p
->nWords );
93
memset
(
p
->ppData[0], 0,
sizeof
(
unsigned
) * nSize *
p
->nWords );
94
for
( i = 1; i < nSize; i++ )
95
p
->ppData[i] =
p
->ppData[i-1] +
p
->nWords;
96
return
p
;
97
}
98
110
void
Extra_BitMatrixClean
(
Extra_BitMat_t
*
p
)
111
{
112
memset
(
p
->ppData[0], 0,
sizeof
(
unsigned
) *
p
->nSize *
p
->nWords );
113
}
114
126
void
Extra_BitMatrixStop
(
Extra_BitMat_t
*
p
)
127
{
128
ABC_FREE
(
p
->ppData[0] );
129
ABC_FREE
(
p
->ppData );
130
ABC_FREE
(
p
);
131
}
132
144
void
Extra_BitMatrixPrint
(
Extra_BitMat_t
* pMat )
145
{
146
int
i, k, nVars;
147
printf(
"\n"
);
148
nVars =
Extra_BitMatrixReadSize
( pMat );
149
for
( i = 0; i < nVars; i++ )
150
{
151
for
( k = 0; k <= i; k++ )
152
printf(
" "
);
153
for
( k = i+1; k < nVars; k++ )
154
if
(
Extra_BitMatrixLookup1
( pMat, i, k ) )
155
printf(
"1"
);
156
else
157
printf(
"."
);
158
printf(
"\n"
);
159
}
160
}
161
162
174
int
Extra_BitMatrixReadSize
(
Extra_BitMat_t
*
p
)
175
{
176
return
p
->nSize;
177
}
178
190
void
Extra_BitMatrixInsert1
(
Extra_BitMat_t
*
p
,
int
i,
int
k )
191
{
192
p
->nInserts++;
193
if
( i < k )
194
p
->ppData[i][k>>
p
->nBitShift] |= (1<<(k &
p
->uMask));
195
else
196
p
->ppData[k][i>>
p
->nBitShift] |= (1<<(i &
p
->uMask));
197
}
198
210
int
Extra_BitMatrixLookup1
(
Extra_BitMat_t
*
p
,
int
i,
int
k )
211
{
212
p
->nLookups++;
213
if
( i < k )
214
return
((
p
->ppData[i][k>>
p
->nBitShift] & (1<<(k &
p
->uMask))) > 0);
215
else
216
return
((
p
->ppData[k][i>>
p
->nBitShift] & (1<<(i &
p
->uMask))) > 0);
217
}
218
230
void
Extra_BitMatrixDelete1
(
Extra_BitMat_t
*
p
,
int
i,
int
k )
231
{
232
p
->nDeletes++;
233
if
( i < k )
234
p
->ppData[i][k>>
p
->nBitShift] &= ~(1<<(k &
p
->uMask));
235
else
236
p
->ppData[k][i>>
p
->nBitShift] &= ~(1<<(i &
p
->uMask));
237
}
238
239
240
252
void
Extra_BitMatrixInsert2
(
Extra_BitMat_t
*
p
,
int
i,
int
k )
253
{
254
p
->nInserts++;
255
if
( i > k )
256
p
->ppData[i][k>>
p
->nBitShift] |= (1<<(k &
p
->uMask));
257
else
258
p
->ppData[k][i>>
p
->nBitShift] |= (1<<(i &
p
->uMask));
259
}
260
272
int
Extra_BitMatrixLookup2
(
Extra_BitMat_t
*
p
,
int
i,
int
k )
273
{
274
p
->nLookups++;
275
if
( i > k )
276
return
((
p
->ppData[i][k>>
p
->nBitShift] & (1<<(k &
p
->uMask))) > 0);
277
else
278
return
((
p
->ppData[k][i>>
p
->nBitShift] & (1<<(i &
p
->uMask))) > 0);
279
}
280
292
void
Extra_BitMatrixDelete2
(
Extra_BitMat_t
*
p
,
int
i,
int
k )
293
{
294
p
->nDeletes++;
295
if
( i > k )
296
p
->ppData[i][k>>
p
->nBitShift] &= ~(1<<(k &
p
->uMask));
297
else
298
p
->ppData[k][i>>
p
->nBitShift] &= ~(1<<(i &
p
->uMask));
299
}
300
301
313
void
Extra_BitMatrixOr
(
Extra_BitMat_t
*
p
,
int
i,
unsigned
* pInfo )
314
{
315
int
w;
316
for
( w = 0; w <
p
->nWords; w++ )
317
p
->ppData[i][w] |= pInfo[w];
318
}
319
331
void
Extra_BitMatrixOrTwo
(
Extra_BitMat_t
*
p
,
int
i,
int
j )
332
{
333
int
w;
334
for
( w = 0; w <
p
->nWords; w++ )
335
p
->ppData[i][w] =
p
->ppData[j][w] = (
p
->ppData[i][w] |
p
->ppData[j][w]);
336
}
337
349
int
Extra_BitMatrixCountOnesUpper
(
Extra_BitMat_t
*
p
)
350
{
351
int
i, k,
nTotal
= 0;
352
for
( i = 0; i <
p
->nSize; i++ )
353
for
( k = i + 1; k <
p
->nSize; k++ )
354
nTotal
+= ( (
p
->ppData[i][k>>5] & (1 << (k&31))) > 0 );
355
return
nTotal
;
356
}
357
369
int
Extra_BitMatrixIsDisjoint
(
Extra_BitMat_t
* p1,
Extra_BitMat_t
* p2 )
370
{
371
int
i, w;
372
assert
( p1->nSize == p2->nSize );
373
for
( i = 0; i < p1->nSize; i++ )
374
for
( w = 0; w < p1->nWords; w++ )
375
if
( p1->ppData[i][w] & p2->ppData[i][w] )
376
return
0;
377
return
1;
378
}
379
391
int
Extra_BitMatrixIsClique
(
Extra_BitMat_t
* pMat )
392
{
393
int
v, u, i;
394
for
( v = 0; v < pMat->
nSize
; v++ )
395
for
( u = v+1; u < pMat->
nSize
; u++ )
396
{
397
if
( !
Extra_BitMatrixLookup1
( pMat, v, u ) )
398
continue
;
399
// v and u are symmetric
400
for
( i = 0; i < pMat->
nSize
; i++ )
401
{
402
if
( i == v || i == u )
403
continue
;
404
// i is neither v nor u
405
// the symmetry status of i is the same w.r.t. to v and u
406
if
(
Extra_BitMatrixLookup1
( pMat, i, v ) !=
Extra_BitMatrixLookup1
( pMat, i, u ) )
407
return
0;
408
}
409
}
410
return
1;
411
}
412
413
417
418
419
ABC_NAMESPACE_IMPL_END
420
ABC_ALLOC
#define ABC_ALLOC(type, num)
Definition
abc_global.h:264
ABC_FREE
#define ABC_FREE(obj)
Definition
abc_global.h:267
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
nTotal
int nTotal
DECLARATIONS ///.
Definition
cutTruth.c:37
p
Cube * p
Definition
exorList.c:222
Extra_BitMatrixDelete2
void Extra_BitMatrixDelete2(Extra_BitMat_t *p, int i, int k)
Definition
extraUtilBitMatrix.c:292
Extra_BitMatrixClean
void Extra_BitMatrixClean(Extra_BitMat_t *p)
Definition
extraUtilBitMatrix.c:110
Extra_BitMatrixStart
Extra_BitMat_t * Extra_BitMatrixStart(int nSize)
Definition
extraUtilBitMatrix.c:81
Extra_BitMatrixPrint
void Extra_BitMatrixPrint(Extra_BitMat_t *pMat)
Definition
extraUtilBitMatrix.c:144
Extra_BitMatrixReadSize
int Extra_BitMatrixReadSize(Extra_BitMat_t *p)
Definition
extraUtilBitMatrix.c:174
Extra_BitMatrixInsert1
void Extra_BitMatrixInsert1(Extra_BitMat_t *p, int i, int k)
Definition
extraUtilBitMatrix.c:190
Extra_BitMatrixCountOnesUpper
int Extra_BitMatrixCountOnesUpper(Extra_BitMat_t *p)
Definition
extraUtilBitMatrix.c:349
Extra_BitMatrixIsClique
int Extra_BitMatrixIsClique(Extra_BitMat_t *pMat)
Definition
extraUtilBitMatrix.c:391
Extra_BitMatrixLookup2
int Extra_BitMatrixLookup2(Extra_BitMat_t *p, int i, int k)
Definition
extraUtilBitMatrix.c:272
Extra_BitMatrixOr
void Extra_BitMatrixOr(Extra_BitMat_t *p, int i, unsigned *pInfo)
Definition
extraUtilBitMatrix.c:313
Extra_BitMatrixDelete1
void Extra_BitMatrixDelete1(Extra_BitMat_t *p, int i, int k)
Definition
extraUtilBitMatrix.c:230
Extra_BitMatrixOrTwo
void Extra_BitMatrixOrTwo(Extra_BitMat_t *p, int i, int j)
Definition
extraUtilBitMatrix.c:331
Extra_BitMatrixInsert2
void Extra_BitMatrixInsert2(Extra_BitMat_t *p, int i, int k)
Definition
extraUtilBitMatrix.c:252
Extra_BitMatrixIsDisjoint
int Extra_BitMatrixIsDisjoint(Extra_BitMat_t *p1, Extra_BitMat_t *p2)
Definition
extraUtilBitMatrix.c:369
Extra_BitMatrixStop
void Extra_BitMatrixStop(Extra_BitMat_t *p)
Definition
extraUtilBitMatrix.c:126
Extra_BitMatrixLookup1
int Extra_BitMatrixLookup1(Extra_BitMat_t *p, int i, int k)
Definition
extraUtilBitMatrix.c:210
extra.h
Extra_BitMat_t
struct Extra_BitMat_t_ Extra_BitMat_t
Definition
extra.h:81
Extra_BitMat_t_
Definition
extraUtilBitMatrix.c:33
Extra_BitMat_t_::nSize
int nSize
Definition
extraUtilBitMatrix.c:35
Extra_BitMat_t_::uMask
unsigned uMask
Definition
extraUtilBitMatrix.c:38
Extra_BitMat_t_::nInserts
int nInserts
Definition
extraUtilBitMatrix.c:40
Extra_BitMat_t_::ppData
unsigned ** ppData
Definition
extraUtilBitMatrix.c:34
Extra_BitMat_t_::nLookups
int nLookups
Definition
extraUtilBitMatrix.c:39
Extra_BitMat_t_::nWords
int nWords
Definition
extraUtilBitMatrix.c:36
Extra_BitMat_t_::nDeletes
int nDeletes
Definition
extraUtilBitMatrix.c:41
Extra_BitMat_t_::nBitShift
int nBitShift
Definition
extraUtilBitMatrix.c:37
assert
#define assert(ex)
Definition
util_old.h:213
memset
char * memset()
src
misc
extra
extraUtilBitMatrix.c
Generated by Doxygen 1.13.2 © 2025 EPTansuo. All rights reserved.
鲁ICP备2021046540号