ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
acbTest.c
Go to the documentation of this file.
1
20
21#include "acb.h"
22#include "aig/saig/saig.h"
23#include "aig/gia/giaAig.h"
24#include "base/abc/abc.h"
25#include "proof/fraig/fraig.h"
26#include "misc/util/utilTruth.h"
27
29
33
34static int fForceZero = 0;
35
39
52{
53 int i, j, n, nWords = 500;
54 Vec_Wrd_t * vSimsF, * vSimsG;
55 Abc_Random(1);
56 Vec_WrdFreeP( &pF->vSimsPi );
57 Vec_WrdFreeP( &pG->vSimsPi );
58 pF->vSimsPi = Vec_WrdStartRandom( Gia_ManCiNum(pF) * nWords );
59 pG->vSimsPi = Vec_WrdDup( pF->vSimsPi );
60 vSimsF = Gia_ManSimPatSim( pF );
61 vSimsG = Gia_ManSimPatSim( pG );
62 assert( Gia_ManObjNum(pF) * nWords == Vec_WrdSize(vSimsF) );
63 for ( i = 0; i < Gia_ManCoNum(pF)/2; i++ )
64 {
65 Gia_Obj_t * pObjFb = Gia_ManCo( pF, 2*i+0 );
66 Gia_Obj_t * pObjFx = Gia_ManCo( pF, 2*i+1 );
67 Gia_Obj_t * pObjGb = Gia_ManCo( pG, 2*i+0 );
68 Gia_Obj_t * pObjGx = Gia_ManCo( pG, 2*i+1 );
69 word * pSimFb = Vec_WrdEntryP(vSimsF, Gia_ObjId(pF, pObjFb)*nWords);
70 word * pSimFx = Vec_WrdEntryP(vSimsF, Gia_ObjId(pF, pObjFx)*nWords);
71 word * pSimGb = Vec_WrdEntryP(vSimsG, Gia_ObjId(pG, pObjGb)*nWords);
72 word * pSimGx = Vec_WrdEntryP(vSimsG, Gia_ObjId(pG, pObjGx)*nWords);
73
74 int nBitsFx = Abc_TtCountOnesVec(pSimFx, nWords);
75 int nBitsF1 = Abc_TtCountOnesVecMask(pSimFx, pSimFb, nWords, 1);
76 int nBitsF0 = nWords*64 - nBitsFx - nBitsF1;
77
78 int nBitsGx = Abc_TtCountOnesVec(pSimGx, nWords);
79 int nBitsG1 = Abc_TtCountOnesVecMask(pSimGx, pSimGb, nWords, 1);
80 int nBitsG0 = nWords*64 - nBitsGx - nBitsG1;
81
82 printf( "Output %4d : ", i );
83
84 printf( " RF : " );
85 printf( "0 =%7.3f %% ", 100.0*nBitsF0/64/nWords );
86 printf( "1 =%7.3f %% ", 100.0*nBitsF1/64/nWords );
87 printf( "X =%7.3f %% ", 100.0*nBitsFx/64/nWords );
88
89 printf( " GF : " );
90 printf( "0 =%7.3f %% ", 100.0*nBitsG0/64/nWords );
91 printf( "1 =%7.3f %% ", 100.0*nBitsG1/64/nWords );
92 printf( "X =%7.3f %% ", 100.0*nBitsGx/64/nWords );
93
94 printf( "\n" );
95 if ( i == 20 )
96 break;
97 }
98
99 printf( "\n" );
100 for ( j = 0; j < 20; j++ )
101 {
102 for ( n = 0; n < 2; n++ )
103 {
104 for ( i = 0; i < Gia_ManCoNum(pF)/2; i++ )
105 {
106 Gia_Obj_t * pObjFb = Gia_ManCo( pF, 2*i+0 );
107 Gia_Obj_t * pObjFx = Gia_ManCo( pF, 2*i+1 );
108 Gia_Obj_t * pObjGb = Gia_ManCo( pG, 2*i+0 );
109 Gia_Obj_t * pObjGx = Gia_ManCo( pG, 2*i+1 );
110 word * pSimFb = Vec_WrdEntryP(vSimsF, Gia_ObjId(pF, pObjFb)*nWords);
111 word * pSimFx = Vec_WrdEntryP(vSimsF, Gia_ObjId(pF, pObjFx)*nWords);
112 word * pSimGb = Vec_WrdEntryP(vSimsG, Gia_ObjId(pG, pObjGb)*nWords);
113 word * pSimGx = Vec_WrdEntryP(vSimsG, Gia_ObjId(pG, pObjGx)*nWords);
114 word * pSimb = n ? pSimGb : pSimFb;
115 word * pSimx = n ? pSimGx : pSimFx;
116 if ( Abc_TtGetBit(pSimx, j) )
117 printf( "x" );
118 else if ( Abc_TtGetBit(pSimb, j) )
119 printf( "1" );
120 else
121 printf( "0" );
122 }
123 printf( "\n" );
124 }
125 printf( "\n" );
126 }
127
128 Vec_WrdFree( vSimsF );
129 Vec_WrdFree( vSimsG );
130 printf( "\n" );
131}
132
144void Gia_ManDualNot( Gia_Man_t * p, int LitA[2], int LitZ[2] )
145{
146 LitZ[0] = Abc_LitNot(LitA[0]);
147 LitZ[1] = LitA[1];
148
149 if ( fForceZero ) LitZ[0] = Gia_ManHashAnd( p, LitZ[0], Abc_LitNot(LitZ[1]) );
150}
151// computes Z = XOR(A, B) where A, B, Z belong to {0,1,x} encoded as 0=00, 1=01, x=1-
152void Gia_ManDualXor2( Gia_Man_t * p, int LitA[2], int LitB[2], int LitZ[2] )
153{
154 LitZ[0] = Gia_ManHashXor( p, LitA[0], LitB[0] );
155 LitZ[1] = Gia_ManHashOr( p, LitA[1], LitB[1] );
156
157 if ( fForceZero ) LitZ[0] = Gia_ManHashAnd( p, LitZ[0], Abc_LitNot(LitZ[1]) );
158}
159void Gia_ManDualXorN( Gia_Man_t * p, int * pLits, int n, int LitZ[2] )
160{
161 int i;
162 LitZ[0] = 0;
163 LitZ[1] = 0;
164 for ( i = 0; i < n; i++ )
165 {
166 LitZ[0] = Gia_ManHashXor( p, LitZ[0], pLits[2*i] );
167 LitZ[1] = Gia_ManHashOr ( p, LitZ[1], pLits[2*i+1] );
168 }
169}
170// computes Z = AND(A, B) where A, B, Z belong to {0,1,x} encoded as 0=00, 1=01, z=1-
171void Gia_ManDualAnd2( Gia_Man_t * p, int LitA[2], int LitB[2], int LitZ[2] )
172{
173 int ZeroA = Gia_ManHashAnd( p, Abc_LitNot(LitA[0]), Abc_LitNot(LitA[1]) );
174 int ZeroB = Gia_ManHashAnd( p, Abc_LitNot(LitB[0]), Abc_LitNot(LitB[1]) );
175 int ZeroZ = Gia_ManHashOr( p, ZeroA, ZeroB );
176 LitZ[0] = Gia_ManHashAnd( p, LitA[0], LitB[0] );
177 LitZ[1] = Gia_ManHashAnd( p, Gia_ManHashOr( p, LitA[1], LitB[1] ), Abc_LitNot(ZeroZ) );
178
179 //LitZ[0] = Gia_ManHashAnd( p, Gia_ManHashAnd(p, LitA[0], Abc_LitNot(LitA[1])), Gia_ManHashAnd(p, LitB[0], Abc_LitNot(LitB[1])) );
180 //LitZ[1] = Gia_ManHashAnd( p, Gia_ManHashOr(p, LitA[0], LitA[1]), Gia_ManHashOr(p, LitB[0], LitB[1]) );
181 //LitZ[1] = Gia_ManHashAnd( p, LitZ[1], Abc_LitNot(LitZ[0]) );
182}
183void Gia_ManDualAndN( Gia_Man_t * p, int * pLits, int n, int LitZ[2] )
184{
185 int i, LitZero = 0, LitOne = 0;
186 LitZ[0] = 1;
187 for ( i = 0; i < n; i++ )
188 {
189 int Lit = Gia_ManHashAnd( p, Abc_LitNot(pLits[2*i]), Abc_LitNot(pLits[2*i+1]) );
190 LitZero = Gia_ManHashOr( p, LitZero, Lit );
191 LitOne = Gia_ManHashOr( p, LitOne, pLits[2*i+1] );
192 LitZ[0] = Gia_ManHashAnd( p, LitZ[0], pLits[2*i] );
193 }
194 LitZ[1] = Gia_ManHashAnd( p, LitOne, Abc_LitNot(LitZero) );
195
196 if ( fForceZero ) LitZ[0] = Gia_ManHashAnd( p, LitZ[0], Abc_LitNot(LitZ[1]) );
197}
198/*
199module _DC(O, C, D);
200 output O;
201 input C, D;
202 assign O = D ? 1'bx : C;
203endmodule
204*/
205void Gia_ManDualDc( Gia_Man_t * p, int LitC[2], int LitD[2], int LitZ[2] )
206{
207 LitZ[0] = LitC[0];
208// LitZ[0] = Gia_ManHashMux( p, LitD[0], 0, LitC[0] );
209 LitZ[1] = Gia_ManHashOr(p, Gia_ManHashOr(p,LitD[0],LitD[1]), LitC[1] );
210
211 if ( fForceZero ) LitZ[0] = Gia_ManHashAnd( p, LitZ[0], Abc_LitNot(LitZ[1]) );
212}
213void Gia_ManDualMux( Gia_Man_t * p, int LitC[2], int LitT[2], int LitE[2], int LitZ[2] )
214{
215/*
216 // total logic size: 18 nodes
217 int Xnor = Gia_ManHashXor( p, Abc_LitNot(LitT[0]), LitE[0] );
218 int Cond = Gia_ManHashAnd( p, Abc_LitNot(LitT[1]), Abc_LitNot(LitE[1]) );
219 int pTempE[2], pTempT[2];
220 pTempE[0] = Gia_ManHashMux( p, LitC[0], LitT[0], LitE[0] );
221 pTempE[1] = Gia_ManHashMux( p, LitC[0], LitT[1], LitE[1] );
222 //pTempT[0] = LitT[0];
223 pTempT[0] = Gia_ManHashAnd( p, LitT[0], LitE[0] );
224 pTempT[1] = Gia_ManHashAnd( p, Cond, Xnor );
225 LitZ[0] = Gia_ManHashMux( p, LitC[1], pTempT[0], pTempE[0] );
226 LitZ[1] = Gia_ManHashMux( p, LitC[1], pTempT[1], pTempE[1] );
227*/
228 // total logic size: 14 nodes
229 int Xnor = Gia_ManHashXor( p, Abc_LitNot(LitT[0]), LitE[0] );
230 int Cond = Gia_ManHashAnd( p, Abc_LitNot(LitT[1]), Abc_LitNot(LitE[1]) );
231 int XVal1 = Abc_LitNot( Gia_ManHashAnd( p, Cond, Xnor ) );
232 int XVal0 = Gia_ManHashMux( p, LitC[0], LitT[1], LitE[1] );
233 LitZ[0] = Gia_ManHashMux( p, LitC[0], LitT[0], LitE[0] );
234 LitZ[1] = Gia_ManHashMux( p, LitC[1], XVal1, XVal0 );
235
236 if ( fForceZero ) LitZ[0] = Gia_ManHashAnd( p, LitZ[0], Abc_LitNot(LitZ[1]) );
237}
238int Gia_ManDualCompare( Gia_Man_t * p, int LitF[2], int LitS[2] )
239{
240 int iMiter = Gia_ManHashXor( p, LitF[0], LitS[0] );
241 iMiter = Gia_ManHashOr( p, LitF[1], iMiter );
242 iMiter = Gia_ManHashAnd( p, Abc_LitNot(LitS[1]), iMiter );
243 return iMiter;
244}
245
257void Acb_ObjToGiaDual( Gia_Man_t * pNew, Acb_Ntk_t * p, int iObj, Vec_Int_t * vTemp, Vec_Int_t * vCopies, int pRes[2] )
258{
259 //char * pName = Abc_NamStr( p->pDesign->pStrs, Acb_ObjName(p, iObj) );
260 int * pFanin, iFanin, k, Type;
261 assert( !Acb_ObjIsCio(p, iObj) );
262 Vec_IntClear( vTemp );
263 Acb_ObjForEachFaninFast( p, iObj, pFanin, iFanin, k )
264 {
265 int * pLits = Vec_IntEntryP( vCopies, 2*iFanin );
266 assert( pLits[0] >= 0 && pLits[1] >= 0 );
267 Vec_IntPushTwo( vTemp, pLits[0], pLits[1] );
268 }
269 Type = Acb_ObjType( p, iObj );
270 if ( Type == ABC_OPER_CONST_F )
271 {
272 pRes[0] = 0;
273 pRes[1] = 0;
274 return;
275 }
276 if ( Type == ABC_OPER_CONST_T )
277 {
278 pRes[0] = 1;
279 pRes[1] = 0;
280 return;
281 }
282 if ( Type == ABC_OPER_CONST_X )
283 {
284 pRes[0] = 0;
285 pRes[1] = 1;
286 return;
287 }
288 if ( Type == ABC_OPER_BIT_BUF )
289 {
290 pRes[0] = Vec_IntEntry(vTemp, 0);
291 pRes[1] = Vec_IntEntry(vTemp, 1);
292 return;
293 }
294 if ( Type == ABC_OPER_BIT_INV )
295 {
296 Gia_ManDualNot( pNew, Vec_IntArray(vTemp), pRes );
297 return;
298 }
299 if ( Type == ABC_OPER_TRI )
300 {
301 // in the file inputs are ordered as follows: _DC \n6_5[9] ( .O(\108 ), .C(\96 ), .D(\107 ));
302 // in this code, we expect them as follows: void Gia_ManDualDc( Gia_Man_t * p, int LitC[2], int LitD[2], int LitZ[2] )
303 assert( Vec_IntSize(vTemp) == 4 );
304 Gia_ManDualDc( pNew, Vec_IntArray(vTemp), Vec_IntArray(vTemp) + 2, pRes );
305 return;
306 }
307 if ( Type == ABC_OPER_BIT_MUX )
308 {
309 // in the file inputs are ordered as follows: _HMUX \U$1 ( .O(\282 ), .I0(1'b1), .I1(\277 ), .S(\281 ));
310 // in this code, we expect them as follows: void Gia_ManDualMux( Gia_Man_t * p, int LitC[2], int LitT[2], int LitE[2], int LitZ[2] )
311 assert( Vec_IntSize(vTemp) == 6 );
312 ABC_SWAP( int, Vec_IntArray(vTemp)[0], Vec_IntArray(vTemp)[4] );
313 ABC_SWAP( int, Vec_IntArray(vTemp)[1], Vec_IntArray(vTemp)[5] );
314 Gia_ManDualMux( pNew, Vec_IntArray(vTemp), Vec_IntArray(vTemp) + 2, Vec_IntArray(vTemp) + 4, pRes );
315 return;
316 }
317 if ( Type == ABC_OPER_BIT_AND || Type == ABC_OPER_BIT_NAND )
318 {
319 Gia_ManDualAndN( pNew, Vec_IntArray(vTemp), Vec_IntSize(vTemp)/2, pRes );
320 if ( Type == ABC_OPER_BIT_NAND )
321 pRes[0] = Abc_LitNot( pRes[0] );
322 return;
323 }
324 if ( Type == ABC_OPER_BIT_OR || Type == ABC_OPER_BIT_NOR )
325 {
326 int * pArray = Vec_IntArray( vTemp );
327 for ( k = 0; k < Vec_IntSize(vTemp)/2; k++ )
328 pArray[2*k] = Abc_LitNot( pArray[2*k] );
329 Gia_ManDualAndN( pNew, pArray, Vec_IntSize(vTemp)/2, pRes );
330 if ( Type == ABC_OPER_BIT_OR )
331 pRes[0] = Abc_LitNot( pRes[0] );
332 return;
333 }
334 if ( Type == ABC_OPER_BIT_XOR || Type == ABC_OPER_BIT_NXOR )
335 {
336 assert( Vec_IntSize(vTemp) == 4 );
337 Gia_ManDualXor2( pNew, Vec_IntArray(vTemp), Vec_IntArray(vTemp) + 2, pRes );
338 if ( Type == ABC_OPER_BIT_NXOR )
339 pRes[0] = Abc_LitNot( pRes[0] );
340 return;
341 }
342 assert( 0 );
343}
345{
347 Gia_Man_t * pNew, * pOne;
348 Vec_Int_t * vFanins, * vNodes;
349 Vec_Int_t * vCopies = Vec_IntStartFull( 2*Acb_NtkObjNum(p) );
350 int i, iObj, * pLits;
351 pNew = Gia_ManStart( 5 * Acb_NtkObjNum(p) );
352 pNew->pName = Abc_UtilStrsav(Acb_NtkName(p));
353 Gia_ManHashAlloc( pNew );
354 pLits = Vec_IntEntryP( vCopies, 0 );
355 pLits[0] = 0;
356 pLits[1] = 0;
357 Acb_NtkForEachCi( p, iObj, i )
358 {
359 pLits = Vec_IntEntryP( vCopies, 2*iObj );
360 pLits[0] = Gia_ManAppendCi(pNew);
361 pLits[1] = 0;
362 }
363 vFanins = Vec_IntAlloc( 4 );
364 vNodes = Acb_NtkFindNodes2( p );
365 Vec_IntForEachEntry( vNodes, iObj, i )
366 {
367 pLits = Vec_IntEntryP( vCopies, 2*iObj );
368 Acb_ObjToGiaDual( pNew, p, iObj, vFanins, vCopies, pLits );
369 }
370 Vec_IntFree( vNodes );
371 Vec_IntFree( vFanins );
372 Acb_NtkForEachCo( p, iObj, i )
373 {
374 pLits = Vec_IntEntryP( vCopies, 2*Acb_ObjFanin(p, iObj, 0) );
375 Gia_ManAppendCo( pNew, pLits[0] );
376 Gia_ManAppendCo( pNew, pLits[1] );
377 }
378 Vec_IntFree( vCopies );
379 pNew = Gia_ManCleanup( pOne = pNew );
380 Gia_ManStop( pOne );
381 return pNew;
382}
383
396{
397 Gia_Man_t * pNew, * pTemp;
398 Gia_Obj_t * pObj;
399 int i;
400 assert( Gia_ManCiNum(pOne) == Gia_ManCiNum(pTwo) );
401 assert( Gia_ManCoNum(pOne) == Gia_ManCoNum(pTwo) );
402 pNew = Gia_ManStart( Gia_ManObjNum(pOne) + Gia_ManObjNum(pTwo) + 5*Gia_ManCoNum(pOne)/2 );
403 pNew->pName = Abc_UtilStrsav( "miter" );
404 pNew->pSpec = NULL;
405 Gia_ManHashAlloc( pNew );
406 Gia_ManConst0(pOne)->Value = 0;
407 Gia_ManConst0(pTwo)->Value = 0;
408 Gia_ManForEachCi( pOne, pObj, i )
409 pObj->Value = Gia_ManAppendCi( pNew );
410 Gia_ManForEachCi( pTwo, pObj, i )
411 pObj->Value = Gia_ManCi(pOne, i)->Value;
412 Gia_ManForEachAnd( pOne, pObj, i )
413 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
414 Gia_ManForEachAnd( pTwo, pObj, i )
415 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
416 Gia_ManForEachCo( pOne, pObj, i )
417 pObj->Value = Gia_ObjFanin0Copy(pObj);
418 Gia_ManForEachCo( pTwo, pObj, i )
419 pObj->Value = Gia_ObjFanin0Copy(pObj);
420 if ( Type == 0 ) // only main circuit
421 {
422 for ( i = 0; i < Gia_ManCoNum(pOne); i += 2 )
423 {
424 unsigned pLitsF[2] = { Gia_ManCo(pOne, i)->Value, Gia_ManCo(pOne, i+1)->Value };
425 unsigned pLitsS[2] = { Gia_ManCo(pTwo, i)->Value, Gia_ManCo(pTwo, i+1)->Value };
426 Gia_ManAppendCo( pNew, pLitsF[0] );
427 Gia_ManAppendCo( pNew, pLitsS[0] );
428 }
429 }
430 else if ( Type == 1 ) // only shadow circuit
431 {
432 for ( i = 0; i < Gia_ManCoNum(pOne); i += 2 )
433 {
434 unsigned pLitsF[2] = { Gia_ManCo(pOne, i)->Value, Gia_ManCo(pOne, i+1)->Value };
435 unsigned pLitsS[2] = { Gia_ManCo(pTwo, i)->Value, Gia_ManCo(pTwo, i+1)->Value };
436 Gia_ManAppendCo( pNew, pLitsF[1] );
437 Gia_ManAppendCo( pNew, pLitsS[1] );
438 }
439 }
440 else // comparator of the two
441 {
442 for ( i = 0; i < Gia_ManCoNum(pOne); i += 2 )
443 {
444 int pLitsF[2] = { (int)Gia_ManCo(pOne, i)->Value, (int)Gia_ManCo(pOne, i+1)->Value };
445 int pLitsS[2] = { (int)Gia_ManCo(pTwo, i)->Value, (int)Gia_ManCo(pTwo, i+1)->Value };
446 Gia_ManAppendCo( pNew, Gia_ManDualCompare( pNew, pLitsF, pLitsS ) );
447 }
448 }
449 Gia_ManHashStop( pNew );
450 pNew = Gia_ManCleanup( pTemp = pNew );
451 Gia_ManStop( pTemp );
452 return pNew;
453}
454
455
467void Acb_OutputFile( char * pFileName, Acb_Ntk_t * pNtkF, int * pModel )
468{
469 const char * pFileName0 = pFileName? pFileName : "output";
470 FILE * pFile = fopen( pFileName0, "wb" );
471 if ( pFile == NULL )
472 {
473 printf( "Cannot open results file \"%s\".\n", pFileName0 );
474 return;
475 }
476 if ( pModel == NULL )
477 fprintf( pFile, "EQ\n" );
478 else
479 {
480 /*
481 NEQ
482 in 1
483 a 1
484 b 0
485 */
486 int i, iObj;
487 fprintf( pFile, "NEQ\n" );
488 Acb_NtkForEachPi( pNtkF, iObj, i )
489 fprintf( pFile, "%s %d\n", Acb_ObjNameStr(pNtkF, iObj), pModel[i] );
490 }
491 fclose( pFile );
492 printf( "Produced output file \"%s\".\n\n", pFileName0 );
493}
495{
496 extern Abc_Ntk_t * Abc_NtkFromAigPhase( Aig_Man_t * pMan );
497 Aig_Man_t * pMan = Gia_ManToAig( p, 0 );
498 Abc_Ntk_t * pNtkTemp = Abc_NtkFromAigPhase( pMan );
499 Prove_Params_t Params, * pParams = &Params;
500 Prove_ParamsSetDefault( pParams );
501 pParams->fUseRewriting = 1;
502 pParams->fVerbose = 0;
503 Aig_ManStop( pMan );
504 if ( pNtkTemp )
505 {
506 abctime clk = Abc_Clock();
507 int RetValue = Abc_NtkIvyProve( &pNtkTemp, pParams );
508 int * pModel = pNtkTemp->pModel;
509 pNtkTemp->pModel = NULL;
510 Abc_NtkDelete( pNtkTemp );
511 printf( "The networks are %s. ", RetValue == 1 ? "equivalent" : (RetValue == 0 ? "NOT equivalent" : "UNDECIDED") );
512 Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
513 if ( RetValue == 0 )
514 return pModel;
515 }
516 return NULL;
517}
518
531{
532 int iObj, nDcs = 0, nMuxes = 0;
533 Acb_NtkForEachNode( pNtk, iObj )
534 if ( Acb_ObjType( pNtk, iObj ) == ABC_OPER_TRI )
535 nDcs++;
536 else if ( Acb_ObjType( pNtk, iObj ) == ABC_OPER_BIT_MUX )
537 nMuxes++;
538
539 printf( "PI = %6d ", Acb_NtkCiNum(pNtk) );
540 printf( "PO = %6d ", Acb_NtkCoNum(pNtk) );
541 printf( "Obj = %6d ", Acb_NtkObjNum(pNtk) );
542 printf( "DC = %4d ", nDcs );
543 printf( "Mux = %4d ", nMuxes );
544 printf( "\n" );
545}
546
559{
560 int i, iObj;
561 Vec_Int_t * vMap = Vec_IntStartFull( Acb_ManNameIdMax(pNtkG->pDesign) );
562 Vec_Int_t * vOrder = Vec_IntStartFull( Acb_NtkCiNum(pNtkG) );
563 Acb_NtkForEachCi( pNtkG, iObj, i )
564 Vec_IntWriteEntry( vMap, Acb_ObjName(pNtkG, iObj), i );
565 Acb_NtkForEachCi( pNtkF, iObj, i )
566 {
567 int NameIdG = Acb_ManStrId( pNtkG->pDesign, Acb_ObjNameStr(pNtkF, iObj) );
568 int iPerm = NameIdG < Vec_IntSize(vMap) ? Vec_IntEntry( vMap, NameIdG ) : -1;
569 if ( iPerm == -1 )
570 printf( "Cannot find name \"%s\" of PI %d of F among PIs of G.\n", Acb_ObjNameStr(pNtkF, iObj), i );
571 else
572 Vec_IntWriteEntry( vOrder, iPerm, iObj );
573 }
574 Vec_IntClear( &pNtkF->vCis );
575 Vec_IntAppend( &pNtkF->vCis, vOrder );
576 Vec_IntFree( vOrder );
577 Vec_IntFree( vMap );
578}
580{
581 int i, nPis = Acb_NtkCiNum(pNtkF);
582 for ( i = 0; i < nPis; i++ )
583 {
584 char * pNameF = Acb_ObjNameStr( pNtkF, Acb_NtkCi(pNtkF, i) );
585 char * pNameG = Acb_ObjNameStr( pNtkG, Acb_NtkCi(pNtkG, i) );
586 if ( strcmp(pNameF, pNameG) )
587 {
588// printf( "PI %d has different names (%s and %s) in these networks.\n", i, pNameF, pNameG );
589 printf( "Networks have different PI names. Reordering PIs of the implementation network.\n" );
590 Acb_NtkUpdateCiOrder( pNtkF, pNtkG );
591 break;
592 }
593 }
594 if ( i == nPis )
595 printf( "Networks have the same PI names.\n" );
596 return i == nPis;
597}
598
610void Acb_NtkRunTest( char * pFileNames[4], int fFancy, int fVerbose )
611{
612 extern Acb_Ntk_t * Acb_VerilogSimpleRead( char * pFileName, char * pFileNameW );
613 extern void Gia_AigerWrite( Gia_Man_t * p, char * pFileName, int fWriteSymbols, int fCompact, int fWriteNewLine );
614
615 int fSolve = 1;
616 int * pModel = NULL;
617 Gia_Man_t * pGiaF = NULL;
618 Gia_Man_t * pGiaG = NULL;
619 Gia_Man_t * pGia = NULL;
620 Acb_Ntk_t * pNtkF = Acb_VerilogSimpleRead( pFileNames[0], NULL );
621 Acb_Ntk_t * pNtkG = Acb_VerilogSimpleRead( pFileNames[1], NULL );
622 if ( !pNtkF || !pNtkG )
623 return;
624
625 assert( Acb_NtkCiNum(pNtkF) == Acb_NtkCiNum(pNtkG) );
626 assert( Acb_NtkCoNum(pNtkF) == Acb_NtkCoNum(pNtkG) );
627
628 Acb_NtkCheckPiOrder( pNtkF, pNtkG );
629 //Acb_NtkCheckPiOrder( pNtkG, pNtkF );
630 Acb_NtkPrintCecStats( pNtkF );
631 Acb_NtkPrintCecStats( pNtkG );
632
633 pGiaF = Acb_NtkGiaDeriveDual( pNtkF );
634 pGiaG = Acb_NtkGiaDeriveDual( pNtkG );
635 pGia = Acb_NtkGiaDeriveMiter( pGiaF, pGiaG, 2 );
636 //Gia_AigerWrite( pGiaF, Extra_FileNameGenericAppend(pFileNames[1], "_f2.aig"), 0, 0, 0 );
637 //Gia_AigerWrite( pGiaG, Extra_FileNameGenericAppend(pFileNames[1], "_g2.aig"), 0, 0, 0 );
638 //Gia_AigerWrite( pGia, Extra_FileNameGenericAppend(pFileNames[1], "_miter_0.aig"), 0, 0, 0 );
639 //printf( "Written the miter info file \"%s\".\n", Extra_FileNameGenericAppend(pFileNames[1], "_miter_0.aig") );
640
641 //Gia_ManPrintStats( pGia, NULL );
642 //Gia_ManSimTry( pGiaF, pGiaG );
643
644 if ( fSolve )
645 {
646 pModel = Acb_NtkSolve( pGia );
647 Acb_OutputFile( pFileNames[2], pNtkF, pModel );
648 ABC_FREE( pModel );
649 }
650
651 Gia_ManStop( pGia );
652 Gia_ManStop( pGiaF );
653 Gia_ManStop( pGiaG );
654
655 Acb_ManFree( pNtkF->pDesign );
656 Acb_ManFree( pNtkG->pDesign );
657}
658
659
663
664
666
int nWords
Definition abcNpn.c:127
@ ABC_OPER_CONST_F
Definition abcOper.h:50
@ ABC_OPER_CONST_X
Definition abcOper.h:52
@ ABC_OPER_BIT_NAND
Definition abcOper.h:58
@ ABC_OPER_BIT_XOR
Definition abcOper.h:61
@ ABC_OPER_TRI
Definition abcOper.h:131
@ ABC_OPER_BIT_MUX
Definition abcOper.h:65
@ ABC_OPER_CONST_T
Definition abcOper.h:51
@ ABC_OPER_BIT_INV
Definition abcOper.h:56
@ ABC_OPER_BIT_AND
Definition abcOper.h:57
@ ABC_OPER_BIT_NOR
Definition abcOper.h:60
@ ABC_OPER_BIT_OR
Definition abcOper.h:59
@ ABC_OPER_BIT_BUF
Definition abcOper.h:55
@ ABC_OPER_BIT_NXOR
Definition abcOper.h:62
ABC_DLL int Abc_NtkIvyProve(Abc_Ntk_t **ppNtk, void *pPars)
Definition abcIvy.c:503
struct Abc_Ntk_t_ Abc_Ntk_t
Definition abc.h:115
ABC_DLL void Abc_NtkDelete(Abc_Ntk_t *pNtk)
Definition abcNtk.c:1421
#define ABC_SWAP(Type, a, b)
Definition abc_global.h:253
ABC_INT64_T abctime
Definition abc_global.h:332
unsigned Abc_Random(int fReset)
Definition utilSort.c:1004
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Gia_ManDualXorN(Gia_Man_t *p, int *pLits, int n, int LitZ[2])
Definition acbTest.c:159
Gia_Man_t * Acb_NtkGiaDeriveMiter(Gia_Man_t *pOne, Gia_Man_t *pTwo, int Type)
Definition acbTest.c:395
void Gia_ManDualNot(Gia_Man_t *p, int LitA[2], int LitZ[2])
Definition acbTest.c:144
void Acb_NtkPrintCecStats(Acb_Ntk_t *pNtk)
Definition acbTest.c:530
void Gia_ManDualDc(Gia_Man_t *p, int LitC[2], int LitD[2], int LitZ[2])
Definition acbTest.c:205
int * Acb_NtkSolve(Gia_Man_t *p)
Definition acbTest.c:494
int Acb_NtkCheckPiOrder(Acb_Ntk_t *pNtkF, Acb_Ntk_t *pNtkG)
Definition acbTest.c:579
void Gia_ManSimTry(Gia_Man_t *pF, Gia_Man_t *pG)
FUNCTION DEFINITIONS ///.
Definition acbTest.c:51
void Gia_ManDualAndN(Gia_Man_t *p, int *pLits, int n, int LitZ[2])
Definition acbTest.c:183
void Gia_ManDualXor2(Gia_Man_t *p, int LitA[2], int LitB[2], int LitZ[2])
Definition acbTest.c:152
void Gia_ManDualAnd2(Gia_Man_t *p, int LitA[2], int LitB[2], int LitZ[2])
Definition acbTest.c:171
void Acb_NtkUpdateCiOrder(Acb_Ntk_t *pNtkF, Acb_Ntk_t *pNtkG)
Definition acbTest.c:558
void Acb_OutputFile(char *pFileName, Acb_Ntk_t *pNtkF, int *pModel)
Definition acbTest.c:467
void Acb_NtkRunTest(char *pFileNames[4], int fFancy, int fVerbose)
Definition acbTest.c:610
void Gia_ManDualMux(Gia_Man_t *p, int LitC[2], int LitT[2], int LitE[2], int LitZ[2])
Definition acbTest.c:213
Gia_Man_t * Acb_NtkGiaDeriveDual(Acb_Ntk_t *p)
Definition acbTest.c:344
int Gia_ManDualCompare(Gia_Man_t *p, int LitF[2], int LitS[2])
Definition acbTest.c:238
void Acb_ObjToGiaDual(Gia_Man_t *pNew, Acb_Ntk_t *p, int iObj, Vec_Int_t *vTemp, Vec_Int_t *vCopies, int pRes[2])
Definition acbTest.c:257
Vec_Int_t * Acb_NtkFindNodes2(Acb_Ntk_t *p)
Definition acbUtil.c:721
Acb_Ntk_t * Acb_VerilogSimpleRead(char *pFileName, char *pFileNameW)
Definition acbFunc.c:622
#define Acb_NtkForEachCi(p, iObj, i)
Definition acb.h:336
struct Acb_Ntk_t_ Acb_Ntk_t
Definition acb.h:47
#define Acb_NtkForEachCo(p, iObj, i)
Definition acb.h:338
#define Acb_NtkForEachPi(p, iObj, i)
Definition acb.h:331
#define Acb_NtkForEachNode(p, i)
Definition acb.h:362
#define Acb_ObjForEachFaninFast(p, iObj, pFanins, iFanin, k)
Definition acb.h:375
void Aig_ManStop(Aig_Man_t *p)
Definition aigMan.c:187
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
Definition aig.h:50
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
Cube * p
Definition exorList.c:222
void Prove_ParamsSetDefault(Prove_Params_t *pParams)
FUNCTION DEFINITIONS ///.
Definition fraigMan.c:46
Aig_Man_t * Gia_ManToAig(Gia_Man_t *p, int fChoices)
Definition giaAig.c:318
ABC_NAMESPACE_IMPL_START Abc_Ntk_t * Abc_NtkFromAigPhase(Aig_Man_t *pMan)
DECLARATIONS ///.
Definition abcDar.c:595
void Gia_ManStop(Gia_Man_t *p)
Definition giaMan.c:82
#define Gia_ManForEachAnd(p, pObj, i)
Definition gia.h:1214
void Gia_ManHashAlloc(Gia_Man_t *p)
Definition giaHash.c:105
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
Definition giaMan.c:57
int Gia_ManHashOr(Gia_Man_t *p, int iLit0, int iLit1)
Definition giaHash.c:621
struct Gia_Obj_t_ Gia_Obj_t
Definition gia.h:76
int Gia_ManHashXor(Gia_Man_t *p, int iLit0, int iLit1)
Definition giaHash.c:668
struct Gia_Man_t_ Gia_Man_t
Definition gia.h:96
Vec_Wrd_t * Gia_ManSimPatSim(Gia_Man_t *p)
Definition giaSimBase.c:125
int Gia_ManHashMux(Gia_Man_t *p, int iCtrl, int iData1, int iData0)
Definition giaHash.c:692
Gia_Man_t * Gia_ManCleanup(Gia_Man_t *p)
Definition giaScl.c:84
int Gia_ManHashAnd(Gia_Man_t *p, int iLit0, int iLit1)
Definition giaHash.c:576
#define Gia_ManForEachCo(p, pObj, i)
Definition gia.h:1236
#define Gia_ManForEachCi(p, pObj, i)
Definition gia.h:1228
void Gia_ManHashStop(Gia_Man_t *p)
Definition giaHash.c:149
void Gia_AigerWrite(Gia_Man_t *p, char *pFileName, int fWriteSymbols, int fCompact, int fWriteNewLine)
Definition giaAiger.c:1595
struct Prove_ParamsStruct_t_ Prove_Params_t
Definition ivyFraig.c:108
unsigned __int64 word
DECLARATIONS ///.
Definition kitPerm.c:36
int * pModel
Definition abc.h:198
Acb_Man_t * pDesign
Definition acb.h:53
Vec_Int_t vCis
Definition acb.h:61
char * pSpec
Definition gia.h:100
Vec_Wrd_t * vSimsPi
Definition gia.h:215
char * pName
Definition gia.h:99
unsigned Value
Definition gia.h:89
#define assert(ex)
Definition util_old.h:213
int strcmp()
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.
Definition vecWrd.h:42