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
fe5b5ffe
Commit
fe5b5ffe
authored
May 21, 2014
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Experiment with new idea for ISO.
parent
ab85108c
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
239 additions
and
2 deletions
+239
-2
src/aig/gia/giaIso3.c
+235
-0
src/aig/gia/module.make
+1
-0
src/base/abci/abc.c
+3
-2
No files found.
src/aig/gia/giaIso3.c
0 → 100644
View file @
fe5b5ffe
/**CFile****************************************************************
FileName [giaIso3.c]
SystemName [ABC: Logic synthesis and verification system.]
PackageName [Scalable AIG package.]
Synopsis []
Author [Alan Mishchenko]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - June 20, 2005.]
Revision [$Id: giaIso3.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
***********************************************************************/
#include "gia.h"
ABC_NAMESPACE_IMPL_START
////////////////////////////////////////////////////////////////////////
/// DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
static
unsigned
Iso_Nodes
[
6
]
=
{
0x04892ed6
,
0xc2523d7d
,
0xdc36cd2e
,
0xf2db64f8
,
0xde3126bb
,
0xdebbdff0
};
// ab, a!b, !a!b, pi, po, const0
static
unsigned
Iso_Fanio
[
2
]
=
{
0x855ee0cf
,
0x946e1b5f
};
// fanin, fanout
static
unsigned
Iso_Compl
[
2
]
=
{
0x8ba63e50
,
0x14d87f02
};
// non-compl, compl
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
Synopsis [Counts the number of unique entries.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static
inline
unsigned
Vec_IntUniqueHashKey
(
unsigned
char
*
pStr
,
int
nChars
)
{
static
unsigned
s_BigPrimes
[
4
]
=
{
12582917
,
25165843
,
50331653
,
100663319
};
unsigned
Key
=
0
;
int
c
;
for
(
c
=
0
;
c
<
nChars
;
c
++
)
Key
+=
(
unsigned
)
pStr
[
c
]
*
s_BigPrimes
[
c
&
3
];
return
Key
;
}
static
inline
int
*
Vec_IntUniqueLookup
(
Vec_Int_t
*
vData
,
int
i
,
int
nIntSize
,
int
*
pNexts
,
int
*
pStart
)
{
int
*
pData
=
Vec_IntEntryP
(
vData
,
i
*
nIntSize
);
for
(
;
*
pStart
!=
-
1
;
pStart
=
pNexts
+
*
pStart
)
if
(
!
memcmp
(
pData
,
Vec_IntEntryP
(
vData
,
*
pStart
*
nIntSize
),
sizeof
(
int
)
*
nIntSize
)
)
return
pStart
;
return
pStart
;
}
static
inline
int
Vec_IntUniqueCount
(
Vec_Int_t
*
vData
,
int
nIntSize
,
Vec_Int_t
**
pvMap
)
{
int
nEntries
=
Vec_IntSize
(
vData
)
/
nIntSize
;
int
TableMask
=
(
1
<<
Abc_Base2Log
(
nEntries
))
-
1
;
int
*
pTable
=
ABC_FALLOC
(
int
,
TableMask
+
1
);
int
*
pNexts
=
ABC_FALLOC
(
int
,
TableMask
+
1
);
int
*
pClass
=
ABC_ALLOC
(
int
,
nEntries
);
int
i
,
Key
,
*
pEnt
,
nUnique
=
0
;
assert
(
nEntries
*
nIntSize
==
Vec_IntSize
(
vData
)
);
for
(
i
=
0
;
i
<
nEntries
;
i
++
)
{
pEnt
=
Vec_IntEntryP
(
vData
,
i
*
nIntSize
);
Key
=
TableMask
&
Vec_IntUniqueHashKey
(
(
unsigned
char
*
)
pEnt
,
4
*
nIntSize
);
pEnt
=
Vec_IntUniqueLookup
(
vData
,
i
,
nIntSize
,
pNexts
,
pTable
+
Key
);
if
(
*
pEnt
==
-
1
)
*
pEnt
=
i
,
nUnique
++
;
pClass
[
i
]
=
*
pEnt
;
}
ABC_FREE
(
pTable
);
ABC_FREE
(
pNexts
);
if
(
pvMap
)
*
pvMap
=
Vec_IntAllocArray
(
pClass
,
nEntries
);
else
ABC_FREE
(
pClass
);
return
nUnique
;
}
static
inline
Vec_Int_t
*
Vec_IntUniqifyHash
(
Vec_Int_t
*
vData
,
int
nIntSize
)
{
Vec_Int_t
*
vMap
,
*
vUnique
;
int
i
,
Ent
,
nUnique
=
Vec_IntUniqueCount
(
vData
,
nIntSize
,
&
vMap
);
vUnique
=
Vec_IntAlloc
(
nUnique
*
nIntSize
);
Vec_IntForEachEntry
(
vMap
,
Ent
,
i
)
{
if
(
Ent
<
i
)
continue
;
assert
(
Ent
==
i
);
Vec_IntPushArray
(
vUnique
,
Vec_IntEntryP
(
vData
,
i
*
nIntSize
),
nIntSize
);
}
assert
(
Vec_IntSize
(
vUnique
)
==
nUnique
*
nIntSize
);
Vec_IntFree
(
vMap
);
return
vUnique
;
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static
inline
unsigned
Gia_Iso3Node
(
Gia_Obj_t
*
pObj
)
{
if
(
Gia_ObjIsAnd
(
pObj
)
)
return
Iso_Nodes
[
Gia_ObjFaninC0
(
pObj
)
+
Gia_ObjFaninC1
(
pObj
)];
if
(
Gia_ObjIsCi
(
pObj
)
)
return
Iso_Nodes
[
3
];
if
(
Gia_ObjIsCo
(
pObj
)
)
return
Iso_Nodes
[
4
];
return
Iso_Nodes
[
5
];
}
void
Gia_Iso3Init
(
Gia_Man_t
*
p
)
{
Gia_Obj_t
*
pObj
;
int
i
;
Gia_ManForEachObj
(
p
,
pObj
,
i
)
pObj
->
Value
=
Gia_Iso3Node
(
pObj
);
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static
inline
void
Gia_Iso3ComputeEdge
(
Gia_Man_t
*
p
,
Gia_Obj_t
*
pObj
,
Gia_Obj_t
*
pFanin
,
int
fCompl
,
Vec_Int_t
*
vSign
)
{
pObj
->
Value
+=
Vec_IntEntry
(
vSign
,
Gia_ObjId
(
p
,
pFanin
))
+
Iso_Compl
[
fCompl
]
+
Iso_Fanio
[
0
];
pFanin
->
Value
+=
Vec_IntEntry
(
vSign
,
Gia_ObjId
(
p
,
pObj
))
+
Iso_Compl
[
fCompl
]
+
Iso_Fanio
[
1
];
}
void
Gia_Iso3Compute
(
Gia_Man_t
*
p
,
Vec_Int_t
*
vSign
)
{
Gia_Obj_t
*
pObj
;
int
i
;
Gia_ManForEachObj
(
p
,
pObj
,
i
)
{
if
(
Gia_ObjIsAnd
(
pObj
)
||
Gia_ObjIsCo
(
pObj
)
)
Gia_Iso3ComputeEdge
(
p
,
pObj
,
Gia_ObjFanin0
(
pObj
),
Gia_ObjFaninC0
(
pObj
),
vSign
);
if
(
Gia_ObjIsAnd
(
pObj
)
)
Gia_Iso3ComputeEdge
(
p
,
pObj
,
Gia_ObjFanin1
(
pObj
),
Gia_ObjFaninC1
(
pObj
),
vSign
);
}
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static
inline
Vec_Int_t
*
Gia_Iso3Save
(
Gia_Man_t
*
p
)
{
Vec_Int_t
*
vSign
;
Gia_Obj_t
*
pObj
;
int
i
;
vSign
=
Vec_IntAlloc
(
Gia_ManObjNum
(
p
)
);
Gia_ManForEachObj
(
p
,
pObj
,
i
)
Vec_IntPush
(
vSign
,
pObj
->
Value
);
return
vSign
;
}
int
Gia_Iso3Unique
(
Vec_Int_t
*
vSign
)
{
int
nUnique
;
Vec_Int_t
*
vCopy
=
Vec_IntDup
(
vSign
);
Vec_IntUniqify
(
vCopy
);
nUnique
=
Vec_IntSize
(
vCopy
);
Vec_IntFree
(
vCopy
);
return
nUnique
;
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void
Gia_Iso3Test
(
Gia_Man_t
*
p
)
{
int
nIterMax
=
500
;
int
i
,
Prev
=
-
1
,
This
;
abctime
clk
=
Abc_Clock
();
Vec_Int_t
*
vSign
=
NULL
;
Gia_Iso3Init
(
p
);
for
(
i
=
0
;
i
<
nIterMax
;
i
++
)
{
vSign
=
Gia_Iso3Save
(
p
);
// This = Gia_Iso3Unique( vSign );
This
=
Vec_IntUniqueCount
(
vSign
,
1
,
NULL
);
printf
(
"Iter %3d : %6d out of %6d "
,
i
,
This
,
Vec_IntSize
(
vSign
)
);
Abc_PrintTime
(
1
,
"Time"
,
Abc_Clock
()
-
clk
);
if
(
This
==
Prev
)
break
;
Prev
=
This
;
Gia_Iso3Compute
(
p
,
vSign
);
Vec_IntFreeP
(
&
vSign
);
}
Vec_IntFreeP
(
&
vSign
);
}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
ABC_NAMESPACE_IMPL_END
src/aig/gia/module.make
View file @
fe5b5ffe
...
...
@@ -30,6 +30,7 @@ SRC += src/aig/gia/giaAig.c \
src/aig/gia/giaIff.c
\
src/aig/gia/giaIso.c
\
src/aig/gia/giaIso2.c
\
src/aig/gia/giaIso3.c
\
src/aig/gia/giaJf.c
\
src/aig/gia/giaKf.c
\
src/aig/gia/giaMan.c
\
...
...
src/base/abci/abc.c
View file @
fe5b5ffe
...
...
@@ -34951,7 +34951,8 @@ int Abc_CommandAbc9Test( Abc_Frame_t * pAbc, int argc, char ** argv )
// extern void Agi_ManTest( Gia_Man_t * pGia );
// extern void Gia_ManCheckFalseTest( Gia_Man_t * p, int nSlackMax );
// extern void Gia_ParTest( Gia_Man_t * p, int nWords, int nProcs );
extern
void
Gia_ManTisTest
(
Gia_Man_t
*
pInit
);
// extern void Gia_ManTisTest( Gia_Man_t * pInit );
extern
void
Gia_Iso3Test
(
Gia_Man_t
*
p
);
Extra_UtilGetoptReset
();
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"WPFsvh"
)
)
!=
EOF
)
...
...
@@ -35055,7 +35056,7 @@ int Abc_CommandAbc9Test( Abc_Frame_t * pAbc, int argc, char ** argv )
// Jf_ManTestCnf( pAbc->pGia );
// Gia_ManCheckFalseTest( pAbc->pGia, nFrames );
// Gia_ParTest( pAbc->pGia, nWords, nProcs );
Gia_
ManTis
Test
(
pAbc
->
pGia
);
Gia_
Iso3
Test
(
pAbc
->
pGia
);
// printf( "\nThis command is currently disabled.\n\n" );
return
0
;
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