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
280a4853
Commit
280a4853
authored
Apr 02, 2014
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Improvements to technology mapping.
parent
b085ba4b
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
57 additions
and
43 deletions
+57
-43
src/map/if/if.h
+4
-4
src/map/if/ifMan.c
+30
-19
src/map/if/ifTruth.c
+23
-20
No files found.
src/map/if/if.h
View file @
280a4853
...
@@ -216,7 +216,7 @@ struct If_Man_t_
...
@@ -216,7 +216,7 @@ struct If_Man_t_
int
nMaxIters
;
// the maximum number of iterations
int
nMaxIters
;
// the maximum number of iterations
int
Period
;
// the current value of the clock period (for seq mapping)
int
Period
;
// the current value of the clock period (for seq mapping)
// memory management
// memory management
int
nTruth6Words
;
// the size of the truth table if allocated
int
nTruth6Words
[
IF_MAX_FUNC_LUTSIZE
+
1
]
;
// the size of the truth table if allocated
int
nPermWords
;
// the size of the permutation array (in words)
int
nPermWords
;
// the size of the permutation array (in words)
int
nObjBytes
;
// the size of the object
int
nObjBytes
;
// the size of the object
int
nCutBytes
;
// the size of the cut
int
nCutBytes
;
// the size of the cut
...
@@ -234,7 +234,7 @@ struct If_Man_t_
...
@@ -234,7 +234,7 @@ struct If_Man_t_
int
nCutsUselessAll
;
int
nCutsUselessAll
;
int
nCuts5
,
nCuts5a
;
int
nCuts5
,
nCuts5a
;
If_DsdMan_t
*
pIfDsdMan
;
If_DsdMan_t
*
pIfDsdMan
;
Vec_Mem_t
*
vTtMem
;
// truth table memory and hash table
Vec_Mem_t
*
vTtMem
[
IF_MAX_FUNC_LUTSIZE
+
1
];
// truth table memory and hash table
Vec_Int_t
*
vTtDsds
;
// mapping of truth table into DSD
Vec_Int_t
*
vTtDsds
;
// mapping of truth table into DSD
Vec_Str_t
*
vTtPerms
;
// mapping of truth table into permutations
Vec_Str_t
*
vTtPerms
;
// mapping of truth table into permutations
Hash_IntMan_t
*
vPairHash
;
// hashing pairs of truth tables
Hash_IntMan_t
*
vPairHash
;
// hashing pairs of truth tables
...
@@ -406,10 +406,10 @@ static inline void If_CutSetData( If_Cut_t * pCut, void * pData ) { *
...
@@ -406,10 +406,10 @@ static inline void If_CutSetData( If_Cut_t * pCut, void * pData ) { *
static
inline
int
If_CutDataInt
(
If_Cut_t
*
pCut
)
{
return
*
(
int
*
)
pCut
;
}
static
inline
int
If_CutDataInt
(
If_Cut_t
*
pCut
)
{
return
*
(
int
*
)
pCut
;
}
static
inline
void
If_CutSetDataInt
(
If_Cut_t
*
pCut
,
int
Data
)
{
*
(
int
*
)
pCut
=
Data
;
}
static
inline
void
If_CutSetDataInt
(
If_Cut_t
*
pCut
,
int
Data
)
{
*
(
int
*
)
pCut
=
Data
;
}
static
inline
word
*
If_CutTruthWR
(
If_Man_t
*
p
,
If_Cut_t
*
pCut
)
{
return
p
->
vTtMem
?
Vec_MemReadEntry
(
p
->
vTtMem
,
Abc_Lit2Var
(
pCut
->
iCutFunc
))
:
NULL
;
}
static
inline
word
*
If_CutTruthWR
(
If_Man_t
*
p
,
If_Cut_t
*
pCut
)
{
return
p
->
vTtMem
?
Vec_MemReadEntry
(
p
->
vTtMem
[
pCut
->
nLeaves
]
,
Abc_Lit2Var
(
pCut
->
iCutFunc
))
:
NULL
;
}
static
inline
unsigned
*
If_CutTruthR
(
If_Man_t
*
p
,
If_Cut_t
*
pCut
)
{
return
(
unsigned
*
)
If_CutTruthWR
(
p
,
pCut
);
}
static
inline
unsigned
*
If_CutTruthR
(
If_Man_t
*
p
,
If_Cut_t
*
pCut
)
{
return
(
unsigned
*
)
If_CutTruthWR
(
p
,
pCut
);
}
static
inline
int
If_CutTruthIsCompl
(
If_Cut_t
*
pCut
)
{
assert
(
pCut
->
iCutFunc
>=
0
);
return
Abc_LitIsCompl
(
pCut
->
iCutFunc
);
}
static
inline
int
If_CutTruthIsCompl
(
If_Cut_t
*
pCut
)
{
assert
(
pCut
->
iCutFunc
>=
0
);
return
Abc_LitIsCompl
(
pCut
->
iCutFunc
);
}
static
inline
word
*
If_CutTruthW
(
If_Man_t
*
p
,
If_Cut_t
*
pCut
)
{
if
(
p
->
vTtMem
==
NULL
)
return
NULL
;
assert
(
pCut
->
iCutFunc
>=
0
);
Abc_TtCopy
(
p
->
puTempW
,
If_CutTruthWR
(
p
,
pCut
),
p
->
nTruth6Words
,
If_CutTruthIsCompl
(
pCut
)
);
return
p
->
puTempW
;
}
static
inline
word
*
If_CutTruthW
(
If_Man_t
*
p
,
If_Cut_t
*
pCut
)
{
if
(
p
->
vTtMem
==
NULL
)
return
NULL
;
assert
(
pCut
->
iCutFunc
>=
0
);
Abc_TtCopy
(
p
->
puTempW
,
If_CutTruthWR
(
p
,
pCut
),
p
->
nTruth6Words
[
pCut
->
nLeaves
]
,
If_CutTruthIsCompl
(
pCut
)
);
return
p
->
puTempW
;
}
static
inline
unsigned
*
If_CutTruth
(
If_Man_t
*
p
,
If_Cut_t
*
pCut
)
{
return
(
unsigned
*
)
If_CutTruthW
(
p
,
pCut
);
}
static
inline
unsigned
*
If_CutTruth
(
If_Man_t
*
p
,
If_Cut_t
*
pCut
)
{
return
(
unsigned
*
)
If_CutTruthW
(
p
,
pCut
);
}
static
inline
float
If_CutLutArea
(
If_Man_t
*
p
,
If_Cut_t
*
pCut
)
{
return
pCut
->
fUser
?
(
float
)
pCut
->
Cost
:
(
p
->
pPars
->
pLutLib
?
p
->
pPars
->
pLutLib
->
pLutAreas
[
pCut
->
nLeaves
]
:
(
float
)
1
.
0
);
}
static
inline
float
If_CutLutArea
(
If_Man_t
*
p
,
If_Cut_t
*
pCut
)
{
return
pCut
->
fUser
?
(
float
)
pCut
->
Cost
:
(
p
->
pPars
->
pLutLib
?
p
->
pPars
->
pLutLib
->
pLutAreas
[
pCut
->
nLeaves
]
:
(
float
)
1
.
0
);
}
...
...
src/map/if/ifMan.c
View file @
280a4853
...
@@ -51,7 +51,7 @@ extern abctime s_TimeComp[4];
...
@@ -51,7 +51,7 @@ extern abctime s_TimeComp[4];
***********************************************************************/
***********************************************************************/
If_Man_t
*
If_ManStart
(
If_Par_t
*
pPars
)
If_Man_t
*
If_ManStart
(
If_Par_t
*
pPars
)
{
{
If_Man_t
*
p
;
If_Man_t
*
p
;
int
v
;
assert
(
!
pPars
->
fUseDsd
||
!
pPars
->
fUseTtPerm
);
assert
(
!
pPars
->
fUseDsd
||
!
pPars
->
fUseTtPerm
);
// start the manager
// start the manager
p
=
ABC_ALLOC
(
If_Man_t
,
1
);
p
=
ABC_ALLOC
(
If_Man_t
,
1
);
...
@@ -65,9 +65,15 @@ If_Man_t * If_ManStart( If_Par_t * pPars )
...
@@ -65,9 +65,15 @@ If_Man_t * If_ManStart( If_Par_t * pPars )
// p->vMapped = Vec_PtrAlloc( 100 );
// p->vMapped = Vec_PtrAlloc( 100 );
p
->
vTemp
=
Vec_PtrAlloc
(
100
);
p
->
vTemp
=
Vec_PtrAlloc
(
100
);
// prepare the memory manager
// prepare the memory manager
p
->
vTtMem
=
p
->
pPars
->
fTruth
?
Vec_MemAllocForTT
(
p
->
pPars
->
nLutSize
)
:
NULL
;
if
(
p
->
pPars
->
fTruth
)
p
->
nTruth6Words
=
p
->
pPars
->
fTruth
?
Abc_Truth6WordNum
(
p
->
pPars
->
nLutSize
)
:
0
;
{
// p->nTruthWords = p->pPars->fTruth? If_CutTruthWords( p->pPars->nLutSize ) : 0;
for
(
v
=
0
;
v
<=
p
->
pPars
->
nLutSize
;
v
++
)
p
->
nTruth6Words
[
v
]
=
Abc_Truth6WordNum
(
v
);
for
(
v
=
6
;
v
<=
p
->
pPars
->
nLutSize
;
v
++
)
p
->
vTtMem
[
v
]
=
Vec_MemAllocForTT
(
v
);
for
(
v
=
0
;
v
<
6
;
v
++
)
p
->
vTtMem
[
v
]
=
p
->
vTtMem
[
6
];
}
p
->
nPermWords
=
p
->
pPars
->
fUsePerm
?
If_CutPermWords
(
p
->
pPars
->
nLutSize
)
:
0
;
p
->
nPermWords
=
p
->
pPars
->
fUsePerm
?
If_CutPermWords
(
p
->
pPars
->
nLutSize
)
:
0
;
p
->
nObjBytes
=
sizeof
(
If_Obj_t
)
+
sizeof
(
int
)
*
(
p
->
pPars
->
nLutSize
+
p
->
nPermWords
/* + p->nTruthWords*/
);
p
->
nObjBytes
=
sizeof
(
If_Obj_t
)
+
sizeof
(
int
)
*
(
p
->
pPars
->
nLutSize
+
p
->
nPermWords
/* + p->nTruthWords*/
);
p
->
nCutBytes
=
sizeof
(
If_Cut_t
)
+
sizeof
(
int
)
*
(
p
->
pPars
->
nLutSize
+
p
->
nPermWords
/* + p->nTruthWords*/
);
p
->
nCutBytes
=
sizeof
(
If_Cut_t
)
+
sizeof
(
int
)
*
(
p
->
pPars
->
nLutSize
+
p
->
nPermWords
/* + p->nTruthWords*/
);
...
@@ -77,13 +83,13 @@ If_Man_t * If_ManStart( If_Par_t * pPars )
...
@@ -77,13 +83,13 @@ If_Man_t * If_ManStart( If_Par_t * pPars )
// report expected memory usage
// report expected memory usage
if
(
p
->
pPars
->
fVerbose
)
if
(
p
->
pPars
->
fVerbose
)
Abc_Print
(
1
,
"K = %d. Memory (bytes): Truth = %4d. Cut = %4d. Obj = %4d. Set = %4d. CutMin = %s
\n
"
,
Abc_Print
(
1
,
"K = %d. Memory (bytes): Truth = %4d. Cut = %4d. Obj = %4d. Set = %4d. CutMin = %s
\n
"
,
p
->
pPars
->
nLutSize
,
8
*
p
->
nTruth6Words
,
p
->
nCutBytes
,
p
->
nObjBytes
,
p
->
nSetBytes
,
p
->
pPars
->
fCutMin
?
"yes"
:
"no"
);
p
->
pPars
->
nLutSize
,
8
*
p
->
nTruth6Words
[
p
->
pPars
->
nLutSize
]
,
p
->
nCutBytes
,
p
->
nObjBytes
,
p
->
nSetBytes
,
p
->
pPars
->
fCutMin
?
"yes"
:
"no"
);
// room for temporary truth tables
// room for temporary truth tables
p
->
puTemp
[
0
]
=
p
->
pPars
->
fTruth
?
ABC_ALLOC
(
unsigned
,
8
*
p
->
nTruth6Words
)
:
NULL
;
p
->
puTemp
[
0
]
=
p
->
pPars
->
fTruth
?
ABC_ALLOC
(
unsigned
,
8
*
p
->
nTruth6Words
[
p
->
pPars
->
nLutSize
]
)
:
NULL
;
p
->
puTemp
[
1
]
=
p
->
puTemp
[
0
]
+
p
->
nTruth6Words
*
2
;
p
->
puTemp
[
1
]
=
p
->
puTemp
[
0
]
+
p
->
nTruth6Words
[
p
->
pPars
->
nLutSize
]
*
2
;
p
->
puTemp
[
2
]
=
p
->
puTemp
[
1
]
+
p
->
nTruth6Words
*
2
;
p
->
puTemp
[
2
]
=
p
->
puTemp
[
1
]
+
p
->
nTruth6Words
[
p
->
pPars
->
nLutSize
]
*
2
;
p
->
puTemp
[
3
]
=
p
->
puTemp
[
2
]
+
p
->
nTruth6Words
*
2
;
p
->
puTemp
[
3
]
=
p
->
puTemp
[
2
]
+
p
->
nTruth6Words
[
p
->
pPars
->
nLutSize
]
*
2
;
p
->
puTempW
=
p
->
pPars
->
fTruth
?
ABC_ALLOC
(
word
,
p
->
nTruth6Words
)
:
NULL
;
p
->
puTempW
=
p
->
pPars
->
fTruth
?
ABC_ALLOC
(
word
,
p
->
nTruth6Words
[
p
->
pPars
->
nLutSize
]
)
:
NULL
;
if
(
pPars
->
fUseDsd
)
if
(
pPars
->
fUseDsd
)
{
{
p
->
vTtDsds
=
Vec_IntAlloc
(
1000
);
p
->
vTtDsds
=
Vec_IntAlloc
(
1000
);
...
@@ -95,10 +101,6 @@ If_Man_t * If_ManStart( If_Par_t * pPars )
...
@@ -95,10 +101,6 @@ If_Man_t * If_ManStart( If_Par_t * pPars )
}
}
if
(
pPars
->
fUseTtPerm
)
if
(
pPars
->
fUseTtPerm
)
{
{
word
uTruth
=
0
;
Vec_MemHashInsert
(
p
->
vTtMem
,
&
uTruth
);
uTruth
=
ABC_CONST
(
0xAAAAAAAAAAAAAAAA
);
Vec_MemHashInsert
(
p
->
vTtMem
,
&
uTruth
);
p
->
vPairHash
=
Hash_IntManStart
(
10000
);
p
->
vPairHash
=
Hash_IntManStart
(
10000
);
p
->
vTtPerms
=
Vec_StrAlloc
(
10000
);
p
->
vTtPerms
=
Vec_StrAlloc
(
10000
);
}
}
...
@@ -152,13 +154,20 @@ void If_ManRestart( If_Man_t * p )
...
@@ -152,13 +154,20 @@ void If_ManRestart( If_Man_t * p )
void
If_ManStop
(
If_Man_t
*
p
)
void
If_ManStop
(
If_Man_t
*
p
)
{
{
extern
void
If_ManCacheAnalize
(
If_Man_t
*
p
);
extern
void
If_ManCacheAnalize
(
If_Man_t
*
p
);
int
i
;
if
(
p
->
pPars
->
fVerbose
&&
p
->
vCutData
)
if
(
p
->
pPars
->
fVerbose
&&
p
->
vCutData
)
If_ManCacheAnalize
(
p
);
If_ManCacheAnalize
(
p
);
if
(
p
->
pPars
->
fVerbose
&&
p
->
vTtMem
)
if
(
p
->
pPars
->
fVerbose
&&
p
->
pPars
->
fTruth
)
printf
(
"Unique truth tables = %d. Memory = %.2f MB
\n
"
,
Vec_MemEntryNum
(
p
->
vTtMem
),
Vec_MemMemory
(
p
->
vTtMem
)
/
(
1
<<
20
)
);
{
int
nUnique
=
0
,
nMemTotal
=
0
;
for
(
i
=
6
;
i
<=
p
->
pPars
->
nLutSize
;
i
++
)
nUnique
+=
Vec_MemEntryNum
(
p
->
vTtMem
[
i
]);
for
(
i
=
6
;
i
<=
p
->
pPars
->
nLutSize
;
i
++
)
nMemTotal
+=
(
int
)
Vec_MemMemory
(
p
->
vTtMem
[
i
]);
printf
(
"Unique truth tables = %d. Memory = %.2f MB
\n
"
,
nUnique
,
1
.
0
*
nMemTotal
/
(
1
<<
20
)
);
}
if
(
p
->
pPars
->
fVerbose
&&
p
->
nCutsUselessAll
)
if
(
p
->
pPars
->
fVerbose
&&
p
->
nCutsUselessAll
)
{
{
int
i
;
for
(
i
=
0
;
i
<=
16
;
i
++
)
for
(
i
=
0
;
i
<=
16
;
i
++
)
if
(
p
->
nCutsUseless
[
i
]
)
if
(
p
->
nCutsUseless
[
i
]
)
Abc_Print
(
1
,
"Useless cuts %2d = %9d (out of %9d) (%6.2f %%)
\n
"
,
i
,
p
->
nCutsUseless
[
i
],
p
->
nCutsCount
[
i
],
100
.
0
*
p
->
nCutsUseless
[
i
]
/
(
p
->
nCutsCount
[
i
]
+
1
)
);
Abc_Print
(
1
,
"Useless cuts %2d = %9d (out of %9d) (%6.2f %%)
\n
"
,
i
,
p
->
nCutsUseless
[
i
],
p
->
nCutsCount
[
i
],
100
.
0
*
p
->
nCutsUseless
[
i
]
/
(
p
->
nCutsCount
[
i
]
+
1
)
);
...
@@ -189,8 +198,10 @@ void If_ManStop( If_Man_t * p )
...
@@ -189,8 +198,10 @@ void If_ManStop( If_Man_t * p )
Vec_IntFreeP
(
&
p
->
vCutData
);
Vec_IntFreeP
(
&
p
->
vCutData
);
if
(
p
->
vPairHash
)
if
(
p
->
vPairHash
)
Hash_IntManStop
(
p
->
vPairHash
);
Hash_IntManStop
(
p
->
vPairHash
);
Vec_MemHashFree
(
p
->
vTtMem
);
for
(
i
=
6
;
i
<=
p
->
pPars
->
nLutSize
;
i
++
)
Vec_MemFreeP
(
&
p
->
vTtMem
);
Vec_MemHashFree
(
p
->
vTtMem
[
i
]
);
for
(
i
=
6
;
i
<=
p
->
pPars
->
nLutSize
;
i
++
)
Vec_MemFreeP
(
&
p
->
vTtMem
[
i
]
);
Mem_FixedStop
(
p
->
pMemObj
,
0
);
Mem_FixedStop
(
p
->
pMemObj
,
0
);
ABC_FREE
(
p
->
pMemCi
);
ABC_FREE
(
p
->
pMemCi
);
ABC_FREE
(
p
->
pMemAnd
);
ABC_FREE
(
p
->
pMemAnd
);
...
...
src/map/if/ifTruth.c
View file @
280a4853
...
@@ -71,14 +71,14 @@ void If_CutRotatePins( If_Man_t * p, If_Cut_t * pCut )
...
@@ -71,14 +71,14 @@ void If_CutRotatePins( If_Man_t * p, If_Cut_t * pCut )
assert
(
!
p
->
pPars
->
fUseTtPerm
);
assert
(
!
p
->
pPars
->
fUseTtPerm
);
If_CutForEachLeaf
(
p
,
pCut
,
pLeaf
,
i
)
If_CutForEachLeaf
(
p
,
pCut
,
pLeaf
,
i
)
PinDelays
[
i
]
=
If_ObjCutBest
(
pLeaf
)
->
Delay
;
PinDelays
[
i
]
=
If_ObjCutBest
(
pLeaf
)
->
Delay
;
if
(
p
->
vTtMem
==
NULL
)
if
(
p
->
vTtMem
[
pCut
->
nLeaves
]
==
NULL
)
{
{
If_CutTruthPermute
(
NULL
,
If_CutLeaveNum
(
pCut
),
pCut
->
nL
imit
,
p
->
nTruth6Words
,
PinDelays
,
If_CutLeaves
(
pCut
)
);
If_CutTruthPermute
(
NULL
,
If_CutLeaveNum
(
pCut
),
pCut
->
nL
eaves
,
p
->
nTruth6Words
[
pCut
->
nLeaves
]
,
PinDelays
,
If_CutLeaves
(
pCut
)
);
return
;
return
;
}
}
Abc_TtCopy
(
p
->
puTempW
,
If_CutTruthWR
(
p
,
pCut
),
p
->
nTruth6Words
,
0
);
Abc_TtCopy
(
p
->
puTempW
,
If_CutTruthWR
(
p
,
pCut
),
p
->
nTruth6Words
[
pCut
->
nLeaves
]
,
0
);
If_CutTruthPermute
(
p
->
puTempW
,
If_CutLeaveNum
(
pCut
),
pCut
->
nL
imit
,
p
->
nTruth6Words
,
PinDelays
,
If_CutLeaves
(
pCut
)
);
If_CutTruthPermute
(
p
->
puTempW
,
If_CutLeaveNum
(
pCut
),
pCut
->
nL
eaves
,
p
->
nTruth6Words
[
pCut
->
nLeaves
]
,
PinDelays
,
If_CutLeaves
(
pCut
)
);
truthId
=
Vec_MemHashInsert
(
p
->
vTtMem
,
p
->
puTempW
);
truthId
=
Vec_MemHashInsert
(
p
->
vTtMem
[
pCut
->
nLeaves
]
,
p
->
puTempW
);
pCut
->
iCutFunc
=
Abc_Var2Lit
(
truthId
,
If_CutTruthIsCompl
(
pCut
)
);
pCut
->
iCutFunc
=
Abc_Var2Lit
(
truthId
,
If_CutTruthIsCompl
(
pCut
)
);
assert
(
(
p
->
puTempW
[
0
]
&
1
)
==
0
);
assert
(
(
p
->
puTempW
[
0
]
&
1
)
==
0
);
}
}
...
@@ -97,21 +97,23 @@ void If_CutRotatePins( If_Man_t * p, If_Cut_t * pCut )
...
@@ -97,21 +97,23 @@ void If_CutRotatePins( If_Man_t * p, If_Cut_t * pCut )
int
If_CutComputeTruth
(
If_Man_t
*
p
,
If_Cut_t
*
pCut
,
If_Cut_t
*
pCut0
,
If_Cut_t
*
pCut1
,
int
fCompl0
,
int
fCompl1
)
int
If_CutComputeTruth
(
If_Man_t
*
p
,
If_Cut_t
*
pCut
,
If_Cut_t
*
pCut0
,
If_Cut_t
*
pCut1
,
int
fCompl0
,
int
fCompl1
)
{
{
int
fCompl
,
truthId
,
nLeavesNew
,
RetValue
=
0
;
int
fCompl
,
truthId
,
nLeavesNew
,
RetValue
=
0
;
int
nWords
=
Abc_TtWordNum
(
pCut
->
nL
imit
);
int
nWords
=
Abc_TtWordNum
(
pCut
->
nL
eaves
);
word
*
pTruth0s
=
Vec_MemReadEntry
(
p
->
vTtMem
,
Abc_Lit2Var
(
pCut0
->
iCutFunc
)
);
word
*
pTruth0s
=
Vec_MemReadEntry
(
p
->
vTtMem
[
pCut0
->
nLeaves
]
,
Abc_Lit2Var
(
pCut0
->
iCutFunc
)
);
word
*
pTruth1s
=
Vec_MemReadEntry
(
p
->
vTtMem
,
Abc_Lit2Var
(
pCut1
->
iCutFunc
)
);
word
*
pTruth1s
=
Vec_MemReadEntry
(
p
->
vTtMem
[
pCut1
->
nLeaves
]
,
Abc_Lit2Var
(
pCut1
->
iCutFunc
)
);
word
*
pTruth0
=
(
word
*
)
p
->
puTemp
[
0
];
word
*
pTruth0
=
(
word
*
)
p
->
puTemp
[
0
];
word
*
pTruth1
=
(
word
*
)
p
->
puTemp
[
1
];
word
*
pTruth1
=
(
word
*
)
p
->
puTemp
[
1
];
word
*
pTruth
=
(
word
*
)
p
->
puTemp
[
2
];
word
*
pTruth
=
(
word
*
)
p
->
puTemp
[
2
];
Abc_TtCopy
(
pTruth0
,
pTruth0s
,
nWords
,
fCompl0
^
pCut0
->
fCompl
^
Abc_LitIsCompl
(
pCut0
->
iCutFunc
)
);
Abc_TtCopy
(
pTruth0
,
pTruth0s
,
nWords
,
fCompl0
^
pCut0
->
fCompl
^
Abc_LitIsCompl
(
pCut0
->
iCutFunc
)
);
Abc_TtCopy
(
pTruth1
,
pTruth1s
,
nWords
,
fCompl1
^
pCut1
->
fCompl
^
Abc_LitIsCompl
(
pCut1
->
iCutFunc
)
);
Abc_TtCopy
(
pTruth1
,
pTruth1s
,
nWords
,
fCompl1
^
pCut1
->
fCompl
^
Abc_LitIsCompl
(
pCut1
->
iCutFunc
)
);
Abc_TtStretch
(
pTruth0
,
pCut
->
nLimit
,
pCut0
->
pLeaves
,
pCut0
->
nLeaves
,
pCut
->
pLeaves
,
pCut
->
nLeaves
);
Abc_TtStretch6
(
pTruth0
,
pCut0
->
nLeaves
,
pCut
->
nLeaves
);
Abc_TtStretch
(
pTruth1
,
pCut
->
nLimit
,
pCut1
->
pLeaves
,
pCut1
->
nLeaves
,
pCut
->
pLeaves
,
pCut
->
nLeaves
);
Abc_TtStretch6
(
pTruth1
,
pCut1
->
nLeaves
,
pCut
->
nLeaves
);
Abc_TtStretch
(
pTruth0
,
pCut
->
nLeaves
,
pCut0
->
pLeaves
,
pCut0
->
nLeaves
,
pCut
->
pLeaves
,
pCut
->
nLeaves
);
Abc_TtStretch
(
pTruth1
,
pCut
->
nLeaves
,
pCut1
->
pLeaves
,
pCut1
->
nLeaves
,
pCut
->
pLeaves
,
pCut
->
nLeaves
);
fCompl
=
(
pTruth0
[
0
]
&
pTruth1
[
0
]
&
1
);
fCompl
=
(
pTruth0
[
0
]
&
pTruth1
[
0
]
&
1
);
Abc_TtAnd
(
pTruth
,
pTruth0
,
pTruth1
,
nWords
,
fCompl
);
Abc_TtAnd
(
pTruth
,
pTruth0
,
pTruth1
,
nWords
,
fCompl
);
if
(
p
->
pPars
->
fCutMin
)
if
(
p
->
pPars
->
fCutMin
)
{
{
nLeavesNew
=
Abc_TtMinBase
(
pTruth
,
pCut
->
pLeaves
,
pCut
->
nLeaves
,
pCut
->
nL
imit
);
nLeavesNew
=
Abc_TtMinBase
(
pTruth
,
pCut
->
pLeaves
,
pCut
->
nLeaves
,
pCut
->
nL
eaves
);
if
(
nLeavesNew
<
If_CutLeaveNum
(
pCut
)
)
if
(
nLeavesNew
<
If_CutLeaveNum
(
pCut
)
)
{
{
pCut
->
nLeaves
=
nLeavesNew
;
pCut
->
nLeaves
=
nLeavesNew
;
...
@@ -119,7 +121,7 @@ int If_CutComputeTruth( If_Man_t * p, If_Cut_t * pCut, If_Cut_t * pCut0, If_Cut_
...
@@ -119,7 +121,7 @@ int If_CutComputeTruth( If_Man_t * p, If_Cut_t * pCut, If_Cut_t * pCut0, If_Cut_
RetValue
=
1
;
RetValue
=
1
;
}
}
}
}
truthId
=
Vec_MemHashInsert
(
p
->
vTtMem
,
pTruth
);
truthId
=
Vec_MemHashInsert
(
p
->
vTtMem
[
pCut
->
nLeaves
]
,
pTruth
);
pCut
->
iCutFunc
=
Abc_Var2Lit
(
truthId
,
fCompl
);
pCut
->
iCutFunc
=
Abc_Var2Lit
(
truthId
,
fCompl
);
assert
(
(
pTruth
[
0
]
&
1
)
==
0
);
assert
(
(
pTruth
[
0
]
&
1
)
==
0
);
#ifdef IF_TRY_NEW
#ifdef IF_TRY_NEW
...
@@ -127,7 +129,7 @@ int If_CutComputeTruth( If_Man_t * p, If_Cut_t * pCut, If_Cut_t * pCut0, If_Cut_
...
@@ -127,7 +129,7 @@ int If_CutComputeTruth( If_Man_t * p, If_Cut_t * pCut, If_Cut_t * pCut0, If_Cut_
word
pCopy
[
1024
];
word
pCopy
[
1024
];
char
pCanonPerm
[
16
];
char
pCanonPerm
[
16
];
memcpy
(
pCopy
,
If_CutTruthW
(
pCut
),
sizeof
(
word
)
*
nWords
);
memcpy
(
pCopy
,
If_CutTruthW
(
pCut
),
sizeof
(
word
)
*
nWords
);
Abc_TtCanonicize
(
pCopy
,
pCut
->
nL
imit
,
pCanonPerm
);
Abc_TtCanonicize
(
pCopy
,
pCut
->
nL
eaves
,
pCanonPerm
);
}
}
#endif
#endif
return
RetValue
;
return
RetValue
;
...
@@ -150,9 +152,9 @@ int If_CutComputeTruthPerm( If_Man_t * p, If_Cut_t * pCut, If_Cut_t * pCut0, If_
...
@@ -150,9 +152,9 @@ int If_CutComputeTruthPerm( If_Man_t * p, If_Cut_t * pCut, If_Cut_t * pCut0, If_
int
pPerm
[
IF_MAX_LUTSIZE
];
int
pPerm
[
IF_MAX_LUTSIZE
];
char
pCanonPerm
[
IF_MAX_LUTSIZE
];
char
pCanonPerm
[
IF_MAX_LUTSIZE
];
int
v
,
Place
,
fCompl
,
truthId
,
nLeavesNew
,
uCanonPhase
,
RetValue
=
0
;
int
v
,
Place
,
fCompl
,
truthId
,
nLeavesNew
,
uCanonPhase
,
RetValue
=
0
;
int
nWords
=
Abc_TtWordNum
(
pCut
->
nL
imit
);
int
nWords
=
Abc_TtWordNum
(
pCut
->
nL
eaves
);
word
*
pTruth0s
=
Vec_MemReadEntry
(
p
->
vTtMem
,
Abc_Lit2Var
(
pCut0
->
iCutFunc
)
);
word
*
pTruth0s
=
Vec_MemReadEntry
(
p
->
vTtMem
[
pCut0
->
nLeaves
]
,
Abc_Lit2Var
(
pCut0
->
iCutFunc
)
);
word
*
pTruth1s
=
Vec_MemReadEntry
(
p
->
vTtMem
,
Abc_Lit2Var
(
pCut1
->
iCutFunc
)
);
word
*
pTruth1s
=
Vec_MemReadEntry
(
p
->
vTtMem
[
pCut1
->
nLeaves
]
,
Abc_Lit2Var
(
pCut1
->
iCutFunc
)
);
word
*
pTruth0
=
(
word
*
)
p
->
puTemp
[
0
];
word
*
pTruth0
=
(
word
*
)
p
->
puTemp
[
0
];
word
*
pTruth1
=
(
word
*
)
p
->
puTemp
[
1
];
word
*
pTruth1
=
(
word
*
)
p
->
puTemp
[
1
];
word
*
pTruth
=
(
word
*
)
p
->
puTemp
[
2
];
word
*
pTruth
=
(
word
*
)
p
->
puTemp
[
2
];
...
@@ -160,7 +162,8 @@ int If_CutComputeTruthPerm( If_Man_t * p, If_Cut_t * pCut, If_Cut_t * pCut0, If_
...
@@ -160,7 +162,8 @@ int If_CutComputeTruthPerm( If_Man_t * p, If_Cut_t * pCut, If_Cut_t * pCut0, If_
assert
(
pCut1
->
iCutDsd
>=
0
);
assert
(
pCut1
->
iCutDsd
>=
0
);
Abc_TtCopy
(
pTruth0
,
pTruth0s
,
nWords
,
fCompl0
^
pCut0
->
fCompl
^
Abc_LitIsCompl
(
pCut0
->
iCutFunc
)
);
Abc_TtCopy
(
pTruth0
,
pTruth0s
,
nWords
,
fCompl0
^
pCut0
->
fCompl
^
Abc_LitIsCompl
(
pCut0
->
iCutFunc
)
);
Abc_TtCopy
(
pTruth1
,
pTruth1s
,
nWords
,
fCompl1
^
pCut1
->
fCompl
^
Abc_LitIsCompl
(
pCut1
->
iCutFunc
)
);
Abc_TtCopy
(
pTruth1
,
pTruth1s
,
nWords
,
fCompl1
^
pCut1
->
fCompl
^
Abc_LitIsCompl
(
pCut1
->
iCutFunc
)
);
Abc_TtStretch6
(
pTruth0
,
pCut0
->
nLeaves
,
pCut
->
nLeaves
);
Abc_TtStretch6
(
pTruth1
,
pCut1
->
nLeaves
,
pCut
->
nLeaves
);
if
(
fVerbose
)
if
(
fVerbose
)
{
{
...
@@ -183,7 +186,7 @@ if ( fVerbose )
...
@@ -183,7 +186,7 @@ if ( fVerbose )
Place
=
p
->
pPerm
[
1
][
v
];
Place
=
p
->
pPerm
[
1
][
v
];
if
(
Place
==
v
||
Place
==
-
1
)
if
(
Place
==
v
||
Place
==
-
1
)
continue
;
continue
;
Abc_TtSwapVars
(
pTruth1
,
pCut
->
nL
imit
,
v
,
Place
);
Abc_TtSwapVars
(
pTruth1
,
pCut
->
nL
eaves
,
v
,
Place
);
p
->
pPerm
[
1
][
v
]
=
p
->
pPerm
[
1
][
Place
];
p
->
pPerm
[
1
][
v
]
=
p
->
pPerm
[
1
][
Place
];
p
->
pPerm
[
1
][
Place
]
=
Place
;
p
->
pPerm
[
1
][
Place
]
=
Place
;
v
--
;
v
--
;
...
@@ -200,7 +203,7 @@ if ( fVerbose )
...
@@ -200,7 +203,7 @@ if ( fVerbose )
// minimize support
// minimize support
if
(
p
->
pPars
->
fCutMin
)
if
(
p
->
pPars
->
fCutMin
)
{
{
nLeavesNew
=
Abc_TtMinBase
(
pTruth
,
pCut
->
pLeaves
,
pCut
->
nLeaves
,
pCut
->
nL
imit
);
nLeavesNew
=
Abc_TtMinBase
(
pTruth
,
pCut
->
pLeaves
,
pCut
->
nLeaves
,
pCut
->
nL
eaves
);
if
(
nLeavesNew
<
If_CutLeaveNum
(
pCut
)
)
if
(
nLeavesNew
<
If_CutLeaveNum
(
pCut
)
)
{
{
pCut
->
nLeaves
=
nLeavesNew
;
pCut
->
nLeaves
=
nLeavesNew
;
...
@@ -226,7 +229,7 @@ if ( fVerbose )
...
@@ -226,7 +229,7 @@ if ( fVerbose )
// hash function
// hash function
fCompl
=
((
uCanonPhase
>>
pCut
->
nLeaves
)
&
1
);
fCompl
=
((
uCanonPhase
>>
pCut
->
nLeaves
)
&
1
);
truthId
=
Vec_MemHashInsert
(
p
->
vTtMem
,
pTruth
);
truthId
=
Vec_MemHashInsert
(
p
->
vTtMem
[
pCut
->
nLeaves
]
,
pTruth
);
pCut
->
iCutFunc
=
Abc_Var2Lit
(
truthId
,
fCompl
);
pCut
->
iCutFunc
=
Abc_Var2Lit
(
truthId
,
fCompl
);
if
(
fVerbose
)
if
(
fVerbose
)
...
...
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