ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
nwkAig.c
Go to the documentation of this file.
1
20
21#include "nwk.h"
22
24
25
29
33
46{
47 Nwk_Man_t * pNtk;
48 Aig_Obj_t * pObj;
49 int i;
50 pNtk = Nwk_ManAlloc();
51 pNtk->nFanioPlus = 0;
52 Hop_ManStop( pNtk->pManHop );
53 pNtk->pManHop = NULL;
54 pNtk->pName = Abc_UtilStrsav( p->pName );
55 pNtk->pSpec = Abc_UtilStrsav( p->pSpec );
56 pObj = Aig_ManConst1(p);
57 pObj->pData = Nwk_ManCreateNode( pNtk, 0, pObj->nRefs );
58 Aig_ManForEachCi( p, pObj, i )
59 pObj->pData = Nwk_ManCreateCi( pNtk, pObj->nRefs );
60 Aig_ManForEachNode( p, pObj, i )
61 {
62 pObj->pData = Nwk_ManCreateNode( pNtk, 2, pObj->nRefs );
63 Nwk_ObjAddFanin( (Nwk_Obj_t *)pObj->pData, (Nwk_Obj_t *)Aig_ObjFanin0(pObj)->pData );
64 Nwk_ObjAddFanin( (Nwk_Obj_t *)pObj->pData, (Nwk_Obj_t *)Aig_ObjFanin1(pObj)->pData );
65 }
66 Aig_ManForEachCo( p, pObj, i )
67 {
68 pObj->pData = Nwk_ManCreateCo( pNtk );
69 Nwk_ObjAddFanin( (Nwk_Obj_t *)pObj->pData, (Nwk_Obj_t *)Aig_ObjFanin0(pObj)->pData );
70 }
71 return pNtk;
72}
73
85Vec_Ptr_t * Nwk_ManDeriveRetimingCut( Aig_Man_t * p, int fForward, int fVerbose )
86{
87 Vec_Ptr_t * vNodes;
88 Nwk_Man_t * pNtk;
89 Nwk_Obj_t * pNode;
90 Aig_Obj_t * pObj;
91 int i;
92 pNtk = Nwk_ManDeriveFromAig( p );
93 if ( fForward )
94 vNodes = Nwk_ManRetimeCutForward( pNtk, Aig_ManRegNum(p), fVerbose );
95 else
96 vNodes = Nwk_ManRetimeCutBackward( pNtk, Aig_ManRegNum(p), fVerbose );
97 Aig_ManForEachObj( p, pObj, i )
98 ((Nwk_Obj_t *)pObj->pData)->pCopy = pObj;
99 Vec_PtrForEachEntry( Nwk_Obj_t *, vNodes, pNode, i )
100 Vec_PtrWriteEntry( vNodes, i, pNode->pCopy );
101 Nwk_ManFree( pNtk );
102// assert( Vec_PtrSize(vNodes) <= Aig_ManRegNum(p) );
103 return vNodes;
104}
105
106
108
109#include "proof/abs/abs.h"
110
112
124void Nwk_ManColleacReached_rec( Gia_Man_t * p, Gia_Obj_t * pObj, Vec_Int_t * vNodes, Vec_Int_t * vLeaves )
125{
126 if ( Gia_ObjIsTravIdCurrent(p, pObj) )
127 return;
128 Gia_ObjSetTravIdCurrent(p, pObj);
129 if ( Gia_ObjIsCi(pObj) )
130 {
131 Vec_IntPush( vLeaves, Gia_ObjId(p, pObj) );
132 return;
133 }
134 assert( Gia_ObjIsAnd(pObj) );
135 Nwk_ManColleacReached_rec( p, Gia_ObjFanin0(pObj), vNodes, vLeaves );
136 Nwk_ManColleacReached_rec( p, Gia_ObjFanin1(pObj), vNodes, vLeaves );
137 Vec_IntPush( vNodes, Gia_ObjId(p, pObj) );
138}
139
140
152Nwk_Man_t * Nwk_ManCreateFromGia( Gia_Man_t * p, Vec_Int_t * vPPis, Vec_Int_t * vNodes, Vec_Int_t * vLeaves, Vec_Int_t ** pvMapInv )
153{
154 Nwk_Man_t * pNtk;
155 Nwk_Obj_t ** ppCopies;
156 Gia_Obj_t * pObj;
157 Vec_Int_t * vMaps;
158 int i;
159// assert( Vec_IntSize(vLeaves) >= Vec_IntSize(vPPis) );
161 pNtk = Nwk_ManAlloc();
162 pNtk->pName = Abc_UtilStrsav( p->pName );
163 pNtk->nFanioPlus = 0;
164 Hop_ManStop( pNtk->pManHop );
165 pNtk->pManHop = NULL;
166 // allocate
167 vMaps = Vec_IntAlloc( Vec_IntSize(vNodes) + Abc_MaxInt(Vec_IntSize(vPPis), Vec_IntSize(vLeaves)) + 1 );
168 ppCopies = ABC_ALLOC( Nwk_Obj_t *, Gia_ManObjNum(p) );
169 // copy objects
170 pObj = Gia_ManConst0(p);
171// ppCopies[Gia_ObjId(p,pObj)] = Nwk_ManCreateNode( pNtk, 0, Gia_ObjRefNum(p,pObj) );
172 ppCopies[Gia_ObjId(p,pObj)] = Nwk_ManCreateNode( pNtk, 0, Gia_ObjRefNum(p,pObj) + (Vec_IntSize(vLeaves) > Vec_IntSize(vPPis) ? Vec_IntSize(vLeaves) - Vec_IntSize(vPPis) : 0) );
173 Vec_IntPush( vMaps, Gia_ObjId(p,pObj) );
174 Gia_ManForEachObjVec( vLeaves, p, pObj, i )
175 {
176 ppCopies[Gia_ObjId(p,pObj)] = Nwk_ManCreateCi( pNtk, Gia_ObjRefNum(p,pObj) );
177 assert( Vec_IntSize(vMaps) == Nwk_ObjId(ppCopies[Gia_ObjId(p,pObj)]) );
178 Vec_IntPush( vMaps, Gia_ObjId(p,pObj) );
179 }
180 for ( i = Vec_IntSize(vLeaves); i < Vec_IntSize(vPPis); i++ )
181 {
182 Nwk_ManCreateCi( pNtk, 0 );
183 Vec_IntPush( vMaps, -1 );
184 }
185 Gia_ManForEachObjVec( vNodes, p, pObj, i )
186 {
187 ppCopies[Gia_ObjId(p,pObj)] = Nwk_ManCreateNode( pNtk, 2, Gia_ObjRefNum(p,pObj) );
188 Nwk_ObjAddFanin( ppCopies[Gia_ObjId(p,pObj)], ppCopies[Gia_ObjFaninId0p(p,pObj)] );
189 Nwk_ObjAddFanin( ppCopies[Gia_ObjId(p,pObj)], ppCopies[Gia_ObjFaninId1p(p,pObj)] );
190 assert( Vec_IntSize(vMaps) == Nwk_ObjId(ppCopies[Gia_ObjId(p,pObj)]) );
191 Vec_IntPush( vMaps, Gia_ObjId(p,pObj) );
192 }
193 Gia_ManForEachObjVec( vPPis, p, pObj, i )
194 {
195 assert( ppCopies[Gia_ObjId(p,pObj)] != NULL );
196 Nwk_ObjAddFanin( Nwk_ManCreateCo(pNtk), ppCopies[Gia_ObjId(p,pObj)] );
197 }
198 for ( i = Vec_IntSize(vPPis); i < Vec_IntSize(vLeaves); i++ )
199 Nwk_ObjAddFanin( Nwk_ManCreateCo(pNtk), ppCopies[0] );
200 assert( Vec_IntSize(vMaps) == Vec_IntSize(vNodes) + Abc_MaxInt(Vec_IntSize(vPPis), Vec_IntSize(vLeaves)) + 1 );
201 ABC_FREE( ppCopies );
202 *pvMapInv = vMaps;
203 return pNtk;
204}
205
206
218void Nwk_ManDeriveMinCut( Gia_Man_t * p, int fVerbose )
219{
220 Nwk_Man_t * pNtk;
221 Nwk_Obj_t * pNode;
222 Vec_Ptr_t * vMinCut;
223 Vec_Int_t * vPPis, * vNodes, * vLeaves, * vNodes2, * vLeaves2, * vMapInv;
224 Vec_Int_t * vCommon, * vDiff0, * vDiff1;
225 Gia_Obj_t * pObj;
226 int i, iObjId;
227 // get inputs
228 Gia_ManGlaCollect( p, p->vGateClasses, NULL, &vPPis, NULL, NULL );
229 // collect nodes rechable from PPIs
230 vNodes = Vec_IntAlloc( 100 );
231 vLeaves = Vec_IntAlloc( 100 );
233 Gia_ManForEachObjVec( vPPis, p, pObj, i )
234 Nwk_ManColleacReached_rec( p, pObj, vNodes, vLeaves );
235 // derive the new network
236 pNtk = Nwk_ManCreateFromGia( p, vPPis, vNodes, vLeaves, &vMapInv );
237 assert( Nwk_ManPiNum(pNtk) == Nwk_ManPoNum(pNtk) );
238 // create min-cut
239 vMinCut = Nwk_ManRetimeCutBackward( pNtk, Nwk_ManPiNum(pNtk), fVerbose );
240 // copy from the GIA back
241// Aig_ManForEachObj( p, pObj, i )
242// ((Nwk_Obj_t *)pObj->pData)->pCopy = pObj;
243 // mark min-cut nodes
244 vNodes2 = Vec_IntAlloc( 100 );
245 vLeaves2 = Vec_IntAlloc( 100 );
247 Vec_PtrForEachEntry( Nwk_Obj_t *, vMinCut, pNode, i )
248 {
249 pObj = Gia_ManObj( p, Vec_IntEntry(vMapInv, Nwk_ObjId(pNode)) );
250 if ( Gia_ObjIsConst0(pObj) )
251 continue;
252 Nwk_ManColleacReached_rec( p, pObj, vNodes2, vLeaves2 );
253 }
254 if ( fVerbose )
255 printf( "Min-cut: %d -> %d. Nodes %d -> %d. ", Vec_IntSize(vPPis)+1, Vec_PtrSize(vMinCut), Vec_IntSize(vNodes), Vec_IntSize(vNodes2) );
256 Vec_IntFree( vPPis );
257 Vec_PtrFree( vMinCut );
258 Vec_IntFree( vMapInv );
259 Nwk_ManFree( pNtk );
260
261 // sort the results
262 Vec_IntSort( vNodes, 0 );
263 Vec_IntSort( vNodes2, 0 );
264 vCommon = Vec_IntAlloc( Vec_IntSize(vNodes) );
265 vDiff0 = Vec_IntAlloc( 100 );
266 vDiff1 = Vec_IntAlloc( 100 );
267 Vec_IntTwoSplit( vNodes, vNodes2, vCommon, vDiff0, vDiff1 );
268 if ( fVerbose )
269 printf( "Common = %d. Diff0 = %d. Diff1 = %d.\n", Vec_IntSize(vCommon), Vec_IntSize(vDiff0), Vec_IntSize(vDiff1) );
270
271 // fill in
272 Vec_IntForEachEntry( vDiff0, iObjId, i )
273 Vec_IntWriteEntry( p->vGateClasses, iObjId, 1 );
274
275 Vec_IntFree( vLeaves );
276 Vec_IntFree( vNodes );
277 Vec_IntFree( vLeaves2 );
278 Vec_IntFree( vNodes2 );
279
280 Vec_IntFree( vCommon );
281 Vec_IntFree( vDiff0 );
282 Vec_IntFree( vDiff1 );
283
284 // check abstraction
285 Gia_ManForEachObj( p, pObj, i )
286 {
287 if ( Vec_IntEntry( p->vGateClasses, i ) == 0 )
288 continue;
289 assert( Gia_ObjIsConst0(pObj) || Gia_ObjIsRo(p, pObj) || Gia_ObjIsAnd(pObj) );
290 }
291}
292
296
297
299
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Gia_ManGlaCollect(Gia_Man_t *p, Vec_Int_t *vGateClasses, Vec_Int_t **pvPis, Vec_Int_t **pvPPis, Vec_Int_t **pvFlops, Vec_Int_t **pvNodes)
Definition absDup.c:158
#define Aig_ManForEachObj(p, pObj, i)
Definition aig.h:403
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
Definition aig.h:393
struct Aig_Obj_t_ Aig_Obj_t
Definition aig.h:51
#define Aig_ManForEachNode(p, pObj, i)
Definition aig.h:413
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
Definition aig.h:50
#define Aig_ManForEachCo(p, pObj, i)
Definition aig.h:398
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
Cube * p
Definition exorList.c:222
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
void Gia_ManCreateRefs(Gia_Man_t *p)
Definition giaUtil.c:779
void Gia_ManIncrementTravId(Gia_Man_t *p)
Definition giaUtil.c:190
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
Definition gia.h:1190
void Hop_ManStop(Hop_Man_t *p)
Definition hopMan.c:84
ABC_DLL void Nwk_ManFree(Nwk_Man_t *p)
Definition nwkMan.c:71
struct Nwk_Man_t_ Nwk_Man_t
Definition ntlnwk.h:41
void Nwk_ManDeriveMinCut(Gia_Man_t *p, int fVerbose)
Definition nwkAig.c:218
Nwk_Man_t * Nwk_ManCreateFromGia(Gia_Man_t *p, Vec_Int_t *vPPis, Vec_Int_t *vNodes, Vec_Int_t *vLeaves, Vec_Int_t **pvMapInv)
Definition nwkAig.c:152
Vec_Ptr_t * Nwk_ManDeriveRetimingCut(Aig_Man_t *p, int fForward, int fVerbose)
FUNCTION DECLARATIONS ///.
Definition nwkAig.c:85
ABC_NAMESPACE_IMPL_START Nwk_Man_t * Nwk_ManDeriveFromAig(Aig_Man_t *p)
DECLARATIONS ///.
Definition nwkAig.c:45
ABC_NAMESPACE_IMPL_END ABC_NAMESPACE_IMPL_START void Nwk_ManColleacReached_rec(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vNodes, Vec_Int_t *vLeaves)
Definition nwkAig.c:124
ABC_DLL Nwk_Obj_t * Nwk_ManCreateNode(Nwk_Man_t *pMan, int nFanins, int nFanouts)
Definition nwkObj.c:134
ABC_DLL Vec_Ptr_t * Nwk_ManRetimeCutBackward(Nwk_Man_t *pMan, int nLatches, int fVerbose)
Definition nwkFlow.c:523
ABC_DLL int Nwk_ManPiNum(Nwk_Man_t *pNtk)
Definition nwkUtil.c:115
ABC_DLL Nwk_Obj_t * Nwk_ManCreateCi(Nwk_Man_t *pMan, int nFanouts)
Definition nwkObj.c:70
ABC_DLL Nwk_Obj_t * Nwk_ManCreateCo(Nwk_Man_t *pMan)
Definition nwkObj.c:92
typedefABC_NAMESPACE_HEADER_START struct Nwk_Obj_t_ Nwk_Obj_t
INCLUDES ///.
Definition nwk.h:49
ABC_DLL Nwk_Man_t * Nwk_ManAlloc()
DECLARATIONS ///.
Definition nwkMan.c:45
ABC_DLL void Nwk_ObjAddFanin(Nwk_Obj_t *pObj, Nwk_Obj_t *pFanin)
Definition nwkFanio.c:165
ABC_DLL int Nwk_ManPoNum(Nwk_Man_t *pNtk)
Definition nwkUtil.c:135
ABC_DLL Vec_Ptr_t * Nwk_ManRetimeCutForward(Nwk_Man_t *pMan, int nLatches, int fVerbose)
Definition nwkFlow.c:442
unsigned int nRefs
Definition aig.h:81
void * pData
Definition aig.h:87
char * pName
Definition nwk.h:64
int nFanioPlus
Definition nwk.h:71
Hop_Man_t * pManHop
Definition nwk.h:73
char * pSpec
Definition nwk.h:65
#define assert(ex)
Definition util_old.h:213
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
Definition vecPtr.h:42
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
Definition vecPtr.h:55