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
8e5d771f
Commit
8e5d771f
authored
Dec 08, 2012
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Deriving CEX after phase/tempor/reparam.
parent
5d74635f
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
227 additions
and
32 deletions
+227
-32
src/aig/gia/gia.h
+1
-1
src/aig/gia/giaIso.c
+16
-9
src/base/abci/abc.c
+92
-21
src/misc/util/utilCex.c
+114
-1
src/misc/util/utilCex.h
+4
-0
No files found.
src/aig/gia/gia.h
View file @
8e5d771f
...
...
@@ -855,7 +855,7 @@ extern void Gia_ManSetIfParsDefault( void * pIfPars );
extern
Gia_Man_t
*
Gia_ManPerformMapping
(
Gia_Man_t
*
p
,
void
*
pIfPars
);
/*=== giaIso.c ===========================================================*/
extern
Gia_Man_t
*
Gia_ManIsoCanonicize
(
Gia_Man_t
*
p
,
int
fVerbose
);
extern
Gia_Man_t
*
Gia_ManIsoReduce
(
Gia_Man_t
*
p
,
Vec_Ptr_t
**
pvPosEquivs
,
int
fDualOut
,
int
fVerbose
);
extern
Gia_Man_t
*
Gia_ManIsoReduce
(
Gia_Man_t
*
p
,
Vec_Ptr_t
**
pvPosEquivs
,
Vec_Ptr_t
**
pvPiPerms
,
int
fDualOut
,
int
fVerbose
);
/*=== giaLogic.c ===========================================================*/
extern
void
Gia_ManTestDistance
(
Gia_Man_t
*
p
);
extern
void
Gia_ManSolveProblem
(
Gia_Man_t
*
pGia
,
Emb_Par_t
*
pPars
);
...
...
src/aig/gia/giaIso.c
View file @
8e5d771f
...
...
@@ -876,7 +876,7 @@ void Gia_ManFindCaninicalOrder_rec( Gia_Man_t * p, Gia_Obj_t * pObj, Vec_Int_t *
}
Vec_IntPush
(
vAnds
,
Gia_ObjId
(
p
,
pObj
)
);
}
void
Gia_ManFindCaninicalOrder
(
Gia_Man_t
*
p
,
Vec_Int_t
*
vCis
,
Vec_Int_t
*
vAnds
,
Vec_Int_t
*
vCos
)
void
Gia_ManFindCaninicalOrder
(
Gia_Man_t
*
p
,
Vec_Int_t
*
vCis
,
Vec_Int_t
*
vAnds
,
Vec_Int_t
*
vCos
,
Vec_Int_t
**
pvPiPerm
)
{
Vec_Ptr_t
*
vTemp
;
Gia_Obj_t
*
pObj
;
...
...
@@ -895,6 +895,10 @@ void Gia_ManFindCaninicalOrder( Gia_Man_t * p, Vec_Int_t * vCis, Vec_Int_t * vAn
// create the result
Vec_PtrForEachEntry
(
Gia_Obj_t
*
,
vTemp
,
pObj
,
i
)
Vec_IntPush
(
vCis
,
Gia_ObjId
(
p
,
pObj
)
);
// remember PI permutation
if
(
pvPiPerm
)
Vec_PtrForEachEntry
(
Gia_Obj_t
*
,
vTemp
,
pObj
,
i
)
Vec_IntPush
(
*
pvPiPerm
,
Gia_ObjCioId
(
pObj
)
);
// assign unique IDs to POs
if
(
Gia_ManPoNum
(
p
)
==
1
)
...
...
@@ -999,7 +1003,7 @@ Gia_Man_t * Gia_ManIsoCanonicize( Gia_Man_t * p, int fVerbose )
vCis
=
Vec_IntAlloc
(
Gia_ManCiNum
(
p
)
);
vAnds
=
Vec_IntAlloc
(
Gia_ManAndNum
(
p
)
);
vCos
=
Vec_IntAlloc
(
Gia_ManCoNum
(
p
)
);
Gia_ManFindCaninicalOrder
(
p
,
vCis
,
vAnds
,
vCos
);
Gia_ManFindCaninicalOrder
(
p
,
vCis
,
vAnds
,
vCos
,
NULL
);
// derive the new AIG
vResult
=
Gia_ManDupFromVecs
(
p
,
vCis
,
vAnds
,
vCos
,
Gia_ManRegNum
(
p
)
);
// cleanup
...
...
@@ -1020,7 +1024,7 @@ Gia_Man_t * Gia_ManIsoCanonicize( Gia_Man_t * p, int fVerbose )
SeeAlso []
***********************************************************************/
Vec_Str_t
*
Gia_ManIsoFindString
(
Gia_Man_t
*
p
,
int
iPo
,
int
fVerbose
)
Vec_Str_t
*
Gia_ManIsoFindString
(
Gia_Man_t
*
p
,
int
iPo
,
int
fVerbose
,
Vec_Int_t
**
pvPiPerm
)
{
Gia_Man_t
*
pPart
;
Vec_Ptr_t
*
vEquiv
;
...
...
@@ -1044,7 +1048,7 @@ Vec_Str_t * Gia_ManIsoFindString( Gia_Man_t * p, int iPo, int fVerbose )
vCis
=
Vec_IntAlloc
(
Gia_ManCiNum
(
pPart
)
);
vAnds
=
Vec_IntAlloc
(
Gia_ManAndNum
(
pPart
)
);
vCos
=
Vec_IntAlloc
(
Gia_ManCoNum
(
pPart
)
);
Gia_ManFindCaninicalOrder
(
pPart
,
vCis
,
vAnds
,
vCos
);
Gia_ManFindCaninicalOrder
(
pPart
,
vCis
,
vAnds
,
vCos
,
pvPiPerm
);
// derive the AIGER string
vStr
=
Gia_WriteAigerIntoMemoryStrPart
(
pPart
,
vCis
,
vAnds
,
vCos
,
Gia_ManRegNum
(
pPart
)
);
// cleanup
...
...
@@ -1066,17 +1070,19 @@ Vec_Str_t * Gia_ManIsoFindString( Gia_Man_t * p, int iPo, int fVerbose )
SeeAlso []
***********************************************************************/
Gia_Man_t
*
Gia_ManIsoReduce
(
Gia_Man_t
*
pInit
,
Vec_Ptr_t
**
pvPosEquivs
,
int
fDualOut
,
int
fVerbose
)
Gia_Man_t
*
Gia_ManIsoReduce
(
Gia_Man_t
*
pInit
,
Vec_Ptr_t
**
pvPosEquivs
,
Vec_Ptr_t
**
pvPiPerms
,
int
fDualOut
,
int
fVerbose
)
{
int
fVeryVerbose
=
0
;
Gia_Man_t
*
p
,
*
pPart
;
Vec_Ptr_t
*
vEquivs
,
*
vEquivs2
,
*
vStrings
;
Vec_Int_t
*
vRemain
,
*
vLevel
,
*
vLevel2
;
Vec_Str_t
*
vStr
,
*
vStr2
;
int
i
,
k
,
s
,
sStart
,
Entry
,
Counter
;
int
i
,
k
,
s
,
sStart
,
iPo
,
Counter
;
clock_t
clk
=
clock
();
if
(
pvPosEquivs
)
*
pvPosEquivs
=
NULL
;
if
(
pvPiPerms
)
*
pvPiPerms
=
Vec_PtrStart
(
Gia_ManPoNum
(
pInit
)
);
if
(
fDualOut
)
{
...
...
@@ -1120,11 +1126,12 @@ Gia_Man_t * Gia_ManIsoReduce( Gia_Man_t * pInit, Vec_Ptr_t ** pvPosEquivs, int f
}
sStart
=
Vec_PtrSize
(
vEquivs2
);
vStrings
=
Vec_PtrAlloc
(
100
);
Vec_IntForEachEntry
(
vLevel
,
Entry
,
k
)
Vec_IntForEachEntry
(
vLevel
,
iPo
,
k
)
{
if
(
++
Counter
%
100
==
0
)
printf
(
"%6d finished...
\r
"
,
Counter
);
vStr
=
Gia_ManIsoFindString
(
p
,
Entry
,
0
);
assert
(
pvPiPerms
==
NULL
||
Vec_PtrArray
(
*
pvPiPerms
)[
iPo
]
==
NULL
);
vStr
=
Gia_ManIsoFindString
(
p
,
iPo
,
0
,
pvPiPerms
?
(
Vec_Int_t
**
)
Vec_PtrArray
(
*
pvPiPerms
)
+
iPo
:
NULL
);
// check if this string already exists
Vec_PtrForEachEntry
(
Vec_Str_t
*
,
vStrings
,
vStr2
,
s
)
if
(
Vec_StrCompareVec
(
vStr
,
vStr2
)
==
0
)
...
...
@@ -1138,7 +1145,7 @@ Gia_Man_t * Gia_ManIsoReduce( Gia_Man_t * pInit, Vec_Ptr_t ** pvPosEquivs, int f
Vec_StrFree
(
vStr
);
// add this entry to the corresponding level
vLevel2
=
(
Vec_Int_t
*
)
Vec_PtrEntry
(
vEquivs2
,
sStart
+
s
);
Vec_IntPush
(
vLevel2
,
Entry
);
Vec_IntPush
(
vLevel2
,
iPo
);
}
Vec_VecFree
(
(
Vec_Vec_t
*
)
vStrings
);
}
...
...
src/base/abci/abc.c
View file @
8e5d771f
...
...
@@ -17888,11 +17888,11 @@ usage:
int
Abc_CommandDarPhase
(
Abc_Frame_t
*
pAbc
,
int
argc
,
char
**
argv
)
{
Abc_Ntk_t
*
pNtk
,
*
pNtkRes
;
int
c
;
int
nFrames
,
nPref
;
int
fIgnore
;
int
fPrint
;
int
fVerbose
;
int
fUpdateCex
;
int
c
,
fVerbose
;
extern
Abc_Ntk_t
*
Abc_NtkPhaseAbstract
(
Abc_Ntk_t
*
pNtk
,
int
nFrames
,
int
nPref
,
int
fIgnore
,
int
fPrint
,
int
fVerbose
);
pNtk
=
Abc_FrameReadNtk
(
pAbc
);
...
...
@@ -17901,9 +17901,10 @@ int Abc_CommandDarPhase( Abc_Frame_t * pAbc, int argc, char ** argv )
nPref
=
0
;
fIgnore
=
0
;
fPrint
=
0
;
fUpdateCex
=
0
;
fVerbose
=
0
;
Extra_UtilGetoptReset
();
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"FPipvh"
)
)
!=
EOF
)
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"FPip
c
vh"
)
)
!=
EOF
)
{
switch
(
c
)
{
...
...
@@ -17935,6 +17936,9 @@ int Abc_CommandDarPhase( Abc_Frame_t * pAbc, int argc, char ** argv )
case
'p'
:
fPrint
^=
1
;
break
;
case
'c'
:
fUpdateCex
^=
1
;
break
;
case
'v'
:
fVerbose
^=
1
;
break
;
...
...
@@ -17954,6 +17958,24 @@ int Abc_CommandDarPhase( Abc_Frame_t * pAbc, int argc, char ** argv )
Abc_Print
(
-
1
,
"Only works for structrally hashed networks.
\n
"
);
return
1
;
}
if
(
fUpdateCex
)
{
Abc_Cex_t
*
pCexNew
;
if
(
pAbc
->
pCex
==
NULL
)
{
Abc_Print
(
-
1
,
"Counter-example is not available.
\n
"
);
return
1
;
}
if
(
pAbc
->
pCex
->
nPis
%
Abc_NtkPiNum
(
pNtk
)
!=
0
)
{
Abc_Print
(
-
1
,
"PI count of the CEX is not a multiple of PI count of the current AIG.
\n
"
);
return
1
;
}
pCexNew
=
Abc_CexTransformPhase
(
pAbc
->
pCex
,
Abc_NtkPiNum
(
pNtk
),
Abc_NtkPoNum
(
pNtk
),
Abc_NtkLatchNum
(
pNtk
)
);
Abc_CexFree
(
pAbc
->
pCex
);
pAbc
->
pCex
=
pCexNew
;
return
0
;
}
if
(
!
Abc_NtkLatchNum
(
pNtk
)
)
{
Abc_Print
(
-
1
,
"The network is combinational.
\n
"
);
...
...
@@ -17976,13 +17998,15 @@ int Abc_CommandDarPhase( Abc_Frame_t * pAbc, int argc, char ** argv )
return
0
;
usage:
Abc_Print
(
-
2
,
"usage: phase [-FP <num>] [-ipvh]
\n
"
);
Abc_Print
(
-
2
,
"usage: phase [-FP <num>] [-ip
c
vh]
\n
"
);
Abc_Print
(
-
2
,
"
\t
performs sequential cleanup of the current network
\n
"
);
Abc_Print
(
-
2
,
"
\t
by removing nodes and latches that do not feed into POs
\n
"
);
Abc_Print
(
-
2
,
"
\t
-F num : the number of frames to abstract [default = %d]
\n
"
,
nFrames
);
Abc_Print
(
-
2
,
"
\t
-P num : the number of prefix frames to skip [default = %d]
\n
"
,
nPref
);
Abc_Print
(
-
2
,
"
\t
-i : toggle ignoring the initial state [default = %s]
\n
"
,
fIgnore
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-p : toggle printing statistics about generators [default = %s]
\n
"
,
fPrint
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-c : update the current CEX derived for a new AIG after
\"
phase
\"\n
"
);
Abc_Print
(
-
2
,
"
\t
to match the current AIG (the one before
\"
phase
\"
) [default = %s]
\n
"
,
fUpdateCex
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-v : toggle verbose output [default = %s]
\n
"
,
fVerbose
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-h : print the command usage
\n
"
);
return
1
;
...
...
@@ -21431,11 +21455,12 @@ int Abc_CommandTempor( Abc_Frame_t * pAbc, int argc, char ** argv )
int
nConfMax
=
100000
;
int
fUseBmc
=
1
;
int
fUseTransSigs
=
0
;
int
fUpdateCex
=
0
;
int
fVerbose
=
0
;
int
fVeryVerbose
=
0
;
int
c
;
Extra_UtilGetoptReset
();
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"FTCbsvwh"
)
)
!=
EOF
)
while
(
(
c
=
Extra_UtilGetopt
(
argc
,
argv
,
"FTCbs
c
vwh"
)
)
!=
EOF
)
{
switch
(
c
)
{
...
...
@@ -21478,6 +21503,9 @@ int Abc_CommandTempor( Abc_Frame_t * pAbc, int argc, char ** argv )
case
's'
:
fUseTransSigs
^=
1
;
break
;
case
'c'
:
fUpdateCex
^=
1
;
break
;
case
'v'
:
fVerbose
^=
1
;
break
;
...
...
@@ -21494,14 +21522,32 @@ int Abc_CommandTempor( Abc_Frame_t * pAbc, int argc, char ** argv )
Abc_Print
(
-
2
,
"There is no current network.
\n
"
);
return
0
;
}
if
(
!
Abc_NtkIsStrash
(
pNtk
)
)
{
Abc_Print
(
-
2
,
"The current network is not an AIG (run
\"
strash
\"
).
\n
"
);
return
0
;
}
if
(
Abc_NtkLatchNum
(
pNtk
)
==
0
)
{
Abc_Print
(
-
2
,
"The current network is combinational.
\n
"
);
return
0
;
}
if
(
!
Abc_NtkIsStrash
(
pNtk
)
)
if
(
fUpdateCex
)
{
Abc_Print
(
-
2
,
"The current network is not an AIG (run
\"
strash
\"
).
\n
"
);
Abc_Cex_t
*
pCexNew
;
if
(
pAbc
->
pCex
==
NULL
)
{
Abc_Print
(
-
1
,
"Counter-example is not available.
\n
"
);
return
1
;
}
if
(
pAbc
->
pCex
->
nPis
%
Abc_NtkPiNum
(
pNtk
)
!=
0
)
{
Abc_Print
(
-
1
,
"PI count of the CEX is not a multiple of PI count of the current AIG.
\n
"
);
return
1
;
}
pCexNew
=
Abc_CexTransformTempor
(
pAbc
->
pCex
,
Abc_NtkPiNum
(
pNtk
),
Abc_NtkPoNum
(
pNtk
),
Abc_NtkLatchNum
(
pNtk
)
);
Abc_CexFree
(
pAbc
->
pCex
);
pAbc
->
pCex
=
pCexNew
;
return
0
;
}
// modify the current network
...
...
@@ -21516,13 +21562,15 @@ int Abc_CommandTempor( Abc_Frame_t * pAbc, int argc, char ** argv )
return
0
;
usage:
Abc_Print
(
-
2
,
"usage: tempor [-FTC <num>] [-bsvwh]
\n
"
);
Abc_Print
(
-
2
,
"usage: tempor [-FTC <num>] [-bs
c
vwh]
\n
"
);
Abc_Print
(
-
2
,
"
\t
performs temporal decomposition
\n
"
);
Abc_Print
(
-
2
,
"
\t
-F <num> : init logic timeframe count (0 = use leading length) [default = %d]
\n
"
,
nFrames
);
Abc_Print
(
-
2
,
"
\t
-T <num> : runtime limit in seconds for BMC (0=unused) [default = %d]
\n
"
,
TimeOut
);
Abc_Print
(
-
2
,
"
\t
-C <num> : max number of SAT conflicts in BMC (0=unused) [default = %d]
\n
"
,
nConfMax
);
Abc_Print
(
-
2
,
"
\t
-b : toggle running BMC2 on the init frames [default = %s]
\n
"
,
fUseBmc
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-s : toggle using transient signals [default = %s]
\n
"
,
fUseTransSigs
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-c : update the current CEX derived for a new AIG after
\"
tempor
\"\n
"
);
Abc_Print
(
-
2
,
"
\t
to match the current AIG (the one before
\"
tempor
\"
) [default = %s]
\n
"
,
fUpdateCex
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-v : toggle printing verbose output [default = %s]
\n
"
,
fVerbose
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-w : toggle printing ternary state space [default = %s]
\n
"
,
fVeryVerbose
?
"yes"
:
"no"
);
Abc_Print
(
-
2
,
"
\t
-h : print the command usage
\n
"
);
...
...
@@ -22459,7 +22507,8 @@ int Abc_CommandReconcile( Abc_Frame_t * pAbc, int argc, char ** argv )
goto
usage
;
}
}
if
(
argc
!=
globalUtilOptind
+
2
)
if
(
argc
!=
globalUtilOptind
+
2
&&
argc
!=
globalUtilOptind
)
{
Abc_Print
(
1
,
"Does not seen to have two files names as arguments.
\n
"
);
return
1
;
...
...
@@ -22470,19 +22519,39 @@ int Abc_CommandReconcile( Abc_Frame_t * pAbc, int argc, char ** argv )
return
1
;
}
// derive networks
pNtk1
=
Io_Read
(
argv
[
globalUtilOptind
],
Io_ReadFileType
(
argv
[
globalUtilOptind
]),
1
);
if
(
pNtk1
==
NULL
)
return
1
;
pNtk2
=
Io_Read
(
argv
[
globalUtilOptind
+
1
],
Io_ReadFileType
(
argv
[
globalUtilOptind
+
1
]),
1
);
if
(
pNtk2
==
NULL
)
if
(
argc
==
globalUtilOptind
+
2
)
{
Abc_NtkDelete
(
pNtk1
);
return
1
;
// derive networks
pNtk1
=
Io_Read
(
argv
[
globalUtilOptind
],
Io_ReadFileType
(
argv
[
globalUtilOptind
]),
1
);
if
(
pNtk1
==
NULL
)
return
1
;
pNtk2
=
Io_Read
(
argv
[
globalUtilOptind
+
1
],
Io_ReadFileType
(
argv
[
globalUtilOptind
+
1
]),
1
);
if
(
pNtk2
==
NULL
)
{
Abc_NtkDelete
(
pNtk1
);
return
1
;
}
// create counter-examples
pAig1
=
Abc_NtkToDar
(
pNtk1
,
0
,
0
);
pAig2
=
Abc_NtkToDar
(
pNtk2
,
0
,
0
);
}
else
if
(
argc
==
globalUtilOptind
)
{
if
(
pAbc
->
pNtkCur
==
NULL
)
{
Abc_Print
(
1
,
"There is no AIG in the main-space.
\n
"
);
return
0
;
}
if
(
pAbc
->
pGia
==
NULL
)
{
Abc_Print
(
1
,
"There is no AIG in the &-space.
\n
"
);
return
0
;
}
// create counter-examples
pAig1
=
Abc_NtkToDar
(
pAbc
->
pNtkCur
,
0
,
0
);
pAig2
=
Gia_ManToAigSimple
(
pAbc
->
pGia
);
}
// create counter-examples
pAig1
=
Abc_NtkToDar
(
pNtk1
,
0
,
0
);
pAig2
=
Abc_NtkToDar
(
pNtk2
,
0
,
0
);
else
assert
(
0
);
pCex
=
Llb4_Nonlin4NormalizeCex
(
pAig1
,
pAig2
,
pAbc
->
pCex
);
Aig_ManStop
(
pAig1
);
Aig_ManStop
(
pAig2
);
...
...
@@ -22512,6 +22581,8 @@ usage:
Abc_Print
(
-
2
,
"
\t
and <fileOrigin> to be current CEX and current network
\n
"
);
Abc_Print
(
-
2
,
"
\t
<fileOrigin> : file name with the original AIG
\n
"
);
Abc_Print
(
-
2
,
"
\t
<fileReparam> : file name with the reparametrized AIG
\n
"
);
Abc_Print
(
-
2
,
"
\t
(if both file names are not given on the command line,
\n
"
);
Abc_Print
(
-
2
,
"
\t
original/reparam AIG has to be in the main-space/&-space)
\n
"
);
Abc_Print
(
-
2
,
"
\t
-h : print the command usage
\n
"
);
return
1
;
}
...
...
@@ -28911,7 +28982,7 @@ int Abc_CommandAbc9Iso( Abc_Frame_t * pAbc, int argc, char ** argv )
Abc_Print
(
-
1
,
"Abc_CommandAbc9Iso(): The AIG has only one PO. Isomorphism detection is not performed.
\n
"
);
return
1
;
}
pAig
=
Gia_ManIsoReduce
(
pAbc
->
pGia
,
&
vPosEquivs
,
fDualOut
,
fVerbose
);
pAig
=
Gia_ManIsoReduce
(
pAbc
->
pGia
,
&
vPosEquivs
,
NULL
,
fDualOut
,
fVerbose
);
if
(
pAig
==
NULL
)
{
Abc_Print
(
-
1
,
"Abc_CommandAbc9Iso(): Transformation has failed.
\n
"
);
...
...
src/misc/util/utilCex.c
View file @
8e5d771f
...
...
@@ -23,7 +23,7 @@
#include <stdlib.h>
#include <assert.h>
#include "
abc_global
.h"
#include "
misc/vec/vec
.h"
#include "utilCex.h"
ABC_NAMESPACE_IMPL_START
...
...
@@ -353,6 +353,119 @@ void Abc_CexFree( Abc_Cex_t * p )
}
/**Function*************************************************************
Synopsis [Transform CEX after phase abstraction with nFrames frames.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
Abc_Cex_t
*
Abc_CexTransformPhase
(
Abc_Cex_t
*
p
,
int
nPisOld
,
int
nPosOld
,
int
nRegsOld
)
{
Abc_Cex_t
*
pCex
;
int
nFrames
=
p
->
nPis
/
nPisOld
;
int
nPosNew
=
nPosOld
*
nFrames
;
assert
(
p
->
nPis
%
nPisOld
==
0
);
assert
(
p
->
iPo
<
nPosNew
);
pCex
=
Abc_CexDup
(
p
,
nRegsOld
);
pCex
->
nPis
=
nPisOld
;
pCex
->
iPo
=
p
->
iPo
%
nPosOld
;
pCex
->
iFrame
=
p
->
iFrame
*
nFrames
+
p
->
iPo
/
nPosOld
;
pCex
->
nBits
=
pCex
->
nRegs
+
pCex
->
nPis
*
(
pCex
->
iFrame
+
1
);
return
pCex
;
}
/**Function*************************************************************
Synopsis [Transform CEX after phase temporal decomposition with nFrames frames.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
Abc_Cex_t
*
Abc_CexTransformTempor
(
Abc_Cex_t
*
p
,
int
nPisOld
,
int
nPosOld
,
int
nRegsOld
)
{
Abc_Cex_t
*
pCex
;
int
i
,
k
,
iBit
=
nRegsOld
,
nFrames
=
p
->
nPis
/
nPisOld
-
1
;
assert
(
p
->
iFrame
>
0
);
// otherwise tempor did not properly check for failures in the prefix
assert
(
p
->
nPis
%
nPisOld
==
0
);
pCex
=
Abc_CexAlloc
(
nRegsOld
,
nPisOld
,
nFrames
+
p
->
iFrame
+
1
);
pCex
->
iPo
=
p
->
iPo
;
pCex
->
iFrame
=
nFrames
+
p
->
iFrame
;
for
(
i
=
0
;
i
<
nFrames
;
i
++
)
for
(
k
=
0
;
k
<
nPisOld
;
k
++
,
iBit
++
)
if
(
Abc_InfoHasBit
(
p
->
pData
,
p
->
nRegs
+
(
i
+
1
)
*
nPisOld
+
k
)
)
Abc_InfoSetBit
(
pCex
->
pData
,
iBit
);
for
(
i
=
0
;
i
<=
p
->
iFrame
;
i
++
)
for
(
k
=
0
;
k
<
nPisOld
;
k
++
,
iBit
++
)
if
(
Abc_InfoHasBit
(
p
->
pData
,
p
->
nRegs
+
i
*
p
->
nPis
+
k
)
)
Abc_InfoSetBit
(
pCex
->
pData
,
iBit
);
assert
(
iBit
==
pCex
->
nBits
);
return
pCex
;
}
/**Function*************************************************************
Synopsis [Derives permuted CEX using permutation of its inputs.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
Abc_Cex_t
*
Abc_CexPermute
(
Abc_Cex_t
*
p
,
Vec_Int_t
*
vMapOld2New
)
{
Abc_Cex_t
*
pCex
;
int
i
,
iNew
;
assert
(
Vec_IntSize
(
vMapOld2New
)
==
p
->
nPis
);
pCex
=
Abc_CexAlloc
(
p
->
nRegs
,
p
->
nPis
,
p
->
iFrame
+
1
);
pCex
->
iPo
=
p
->
iPo
;
pCex
->
iFrame
=
p
->
iFrame
;
for
(
i
=
p
->
nRegs
;
i
<
p
->
nBits
;
i
++
)
if
(
Abc_InfoHasBit
(
p
->
pData
,
i
)
)
{
iNew
=
p
->
nRegs
+
p
->
nPis
*
((
i
-
p
->
nRegs
)
/
p
->
nPis
)
+
Vec_IntEntry
(
vMapOld2New
,
(
i
-
p
->
nRegs
)
%
p
->
nPis
);
Abc_InfoSetBit
(
pCex
->
pData
,
iNew
);
}
return
pCex
;
}
/**Function*************************************************************
Synopsis [Derives permuted CEX using two canonical permutations.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
Abc_Cex_t
*
Abc_CexPermuteTwo
(
Abc_Cex_t
*
p
,
Vec_Int_t
*
vPermOld
,
Vec_Int_t
*
vPermNew
)
{
Vec_Int_t
*
vPermInv
=
Vec_IntInvert
(
vPermNew
,
-
1
);
Vec_Int_t
*
vPerm
=
Vec_IntAlloc
(
Vec_IntSize
(
vPermOld
)
);
Abc_Cex_t
*
pCex
;
int
i
,
Entry
;
assert
(
Vec_IntSize
(
vPermOld
)
==
p
->
nPis
);
assert
(
Vec_IntSize
(
vPermNew
)
==
p
->
nPis
);
Vec_IntForEachEntry
(
vPerm
,
Entry
,
i
)
Vec_IntEntry
(
vPerm
,
Vec_IntEntry
(
vPermInv
,
Vec_IntEntry
(
vPermOld
,
Entry
))
);
pCex
=
Abc_CexPermute
(
p
,
vPerm
);
Vec_IntFree
(
vPermInv
);
Vec_IntFree
(
vPerm
);
return
pCex
;
}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
...
...
src/misc/util/utilCex.h
View file @
8e5d771f
...
...
@@ -68,6 +68,10 @@ extern void Abc_CexPrintStatsInputs( Abc_Cex_t * p, int nInputs );
extern
void
Abc_CexPrint
(
Abc_Cex_t
*
p
);
extern
void
Abc_CexFreeP
(
Abc_Cex_t
**
p
);
extern
void
Abc_CexFree
(
Abc_Cex_t
*
p
);
extern
Abc_Cex_t
*
Abc_CexTransformPhase
(
Abc_Cex_t
*
p
,
int
nPisOld
,
int
nPosOld
,
int
nRegsOld
);
extern
Abc_Cex_t
*
Abc_CexTransformTempor
(
Abc_Cex_t
*
p
,
int
nPisOld
,
int
nPosOld
,
int
nRegsOld
);
extern
Abc_Cex_t
*
Abc_CexPermute
(
Abc_Cex_t
*
p
,
Vec_Int_t
*
vMapOld2New
);
extern
Abc_Cex_t
*
Abc_CexPermuteTwo
(
Abc_Cex_t
*
p
,
Vec_Int_t
*
vPermOld
,
Vec_Int_t
*
vPermNew
);
ABC_NAMESPACE_HEADER_END
...
...
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