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
f030a2a5
Commit
f030a2a5
authored
Apr 29, 2020
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Adding new API to MiniAIG.
parent
cf1fdc82
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
210 additions
and
0 deletions
+210
-0
src/aig/gia/giaTruth.c
+152
-0
src/aig/miniaig/miniaig.h
+58
-0
No files found.
src/aig/gia/giaTruth.c
View file @
f030a2a5
...
...
@@ -83,7 +83,159 @@ word Gia_LutComputeTruth6Simple( Gia_Man_t * p, int iPo )
Gia_Obj_t
*
pObj
=
Gia_ManPo
(
p
,
iPo
);
word
Truth
=
Gia_LutComputeTruth6Simple_rec
(
p
,
Gia_ObjFaninId0p
(
p
,
pObj
)
);
return
Gia_ObjFaninC0
(
pObj
)
?
~
Truth
:
Truth
;
}
word
Gia_LutComputeTruth6Map_rec
(
Gia_Man_t
*
p
,
int
iObj
,
Vec_Int_t
*
vMap
)
{
word
Truth0
,
Truth1
,
Truth
;
Gia_Obj_t
*
pObj
=
Gia_ManObj
(
p
,
iObj
);
if
(
Gia_ObjIsConst0
(
pObj
)
)
return
0
;
if
(
Gia_ObjIsCi
(
pObj
)
)
return
s_Truths6
[
Vec_IntEntry
(
vMap
,
Gia_ObjCioId
(
pObj
))];
Truth0
=
Gia_LutComputeTruth6Map_rec
(
p
,
Gia_ObjFaninId0
(
pObj
,
iObj
),
vMap
);
Truth1
=
Gia_LutComputeTruth6Map_rec
(
p
,
Gia_ObjFaninId1
(
pObj
,
iObj
),
vMap
);
Truth0
=
Gia_ObjFaninC0
(
pObj
)
?
~
Truth0
:
Truth0
;
Truth1
=
Gia_ObjFaninC1
(
pObj
)
?
~
Truth1
:
Truth1
;
Truth
=
Gia_ObjIsXor
(
pObj
)
?
Truth0
^
Truth1
:
Truth0
&
Truth1
;
return
Truth
;
}
word
Gia_LutComputeTruth6Map
(
Gia_Man_t
*
p
,
int
iPo
,
Vec_Int_t
*
vMap
)
{
Gia_Obj_t
*
pObj
=
Gia_ManPo
(
p
,
iPo
);
word
Truth
=
Gia_LutComputeTruth6Map_rec
(
p
,
Gia_ObjFaninId0p
(
p
,
pObj
),
vMap
);
return
Gia_ObjFaninC0
(
pObj
)
?
~
Truth
:
Truth
;
}
/**Function*************************************************************
Synopsis [Generate MUX tree of the truth table.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static
unsigned
s_Truths5
[
5
]
=
{
0xAAAAAAAA
,
0xCCCCCCCC
,
0xF0F0F0F0
,
0xFF00FF00
,
0xFFFF0000
,
};
static
inline
int
Abc_Tt5HasVar
(
unsigned
t
,
int
iVar
)
{
return
((
t
<<
(
1
<<
iVar
))
&
s_Truths5
[
iVar
])
!=
(
t
&
s_Truths5
[
iVar
]);
}
static
inline
unsigned
Abc_Tt5Cofactor0
(
unsigned
t
,
int
iVar
)
{
assert
(
iVar
>=
0
&&
iVar
<
6
);
return
(
t
&
~
s_Truths5
[
iVar
])
|
((
t
&
~
s_Truths5
[
iVar
])
<<
(
1
<<
iVar
));
}
static
inline
unsigned
Abc_Tt5Cofactor1
(
unsigned
t
,
int
iVar
)
{
assert
(
iVar
>=
0
&&
iVar
<
6
);
return
(
t
&
s_Truths5
[
iVar
])
|
((
t
&
s_Truths5
[
iVar
])
>>
(
1
<<
iVar
));
}
int
Gia_Truth5ToGia
(
Gia_Man_t
*
p
,
int
*
pVarLits
,
int
nVars
,
unsigned
Truth
,
int
fHash
)
{
int
Var
,
Lit0
,
Lit1
;
if
(
Truth
==
0
)
return
0
;
if
(
~
Truth
==
0
)
return
1
;
assert
(
nVars
>
0
);
// find the topmost var
for
(
Var
=
nVars
-
1
;
Var
>=
0
;
Var
--
)
if
(
Abc_Tt5HasVar
(
Truth
,
Var
)
)
break
;
assert
(
Var
>=
0
);
// cofactor
Lit0
=
Gia_Truth5ToGia
(
p
,
pVarLits
,
Var
,
Abc_Tt5Cofactor0
(
Truth
,
Var
),
fHash
);
Lit1
=
Gia_Truth5ToGia
(
p
,
pVarLits
,
Var
,
Abc_Tt5Cofactor1
(
Truth
,
Var
),
fHash
);
if
(
fHash
)
return
Gia_ManHashMux
(
p
,
pVarLits
[
Var
],
Lit1
,
Lit0
);
else
return
Gia_ManAppendMux
(
p
,
pVarLits
[
Var
],
Lit1
,
Lit0
);
}
/**Function*************************************************************
Synopsis [Generate MUX tree of the truth table.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int
Gia_Truth6ToGia
(
Gia_Man_t
*
p
,
int
*
pVarLits
,
int
nVars
,
word
Truth
,
int
fHash
)
{
int
Var
,
Lit0
,
Lit1
;
if
(
Truth
==
0
)
return
0
;
if
(
~
Truth
==
0
)
return
1
;
assert
(
nVars
>
0
);
// find the topmost var
for
(
Var
=
nVars
-
1
;
Var
>=
0
;
Var
--
)
if
(
Abc_Tt6HasVar
(
Truth
,
Var
)
)
break
;
assert
(
Var
>=
0
);
// cofactor
Lit0
=
Gia_Truth6ToGia
(
p
,
pVarLits
,
Var
,
Abc_Tt6Cofactor0
(
Truth
,
Var
),
fHash
);
Lit1
=
Gia_Truth6ToGia
(
p
,
pVarLits
,
Var
,
Abc_Tt6Cofactor1
(
Truth
,
Var
),
fHash
);
if
(
fHash
)
return
Gia_ManHashMux
(
p
,
pVarLits
[
Var
],
Lit1
,
Lit0
);
else
return
Gia_ManAppendMux
(
p
,
pVarLits
[
Var
],
Lit1
,
Lit0
);
}
void
Gia_Truth6ToGiaTest
(
Gia_Man_t
*
p
)
{
int
Size
=
5
;
word
Truth
,
TruthNew
;
Vec_Int_t
*
vMap
=
Vec_IntStartFull
(
Gia_ManCiNum
(
p
)
);
Vec_Int_t
*
vSupp
=
Vec_IntStart
(
100
);
int
nCos
=
Gia_ManCoNum
(
p
),
Count
=
0
;
int
i
,
k
,
Id
,
ObjId
,
iLitNew
;
Gia_ManHashAlloc
(
p
);
Gia_ManForEachCoId
(
p
,
Id
,
i
)
{
Gia_ManCollectCis
(
p
,
&
Id
,
1
,
vSupp
);
// ObjIds
if
(
Vec_IntSize
(
vSupp
)
<=
Size
&&
i
<
nCos
)
{
int
pVarLits
[
6
];
Vec_IntForEachEntry
(
vSupp
,
ObjId
,
k
)
{
int
CioId
=
Gia_ObjCioId
(
Gia_ManObj
(
p
,
ObjId
));
Vec_IntWriteEntry
(
vMap
,
CioId
,
k
);
pVarLits
[
k
]
=
Abc_Var2Lit
(
ObjId
,
0
);
}
Truth
=
Gia_LutComputeTruth6Map
(
p
,
i
,
vMap
);
if
(
Size
==
5
)
iLitNew
=
Gia_Truth5ToGia
(
p
,
pVarLits
,
Vec_IntSize
(
vSupp
),
(
unsigned
)
Truth
,
1
);
else
iLitNew
=
Gia_Truth6ToGia
(
p
,
pVarLits
,
Vec_IntSize
(
vSupp
),
Truth
,
1
);
Gia_ManAppendCo
(
p
,
iLitNew
);
TruthNew
=
Gia_LutComputeTruth6Map
(
p
,
Gia_ManCoNum
(
p
)
-
1
,
vMap
);
Vec_IntForEachEntry
(
vSupp
,
ObjId
,
k
)
{
int
CioId
=
Gia_ObjCioId
(
Gia_ManObj
(
p
,
ObjId
));
Vec_IntWriteEntry
(
vMap
,
CioId
,
-
1
);
}
if
(
Truth
!=
TruthNew
)
printf
(
"Error for output %d.
\n
"
,
i
);
Count
++
;
//Dau_DsdPrintFromTruth( &Truth, Vec_IntSize(vSupp) );
}
}
Gia_ManHashStop
(
p
);
printf
(
"Finished processing %d outputs.
\n
"
,
Count
);
Vec_IntFree
(
vSupp
);
Vec_IntFree
(
vMap
);
}
/**Function*************************************************************
...
...
src/aig/miniaig/miniaig.h
View file @
f030a2a5
...
...
@@ -251,6 +251,64 @@ static int Mini_AigXor( Mini_Aig_t * p, int Lit0, int Lit1 )
return
Mini_AigMux
(
p
,
Lit0
,
Mini_AigLitNot
(
Lit1
),
Lit1
);
}
static
unsigned
s_MiniTruths5
[
5
]
=
{
0xAAAAAAAA
,
0xCCCCCCCC
,
0xF0F0F0F0
,
0xFF00FF00
,
0xFFFF0000
,
};
static
inline
int
Mini_AigTt5HasVar
(
unsigned
t
,
int
iVar
)
{
return
((
t
<<
(
1
<<
iVar
))
&
s_MiniTruths5
[
iVar
])
!=
(
t
&
s_MiniTruths5
[
iVar
]);
}
static
inline
unsigned
Mini_AigTt5Cofactor0
(
unsigned
t
,
int
iVar
)
{
assert
(
iVar
>=
0
&&
iVar
<
6
);
return
(
t
&
~
s_MiniTruths5
[
iVar
])
|
((
t
&
~
s_MiniTruths5
[
iVar
])
<<
(
1
<<
iVar
));
}
static
inline
unsigned
Mini_AigTt5Cofactor1
(
unsigned
t
,
int
iVar
)
{
assert
(
iVar
>=
0
&&
iVar
<
6
);
return
(
t
&
s_MiniTruths5
[
iVar
])
|
((
t
&
s_MiniTruths5
[
iVar
])
>>
(
1
<<
iVar
));
}
static
inline
int
Mini_AigAndProp
(
Mini_Aig_t
*
p
,
int
iLit0
,
int
iLit1
)
{
if
(
iLit0
<
2
)
return
iLit0
?
iLit1
:
0
;
if
(
iLit1
<
2
)
return
iLit1
?
iLit0
:
0
;
if
(
iLit0
==
iLit1
)
return
iLit1
;
if
(
iLit0
==
Abc_LitNot
(
iLit1
)
)
return
0
;
return
Mini_AigAnd
(
p
,
iLit0
,
iLit1
);
}
static
inline
int
Mini_AigMuxProp
(
Mini_Aig_t
*
p
,
int
iCtrl
,
int
iData1
,
int
iData0
)
{
int
iTemp0
=
Mini_AigAndProp
(
p
,
Mini_AigLitNot
(
iCtrl
),
iData0
);
int
iTemp1
=
Mini_AigAndProp
(
p
,
iCtrl
,
iData1
);
return
Mini_AigLitNot
(
Mini_AigAndProp
(
p
,
Abc_LitNot
(
iTemp0
),
Abc_LitNot
(
iTemp1
)
)
);
}
static
inline
int
Mini_AigTruth
(
Mini_Aig_t
*
p
,
int
*
pVarLits
,
int
nVars
,
unsigned
Truth
)
{
int
Var
,
Lit0
,
Lit1
;
if
(
Truth
==
0
)
return
0
;
if
(
~
Truth
==
0
)
return
1
;
assert
(
nVars
>
0
);
// find the topmost var
for
(
Var
=
nVars
-
1
;
Var
>=
0
;
Var
--
)
if
(
Mini_AigTt5HasVar
(
Truth
,
Var
)
)
break
;
assert
(
Var
>=
0
);
// cofactor
Lit0
=
Mini_AigTruth
(
p
,
pVarLits
,
Var
,
Mini_AigTt5Cofactor0
(
Truth
,
Var
)
);
Lit1
=
Mini_AigTruth
(
p
,
pVarLits
,
Var
,
Mini_AigTt5Cofactor1
(
Truth
,
Var
)
);
return
Mini_AigMuxProp
(
p
,
pVarLits
[
Var
],
Lit1
,
Lit0
);
}
// procedure to check the topological order during AIG construction
static
int
Mini_AigCheck
(
Mini_Aig_t
*
p
)
{
...
...
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