ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
llb2Driver.c
Go to the documentation of this file.
1
20
21#include "llbInt.h"
22
24
25
29
30// driver issue:arises when creating
31// - driver ref-counter array
32// - Ns2Glo maps
33// - final partition
34// - change-phase cube
35
36// LI variable is used when
37// - driver drives more than one LI
38// - driver is a PI
39// - driver is a constant
40
44
57{
58 Vec_Int_t * vCounts;
59 Aig_Obj_t * pObj;
60 int i;
61 vCounts = Vec_IntStart( Aig_ManObjNumMax(p) );
62 Saig_ManForEachLi( p, pObj, i )
63 Vec_IntAddToEntry( vCounts, Aig_ObjFaninId0(pObj), 1 );
64 return vCounts;
65}
66
79{
80 Vec_Int_t * vVars;
81 Aig_Obj_t * pObj, * pDri;
82 int i;
83 vVars = Vec_IntAlloc( Aig_ManRegNum(pAig) );
84 Saig_ManForEachLi( pAig, pObj, i )
85 {
86 pDri = Aig_ObjFanin0(pObj);
87 if ( Vec_IntEntry( vDriRefs, Aig_ObjId(pDri) ) != 1 || Saig_ObjIsPi(pAig, pDri) || Aig_ObjIsConst1(pDri) )
88 Vec_IntPush( vVars, Aig_ObjId(pObj) );
89 else
90 Vec_IntPush( vVars, Aig_ObjId(pDri) );
91 }
92 return vVars;
93}
94
107{
108 Vec_Int_t * vVars;
109 Aig_Obj_t * pObj;
110 int i;
111 vVars = Vec_IntAlloc( Aig_ManRegNum(pAig) );
112 Saig_ManForEachLo( pAig, pObj, i )
113 Vec_IntPush( vVars, Aig_ObjId(pObj) );
114 return vVars;
115}
116
128DdNode * Llb_DriverPhaseCube( Aig_Man_t * pAig, Vec_Int_t * vDriRefs, DdManager * dd )
129{
130 DdNode * bCube, * bVar, * bTemp;
131 Aig_Obj_t * pObj;
132 int i;
133 abctime TimeStop;
134 TimeStop = dd->TimeStop; dd->TimeStop = 0;
135 bCube = Cudd_ReadOne( dd ); Cudd_Ref( bCube );
136 Saig_ManForEachLi( pAig, pObj, i )
137 {
138 assert( Vec_IntEntry( vDriRefs, Aig_ObjFaninId0(pObj) ) >= 1 );
139 if ( Vec_IntEntry( vDriRefs, Aig_ObjFaninId0(pObj) ) != 1 )
140 continue;
141 if ( !Aig_ObjFaninC0(pObj) )
142 continue;
143 bVar = Cudd_bddIthVar( dd, Aig_ObjFaninId0(pObj) );
144 bCube = Cudd_bddAnd( dd, bTemp = bCube, bVar ); Cudd_Ref( bCube );
145 Cudd_RecursiveDeref( dd, bTemp );
146 }
147 Cudd_Deref( bCube );
148 dd->TimeStop = TimeStop;
149 return bCube;
150}
151
163DdManager * Llb_DriverLastPartition( Aig_Man_t * p, Vec_Int_t * vVarsNs, abctime TimeTarget )
164{
165// int fVerbose = 1;
166 DdManager * dd;
167 DdNode * bVar1, * bVar2, * bProd, * bRes, * bTemp;
168 Aig_Obj_t * pObj;
169 int i;
170 dd = Cudd_Init( Aig_ManObjNumMax(p), 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
171 Cudd_AutodynEnable( dd, CUDD_REORDER_SYMM_SIFT );
172 dd->TimeStop = TimeTarget;
173 bRes = Cudd_ReadOne(dd); Cudd_Ref( bRes );
174
175 // mark the duplicated flop inputs
176 Aig_ManForEachObjVec( vVarsNs, p, pObj, i )
177 {
178 if ( !Saig_ObjIsLi(p, pObj) )
179 continue;
180 bVar1 = Cudd_bddIthVar( dd, Aig_ObjId(pObj) );
181 bVar2 = Cudd_bddIthVar( dd, Aig_ObjFaninId0(pObj) );
182 if ( Aig_ObjIsConst1(Aig_ObjFanin0(pObj)) )
183 bVar2 = Cudd_ReadOne(dd);
184 bVar2 = Cudd_NotCond( bVar2, Aig_ObjFaninC0(pObj) );
185 bProd = Cudd_bddXnor( dd, bVar1, bVar2 ); Cudd_Ref( bProd );
186// bRes = Cudd_bddAnd( dd, bTemp = bRes, bProd ); Cudd_Ref( bRes );
187// bRes = Extra_bddAndTime( dd, bTemp = bRes, bProd, TimeTarget );
188 bRes = Cudd_bddAnd( dd, bTemp = bRes, bProd );
189 if ( bRes == NULL )
190 {
191 Cudd_RecursiveDeref( dd, bTemp );
192 Cudd_RecursiveDeref( dd, bProd );
193 return NULL;
194 }
195 Cudd_Ref( bRes );
196 Cudd_RecursiveDeref( dd, bTemp );
197 Cudd_RecursiveDeref( dd, bProd );
198 }
199
200/*
201 Saig_ManForEachLi( p, pObj, i )
202 printf( "%d ", Aig_ObjId(pObj) );
203 printf( "\n" );
204 Saig_ManForEachLi( p, pObj, i )
205 printf( "%c%d ", Aig_ObjFaninC0(pObj)? '-':'+', Aig_ObjFaninId0(pObj) );
206 printf( "\n" );
207*/
208 Cudd_AutodynDisable( dd );
209// Cudd_RecursiveDeref( dd, bRes );
210// Extra_StopManager( dd );
211 dd->bFunc = bRes;
212 dd->TimeStop = 0;
213 return dd;
214}
215
219
220
222
ABC_INT64_T abctime
Definition abc_global.h:332
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
struct Aig_Obj_t_ Aig_Obj_t
Definition aig.h:51
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
Definition aig.h:50
#define Aig_ManForEachObjVec(vIds, p, pObj, i)
Definition aig.h:408
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
Cube * p
Definition exorList.c:222
DdManager * Llb_DriverLastPartition(Aig_Man_t *p, Vec_Int_t *vVarsNs, abctime TimeTarget)
Definition llb2Driver.c:163
ABC_NAMESPACE_IMPL_START Vec_Int_t * Llb_DriverCountRefs(Aig_Man_t *p)
DECLARATIONS ///.
Definition llb2Driver.c:56
Vec_Int_t * Llb_DriverCollectCs(Aig_Man_t *pAig)
Definition llb2Driver.c:106
DdNode * Llb_DriverPhaseCube(Aig_Man_t *pAig, Vec_Int_t *vDriRefs, DdManager *dd)
Definition llb2Driver.c:128
Vec_Int_t * Llb_DriverCollectNs(Aig_Man_t *pAig, Vec_Int_t *vDriRefs)
Definition llb2Driver.c:78
#define Saig_ManForEachLi(p, pObj, i)
Definition saig.h:98
#define Saig_ManForEachLo(p, pObj, i)
Definition saig.h:96
#define assert(ex)
Definition util_old.h:213