00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <stdio.h>
00025 #include <assert.h>
00026 #include <string.h>
00027 #include <malloc.h>
00028 #include "kapi_internal.h"
00029 #include "kapi_parse.h"
00030 #include "kapi_util.h"
00031 #include "kapi_error.h"
00032 #include "kapi_dumpbin.h"
00033
00034 void KDumpBin_DumpMachineDescription( FILE *fp, knobs_t *pknobs )
00035 {
00036 int i;
00037 if (NULL==fp) return;
00038
00039 fwrite(&(pknobs->nclr),sizeof(int),1,fp);
00040
00041 fwrite(pknobs->maxBundleIssue,sizeof(int),(pknobs->nclr),fp);
00042
00043 fwrite(pknobs->maxInstructionIssue,sizeof(int),(pknobs->nclr),fp);
00044
00045 for (i=0;i<(pknobs->nclr);i++)
00046 KDumpBin_DumpClusterInfo(fp,&(pknobs->mpclrTable[i]));
00047
00048 fwrite(&(pknobs->nRawInter),sizeof(int),1,fp);
00049 for (i=0;i<(pknobs->nRawInter);i++)
00050 KDumpBin_DumpInterClusterBypassInfo(fp,&(pknobs->dmpebyInterTable[i]));
00051
00052 fwrite(&(pknobs->nRawIntra),sizeof(int),1,fp);
00053 for (i=0;i<(pknobs->nRawIntra);i++)
00054 KDumpBin_DumpIntraClusterBypassInfo(fp,&(pknobs->dmpabyIntraTable[i]));
00055
00056 fwrite(&(pknobs->nports),sizeof(int),1,fp);
00057 for (i=0;i<(pknobs->nports);i++)
00058 KDumpBin_DumpPortInfo(fp,pknobs->mppportinfoTable[i]);
00059
00060 fwrite(pknobs->port2cluster,sizeof(int),32,fp);
00061
00062 fwrite(pknobs->mpnut,sizeof(int),kapi_nUT,fp);
00063
00064 fwrite(&(pknobs->nfuinfoTable),sizeof(int),1,fp);
00065 for (i=0;i<(pknobs->nfuinfoTable);i++)
00066 KDumpBin_DumpFunctionalUnitInfo(fp,&(pknobs->dmpfuinfoTable[i]));
00067
00068 fwrite(&(pknobs->ninstTable),sizeof(int),1,fp);
00069 for (i=0;i<(pknobs->ninstTable);i++)
00070 KDumpBin_DumpInstructionInfo(fp,&(pknobs->dmpinstTable[i]));
00071
00072 fwrite(&(pknobs->nitinfoTable),sizeof(int),1,fp);
00073 for (i=0;i<(pknobs->nitinfoTable);i++)
00074 KDumpBin_DumpInstructionTypeInfo(fp,&(pknobs->dmpitinfoTable[i]));
00075
00076 fwrite(&(pknobs->nbidinfoTable),sizeof(int),1,fp);
00077 for (i=0;i<(pknobs->nbidinfoTable);i++)
00078 KDumpBin_DumpBundleInfo(fp,&(pknobs->dmpbidinfoTable[i]));
00079
00080 fwrite(&(pknobs->nsylinfoTable),sizeof(int),1,fp);
00081 for (i=0;i<(pknobs->nsylinfoTable);i++)
00082 KDumpBin_DumpSyllableInfo(fp,&(pknobs->dmpsylinfoTable[i]));
00083
00084 fwrite(&(pknobs->nstn),sizeof(int),1,fp);
00085 for (i=0;i<(pknobs->nstn);i++)
00086 KDumpBin_DumpSymbolTableNodeInfo(fp,&(pknobs->dmpstn[i]));
00087
00088 fwrite(&(pknobs->fRestructuredAttributes),sizeof(int),1,fp);
00089
00090 KDumpBin_DumpValueNodeListInfo(fp,pknobs->pvalnTypeList,ttySTRING);
00091 KDumpBin_DumpValueNodeListInfo(fp,pknobs->pvalnVarList,ttySTRING);
00092 KDumpBin_DumpValueNodeListInfo(fp,pknobs->pvalnAttrList,ttySTRING);
00093 }
00094
00095
00096 void KDumpBin_DumpString(FILE *fp,char *pch)
00097 {
00098 int iLength=strlen(pch);
00099
00100 fwrite(&iLength,sizeof(int),1,fp);
00101
00102 fwrite(pch,sizeof(char),iLength,fp);
00103 }
00104
00105 void KDumpBin_LoadString(FILE *fp,char **ppch)
00106 {
00107 int iLength;
00108
00109 fread(&iLength,sizeof(int),1,fp);
00110
00111 *ppch=(char *)(malloc(sizeof(char)*iLength));
00112 fread(*ppch,sizeof(char),iLength,fp);
00113 }
00114
00115 void KDumpBin_DumpBitVector(FILE *fp,bv_t *pbv)
00116 {
00117 fwrite(&(pbv->n32Chunks),sizeof(int),1,fp);
00118 fwrite(pbv->pint32Data,sizeof(uint32_t),pbv->n32Chunks,fp);
00119 }
00120
00121 void KDumpBin_LoadBitVector(FILE *fp,bv_t **pbv)
00122 {
00123 int iByteLength;
00124 fread(&(iByteLength),sizeof(int),1,fp);
00125 *pbv=pbvMake(iByteLength*32,0);
00126 (*pbv)->pint32Data=(uint32_t *)(malloc(sizeof(uint32_t)*(iByteLength)));
00127 fread((*pbv)->pint32Data,sizeof(uint32_t),iByteLength,fp);
00128 }
00129
00130 void KDumpBin_DumpClusterInfo(FILE *fp,clr_t *pclr)
00131 {
00132 int i,j;
00133
00134 fwrite(&(pclr->idxclr),sizeof(int),1,fp);
00135
00136 fwrite(&(pclr->ncports),sizeof(int),1,fp);
00137
00138 for (i=0;i<(maxCPORTS);i++)
00139 KDumpBin_DumpPortInfo(fp,pclr->mppcportinfoTable[i]);
00140
00141 fwrite(pclr->mpncutport,sizeof(int),kapi_nUT,fp);
00142 for (i=0;i<(kapi_nUT);i++)
00143 for (j=0;j<(pclr->mpncutport[i]);j++)
00144 KDumpBin_DumpPortInfo(fp,&(pclr->dmppcportinfoTable[i][j]));
00145
00146 fwrite(pclr->cport2port,sizeof(int),32,fp);
00147
00148 fwrite(pclr->distClr,sizeof(int),maxCLR,fp);
00149 }
00150
00151 void KDumpBin_DumpInterClusterBypassInfo(FILE *fp,eby_t *peby)
00152 {
00153 #ifndef FAST_SAVE
00154 fwrite(&(peby->clusterSrc),sizeof(kapi_cluster_t),1,fp);
00155 fwrite(&(peby->clusterTar),sizeof(kapi_cluster_t),1,fp);
00156 fwrite(&(peby->fuSrc),sizeof(kapi_fu_t),1,fp);
00157 fwrite(&(peby->fuTar),sizeof(kapi_fu_t),1,fp);
00158 fwrite(&(peby->cutportSrc),sizeof(kapi_cutport_t),1,fp);
00159 fwrite(&(peby->cutportTar),sizeof(kapi_cutport_t),1,fp);
00160 fwrite(&(peby->utSrc),sizeof(kapi_ut_t),1,fp);
00161 fwrite(&(peby->utTar),sizeof(kapi_ut_t),1,fp);
00162 fwrite(&(peby->oppSrc),sizeof(int),1,fp);
00163 fwrite(&(peby->oppTar),sizeof(int),1,fp);
00164 fwrite(&(peby->iValue),sizeof(int),1,fp);
00165 #else
00166 fwrite(&(peby->clusterSrc),sizeof(int),11,fp);
00167 #endif
00168 }
00169
00170 void KDumpBin_DumpIntraClusterBypassInfo(FILE *fp,aby_t *paby)
00171 {
00172 #ifndef FAST_SAVE
00173 fwrite(&(paby->cluster),sizeof(kapi_cluster_t),1,fp);
00174 fwrite(&(paby->fuSrc),sizeof(kapi_fu_t),1,fp);
00175 fwrite(&(paby->fuTar),sizeof(kapi_fu_t),1,fp);
00176 fwrite(&(paby->cutportSrc),sizeof(kapi_cutport_t),1,fp);
00177 fwrite(&(paby->cutportTar),sizeof(kapi_cutport_t),1,fp);
00178 fwrite(&(paby->utSrc),sizeof(kapi_ut_t),1,fp);
00179 fwrite(&(paby->utTar),sizeof(kapi_ut_t),1,fp);
00180 fwrite(&(paby->oppSrc),sizeof(int),1,fp);
00181 fwrite(&(paby->oppTar),sizeof(int),1,fp);
00182 fwrite(&(paby->iValue),sizeof(int),1,fp);
00183 #else
00184 fwrite(&(peby->cluster),sizeof(int),10,fp);
00185 #endif
00186 KDumpBin_DumpString(fp,paby->pchEntry);
00187 }
00188
00189 void KDumpBin_DumpPortInfo(FILE *fp,cportinfo_t *pcport)
00190 {
00191 fwrite(&(pcport->ut),sizeof(kapi_ut_t),1,fp);
00192 fwrite(&(pcport->cport),sizeof(kapi_cport_t),1,fp);
00193 fwrite(&(pcport->cutport),sizeof(kapi_cutport_t),1,fp);
00194 KDumpBin_DumpBitVector(fp,&(pcport->bvfuAllowed));
00195 }
00196
00197 void KDumpBin_DumpFunctionalUnitInfo(FILE *fp,fuinfo_t *pfut)
00198 {
00199 int i;
00200 fwrite(&(pfut->fu),sizeof(kapi_fu_t),1,fp);
00201 fwrite(pfut->iCoreLatency,sizeof(int),maxDESTINATIONS,fp);
00202 for (i=0;i<(pfut->cntDest);i++)
00203 KDumpBin_DumpString(fp,pfut->mppchDestName[i]);
00204 for (i=0;i<(pfut->cntSrc);i++)
00205 KDumpBin_DumpString(fp,pfut->mppchSrcName[i]);
00206 KDumpBin_DumpString(fp,pfut->pchName);
00207 }
00208
00209 void KDumpBin_DumpInstructionInfo(FILE *fp,inst_t *pinst)
00210 {
00211 KDumpBin_DumpString(fp,pinst->pchUniqueName);
00212 KDumpBin_DumpString(fp,pinst->pchMnemonic);
00213
00214 KDumpBin_DumpString(fp,pinst->pchfu);
00215
00216 KDumpBin_DumpString(fp,pinst->pchit);
00217
00218 fwrite(&(pinst->it),sizeof(kapi_it_t),1,fp);
00219
00220 fwrite(&(pinst->fu),sizeof(kapi_fu_t),1,fp);
00221 }
00222
00223 void KDumpBin_DumpInstructionTypeInfo(FILE *fp,itinfo_t *pit)
00224 {
00225 fwrite(&(pit->it),sizeof(kapi_it_t),1,fp);
00226 fwrite(&(pit->maxAvail),sizeof(int),1,fp);
00227 KDumpBin_DumpString(fp,pit->pchitName);
00228 fwrite(&(pit->bv32sylAllowed), sizeof(bv32_t),1,fp);
00229 }
00230
00231 void KDumpBin_DumpBundleInfo(FILE *fp,bidinfo_t *pbid)
00232 {
00233
00234 fwrite(pbid->mpsylType,sizeof(kapi_syl_t),nSYLBID,fp);
00235
00236 fwrite(pbid->mpnsylAvail,sizeof(int),kapi_nSYL,fp);
00237
00238 fwrite(pbid->mpnitAvail,sizeof(int),kapi_nIT,fp);
00239
00240 fwrite(&(pbid->fReserved),sizeof(int),1,fp);
00241
00242 fwrite(&(pbid->isylSbit),sizeof(int),1,fp);
00243
00244 KDumpBin_DumpString(fp,pbid->pchBID);
00245 }
00246
00247 void KDumpBin_DumpSyllableInfo(FILE *fp,sylinfo_t *psyl)
00248 {
00249
00250 fwrite(psyl->mpnutNeeded,sizeof(int),kapi_nUT,fp);
00251 fwrite(&(psyl->itMajor),sizeof(kapi_it_t),1,fp);
00252 }
00253
00254 void KDumpBin_DumpSymbolTableNodeInfo(FILE *fp,stn_t *pstn)
00255 {
00256 #if 0
00257 union {
00258 tfi_t tfi;
00259 vfi_t vfi;
00260 efi_t efi;
00261 afih_t afih;
00262 } u;
00263 limp_t *plimpListParse;
00264 struct _SYM_TABLE_NODE *pstnNext;
00265 struct _SYM_TABLE_NODE *pstnTempNext;
00266 struct _SYM_TABLE_NODE *pstnHashNext;
00267 #endif
00268
00269 fwrite(&(pstn->fExpected),sizeof(int),1,fp);
00270 KDumpBin_DumpString(fp,pstn->pchName);
00271 fwrite(&(pstn->ity),sizeof(ity_t),1,fp);
00272
00273 switch (pstn->ity)
00274 {
00275 case ityTYPENAME:
00276 KDumpBin_REF_DumpTypeFieldInfo(fp, &(pstn->u.tfi), pstn);
00277 case ityVARNAME:
00278 KDumpBin_REF_DumpVarFieldInfo(fp, &(pstn->u.tfi), pstn);
00279
00280 }
00281 }