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
325ac583
Commit
325ac583
authored
Mar 01, 2012
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Created a communication bridge.
parent
2b39d60f
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
375 additions
and
1 deletions
+375
-1
abclib.dsp
+4
-0
src/misc/util/module.make
+2
-1
src/misc/util/utilBridge.c
+369
-0
No files found.
abclib.dsp
View file @
325ac583
...
...
@@ -2555,6 +2555,10 @@ SOURCE=.\src\misc\util\util_hack.h
# End Source File
# Begin Source File
SOURCE=.\src\misc\util\utilBridge.c
# End Source File
# Begin Source File
SOURCE=.\src\misc\util\utilCex.c
# End Source File
# Begin Source File
...
...
src/misc/util/module.make
View file @
325ac583
SRC
+=
src/misc/util/utilCex.c
\
SRC
+=
src/misc/util/utilBridge.c
\
src/misc/util/utilCex.c
\
src/misc/util/utilFile.c
\
src/misc/util/utilNam.c
\
src/misc/util/utilSignal.c
\
...
...
src/misc/util/utilBridge.c
0 → 100644
View file @
325ac583
/**CFile****************************************************************
FileName [utilBridge.c]
SystemName [ABC: Logic synthesis and verification system.]
PackageName []
Synopsis []
Author [Alan Mishchenko]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - June 20, 2005.]
Revision [$Id: utilBridge.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
***********************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include "abc_global.h"
#include "src/aig/gia/gia.h"
#include "src/misc/vec/vec.h"
ABC_NAMESPACE_IMPL_START
////////////////////////////////////////////////////////////////////////
/// DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
extern
void
Gia_WriteAigerEncodeStr
(
Vec_Str_t
*
vStr
,
unsigned
x
);
extern
unsigned
Gia_ReadAigerDecode
(
unsigned
char
**
ppPos
);
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
Vec_Str_t
*
Gia_ManToBridgeVec
(
FILE
*
pFile
,
Gia_Man_t
*
p
)
{
Vec_Str_t
*
vBuffer
;
Gia_Obj_t
*
pObj
;
int
nNodes
=
0
,
i
,
uLit
,
uLit0
,
uLit1
;
// set the node numbers to be used in the output file
Gia_ManConst0
(
p
)
->
Value
=
nNodes
++
;
Gia_ManForEachCi
(
p
,
pObj
,
i
)
pObj
->
Value
=
nNodes
++
;
Gia_ManForEachAnd
(
p
,
pObj
,
i
)
pObj
->
Value
=
nNodes
++
;
// write the header "M I L O A" where M = I + L + A
vBuffer
=
Vec_StrAlloc
(
3
*
Gia_ManObjNum
(
p
)
);
Vec_StrPrintStr
(
vBuffer
,
"aig "
);
Vec_StrPrintNum
(
vBuffer
,
Gia_ManCandNum
(
p
)
);
Vec_StrPrintStr
(
vBuffer
,
" "
);
Vec_StrPrintNum
(
vBuffer
,
Gia_ManPiNum
(
p
)
);
Vec_StrPrintStr
(
vBuffer
,
" "
);
Vec_StrPrintNum
(
vBuffer
,
Gia_ManRegNum
(
p
)
);
Vec_StrPrintStr
(
vBuffer
,
" "
);
Vec_StrPrintNum
(
vBuffer
,
Gia_ManPoNum
(
p
)
);
Vec_StrPrintStr
(
vBuffer
,
" "
);
Vec_StrPrintNum
(
vBuffer
,
Gia_ManAndNum
(
p
)
);
Vec_StrPrintStr
(
vBuffer
,
"
\n
"
);
// write latch drivers
Gia_ManForEachRi
(
p
,
pObj
,
i
)
{
uLit
=
Abc_Var2Lit
(
Gia_ObjValue
(
Gia_ObjFanin0
(
pObj
)),
Gia_ObjFaninC0
(
pObj
)
);
Vec_StrPrintNum
(
vBuffer
,
uLit
);
Vec_StrPrintStr
(
vBuffer
,
"
\n
"
);
}
// write PO drivers
Gia_ManForEachPo
(
p
,
pObj
,
i
)
{
uLit
=
Abc_Var2Lit
(
Gia_ObjValue
(
Gia_ObjFanin0
(
pObj
)),
Gia_ObjFaninC0
(
pObj
)
);
Vec_StrPrintNum
(
vBuffer
,
uLit
);
Vec_StrPrintStr
(
vBuffer
,
"
\n
"
);
}
// write the nodes into the buffer
Gia_ManForEachAnd
(
p
,
pObj
,
i
)
{
uLit
=
Abc_Var2Lit
(
Gia_ObjValue
(
pObj
),
0
);
uLit0
=
Abc_Var2Lit
(
Gia_ObjValue
(
Gia_ObjFanin0
(
pObj
)),
Gia_ObjFaninC0
(
pObj
)
);
uLit1
=
Abc_Var2Lit
(
Gia_ObjValue
(
Gia_ObjFanin1
(
pObj
)),
Gia_ObjFaninC1
(
pObj
)
);
assert
(
uLit0
!=
uLit1
);
if
(
uLit0
>
uLit1
)
{
int
Temp
=
uLit0
;
uLit0
=
uLit1
;
uLit1
=
Temp
;
}
Gia_WriteAigerEncodeStr
(
vBuffer
,
uLit
-
uLit1
);
Gia_WriteAigerEncodeStr
(
vBuffer
,
uLit1
-
uLit0
);
}
Vec_StrPrintStr
(
vBuffer
,
"c"
);
return
vBuffer
;
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int
Gia_ManToBridge
(
FILE
*
pFile
,
Gia_Man_t
*
pMan
)
{
Vec_Str_t
*
vBuffer
;
vBuffer
=
Gia_ManToBridgeVec
(
pFile
,
pMan
);
fwrite
(
Vec_StrArray
(
vBuffer
),
1
,
Vec_StrSize
(
vBuffer
),
pFile
);
Vec_StrFree
(
vBuffer
);
return
0
;
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
Gia_Man_t
*
Gia_ManFromBridgeReadBody
(
int
Size
,
unsigned
char
*
pBuffer
,
Vec_Int_t
**
pvInits
)
{
int
fHash
=
0
;
Vec_Int_t
*
vLits
,
*
vInits
;
Gia_Man_t
*
p
=
NULL
;
unsigned
char
*
pBufferPivot
,
*
pBufferEnd
=
pBuffer
+
Size
;
int
i
,
nInputs
,
nFlops
,
nGates
,
nProps
;
unsigned
iFan0
,
iFan1
;
nInputs
=
Gia_ReadAigerDecode
(
&
pBuffer
);
nFlops
=
Gia_ReadAigerDecode
(
&
pBuffer
);
nGates
=
Gia_ReadAigerDecode
(
&
pBuffer
);
vLits
=
Vec_IntAlloc
(
1000
);
Vec_IntPush
(
vLits
,
-
1
);
Vec_IntPush
(
vLits
,
1
);
// start the AIG package
p
=
Gia_ManStart
(
nInputs
+
nFlops
*
2
+
nGates
+
1
+
1
);
p
->
pName
=
Abc_UtilStrsav
(
"temp"
);
// create PIs
for
(
i
=
0
;
i
<
nInputs
;
i
++
)
Vec_IntPush
(
vLits
,
Gia_ManAppendCi
(
p
)
);
// create flop outputs
for
(
i
=
0
;
i
<
nFlops
;
i
++
)
Vec_IntPush
(
vLits
,
Gia_ManAppendCi
(
p
)
);
// create nodes
if
(
fHash
)
Gia_ManHashAlloc
(
p
);
for
(
i
=
0
;
i
<
nGates
;
i
++
)
{
iFan0
=
Gia_ReadAigerDecode
(
&
pBuffer
);
iFan1
=
Gia_ReadAigerDecode
(
&
pBuffer
);
assert
(
(
iFan0
&
1
)
==
0
);
iFan0
>>=
1
;
iFan0
=
Abc_LitNotCond
(
Vec_IntEntry
(
vLits
,
iFan0
>>
1
),
iFan0
&
1
);
iFan1
=
Abc_LitNotCond
(
Vec_IntEntry
(
vLits
,
iFan1
>>
1
),
iFan0
&
1
);
if
(
fHash
)
Vec_IntPush
(
vLits
,
Gia_ManHashAnd
(
p
,
iFan0
,
iFan1
)
);
else
Vec_IntPush
(
vLits
,
Gia_ManAppendAnd
(
p
,
iFan0
,
iFan1
)
);
}
if
(
fHash
)
Gia_ManHashStop
(
p
);
// remember where flops begin
pBufferPivot
=
pBuffer
;
// stroll through flops
for
(
i
=
0
;
i
<
nFlops
;
i
++
)
Gia_ReadAigerDecode
(
&
pBuffer
);
// create POs
nProps
=
Gia_ReadAigerDecode
(
&
pBuffer
);
assert
(
nProps
==
1
);
for
(
i
=
0
;
i
<
nProps
;
i
++
)
{
iFan0
=
Gia_ReadAigerDecode
(
&
pBuffer
);
iFan0
=
Abc_LitNotCond
(
Vec_IntEntry
(
vLits
,
iFan0
>>
1
),
iFan0
&
1
);
Gia_ManAppendCo
(
p
,
iFan0
);
}
// make sure the end of buffer is reached
assert
(
pBufferEnd
==
pBuffer
);
// resetting to flops
pBuffer
=
pBufferPivot
;
vInits
=
Vec_IntAlloc
(
nFlops
);
for
(
i
=
0
;
i
<
nFlops
;
i
++
)
{
iFan0
=
Gia_ReadAigerDecode
(
&
pBuffer
);
Vec_IntPush
(
vInits
,
iFan0
&
3
);
// 0 = X value; 1 = not used; 2 = false; 3 = true
iFan0
>>=
2
;
iFan0
=
Abc_LitNotCond
(
Vec_IntEntry
(
vLits
,
iFan0
>>
1
),
iFan0
&
1
);
Gia_ManAppendCo
(
p
,
iFan0
);
}
Gia_ManSetRegNum
(
p
,
nFlops
);
Vec_IntFree
(
vLits
);
// remove wholes in the node list
if
(
fHash
)
{
Gia_Man_t
*
pTemp
;
p
=
Gia_ManCleanup
(
pTemp
=
p
);
Gia_ManStop
(
pTemp
);
}
// return
if
(
pvInits
)
*
pvInits
=
vInits
;
else
Vec_IntFree
(
vInits
);
return
p
;
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int
Gia_ManFromBridgeReadPackage
(
FILE
*
pFile
,
int
*
pType
,
int
*
pSize
,
unsigned
char
**
ppBuffer
)
{
char
Temp
[
24
];
int
RetValue
;
RetValue
=
fread
(
Temp
,
24
,
1
,
pFile
);
if
(
RetValue
!=
1
)
{
printf
(
"Gia_ManFromBridgeReadPackage(); Error 1: Something is wrong!
\n
"
);
return
0
;
}
Temp
[
6
]
=
0
;
Temp
[
23
]
=
0
;
*
pType
=
atoi
(
Temp
);
*
pSize
=
atoi
(
Temp
+
7
);
*
ppBuffer
=
ABC_ALLOC
(
char
,
*
pSize
);
RetValue
=
fread
(
*
ppBuffer
,
*
pSize
,
1
,
pFile
);
if
(
RetValue
!=
1
&&
*
pSize
!=
0
)
{
ABC_FREE
(
*
ppBuffer
);
printf
(
"Gia_ManFromBridgeReadPackage(); Error 2: Something is wrong!
\n
"
);
return
0
;
}
return
1
;
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
Gia_Man_t
*
Gia_ManFromBridge
(
FILE
*
pFile
,
Vec_Int_t
**
pvInit
)
{
unsigned
char
*
pBuffer
;
int
Type
,
Size
,
RetValue
;
Gia_Man_t
*
p
=
NULL
;
RetValue
=
Gia_ManFromBridgeReadPackage
(
pFile
,
&
Type
,
&
Size
,
&
pBuffer
);
ABC_FREE
(
pBuffer
);
if
(
!
RetValue
)
return
NULL
;
RetValue
=
Gia_ManFromBridgeReadPackage
(
pFile
,
&
Type
,
&
Size
,
&
pBuffer
);
if
(
!
RetValue
)
return
NULL
;
p
=
Gia_ManFromBridgeReadBody
(
Size
,
pBuffer
,
pvInit
);
ABC_FREE
(
pBuffer
);
if
(
p
==
NULL
)
return
NULL
;
RetValue
=
Gia_ManFromBridgeReadPackage
(
pFile
,
&
Type
,
&
Size
,
&
pBuffer
);
ABC_FREE
(
pBuffer
);
if
(
!
RetValue
)
return
NULL
;
return
p
;
}
/*
{
extern void Gia_ManFromBridgeTest( char * pFileName );
Gia_ManFromBridgeTest( "C:\\_projects\\abc\\_TEST\\bug\\65\\par.dump" );
}
*/
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void
Gia_ManFromBridgeTest
(
char
*
pFileName
)
{
Gia_Man_t
*
p
;
FILE
*
pFile
=
fopen
(
pFileName
,
"rb"
);
if
(
pFile
==
NULL
)
{
printf
(
"Cannot open input file
\"
%s
\"
.
\n
"
,
pFileName
);
return
;
}
p
=
Gia_ManFromBridge
(
pFile
,
NULL
);
fclose
(
pFile
);
Gia_ManPrintStats
(
p
,
0
,
0
);
// Gia_WriteAiger( p, "temp.aig", 0, 0 );
Gia_ManStop
(
p
);
}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
ABC_NAMESPACE_IMPL_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