ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
giaIso3.c
Go to the documentation of this file.
1
20
21#include "gia.h"
22
24
25
29
30static unsigned Iso_Nodes[6] = { 0x04892ed6, 0xc2523d7d, 0xdc36cd2e, 0xf2db64f8, 0xde3126bb, 0xdebbdff0 }; // ab, a!b, !a!b, pi, po, const0
31static unsigned Iso_Fanio[2] = { 0x855ee0cf, 0x946e1b5f }; // fanin, fanout
32static unsigned Iso_Compl[2] = { 0x8ba63e50, 0x14d87f02 }; // non-compl, compl
33
37
49static inline unsigned Gia_Iso3Node( Gia_Obj_t * pObj )
50{
51 if ( Gia_ObjIsAnd(pObj) )
52 return Iso_Nodes[Gia_ObjFaninC0(pObj) + Gia_ObjFaninC1(pObj)];
53 if ( Gia_ObjIsCi(pObj) )
54 return Iso_Nodes[3];
55 if ( Gia_ObjIsCo(pObj) )
56 return Iso_Nodes[4];
57 return Iso_Nodes[5];
58}
60{
61 Gia_Obj_t * pObj;
62 int i;
63 Gia_ManForEachObj( p, pObj, i )
64 pObj->Value = Gia_Iso3Node( pObj );
65}
66
78static inline void Gia_Iso3ComputeEdge( Gia_Man_t * p, Gia_Obj_t * pObj, Gia_Obj_t * pFanin, int fCompl, Vec_Int_t * vSign )
79{
80 pObj->Value += Vec_IntEntry(vSign, Gia_ObjId(p, pFanin)) + Iso_Compl[fCompl] + Iso_Fanio[0];
81 pFanin->Value += Vec_IntEntry(vSign, Gia_ObjId(p, pObj)) + Iso_Compl[fCompl] + Iso_Fanio[1];
82}
84{
85 Gia_Obj_t * pObj;
86 int i;
87 Gia_ManForEachObj( p, pObj, i )
88 {
89 if ( Gia_ObjIsAnd(pObj) || Gia_ObjIsCo(pObj) )
90 Gia_Iso3ComputeEdge( p, pObj, Gia_ObjFanin0(pObj), Gia_ObjFaninC0(pObj), vSign );
91 if ( Gia_ObjIsAnd(pObj) )
92 Gia_Iso3ComputeEdge( p, pObj, Gia_ObjFanin1(pObj), Gia_ObjFaninC1(pObj), vSign );
93 }
94}
95
107static inline Vec_Int_t * Gia_Iso3Save( Gia_Man_t * p )
108{
109 Vec_Int_t * vSign;
110 Gia_Obj_t * pObj;
111 int i;
112 vSign = Vec_IntAlloc( Gia_ManObjNum(p) );
113 Gia_ManForEachObj( p, pObj, i )
114 Vec_IntPush( vSign, pObj->Value );
115 return vSign;
116}
118{
119 int nUnique;
120 Vec_Int_t * vCopy = Vec_IntDup( vSign );
121 Vec_IntUniqify( vCopy );
122 nUnique = Vec_IntSize(vCopy);
123 Vec_IntFree( vCopy );
124 return nUnique;
125}
126
139{
140 int nIterMax = 500;
141 int i, Prev = -1, This;
142 abctime clk = Abc_Clock();
143 Vec_Int_t * vSign = NULL;
144 Gia_Iso3Init( p );
145 for ( i = 0; i < nIterMax; i++ )
146 {
147 vSign = Gia_Iso3Save( p );
148// This = Gia_Iso3Unique( vSign );
149 This = Vec_IntUniqueCount( vSign, 1, NULL );
150 printf( "Iter %3d : %6d out of %6d ", i, This, Vec_IntSize(vSign) );
151 Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
152 if ( This == Prev )
153 break;
154 Prev = This;
155 Gia_Iso3Compute( p, vSign );
156 Vec_IntFreeP( &vSign );
157 }
158 Vec_IntFreeP( &vSign );
159}
160
173{
174 Vec_Wec_t * vLevs = Gia_ManLevelizeR( p );
175 Vec_Int_t * vLevel; int l;
176 Abc_Random( 1 );
177 Vec_WecForEachLevel( vLevs, vLevel, l )
178 {
179 Gia_Obj_t * pObj; int i;
180 unsigned RandC[2] = { Abc_Random(0), Abc_Random(0) };
181 if ( l == 0 )
182 {
183 Gia_ManForEachObjVec( vLevel, p, pObj, i )
184 {
185 assert( Gia_ObjIsCo(pObj) );
186 pObj->Value = Abc_Random(0);
187 Gia_ObjFanin0(pObj)->Value += pObj->Value + RandC[Gia_ObjFaninC0(pObj)];
188 }
189 }
190 else
191 {
192 Gia_ManForEachObjVec( vLevel, p, pObj, i ) if ( Gia_ObjIsAnd(pObj) )
193 {
194 Gia_ObjFanin0(pObj)->Value += pObj->Value + RandC[Gia_ObjFaninC0(pObj)];
195 Gia_ObjFanin1(pObj)->Value += pObj->Value + RandC[Gia_ObjFaninC1(pObj)];
196 }
197 }
198 }
199 return vLevs;
200}
202{
203 Vec_Wec_t * vLevs = Gia_Iso4Gia( p );
204 Vec_Int_t * vLevel; int l;
205 Vec_WecForEachLevel( vLevs, vLevel, l )
206 {
207 Gia_Obj_t * pObj; int i;
208 printf( "Level %d\n", l );
209 Gia_ManForEachObjVec( vLevel, p, pObj, i )
210 printf( "Obj = %5d. Value = %08x.\n", Gia_ObjId(p, pObj), pObj->Value );
211 }
212 Vec_WecFree( vLevs );
213}
215{
216 Gia_Obj_t * pObj; int i;
217 Vec_Int_t * vData = Vec_IntAlloc( Vec_IntSize(vObjs) );
218 Gia_ManForEachObjVec( vObjs, p, pObj, i )
219 Vec_IntPush( vData, pObj->Value );
220 return vData;
221}
222void Gia_IsoCompareVecs( Gia_Man_t * pGia0, Vec_Wec_t * vLevs0, Gia_Man_t * pGia1, Vec_Wec_t * vLevs1 )
223{
224 int i, Common, nLevels = Abc_MinInt( Vec_WecSize(vLevs0), Vec_WecSize(vLevs1) );
225 Gia_ManPrintStats( pGia0, NULL );
226 Gia_ManPrintStats( pGia1, NULL );
227 printf( "Printing %d shared levels:\n", nLevels );
228 for ( i = 0; i < nLevels; i++ )
229 {
230 Vec_Int_t * vLev0 = Vec_WecEntry(vLevs0, i);
231 Vec_Int_t * vLev1 = Vec_WecEntry(vLevs1, i);
232 Vec_Int_t * vData0 = Gia_IsoCollectData( pGia0, vLev0 );
233 Vec_Int_t * vData1 = Gia_IsoCollectData( pGia1, vLev1 );
234 Vec_IntSort( vData0, 0 );
235 Vec_IntSort( vData1, 0 );
236 Common = Vec_IntTwoCountCommon( vData0, vData1 );
237 printf( "Level = %3d. One = %6d. Two = %6d. Common = %6d.\n",
238 i, Vec_IntSize(vData0)-Common, Vec_IntSize(vData1)-Common, Common );
239 Vec_IntFree( vData0 );
240 Vec_IntFree( vData1 );
241 }
242}
243void Gia_Iso4TestTwo( Gia_Man_t * pGia0, Gia_Man_t * pGia1 )
244{
245 Vec_Wec_t * vLevs0 = Gia_Iso4Gia( pGia0 );
246 Vec_Wec_t * vLevs1 = Gia_Iso4Gia( pGia1 );
247 Gia_IsoCompareVecs( pGia0, vLevs0, pGia1, vLevs1 );
248 Vec_WecFree( vLevs0 );
249 Vec_WecFree( vLevs1 );
250}
251
255
256
258
ABC_INT64_T abctime
Definition abc_global.h:332
unsigned Abc_Random(int fReset)
Definition utilSort.c:1004
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
Cube * p
Definition exorList.c:222
Vec_Wec_t * Gia_Iso4Gia(Gia_Man_t *p)
Definition giaIso3.c:172
void Gia_Iso4Test(Gia_Man_t *p)
Definition giaIso3.c:201
int Gia_Iso3Unique(Vec_Int_t *vSign)
Definition giaIso3.c:117
void Gia_IsoCompareVecs(Gia_Man_t *pGia0, Vec_Wec_t *vLevs0, Gia_Man_t *pGia1, Vec_Wec_t *vLevs1)
Definition giaIso3.c:222
void Gia_Iso3Compute(Gia_Man_t *p, Vec_Int_t *vSign)
Definition giaIso3.c:83
void Gia_Iso3Test(Gia_Man_t *p)
Definition giaIso3.c:138
void Gia_Iso3Init(Gia_Man_t *p)
Definition giaIso3.c:59
Vec_Int_t * Gia_IsoCollectData(Gia_Man_t *p, Vec_Int_t *vObjs)
Definition giaIso3.c:214
void Gia_Iso4TestTwo(Gia_Man_t *pGia0, Gia_Man_t *pGia1)
Definition giaIso3.c:243
Vec_Wec_t * Gia_ManLevelizeR(Gia_Man_t *p)
Definition giaDfs.c:430
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
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
Definition gia.h:1190
void Gia_ManPrintStats(Gia_Man_t *p, Gps_Par_t *pPars)
Definition giaMan.c:495
unsigned Value
Definition gia.h:89
#define assert(ex)
Definition util_old.h:213
#define Vec_WecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
Definition vecWec.h:55
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.
Definition vecWec.h:42