Skip to content

Commit 4b596db

Browse files
authored
Merge branch 'berkeley-abc:master' into master
2 parents 7fc3557 + 1f3cf0a commit 4b596db

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+2609
-382
lines changed

.github/workflows/build-posix-cmake.yml

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ on:
66

77
jobs:
88

9-
build-posix:
9+
build-posix-cmake:
1010
strategy:
1111
matrix:
12-
os: [macos-11, ubuntu-latest]
12+
os: [macos-latest, ubuntu-latest]
1313
use_namespace: [false, true]
1414

1515
runs-on: ${{ matrix.os }}
@@ -22,7 +22,7 @@ jobs:
2222
steps:
2323

2424
- name: Git Checkout
25-
uses: actions/checkout@v2
25+
uses: actions/checkout@v4
2626
with:
2727
submodules: recursive
2828

@@ -44,6 +44,10 @@ jobs:
4444
run: |
4545
cmake --build build
4646
47+
- name: Run Unit Tests
48+
run: |
49+
ctest --output-on-failure
50+
4751
- name: Test Executable
4852
run: |
4953
./build/abc -c "r i10.aig; b; ps; b; rw -l; rw -lz; b; rw -lz; b; ps; cec"
@@ -60,7 +64,7 @@ jobs:
6064
cp build/abc build/libabc.a staging/
6165
6266
- name: Upload pacakge artifact
63-
uses: actions/upload-artifact@v1
67+
uses: actions/upload-artifact@v4
6468
with:
65-
name: package
69+
name: package-cmake-${{ matrix.os }}-${{ matrix.use_namespace }}
6670
path: staging/

.github/workflows/build-posix.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jobs:
2222
steps:
2323

2424
- name: Git Checkout
25-
uses: actions/checkout@v2
25+
uses: actions/checkout@v4
2626
with:
2727
submodules: recursive
2828

@@ -60,7 +60,7 @@ jobs:
6060
cp abc libabc.a staging/
6161
6262
- name: Upload pacakge artifact
63-
uses: actions/upload-artifact@v1
63+
uses: actions/upload-artifact@v4
6464
with:
65-
name: package
65+
name: package-posix-${{ matrix.os }}-${{ matrix.use_namespace }}
6666
path: staging/

.github/workflows/build-windows.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
steps:
1414

1515
- name: Git Checkout
16-
uses: actions/checkout@v2
16+
uses: actions/checkout@v4
1717
with:
1818
submodules: recursive
1919

@@ -46,7 +46,7 @@ jobs:
4646
copy UpgradeLog.htm staging/
4747
4848
- name: Upload pacakge artifact
49-
uses: actions/upload-artifact@v1
49+
uses: actions/upload-artifact@v4
5050
with:
51-
name: package
51+
name: package-windows
5252
path: staging/

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ lib/m114*
1313
lib/bip*
1414
docs/
1515
.vscode/
16+
.cache/
1617

1718
src/ext*
1819
src/xxx/

CMakeLists.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,3 +112,17 @@ add_library(libabc-pic EXCLUDE_FROM_ALL ${ABC_SRC})
112112
abc_properties(libabc-pic PUBLIC)
113113
set_property(TARGET libabc-pic PROPERTY POSITION_INDEPENDENT_CODE ON)
114114
set_property(TARGET libabc-pic PROPERTY OUTPUT_NAME abc-pic)
115+
116+
if(NOT DEFINED ABC_SKIP_TESTS)
117+
enable_testing()
118+
include(FetchContent)
119+
FetchContent_Declare(
120+
googletest
121+
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
122+
# Specify the commit you depend on and update it regularly.
123+
URL "https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip"
124+
)
125+
FetchContent_MakeAvailable(googletest)
126+
include(GoogleTest)
127+
add_subdirectory(test)
128+
endif()

src/aig/gia/gia.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,9 +554,11 @@ static inline int Gia_ObjFaninIdp( Gia_Man_t * p, Gia_Obj_t * pObj, int
554554
static inline int Gia_ObjFaninLit0( Gia_Obj_t * pObj, int ObjId ) { return Abc_Var2Lit( Gia_ObjFaninId0(pObj, ObjId), Gia_ObjFaninC0(pObj) ); }
555555
static inline int Gia_ObjFaninLit1( Gia_Obj_t * pObj, int ObjId ) { return Abc_Var2Lit( Gia_ObjFaninId1(pObj, ObjId), Gia_ObjFaninC1(pObj) ); }
556556
static inline int Gia_ObjFaninLit2( Gia_Man_t * p, int ObjId ) { return (p->pMuxes && p->pMuxes[ObjId]) ? p->pMuxes[ObjId] : -1; }
557+
static inline int Gia_ObjFaninLit( Gia_Obj_t * pObj, int ObjId, int n ){ return n ? Gia_ObjFaninLit1(pObj, ObjId) : Gia_ObjFaninLit0(pObj, ObjId);}
557558
static inline int Gia_ObjFaninLit0p( Gia_Man_t * p, Gia_Obj_t * pObj) { return Abc_Var2Lit( Gia_ObjFaninId0p(p, pObj), Gia_ObjFaninC0(pObj) ); }
558559
static inline int Gia_ObjFaninLit1p( Gia_Man_t * p, Gia_Obj_t * pObj) { return Abc_Var2Lit( Gia_ObjFaninId1p(p, pObj), Gia_ObjFaninC1(pObj) ); }
559560
static inline int Gia_ObjFaninLit2p( Gia_Man_t * p, Gia_Obj_t * pObj) { return (p->pMuxes && p->pMuxes[Gia_ObjId(p, pObj)]) ? p->pMuxes[Gia_ObjId(p, pObj)] : -1; }
561+
static inline int Gia_ObjFaninLitp( Gia_Man_t * p, Gia_Obj_t * pObj, int n ){ return n ? Gia_ObjFaninLit1p(p, pObj) : Gia_ObjFaninLit0p(p, pObj);}
560562
static inline void Gia_ObjFlipFaninC0( Gia_Obj_t * pObj ) { assert( Gia_ObjIsCo(pObj) ); pObj->fCompl0 ^= 1; }
561563
static inline int Gia_ObjFaninNum( Gia_Man_t * p, Gia_Obj_t * pObj ) { if ( Gia_ObjIsMux(p, pObj) ) return 3; if ( Gia_ObjIsAnd(pObj) ) return 2; if ( Gia_ObjIsCo(pObj) ) return 1; return 0; }
562564
static inline int Gia_ObjWhatFanin( Gia_Man_t * p, Gia_Obj_t * pObj, Gia_Obj_t * pFanin ) { if ( Gia_ObjFanin0(pObj) == pFanin ) return 0; if ( Gia_ObjFanin1(pObj) == pFanin ) return 1; if ( Gia_ObjFanin2(p, pObj) == pFanin ) return 2; assert(0); return -1; }
@@ -1729,6 +1731,7 @@ extern word Gia_ManRandomW( int fReset );
17291731
extern void Gia_ManRandomInfo( Vec_Ptr_t * vInfo, int iInputStart, int iWordStart, int iWordStop );
17301732
extern char * Gia_TimeStamp();
17311733
extern char * Gia_FileNameGenericAppend( char * pBase, char * pSuffix );
1734+
extern Vec_Ptr_t * Gia_GetFakeNames( int nNames, int fCaps );
17321735
extern void Gia_ManIncrementTravId( Gia_Man_t * p );
17331736
extern void Gia_ManCleanMark01( Gia_Man_t * p );
17341737
extern void Gia_ManSetMark0( Gia_Man_t * p );
@@ -1755,6 +1758,7 @@ extern Vec_Int_t * Gia_ManReverseLevel( Gia_Man_t * p );
17551758
extern Vec_Int_t * Gia_ManRequiredLevel( Gia_Man_t * p );
17561759
extern void Gia_ManCreateValueRefs( Gia_Man_t * p );
17571760
extern void Gia_ManCreateRefs( Gia_Man_t * p );
1761+
extern void Gia_ManCreateLitRefs( Gia_Man_t * p );
17581762
extern int * Gia_ManCreateMuxRefs( Gia_Man_t * p );
17591763
extern int Gia_ManCrossCut( Gia_Man_t * p, int fReverse );
17601764
extern Vec_Int_t * Gia_ManCollectPoIds( Gia_Man_t * p );

src/aig/gia/giaAiger.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1464,6 +1464,18 @@ void Gia_AigerWriteS( Gia_Man_t * pInit, char * pFileName, int fWriteSymbols, in
14641464
Vec_StrFree( vStrExt );
14651465
if ( fVerbose ) printf( "Finished writing extension \"m\".\n" );
14661466
}
1467+
// write cell mapping
1468+
if ( Gia_ManHasCellMapping(p) )
1469+
{
1470+
extern Vec_Str_t * Gia_AigerWriteCellMappingDoc( Gia_Man_t * p );
1471+
fprintf( pFile, "M" );
1472+
vStrExt = Gia_AigerWriteCellMappingDoc( p );
1473+
Gia_FileWriteBufferSize( pFile, Vec_StrSize(vStrExt) );
1474+
fwrite( Vec_StrArray(vStrExt), 1, Vec_StrSize(vStrExt), pFile );
1475+
Vec_StrFree( vStrExt );
1476+
if ( fVerbose ) printf( "Finished writing extension \"M\".\n" );
1477+
1478+
}
14671479
// write placement
14681480
if ( p->pPlacement )
14691481
{

src/aig/gia/giaAigerExt.c

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
***********************************************************************/
2020

2121
#include "gia.h"
22+
#include "misc/st/st.h"
23+
#include "map/mio/mio.h"
24+
#include "map/mio/mioInt.h"
2225

2326
ABC_NAMESPACE_IMPL_START
2427

@@ -288,6 +291,101 @@ Vec_Str_t * Gia_AigerWriteMappingDoc( Gia_Man_t * p )
288291
return Vec_StrAllocArray( (char *)pBuffer, 4*nSize );
289292
}
290293

294+
int Gia_AigerWriteCellMappingInstance( Gia_Man_t * p, unsigned char * pBuffer, int nSize2, int i )
295+
{
296+
int k, iFan;
297+
if ( !Gia_ObjIsCellInv(p, i) ) {
298+
Gia_AigerWriteInt( pBuffer + nSize2, Gia_ObjCellId(p, i) ); nSize2 += 4;
299+
Gia_AigerWriteInt( pBuffer + nSize2, i ); nSize2 += 4;
300+
Gia_CellForEachFanin( p, i, iFan, k )
301+
{
302+
Gia_AigerWriteInt( pBuffer + nSize2, iFan );
303+
nSize2 += 4;
304+
}
305+
} else {
306+
Gia_AigerWriteInt( pBuffer + nSize2, 3 ); nSize2 += 4;
307+
Gia_AigerWriteInt( pBuffer + nSize2, i ); nSize2 += 4;
308+
Gia_AigerWriteInt( pBuffer + nSize2, Abc_LitNot(i) ); nSize2 += 4;
309+
}
310+
311+
return nSize2;
312+
}
313+
314+
Vec_Str_t * Gia_AigerWriteCellMappingDoc( Gia_Man_t * p )
315+
{
316+
unsigned char * pBuffer;
317+
int i, iFan, nCells = 0, nInstances = 0, nSize = 8, nSize2 = 0;
318+
Mio_Cell2_t * pCells = Mio_CollectRootsNewDefault2( 6, &nCells, 0 );
319+
assert( pCells );
320+
321+
for (int i = 0; i < nCells; i++)
322+
{
323+
Mio_Gate_t *pGate = (Mio_Gate_t *) pCells[i].pMioGate;
324+
Mio_Pin_t *pPin;
325+
nSize += strlen(Mio_GateReadName(pGate)) + 1;
326+
nSize += strlen(Mio_GateReadOutName(pGate)) + 1 + 4;
327+
Mio_GateForEachPin( pGate, pPin )
328+
nSize += strlen(Mio_PinReadName(pPin)) + 1;
329+
}
330+
331+
Gia_ManForEachCell( p, i )
332+
{
333+
assert ( !Gia_ObjIsCellBuf(p, i) ); // not implemented
334+
nInstances++;
335+
if ( Gia_ObjIsCellInv(p, i) )
336+
nSize += 12;
337+
else
338+
nSize += Gia_ObjCellSize(p, i) * 4 + 8;
339+
}
340+
341+
pBuffer = ABC_ALLOC( unsigned char, nSize );
342+
Gia_AigerWriteInt( pBuffer + nSize2, nCells ); nSize2 += 4;
343+
Gia_AigerWriteInt( pBuffer + nSize2, nInstances ); nSize2 += 4;
344+
345+
for (int i = 0; i < nCells; i++)
346+
{
347+
int nPins = 0;
348+
Mio_Gate_t *pGate = (Mio_Gate_t *) pCells[i].pMioGate;
349+
Mio_Pin_t *pPin;
350+
351+
strcpy((char *) pBuffer + nSize2, Mio_GateReadName(pGate));
352+
nSize2 += strlen(Mio_GateReadName(pGate)) + 1;
353+
strcpy((char *) pBuffer + nSize2, Mio_GateReadOutName(pGate));
354+
nSize2 += strlen(Mio_GateReadOutName(pGate)) + 1;
355+
356+
Mio_GateForEachPin( pGate, pPin )
357+
nPins++;
358+
Gia_AigerWriteInt( pBuffer + nSize2, nPins ); nSize2 += 4;
359+
360+
Mio_GateForEachPin( pGate, pPin )
361+
{
362+
strcpy((char *) pBuffer + nSize2, Mio_PinReadName(pPin));
363+
nSize2 += strlen(Mio_PinReadName(pPin)) + 1;
364+
}
365+
}
366+
367+
Gia_ManForEachCell( p, i )
368+
{
369+
if ( Gia_ObjIsCellBuf(p, i) )
370+
continue;
371+
372+
if ( Gia_ObjIsCellInv(p, i) && !Abc_LitIsCompl(i) ) {
373+
// swap the order so that the inverter is after the driver
374+
// of the inverter's input
375+
nSize2 = Gia_AigerWriteCellMappingInstance(p, pBuffer, nSize2, Abc_LitNot(i) );
376+
nSize2 = Gia_AigerWriteCellMappingInstance(p, pBuffer, nSize2, i );
377+
i += 1;
378+
continue;
379+
}
380+
381+
nSize2 = Gia_AigerWriteCellMappingInstance(p, pBuffer, nSize2, i );
382+
}
383+
384+
assert( nSize2 == nSize );
385+
ABC_FREE( pCells );
386+
return Vec_StrAllocArray( (char *)pBuffer, nSize );
387+
}
388+
291389
/**Function*************************************************************
292390
293391
Synopsis [Read/write packing information.]

src/aig/gia/giaClp.c

Lines changed: 4 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -42,42 +42,6 @@ extern int Gia_ManFactorNode( Gia_Man_t * p, char * pSop, Vec_Int_t * vLeaves );
4242
/// FUNCTION DEFINITIONS ///
4343
////////////////////////////////////////////////////////////////////////
4444

45-
/**Function*************************************************************
46-
47-
Synopsis []
48-
49-
Description []
50-
51-
SideEffects []
52-
53-
SeeAlso []
54-
55-
***********************************************************************/
56-
Vec_Ptr_t * Gia_GetFakeNames( int nNames )
57-
{
58-
Vec_Ptr_t * vNames;
59-
char Buffer[5];
60-
int i;
61-
62-
vNames = Vec_PtrAlloc( nNames );
63-
for ( i = 0; i < nNames; i++ )
64-
{
65-
if ( nNames < 26 )
66-
{
67-
Buffer[0] = 'a' + i;
68-
Buffer[1] = 0;
69-
}
70-
else
71-
{
72-
Buffer[0] = 'a' + i%26;
73-
Buffer[1] = '0' + i/26;
74-
Buffer[2] = 0;
75-
}
76-
Vec_PtrPush( vNames, Extra_UtilStrsav(Buffer) );
77-
}
78-
return vNames;
79-
}
80-
8145
/**Function*************************************************************
8246
8347
Synopsis []
@@ -378,8 +342,8 @@ Gia_Man_t * Gia_ManCollapseTest( Gia_Man_t * p, int fVerbose )
378342
Dsd_Decompose( pManDsd, (DdNode **)Vec_PtrArray(vFuncs), Vec_PtrSize(vFuncs) );
379343
if ( fVerbose )
380344
{
381-
Vec_Ptr_t * vNamesCi = Gia_GetFakeNames( Gia_ManCiNum(p) );
382-
Vec_Ptr_t * vNamesCo = Gia_GetFakeNames( Gia_ManCoNum(p) );
345+
Vec_Ptr_t * vNamesCi = Gia_GetFakeNames( Gia_ManCiNum(p), 0 );
346+
Vec_Ptr_t * vNamesCo = Gia_GetFakeNames( Gia_ManCoNum(p), 1 );
383347
char ** ppNamesCi = (char **)Vec_PtrArray( vNamesCi );
384348
char ** ppNamesCo = (char **)Vec_PtrArray( vNamesCo );
385349
Dsd_TreePrint( stdout, pManDsd, ppNamesCi, ppNamesCo, 0, -1, 0 );
@@ -464,8 +428,8 @@ void Gia_ManCheckDsd( Gia_Man_t * p, int OffSet, int fVerbose )
464428

465429
if ( fVerbose )
466430
{
467-
Vec_Ptr_t * vNamesCi = Gia_GetFakeNames( Gia_ManCiNum(p) );
468-
Vec_Ptr_t * vNamesCo = Gia_GetFakeNames( Gia_ManCoNum(p) );
431+
Vec_Ptr_t * vNamesCi = Gia_GetFakeNames( Gia_ManCiNum(p), 0 );
432+
Vec_Ptr_t * vNamesCo = Gia_GetFakeNames( Gia_ManCoNum(p), 1 );
469433
char ** ppNamesCi = (char **)Vec_PtrArray( vNamesCi );
470434
char ** ppNamesCo = (char **)Vec_PtrArray( vNamesCo );
471435
Dsd_TreePrint( stdout, pManDsd, ppNamesCi, ppNamesCo, 0, -1, OffSet );

0 commit comments

Comments
 (0)