1 /**CFile****************************************************************
2 
3   FileName    [mioApi.c]
4 
5   PackageName [MVSIS 1.3: 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: mioApi.c,v 1.4 2004/06/28 14:20:25 alanmi Exp $]
16 
17 ***********************************************************************/
18 
19 #include "mioInt.h"
20 
21 ABC_NAMESPACE_IMPL_START
22 
23 
24 ////////////////////////////////////////////////////////////////////////
25 ///                        DECLARATIONS                              ///
26 ////////////////////////////////////////////////////////////////////////
27 
28 ////////////////////////////////////////////////////////////////////////
29 ///                     FUNCTION DEFINITIONS                         ///
30 ////////////////////////////////////////////////////////////////////////
31 
32 /**Function*************************************************************
33 
34   Synopsis    []
35 
36   Description []
37 
38   SideEffects []
39 
40   SeeAlso     []
41 
42 ***********************************************************************/
Mio_LibraryReadName(Mio_Library_t * pLib)43 char *            Mio_LibraryReadName          ( Mio_Library_t * pLib )  { return pLib->pName;      }
Mio_LibraryReadGateNum(Mio_Library_t * pLib)44 int               Mio_LibraryReadGateNum       ( Mio_Library_t * pLib )  { return pLib->nGates;     }
Mio_LibraryReadGates(Mio_Library_t * pLib)45 Mio_Gate_t *      Mio_LibraryReadGates         ( Mio_Library_t * pLib )  { return pLib->pGates;     }
Mio_LibraryReadGateArray(Mio_Library_t * pLib)46 Mio_Gate_t **     Mio_LibraryReadGateArray     ( Mio_Library_t * pLib )  { return pLib->ppGatesName;}
Mio_LibraryReadGateById(Mio_Library_t * pLib,int Id)47 Mio_Gate_t *      Mio_LibraryReadGateById      ( Mio_Library_t * pLib, int Id ) { assert( pLib->ppGates0[Id]->Cell == Id ); return pLib->ppGates0[Id];}
Mio_LibraryReadBuf(Mio_Library_t * pLib)48 Mio_Gate_t *      Mio_LibraryReadBuf           ( Mio_Library_t * pLib )  { return pLib->pGateBuf;   }
Mio_LibraryReadInv(Mio_Library_t * pLib)49 Mio_Gate_t *      Mio_LibraryReadInv           ( Mio_Library_t * pLib )  { return pLib->pGateInv;   }
Mio_LibraryReadConst0(Mio_Library_t * pLib)50 Mio_Gate_t *      Mio_LibraryReadConst0        ( Mio_Library_t * pLib )  { return pLib->pGate0;     }
Mio_LibraryReadConst1(Mio_Library_t * pLib)51 Mio_Gate_t *      Mio_LibraryReadConst1        ( Mio_Library_t * pLib )  { return pLib->pGate1;     }
Mio_LibraryReadNand2(Mio_Library_t * pLib)52 Mio_Gate_t *      Mio_LibraryReadNand2         ( Mio_Library_t * pLib )  { return pLib->pGateNand2; }
Mio_LibraryReadAnd2(Mio_Library_t * pLib)53 Mio_Gate_t *      Mio_LibraryReadAnd2          ( Mio_Library_t * pLib )  { return pLib->pGateAnd2;  }
Mio_LibraryReadNor2(Mio_Library_t * pLib)54 Mio_Gate_t *      Mio_LibraryReadNor2          ( Mio_Library_t * pLib )  { return pLib->pGateNor2;  }
Mio_LibraryReadOr2(Mio_Library_t * pLib)55 Mio_Gate_t *      Mio_LibraryReadOr2           ( Mio_Library_t * pLib )  { return pLib->pGateOr2;   }
Mio_LibraryReadDelayInvRise(Mio_Library_t * pLib)56 float             Mio_LibraryReadDelayInvRise  ( Mio_Library_t * pLib )  { return (float)(pLib->pGateInv?   pLib->pGateInv->pPins->dDelayBlockRise   : 0.0); }
Mio_LibraryReadDelayInvFall(Mio_Library_t * pLib)57 float             Mio_LibraryReadDelayInvFall  ( Mio_Library_t * pLib )  { return (float)(pLib->pGateInv?   pLib->pGateInv->pPins->dDelayBlockFall   : 0.0); }
Mio_LibraryReadDelayInvMax(Mio_Library_t * pLib)58 float             Mio_LibraryReadDelayInvMax   ( Mio_Library_t * pLib )  { return (float)(pLib->pGateInv?   pLib->pGateInv->pPins->dDelayBlockMax    : 0.0); }
Mio_LibraryReadDelayNand2Rise(Mio_Library_t * pLib)59 float             Mio_LibraryReadDelayNand2Rise( Mio_Library_t * pLib )  { return (float)(pLib->pGateNand2? pLib->pGateNand2->pPins->dDelayBlockRise : 0.0); }
Mio_LibraryReadDelayNand2Fall(Mio_Library_t * pLib)60 float             Mio_LibraryReadDelayNand2Fall( Mio_Library_t * pLib )  { return (float)(pLib->pGateNand2? pLib->pGateNand2->pPins->dDelayBlockFall : 0.0); }
Mio_LibraryReadDelayNand2Max(Mio_Library_t * pLib)61 float             Mio_LibraryReadDelayNand2Max ( Mio_Library_t * pLib )  { return (float)(pLib->pGateNand2? pLib->pGateNand2->pPins->dDelayBlockMax  : 0.0); }
Mio_LibraryReadDelayAnd2Max(Mio_Library_t * pLib)62 float             Mio_LibraryReadDelayAnd2Max  ( Mio_Library_t * pLib )  { return (float)(pLib->pGateAnd2?  pLib->pGateAnd2->pPins->dDelayBlockMax   : 0.0); }
Mio_LibraryReadDelayAigNode(Mio_Library_t * pLib)63 float             Mio_LibraryReadDelayAigNode  ( Mio_Library_t * pLib )  { return pLib->pGateAnd2 ? Mio_LibraryReadDelayAnd2Max(pLib) : Mio_LibraryReadDelayNand2Max(pLib); } // approximate delay of the AIG node
Mio_LibraryReadAreaInv(Mio_Library_t * pLib)64 float             Mio_LibraryReadAreaInv       ( Mio_Library_t * pLib )  { return (float)(pLib->pGateInv?   pLib->pGateInv->dArea   : 0.0); }
Mio_LibraryReadAreaBuf(Mio_Library_t * pLib)65 float             Mio_LibraryReadAreaBuf       ( Mio_Library_t * pLib )  { return (float)(pLib->pGateBuf?   pLib->pGateBuf->dArea   : 0.0); }
Mio_LibraryReadAreaNand2(Mio_Library_t * pLib)66 float             Mio_LibraryReadAreaNand2     ( Mio_Library_t * pLib )  { return (float)(pLib->pGateNand2? pLib->pGateNand2->dArea : 0.0); }
Mio_LibrarySetName(Mio_Library_t * pLib,char * pName)67 void              Mio_LibrarySetName           ( Mio_Library_t * pLib, char * pName ) { ABC_FREE(pLib->pName); pLib->pName = pName;         }
68 
69 /**Function*************************************************************
70 
71   Synopsis    [Returns the longest gate name.]
72 
73   Description []
74 
75   SideEffects []
76 
77   SeeAlso     []
78 
79 ***********************************************************************/
Mio_LibraryReadGateNameMax(Mio_Library_t * pLib)80 int Mio_LibraryReadGateNameMax( Mio_Library_t * pLib )
81 {
82     Mio_Gate_t * pGate;
83     int LenMax = 0, LenCur;
84     Mio_LibraryForEachGate( pLib, pGate )
85     {
86         LenCur = strlen( Mio_GateReadName(pGate) );
87         if ( LenMax < LenCur )
88             LenMax = LenCur;
89     }
90     return LenMax;
91 }
92 
93 /**Function*************************************************************
94 
95   Synopsis    [Read Mvc of the gate by name.]
96 
97   Description []
98 
99   SideEffects []
100 
101   SeeAlso     []
102 
103 ***********************************************************************/
Mio_LibraryReadGateByName(Mio_Library_t * pLib,char * pName,char * pOutName)104 Mio_Gate_t * Mio_LibraryReadGateByName( Mio_Library_t * pLib, char * pName, char * pOutName )
105 {
106     Mio_Gate_t * pGate;
107     if ( ! st__lookup( pLib->tName2Gate, pName, (char **)&pGate ) )
108         return NULL;
109     if ( pOutName == NULL )
110         return pGate;
111     if ( !strcmp(pGate->pOutName, pOutName) )
112         return pGate;
113     if ( pGate->pTwin && !strcmp(pGate->pTwin->pOutName, pOutName) )
114         return pGate->pTwin;
115     return NULL;
116 }
117 
118 /**Function*************************************************************
119 
120   Synopsis    [Returns the first gate in the library with the given TT.]
121 
122   Description []
123 
124   SideEffects []
125 
126   SeeAlso     []
127 
128 ***********************************************************************/
Mio_LibraryReadGateByTruth(Mio_Library_t * pLib,word t)129 Mio_Gate_t * Mio_LibraryReadGateByTruth( Mio_Library_t * pLib, word t )
130 {
131     Mio_Gate_t * pGate;
132     Mio_LibraryForEachGate( pLib, pGate )
133         if ( pGate->nInputs <= 6 && pGate->uTruth == t )
134             return pGate;
135     return NULL;
136 }
137 
138 /**Function*************************************************************
139 
140   Synopsis    [Read Mvc of the gate by name.]
141 
142   Description []
143 
144   SideEffects []
145 
146   SeeAlso     []
147 
148 ***********************************************************************/
Mio_LibraryReadSopByName(Mio_Library_t * pLib,char * pName)149 char * Mio_LibraryReadSopByName( Mio_Library_t * pLib, char * pName )
150 {
151     Mio_Gate_t * pGate;
152     if ( st__lookup( pLib->tName2Gate, pName, (char **)&pGate ) )
153         return pGate->pSop;
154     return NULL;
155 }
156 
157 /**Function*************************************************************
158 
159   Synopsis    []
160 
161   Description []
162 
163   SideEffects []
164 
165   SeeAlso     []
166 
167 ***********************************************************************/
Mio_GateReadName(Mio_Gate_t * pGate)168 char *            Mio_GateReadName     ( Mio_Gate_t * pGate )            { return pGate->pName;     }
Mio_GateReadOutName(Mio_Gate_t * pGate)169 char *            Mio_GateReadOutName  ( Mio_Gate_t * pGate )            { return pGate->pOutName;  }
Mio_GateReadArea(Mio_Gate_t * pGate)170 double            Mio_GateReadArea     ( Mio_Gate_t * pGate )            { return pGate->dArea;     }
Mio_GateReadForm(Mio_Gate_t * pGate)171 char *            Mio_GateReadForm     ( Mio_Gate_t * pGate )            { return pGate->pForm;     }
Mio_GateReadPins(Mio_Gate_t * pGate)172 Mio_Pin_t *       Mio_GateReadPins     ( Mio_Gate_t * pGate )            { return pGate->pPins;     }
Mio_GateReadLib(Mio_Gate_t * pGate)173 Mio_Library_t *   Mio_GateReadLib      ( Mio_Gate_t * pGate )            { return pGate->pLib;      }
Mio_GateReadNext(Mio_Gate_t * pGate)174 Mio_Gate_t *      Mio_GateReadNext     ( Mio_Gate_t * pGate )            { return pGate->pNext;     }
Mio_GateReadTwin(Mio_Gate_t * pGate)175 Mio_Gate_t *      Mio_GateReadTwin     ( Mio_Gate_t * pGate )            { return pGate->pTwin;     }
Mio_GateReadPinNum(Mio_Gate_t * pGate)176 int               Mio_GateReadPinNum   ( Mio_Gate_t * pGate )            { return pGate->nInputs;   }
Mio_GateReadDelayMax(Mio_Gate_t * pGate)177 double            Mio_GateReadDelayMax ( Mio_Gate_t * pGate )            { return pGate->dDelayMax; }
Mio_GateReadSop(Mio_Gate_t * pGate)178 char *            Mio_GateReadSop      ( Mio_Gate_t * pGate )            { return pGate->pSop;      }
Mio_GateReadExpr(Mio_Gate_t * pGate)179 Vec_Int_t *       Mio_GateReadExpr     ( Mio_Gate_t * pGate )            { return pGate->vExpr;     }
Mio_GateReadTruth(Mio_Gate_t * pGate)180 word              Mio_GateReadTruth    ( Mio_Gate_t * pGate )            { return pGate->nInputs <= 6 ? pGate->uTruth : 0;   }
Mio_GateReadTruthP(Mio_Gate_t * pGate)181 word *            Mio_GateReadTruthP   ( Mio_Gate_t * pGate )            { return pGate->nInputs <= 6 ? &pGate->uTruth: pGate->pTruth; }
Mio_GateReadValue(Mio_Gate_t * pGate)182 int               Mio_GateReadValue    ( Mio_Gate_t * pGate )            { return pGate->Value;     }
Mio_GateReadCell(Mio_Gate_t * pGate)183 int               Mio_GateReadCell     ( Mio_Gate_t * pGate )            { return pGate->Cell;      }
Mio_GateReadProfile(Mio_Gate_t * pGate)184 int               Mio_GateReadProfile  ( Mio_Gate_t * pGate )            { return pGate->Profile;   }
Mio_GateReadProfile2(Mio_Gate_t * pGate)185 int               Mio_GateReadProfile2 ( Mio_Gate_t * pGate )            { return pGate->Profile2;  }
Mio_GateSetValue(Mio_Gate_t * pGate,int Value)186 void              Mio_GateSetValue     ( Mio_Gate_t * pGate, int Value ) { pGate->Value = Value;    }
Mio_GateSetCell(Mio_Gate_t * pGate,int Cell)187 void              Mio_GateSetCell      ( Mio_Gate_t * pGate, int Cell )  { pGate->Cell  = Cell;     }
Mio_GateSetProfile(Mio_Gate_t * pGate,int Prof)188 void              Mio_GateSetProfile   ( Mio_Gate_t * pGate, int Prof )  { pGate->Profile = Prof;   }
Mio_GateSetProfile2(Mio_Gate_t * pGate,int Prof)189 void              Mio_GateSetProfile2  ( Mio_Gate_t * pGate, int Prof )  { pGate->Profile2 = Prof;  }
Mio_GateIncProfile2(Mio_Gate_t * pGate)190 void              Mio_GateIncProfile2  ( Mio_Gate_t * pGate )            { pGate->Profile2++;       }
Mio_GateDecProfile2(Mio_Gate_t * pGate)191 void              Mio_GateDecProfile2  ( Mio_Gate_t * pGate )            { pGate->Profile2--;       }
Mio_GateAddToProfile(Mio_Gate_t * pGate,int Prof)192 void              Mio_GateAddToProfile ( Mio_Gate_t * pGate, int Prof )  { pGate->Profile  += Prof; }
Mio_GateAddToProfile2(Mio_Gate_t * pGate,int Prof)193 void              Mio_GateAddToProfile2( Mio_Gate_t * pGate, int Prof )  { pGate->Profile2 += Prof; }
Mio_GateIsInv(Mio_Gate_t * pGate)194 int               Mio_GateIsInv        ( Mio_Gate_t * pGate )            { return pGate->uTruth == ABC_CONST(0x5555555555555555); }
195 
196 /**Function*************************************************************
197 
198   Synopsis    []
199 
200   Description []
201 
202   SideEffects []
203 
204   SeeAlso     []
205 
206 ***********************************************************************/
Mio_PinReadName(Mio_Pin_t * pPin)207 char *            Mio_PinReadName           ( Mio_Pin_t * pPin )      { return pPin->pName;           }
Mio_PinReadPhase(Mio_Pin_t * pPin)208 Mio_PinPhase_t    Mio_PinReadPhase          ( Mio_Pin_t * pPin )      { return pPin->Phase;           }
Mio_PinReadInputLoad(Mio_Pin_t * pPin)209 double            Mio_PinReadInputLoad      ( Mio_Pin_t * pPin )      { return pPin->dLoadInput;      }
Mio_PinReadMaxLoad(Mio_Pin_t * pPin)210 double            Mio_PinReadMaxLoad        ( Mio_Pin_t * pPin )      { return pPin->dLoadMax;        }
Mio_PinReadDelayBlockRise(Mio_Pin_t * pPin)211 double            Mio_PinReadDelayBlockRise ( Mio_Pin_t * pPin )      { return pPin->dDelayBlockRise; }
Mio_PinReadDelayFanoutRise(Mio_Pin_t * pPin)212 double            Mio_PinReadDelayFanoutRise( Mio_Pin_t * pPin )      { return pPin->dDelayFanoutRise;}
Mio_PinReadDelayBlockFall(Mio_Pin_t * pPin)213 double            Mio_PinReadDelayBlockFall ( Mio_Pin_t * pPin )      { return pPin->dDelayBlockFall; }
Mio_PinReadDelayFanoutFall(Mio_Pin_t * pPin)214 double            Mio_PinReadDelayFanoutFall( Mio_Pin_t * pPin )      { return pPin->dDelayFanoutFall;}
Mio_PinReadDelayBlockMax(Mio_Pin_t * pPin)215 double            Mio_PinReadDelayBlockMax  ( Mio_Pin_t * pPin )      { return pPin->dDelayBlockMax;  }
Mio_PinReadNext(Mio_Pin_t * pPin)216 Mio_Pin_t *       Mio_PinReadNext           ( Mio_Pin_t * pPin )      { return pPin->pNext;           }
217 
218 /**Function*************************************************************
219 
220   Synopsis    []
221 
222   Description []
223 
224   SideEffects []
225 
226   SeeAlso     []
227 
228 ***********************************************************************/
Mio_GateReadPinName(Mio_Gate_t * pGate,int iPin)229 char * Mio_GateReadPinName( Mio_Gate_t * pGate, int iPin )
230 {
231     Mio_Pin_t * pPin;
232     int i = 0;
233     Mio_GateForEachPin( pGate, pPin )
234         if ( i++ == iPin )
235             return Mio_PinReadName(pPin);
236     return NULL;
237 }
Mio_GateReadPinDelay(Mio_Gate_t * pGate,int iPin)238 float Mio_GateReadPinDelay( Mio_Gate_t * pGate, int iPin )
239 {
240     Mio_Pin_t * pPin;
241     int i = 0;
242     Mio_GateForEachPin( pGate, pPin )
243         if ( i++ == iPin )
244             return 0.5 * pPin->dDelayBlockRise + 0.5 * pPin->dDelayBlockFall;
245     return ABC_INFINITY;
246 }
247 
248 ////////////////////////////////////////////////////////////////////////
249 ///                       END OF FILE                                ///
250 ////////////////////////////////////////////////////////////////////////
251 
252 
253 ABC_NAMESPACE_IMPL_END
254 
255