00001
00021 #include "fra.h"
00022
00026
00030
00042 void Fra_ManPartitionTest( Aig_Man_t * p, int nComLim )
00043 {
00044 Bar_Progress_t * pProgress;
00045 Vec_Vec_t * vSupps, * vSuppsIn;
00046 Vec_Ptr_t * vSuppsNew;
00047 Vec_Int_t * vSupNew, * vSup, * vSup2, * vTemp;
00048 Vec_Int_t * vOverNew, * vQuantNew;
00049 Aig_Obj_t * pObj;
00050 int i, k, nCommon, CountOver, CountQuant;
00051 int nTotalSupp, nTotalSupp2, Entry, Largest;
00052 double Ratio, R;
00053 int clk;
00054
00055 nTotalSupp = 0;
00056 nTotalSupp2 = 0;
00057 Ratio = 0.0;
00058
00059
00060 clk = clock();
00061 vSupps = (Vec_Vec_t *)Aig_ManSupports( p );
00062 PRT( "Supports", clock() - clk );
00063
00064 Aig_ManForEachPo( p, pObj, i )
00065 {
00066 vSup = Vec_VecEntry( vSupps, i );
00067 Vec_IntPop( vSup );
00068
00069
00070 }
00071
00072
00073 clk = clock();
00074 vSuppsIn = Vec_VecStart( Aig_ManPiNum(p) );
00075 Aig_ManForEachPo( p, pObj, i )
00076 {
00077 vSup = Vec_VecEntry( vSupps, i );
00078 Vec_IntForEachEntry( vSup, Entry, k )
00079 Vec_VecPush( vSuppsIn, Entry, (void *)i );
00080 }
00081 PRT( "Inverse ", clock() - clk );
00082
00083 clk = clock();
00084
00085 Largest = 0;
00086 vSuppsNew = Vec_PtrAlloc( Aig_ManPoNum(p) );
00087 vOverNew = Vec_IntAlloc( Aig_ManPoNum(p) );
00088 vQuantNew = Vec_IntAlloc( Aig_ManPoNum(p) );
00089 pProgress = Bar_ProgressStart( stdout, Aig_ManPoNum(p) );
00090 Aig_ManForEachPo( p, pObj, i )
00091 {
00092 Bar_ProgressUpdate( pProgress, i, NULL );
00093
00094 vSup = Vec_VecEntry( vSupps, i );
00095 if ( Vec_IntSize(vSup) < 2 )
00096 continue;
00097
00098 CountOver = CountQuant = 0;
00099 vSupNew = Vec_IntDup( vSup );
00100
00101 Aig_ManForEachPo( p, pObj, k )
00102
00103
00104
00105 {
00106
00107
00108
00109 vSup2 = Vec_VecEntry( vSupps, k );
00110
00111 nCommon = Vec_IntTwoCountCommon(vSup, vSup2);
00112 if ( nCommon < 2 )
00113 continue;
00114 if ( nCommon > nComLim )
00115 {
00116 vSupNew = Vec_IntTwoMerge( vTemp = vSupNew, vSup2 );
00117 Vec_IntFree( vTemp );
00118 CountOver++;
00119 }
00120 else
00121 CountQuant++;
00122 }
00123
00124 Vec_PtrPush( vSuppsNew, vSupNew );
00125 Vec_IntPush( vOverNew, CountOver );
00126 Vec_IntPush( vQuantNew, CountQuant );
00127
00128 if ( Largest < Vec_IntSize(vSupNew) )
00129 Largest = Vec_IntSize(vSupNew);
00130
00131 nTotalSupp += Vec_IntSize(vSup);
00132 nTotalSupp2 += Vec_IntSize(vSupNew);
00133 if ( Vec_IntSize(vSup) )
00134 R = Vec_IntSize(vSupNew) / Vec_IntSize(vSup);
00135 else
00136 R = 0;
00137 Ratio += R;
00138
00139 if ( R < 5.0 )
00140 continue;
00141
00142 printf( "%6d : ", i );
00143 printf( "S = %5d. ", Vec_IntSize(vSup) );
00144 printf( "SNew = %5d. ", Vec_IntSize(vSupNew) );
00145 printf( "R = %7.2f. ", R );
00146 printf( "Over = %5d. ", CountOver );
00147 printf( "Quant = %5d. ", CountQuant );
00148 printf( "\n" );
00149
00150
00151
00152
00153
00154 }
00155 Bar_ProgressStop( pProgress );
00156 PRT( "Scanning", clock() - clk );
00157
00158
00159 printf( "PIs = %6d. POs = %6d. Lim = %3d. AveS = %3d. SN = %3d. R = %4.2f Max = %5d.\n",
00160 Aig_ManPiNum(p), Aig_ManPoNum(p), nComLim,
00161 nTotalSupp/Aig_ManPoNum(p), nTotalSupp2/Aig_ManPoNum(p),
00162 Ratio/Aig_ManPoNum(p), Largest );
00163
00164 Vec_VecFree( vSupps );
00165 Vec_VecFree( vSuppsIn );
00166 Vec_VecFree( (Vec_Vec_t *)vSuppsNew );
00167 Vec_IntFree( vOverNew );
00168 Vec_IntFree( vQuantNew );
00169 }
00170
00171
00172
00184 void Fra_ManPartitionTest2( Aig_Man_t * p )
00185 {
00186 Vec_Vec_t * vSupps, * vSuppsIn;
00187 Vec_Int_t * vSup, * vSup2, * vSup3;
00188 Aig_Obj_t * pObj;
00189 int Entry, Entry2, Entry3, Counter;
00190 int i, k, m, n, clk;
00191 char * pSupp;
00192
00193
00194 clk = clock();
00195 vSupps = (Vec_Vec_t *)Aig_ManSupports( p );
00196 PRT( "Supports", clock() - clk );
00197
00198 Aig_ManForEachPo( p, pObj, i )
00199 {
00200 vSup = Vec_VecEntry( vSupps, i );
00201 Vec_IntPop( vSup );
00202
00203
00204 }
00205
00206
00207 clk = clock();
00208 vSuppsIn = Vec_VecStart( Aig_ManPiNum(p) );
00209 Aig_ManForEachPo( p, pObj, i )
00210 {
00211 if ( i == p->nAsserts )
00212 break;
00213 vSup = Vec_VecEntry( vSupps, i );
00214 Vec_IntForEachEntry( vSup, Entry, k )
00215 Vec_VecPush( vSuppsIn, Entry, (void *)i );
00216 }
00217 PRT( "Inverse ", clock() - clk );
00218
00219
00220 clk = clock();
00221 pSupp = ALLOC( char, Aig_ManPiNum(p) );
00222 Aig_ManForEachPo( p, pObj, i )
00223 {
00224 if ( i % 50 != 0 )
00225 continue;
00226 vSup = Vec_VecEntry( vSupps, i );
00227 memset( pSupp, 0, sizeof(char) * Aig_ManPiNum(p) );
00228
00229 Vec_IntForEachEntry( vSup, Entry, k )
00230 {
00231 pSupp[Entry] = 1;
00232 vSup2 = Vec_VecEntry( vSuppsIn, Entry );
00233
00234 Vec_IntForEachEntry( vSup2, Entry2, m )
00235 {
00236 vSup3 = Vec_VecEntry( vSupps, Entry2 );
00237
00238 Vec_IntForEachEntry( vSup3, Entry3, n )
00239 {
00240 pSupp[Entry3] = 1;
00241 }
00242 }
00243 }
00244
00245 Counter = 0;
00246 for ( m = 0; m < Aig_ManPiNum(p); m++ )
00247 Counter += pSupp[m];
00248 printf( "%d(%d) ", Vec_IntSize(vSup), Counter );
00249 }
00250 printf( "\n" );
00251 PRT( "Extension ", clock() - clk );
00252
00253 free( pSupp );
00254 Vec_VecFree( vSupps );
00255 Vec_VecFree( vSuppsIn );
00256 }
00257
00258
00262
00263