75 word * pData0, * pDataA0, * pDataB0;
76 word * pData1, * pDataA1, * pDataB1;
78 if ( Gia_ObjIsAnd(pObj) )
80 pData0 = Gia_ParTestObj(
p, Id );
81 pData1 = pData0 +
p->iData;
82 if ( Gia_ObjFaninC0(pObj) )
84 pDataA1 = Gia_ParTestObj(
p, Gia_ObjFaninId0(pObj, Id) );
85 pDataA0 = pDataA1 +
p->iData;
86 if ( Gia_ObjFaninC1(pObj) )
88 pDataB1 = Gia_ParTestObj(
p, Gia_ObjFaninId1(pObj, Id) );
89 pDataB0 = pDataB1 +
p->iData;
93 pDataB0 = Gia_ParTestObj(
p, Gia_ObjFaninId1(pObj, Id) );
94 pDataB1 = pDataB0 +
p->iData;
99 pDataA0 = Gia_ParTestObj(
p, Gia_ObjFaninId0(pObj, Id) );
100 pDataA1 = pDataA0 +
p->iData;
101 if ( Gia_ObjFaninC1(pObj) )
103 pDataB1 = Gia_ParTestObj(
p, Gia_ObjFaninId1(pObj, Id) );
104 pDataB0 = pDataB1 +
p->iData;
108 pDataB0 = Gia_ParTestObj(
p, Gia_ObjFaninId1(pObj, Id) );
109 pDataB1 = pDataB0 +
p->iData;
112 for ( i = 0; i <
p->iData; i++ )
113 pData0[i] = pDataA0[i] | pDataB0[i], pData1[i] = pDataA1[i] & pDataB1[i];
115 else if ( Gia_ObjIsCo(pObj) )
117 pData0 = Gia_ParTestObj(
p, Id );
118 pData1 = pData0 +
p->iData;
119 if ( Gia_ObjFaninC0(pObj) )
121 pDataA1 = Gia_ParTestObj(
p, Gia_ObjFaninId0(pObj, Id) );
122 pDataA0 = pDataA1 +
p->iData;
126 pDataA0 = Gia_ParTestObj(
p, Gia_ObjFaninId0(pObj, Id) );
127 pDataA1 = pDataA0 +
p->iData;
129 for ( i = 0; i <
p->iData; i++ )
130 pData0[i] = pDataA0[i], pData1[i] = pDataA1[i];
132 else if ( Gia_ObjIsCi(pObj) )
134 if ( Gia_ObjIsPi(
p, pObj) )
136 pData0 = Gia_ParTestObj(
p, Id );
137 pData1 = pData0 +
p->iData;
138 for ( i = 0; i <
p->iData; i++ )
143 int Id2 = Gia_ObjId(
p, Gia_ObjRoToRi(
p, pObj));
144 pData0 = Gia_ParTestObj(
p, Id );
145 pData1 = pData0 +
p->iData;
146 pDataA0 = Gia_ParTestObj(
p, Id2 );
147 pDataA1 = pDataA0 +
p->iData;
148 for ( i = 0; i <
p->iData; i++ )
149 pData0[i] = pDataA0[i], pData1[i] = pDataA1[i];
152 else if ( Gia_ObjIsConst0(pObj) )
154 pData0 = Gia_ParTestObj(
p, Id );
155 pData1 = pData0 +
p->iData;
156 for ( i = 0; i <
p->iData; i++ )
157 pData0[i] = ~(
word)0, pData1[i] = 0;
201 word * pData0, * pData1;
203 Vec_IntClear( vInit );
206 pData0 = Gia_ParTestObj(
p, Gia_ObjId(
p, pObj) );
207 pData1 = pData0 +
p->iData;
208 for ( i = 0; i <
p->iData; i++ )
209 assert( (pData0[i] & pData1[i]) == 0 );
210 if ( Abc_InfoHasBit( (
unsigned *)pData0, iPat ) )
211 Vec_IntPush( vInit, 0 );
212 else if ( Abc_InfoHasBit( (
unsigned *)pData1, iPat ) )
213 Vec_IntPush( vInit, 1 );
215 Vec_IntPush( vInit, 2 );
219 pData0 = Gia_ParTestObj(
p, Gia_ObjId(
p, pObj) );
220 pData1 = pData0 +
p->iData;
221 for ( i = 0; i <
p->iData; i++ )
222 assert( (pData0[i] & pData1[i]) == 0 );
223 if ( Abc_InfoHasBit( (
unsigned *)pData0, iPat ) )
224 Vec_IntPush( vInputs, 0 );
225 else if ( Abc_InfoHasBit( (
unsigned *)pData1, iPat ) )
226 Vec_IntPush( vInputs, 1 );
228 Vec_IntPush( vInputs, 2 );
235 int nFrames = Vec_IntSize(vInputs) / Gia_ManPiNum(
p);
237 assert( Vec_IntSize(vInputs) % Gia_ManPiNum(
p) == 0 );
238 assert( Vec_IntSize(vInit0) == Gia_ManRegNum(
p) );
239 assert( Vec_IntSize(vInit) == Gia_ManRegNum(
p) );
240 Gia_ManConst0(
p)->fMark0 = 0;
242 pObj->
fMark0 = Vec_IntEntry(vInit0, i);
243 for ( f = 0; f < nFrames; f++ )
246 pObj->
fMark0 = Vec_IntEntry(vInputs, iBit++);
248 pObj->
fMark0 = (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) &
249 (Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj));
251 pObj->
fMark0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
255 assert( iBit == Vec_IntSize(vInputs) );
256 vRes = Vec_IntAlloc( Gia_ManRegNum(
p) );
258 assert( Vec_IntEntry(vInit, i) == 2 || Vec_IntEntry(vInit, i) == (
int)pObj->
fMark0 );
260 Vec_IntPush( vRes, pObj->
fMark0 | (Vec_IntEntry(vInit, i) != 2 ? 4 : 0) );
281 int i, f, iPat, Cost, Cost0;
282 abctime clk, clkTotal = Abc_Clock();
285 printf(
"Running with %d frames, %d words, and %sgiven init state.\n", nFrames,
nWords, vInit0 ?
"":
"no " );
286 vInit = Vec_IntAlloc(0); Vec_IntFill( vInit, Gia_ManRegNum(
p), 2 );
287 vInputs = Vec_IntStart( Gia_ManPiNum(
p) * nFrames );
292 Cost0 += ((iPat >> 1) & 1);
294 printf(
"Frame =%6d : Values =%6d (out of %6d)\n", 0, Cost0, Cost0 );
295 for ( f = 0; f < nFrames; f++ )
304 printf(
"Frame =%6d : Values =%6d (out of %6d) ", f+1, Cost, Cost0 );
306 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
308 Gia_ParTestFree(
p );
310 Vec_IntFreeP( &vInit );
311 Vec_IntFreeP( &vInputs );
312 printf(
"After %d frames, found a sequence to produce %d x-values (out of %d). ", f, Cost, Gia_ManRegNum(
p) );
313 Abc_PrintTime( 1,
"Total runtime", Abc_Clock() - clkTotal );
Vec_Int_t * Gia_ManInseTest(Gia_Man_t *p, Vec_Int_t *vInit0, int nFrames, int nWords, int nTimeOut, int fSim, int fVerbose)