ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
aigRetF.c
Go to the documentation of this file.
1
20
21#include "aig.h"
22
24
25
29
33
46{
47 if ( pObj->fMarkB )
48 return 1;
49 if ( Aig_ObjIsCi(pObj) || Aig_ObjIsConst1(pObj) )
50 return 0;
51 if ( Aig_ObjIsTravIdCurrent(p, pObj) )
52 return pObj->fMarkB;
53 Aig_ObjSetTravIdCurrent(p, pObj);
54 if ( Aig_ManRetimeMark_rec( p, Aig_ObjFanin0(pObj) ) )
55 return pObj->fMarkB = 1;
56 if ( Aig_ObjIsNode(pObj) && Aig_ManRetimeMark_rec( p, Aig_ObjFanin1(pObj) ) )
57 return pObj->fMarkB = 1;
58 assert( pObj->fMarkB == 0 );
59 return 0;
60}
61
74{
75 Aig_Obj_t * pObj, * pObjLi, * pObjLo;
76 int fChange, i;
77 // mark the PIs
78 Aig_ManForEachObj( p, pObj, i )
79 assert( pObj->fMarkB == 0 );
80 Aig_ManForEachPiSeq( p, pObj, i )
81 pObj->fMarkB = 1;
82 // map registers into each other
83 Aig_ManForEachLiLoSeq( p, pObjLi, pObjLo, i )
84 {
85 assert( pObjLo->pNext == NULL );
86 assert( pObjLi->pNext == NULL );
87 pObjLo->pNext = pObjLi;
88 pObjLi->pNext = pObjLo;
89 }
90 // iterativively mark the logic reachable from PIs
91 fChange = 1;
92 while ( fChange )
93 {
94 fChange = 0;
96 Aig_ManForEachCo( p, pObj, i )
97 {
98 if ( pObj->fMarkB )
99 continue;
100 if ( Aig_ManRetimeMark_rec( p, pObj ) )
101 {
102 if ( pObj->pNext )
103 pObj->pNext->fMarkB = 1;
104 fChange = 1;
105 }
106 }
107 }
108 // clean register mapping
109 Aig_ManForEachLiLoSeq( p, pObjLi, pObjLo, i )
110 pObjLo->pNext = pObjLi->pNext = NULL;
111}
112
113
126{
127 Aig_Obj_t * pObj, * pObjNew, * pObjLo, * pObjLo0, * pObjLo1, * pObjLi, * pObjLi0, * pObjLi1;//, * pObjLi0_, * pObjLi1_, * pObjLi0__, * pObjLi1__;
128 int i, Counter, fCompl, fChange;
129 assert( Aig_ManRegNum(p) > 0 );
130 // remove structural hashing table
131 Aig_TableClear( p );
132 // mark the retimable nodes
134 // mark the register outputs
135 Aig_ManForEachLiLoSeq( p, pObjLi, pObjLo, i )
136 {
137 pObjLo->fMarkA = 1;
138 pObjLo->pNext = pObjLi;
139 pObjLi->pNext = pObjLo;
140 }
141 // go through the nodes and find retimable ones
142 Counter = 0;
143 fChange = 1;
144 while ( fChange )
145 {
146 fChange = 0;
147 Aig_ManForEachNode( p, pObj, i )
148 {
149 if ( !pObj->fMarkB )
150 continue;
151 if ( Aig_ObjIsBuf(pObj) )
152 continue;
153 // get the real inputs of the node (skipping the buffers)
154 pObjLo0 = Aig_ObjReal_rec( Aig_ObjChild0(pObj) );
155 pObjLo1 = Aig_ObjReal_rec( Aig_ObjChild1(pObj) );
156 if ( !Aig_Regular(pObjLo0)->fMarkA || !Aig_Regular(pObjLo1)->fMarkA )
157 continue;
158 // remember complemented attribute
159 fCompl = Aig_IsComplement(pObjLo0) & Aig_IsComplement(pObjLo1);
160 // get the register inputs
161// pObjLi0_ = Aig_Regular(pObjLo0)->pNext;
162// pObjLi1_ = Aig_Regular(pObjLo1)->pNext;
163// pObjLi0__ = Aig_ObjChild0(Aig_Regular(pObjLo0)->pNext);
164// pObjLi1__ = Aig_ObjChild0(Aig_Regular(pObjLo1)->pNext);
165 pObjLi0 = Aig_NotCond( Aig_ObjChild0(Aig_Regular(pObjLo0)->pNext), Aig_IsComplement(pObjLo0) );
166 pObjLi1 = Aig_NotCond( Aig_ObjChild0(Aig_Regular(pObjLo1)->pNext), Aig_IsComplement(pObjLo1) );
167 // create new node
168 pObjNew = Aig_And( p, pObjLi0, pObjLi1 );
169 pObjNew->fMarkB = 1;
170 // create new register
171 pObjLo = Aig_ObjCreateCi(p);
172 pObjLo->fMarkA = 1;
173 pObjLi = Aig_ObjCreateCo( p, Aig_NotCond(pObjNew, fCompl) );
174 p->nRegs++;
175 pObjLo->pNext = pObjLi;
176 pObjLi->pNext = pObjLo;
177 // add the buffer
178 Aig_ObjDisconnect( p, pObj );
179 pObj->Type = AIG_OBJ_BUF;
180 p->nObjs[AIG_OBJ_AND]--;
181 p->nObjs[AIG_OBJ_BUF]++;
182 Aig_ObjConnect( p, pObj, Aig_NotCond(pObjLo, fCompl), NULL );
183 // create HAIG if defined
184 // mark the change
185 fChange = 1;
186 // check the limit
187 if ( ++Counter >= nStepsMax )
188 {
189 fChange = 0;
190 break;
191 }
192 }
193 }
194 // clean the markings
195 Aig_ManForEachLiLoSeq( p, pObjLi, pObjLo, i )
196 {
197 pObjLo->fMarkA = 0;
198 pObjLo->pNext = pObjLi->pNext = NULL;
199 }
200 Aig_ManForEachObj( p, pObj, i )
201 pObj->fMarkB = 0;
202 // remove useless registers
204 // rehash the nodes
205 return Aig_ManDupOrdered( p );
206}
207
211
212
214
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_NAMESPACE_IMPL_START int Aig_ManRetimeMark_rec(Aig_Man_t *p, Aig_Obj_t *pObj)
DECLARATIONS ///.
Definition aigRetF.c:45
Aig_Man_t * Aig_ManRetimeFrontier(Aig_Man_t *p, int nStepsMax)
Definition aigRetF.c:125
void Aig_ManRetimeMark(Aig_Man_t *p)
Definition aigRetF.c:73
Aig_Man_t * Aig_ManDupOrdered(Aig_Man_t *p)
Definition aigDup.c:277
int Aig_ManSeqCleanup(Aig_Man_t *p)
Definition aigScl.c:158
#define Aig_ManForEachObj(p, pObj, i)
Definition aig.h:403
void Aig_ObjDisconnect(Aig_Man_t *p, Aig_Obj_t *pObj)
Definition aigObj.c:171
void Aig_ManIncrementTravId(Aig_Man_t *p)
DECLARATIONS ///.
Definition aigUtil.c:44
Aig_Obj_t * Aig_And(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Definition aigOper.c:104
void Aig_ObjConnect(Aig_Man_t *p, Aig_Obj_t *pObj, Aig_Obj_t *pFan0, Aig_Obj_t *pFan1)
Definition aigObj.c:126
Aig_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
Definition aigObj.c:66
struct Aig_Obj_t_ Aig_Obj_t
Definition aig.h:51
void Aig_TableClear(Aig_Man_t *p)
Definition aigTable.c:265
#define Aig_ManForEachNode(p, pObj, i)
Definition aig.h:413
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
Definition aig.h:50
#define Aig_ManForEachPiSeq(p, pObj, i)
SEQUENTIAL ITERATORS ///.
Definition aig.h:438
#define Aig_ManForEachCo(p, pObj, i)
Definition aig.h:398
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
Definition aigObj.c:45
Aig_Obj_t * Aig_ObjReal_rec(Aig_Obj_t *pObj)
Definition aigUtil.c:476
@ AIG_OBJ_AND
Definition aig.h:63
@ AIG_OBJ_BUF
Definition aig.h:62
#define Aig_ManForEachLiLoSeq(p, pObjLi, pObjLo, k)
Definition aig.h:450
Cube * p
Definition exorList.c:222
unsigned int fMarkB
Definition aig.h:80
Aig_Obj_t * pNext
Definition aig.h:72
unsigned int fMarkA
Definition aig.h:79
unsigned int Type
Definition aig.h:77
#define assert(ex)
Definition util_old.h:213