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