158{
160 int i, Index, NameId, iObj, iConst0, iTerm;
161 int iNonDriven = -1, nNonDriven = 0;
162 assert( Psr_NtkPioNum(pNtk) == 0 );
164 Bac_NtkStartNames( pNew );
165
167 {
168 if ( Vec_IntEntry(vMap, NameId) != -1 )
169 printf( "Primary inputs %d and %d have the same name.\n", Vec_IntEntry(vMap, NameId), i );
171 Bac_ObjSetName( pNew, iObj, Abc_Var2Lit2(NameId,
BAC_NAME_BIN) );
172 Vec_IntWriteEntry( vMap, NameId, iObj );
173 }
174
175 Vec_IntClear( vBoxes );
177 if ( !Psr_BoxIsNode(pNtk, iBox) )
178 {
179 pNtkBox = Psr_ManNtk( vDes, Psr_BoxNtk(pNtk, iBox)-1 );
180 if ( pNtkBox == NULL )
181 {
182 iObj = Bac_BoxAlloc( pNew,
BAC_BOX_GATE, Vec_IntSize(vSigs)/2-1, 1, Psr_BoxNtk(pNtk, iBox) );
183 Bac_ObjSetName( pNew, iObj, Abc_Var2Lit2(Psr_BoxName(pNtk, iBox),
BAC_NAME_BIN) );
184
185 NameId = Vec_IntEntryLast( vSigs );
186 NameId = Psr_NtkSigName( pNtk, NameId );
187 if ( Vec_IntEntry(vMap, NameId) != -1 )
188 printf( "Box output name %d is already driven.\n", NameId );
189 iTerm = Bac_BoxBo( pNew, iObj, 0 );
190 Bac_ObjSetName( pNew, iTerm, Abc_Var2Lit2(NameId,
BAC_NAME_BIN) );
191 Vec_IntWriteEntry( vMap, NameId, iTerm );
192 }
193 else
194 {
195 iObj = Bac_BoxAlloc( pNew,
BAC_OBJ_BOX, Psr_NtkPiNum(pNtkBox), Psr_NtkPoNum(pNtkBox), Psr_BoxNtk(pNtk, iBox) );
196 Bac_ObjSetName( pNew, iObj, Abc_Var2Lit2(Psr_BoxName(pNtk, iBox),
BAC_NAME_BIN) );
197 Bac_NtkSetHost( Bac_ManNtk(pNew->
pDesign, Psr_BoxNtk(pNtk, iBox)), Bac_NtkId(pNew), iObj );
199 {
200 i++;
201 if ( --Index < Psr_NtkPiNum(pNtkBox) )
202 continue;
203 assert( Index - Psr_NtkPiNum(pNtkBox) < Psr_NtkPoNum(pNtkBox) );
204
205 NameId = Vec_IntEntry( vSigs, i );
206 NameId = Psr_NtkSigName( pNtk, NameId );
207 if ( Vec_IntEntry(vMap, NameId) != -1 )
208 printf( "Box output name %d is already driven.\n", NameId );
209 iTerm = Bac_BoxBo( pNew, iObj, Index - Psr_NtkPiNum(pNtkBox) );
210 Bac_ObjSetName( pNew, iTerm, Abc_Var2Lit2(NameId,
BAC_NAME_BIN) );
211 Vec_IntWriteEntry( vMap, NameId, iTerm );
212 }
213 }
214
215 Vec_IntPush( vBoxes, iObj );
216 }
217 else
218 {
219 iObj = Bac_BoxAlloc( pNew, (
Bac_ObjType_t)Psr_BoxNtk(pNtk, iBox), Psr_BoxIONum(pNtk, iBox)-1, 1, -1 );
220
221 NameId = Vec_IntEntryLast( vSigs );
222 NameId = Psr_NtkSigName( pNtk, NameId );
223 if ( Vec_IntEntry(vMap, NameId) != -1 )
224 printf( "Node output name %d is already driven.\n", NameId );
225 iTerm = Bac_BoxBo( pNew, iObj, 0 );
226 Bac_ObjSetName( pNew, iTerm, Abc_Var2Lit2(NameId,
BAC_NAME_BIN) );
227 Vec_IntWriteEntry( vMap, NameId, iTerm );
228
229 Vec_IntPush( vBoxes, iObj );
230 }
231
233 if ( !Psr_BoxIsNode(pNtk, iBox) )
234 {
235 pNtkBox = Psr_ManNtk( vDes, Psr_BoxNtk(pNtk, iBox)-1 );
236 iObj = Vec_IntEntry( vBoxes, iBox );
237 if ( pNtkBox == NULL )
238 {
240 {
241 i++;
242 NameId = Vec_IntEntry( vSigs, i );
243 NameId = Psr_NtkSigName( pNtk, NameId );
244 iTerm = Bac_BoxBi( pNew, iObj, i/2 );
245 if ( Vec_IntEntry(vMap, NameId) == -1 )
246 {
247 iConst0 = Bac_BoxAlloc( pNew,
BAC_BOX_CF, 0, 1, -1 );
248 Vec_IntWriteEntry( vMap, NameId, iConst0+1 );
249 if ( iNonDriven == -1 )
250 iNonDriven = NameId;
251 nNonDriven++;
252 }
253 Bac_ObjSetFanin( pNew, iTerm, Vec_IntEntry(vMap, NameId) );
254 }
255 }
256 else
257 {
259 {
260 i++;
261 if ( --Index >= Psr_NtkPiNum(pNtkBox) )
262 continue;
263 NameId = Vec_IntEntry( vSigs, i );
264 NameId = Psr_NtkSigName( pNtk, NameId );
265 iTerm = Bac_BoxBi( pNew, iObj, Index );
266 if ( Vec_IntEntry(vMap, NameId) == -1 )
267 {
268 iConst0 = Bac_BoxAlloc( pNew,
BAC_BOX_CF, 0, 1, -1 );
269 Vec_IntWriteEntry( vMap, NameId, iConst0+1 );
270 if ( iNonDriven == -1 )
271 iNonDriven = NameId;
272 nNonDriven++;
273 }
274 Bac_ObjSetFanin( pNew, iTerm, Vec_IntEntry(vMap, NameId) );
275 }
276 }
277 }
278 else
279 {
280 iObj = Vec_IntEntry( vBoxes, iBox );
282 {
283 NameId = Vec_IntEntry( vSigs, ++i );
284 NameId = Psr_NtkSigName( pNtk, NameId );
285 iTerm = Bac_BoxBi( pNew, iObj, i/2 );
286 if ( Vec_IntEntry(vMap, NameId) == -1 )
287 {
288 iConst0 = Bac_BoxAlloc( pNew,
BAC_BOX_CF, 0, 1, -1 );
289 Vec_IntWriteEntry( vMap, NameId, iConst0+1 );
290 if ( iNonDriven == -1 )
291 iNonDriven = NameId;
292 nNonDriven++;
293 }
294 Bac_ObjSetFanin( pNew, iTerm, Vec_IntEntry(vMap, NameId) );
295 }
296 }
297
299 if ( Vec_IntEntry(vMap, NameId) == -1 )
300 {
301 iConst0 = Bac_BoxAlloc( pNew,
BAC_BOX_CF, 0, 1, -1 );
302 Vec_IntWriteEntry( vMap, NameId, iConst0+1 );
303 if ( iNonDriven == -1 )
304 iNonDriven = NameId;
305 nNonDriven++;
306 }
308 iObj = Bac_ObjAlloc( pNew,
BAC_OBJ_PO, Vec_IntEntry(vMap, NameId) );
309 if ( nNonDriven )
310 printf( "Module %s has %d non-driven nets (for example, %s).\n", Psr_NtkName(pNtk), nNonDriven, Psr_NtkStr(pNtk, iNonDriven) );
312
314 Bac_NtkAddInfo( pNew, NameId, -1, -1 );
315}
void Psr_ManRemapBoxes(Bac_Man_t *pNew, Vec_Ptr_t *vDes, Psr_Ntk_t *pNtk, Vec_Int_t *vMap)
void Psr_ManCleanMap(Psr_Ntk_t *pNtk, Vec_Int_t *vMap)
#define Psr_NtkForEachPo(p, NameId, i)
#define Psr_NtkForEachPi(p, NameId, i)
#define Psr_NtkForEachBox(p, vVec, i)
Bac_ObjType_t
INCLUDES ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_IntForEachEntryStop(vVec, Entry, i, Stop)