00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <assert.h>
00029 #include <string.h>
00030 #include "kapi_internal.h"
00031 #include "kapi_util.h"
00032 #include "kapi_error.h"
00033
00034
00035
00036
00037
00038
00039
00040 int
00041 KAPI_iidCount( void *pConfig )
00042 {
00043 knobs_t *pknobs = pConfig;
00044
00045 return( pknobs->ninstTable );
00046 }
00047
00048 kapi_it_t
00049 KAPI_iid2it( void *pConfig, kapi_iid_t iid, int iVariant )
00050 {
00051 knobs_t *pknobs = pConfig;
00052
00053 assert( iid < pknobs->ninstTable );
00054 return( pknobs->dmpinstTable[ iid ].it );
00055 }
00056
00057 kapi_fu_t
00058 KAPI_iid2fu( void *pConfig, kapi_iid_t iid, int iVariant )
00059 {
00060 knobs_t *pknobs = pConfig;
00061
00062 assert( iid < pknobs->ninstTable );
00063 return( pknobs->dmpinstTable[ iid ].fu );
00064 }
00065
00066 char *
00067 KAPI_iid2mnemonic( void *pConfig, kapi_iid_t iid, int iVariant )
00068 {
00069 knobs_t *pknobs = pConfig;
00070 assert(pknobs->pfSaveHeaderFlags==NULL && "Names are not saved in header usage model");
00071
00072 assert( iid < pknobs->ninstTable );
00073 return( pknobs->dmpinstTable[ iid ].pchMnemonic );
00074 }
00075
00076 char *
00077 KAPI_iid2uniqueName( void *pConfig, kapi_iid_t iid, int iVariant )
00078 {
00079 knobs_t *pknobs = pConfig;
00080 assert(pknobs->pfSaveHeaderFlags==NULL && "Names are not saved in header usage model");
00081
00082 assert( iid < pknobs->ninstTable );
00083 return( pknobs->dmpinstTable[ iid ].pchUniqueName );
00084 }
00085
00086 kapi_iid_t
00087 KAPI_uniqueName2iid( void *pConfig, char *pchName, int iVariant )
00088 {
00089 knobs_t *pknobs = pConfig;
00090 int i;
00091
00092 for ( i=0; i<pknobs->ninstTable; i++ ) {
00093 if ( 0 == strcmp( pchName, pknobs->dmpinstTable[ i ].pchUniqueName ) ) {
00094 return( i );
00095 }
00096 }
00097 return( -1 );
00098 }
00099
00100
00101 int
00102 KAPI_oppGetSource( void *pConfig, kapi_fu_t fu, char *pchOppName )
00103 {
00104 knobs_t *pknobs = pConfig;
00105 int i;
00106
00107
00108
00109
00110
00111 if ( fu >= pknobs->nfuinfoTable ) {
00112 return( -1 );
00113 }
00114
00115 if ( pchOppName == NULL || 0 == strcmp( pchOppName, "primary" ) ) {
00116 if (pknobs->dmpfuinfoTable[ fu ].bv32InfoBits & (1<<kapi_fu_info_no_primary_source) )
00117 return -1;
00118 return( 0 );
00119 }
00120
00121 for ( i=0; i<pknobs->dmpfuinfoTable[ fu ].cntSrc; i++ ) {
00122 if ( 0 == strcmp( pknobs->dmpfuinfoTable[ fu ].mppchSrcName[ i ], pchOppName ) ) {
00123 return( i );
00124 }
00125 }
00126
00127 return( -1 );
00128 }
00129
00130 int
00131 KAPI_oppGetDest( void *pConfig, kapi_fu_t fu, char *pchOppName )
00132 {
00133 knobs_t *pknobs = pConfig;
00134 int i;
00135
00136
00137
00138
00139
00140 if ( fu >= pknobs->nfuinfoTable ) {
00141 return( -1 );
00142 }
00143
00144 if ( pchOppName == NULL || 0 == strcmp( pchOppName, "primary" ) ) {
00145 if (pknobs->dmpfuinfoTable[ fu ].bv32InfoBits & (1<<kapi_fu_info_no_primary_destination) )
00146 return -1;
00147 return( 0 );
00148 }
00149
00150 for ( i=0; i<pknobs->dmpfuinfoTable[ fu ].cntDest; i++ ) {
00151 if ( 0 == strcmp( pknobs->dmpfuinfoTable[ fu ].mppchDestName[ i ], pchOppName ) ) {
00152 return( i );
00153 }
00154 }
00155
00156 return( -1 );
00157 }
00158
00159 int
00160 KAPI_srcOppCount( void *pConfig, kapi_fu_t fuSrc )
00161 {
00162 knobs_t *pknobs = pConfig;
00163
00164 return( pknobs->dmpfuinfoTable[ fuSrc ].cntSrc );
00165 }
00166
00167 int
00168 KAPI_destOppCount( void *pConfig, kapi_fu_t fuDest )
00169 {
00170 knobs_t *pknobs = pConfig;
00171
00172 return( pknobs->dmpfuinfoTable[ fuDest ].cntDest );
00173 }
00174
00175 char *
00176 KAPI_srcOppName( void *pConfig, kapi_fu_t fuSrc, int opp )
00177 {
00178 knobs_t *pknobs = pConfig;
00179 assert(pknobs->pfSaveHeaderFlags==NULL && "Names are not saved in header usage model");
00180
00181 return( pknobs->dmpfuinfoTable[ fuSrc ].mppchSrcName[ opp ] );
00182 }
00183
00184 char *
00185 KAPI_destOppName( void *pConfig, kapi_fu_t fuDest, int opp )
00186 {
00187 knobs_t *pknobs = pConfig;
00188 assert(pknobs->pfSaveHeaderFlags==NULL && "Names are not saved in header usage model");
00189
00190 return( pknobs->dmpfuinfoTable[ fuDest ].mppchDestName[ opp ] );
00191 }
00192
00193
00194 int KAPI_GetOppIndex(void *pConfig, kapi_iid_t iid,
00195 int iIndex, kapi_operand_role_e iRole,
00196 char *pchOppName)
00197 {
00198
00199 knobs_t *pknobs = pConfig;
00200
00201
00202 if (pchOppName != NULL)
00203 {
00204 switch (iRole)
00205 {
00206 case kapi_op_role_dest:
00207 return KAPI_oppGetDest(pConfig,KAPI_iid2fu(pConfig,iid,0),pchOppName);
00208 case kapi_op_role_src:
00209 return KAPI_oppGetSource(pConfig,KAPI_iid2fu(pConfig,iid,0),pchOppName);
00210 default:
00211 return -1;
00212 }
00213 }
00214
00215 assert(pknobs);
00216
00217 switch (iRole)
00218 {
00219 case kapi_op_role_dest:
00220 assert(pknobs->dmpinstTable[iid].pExplicitOps);
00221 if (type_single==pknobs->dmpinstTable[iid].pExplicitOps->iType)
00222 {
00223 return pknobs->dmpinstTable[iid].
00224 pExplicitOps->pIndexes[0].pOperand;
00225 }
00226 else
00227 {
00228 return pknobs->dmpinstTable[iid].
00229 pExplicitOps->pIndexes[0].pOperandList->pIndexes[0].pOperand;
00230 }
00231 case kapi_op_role_src:
00232 assert(pknobs->dmpinstTable[iid].pExplicitOps);
00233 if (type_single==pknobs->dmpinstTable[iid].pExplicitOps->iType)
00234 {
00235 return pknobs->dmpinstTable[iid].
00236 pExplicitOps->pIndexes[1].pOperand;
00237 }
00238 else
00239 {
00240 return pknobs->dmpinstTable[iid].
00241 pExplicitOps->pIndexes[0].pOperandList->pIndexes[1].pOperand;
00242 }
00243
00244 default:
00245 return -1;
00246 }
00247 }