1 /**CFile****************************************************************
2 
3   FileName    [acecBo.c]
4 
5   SystemName  [ABC: Logic synthesis and verification system.]
6 
7   PackageName [CEC for arithmetic circuits.]
8 
9   Synopsis    [Core procedures.]
10 
11   Author      [Alan Mishchenko]
12 
13   Affiliation [UC Berkeley]
14 
15   Date        [Ver. 1.0. Started - June 20, 2005.]
16 
17   Revision    [$Id: acecBo.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
18 
19 ***********************************************************************/
20 
21 #include "acecInt.h"
22 #include "misc/vec/vecWec.h"
23 #include "misc/extra/extra.h"
24 
25 ABC_NAMESPACE_IMPL_START
26 
27 ////////////////////////////////////////////////////////////////////////
28 ///                        DECLARATIONS                              ///
29 ////////////////////////////////////////////////////////////////////////
30 
31 
32 ////////////////////////////////////////////////////////////////////////
33 ///                     FUNCTION DEFINITIONS                         ///
34 ////////////////////////////////////////////////////////////////////////
35 
36 /**Function*************************************************************
37 
38   Synopsis    []
39 
40   Description []
41 
42   SideEffects []
43 
44   SeeAlso     []
45 
46 ***********************************************************************/
Acec_DetectBoothXorMux(Gia_Man_t * p,Gia_Obj_t * pMux,Gia_Obj_t * pXor,int pIns[3])47 int Acec_DetectBoothXorMux( Gia_Man_t * p, Gia_Obj_t * pMux, Gia_Obj_t * pXor, int pIns[3] )
48 {
49     Gia_Obj_t * pFan0, * pFan1;
50     Gia_Obj_t * pDat0, * pDat1, * pCtrl;
51     if ( !Gia_ObjIsMuxType(pMux) || !Gia_ObjIsMuxType(pXor) )
52         return 0;
53     if ( !Gia_ObjRecognizeExor( pXor, &pFan0, &pFan1 ) )
54         return 0;
55     pFan0 = Gia_Regular(pFan0);
56     pFan1 = Gia_Regular(pFan1);
57     if ( Gia_ObjId(p, pFan0) > Gia_ObjId(p, pFan1) )
58         ABC_SWAP( Gia_Obj_t *, pFan0, pFan1 );
59     if ( !(pCtrl = Gia_ObjRecognizeMux( pMux, &pDat0, &pDat1 )) )
60         return 0;
61     pDat0 = Gia_Regular(pDat0);
62     pDat1 = Gia_Regular(pDat1);
63     pCtrl = Gia_Regular(pCtrl);
64     if ( !Gia_ObjIsAnd(pDat0) || !Gia_ObjIsAnd(pDat1) )
65         return 0;
66     if ( Gia_ObjFaninId0p(p, pDat0) != Gia_ObjFaninId0p(p, pDat1) ||
67          Gia_ObjFaninId1p(p, pDat0) != Gia_ObjFaninId1p(p, pDat1) )
68          return 0;
69     if ( Gia_ObjFaninId0p(p, pDat0) != Gia_ObjId(p, pFan0) ||
70          Gia_ObjFaninId1p(p, pDat0) != Gia_ObjId(p, pFan1) )
71          return 0;
72     pIns[0] = Gia_ObjId(p, pFan0);
73     pIns[1] = Gia_ObjId(p, pFan1);
74     pIns[2] = Gia_ObjId(p, pCtrl);
75     return 1;
76 }
Acec_DetectBoothXorFanin(Gia_Man_t * p,Gia_Obj_t * pObj,int pIns[5])77 int Acec_DetectBoothXorFanin( Gia_Man_t * p, Gia_Obj_t * pObj, int pIns[5] )
78 {
79     Gia_Obj_t * pFan0, * pFan1;
80     //int Id = Gia_ObjId(p, pObj);
81     if ( !Gia_ObjIsAnd(pObj) )
82         return 0;
83     if ( !Gia_ObjFaninC0(pObj) || !Gia_ObjFaninC1(pObj) )
84         return 0;
85     pFan0 = Gia_ObjFanin0(pObj);
86     pFan1 = Gia_ObjFanin1(pObj);
87     if ( !Gia_ObjIsAnd(pFan0) || !Gia_ObjIsAnd(pFan1) )
88         return 0;
89     if ( Acec_DetectBoothXorMux(p, Gia_ObjFanin0(pFan0), Gia_ObjFanin0(pFan1), pIns) )
90     {
91         pIns[3] = Gia_ObjId(p, Gia_ObjFanin1(pFan0));
92         pIns[4] = Gia_ObjId(p, Gia_ObjFanin1(pFan1));
93         return 1;
94     }
95     if ( Acec_DetectBoothXorMux(p, Gia_ObjFanin0(pFan0), Gia_ObjFanin1(pFan1), pIns) )
96     {
97         pIns[3] = Gia_ObjId(p, Gia_ObjFanin1(pFan0));
98         pIns[4] = Gia_ObjId(p, Gia_ObjFanin0(pFan1));
99         return 1;
100     }
101     if ( Acec_DetectBoothXorMux(p, Gia_ObjFanin1(pFan0), Gia_ObjFanin0(pFan1), pIns) )
102     {
103         pIns[3] = Gia_ObjId(p, Gia_ObjFanin0(pFan0));
104         pIns[4] = Gia_ObjId(p, Gia_ObjFanin1(pFan1));
105         return 1;
106     }
107     if ( Acec_DetectBoothXorMux(p, Gia_ObjFanin1(pFan0), Gia_ObjFanin1(pFan1), pIns) )
108     {
109         pIns[3] = Gia_ObjId(p, Gia_ObjFanin0(pFan0));
110         pIns[4] = Gia_ObjId(p, Gia_ObjFanin0(pFan1));
111         return 1;
112     }
113     return 0;
114 }
Acec_DetectBoothOne(Gia_Man_t * p,Gia_Obj_t * pObj,int pIns[5])115 int Acec_DetectBoothOne( Gia_Man_t * p, Gia_Obj_t * pObj, int pIns[5] )
116 {
117     Gia_Obj_t * pFan0, * pFan1;
118     if ( !Gia_ObjRecognizeExor( pObj, &pFan0, &pFan1 ) )
119         return 0;
120     pFan0 = Gia_Regular(pFan0);
121     pFan1 = Gia_Regular(pFan1);
122     if ( Acec_DetectBoothXorFanin( p, pFan0, pIns ) && pIns[2] == Gia_ObjId(p, pFan1) )
123         return 1;
124     if ( Acec_DetectBoothXorFanin( p, pFan1, pIns ) && pIns[2] == Gia_ObjId(p, pFan0) )
125         return 1;
126     return 0;
127 }
128 
129 
130 /**Function*************************************************************
131 
132   Synopsis    []
133 
134   Description []
135 
136   SideEffects []
137 
138   SeeAlso     []
139 
140 ***********************************************************************/
Acec_DetectBoothTwoXor(Gia_Man_t * p,Gia_Obj_t * pObj,int pIns[5])141 int Acec_DetectBoothTwoXor( Gia_Man_t * p, Gia_Obj_t * pObj, int pIns[5] )
142 {
143     Gia_Obj_t * pFan0, * pFan1;
144     if ( !Gia_ObjIsAnd(pObj) )
145         return 0;
146     if ( Gia_ObjRecognizeExor( Gia_ObjFanin0(pObj), &pFan0, &pFan1 ) )
147     {
148         pIns[0] = Gia_ObjId(p, Gia_Regular(pFan0));
149         pIns[1] = Gia_ObjId(p, Gia_Regular(pFan1));
150         pIns[2] = -1;
151         pIns[3] = 0;
152         pIns[4] = Gia_ObjId(p, Gia_ObjFanin1(pObj));
153         return 1;
154     }
155     if ( Gia_ObjRecognizeExor( Gia_ObjFanin1(pObj), &pFan0, &pFan1 ) )
156     {
157         pIns[0] = Gia_ObjId(p, Gia_Regular(pFan0));
158         pIns[1] = Gia_ObjId(p, Gia_Regular(pFan1));
159         pIns[2] = -1;
160         pIns[3] = 0;
161         pIns[4] = Gia_ObjId(p, Gia_ObjFanin0(pObj));
162         return 1;
163     }
164     return 0;
165 }
Acec_DetectBoothTwo(Gia_Man_t * p,Gia_Obj_t * pObj,int pIns[5])166 int Acec_DetectBoothTwo( Gia_Man_t * p, Gia_Obj_t * pObj, int pIns[5] )
167 {
168     Gia_Obj_t * pFan0, * pFan1;
169     if ( !Gia_ObjRecognizeExor( pObj, &pFan0, &pFan1 ) )
170         return 0;
171     pFan0 = Gia_Regular(pFan0);
172     pFan1 = Gia_Regular(pFan1);
173     if ( Acec_DetectBoothTwoXor( p, pFan0, pIns ) )
174     {
175         pIns[2] = Gia_ObjId(p, pFan1);
176         return 1;
177     }
178     if ( Acec_DetectBoothTwoXor( p, pFan1, pIns ) )
179     {
180         pIns[2] = Gia_ObjId(p, pFan0);
181         return 1;
182     }
183     return 0;
184 }
185 
186 /**Function*************************************************************
187 
188   Synopsis    []
189 
190   Description []
191 
192   SideEffects []
193 
194   SeeAlso     []
195 
196 ***********************************************************************/
Acec_DetectBoothTest(Gia_Man_t * p)197 void Acec_DetectBoothTest( Gia_Man_t * p )
198 {
199     Gia_Obj_t * pObj;
200     int i, pIns[5];
201     Gia_ManForEachAnd( p, pObj, i )
202     {
203         if ( !Acec_DetectBoothOne(p, pObj, pIns) && !Acec_DetectBoothTwo(p, pObj, pIns) )
204                 continue;
205         printf( "obj = %4d  :  b0 = %4d  b1 = %4d  b2 = %4d    a0 = %4d  a1 = %4d\n",
206             i, pIns[0], pIns[1], pIns[2], pIns[3], pIns[4] );
207     }
208 }
209 
210 ////////////////////////////////////////////////////////////////////////
211 ///                       END OF FILE                                ///
212 ////////////////////////////////////////////////////////////////////////
213 
214 
215 ABC_NAMESPACE_IMPL_END
216 
217