ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
acecCover.c
Go to the documentation of this file.
1
20
21#include "acecInt.h"
22
24
25
29
33
45void Gia_AcecMark_rec( Gia_Man_t * p, int iObj, int fFirst )
46{
47 Gia_Obj_t * pObj = Gia_ManObj( p, iObj );
48 if ( pObj->fMark0 && !fFirst )
49 return;
50 assert( Gia_ObjIsAnd(pObj) );
51 pObj->fMark1 = 1;
52 Gia_AcecMark_rec( p, Gia_ObjFaninId0(pObj, iObj), 0 );
53 Gia_AcecMark_rec( p, Gia_ObjFaninId1(pObj, iObj), 0 );
54}
55void Gia_AcecMarkFadd( Gia_Man_t * p, int * pSigs )
56{
57// if ( Gia_ManObj(p, pSigs[3])->fMark1 || Gia_ManObj(p, pSigs[4])->fMark1 )
58// return;
59 Gia_ManObj( p, pSigs[0] )->fMark0 = 1;
60 Gia_ManObj( p, pSigs[1] )->fMark0 = 1;
61 Gia_ManObj( p, pSigs[2] )->fMark0 = 1;
62// assert( !Gia_ManObj(p, pSigs[3])->fMark1 );
63// assert( !Gia_ManObj(p, pSigs[4])->fMark1 );
64 Gia_AcecMark_rec( p, pSigs[3], 1 );
65 Gia_AcecMark_rec( p, pSigs[4], 1 );
66}
67void Gia_AcecMarkHadd( Gia_Man_t * p, int * pSigs )
68{
69 Gia_Obj_t * pObj = Gia_ManObj( p, pSigs[0] );
70 int iFan0 = Gia_ObjFaninId0( pObj, pSigs[0] );
71 int iFan1 = Gia_ObjFaninId1( pObj, pSigs[0] );
72 Gia_ManObj( p, iFan0 )->fMark0 = 1;
73 Gia_ManObj( p, iFan1 )->fMark0 = 1;
74 Gia_AcecMark_rec( p, pSigs[0], 1 );
75 Gia_AcecMark_rec( p, pSigs[1], 1 );
76}
77
90{
91 if ( !Gia_ObjIsXor(pObj) )//|| Vec_BitEntry(vMap, Gia_ObjId(p, pObj)) )
92 return;
93 Vec_IntPush( vXors, Gia_ObjId(p, pObj) );
94 Gia_AcecCollectXors_rec( p, Gia_ObjFanin0(pObj), vMap, vXors );
95 Gia_AcecCollectXors_rec( p, Gia_ObjFanin1(pObj), vMap, vXors );
96}
98{
99 Vec_Int_t * vXors = Vec_IntAlloc( 100 );
100 Gia_Obj_t * pObj = Gia_ObjFanin0( Gia_ManCo(p, Gia_ManCoNum(p)-1) );
101 Gia_AcecCollectXors_rec( p, pObj, vMap, vXors );
102 return vXors;
103}
104
116void Gia_AcecExplore( Gia_Man_t * p, int fVerbose )
117{
118 Vec_Int_t * vNodes = Vec_IntAlloc( 100 );
119 Vec_Int_t * vFadds, * vHadds, * vXors;
120 Vec_Bit_t * vMap = Vec_BitStart( Gia_ManObjNum(p) );
121 Gia_Obj_t * pObj;
122 int i, nSupp, nCone, nHadds = 0;
123 assert( p->pMuxes != NULL );
124 vFadds = Gia_ManDetectFullAdders( p, fVerbose, NULL );
125 vHadds = Gia_ManDetectHalfAdders( p, fVerbose );
126
127 pObj = Gia_ManObj( p, 352 );
128 printf( "Xor = %d.\n", Gia_ObjIsXor(pObj) );
129 printf( "Fanin0 = %d. Fanin1 = %d.\n", Gia_ObjFaninId0(pObj, 352), Gia_ObjFaninId1(pObj, 352) );
130 printf( "Fan00 = %d. Fan01 = %d. Fan10 = %d. Fan11 = %d.\n",
131 Gia_ObjFaninId0(Gia_ObjFanin0(pObj), Gia_ObjFaninId0(pObj, 352)),
132 Gia_ObjFaninId1(Gia_ObjFanin0(pObj), Gia_ObjFaninId0(pObj, 352)),
133 Gia_ObjFaninId0(Gia_ObjFanin1(pObj), Gia_ObjFaninId1(pObj, 352)),
134 Gia_ObjFaninId1(Gia_ObjFanin1(pObj), Gia_ObjFaninId1(pObj, 352)) );
135
136 // create a map of all HADD/FADD outputs
137 for ( i = 0; i < Vec_IntSize(vHadds)/2; i++ )
138 {
139 int * pSigs = Vec_IntEntryP(vHadds, 2*i);
140 Vec_BitWriteEntry( vMap, pSigs[0], 1 );
141 Vec_BitWriteEntry( vMap, pSigs[1], 1 );
142 }
143 for ( i = 0; i < Vec_IntSize(vFadds)/5; i++ )
144 {
145 int * pSigs = Vec_IntEntryP(vFadds, 5*i);
146 Vec_BitWriteEntry( vMap, pSigs[3], 1 );
147 Vec_BitWriteEntry( vMap, pSigs[4], 1 );
148 }
149
151
152 // mark outputs
153 Gia_ManForEachCo( p, pObj, i )
154 Gia_ObjFanin0(pObj)->fMark0 = 1;
155
156 // collect XORs
157 vXors = Gia_AcecCollectXors( p, vMap );
158 Vec_BitFree( vMap );
159
160 printf( "Collected XORs: " );
161 Vec_IntPrint( vXors );
162
163 // mark their fanins
164 Gia_ManForEachObjVec( vXors, p, pObj, i )
165 {
166 pObj->fMark1 = 1;
167 Gia_ObjFanin0(pObj)->fMark0 = 1;
168 Gia_ObjFanin1(pObj)->fMark0 = 1;
169 }
170
171 // mark FADDs
172 for ( i = 0; i < Vec_IntSize(vFadds)/5; i++ )
173 Gia_AcecMarkFadd( p, Vec_IntEntryP(vFadds, 5*i) );
174
175 // iterate through HADDs and find those that fit in
176 while ( 1 )
177 {
178 int fChange = 0;
179 for ( i = 0; i < Vec_IntSize(vHadds)/2; i++ )
180 {
181 int * pSigs = Vec_IntEntryP(vHadds, 2*i);
182 if ( !Gia_ManObj(p, pSigs[0])->fMark0 || !Gia_ManObj(p, pSigs[1])->fMark0 )
183 continue;
184 if ( Gia_ManObj(p, pSigs[0])->fMark1 || Gia_ManObj(p, pSigs[1])->fMark1 )
185 continue;
186 Gia_AcecMarkHadd( p, pSigs );
187 fChange = 1;
188 nHadds++;
189 }
190 if ( !fChange )
191 break;
192 }
193 // print inputs to the adder network
194 Gia_ManForEachAnd( p, pObj, i )
195 if ( pObj->fMark0 && !pObj->fMark1 )
196 {
197 nSupp = Gia_ManSuppSize( p, &i, 1 );
198 nCone = Gia_ManConeSize( p, &i, 1 );
199 printf( "Node %5d : Supp = %5d. Cone = %5d.\n", i, nSupp, nCone );
200 Vec_IntPush( vNodes, i );
201 }
202 printf( "Fadds = %d. Hadds = %d. Root nodes found = %d.\n", Vec_IntSize(vFadds)/5, nHadds, Vec_IntSize(vNodes) );
203
205
206 Gia_ManForEachObjVec( vNodes, p, pObj, i )
207 pObj->fMark0 = 1;
208
209 Vec_IntFree( vFadds );
210 Vec_IntFree( vHadds );
211 Vec_IntFree( vNodes );
212}
213
214
227{
228 int fVerbose = 1;
229 int i, k, Entry;
230 Gia_Obj_t * pObj;
231 Vec_Int_t * vCutsXor2 = NULL;
232 Vec_Int_t * vFadds = Gia_ManDetectFullAdders( p, fVerbose, &vCutsXor2 );
233
234 // mark FADDs
236 for ( i = 0; i < Vec_IntSize(vFadds)/5; i++ )
237 Gia_AcecMarkFadd( p, Vec_IntEntryP(vFadds, 5*i) );
238
239 k = 0;
240 Vec_IntForEachEntry( vCutsXor2, Entry, i )
241 {
242 if ( i % 3 != 2 )
243 continue;
244 pObj = Gia_ManObj( p, Entry );
245 if ( pObj->fMark1 )
246 continue;
247 printf( "%d ", Entry );
248 }
249 printf( "\n" );
250
252
253 Vec_IntFree( vFadds );
254 Vec_IntFree( vCutsXor2 );
255}
256
260
261
263
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Gia_AcecCover(Gia_Man_t *p)
Definition acecCover.c:226
ABC_NAMESPACE_IMPL_START void Gia_AcecMark_rec(Gia_Man_t *p, int iObj, int fFirst)
DECLARATIONS ///.
Definition acecCover.c:45
void Gia_AcecExplore(Gia_Man_t *p, int fVerbose)
Definition acecCover.c:116
Vec_Int_t * Gia_AcecCollectXors(Gia_Man_t *p, Vec_Bit_t *vMap)
Definition acecCover.c:97
void Gia_AcecMarkFadd(Gia_Man_t *p, int *pSigs)
Definition acecCover.c:55
void Gia_AcecCollectXors_rec(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Bit_t *vMap, Vec_Int_t *vXors)
Definition acecCover.c:89
void Gia_AcecMarkHadd(Gia_Man_t *p, int *pSigs)
Definition acecCover.c:67
Vec_Int_t * Gia_ManDetectHalfAdders(Gia_Man_t *p, int fVerbose)
FUNCTION DEFINITIONS ///.
Definition acecFadds.c:50
Vec_Int_t * Gia_ManDetectFullAdders(Gia_Man_t *p, int fVerbose, Vec_Int_t **vCutsXor2)
Definition acecFadds.c:442
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
Cube * p
Definition exorList.c:222
int Gia_ManSuppSize(Gia_Man_t *p, int *pNodes, int nNodes)
Definition giaDfs.c:324
#define Gia_ManForEachAnd(p, pObj, i)
Definition gia.h:1214
struct Gia_Obj_t_ Gia_Obj_t
Definition gia.h:76
struct Gia_Man_t_ Gia_Man_t
Definition gia.h:96
#define Gia_ManForEachObjVec(vVec, p, pObj, i)
Definition gia.h:1194
int Gia_ManConeSize(Gia_Man_t *p, int *pNodes, int nNodes)
Definition giaDfs.c:375
#define Gia_ManForEachCo(p, pObj, i)
Definition gia.h:1236
void Gia_ManCleanMark01(Gia_Man_t *p)
Definition giaUtil.c:218
unsigned fMark1
Definition gia.h:86
unsigned fMark0
Definition gia.h:81
#define assert(ex)
Definition util_old.h:213
typedefABC_NAMESPACE_HEADER_START struct Vec_Bit_t_ Vec_Bit_t
INCLUDES ///.
Definition vecBit.h:42
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54