1 /**CFile****************************************************************
2
3 FileName [wlcWin.c]
4
5 SystemName [ABC: Logic synthesis and verification system.]
6
7 PackageName [Verilog parser.]
8
9 Synopsis [Parses several flavors of word-level Verilog.]
10
11 Author [Alan Mishchenko]
12
13 Affiliation [UC Berkeley]
14
15 Date [Ver. 1.0. Started - August 22, 2014.]
16
17 Revision [$Id: wlcWin.c,v 1.00 2014/09/12 00:00:00 alanmi Exp $]
18
19 ***********************************************************************/
20
21 #include "wlc.h"
22 #include "base/abc/abc.h"
23
24 ABC_NAMESPACE_IMPL_START
25
26 ////////////////////////////////////////////////////////////////////////
27 /// DECLARATIONS ///
28 ////////////////////////////////////////////////////////////////////////
29
30 ////////////////////////////////////////////////////////////////////////
31 /// FUNCTION DEFINITIONS ///
32 ////////////////////////////////////////////////////////////////////////
33
34 /**Function*************************************************************
35
36 Synopsis [Collect arithmetic nodes.]
37
38 Description []
39
40 SideEffects []
41
42 SeeAlso []
43
44 ***********************************************************************/
Wlc_ObjIsArithm(Wlc_Obj_t * pObj)45 int Wlc_ObjIsArithm( Wlc_Obj_t * pObj )
46 {
47 return pObj->Type == WLC_OBJ_CONST ||
48 pObj->Type == WLC_OBJ_BUF || pObj->Type == WLC_OBJ_BIT_NOT ||
49 pObj->Type == WLC_OBJ_BIT_ZEROPAD || pObj->Type == WLC_OBJ_BIT_SIGNEXT ||
50 // pObj->Type == WLC_OBJ_BIT_SELECT || pObj->Type == WLC_OBJ_BIT_CONCAT ||
51 pObj->Type == WLC_OBJ_ARI_ADD || pObj->Type == WLC_OBJ_ARI_SUB ||
52 pObj->Type == WLC_OBJ_ARI_MULTI || pObj->Type == WLC_OBJ_ARI_MINUS;
53 }
Wlc_ObjIsArithmReal(Wlc_Obj_t * pObj)54 int Wlc_ObjIsArithmReal( Wlc_Obj_t * pObj )
55 {
56 return pObj->Type == WLC_OBJ_BIT_NOT ||
57 pObj->Type == WLC_OBJ_ARI_ADD || pObj->Type == WLC_OBJ_ARI_SUB ||
58 pObj->Type == WLC_OBJ_ARI_MULTI || pObj->Type == WLC_OBJ_ARI_MINUS;
59 }
Wlc_ManCountArithmReal(Wlc_Ntk_t * p,Vec_Int_t * vNodes)60 int Wlc_ManCountArithmReal( Wlc_Ntk_t * p, Vec_Int_t * vNodes )
61 {
62 Wlc_Obj_t * pObj;
63 int i, Counter = 0;
64 Wlc_NtkForEachObjVec( vNodes, p, pObj, i )
65 Counter += Wlc_ObjIsArithmReal( pObj );
66 return Counter;
67 }
Wlc_ObjHasArithm_rec(Wlc_Ntk_t * p,Wlc_Obj_t * pObj)68 int Wlc_ObjHasArithm_rec( Wlc_Ntk_t * p, Wlc_Obj_t * pObj )
69 {
70 if ( pObj->Type == WLC_OBJ_CONST )
71 return 0;
72 if ( pObj->Type == WLC_OBJ_BUF || pObj->Type == WLC_OBJ_BIT_NOT ||
73 pObj->Type == WLC_OBJ_BIT_ZEROPAD || pObj->Type == WLC_OBJ_BIT_SIGNEXT )
74 return Wlc_ObjHasArithm_rec( p, Wlc_ObjFanin0(p, pObj) );
75 return pObj->Type == WLC_OBJ_ARI_ADD || pObj->Type == WLC_OBJ_ARI_SUB ||
76 pObj->Type == WLC_OBJ_ARI_MULTI || pObj->Type == WLC_OBJ_ARI_MINUS;
77 }
Wlc_ObjHasArithmFanins(Wlc_Ntk_t * p,Wlc_Obj_t * pObj)78 int Wlc_ObjHasArithmFanins( Wlc_Ntk_t * p, Wlc_Obj_t * pObj )
79 {
80 Wlc_Obj_t * pFanin; int i;
81 assert( !Wlc_ObjHasArithm_rec(p, pObj) );
82 Wlc_ObjForEachFaninObj( p, pObj, pFanin, i )
83 if ( Wlc_ObjHasArithm_rec(p, pFanin) )
84 return 1;
85 return 0;
86 }
Wlc_WinCompute_rec(Wlc_Ntk_t * p,Wlc_Obj_t * pObj,Vec_Int_t * vLeaves,Vec_Int_t * vNodes)87 void Wlc_WinCompute_rec( Wlc_Ntk_t * p, Wlc_Obj_t * pObj, Vec_Int_t * vLeaves, Vec_Int_t * vNodes )
88 {
89 Wlc_Obj_t * pFanin; int i;
90 if ( pObj->Mark )
91 return;
92 pObj->Mark = 1;
93 if ( !Wlc_ObjIsArithm(pObj) )
94 {
95 Vec_IntPush( vLeaves, Wlc_ObjId(p, pObj) );
96 return;
97 }
98 Wlc_ObjForEachFaninObj( p, pObj, pFanin, i )
99 Wlc_WinCompute_rec( p, pFanin, vLeaves, vNodes );
100 Vec_IntPush( vNodes, Wlc_ObjId(p, pObj) );
101 }
Wlc_WinCleanMark_rec(Wlc_Ntk_t * p,Wlc_Obj_t * pObj)102 void Wlc_WinCleanMark_rec( Wlc_Ntk_t * p, Wlc_Obj_t * pObj )
103 {
104 Wlc_Obj_t * pFanin; int i;
105 if ( !pObj->Mark )
106 return;
107 pObj->Mark = 0;
108 Wlc_ObjForEachFaninObj( p, pObj, pFanin, i )
109 Wlc_WinCleanMark_rec( p, pFanin );
110 }
Wlc_WinCompute(Wlc_Ntk_t * p,Wlc_Obj_t * pObj,Vec_Int_t * vLeaves,Vec_Int_t * vNodes)111 void Wlc_WinCompute( Wlc_Ntk_t * p, Wlc_Obj_t * pObj, Vec_Int_t * vLeaves, Vec_Int_t * vNodes )
112 {
113 Vec_IntClear( vLeaves );
114 Vec_IntClear( vNodes );
115 if ( Wlc_ObjHasArithm_rec(p, pObj) )
116 {
117 Wlc_WinCompute_rec( p, pObj, vLeaves, vNodes );
118 Wlc_WinCleanMark_rec( p, pObj );
119 }
120 else if ( Wlc_ObjHasArithmFanins(p, pObj) )
121 {
122 Wlc_Obj_t * pFanin; int i;
123 Wlc_ObjForEachFaninObj( p, pObj, pFanin, i )
124 if ( Wlc_ObjHasArithm_rec(p, pFanin) )
125 Wlc_WinCompute_rec( p, pFanin, vLeaves, vNodes );
126 Wlc_ObjForEachFaninObj( p, pObj, pFanin, i )
127 if ( Wlc_ObjHasArithm_rec(p, pFanin) )
128 Wlc_WinCleanMark_rec( p, pFanin );
129 }
130 else assert( 0 );
131 }
Wlc_WinProfileArith(Wlc_Ntk_t * p)132 void Wlc_WinProfileArith( Wlc_Ntk_t * p )
133 {
134 Vec_Int_t * vLeaves = Vec_IntAlloc( 1000 );
135 Vec_Int_t * vNodes = Vec_IntAlloc( 1000 );
136 Wlc_Obj_t * pObj; int i, Count = 0;
137 Wlc_NtkForEachObj( p, pObj, i )
138 pObj->Mark = 0;
139 Wlc_NtkForEachObj( p, pObj, i )
140 if ( Wlc_ObjHasArithm_rec(p, pObj) ? Wlc_ObjIsCo(pObj) : Wlc_ObjHasArithmFanins(p, pObj) )
141 {
142 Wlc_WinCompute( p, pObj, vLeaves, vNodes );
143 if ( Wlc_ManCountArithmReal(p, vNodes) < 2 )
144 continue;
145
146 printf( "Arithmetic cone of node %d (%s):\n", Wlc_ObjId(p, pObj), Wlc_ObjName(p, Wlc_ObjId(p, pObj)) );
147 Wlc_NtkPrintNode( p, pObj );
148 Vec_IntReverseOrder( vNodes );
149 Wlc_NtkPrintNodeArray( p, vNodes );
150 printf( "\n" );
151 Count++;
152 }
153 Wlc_NtkForEachObj( p, pObj, i )
154 assert( pObj->Mark == 0 );
155 printf( "Finished printing %d arithmetic cones.\n", Count );
156 Vec_IntFree( vLeaves );
157 Vec_IntFree( vNodes );
158 }
159
160 ////////////////////////////////////////////////////////////////////////
161 /// END OF FILE ///
162 ////////////////////////////////////////////////////////////////////////
163
164
165 ABC_NAMESPACE_IMPL_END
166
167