Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
abc
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
abc
Commits
edcb769b
Commit
edcb769b
authored
Mar 05, 2011
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Adding new procedures to the library.
parent
5f69ce8b
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
206 additions
and
0 deletions
+206
-0
abclib.dsp
+4
-0
src/misc/extra/extra.h
+3
-0
src/misc/extra/extraBddMisc.c
+199
-0
No files found.
abclib.dsp
View file @
edcb769b
...
@@ -3515,6 +3515,10 @@ SOURCE=.\src\aig\saig\saigSimExt.c
...
@@ -3515,6 +3515,10 @@ SOURCE=.\src\aig\saig\saigSimExt.c
# End Source File
# End Source File
# Begin Source File
# Begin Source File
SOURCE=.\src\aig\saig\saigSimExt2.c
# End Source File
# Begin Source File
SOURCE=.\src\aig\saig\saigSimFast.c
SOURCE=.\src\aig\saig\saigSimFast.c
# End Source File
# End Source File
# Begin Source File
# Begin Source File
...
...
src/misc/extra/extra.h
View file @
edcb769b
...
@@ -198,6 +198,9 @@ extern void Extra_bddPermuteArray( DdManager * dd, DdNode ** bNodesIn, D
...
@@ -198,6 +198,9 @@ extern void Extra_bddPermuteArray( DdManager * dd, DdNode ** bNodesIn, D
extern
DdNode
*
Extra_bddComputeCube
(
DdManager
*
dd
,
DdNode
**
bXVars
,
int
nVars
);
extern
DdNode
*
Extra_bddComputeCube
(
DdManager
*
dd
,
DdNode
**
bXVars
,
int
nVars
);
extern
DdNode
*
Extra_bddChangePolarity
(
DdManager
*
dd
,
DdNode
*
bFunc
,
DdNode
*
bVars
);
extern
DdNode
*
Extra_bddChangePolarity
(
DdManager
*
dd
,
DdNode
*
bFunc
,
DdNode
*
bVars
);
extern
DdNode
*
extraBddChangePolarity
(
DdManager
*
dd
,
DdNode
*
bFunc
,
DdNode
*
bVars
);
extern
DdNode
*
extraBddChangePolarity
(
DdManager
*
dd
,
DdNode
*
bFunc
,
DdNode
*
bVars
);
extern
int
Extra_bddVarIsInCube
(
DdNode
*
bCube
,
int
iVar
);
extern
DdNode
*
Extra_bddAndPerm
(
DdManager
*
ddF
,
DdNode
*
bF
,
DdManager
*
ddG
,
DdNode
*
bG
);
extern
DdNode
*
extraBddAndPerm
(
DdManager
*
ddF
,
DdNode
*
bF
,
DdManager
*
ddG
,
DdNode
*
bG
);
#ifndef ABC_PRB
#ifndef ABC_PRB
#define ABC_PRB(dd,f) printf("%s = ", #f); Extra_bddPrint(dd,f); printf("\n")
#define ABC_PRB(dd,f) printf("%s = ", #f); Extra_bddPrint(dd,f); printf("\n")
...
...
src/misc/extra/extraBddMisc.c
View file @
edcb769b
...
@@ -1039,6 +1039,63 @@ DdNode * Extra_bddChangePolarity(
...
@@ -1039,6 +1039,63 @@ DdNode * Extra_bddChangePolarity(
}
/* end of Extra_bddChangePolarity */
}
/* end of Extra_bddChangePolarity */
/**Function*************************************************************
Synopsis [Checks if the given variable belongs to the cube.]
Description [Return -1 if the var does not appear in the cube.
Otherwise, returns polarity (0 or 1) of the var in the cube.]
SideEffects []
SeeAlso []
***********************************************************************/
int
Extra_bddVarIsInCube
(
DdNode
*
bCube
,
int
iVar
)
{
DdNode
*
bCube0
,
*
bCube1
;
while
(
Cudd_Regular
(
bCube
)
->
index
!=
CUDD_CONST_INDEX
)
{
bCube0
=
Cudd_NotCond
(
cuddE
(
Cudd_Regular
(
bCube
)),
Cudd_IsComplement
(
bCube
)
);
bCube1
=
Cudd_NotCond
(
cuddT
(
Cudd_Regular
(
bCube
)),
Cudd_IsComplement
(
bCube
)
);
// make sure it is a cube
assert
(
(
Cudd_IsComplement
(
bCube0
)
&&
Cudd_Regular
(
bCube0
)
->
index
==
CUDD_CONST_INDEX
)
||
// bCube0 == 0
(
Cudd_IsComplement
(
bCube1
)
&&
Cudd_Regular
(
bCube1
)
->
index
==
CUDD_CONST_INDEX
)
);
// bCube1 == 0
// quit if it is the last one
if
(
Cudd_Regular
(
bCube
)
->
index
==
iVar
)
return
(
int
)(
Cudd_IsComplement
(
bCube0
)
&&
Cudd_Regular
(
bCube0
)
->
index
==
CUDD_CONST_INDEX
);
// get the next cube
if
(
(
Cudd_IsComplement
(
bCube0
)
&&
Cudd_Regular
(
bCube0
)
->
index
==
CUDD_CONST_INDEX
)
)
bCube
=
bCube1
;
else
bCube
=
bCube0
;
}
return
-
1
;
}
/**Function*************************************************************
Synopsis [Computes the AND of two BDD with different orders.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
DdNode
*
Extra_bddAndPerm
(
DdManager
*
ddF
,
DdNode
*
bF
,
DdManager
*
ddG
,
DdNode
*
bG
)
{
DdNode
*
bRes
;
do
{
ddF
->
reordered
=
0
;
bRes
=
extraBddAndPerm
(
ddF
,
bF
,
ddG
,
bG
);
}
while
(
ddF
->
reordered
==
1
);
return
(
bRes
);
}
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* Definition of internal functions */
/* Definition of internal functions */
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
...
@@ -1805,6 +1862,148 @@ DdNode * extraBddChangePolarity(
...
@@ -1805,6 +1862,148 @@ DdNode * extraBddChangePolarity(
}
/* end of extraBddChangePolarity */
}
/* end of extraBddChangePolarity */
static
int
Counter
=
0
;
/**Function*************************************************************
Synopsis [Computes the AND of two BDD with different orders.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
DdNode
*
extraBddAndPerm
(
DdManager
*
ddF
,
DdNode
*
bF
,
DdManager
*
ddG
,
DdNode
*
bG
)
{
DdNode
*
bF0
,
*
bF1
,
*
bG0
,
*
bG1
,
*
bRes0
,
*
bRes1
,
*
bRes
,
*
bVar
;
int
LevF
,
LevG
,
Lev
;
// if F == 0, return 0
if
(
bF
==
Cudd_Not
(
ddF
->
one
)
)
return
Cudd_Not
(
ddF
->
one
);
// if G == 0, return 0
if
(
bG
==
Cudd_Not
(
ddG
->
one
)
)
return
Cudd_Not
(
ddF
->
one
);
// if G == 1, return F
if
(
bG
==
ddG
->
one
)
return
bF
;
// cannot use F == 1, because the var order of G has to be changed
// check cache
if
(
(
Cudd_Regular
(
bF
)
->
ref
!=
1
||
Cudd_Regular
(
bG
)
->
ref
!=
1
)
&&
(
bRes
=
cuddCacheLookup2
(
ddF
,
(
DD_CTFP
)
extraBddAndPerm
,
bF
,
bG
))
)
return
bRes
;
Counter
++
;
// find the topmost variable in F and G using var order of F
LevF
=
cuddI
(
ddF
,
Cudd_Regular
(
bF
)
->
index
);
LevG
=
cuddI
(
ddF
,
Cudd_Regular
(
bG
)
->
index
);
Lev
=
ABC_MIN
(
LevF
,
LevG
);
assert
(
Lev
<
ddF
->
size
);
bVar
=
ddF
->
vars
[
ddF
->
invperm
[
Lev
]];
// cofactor
bF0
=
(
Lev
<
LevF
)
?
bF
:
Cudd_NotCond
(
cuddE
(
Cudd_Regular
(
bF
)),
Cudd_IsComplement
(
bF
)
);
bF1
=
(
Lev
<
LevF
)
?
bF
:
Cudd_NotCond
(
cuddT
(
Cudd_Regular
(
bF
)),
Cudd_IsComplement
(
bF
)
);
bG0
=
(
Lev
<
LevG
)
?
bG
:
Cudd_NotCond
(
cuddE
(
Cudd_Regular
(
bG
)),
Cudd_IsComplement
(
bG
)
);
bG1
=
(
Lev
<
LevG
)
?
bG
:
Cudd_NotCond
(
cuddT
(
Cudd_Regular
(
bG
)),
Cudd_IsComplement
(
bG
)
);
// call for cofactors
bRes0
=
extraBddAndPerm
(
ddF
,
bF0
,
ddG
,
bG0
);
if
(
bRes0
==
NULL
)
return
NULL
;
cuddRef
(
bRes0
);
// call for cofactors
bRes1
=
extraBddAndPerm
(
ddF
,
bF1
,
ddG
,
bG1
);
if
(
bRes1
==
NULL
)
{
Cudd_IterDerefBdd
(
ddF
,
bRes0
);
return
NULL
;
}
cuddRef
(
bRes1
);
// compose the result
bRes
=
cuddBddIteRecur
(
ddF
,
bVar
,
bRes1
,
bRes0
);
if
(
bRes
==
NULL
)
{
Cudd_IterDerefBdd
(
ddF
,
bRes0
);
Cudd_IterDerefBdd
(
ddF
,
bRes1
);
}
cuddRef
(
bRes
);
Cudd_IterDerefBdd
(
ddF
,
bRes0
);
Cudd_IterDerefBdd
(
ddF
,
bRes1
);
// cache the result
if
(
Cudd_Regular
(
bF
)
->
ref
!=
1
||
Cudd_Regular
(
bG
)
->
ref
!=
1
)
cuddCacheInsert2
(
ddF
,
(
DD_CTFP
)
extraBddAndPerm
,
bF
,
bG
,
bRes
);
cuddDeref
(
bRes
);
return
bRes
;
}
/**Function*************************************************************
Synopsis [Testbench.]
Description [This procedure takes BDD manager ddF and two BDDs
in this manager (bF and bG). It creates a new manager ddG,
transfers bG into it and then reorders it, resulting in bG2.
Then it tries to compute the product of bF and bG2 in ddF.]
SideEffects []
SeeAlso []
***********************************************************************/
void
Extra_TestAndPerm
(
DdManager
*
ddF
,
DdNode
*
bF
,
DdNode
*
bG
)
{
DdManager
*
ddG
;
DdNode
*
bG2
,
*
bRes1
,
*
bRes2
;
int
clk
;
// disable variable ordering in ddF
Cudd_AutodynDisable
(
ddF
);
// create new BDD manager
ddG
=
Cudd_Init
(
ddF
->
size
,
0
,
CUDD_UNIQUE_SLOTS
,
CUDD_CACHE_SLOTS
,
0
);
// transfer BDD into it
Cudd_ShuffleHeap
(
ddG
,
ddF
->
invperm
);
bG2
=
Extra_TransferLevelByLevel
(
ddF
,
ddG
,
bG
);
Cudd_Ref
(
bG2
);
// reorder the new manager
Cudd_ReduceHeap
(
ddG
,
CUDD_REORDER_SYMM_SIFT
,
1
);
// compute the result
clk
=
clock
();
bRes1
=
Cudd_bddAnd
(
ddF
,
bF
,
bG
);
Cudd_Ref
(
bRes1
);
Abc_PrintTime
(
1
,
"Runtime of Cudd_bddAnd "
,
clock
()
-
clk
);
// compute the result
Counter
=
0
;
clk
=
clock
();
bRes2
=
Extra_bddAndPerm
(
ddF
,
bF
,
ddG
,
bG2
);
Cudd_Ref
(
bRes2
);
Abc_PrintTime
(
1
,
"Runtime of new procedure"
,
clock
()
-
clk
);
printf
(
"Recursive calls = %d
\n
"
,
Counter
);
printf
(
"|F| =%6d |G| =%6d |H| =%6d |F|*|G| =%9d "
,
Cudd_DagSize
(
bF
),
Cudd_DagSize
(
bG
),
Cudd_DagSize
(
bRes2
),
Cudd_DagSize
(
bF
)
*
Cudd_DagSize
(
bG
)
);
if
(
bRes1
==
bRes2
)
printf
(
"Result verified.
\n\n
"
);
else
printf
(
"Result is incorrect.
\n\n
"
);
Cudd_RecursiveDeref
(
ddF
,
bRes1
);
Cudd_RecursiveDeref
(
ddF
,
bRes2
);
// quit the new manager
Cudd_RecursiveDeref
(
ddG
,
bG2
);
Extra_StopManager
(
ddG
);
// re-enable variable ordering in ddF
Cudd_AutodynEnable
(
ddF
,
CUDD_REORDER_SYMM_SIFT
);
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment