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
dddcab16
Commit
dddcab16
authored
Aug 31, 2015
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Performance tuning of the Nf.
parent
faeeaeb5
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
152 additions
and
146 deletions
+152
-146
src/aig/gia/gia.h
+3
-0
src/aig/gia/giaNf.c
+149
-146
No files found.
src/aig/gia/gia.h
View file @
dddcab16
...
@@ -307,6 +307,9 @@ struct Jf_Par_t_
...
@@ -307,6 +307,9 @@ struct Jf_Par_t_
word
Edge
;
word
Edge
;
word
Clause
;
word
Clause
;
word
Mux7
;
word
Mux7
;
word
WordMapDelay
;
word
WordMapArea
;
word
WordMapDelayTarget
;
float
MapDelay
;
float
MapDelay
;
float
MapArea
;
float
MapArea
;
float
MapDelayTarget
;
float
MapDelayTarget
;
...
...
src/aig/gia/giaNf.c
View file @
dddcab16
...
@@ -39,7 +39,7 @@ ABC_NAMESPACE_IMPL_START
...
@@ -39,7 +39,7 @@ ABC_NAMESPACE_IMPL_START
#define NF_CUT_MAX 32
#define NF_CUT_MAX 32
#define NF_NO_LEAF 31
#define NF_NO_LEAF 31
#define NF_NO_FUNC 0x3FFFFFF
#define NF_NO_FUNC 0x3FFFFFF
#define NF_INFINITY
FLT_MAX
#define NF_INFINITY
(~(word)0)
typedef
struct
Nf_Cut_t_
Nf_Cut_t
;
typedef
struct
Nf_Cut_t_
Nf_Cut_t
;
struct
Nf_Cut_t_
struct
Nf_Cut_t_
...
@@ -67,8 +67,8 @@ struct Nf_Mat_t_
...
@@ -67,8 +67,8 @@ struct Nf_Mat_t_
unsigned
fCompl
:
1
;
// complemented
unsigned
fCompl
:
1
;
// complemented
unsigned
fBest
:
1
;
// best cut
unsigned
fBest
:
1
;
// best cut
int
Conf
;
// input literals
int
Conf
;
// input literals
float
D
;
// delay
word
D
;
// delay
float
A
;
// area
word
A
;
// area
};
};
typedef
struct
Nf_Obj_t_
Nf_Obj_t
;
typedef
struct
Nf_Obj_t_
Nf_Obj_t
;
struct
Nf_Obj_t_
struct
Nf_Obj_t_
...
@@ -84,7 +84,7 @@ struct Nf_Man_t_
...
@@ -84,7 +84,7 @@ struct Nf_Man_t_
// matching
// matching
Vec_Mem_t
*
vTtMem
;
// truth tables
Vec_Mem_t
*
vTtMem
;
// truth tables
Vec_Wec_t
*
vTt2Match
;
// matches for truth tables
Vec_Wec_t
*
vTt2Match
;
// matches for truth tables
Mio_Cell
_t
*
pCells
;
// library gates
Mio_Cell
2_t
*
pCells
;
// library gates
int
nCells
;
// library gate count
int
nCells
;
// library gate count
// cut data
// cut data
Nf_Obj_t
*
pNfObjs
;
// best cuts
Nf_Obj_t
*
pNfObjs
;
// best cuts
...
@@ -92,7 +92,7 @@ struct Nf_Man_t_
...
@@ -92,7 +92,7 @@ struct Nf_Man_t_
Vec_Int_t
vCutSets
;
// cut offsets
Vec_Int_t
vCutSets
;
// cut offsets
Vec_Int_t
vMapRefs
;
// mapping refs (2x)
Vec_Int_t
vMapRefs
;
// mapping refs (2x)
Vec_Flt_t
vFlowRefs
;
// flow refs (2x)
Vec_Flt_t
vFlowRefs
;
// flow refs (2x)
Vec_
Flt
_t
vRequired
;
// required times (2x)
Vec_
Wrd
_t
vRequired
;
// required times (2x)
Vec_Flt_t
vCutFlows
;
// temporary cut area
Vec_Flt_t
vCutFlows
;
// temporary cut area
Vec_Int_t
vCutDelays
;
// temporary cut delay
Vec_Int_t
vCutDelays
;
// temporary cut delay
Vec_Int_t
vBackup
;
// backup literals
Vec_Int_t
vBackup
;
// backup literals
...
@@ -101,43 +101,44 @@ struct Nf_Man_t_
...
@@ -101,43 +101,44 @@ struct Nf_Man_t_
int
Iter
;
// mapping iterations
int
Iter
;
// mapping iterations
int
fUseEla
;
// use exact area
int
fUseEla
;
// use exact area
int
nInvs
;
// the inverter count
int
nInvs
;
// the inverter count
float
InvDelay
;
// inverter delay
word
InvDelay
;
// inverter delay
float
InvArea
;
// inverter area
word
InvArea
;
// inverter area
// statistics
// statistics
abctime
clkStart
;
// starting time
abctime
clkStart
;
// starting time
double
CutCount
[
6
];
// cut counts
double
CutCount
[
6
];
// cut counts
int
nCutUseAll
;
// objects with useful cuts
int
nCutUseAll
;
// objects with useful cuts
};
};
static
inline
int
Pf_Mat2Int
(
Pf_Mat_t
Mat
)
{
union
{
int
x
;
Pf_Mat_t
y
;
}
v
;
v
.
y
=
Mat
;
return
v
.
x
;
}
static
inline
int
Pf_Mat2Int
(
Pf_Mat_t
Mat
)
{
union
{
int
x
;
Pf_Mat_t
y
;
}
v
;
v
.
y
=
Mat
;
return
v
.
x
;
}
static
inline
Pf_Mat_t
Pf_Int2Mat
(
int
Int
)
{
union
{
int
x
;
Pf_Mat_t
y
;
}
v
;
v
.
x
=
Int
;
return
v
.
y
;
}
static
inline
Pf_Mat_t
Pf_Int2Mat
(
int
Int
)
{
union
{
int
x
;
Pf_Mat_t
y
;
}
v
;
v
.
x
=
Int
;
return
v
.
y
;
}
static
inline
float
Nf_Wrd2Flt
(
word
w
)
{
return
MIO_NUMINV
*
(
unsigned
)
w
;
}
static
inline
Nf_Obj_t
*
Nf_ManObj
(
Nf_Man_t
*
p
,
int
i
)
{
return
p
->
pNfObjs
+
i
;
}
static
inline
Mio_Cell_t
*
Nf_ManCell
(
Nf_Man_t
*
p
,
int
i
)
{
return
p
->
pCells
+
i
;
}
static
inline
Nf_Obj_t
*
Nf_ManObj
(
Nf_Man_t
*
p
,
int
i
)
{
return
p
->
pNfObjs
+
i
;
}
static
inline
int
*
Nf_ManCutSet
(
Nf_Man_t
*
p
,
int
i
)
{
return
(
int
*
)
Vec_PtrEntry
(
&
p
->
vPages
,
i
>>
16
)
+
(
i
&
0xFFFF
);
}
static
inline
Mio_Cell2_t
*
Nf_ManCell
(
Nf_Man_t
*
p
,
int
i
)
{
return
p
->
pCells
+
i
;
}
static
inline
int
Nf_ObjCutSetId
(
Nf_Man_t
*
p
,
int
i
)
{
return
Vec_IntEntry
(
&
p
->
vCutSets
,
i
);
}
static
inline
int
*
Nf_ManCutSet
(
Nf_Man_t
*
p
,
int
i
)
{
return
(
int
*
)
Vec_PtrEntry
(
&
p
->
vPages
,
i
>>
16
)
+
(
i
&
0xFFFF
);
}
static
inline
int
*
Nf_ObjCutSet
(
Nf_Man_t
*
p
,
int
i
)
{
return
Nf_ManCutSet
(
p
,
Nf_ObjCutSetId
(
p
,
i
));
}
static
inline
int
Nf_ObjCutSetId
(
Nf_Man_t
*
p
,
int
i
)
{
return
Vec_IntEntry
(
&
p
->
vCutSets
,
i
);
}
static
inline
int
Nf_ObjHasCuts
(
Nf_Man_t
*
p
,
int
i
)
{
return
(
int
)(
Vec_IntEntry
(
&
p
->
vCutSets
,
i
)
>
0
);
}
static
inline
int
*
Nf_ObjCutSet
(
Nf_Man_t
*
p
,
int
i
)
{
return
Nf_ManCutSet
(
p
,
Nf_ObjCutSetId
(
p
,
i
));
}
static
inline
int
*
Nf_ObjCutBest
(
Nf_Man_t
*
p
,
int
i
)
{
return
NULL
;
}
static
inline
int
Nf_ObjHasCuts
(
Nf_Man_t
*
p
,
int
i
)
{
return
(
int
)(
Vec_IntEntry
(
&
p
->
vCutSets
,
i
)
>
0
);
}
static
inline
int
Nf_ObjCutUseless
(
Nf_Man_t
*
p
,
int
TruthId
)
{
return
(
int
)(
TruthId
>=
Vec_WecSize
(
p
->
vTt2Match
));
}
static
inline
int
*
Nf_ObjCutBest
(
Nf_Man_t
*
p
,
int
i
)
{
return
NULL
;
}
static
inline
int
Nf_ObjCutUseless
(
Nf_Man_t
*
p
,
int
TruthId
)
{
return
(
int
)(
TruthId
>=
Vec_WecSize
(
p
->
vTt2Match
));
}
static
inline
float
Nf_ObjCutFlow
(
Nf_Man_t
*
p
,
int
i
)
{
return
Vec_FltEntry
(
&
p
->
vCutFlows
,
i
);
}
static
inline
int
Nf_ObjCutDelay
(
Nf_Man_t
*
p
,
int
i
)
{
return
Vec_IntEntry
(
&
p
->
vCutDelays
,
i
);
}
static
inline
float
Nf_ObjCutFlow
(
Nf_Man_t
*
p
,
int
i
)
{
return
Vec_FltEntry
(
&
p
->
vCutFlows
,
i
);
}
static
inline
void
Nf_ObjSetCutFlow
(
Nf_Man_t
*
p
,
int
i
,
float
a
)
{
Vec_FltWriteEntry
(
&
p
->
vCutFlows
,
i
,
a
);
}
static
inline
int
Nf_ObjCutDelay
(
Nf_Man_t
*
p
,
int
i
)
{
return
Vec_IntEntry
(
&
p
->
vCutDelays
,
i
);
}
static
inline
void
Nf_ObjSetCutDelay
(
Nf_Man_t
*
p
,
int
i
,
int
d
)
{
Vec_IntWriteEntry
(
&
p
->
vCutDelays
,
i
,
d
);
}
static
inline
void
Nf_ObjSetCutFlow
(
Nf_Man_t
*
p
,
int
i
,
float
a
)
{
Vec_FltWriteEntry
(
&
p
->
vCutFlows
,
i
,
a
);
}
static
inline
void
Nf_ObjSetCutDelay
(
Nf_Man_t
*
p
,
int
i
,
int
d
)
{
Vec_IntWriteEntry
(
&
p
->
vCutDelays
,
i
,
d
);
}
static
inline
int
Nf_ObjMapRefNum
(
Nf_Man_t
*
p
,
int
i
,
int
c
)
{
return
Vec_IntEntry
(
&
p
->
vMapRefs
,
Abc_Var2Lit
(
i
,
c
));
}
static
inline
int
Nf_ObjMapRefInc
(
Nf_Man_t
*
p
,
int
i
,
int
c
)
{
return
(
*
Vec_IntEntryP
(
&
p
->
vMapRefs
,
Abc_Var2Lit
(
i
,
c
)))
++
;
}
static
inline
int
Nf_ObjMapRefNum
(
Nf_Man_t
*
p
,
int
i
,
int
c
)
{
return
Vec_IntEntry
(
&
p
->
vMapRefs
,
Abc_Var2Lit
(
i
,
c
));
}
static
inline
int
Nf_ObjMapRefDec
(
Nf_Man_t
*
p
,
int
i
,
int
c
)
{
return
--
(
*
Vec_IntEntryP
(
&
p
->
vMapRefs
,
Abc_Var2Lit
(
i
,
c
)));
}
static
inline
int
Nf_ObjMapRefInc
(
Nf_Man_t
*
p
,
int
i
,
int
c
)
{
return
(
*
Vec_IntEntryP
(
&
p
->
vMapRefs
,
Abc_Var2Lit
(
i
,
c
)))
++
;
}
static
inline
float
Nf_ObjFlowRefs
(
Nf_Man_t
*
p
,
int
i
,
int
c
)
{
return
Vec_FltEntry
(
&
p
->
vFlowRefs
,
Abc_Var2Lit
(
i
,
c
));
}
static
inline
int
Nf_ObjMapRefDec
(
Nf_Man_t
*
p
,
int
i
,
int
c
)
{
return
--
(
*
Vec_IntEntryP
(
&
p
->
vMapRefs
,
Abc_Var2Lit
(
i
,
c
)));
}
static
inline
float
Nf_ObjRequired
(
Nf_Man_t
*
p
,
int
i
,
int
c
)
{
return
Vec_FltEntry
(
&
p
->
vRequired
,
Abc_Var2Lit
(
i
,
c
));
}
static
inline
float
Nf_ObjFlowRefs
(
Nf_Man_t
*
p
,
int
i
,
int
c
)
{
return
Vec_FltEntry
(
&
p
->
vFlowRefs
,
Abc_Var2Lit
(
i
,
c
));
}
static
inline
void
Nf_ObjSetRequired
(
Nf_Man_t
*
p
,
int
i
,
int
c
,
float
f
)
{
Vec_FltWriteEntry
(
&
p
->
vRequired
,
Abc_Var2Lit
(
i
,
c
),
f
);
}
static
inline
word
Nf_ObjRequired
(
Nf_Man_t
*
p
,
int
i
,
int
c
)
{
return
Vec_WrdEntry
(
&
p
->
vRequired
,
Abc_Var2Lit
(
i
,
c
));
}
static
inline
void
Nf_ObjUpdateRequired
(
Nf_Man_t
*
p
,
int
i
,
int
c
,
float
f
)
{
if
(
Nf_ObjRequired
(
p
,
i
,
c
)
>
f
)
Nf_ObjSetRequired
(
p
,
i
,
c
,
f
);
}
static
inline
void
Nf_ObjSetRequired
(
Nf_Man_t
*
p
,
int
i
,
int
c
,
word
f
)
{
Vec_WrdWriteEntry
(
&
p
->
vRequired
,
Abc_Var2Lit
(
i
,
c
),
f
);
}
static
inline
void
Nf_ObjUpdateRequired
(
Nf_Man_t
*
p
,
int
i
,
int
c
,
word
f
)
{
if
(
Nf_ObjRequired
(
p
,
i
,
c
)
>
f
)
Nf_ObjSetRequired
(
p
,
i
,
c
,
f
);
}
static
inline
Nf_Mat_t
*
Nf_ObjMatchD
(
Nf_Man_t
*
p
,
int
i
,
int
c
)
{
return
&
Nf_ManObj
(
p
,
i
)
->
M
[
c
][
0
];
}
static
inline
Nf_Mat_t
*
Nf_ObjMatchA
(
Nf_Man_t
*
p
,
int
i
,
int
c
)
{
return
&
Nf_ManObj
(
p
,
i
)
->
M
[
c
][
1
];
}
static
inline
Nf_Mat_t
*
Nf_ObjMatchD
(
Nf_Man_t
*
p
,
int
i
,
int
c
)
{
return
&
Nf_ManObj
(
p
,
i
)
->
M
[
c
][
0
];
}
static
inline
Nf_Mat_t
*
Nf_ObjMatchA
(
Nf_Man_t
*
p
,
int
i
,
int
c
)
{
return
&
Nf_ManObj
(
p
,
i
)
->
M
[
c
][
1
];
}
static
inline
Nf_Mat_t
*
Nf_ObjMatchBest
(
Nf_Man_t
*
p
,
int
i
,
int
c
)
static
inline
Nf_Mat_t
*
Nf_ObjMatchBest
(
Nf_Man_t
*
p
,
int
i
,
int
c
)
{
{
Nf_Mat_t
*
pD
=
Nf_ObjMatchD
(
p
,
i
,
c
);
Nf_Mat_t
*
pD
=
Nf_ObjMatchD
(
p
,
i
,
c
);
Nf_Mat_t
*
pA
=
Nf_ObjMatchA
(
p
,
i
,
c
);
Nf_Mat_t
*
pA
=
Nf_ObjMatchA
(
p
,
i
,
c
);
...
@@ -214,7 +215,7 @@ void Nf_StoCreateGateAdd( Nf_Man_t * pMan, word uTruth, int * pFans, int nFans,
...
@@ -214,7 +215,7 @@ void Nf_StoCreateGateAdd( Nf_Man_t * pMan, word uTruth, int * pFans, int nFans,
Vec_IntPush
(
vArray
,
Pf_Mat2Int
(
Mat
)
);
Vec_IntPush
(
vArray
,
Pf_Mat2Int
(
Mat
)
);
}
}
}
}
void
Nf_StoCreateGateMaches
(
Nf_Man_t
*
pMan
,
Mio_Cell_t
*
pCell
,
int
**
pComp
,
int
**
pPerm
,
int
*
pnPerms
)
void
Nf_StoCreateGateMaches
(
Nf_Man_t
*
pMan
,
Mio_Cell
2
_t
*
pCell
,
int
**
pComp
,
int
**
pPerm
,
int
*
pnPerms
)
{
{
int
Perm
[
NF_LEAF_MAX
],
*
Perm1
,
*
Perm2
;
int
Perm
[
NF_LEAF_MAX
],
*
Perm1
,
*
Perm2
;
int
nPerms
=
pnPerms
[
pCell
->
nFanins
];
int
nPerms
=
pnPerms
[
pCell
->
nFanins
];
...
@@ -256,7 +257,7 @@ void Nf_StoDeriveMatches( Nf_Man_t * p, int fVerbose )
...
@@ -256,7 +257,7 @@ void Nf_StoDeriveMatches( Nf_Man_t * p, int fVerbose )
pPerm
[
i
]
=
Extra_PermSchedule
(
i
);
pPerm
[
i
]
=
Extra_PermSchedule
(
i
);
for
(
i
=
2
;
i
<=
6
;
i
++
)
for
(
i
=
2
;
i
<=
6
;
i
++
)
nPerms
[
i
]
=
Extra_Factorial
(
i
);
nPerms
[
i
]
=
Extra_Factorial
(
i
);
p
->
pCells
=
Mio_CollectRootsNewDefault
(
6
,
&
p
->
nCells
,
fVerbose
);
p
->
pCells
=
Mio_CollectRootsNewDefault
2
(
6
,
&
p
->
nCells
,
fVerbose
);
for
(
i
=
4
;
i
<
p
->
nCells
;
i
++
)
for
(
i
=
4
;
i
<
p
->
nCells
;
i
++
)
Nf_StoCreateGateMaches
(
p
,
p
->
pCells
+
i
,
pComp
,
pPerm
,
nPerms
);
Nf_StoCreateGateMaches
(
p
,
p
->
pCells
+
i
,
pComp
,
pPerm
,
nPerms
);
for
(
i
=
2
;
i
<=
6
;
i
++
)
for
(
i
=
2
;
i
<=
6
;
i
++
)
...
@@ -267,14 +268,14 @@ void Nf_StoDeriveMatches( Nf_Man_t * p, int fVerbose )
...
@@ -267,14 +268,14 @@ void Nf_StoDeriveMatches( Nf_Man_t * p, int fVerbose )
}
}
void
Nf_StoPrintOne
(
Nf_Man_t
*
p
,
int
Count
,
int
t
,
int
i
,
int
GateId
,
Pf_Mat_t
Mat
)
void
Nf_StoPrintOne
(
Nf_Man_t
*
p
,
int
Count
,
int
t
,
int
i
,
int
GateId
,
Pf_Mat_t
Mat
)
{
{
Mio_Cell_t
*
pC
=
p
->
pCells
+
GateId
;
Mio_Cell
2
_t
*
pC
=
p
->
pCells
+
GateId
;
word
*
pTruth
=
Vec_MemReadEntry
(
p
->
vTtMem
,
t
);
word
*
pTruth
=
Vec_MemReadEntry
(
p
->
vTtMem
,
t
);
int
k
,
nSuppSize
=
Abc_TtSupportSize
(
pTruth
,
6
);
int
k
,
nSuppSize
=
Abc_TtSupportSize
(
pTruth
,
6
);
printf
(
"%6d : "
,
Count
);
printf
(
"%6d : "
,
Count
);
printf
(
"%6d : "
,
t
);
printf
(
"%6d : "
,
t
);
printf
(
"%6d : "
,
i
);
printf
(
"%6d : "
,
i
);
printf
(
"Gate %16s "
,
pC
->
pName
);
printf
(
"Gate %16s "
,
pC
->
pName
);
printf
(
"Area =%8.2f "
,
pC
->
Area
);
printf
(
"Area =%8.2f "
,
Nf_Wrd2Flt
(
pC
->
Area
)
);
printf
(
"In = %d "
,
pC
->
nFanins
);
printf
(
"In = %d "
,
pC
->
nFanins
);
if
(
Mat
.
fCompl
)
if
(
Mat
.
fCompl
)
printf
(
" compl "
);
printf
(
" compl "
);
...
@@ -344,7 +345,7 @@ Nf_Man_t * Nf_StoCreate( Gia_Man_t * pGia, Jf_Par_t * pPars )
...
@@ -344,7 +345,7 @@ Nf_Man_t * Nf_StoCreate( Gia_Man_t * pGia, Jf_Par_t * pPars )
Vec_PtrGrow
(
&
p
->
vPages
,
256
);
// cut memory
Vec_PtrGrow
(
&
p
->
vPages
,
256
);
// cut memory
Vec_IntFill
(
&
p
->
vMapRefs
,
2
*
Gia_ManObjNum
(
pGia
),
0
);
// mapping refs (2x)
Vec_IntFill
(
&
p
->
vMapRefs
,
2
*
Gia_ManObjNum
(
pGia
),
0
);
// mapping refs (2x)
Vec_FltFill
(
&
p
->
vFlowRefs
,
2
*
Gia_ManObjNum
(
pGia
),
0
);
// flow refs (2x)
Vec_FltFill
(
&
p
->
vFlowRefs
,
2
*
Gia_ManObjNum
(
pGia
),
0
);
// flow refs (2x)
Vec_
Flt
Fill
(
&
p
->
vRequired
,
2
*
Gia_ManObjNum
(
pGia
),
NF_INFINITY
);
// required times (2x)
Vec_
Wrd
Fill
(
&
p
->
vRequired
,
2
*
Gia_ManObjNum
(
pGia
),
NF_INFINITY
);
// required times (2x)
Vec_IntFill
(
&
p
->
vCutSets
,
Gia_ManObjNum
(
pGia
),
0
);
// cut offsets
Vec_IntFill
(
&
p
->
vCutSets
,
Gia_ManObjNum
(
pGia
),
0
);
// cut offsets
Vec_FltFill
(
&
p
->
vCutFlows
,
Gia_ManObjNum
(
pGia
),
0
);
// cut area
Vec_FltFill
(
&
p
->
vCutFlows
,
Gia_ManObjNum
(
pGia
),
0
);
// cut area
Vec_IntFill
(
&
p
->
vCutDelays
,
Gia_ManObjNum
(
pGia
),
0
);
// cut delay
Vec_IntFill
(
&
p
->
vCutDelays
,
Gia_ManObjNum
(
pGia
),
0
);
// cut delay
...
@@ -954,8 +955,8 @@ void Nf_ManPrintStats( Nf_Man_t * p, char * pTitle )
...
@@ -954,8 +955,8 @@ void Nf_ManPrintStats( Nf_Man_t * p, char * pTitle )
if
(
!
p
->
pPars
->
fVerbose
)
if
(
!
p
->
pPars
->
fVerbose
)
return
;
return
;
printf
(
"%s : "
,
pTitle
);
printf
(
"%s : "
,
pTitle
);
printf
(
"Delay =%8.2f "
,
p
->
pPars
->
MapDelay
);
printf
(
"Delay =%8.2f "
,
Nf_Wrd2Flt
(
p
->
pPars
->
WordMapDelay
)
);
printf
(
"Area =%12.2f "
,
p
->
pPars
->
MapArea
);
printf
(
"Area =%12.2f "
,
Nf_Wrd2Flt
(
p
->
pPars
->
WordMapArea
)
);
printf
(
"Gate =%6d "
,
(
int
)
p
->
pPars
->
Area
);
printf
(
"Gate =%6d "
,
(
int
)
p
->
pPars
->
Area
);
printf
(
"Inv =%6d "
,
(
int
)
p
->
nInvs
);
printf
(
"Inv =%6d "
,
(
int
)
p
->
nInvs
);
printf
(
"Edge =%7d "
,
(
int
)
p
->
pPars
->
Edge
);
printf
(
"Edge =%7d "
,
(
int
)
p
->
pPars
->
Edge
);
...
@@ -1021,10 +1022,10 @@ void Nf_ManPrintQuit( Nf_Man_t * p )
...
@@ -1021,10 +1022,10 @@ void Nf_ManPrintQuit( Nf_Man_t * p )
SeeAlso []
SeeAlso []
***********************************************************************/
***********************************************************************/
float
Nf_MatchDeref2_rec
(
Nf_Man_t
*
p
,
int
i
,
int
c
,
Nf_Mat_t
*
pM
)
word
Nf_MatchDeref2_rec
(
Nf_Man_t
*
p
,
int
i
,
int
c
,
Nf_Mat_t
*
pM
)
{
{
int
k
,
iVar
,
fCompl
,
*
pCut
;
int
k
,
iVar
,
fCompl
,
*
pCut
;
float
Area
=
0
;
word
Area
=
0
;
if
(
pM
->
fCompl
)
if
(
pM
->
fCompl
)
{
{
assert
(
Nf_ObjMapRefNum
(
p
,
i
,
!
c
)
>
0
);
assert
(
Nf_ObjMapRefNum
(
p
,
i
,
!
c
)
>
0
);
...
@@ -1043,10 +1044,10 @@ float Nf_MatchDeref2_rec( Nf_Man_t * p, int i, int c, Nf_Mat_t * pM )
...
@@ -1043,10 +1044,10 @@ float Nf_MatchDeref2_rec( Nf_Man_t * p, int i, int c, Nf_Mat_t * pM )
}
}
return
Area
+
Nf_ManCell
(
p
,
pM
->
Gate
)
->
Area
;
return
Area
+
Nf_ManCell
(
p
,
pM
->
Gate
)
->
Area
;
}
}
float
Nf_MatchRef2_rec
(
Nf_Man_t
*
p
,
int
i
,
int
c
,
Nf_Mat_t
*
pM
,
Vec_Int_t
*
vBackup
)
word
Nf_MatchRef2_rec
(
Nf_Man_t
*
p
,
int
i
,
int
c
,
Nf_Mat_t
*
pM
,
Vec_Int_t
*
vBackup
)
{
{
int
k
,
iVar
,
fCompl
,
*
pCut
;
int
k
,
iVar
,
fCompl
,
*
pCut
;
float
Area
=
0
;
word
Area
=
0
;
if
(
pM
->
fCompl
)
if
(
pM
->
fCompl
)
{
{
if
(
vBackup
)
if
(
vBackup
)
...
@@ -1069,9 +1070,9 @@ float Nf_MatchRef2_rec( Nf_Man_t * p, int i, int c, Nf_Mat_t * pM, Vec_Int_t * v
...
@@ -1069,9 +1070,9 @@ float Nf_MatchRef2_rec( Nf_Man_t * p, int i, int c, Nf_Mat_t * pM, Vec_Int_t * v
}
}
return
Area
+
Nf_ManCell
(
p
,
pM
->
Gate
)
->
Area
;
return
Area
+
Nf_ManCell
(
p
,
pM
->
Gate
)
->
Area
;
}
}
float
Nf_MatchRef2Area
(
Nf_Man_t
*
p
,
int
i
,
int
c
,
Nf_Mat_t
*
pM
)
word
Nf_MatchRef2Area
(
Nf_Man_t
*
p
,
int
i
,
int
c
,
Nf_Mat_t
*
pM
)
{
{
float
Area
;
int
iLit
,
k
;
word
Area
;
int
iLit
,
k
;
Vec_IntClear
(
&
p
->
vBackup
);
Vec_IntClear
(
&
p
->
vBackup
);
Area
=
Nf_MatchRef2_rec
(
p
,
i
,
c
,
pM
,
&
p
->
vBackup
);
Area
=
Nf_MatchRef2_rec
(
p
,
i
,
c
,
pM
,
&
p
->
vBackup
);
Vec_IntForEachEntry
(
&
p
->
vBackup
,
iLit
,
k
)
Vec_IntForEachEntry
(
&
p
->
vBackup
,
iLit
,
k
)
...
@@ -1095,7 +1096,7 @@ float Nf_MatchRef2Area( Nf_Man_t * p, int i, int c, Nf_Mat_t * pM )
...
@@ -1095,7 +1096,7 @@ float Nf_MatchRef2Area( Nf_Man_t * p, int i, int c, Nf_Mat_t * pM )
***********************************************************************/
***********************************************************************/
void
Nf_ManCutMatchPrint
(
Nf_Man_t
*
p
,
int
iObj
,
char
*
pStr
,
Nf_Mat_t
*
pM
)
void
Nf_ManCutMatchPrint
(
Nf_Man_t
*
p
,
int
iObj
,
char
*
pStr
,
Nf_Mat_t
*
pM
)
{
{
Mio_Cell_t
*
pCell
;
Mio_Cell
2
_t
*
pCell
;
int
i
,
*
pCut
;
int
i
,
*
pCut
;
printf
(
"%5d %s : "
,
iObj
,
pStr
);
printf
(
"%5d %s : "
,
iObj
,
pStr
);
if
(
pM
->
CutH
==
0
)
if
(
pM
->
CutH
==
0
)
...
@@ -1105,8 +1106,8 @@ void Nf_ManCutMatchPrint( Nf_Man_t * p, int iObj, char * pStr, Nf_Mat_t * pM )
...
@@ -1105,8 +1106,8 @@ void Nf_ManCutMatchPrint( Nf_Man_t * p, int iObj, char * pStr, Nf_Mat_t * pM )
}
}
pCell
=
Nf_ManCell
(
p
,
pM
->
Gate
);
pCell
=
Nf_ManCell
(
p
,
pM
->
Gate
);
pCut
=
Nf_CutFromHandle
(
Nf_ObjCutSet
(
p
,
iObj
),
pM
->
CutH
);
pCut
=
Nf_CutFromHandle
(
Nf_ObjCutSet
(
p
,
iObj
),
pM
->
CutH
);
printf
(
"D =%6.2f "
,
pM
->
D
);
printf
(
"D =%6.2f "
,
Nf_Wrd2Flt
(
pM
->
D
)
);
printf
(
"A =%6.2f "
,
pM
->
A
);
printf
(
"A =%6.2f "
,
Nf_Wrd2Flt
(
pM
->
A
)
);
printf
(
"C = %d "
,
pM
->
fCompl
);
printf
(
"C = %d "
,
pM
->
fCompl
);
// printf( "B = %d ", pM->fBest );
// printf( "B = %d ", pM->fBest );
printf
(
" "
);
printf
(
" "
);
...
@@ -1120,7 +1121,7 @@ void Nf_ManCutMatchPrint( Nf_Man_t * p, int iObj, char * pStr, Nf_Mat_t * pM )
...
@@ -1120,7 +1121,7 @@ void Nf_ManCutMatchPrint( Nf_Man_t * p, int iObj, char * pStr, Nf_Mat_t * pM )
printf
(
"%d "
,
pCell
->
nFanins
);
printf
(
"%d "
,
pCell
->
nFanins
);
printf
(
"{"
);
printf
(
"{"
);
for
(
i
=
0
;
i
<
(
int
)
pCell
->
nFanins
;
i
++
)
for
(
i
=
0
;
i
<
(
int
)
pCell
->
nFanins
;
i
++
)
printf
(
"%6.2f "
,
pCell
->
Delays
[
i
]
);
printf
(
"%6.2f "
,
Nf_Wrd2Flt
(
pCell
->
Delays
[
i
])
);
for
(
;
i
<
6
;
i
++
)
for
(
;
i
<
6
;
i
++
)
printf
(
" "
);
printf
(
" "
);
printf
(
" } "
);
printf
(
" } "
);
...
@@ -1137,10 +1138,10 @@ void Nf_ManCutMatchOne( Nf_Man_t * p, int iObj, int * pCut, int * pCutSet )
...
@@ -1137,10 +1138,10 @@ void Nf_ManCutMatchOne( Nf_Man_t * p, int iObj, int * pCut, int * pCutSet )
int
nFans
=
Nf_CutSize
(
pCut
);
int
nFans
=
Nf_CutSize
(
pCut
);
int
iFuncLit
=
Nf_CutFunc
(
pCut
);
int
iFuncLit
=
Nf_CutFunc
(
pCut
);
int
fComplExt
=
Abc_LitIsCompl
(
iFuncLit
);
int
fComplExt
=
Abc_LitIsCompl
(
iFuncLit
);
float
Epsilon
=
p
->
pPars
->
Epsilon
;
//
float Epsilon = p->pPars->Epsilon;
Vec_Int_t
*
vArr
=
Vec_WecEntry
(
p
->
vTt2Match
,
Abc_Lit2Var
(
iFuncLit
)
);
Vec_Int_t
*
vArr
=
Vec_WecEntry
(
p
->
vTt2Match
,
Abc_Lit2Var
(
iFuncLit
)
);
int
i
,
k
,
c
,
Info
,
Offset
,
iFanin
,
fComplF
;
int
i
,
k
,
c
,
Info
,
Offset
,
iFanin
,
fComplF
;
float
ArrivalD
,
ArrivalA
;
word
ArrivalD
,
ArrivalA
;
Nf_Mat_t
*
pD
,
*
pA
;
Nf_Mat_t
*
pD
,
*
pA
;
// assign fanins matches
// assign fanins matches
Nf_Obj_t
*
pBestF
[
NF_LEAF_MAX
];
Nf_Obj_t
*
pBestF
[
NF_LEAF_MAX
];
...
@@ -1183,12 +1184,12 @@ void Nf_ManCutMatchOne( Nf_Man_t * p, int iObj, int * pCut, int * pCutSet )
...
@@ -1183,12 +1184,12 @@ void Nf_ManCutMatchOne( Nf_Man_t * p, int iObj, int * pCut, int * pCutSet )
Vec_IntForEachEntryDouble
(
vArr
,
Info
,
Offset
,
i
)
Vec_IntForEachEntryDouble
(
vArr
,
Info
,
Offset
,
i
)
{
{
Pf_Mat_t
Mat
=
Pf_Int2Mat
(
Offset
);
Pf_Mat_t
Mat
=
Pf_Int2Mat
(
Offset
);
Mio_Cell_t
*
pC
=
Nf_ManCell
(
p
,
Info
);
Mio_Cell
2
_t
*
pC
=
Nf_ManCell
(
p
,
Info
);
int
fCompl
=
Mat
.
fCompl
^
fComplExt
;
int
fCompl
=
Mat
.
fCompl
^
fComplExt
;
float
Required
=
Nf_ObjRequired
(
p
,
iObj
,
fCompl
);
word
Required
=
Nf_ObjRequired
(
p
,
iObj
,
fCompl
);
Nf_Mat_t
*
pD
=
&
pBest
->
M
[
fCompl
][
0
];
Nf_Mat_t
*
pD
=
&
pBest
->
M
[
fCompl
][
0
];
Nf_Mat_t
*
pA
=
&
pBest
->
M
[
fCompl
][
1
];
Nf_Mat_t
*
pA
=
&
pBest
->
M
[
fCompl
][
1
];
float
Area
=
pC
->
Area
,
Delay
=
0
;
word
Area
=
pC
->
Area
,
Delay
=
0
;
assert
(
nFans
==
(
int
)
pC
->
nFanins
);
assert
(
nFans
==
(
int
)
pC
->
nFanins
);
/*
/*
if ( p->Iter == 0 && iObj == 674 )
if ( p->Iter == 0 && iObj == 674 )
...
@@ -1206,24 +1207,24 @@ void Nf_ManCutMatchOne( Nf_Man_t * p, int iObj, int * pCut, int * pCutSet )
...
@@ -1206,24 +1207,24 @@ void Nf_ManCutMatchOne( Nf_Man_t * p, int iObj, int * pCut, int * pCutSet )
fComplF
=
(
Mat
.
Phase
>>
k
)
&
1
;
fComplF
=
(
Mat
.
Phase
>>
k
)
&
1
;
ArrivalD
=
pBestF
[
k
]
->
M
[
fComplF
][
0
].
D
;
ArrivalD
=
pBestF
[
k
]
->
M
[
fComplF
][
0
].
D
;
ArrivalA
=
pBestF
[
k
]
->
M
[
fComplF
][
1
].
D
;
ArrivalA
=
pBestF
[
k
]
->
M
[
fComplF
][
1
].
D
;
if
(
ArrivalA
+
pC
->
Delays
[
iFanin
]
<
Required
+
Epsilon
&&
Required
!=
NF_INFINITY
)
if
(
ArrivalA
+
pC
->
Delays
[
iFanin
]
<
=
Required
&&
Required
!=
NF_INFINITY
)
{
{
Delay
=
Abc_Max
Float
(
Delay
,
ArrivalA
+
pC
->
Delays
[
iFanin
]
);
Delay
=
Abc_Max
Word
(
Delay
,
ArrivalA
+
pC
->
Delays
[
iFanin
]
);
Area
+=
pBestF
[
k
]
->
M
[
fComplF
][
1
].
A
;
Area
+=
pBestF
[
k
]
->
M
[
fComplF
][
1
].
A
;
}
}
else
else
{
{
// assert( ArrivalD + pC->Delays[iFanin] < Required
+ Epsilon
);
// assert( ArrivalD + pC->Delays[iFanin] < Required );
if
(
pD
->
D
+
Epsilon
<
NF_INFINITY
&&
pA
->
D
+
Epsilon
<
NF_INFINITY
&&
ArrivalD
+
pC
->
Delays
[
iFanin
]
>=
Required
+
Epsilon
)
if
(
pD
->
D
<
NF_INFINITY
&&
pA
->
D
<
NF_INFINITY
&&
ArrivalD
+
pC
->
Delays
[
iFanin
]
>
Required
)
break
;
break
;
Delay
=
Abc_Max
Float
(
Delay
,
ArrivalD
+
pC
->
Delays
[
iFanin
]
);
Delay
=
Abc_Max
Word
(
Delay
,
ArrivalD
+
pC
->
Delays
[
iFanin
]
);
Area
+=
pBestF
[
k
]
->
M
[
fComplF
][
0
].
A
;
Area
+=
pBestF
[
k
]
->
M
[
fComplF
][
0
].
A
;
}
}
}
}
if
(
k
<
nFans
)
if
(
k
<
nFans
)
continue
;
continue
;
// select best match
// select best match
if
(
pD
->
D
>
Delay
+
Epsilon
)
if
(
pD
->
D
>
Delay
)
{
{
pD
->
D
=
Delay
;
pD
->
D
=
Delay
;
pD
->
A
=
Area
;
pD
->
A
=
Area
;
...
@@ -1234,10 +1235,10 @@ void Nf_ManCutMatchOne( Nf_Man_t * p, int iObj, int * pCut, int * pCutSet )
...
@@ -1234,10 +1235,10 @@ void Nf_ManCutMatchOne( Nf_Man_t * p, int iObj, int * pCut, int * pCutSet )
pD
->
Conf
|=
(
Abc_Var2Lit
(
k
,
(
Mat
.
Phase
>>
k
)
&
1
)
<<
(((
Mat
.
Perm
>>
(
3
*
k
))
&
7
)
<<
2
));
pD
->
Conf
|=
(
Abc_Var2Lit
(
k
,
(
Mat
.
Phase
>>
k
)
&
1
)
<<
(((
Mat
.
Perm
>>
(
3
*
k
))
&
7
)
<<
2
));
}
}
if
(
pA
->
A
>
Area
+
Epsilon
)
if
(
pA
->
A
>
Area
)
{
{
//if ( 674 == iObj && p->Iter == 0 && pA == &pBest->M[1][1] )
//if ( 674 == iObj && p->Iter == 0 && pA == &pBest->M[1][1] )
//printf( "Comparing %.10f and %.10f
(%f)\n", pA->A, Area, Epsilon
);
//printf( "Comparing %.10f and %.10f
\n", pA->A, Area
);
//if ( 674 == iObj && p->Iter == 0 && pA == &pBest->M[1][1] )
//if ( 674 == iObj && p->Iter == 0 && pA == &pBest->M[1][1] )
//printf( " Updating\n" );
//printf( " Updating\n" );
...
@@ -1252,7 +1253,7 @@ void Nf_ManCutMatchOne( Nf_Man_t * p, int iObj, int * pCut, int * pCutSet )
...
@@ -1252,7 +1253,7 @@ void Nf_ManCutMatchOne( Nf_Man_t * p, int iObj, int * pCut, int * pCutSet )
}
}
}
}
}
}
static
inline
void
Nf_ObjPrepareCi
(
Nf_Man_t
*
p
,
int
iObj
,
float
Time
)
static
inline
void
Nf_ObjPrepareCi
(
Nf_Man_t
*
p
,
int
iObj
,
word
Time
)
{
{
Nf_Mat_t
*
pD0
=
Nf_ObjMatchD
(
p
,
iObj
,
0
);
Nf_Mat_t
*
pD0
=
Nf_ObjMatchD
(
p
,
iObj
,
0
);
Nf_Mat_t
*
pA0
=
Nf_ObjMatchA
(
p
,
iObj
,
0
);
Nf_Mat_t
*
pA0
=
Nf_ObjMatchA
(
p
,
iObj
,
0
);
...
@@ -1292,25 +1293,25 @@ static inline void Nf_ObjPrepareBuf( Nf_Man_t * p, Gia_Obj_t * pObj )
...
@@ -1292,25 +1293,25 @@ static inline void Nf_ObjPrepareBuf( Nf_Man_t * p, Gia_Obj_t * pObj )
pDn
->
fCompl
=
pAn
->
fCompl
=
1
;
pDn
->
fCompl
=
pAn
->
fCompl
=
1
;
pDn
->
fBest
=
1
;
pDn
->
fBest
=
1
;
}
}
static
inline
float
Nf_CutRequired
(
Nf_Man_t
*
p
,
Nf_Mat_t
*
pM
,
int
*
pCutSet
)
static
inline
word
Nf_CutRequired
(
Nf_Man_t
*
p
,
Nf_Mat_t
*
pM
,
int
*
pCutSet
)
{
{
Mio_Cell_t
*
pCell
=
Nf_ManCell
(
p
,
pM
->
Gate
);
Mio_Cell
2
_t
*
pCell
=
Nf_ManCell
(
p
,
pM
->
Gate
);
int
*
pCut
=
Nf_CutFromHandle
(
pCutSet
,
pM
->
CutH
);
int
*
pCut
=
Nf_CutFromHandle
(
pCutSet
,
pM
->
CutH
);
int
*
pFans
=
Nf_CutLeaves
(
pCut
);
int
*
pFans
=
Nf_CutLeaves
(
pCut
);
int
i
,
nFans
=
Nf_CutSize
(
pCut
);
int
i
,
nFans
=
Nf_CutSize
(
pCut
);
float
Arrival
=
0
,
Required
=
0
;
word
Arrival
=
0
,
Required
=
0
;
for
(
i
=
0
;
i
<
nFans
;
i
++
)
for
(
i
=
0
;
i
<
nFans
;
i
++
)
{
{
int
iLit
=
Nf_CutConfLit
(
pM
->
Conf
,
i
);
int
iLit
=
Nf_CutConfLit
(
pM
->
Conf
,
i
);
int
iFanin
=
pFans
[
Abc_Lit2Var
(
iLit
)
];
int
iFanin
=
pFans
[
Abc_Lit2Var
(
iLit
)
];
int
fCompl
=
Abc_LitIsCompl
(
iLit
);
int
fCompl
=
Abc_LitIsCompl
(
iLit
);
float
Arr
=
Nf_ManObj
(
p
,
iFanin
)
->
M
[
fCompl
][
0
].
D
+
pCell
->
Delays
[
i
];
word
Arr
=
Nf_ManObj
(
p
,
iFanin
)
->
M
[
fCompl
][
0
].
D
+
pCell
->
Delays
[
i
];
float
Req
=
Nf_ObjRequired
(
p
,
iFanin
,
fCompl
);
word
Req
=
Nf_ObjRequired
(
p
,
iFanin
,
fCompl
);
Arrival
=
Abc_MaxFloat
(
Arrival
,
Arr
);
Arrival
=
Abc_MaxWord
(
Arrival
,
Arr
);
if
(
Req
<
NF_INFINITY
)
if
(
Req
<
NF_INFINITY
)
Required
=
Abc_Max
Float
(
Required
,
Req
+
pCell
->
Delays
[
i
]
);
Required
=
Abc_Max
Word
(
Required
,
Req
+
pCell
->
Delays
[
i
]
);
}
}
return
Abc_Max
Float
(
Required
+
p
->
pPars
->
nReqTimeFlex
*
p
->
InvDelay
,
Arrival
);
return
Abc_Max
Word
(
Required
+
p
->
pPars
->
nReqTimeFlex
*
p
->
InvDelay
,
Arrival
);
}
}
static
inline
void
Nf_ObjComputeRequired
(
Nf_Man_t
*
p
,
int
iObj
)
static
inline
void
Nf_ObjComputeRequired
(
Nf_Man_t
*
p
,
int
iObj
)
{
{
...
@@ -1327,21 +1328,21 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
...
@@ -1327,21 +1328,21 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
Nf_Mat_t
*
pDn
=
&
pBest
->
M
[
1
][
0
];
Nf_Mat_t
*
pDn
=
&
pBest
->
M
[
1
][
0
];
Nf_Mat_t
*
pAp
=
&
pBest
->
M
[
0
][
1
];
Nf_Mat_t
*
pAp
=
&
pBest
->
M
[
0
][
1
];
Nf_Mat_t
*
pAn
=
&
pBest
->
M
[
1
][
1
];
Nf_Mat_t
*
pAn
=
&
pBest
->
M
[
1
][
1
];
float
FlowRefP
=
Nf_ObjFlowRefs
(
p
,
iObj
,
0
);
word
FlowRefP
=
(
word
)(
MIO_NUM
*
Nf_ObjFlowRefs
(
p
,
iObj
,
0
)
);
float
FlowRefN
=
Nf_ObjFlowRefs
(
p
,
iObj
,
1
);
word
FlowRefN
=
(
word
)(
MIO_NUM
*
Nf_ObjFlowRefs
(
p
,
iObj
,
1
)
);
float
Epsilon
=
p
->
pPars
->
Epsilon
;
//
float Epsilon = p->pPars->Epsilon;
int
i
,
Index
,
*
pCut
,
*
pCutSet
=
Nf_ObjCutSet
(
p
,
iObj
);
int
i
,
*
pCut
,
*
pCutSet
=
Nf_ObjCutSet
(
p
,
iObj
);
float
ValueBeg
[
2
]
=
{
0
},
ValueEnd
[
2
]
=
{
0
},
Required
[
2
]
=
{
0
};
word
ValueBeg
[
2
]
=
{
0
},
ValueEnd
[
2
]
=
{
0
},
Required
[
2
]
=
{
0
};
if
(
p
->
Iter
)
if
(
p
->
Iter
)
{
{
Nf_ObjComputeRequired
(
p
,
iObj
);
Nf_ObjComputeRequired
(
p
,
iObj
);
Required
[
0
]
=
Nf_ObjRequired
(
p
,
iObj
,
0
);
Required
[
0
]
=
Nf_ObjRequired
(
p
,
iObj
,
0
);
Required
[
1
]
=
Nf_ObjRequired
(
p
,
iObj
,
1
);
Required
[
1
]
=
Nf_ObjRequired
(
p
,
iObj
,
1
);
}
}
if
(
p
->
fUseEla
&&
Nf_ObjMapRefNum
(
p
,
iObj
,
0
)
>
0
)
//
if ( p->fUseEla && Nf_ObjMapRefNum(p, iObj, 0) > 0 )
ValueBeg
[
0
]
=
Nf_MatchDeref2_rec
(
p
,
iObj
,
0
,
Nf_ObjMatchBest
(
p
,
iObj
,
0
)
);
//
ValueBeg[0] = Nf_MatchDeref2_rec( p, iObj, 0, Nf_ObjMatchBest(p, iObj, 0) );
if
(
p
->
fUseEla
&&
Nf_ObjMapRefNum
(
p
,
iObj
,
1
)
>
0
)
//
if ( p->fUseEla && Nf_ObjMapRefNum(p, iObj, 1) > 0 )
ValueBeg
[
1
]
=
Nf_MatchDeref2_rec
(
p
,
iObj
,
1
,
Nf_ObjMatchBest
(
p
,
iObj
,
1
)
);
//
ValueBeg[1] = Nf_MatchDeref2_rec( p, iObj, 1, Nf_ObjMatchBest(p, iObj, 1) );
memset
(
pBest
,
0
,
sizeof
(
Nf_Obj_t
)
);
memset
(
pBest
,
0
,
sizeof
(
Nf_Obj_t
)
);
pDp
->
D
=
pDp
->
A
=
NF_INFINITY
;
pDp
->
D
=
pDp
->
A
=
NF_INFINITY
;
pDn
->
D
=
pDn
->
A
=
NF_INFINITY
;
pDn
->
D
=
pDn
->
A
=
NF_INFINITY
;
...
@@ -1360,7 +1361,7 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
...
@@ -1360,7 +1361,7 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
/*
/*
if ( 461 == iObj && p->Iter == 0 )
if ( 461 == iObj && p->Iter == 0 )
{
{
printf( "\nObj %6d (%.2f %.2f):\n", iObj,
Required[0], Required[1]
);
printf( "\nObj %6d (%.2f %.2f):\n", iObj,
Nf_Wrd2Flt(Required[0]), Nf_Wrd2Flt(Required[1])
);
Nf_ManCutMatchPrint( p, iObj, "Dp", &pBest->M[0][0] );
Nf_ManCutMatchPrint( p, iObj, "Dp", &pBest->M[0][0] );
Nf_ManCutMatchPrint( p, iObj, "Dn", &pBest->M[1][0] );
Nf_ManCutMatchPrint( p, iObj, "Dn", &pBest->M[1][0] );
Nf_ManCutMatchPrint( p, iObj, "Ap", &pBest->M[0][1] );
Nf_ManCutMatchPrint( p, iObj, "Ap", &pBest->M[0][1] );
...
@@ -1369,14 +1370,14 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
...
@@ -1369,14 +1370,14 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
}
}
*/
*/
// divide by ref count
// divide by ref count
pDp
->
A
/=
FlowRefP
;
pDp
->
A
=
pDp
->
A
*
MIO_NUM
/
FlowRefP
;
pAp
->
A
/=
FlowRefP
;
pAp
->
A
=
pAp
->
A
*
MIO_NUM
/
FlowRefP
;
pDn
->
A
/=
FlowRefN
;
pDn
->
A
=
pDn
->
A
*
MIO_NUM
/
FlowRefN
;
pAn
->
A
/=
FlowRefN
;
pAn
->
A
=
pAn
->
A
*
MIO_NUM
/
FlowRefN
;
// add the inverters
// add the inverters
//assert( pDp->D < NF_INFINITY || pDn->D < NF_INFINITY );
//assert( pDp->D < NF_INFINITY || pDn->D < NF_INFINITY );
if
(
pDp
->
D
>
pDn
->
D
+
p
->
InvDelay
+
Epsilon
)
if
(
pDp
->
D
>
pDn
->
D
+
p
->
InvDelay
)
{
{
*
pDp
=
*
pDn
;
*
pDp
=
*
pDn
;
pDp
->
D
+=
p
->
InvDelay
;
pDp
->
D
+=
p
->
InvDelay
;
...
@@ -1386,7 +1387,7 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
...
@@ -1386,7 +1387,7 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
*
pAp
=
*
pDp
;
*
pAp
=
*
pDp
;
//printf( "Using inverter to improve delay at node %d in phase %d.\n", iObj, 1 );
//printf( "Using inverter to improve delay at node %d in phase %d.\n", iObj, 1 );
}
}
else
if
(
pDn
->
D
>
pDp
->
D
+
p
->
InvDelay
+
Epsilon
)
else
if
(
pDn
->
D
>
pDp
->
D
+
p
->
InvDelay
)
{
{
*
pDn
=
*
pDp
;
*
pDn
=
*
pDp
;
pDn
->
D
+=
p
->
InvDelay
;
pDn
->
D
+=
p
->
InvDelay
;
...
@@ -1398,7 +1399,7 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
...
@@ -1398,7 +1399,7 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
}
}
//assert( pAp->A < NF_INFINITY || pAn->A < NF_INFINITY );
//assert( pAp->A < NF_INFINITY || pAn->A < NF_INFINITY );
// try replacing pos with neg
// try replacing pos with neg
if
(
pAp
->
D
==
NF_INFINITY
||
(
pAp
->
A
>
pAn
->
A
+
p
->
InvArea
+
Epsilon
&&
pAn
->
D
+
p
->
InvDelay
+
Epsilon
<
Required
[
1
])
)
if
(
pAp
->
D
==
NF_INFINITY
||
(
pAp
->
A
>
pAn
->
A
+
p
->
InvArea
&&
pAn
->
D
+
p
->
InvDelay
<=
Required
[
0
])
)
{
{
assert
(
p
->
Iter
>
0
);
assert
(
p
->
Iter
>
0
);
*
pAp
=
*
pAn
;
*
pAp
=
*
pAn
;
...
@@ -1410,7 +1411,7 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
...
@@ -1410,7 +1411,7 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
//printf( "Using inverter to improve area at node %d in phase %d.\n", iObj, 1 );
//printf( "Using inverter to improve area at node %d in phase %d.\n", iObj, 1 );
}
}
// try replacing neg with pos
// try replacing neg with pos
else
if
(
pAn
->
D
==
NF_INFINITY
||
(
pAn
->
A
>
pAp
->
A
+
p
->
InvArea
+
Epsilon
&&
pAp
->
D
+
p
->
InvDelay
+
Epsilon
<
Required
[
0
])
)
else
if
(
pAn
->
D
==
NF_INFINITY
||
(
pAn
->
A
>
pAp
->
A
+
p
->
InvArea
&&
pAp
->
D
+
p
->
InvDelay
<=
Required
[
1
])
)
{
{
assert
(
p
->
Iter
>
0
);
assert
(
p
->
Iter
>
0
);
*
pAn
=
*
pAp
;
*
pAn
=
*
pAp
;
...
@@ -1431,10 +1432,10 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
...
@@ -1431,10 +1432,10 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
if
(
pAn
->
D
==
NF_INFINITY
)
if
(
pAn
->
D
==
NF_INFINITY
)
printf
(
"Object %d has pAn unassigned.
\n
"
,
iObj
);
printf
(
"Object %d has pAn unassigned.
\n
"
,
iObj
);
pDp
->
A
=
Abc_Min
Float
(
pDp
->
A
,
NF_INFINITY
/
1000000
);
pDp
->
A
=
Abc_Min
Word
(
pDp
->
A
,
NF_INFINITY
/
MIO_NUM
);
pDn
->
A
=
Abc_Min
Float
(
pDn
->
A
,
NF_INFINITY
/
1000000
);
pDn
->
A
=
Abc_Min
Word
(
pDn
->
A
,
NF_INFINITY
/
MIO_NUM
);
pAp
->
A
=
Abc_Min
Float
(
pAp
->
A
,
NF_INFINITY
/
1000000
);
pAp
->
A
=
Abc_Min
Word
(
pAp
->
A
,
NF_INFINITY
/
MIO_NUM
);
pAn
->
A
=
Abc_Min
Float
(
pAn
->
A
,
NF_INFINITY
/
1000000
);
pAn
->
A
=
Abc_Min
Word
(
pAn
->
A
,
NF_INFINITY
/
MIO_NUM
);
assert
(
pDp
->
D
<
NF_INFINITY
);
assert
(
pDp
->
D
<
NF_INFINITY
);
assert
(
pDn
->
D
<
NF_INFINITY
);
assert
(
pDn
->
D
<
NF_INFINITY
);
...
@@ -1445,16 +1446,16 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
...
@@ -1445,16 +1446,16 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
assert
(
pDn
->
A
<
NF_INFINITY
);
assert
(
pDn
->
A
<
NF_INFINITY
);
assert
(
pAp
->
A
<
NF_INFINITY
);
assert
(
pAp
->
A
<
NF_INFINITY
);
assert
(
pAn
->
A
<
NF_INFINITY
);
assert
(
pAn
->
A
<
NF_INFINITY
);
/*
if ( p->fUseEla )
if ( p->fUseEla )
{
{
// set the first good cut
// set the first good cut
Index
=
(
pAp
->
D
!=
NF_INFINITY
&&
pAp
->
D
<
Nf_ObjRequired
(
p
,
iObj
,
0
)
+
Epsilon
);
Index = (pAp->D != NF_INFINITY && pAp->D < Nf_ObjRequired(p, iObj, 0));
assert( !pDp->fBest && !pAp->fBest );
assert( !pDp->fBest && !pAp->fBest );
pBest->M[0][Index].fBest = 1;
pBest->M[0][Index].fBest = 1;
assert( pDp->fBest != pAp->fBest );
assert( pDp->fBest != pAp->fBest );
// set the second good cut
// set the second good cut
Index
=
(
pAn
->
D
!=
NF_INFINITY
&&
pAn
->
D
<
Nf_ObjRequired
(
p
,
iObj
,
1
)
+
Epsilon
);
Index = (pAn->D != NF_INFINITY && pAn->D < Nf_ObjRequired(p, iObj, 1));
assert( !pDn->fBest && !pAn->fBest );
assert( !pDn->fBest && !pAn->fBest );
pBest->M[1][Index].fBest = 1;
pBest->M[1][Index].fBest = 1;
assert( pDn->fBest != pAn->fBest );
assert( pDn->fBest != pAn->fBest );
...
@@ -1463,22 +1464,23 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
...
@@ -1463,22 +1464,23 @@ void Nf_ManCutMatch( Nf_Man_t * p, int iObj )
ValueEnd[0] = Nf_MatchRef2_rec( p, iObj, 0, Nf_ObjMatchBest(p, iObj, 0), NULL );
ValueEnd[0] = Nf_MatchRef2_rec( p, iObj, 0, Nf_ObjMatchBest(p, iObj, 0), NULL );
if ( Nf_ObjMapRefNum(p, iObj, 1) > 0 )
if ( Nf_ObjMapRefNum(p, iObj, 1) > 0 )
ValueEnd[1] = Nf_MatchRef2_rec( p, iObj, 1, Nf_ObjMatchBest(p, iObj, 1), NULL );
ValueEnd[1] = Nf_MatchRef2_rec( p, iObj, 1, Nf_ObjMatchBest(p, iObj, 1), NULL );
// assert( ValueBeg[0] > ValueEnd[0]
- Epsilon
);
// assert( ValueBeg[0] > ValueEnd[0] );
// assert( ValueBeg[1] > ValueEnd[1]
- Epsilon
);
// assert( ValueBeg[1] > ValueEnd[1] );
}
}
*/
/*
/*
if ( p->Iter && (pDp->D > Required[0] + 1 || pDn->D > Required[1] + 1) )
if ( p->Iter && (pDp->D > Required[0] + 1 || pDn->D > Required[1] + 1) )
{
{
printf( "%5d : ", iObj );
printf( "%5d : ", iObj );
printf( "Dp = %6.2f ",
pDp->D
);
printf( "Dp = %6.2f ",
Nf_Wrd2Flt(pDp->D)
);
printf( "Dn = %6.2f ",
pDn->D
);
printf( "Dn = %6.2f ",
Nf_Wrd2Flt(pDn->D)
);
printf( " " );
printf( " " );
printf( "Ap = %6.2f ",
pAp->D
);
printf( "Ap = %6.2f ",
Nf_Wrd2Flt(pAp->D)
);
printf( "An = %6.2f ",
pAn->D
);
printf( "An = %6.2f ",
Nf_Wrd2Flt(pAn->D)
);
printf( " " );
printf( " " );
printf( "Rp = %6.2f ",
Required[0]
);
printf( "Rp = %6.2f ",
Nf_Wrd2Flt(Required[0])
);
printf( "Rn = %6.2f ",
Required[1]
);
printf( "Rn = %6.2f ",
Nf_Wrd2Flt(Required[1])
);
printf( "\n" );
printf( "\n" );
}
}
*/
*/
...
@@ -1505,10 +1507,10 @@ void Nf_ManComputeMapping( Nf_Man_t * p )
...
@@ -1505,10 +1507,10 @@ void Nf_ManComputeMapping( Nf_Man_t * p )
SeeAlso []
SeeAlso []
***********************************************************************/
***********************************************************************/
void
Nf_ManSetMapRefsGate
(
Nf_Man_t
*
p
,
int
iObj
,
float
Required
,
Nf_Mat_t
*
pM
)
void
Nf_ManSetMapRefsGate
(
Nf_Man_t
*
p
,
int
iObj
,
word
Required
,
Nf_Mat_t
*
pM
)
{
{
int
k
,
iVar
,
fCompl
;
int
k
,
iVar
,
fCompl
;
Mio_Cell_t
*
pCell
=
Nf_ManCell
(
p
,
pM
->
Gate
);
Mio_Cell
2
_t
*
pCell
=
Nf_ManCell
(
p
,
pM
->
Gate
);
int
*
pCut
=
Nf_CutFromHandle
(
Nf_ObjCutSet
(
p
,
iObj
),
pM
->
CutH
);
int
*
pCut
=
Nf_CutFromHandle
(
Nf_ObjCutSet
(
p
,
iObj
),
pM
->
CutH
);
Nf_CutForEachVar
(
pCut
,
pM
->
Conf
,
iVar
,
fCompl
,
k
)
Nf_CutForEachVar
(
pCut
,
pM
->
Conf
,
iVar
,
fCompl
,
k
)
{
{
...
@@ -1517,7 +1519,7 @@ void Nf_ManSetMapRefsGate( Nf_Man_t * p, int iObj, float Required, Nf_Mat_t * pM
...
@@ -1517,7 +1519,7 @@ void Nf_ManSetMapRefsGate( Nf_Man_t * p, int iObj, float Required, Nf_Mat_t * pM
}
}
assert
(
Nf_CutSize
(
pCut
)
==
(
int
)
pCell
->
nFanins
);
assert
(
Nf_CutSize
(
pCut
)
==
(
int
)
pCell
->
nFanins
);
// update global stats
// update global stats
p
->
pPars
->
MapArea
+=
pCell
->
Area
;
p
->
pPars
->
Word
MapArea
+=
pCell
->
Area
;
p
->
pPars
->
Edge
+=
Nf_CutSize
(
pCut
);
p
->
pPars
->
Edge
+=
Nf_CutSize
(
pCut
);
p
->
pPars
->
Area
++
;
p
->
pPars
->
Area
++
;
// update status of the gate
// update status of the gate
...
@@ -1531,13 +1533,13 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
...
@@ -1531,13 +1533,13 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
float
Coef
=
1
.
0
/
(
1
.
0
+
(
p
->
Iter
+
1
)
*
(
p
->
Iter
+
1
));
float
Coef
=
1
.
0
/
(
1
.
0
+
(
p
->
Iter
+
1
)
*
(
p
->
Iter
+
1
));
float
*
pFlowRefs
=
Vec_FltArray
(
&
p
->
vFlowRefs
);
float
*
pFlowRefs
=
Vec_FltArray
(
&
p
->
vFlowRefs
);
int
*
pMapRefs
=
Vec_IntArray
(
&
p
->
vMapRefs
);
int
*
pMapRefs
=
Vec_IntArray
(
&
p
->
vMapRefs
);
float
Epsilon
=
p
->
pPars
->
Epsilon
;
//
float Epsilon = p->pPars->Epsilon;
int
nLits
=
2
*
Gia_ManObjNum
(
p
->
pGia
);
int
nLits
=
2
*
Gia_ManObjNum
(
p
->
pGia
);
int
i
,
c
,
Id
,
nRefs
[
2
];
int
i
,
c
,
Id
,
nRefs
[
2
];
Nf_Mat_t
*
pD
,
*
pA
,
*
pM
;
Nf_Mat_t
*
pD
,
*
pA
,
*
pM
;
Nf_Mat_t
*
pDs
[
2
],
*
pAs
[
2
],
*
pMs
[
2
];
Nf_Mat_t
*
pDs
[
2
],
*
pAs
[
2
],
*
pMs
[
2
];
Gia_Obj_t
*
pObj
;
Gia_Obj_t
*
pObj
;
float
Required
=
0
,
Requireds
[
2
];
word
Required
=
0
,
Requireds
[
2
];
/*
/*
if ( p->Iter == 0 )
if ( p->Iter == 0 )
...
@@ -1549,11 +1551,11 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
...
@@ -1549,11 +1551,11 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
Nf_Mat_t * pAn = Nf_ObjMatchA( p, i, 1 );
Nf_Mat_t * pAn = Nf_ObjMatchA( p, i, 1 );
printf( "%5d : ", i );
printf( "%5d : ", i );
printf( "Dp = %6.2f ", pDp->D );
printf( "Dp = %6.2f ",
Nf_Wrd2Flt(
pDp->D );
printf( "Dn = %6.2f ", pDn->D );
printf( "Dn = %6.2f ",
Nf_Wrd2Flt(
pDn->D );
printf( " " );
printf( " " );
printf( "Ap = %6.2f ", pAp->D );
printf( "Ap = %6.2f ",
Nf_Wrd2Flt(
pAp->D );
printf( "An = %6.2f ", pAn->D );
printf( "An = %6.2f ",
Nf_Wrd2Flt(
pAn->D );
printf( " " );
printf( " " );
printf( "Dp = %8s ", Nf_ManCell(p, pDp->Gate)->pName );
printf( "Dp = %8s ", Nf_ManCell(p, pDp->Gate)->pName );
printf( "Dn = %8s ", Nf_ManCell(p, pDn->Gate)->pName );
printf( "Dn = %8s ", Nf_ManCell(p, pDn->Gate)->pName );
...
@@ -1566,34 +1568,35 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
...
@@ -1566,34 +1568,35 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
// check references
// check references
assert
(
!
p
->
fUseEla
);
assert
(
!
p
->
fUseEla
);
memset
(
pMapRefs
,
0
,
sizeof
(
int
)
*
nLits
);
memset
(
pMapRefs
,
0
,
sizeof
(
int
)
*
nLits
);
Vec_
Flt
Fill
(
&
p
->
vRequired
,
nLits
,
NF_INFINITY
);
Vec_
Wrd
Fill
(
&
p
->
vRequired
,
nLits
,
NF_INFINITY
);
// for ( i = 0; i < Gia_ManObjNum(p->pGia); i++ )
// for ( i = 0; i < Gia_ManObjNum(p->pGia); i++ )
// assert( !Nf_ObjMapRefNum(p, i, 0) && !Nf_ObjMapRefNum(p, i, 1) );
// assert( !Nf_ObjMapRefNum(p, i, 0) && !Nf_ObjMapRefNum(p, i, 1) );
// compute delay
// compute delay
p
->
pPars
->
MapDelay
=
0
;
p
->
pPars
->
Word
MapDelay
=
0
;
Gia_ManForEachCo
(
p
->
pGia
,
pObj
,
i
)
Gia_ManForEachCo
(
p
->
pGia
,
pObj
,
i
)
{
{
Required
=
Nf_ObjMatchD
(
p
,
Gia_ObjFaninId0p
(
p
->
pGia
,
pObj
),
Gia_ObjFaninC0
(
pObj
)
)
->
D
;
Required
=
Nf_ObjMatchD
(
p
,
Gia_ObjFaninId0p
(
p
->
pGia
,
pObj
),
Gia_ObjFaninC0
(
pObj
)
)
->
D
;
p
->
pPars
->
MapDelay
=
Abc_MaxFloat
(
p
->
pPars
->
MapDelay
,
Required
);
p
->
pPars
->
WordMapDelay
=
Abc_MaxWord
(
p
->
pPars
->
Word
MapDelay
,
Required
);
}
}
// check delay target
// check delay target
if
(
p
->
pPars
->
MapDelayTarget
==
-
1
&&
p
->
pPars
->
nRelaxRatio
)
if
(
p
->
pPars
->
WordMapDelayTarget
>
0
&&
p
->
pPars
->
nRelaxRatio
)
p
->
pPars
->
MapDelayTarget
=
(
int
)((
float
)
p
->
pPars
->
MapDelay
*
(
100
.
0
+
p
->
pPars
->
nRelaxRatio
)
/
100
.
0
)
;
p
->
pPars
->
WordMapDelayTarget
=
p
->
pPars
->
WordMapDelay
*
(
100
+
p
->
pPars
->
nRelaxRatio
)
/
100
;
if
(
p
->
pPars
->
MapDelayTarget
!=
-
1
)
if
(
p
->
pPars
->
WordMapDelayTarget
>
0
)
{
{
if
(
p
->
pPars
->
MapDelay
<
p
->
pPars
->
MapDelayTarget
+
Epsilon
)
if
(
p
->
pPars
->
WordMapDelay
<
p
->
pPars
->
WordMapDelayTarget
)
p
->
pPars
->
MapDelay
=
p
->
pPars
->
MapDelayTarget
;
p
->
pPars
->
WordMapDelay
=
p
->
pPars
->
Word
MapDelayTarget
;
else
if
(
p
->
pPars
->
nRelaxRatio
==
0
)
else
if
(
p
->
pPars
->
nRelaxRatio
==
0
)
Abc_Print
(
0
,
"Relaxing user-specified delay target from %.2f to %.2f.
\n
"
,
p
->
pPars
->
MapDelayTarget
,
p
->
pPars
->
MapDelay
);
Abc_Print
(
0
,
"Relaxing user-specified delay target from %.2f to %.2f.
\n
"
,
Nf_Wrd2Flt
(
p
->
pPars
->
WordMapDelayTarget
),
Nf_Wrd2Flt
(
p
->
pPars
->
WordMapDelay
)
);
}
}
assert
(
p
->
pPars
->
WordMapDelayTarget
==
0
);
// set required times
// set required times
Gia_ManForEachCo
(
p
->
pGia
,
pObj
,
i
)
Gia_ManForEachCo
(
p
->
pGia
,
pObj
,
i
)
{
{
Required
=
Nf_ObjMatchD
(
p
,
Gia_ObjFaninId0p
(
p
->
pGia
,
pObj
),
Gia_ObjFaninC0
(
pObj
)
)
->
D
;
Required
=
Nf_ObjMatchD
(
p
,
Gia_ObjFaninId0p
(
p
->
pGia
,
pObj
),
Gia_ObjFaninC0
(
pObj
)
)
->
D
;
Required
=
p
->
pPars
->
fDoAverage
?
Required
*
(
100
.
0
+
p
->
pPars
->
nRelaxRatio
)
/
100
.
0
:
p
->
pPars
->
MapDelay
;
Required
=
p
->
pPars
->
fDoAverage
?
Required
*
(
100
+
p
->
pPars
->
nRelaxRatio
)
/
100
:
p
->
pPars
->
Word
MapDelay
;
// if external required time can be achieved, use it
// if external required time can be achieved, use it
if
(
p
->
pGia
->
vOutReqs
&&
Vec_FltEntry
(
p
->
pGia
->
vOutReqs
,
i
)
>
0
&&
Required
+
Epsilon
<=
Vec_FltEntry
(
p
->
pGia
->
vOutReqs
,
i
)
)
if
(
p
->
pGia
->
vOutReqs
&&
Vec_FltEntry
(
p
->
pGia
->
vOutReqs
,
i
)
>
0
&&
Required
<=
(
word
)(
MIO_NUM
*
Vec_FltEntry
(
p
->
pGia
->
vOutReqs
,
i
)
)
)
Required
=
Vec_FltEntry
(
p
->
pGia
->
vOutReqs
,
i
);
Required
=
(
word
)(
MIO_NUM
*
Vec_FltEntry
(
p
->
pGia
->
vOutReqs
,
i
)
);
// if external required cannot be achieved, set the earliest possible arrival time
// if external required cannot be achieved, set the earliest possible arrival time
// else if ( p->pGia->vOutReqs && Vec_FltEntry(p->pGia->vOutReqs, i) > 0 && Required > Vec_FltEntry(p->pGia->vOutReqs, i) )
// else if ( p->pGia->vOutReqs && Vec_FltEntry(p->pGia->vOutReqs, i) > 0 && Required > Vec_FltEntry(p->pGia->vOutReqs, i) )
// ptTime->Rise = ptTime->Fall = ptTime->Worst = Required;
// ptTime->Rise = ptTime->Fall = ptTime->Worst = Required;
...
@@ -1603,7 +1606,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
...
@@ -1603,7 +1606,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
}
}
// compute area and edges
// compute area and edges
p
->
nInvs
=
0
;
p
->
nInvs
=
0
;
p
->
pPars
->
MapArea
=
0
;
p
->
pPars
->
Word
MapArea
=
0
;
p
->
pPars
->
Area
=
p
->
pPars
->
Edge
=
0
;
p
->
pPars
->
Area
=
p
->
pPars
->
Edge
=
0
;
Gia_ManForEachAndReverse
(
p
->
pGia
,
pObj
,
i
)
Gia_ManForEachAndReverse
(
p
->
pGia
,
pObj
,
i
)
{
{
...
@@ -1613,7 +1616,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
...
@@ -1613,7 +1616,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
{
{
Nf_ObjMapRefInc
(
p
,
i
,
0
);
Nf_ObjMapRefInc
(
p
,
i
,
0
);
Nf_ObjUpdateRequired
(
p
,
i
,
0
,
Nf_ObjRequired
(
p
,
i
,
1
)
-
p
->
InvDelay
);
Nf_ObjUpdateRequired
(
p
,
i
,
0
,
Nf_ObjRequired
(
p
,
i
,
1
)
-
p
->
InvDelay
);
p
->
pPars
->
MapArea
+=
p
->
InvArea
;
p
->
pPars
->
Word
MapArea
+=
p
->
InvArea
;
p
->
pPars
->
Edge
++
;
p
->
pPars
->
Edge
++
;
p
->
pPars
->
Area
++
;
p
->
pPars
->
Area
++
;
p
->
nInvs
++
;
p
->
nInvs
++
;
...
@@ -1638,7 +1641,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
...
@@ -1638,7 +1641,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
//assert( Requireds[c] < NF_INFINITY );
//assert( Requireds[c] < NF_INFINITY );
pDs
[
c
]
=
Nf_ObjMatchD
(
p
,
i
,
c
);
pDs
[
c
]
=
Nf_ObjMatchD
(
p
,
i
,
c
);
pAs
[
c
]
=
Nf_ObjMatchA
(
p
,
i
,
c
);
pAs
[
c
]
=
Nf_ObjMatchA
(
p
,
i
,
c
);
pMs
[
c
]
=
(
pAs
[
c
]
->
D
<
Requireds
[
c
]
+
Epsilon
)
?
pAs
[
c
]
:
pDs
[
c
];
pMs
[
c
]
=
(
pAs
[
c
]
->
D
<
=
Requireds
[
c
]
)
?
pAs
[
c
]
:
pDs
[
c
];
}
}
// swap complemented matches
// swap complemented matches
if
(
pMs
[
0
]
->
fCompl
&&
pMs
[
1
]
->
fCompl
)
if
(
pMs
[
0
]
->
fCompl
&&
pMs
[
1
]
->
fCompl
)
...
@@ -1675,11 +1678,11 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
...
@@ -1675,11 +1678,11 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
//assert( Required < NF_INFINITY );
//assert( Required < NF_INFINITY );
pD
=
Nf_ObjMatchD
(
p
,
i
,
!
c
);
pD
=
Nf_ObjMatchD
(
p
,
i
,
!
c
);
pA
=
Nf_ObjMatchA
(
p
,
i
,
!
c
);
pA
=
Nf_ObjMatchA
(
p
,
i
,
!
c
);
pM
=
(
pA
->
D
<
Required
+
Epsilon
)
?
pA
:
pD
;
pM
=
(
pA
->
D
<
=
Required
)
?
pA
:
pD
;
assert
(
!
pM
->
fCompl
);
assert
(
!
pM
->
fCompl
);
// account for the inverter
// account for the inverter
p
->
pPars
->
MapArea
+=
p
->
InvArea
;
p
->
pPars
->
Word
MapArea
+=
p
->
InvArea
;
p
->
pPars
->
Edge
++
;
p
->
pPars
->
Edge
++
;
p
->
pPars
->
Area
++
;
p
->
pPars
->
Area
++
;
p
->
nInvs
++
;
p
->
nInvs
++
;
...
@@ -1697,7 +1700,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
...
@@ -1697,7 +1700,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
//assert( Required < NF_INFINITY );
//assert( Required < NF_INFINITY );
pD
=
Nf_ObjMatchD
(
p
,
i
,
c
);
pD
=
Nf_ObjMatchD
(
p
,
i
,
c
);
pA
=
Nf_ObjMatchA
(
p
,
i
,
c
);
pA
=
Nf_ObjMatchA
(
p
,
i
,
c
);
pM
=
(
pA
->
D
<
Required
+
Epsilon
)
?
pA
:
pD
;
pM
=
(
pA
->
D
<
=
Required
)
?
pA
:
pD
;
if
(
pM
->
fCompl
)
// use inverter
if
(
pM
->
fCompl
)
// use inverter
{
{
...
@@ -1712,11 +1715,11 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
...
@@ -1712,11 +1715,11 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
//assert( Required < NF_INFINITY );
//assert( Required < NF_INFINITY );
pD
=
Nf_ObjMatchD
(
p
,
i
,
!
c
);
pD
=
Nf_ObjMatchD
(
p
,
i
,
!
c
);
pA
=
Nf_ObjMatchA
(
p
,
i
,
!
c
);
pA
=
Nf_ObjMatchA
(
p
,
i
,
!
c
);
pM
=
(
pA
->
D
<
Required
+
Epsilon
)
?
pA
:
pD
;
pM
=
(
pA
->
D
<
=
Required
)
?
pA
:
pD
;
assert
(
!
pM
->
fCompl
);
assert
(
!
pM
->
fCompl
);
// account for the inverter
// account for the inverter
p
->
pPars
->
MapArea
+=
p
->
InvArea
;
p
->
pPars
->
Word
MapArea
+=
p
->
InvArea
;
p
->
pPars
->
Edge
++
;
p
->
pPars
->
Edge
++
;
p
->
pPars
->
Area
++
;
p
->
pPars
->
Area
++
;
}
}
...
@@ -1736,7 +1739,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
...
@@ -1736,7 +1739,7 @@ int Nf_ManSetMapRefs( Nf_Man_t * p )
{
{
Nf_ObjMapRefInc
(
p
,
Id
,
0
);
Nf_ObjMapRefInc
(
p
,
Id
,
0
);
Nf_ObjUpdateRequired
(
p
,
Id
,
0
,
Required
-
p
->
InvDelay
);
Nf_ObjUpdateRequired
(
p
,
Id
,
0
,
Required
-
p
->
InvDelay
);
p
->
pPars
->
MapArea
+=
p
->
InvArea
;
p
->
pPars
->
Word
MapArea
+=
p
->
InvArea
;
p
->
pPars
->
Edge
++
;
p
->
pPars
->
Edge
++
;
p
->
pPars
->
Area
++
;
p
->
pPars
->
Area
++
;
p
->
nInvs
++
;
p
->
nInvs
++
;
...
@@ -1798,15 +1801,15 @@ void Nf_ManUpdateStats( Nf_Man_t * p )
...
@@ -1798,15 +1801,15 @@ void Nf_ManUpdateStats( Nf_Man_t * p )
{
{
Nf_Mat_t
*
pM
;
Nf_Mat_t
*
pM
;
Gia_Obj_t
*
pObj
;
Gia_Obj_t
*
pObj
;
Mio_Cell_t
*
pCell
;
Mio_Cell
2
_t
*
pCell
;
int
i
,
c
,
Id
,
*
pCut
;
int
i
,
c
,
Id
,
*
pCut
;
p
->
pPars
->
MapDelay
=
0
;
p
->
pPars
->
Word
MapDelay
=
0
;
Gia_ManForEachCo
(
p
->
pGia
,
pObj
,
i
)
Gia_ManForEachCo
(
p
->
pGia
,
pObj
,
i
)
{
{
float
Delay
=
Nf_ObjMatchD
(
p
,
Gia_ObjFaninId0p
(
p
->
pGia
,
pObj
),
Gia_ObjFaninC0
(
pObj
)
)
->
D
;
word
Delay
=
Nf_ObjMatchD
(
p
,
Gia_ObjFaninId0p
(
p
->
pGia
,
pObj
),
Gia_ObjFaninC0
(
pObj
)
)
->
D
;
p
->
pPars
->
MapDelay
=
Abc_MaxFloat
(
p
->
pPars
->
MapDelay
,
Delay
);
p
->
pPars
->
WordMapDelay
=
Abc_MaxWord
(
p
->
pPars
->
Word
MapDelay
,
Delay
);
}
}
p
->
pPars
->
MapArea
=
0
;
p
->
pPars
->
Word
MapArea
=
0
;
p
->
pPars
->
Area
=
p
->
pPars
->
Edge
=
0
;
p
->
pPars
->
Area
=
p
->
pPars
->
Edge
=
0
;
Gia_ManForEachAndId
(
p
->
pGia
,
i
)
Gia_ManForEachAndId
(
p
->
pGia
,
i
)
for
(
c
=
0
;
c
<
2
;
c
++
)
for
(
c
=
0
;
c
<
2
;
c
++
)
...
@@ -1816,14 +1819,14 @@ void Nf_ManUpdateStats( Nf_Man_t * p )
...
@@ -1816,14 +1819,14 @@ void Nf_ManUpdateStats( Nf_Man_t * p )
pCut
=
Nf_CutFromHandle
(
Nf_ObjCutSet
(
p
,
i
),
pM
->
CutH
);
pCut
=
Nf_CutFromHandle
(
Nf_ObjCutSet
(
p
,
i
),
pM
->
CutH
);
pCell
=
Nf_ManCell
(
p
,
pM
->
Gate
);
pCell
=
Nf_ManCell
(
p
,
pM
->
Gate
);
assert
(
Nf_CutSize
(
pCut
)
==
(
int
)
pCell
->
nFanins
);
assert
(
Nf_CutSize
(
pCut
)
==
(
int
)
pCell
->
nFanins
);
p
->
pPars
->
MapArea
+=
pCell
->
Area
;
p
->
pPars
->
Word
MapArea
+=
pCell
->
Area
;
p
->
pPars
->
Edge
+=
Nf_CutSize
(
pCut
);
p
->
pPars
->
Edge
+=
Nf_CutSize
(
pCut
);
p
->
pPars
->
Area
++
;
p
->
pPars
->
Area
++
;
}
}
Gia_ManForEachCiId
(
p
->
pGia
,
Id
,
i
)
Gia_ManForEachCiId
(
p
->
pGia
,
Id
,
i
)
if
(
Nf_ObjMapRefNum
(
p
,
Id
,
1
)
)
if
(
Nf_ObjMapRefNum
(
p
,
Id
,
1
)
)
{
{
p
->
pPars
->
MapArea
+=
p
->
InvArea
;
p
->
pPars
->
Word
MapArea
+=
p
->
InvArea
;
p
->
pPars
->
Edge
++
;
p
->
pPars
->
Edge
++
;
p
->
pPars
->
Area
++
;
p
->
pPars
->
Area
++
;
}
}
...
@@ -1865,7 +1868,7 @@ void Nf_ManSetDefaultPars( Jf_Par_t * pPars )
...
@@ -1865,7 +1868,7 @@ void Nf_ManSetDefaultPars( Jf_Par_t * pPars )
pPars
->
fVeryVerbose
=
0
;
pPars
->
fVeryVerbose
=
0
;
pPars
->
nLutSizeMax
=
NF_LEAF_MAX
;
pPars
->
nLutSizeMax
=
NF_LEAF_MAX
;
pPars
->
nCutNumMax
=
NF_CUT_MAX
;
pPars
->
nCutNumMax
=
NF_CUT_MAX
;
pPars
->
MapDelayTarget
=
-
1
;
pPars
->
WordMapDelayTarget
=
0
;
//pPars->Epsilon = (float)0.01;
//pPars->Epsilon = (float)0.01;
pPars
->
Epsilon
=
(
float
)
0
.
00
94636
;
pPars
->
Epsilon
=
(
float
)
0
.
00
94636
;
// It was found that the value of Epsilon should be "non-trivial" for the mapper to work correctly.
// It was found that the value of Epsilon should be "non-trivial" for the mapper to work correctly.
...
...
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