1 /**CFile****************************************************************
2 
3   FileName    [mio.h]
4 
5   PackageName [MVSIS 2.0: Multi-valued logic synthesis system.]
6 
7   Synopsis    [File reading/writing for technology mapping.]
8 
9   Author      [MVSIS Group]
10 
11   Affiliation [UC Berkeley]
12 
13   Date        [Ver. 1.0. Started - September 8, 2003.]
14 
15   Revision    [$Id: mio.h,v 1.6 2004/08/09 22:16:31 satrajit Exp $]
16 
17 ***********************************************************************/
18 
19 #ifndef ABC__map__mio__mio_h
20 #define ABC__map__mio__mio_h
21 
22 
23 ////////////////////////////////////////////////////////////////////////
24 ///                          INCLUDES                                ///
25 ////////////////////////////////////////////////////////////////////////
26 
27 ////////////////////////////////////////////////////////////////////////
28 ///                         PARAMETERS                               ///
29 ////////////////////////////////////////////////////////////////////////
30 
31 
32 
33 ABC_NAMESPACE_HEADER_START
34 
35 
36 ////////////////////////////////////////////////////////////////////////
37 ///                    STRUCTURE DEFINITIONS                         ///
38 ////////////////////////////////////////////////////////////////////////
39 
40 typedef enum { MIO_PHASE_UNKNOWN, MIO_PHASE_INV, MIO_PHASE_NONINV } Mio_PinPhase_t;
41 
42 typedef struct  Mio_LibraryStruct_t_      Mio_Library_t;
43 typedef struct  Mio_GateStruct_t_         Mio_Gate_t;
44 typedef struct  Mio_PinStruct_t_          Mio_Pin_t;
45 
46 typedef struct Mio_Cell_t_ Mio_Cell_t;
47 struct Mio_Cell_t_
48 {
49     char *          pName;          // name
50     unsigned        Id       : 28;  // gate ID
51     unsigned        nFanins  :  4;  // gate fanins
52     float           Area;           // area
53     word            uTruth;         // truth table
54     float           Delays[6];      // delay
55 };
56 
57 typedef struct Mio_Cell2_t_ Mio_Cell2_t;
58 struct Mio_Cell2_t_
59 {
60     char *          pName;          // name
61     Vec_Int_t *     vExpr;          // expression
62     unsigned        Id       : 26;  // gate ID
63     unsigned        Type     :  2;  // gate type
64     unsigned        nFanins  :  4;  // gate fanins
65     float           AreaF;          // area
66     word            AreaW;          // area
67     word            uTruth;         // truth table
68     int             iDelayAve;      // average delay
69     int             iDelays[6];     // delay
70     void *          pMioGate;       // gate pointer
71 };
72 
73 ////////////////////////////////////////////////////////////////////////
74 ///                       GLOBAL VARIABLES                           ///
75 ////////////////////////////////////////////////////////////////////////
76 
77 ////////////////////////////////////////////////////////////////////////
78 ///                       MACRO DEFINITIONS                          ///
79 ////////////////////////////////////////////////////////////////////////
80 
81 #define Mio_LibraryForEachGate( Lib, Gate )                   \
82     for ( Gate = Mio_LibraryReadGates(Lib);                   \
83           Gate;                                               \
84           Gate = Mio_GateReadNext(Gate) )
85 #define Mio_LibraryForEachGateSafe( Lib, Gate, Gate2 )        \
86     for ( Gate = Mio_LibraryReadGates(Lib),                   \
87           Gate2 = (Gate? Mio_GateReadNext(Gate): NULL);       \
88           Gate;                                               \
89           Gate = Gate2,                                       \
90           Gate2 = (Gate? Mio_GateReadNext(Gate): NULL) )
91 
92 #define Mio_GateForEachPin( Gate, Pin )                       \
93     for ( Pin = Mio_GateReadPins(Gate);                       \
94           Pin;                                                \
95           Pin = Mio_PinReadNext(Pin) )
96 #define Mio_GateForEachPinSafe( Gate, Pin, Pin2 )             \
97     for ( Pin = Mio_GateReadPins(Gate),                       \
98           Pin2 = (Pin? Mio_PinReadNext(Pin): NULL);           \
99           Pin;                                                \
100           Pin = Pin2,                                         \
101           Pin2 = (Pin? Mio_PinReadNext(Pin): NULL) )
102 
103 ////////////////////////////////////////////////////////////////////////
104 ///                     FUNCTION DEFINITIONS                         ///
105 ////////////////////////////////////////////////////////////////////////
106 
107 /*=== mio.c =============================================================*/
108 extern void              Mio_UpdateGenlib( Mio_Library_t * pLib );
109 extern int               Mio_UpdateGenlib2( Vec_Str_t * vStr, Vec_Str_t * vStr2, char * pFileName, int fVerbose );
110 /*=== mioApi.c =============================================================*/
111 extern char *            Mio_LibraryReadName       ( Mio_Library_t * pLib );
112 extern int               Mio_LibraryReadGateNum    ( Mio_Library_t * pLib );
113 extern Mio_Gate_t *      Mio_LibraryReadGates      ( Mio_Library_t * pLib );
114 extern Mio_Gate_t **     Mio_LibraryReadGateArray  ( Mio_Library_t * pLib );
115 extern Mio_Gate_t *      Mio_LibraryReadGateById   ( Mio_Library_t * pLib, int iD );
116 extern Mio_Gate_t *      Mio_LibraryReadGateByName ( Mio_Library_t * pLib, char * pName, char * pOutName );
117 extern char *            Mio_LibraryReadSopByName  ( Mio_Library_t * pLib, char * pName );
118 extern Mio_Gate_t *      Mio_LibraryReadGateByTruth( Mio_Library_t * pLib, word t );
119 extern Mio_Gate_t *      Mio_LibraryReadConst0     ( Mio_Library_t * pLib );
120 extern Mio_Gate_t *      Mio_LibraryReadConst1     ( Mio_Library_t * pLib );
121 extern Mio_Gate_t *      Mio_LibraryReadNand2      ( Mio_Library_t * pLib );
122 extern Mio_Gate_t *      Mio_LibraryReadAnd2       ( Mio_Library_t * pLib );
123 extern Mio_Gate_t *      Mio_LibraryReadNor2       ( Mio_Library_t * pLib );
124 extern Mio_Gate_t *      Mio_LibraryReadOr2        ( Mio_Library_t * pLib );
125 extern Mio_Gate_t *      Mio_LibraryReadBuf        ( Mio_Library_t * pLib );
126 extern Mio_Gate_t *      Mio_LibraryReadInv        ( Mio_Library_t * pLib );
127 extern float             Mio_LibraryReadDelayInvRise( Mio_Library_t * pLib );
128 extern float             Mio_LibraryReadDelayInvFall( Mio_Library_t * pLib );
129 extern float             Mio_LibraryReadDelayInvMax( Mio_Library_t * pLib );
130 extern float             Mio_LibraryReadDelayNand2Rise( Mio_Library_t * pLib );
131 extern float             Mio_LibraryReadDelayNand2Fall( Mio_Library_t * pLib );
132 extern float             Mio_LibraryReadDelayNand2Max( Mio_Library_t * pLib );
133 extern float             Mio_LibraryReadDelayAnd2Max( Mio_Library_t * pLib );
134 extern float             Mio_LibraryReadDelayAigNode( Mio_Library_t * pLib );
135 extern float             Mio_LibraryReadAreaInv    ( Mio_Library_t * pLib );
136 extern float             Mio_LibraryReadAreaBuf    ( Mio_Library_t * pLib );
137 extern float             Mio_LibraryReadAreaNand2  ( Mio_Library_t * pLib );
138 extern int               Mio_LibraryReadGateNameMax( Mio_Library_t * pLib );
139 extern void              Mio_LibrarySetName        ( Mio_Library_t * pLib, char * pName );
140 extern char *            Mio_GateReadName          ( Mio_Gate_t * pGate );
141 extern char *            Mio_GateReadOutName       ( Mio_Gate_t * pGate );
142 extern double            Mio_GateReadArea          ( Mio_Gate_t * pGate );
143 extern char *            Mio_GateReadForm          ( Mio_Gate_t * pGate );
144 extern Mio_Pin_t *       Mio_GateReadPins          ( Mio_Gate_t * pGate );
145 extern Mio_Library_t *   Mio_GateReadLib           ( Mio_Gate_t * pGate );
146 extern Mio_Gate_t *      Mio_GateReadNext          ( Mio_Gate_t * pGate );
147 extern Mio_Gate_t *      Mio_GateReadTwin          ( Mio_Gate_t * pGate );
148 extern int               Mio_GateReadPinNum        ( Mio_Gate_t * pGate );
149 extern double            Mio_GateReadDelayMax      ( Mio_Gate_t * pGate );
150 extern char *            Mio_GateReadSop           ( Mio_Gate_t * pGate );
151 extern Vec_Int_t *       Mio_GateReadExpr          ( Mio_Gate_t * pGate );
152 extern word              Mio_GateReadTruth         ( Mio_Gate_t * pGate );
153 extern word *            Mio_GateReadTruthP        ( Mio_Gate_t * pGate );
154 extern int               Mio_GateReadValue         ( Mio_Gate_t * pGate );
155 extern int               Mio_GateReadCell          ( Mio_Gate_t * pGate );
156 extern int               Mio_GateReadProfile       ( Mio_Gate_t * pGate );
157 extern int               Mio_GateReadProfile2      ( Mio_Gate_t * pGate );
158 extern char *            Mio_GateReadPinName       ( Mio_Gate_t * pGate, int iPin );
159 extern float             Mio_GateReadPinDelay      ( Mio_Gate_t * pGate, int iPin );
160 extern void              Mio_GateSetValue          ( Mio_Gate_t * pGate, int Value );
161 extern void              Mio_GateSetCell           ( Mio_Gate_t * pGate, int Cell );
162 extern void              Mio_GateSetProfile        ( Mio_Gate_t * pGate, int Prof );
163 extern void              Mio_GateSetProfile2       ( Mio_Gate_t * pGate, int Prof );
164 extern void              Mio_GateIncProfile2       ( Mio_Gate_t * pGate );
165 extern void              Mio_GateDecProfile2       ( Mio_Gate_t * pGate );
166 extern void              Mio_GateAddToProfile      ( Mio_Gate_t * pGate, int Prof );
167 extern void              Mio_GateAddToProfile2     ( Mio_Gate_t * pGate, int Prof );
168 extern int               Mio_GateIsInv             ( Mio_Gate_t * pGate );
169 extern char *            Mio_PinReadName           ( Mio_Pin_t * pPin );
170 extern Mio_PinPhase_t    Mio_PinReadPhase          ( Mio_Pin_t * pPin );
171 extern double            Mio_PinReadInputLoad      ( Mio_Pin_t * pPin );
172 extern double            Mio_PinReadMaxLoad        ( Mio_Pin_t * pPin );
173 extern double            Mio_PinReadDelayBlockRise ( Mio_Pin_t * pPin );
174 extern double            Mio_PinReadDelayFanoutRise( Mio_Pin_t * pPin );
175 extern double            Mio_PinReadDelayBlockFall ( Mio_Pin_t * pPin );
176 extern double            Mio_PinReadDelayFanoutFall( Mio_Pin_t * pPin );
177 extern double            Mio_PinReadDelayBlockMax  ( Mio_Pin_t * pPin );
178 extern Mio_Pin_t *       Mio_PinReadNext           ( Mio_Pin_t * pPin );
179 /*=== mioRead.c =============================================================*/
180 extern char *            Mio_ReadFile( char * FileName, int fAddEnd );
181 extern Mio_Library_t *   Mio_LibraryRead( char * FileName, char * pBuffer, char * ExcludeFile, int fVerbose );
182 extern int               Mio_LibraryReadExclude( char * ExcludeFile, st__table * tExcludeGate );
183 /*=== mioFunc.c =============================================================*/
184 extern int               Mio_LibraryParseFormulas( Mio_Library_t * pLib );
185 /*=== mioParse.c =============================================================*/
186 extern Vec_Int_t *       Mio_ParseFormula( char * pFormInit, char ** ppVarNames, int nVars );
187 extern Vec_Wrd_t *       Mio_ParseFormulaTruth( char * pFormInit, char ** ppVarNames, int nVars );
188 extern int               Mio_ParseCheckFormula( Mio_Gate_t * pGate, char * pForm );
189 /*=== mioSop.c =============================================================*/
190 extern char *            Mio_LibDeriveSop( int nVars, Vec_Int_t * vExpr, Vec_Str_t * vStr );
191 /*=== mioUtils.c =============================================================*/
192 extern void              Mio_LibraryDelete( Mio_Library_t * pLib );
193 extern void              Mio_GateDelete( Mio_Gate_t * pGate );
194 extern void              Mio_PinDelete( Mio_Pin_t * pPin );
195 extern Mio_Pin_t *       Mio_PinDup( Mio_Pin_t * pPin );
196 extern void              Mio_WriteLibrary( FILE * pFile, Mio_Library_t * pLib, int fPrintSops, int fShort, int fSelected );
197 extern Mio_Gate_t **     Mio_CollectRoots( Mio_Library_t * pLib, int nInputs, float tDelay, int fSkipInv, int * pnGates, int fVerbose );
198 extern Mio_Cell_t *      Mio_CollectRootsNew( Mio_Library_t * pLib, int nInputs, int * pnGates, int fVerbose );
199 extern Mio_Cell_t *      Mio_CollectRootsNewDefault( int nInputs, int * pnGates, int fVerbose );
200 extern Mio_Cell2_t *     Mio_CollectRootsNewDefault2( int nInputs, int * pnGates, int fVerbose );
201 extern int               Mio_CollectRootsNewDefault3( int nInputs, Vec_Ptr_t ** pvNames, Vec_Wrd_t ** pvTruths );
202 extern word              Mio_DeriveTruthTable6( Mio_Gate_t * pGate );
203 extern void              Mio_DeriveTruthTable( Mio_Gate_t * pGate, unsigned uTruthsIn[][2], int nSigns, int nInputs, unsigned uTruthRes[] );
204 extern void              Mio_DeriveGateDelays( Mio_Gate_t * pGate,
205                             float ** ptPinDelays, int nPins, int nInputs, float tDelayZero,
206                             float * ptDelaysRes, float * ptPinDelayMax );
207 extern Mio_Gate_t *      Mio_GateCreatePseudo( int nInputs );
208 extern void              Mio_LibraryShiftDelay( Mio_Library_t * pLib, double Shift );
209 extern void              Mio_LibraryMultiArea( Mio_Library_t * pLib, double Multi );
210 extern void              Mio_LibraryMultiDelay( Mio_Library_t * pLib, double Multi );
211 extern void              Mio_LibraryTransferDelays( Mio_Library_t * pLibD, Mio_Library_t * pLibS );
212 extern void              Mio_LibraryTransferCellIds();
213 extern void              Mio_LibraryReadProfile( FILE * pFile, Mio_Library_t * pLib );
214 extern void              Mio_LibraryWriteProfile( FILE * pFile, Mio_Library_t * pLib );
215 extern void              Mio_LibraryTransferProfile( Mio_Library_t * pLibDst, Mio_Library_t * pLibSrc );
216 extern void              Mio_LibraryTransferProfile2( Mio_Library_t * pLibDst, Mio_Library_t * pLibSrc );
217 extern int               Mio_LibraryHasProfile( Mio_Library_t * pLib );
218 extern void              Mio_LibraryCleanProfile2( Mio_Library_t * pLib );
219 extern void              Mio_LibraryShortNames( Mio_Library_t * pLib );
220 
221 extern void              Mio_LibraryMatchesStop( Mio_Library_t * pLib );
222 extern void              Mio_LibraryMatchesStart( Mio_Library_t * pLib, int fPinFilter, int fPinPerm, int fPinQuick );
223 extern void              Mio_LibraryMatchesFetch( Mio_Library_t * pLib, Vec_Mem_t ** pvTtMem, Vec_Wec_t ** pvTt2Match, Mio_Cell2_t ** ppCells, int * pnCells, int fPinFilter, int fPinPerm, int fPinQuick );
224 
225 extern void              Mio_LibraryMatches2Stop( Mio_Library_t * pLib );
226 extern void              Mio_LibraryMatches2Start( Mio_Library_t * pLib );
227 extern void              Mio_LibraryMatches2Fetch( Mio_Library_t * pLib, Vec_Ptr_t ** pvNames, Vec_Wrd_t ** pvTruths, Vec_Int_t ** pvTt2Match4, Vec_Int_t ** pvConfigs, Vec_Mem_t * pvTtMem2[3], Vec_Int_t * pvTt2Match2[3] );
228 
229 /*=== sclUtil.c =========================================================*/
230 extern Mio_Library_t *   Abc_SclDeriveGenlibSimple( void * pScl );
231 extern Mio_Library_t *   Abc_SclDeriveGenlib( void * pScl, void * pMio, float Slew, float Gain, int nGatesMin, int fVerbose );
232 extern int               Abc_SclHasDelayInfo( void * pScl );
233 
234 
235 ABC_NAMESPACE_HEADER_END
236 
237 #endif
238 
239 ////////////////////////////////////////////////////////////////////////
240 ///                       END OF FILE                                ///
241 ////////////////////////////////////////////////////////////////////////
242 
243