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
c395afe2
Commit
c395afe2
authored
Feb 11, 2012
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Graph isomorphism checking code.
parent
112f797c
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
46 additions
and
27 deletions
+46
-27
src/aig/saig/saigIso.c
+4
-4
src/aig/saig/saigIsoSlow.c
+42
-23
No files found.
src/aig/saig/saigIso.c
View file @
c395afe2
...
...
@@ -45,7 +45,7 @@ ABC_NAMESPACE_IMPL_START
***********************************************************************/
Vec_Int_t
*
Saig_ManFindIsoPermCos
(
Aig_Man_t
*
pAig
,
Vec_Int_t
*
vPermCis
)
{
extern
int
Iso_ObjCompare
AigObj
ByData
(
Aig_Obj_t
**
pp1
,
Aig_Obj_t
**
pp2
);
extern
int
Iso_ObjCompareByData
(
Aig_Obj_t
**
pp1
,
Aig_Obj_t
**
pp2
);
Vec_Int_t
*
vPermCos
;
Aig_Obj_t
*
pObj
,
*
pFanin
;
int
i
,
Entry
,
Diff
;
...
...
@@ -63,7 +63,7 @@ Vec_Int_t * Saig_ManFindIsoPermCos( Aig_Man_t * pAig, Vec_Int_t * vPermCis )
pObj
->
iData
=
Abc_Var2Lit
(
pFanin
->
iData
,
Aig_ObjFaninC0
(
pObj
)
);
Vec_PtrPush
(
vRoots
,
pObj
);
}
Vec_PtrSort
(
vRoots
,
(
int
(
*
)(
void
))
Iso_ObjCompare
AigObj
ByData
);
Vec_PtrSort
(
vRoots
,
(
int
(
*
)(
void
))
Iso_ObjCompareByData
);
Vec_PtrForEachEntry
(
Aig_Obj_t
*
,
vRoots
,
pObj
,
i
)
Vec_IntPush
(
vPermCos
,
Aig_ObjPioNum
(
pObj
)
);
Vec_PtrFree
(
vRoots
);
...
...
@@ -433,8 +433,8 @@ Aig_Man_t * Iso_ManFilterPos( Aig_Man_t * pAig, int fVerbose )
vBuffers
=
Vec_PtrAlloc
(
nPos
);
for
(
i
=
0
;
i
<
nPos
;
i
++
)
{
//
if ( i % 100 == 0 )
// printf( "%
d finished...\n", i );
if
(
i
%
100
==
0
)
printf
(
"%6
d finished...
\n
"
,
i
);
pPart
=
Saig_ManDupCones
(
pAig
,
&
i
,
1
);
pTemp
=
Saig_ManDupIsoCanonical
(
pPart
,
0
);
vStr
=
Ioa_WriteAigerIntoMemoryStr
(
pTemp
);
...
...
src/aig/saig/saigIsoSlow.c
View file @
c395afe2
...
...
@@ -64,6 +64,10 @@ struct Iso_Man_t_
Vec_Ptr_t
*
vClasses
;
// other classes
Vec_Ptr_t
*
vTemp1
;
// other classes
Vec_Ptr_t
*
vTemp2
;
// other classes
int
timeHash
;
int
timeFout
;
int
timeOther
;
int
timeTotal
;
};
static
inline
Iso_Obj_t
*
Iso_ManObj
(
Iso_Man_t
*
p
,
int
i
)
{
assert
(
i
>=
0
&&
i
<
p
->
nObjs
);
return
i
?
p
->
pObjs
+
i
:
NULL
;
}
...
...
@@ -135,10 +139,20 @@ Iso_Man_t * Iso_ManStart( Aig_Man_t * pAig )
p
->
nObjIds
=
1
;
return
p
;
}
void
Iso_ManStop
(
Iso_Man_t
*
p
)
void
Iso_ManStop
(
Iso_Man_t
*
p
,
int
fVerbose
)
{
Iso_Obj_t
*
pIso
;
int
i
;
if
(
fVerbose
)
{
p
->
timeOther
=
p
->
timeTotal
-
p
->
timeHash
-
p
->
timeFout
;
ABC_PRTP
(
"Building "
,
p
->
timeFout
,
p
->
timeTotal
);
ABC_PRTP
(
"Hashing "
,
p
->
timeHash
,
p
->
timeTotal
);
ABC_PRTP
(
"Other "
,
p
->
timeOther
,
p
->
timeTotal
);
ABC_PRTP
(
"TOTAL "
,
p
->
timeTotal
,
p
->
timeTotal
);
}
Iso_ManForEachObj
(
p
,
pIso
,
i
)
Vec_IntFreeP
(
&
pIso
->
vAllies
);
Vec_PtrFree
(
p
->
vTemp1
);
...
...
@@ -183,25 +197,7 @@ int Iso_ObjCompare( Iso_Obj_t ** pp1, Iso_Obj_t ** pp2 )
SeeAlso []
***********************************************************************/
int
Iso_ObjCompareById
(
Iso_Obj_t
**
pp1
,
Iso_Obj_t
**
pp2
)
{
Iso_Obj_t
*
pIso1
=
*
pp1
;
Iso_Obj_t
*
pIso2
=
*
pp2
;
return
pIso1
->
Id
-
pIso2
->
Id
;
}
/**Function*************************************************************
Synopsis [Compares two objects by their ID.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int
Iso_ObjCompareAigObjByData
(
Aig_Obj_t
**
pp1
,
Aig_Obj_t
**
pp2
)
int
Iso_ObjCompareByData
(
Aig_Obj_t
**
pp1
,
Aig_Obj_t
**
pp2
)
{
Aig_Obj_t
*
pIso1
=
*
pp1
;
Aig_Obj_t
*
pIso2
=
*
pp2
;
...
...
@@ -229,6 +225,12 @@ static inline int Iso_ObjHash( Iso_Obj_t * pIso, int nBins )
assert
(
ISO_NUM_INTS
<
8
);
for
(
i
=
0
;
i
<
ISO_NUM_INTS
;
i
++
)
Value
^=
BigPrimes
[
i
]
*
pArray
[
i
];
if
(
pIso
->
vAllies
)
{
pArray
=
(
unsigned
*
)
Vec_IntArray
(
pIso
->
vAllies
);
for
(
i
=
0
;
i
<
(
unsigned
)
Vec_IntSize
(
pIso
->
vAllies
);
i
++
)
Value
^=
BigPrimes
[
i
&
7
]
*
pArray
[
i
];
}
return
Value
%
nBins
;
}
static
inline
int
Iso_ObjHashAdd
(
Iso_Man_t
*
p
,
Iso_Obj_t
*
pIso
)
...
...
@@ -275,6 +277,8 @@ void Iso_ManCollectClasses( Iso_Man_t * p )
Vec_PtrClear
(
p
->
vSingles
);
Vec_PtrClear
(
p
->
vClasses
);
for
(
i
=
0
;
i
<
p
->
nBins
;
i
++
)
{
// int Counter = 0;
for
(
pIso
=
Iso_ManObj
(
p
,
p
->
pBins
[
i
]);
pIso
;
pIso
=
Iso_ManObj
(
p
,
pIso
->
iNext
)
)
{
assert
(
pIso
->
Id
==
0
);
...
...
@@ -282,7 +286,12 @@ void Iso_ManCollectClasses( Iso_Man_t * p )
Vec_PtrPush
(
p
->
vClasses
,
pIso
);
else
Vec_PtrPush
(
p
->
vSingles
,
pIso
);
// Counter++;
}
// if ( Counter )
// printf( "%d ", Counter );
}
// printf( "\n" );
Vec_PtrSort
(
p
->
vSingles
,
(
int
(
*
)(
void
))
Iso_ObjCompare
);
Vec_PtrSort
(
p
->
vClasses
,
(
int
(
*
)(
void
))
Iso_ObjCompare
);
assert
(
Vec_PtrSize
(
p
->
vSingles
)
==
p
->
nSingles
);
...
...
@@ -679,8 +688,8 @@ Vec_Int_t * Iso_ManFinalize( Iso_Man_t * p )
Vec_PtrPush
(
p
->
vTemp1
,
pObj
);
}
// sort CIs by their IDs
Vec_PtrSort
(
p
->
vTemp1
,
(
int
(
*
)(
void
))
Iso_ObjCompare
AigObj
ByData
);
Vec_PtrSort
(
p
->
vTemp2
,
(
int
(
*
)(
void
))
Iso_ObjCompare
AigObj
ByData
);
Vec_PtrSort
(
p
->
vTemp1
,
(
int
(
*
)(
void
))
Iso_ObjCompareByData
);
Vec_PtrSort
(
p
->
vTemp2
,
(
int
(
*
)(
void
))
Iso_ObjCompareByData
);
// create the result
vRes
=
Vec_IntAlloc
(
Aig_ManPiNum
(
p
->
pAig
)
);
Vec_PtrForEachEntry
(
Aig_Obj_t
*
,
p
->
vTemp1
,
pObj
,
i
)
...
...
@@ -735,14 +744,19 @@ Vec_Int_t * Saig_ManFindIsoPerm( Aig_Man_t * pAig, int fVerbose )
{
Vec_Int_t
*
vRes
;
Iso_Man_t
*
p
;
int
clk
,
clk2
=
clock
();
p
=
Iso_ManCreate
(
pAig
);
Iso_ManPrintClasses
(
p
,
fVerbose
,
0
);
while
(
p
->
nClasses
)
{
// assign adjacency to classes
clk
=
clock
();
Iso_ManAssignAdjacency
(
p
);
p
->
timeFout
+=
clock
()
-
clk
;
// rehash the class nodes
clk
=
clock
();
Iso_ManRehashClassNodes
(
p
);
p
->
timeHash
+=
clock
()
-
clk
;
Iso_ManPrintClasses
(
p
,
fVerbose
,
0
);
// force refinement
while
(
p
->
nSingles
==
0
&&
p
->
nClasses
)
...
...
@@ -750,18 +764,23 @@ Vec_Int_t * Saig_ManFindIsoPerm( Aig_Man_t * pAig, int fVerbose )
// assign IDs to the topmost level of classes
Iso_ManBreakTies
(
p
,
fVerbose
);
// assign adjacency to classes
clk
=
clock
();
Iso_ManAssignAdjacency
(
p
);
p
->
timeFout
+=
clock
()
-
clk
;
// rehash the class nodes
clk
=
clock
();
Iso_ManRehashClassNodes
(
p
);
p
->
timeHash
+=
clock
()
-
clk
;
Iso_ManPrintClasses
(
p
,
fVerbose
,
0
);
}
}
p
->
timeTotal
=
clock
()
-
clk2
;
// printf( "IDs assigned = %d. Objects = %d.\n", p->nObjIds, 1+Aig_ManPiNum(p->pAig)+Aig_ManNodeNum(p->pAig) );
assert
(
p
->
nObjIds
==
1
+
Aig_ManPiNum
(
p
->
pAig
)
+
Aig_ManNodeNum
(
p
->
pAig
)
);
// if ( p->nClasses )
// Iso_ManDumpOneClass( p );
vRes
=
Iso_ManFinalize
(
p
);
Iso_ManStop
(
p
);
Iso_ManStop
(
p
,
fVerbose
);
return
vRes
;
}
...
...
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