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
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00041
00042
00043
00044
00045
00046 #include <stdio.h>
00047 #include <string.h>
00048 #include "ekapi_ia64.h"
00049 #include "assert.h"
00050 #include "cache_info_gen.h"
00051
00052
00053 static const char * const description[] = {"\
00054 /* ====================================================================\n\
00055 * ====================================================================\n\
00056 *\n\
00057 * Description:\n\
00058 */", NULL};
00059
00060 void Cache_Info_Generator(void *pknobs, GEN_MODE mode, MACHINE_TYPE type)
00061 {
00062 FILE *fpc, *fph, *fp_export;
00063 char fname[512] = "targ_cache_info";
00064 int i,j,k,count;
00065 kapi_cache_t *cache_t=NULL;
00066
00067
00068 if (type == MCK_TYPE)
00069 Init_Module_Files(mode, "targ_cache_info_mck", &fpc, &fph, &fp_export, 1);
00070 else
00071 Init_Module_Files(mode, "targ_cache_info", &fpc, &fph, &fp_export, 1);
00072 Emit_Header(fph, "targ_cache_info", description, 1);
00073
00074 fprintf(fpc, "#include \"%s.h\" \n\n", fname);
00075
00076 fprintf(fph, "extern INT ");
00077 char **cache_names = (char **)malloc(EKAPI_CacheNameCount(pknobs) * sizeof(char*));
00078 for (i=0; i< EKAPI_CacheNameCount(pknobs); i++) {
00079 char *buf;
00080 buf = EKAPI_CacheName(pknobs,i);
00081 fprintf(fph,"CACHE_%s, ", buf);
00082 fprintf(fpc, "INT CACHE_%s = %d;\n", buf, i);
00083 cache_names[i]=buf;
00084 }
00085 fprintf(fpc, "INT CACHE_MAX = %d;\n", i);
00086 fprintf(fph, " CACHE_MAX;\n");
00087
00088
00089 fprintf(fph, "typedef struct{\n");
00090 fprintf(fph, " INT lines;\n");
00091 fprintf(fph, " INT linesize;\n");
00092 fprintf(fph, " INT size;\n");
00093 fprintf(fph, " INT ways;\n");
00094 fprintf(fph, " INT ports;\n");
00095 fprintf(fph, " INT readcycle;\n");
00096 fprintf(fph, "} CACHE_INFO;\n");
00097
00098
00099 fprintf(fph, "extern const CACHE_INFO cache_info[];\n\n");
00100 fprintf(fph, "inline INT Cache_Line_Size(INT idx)\n{\n"
00101 " return cache_info[idx].linesize;\n}\n");
00102
00103 fprintf(fph, "inline INT Cache_Size(INT idx)\n{\n"
00104 " return cache_info[idx].size;\n}\n");
00105
00106 fprintf(fph, "inline INT Cache_Lines(INT idx)\n{\n"
00107 " return cache_info[idx].lines;\n}\n");
00108
00109 fprintf(fph, "inline INT Cache_Read_Cycle(INT idx)\n{\n"
00110 " return cache_info[idx].readcycle;\n}\n");
00111
00112 fprintf(fph, "inline INT Cache_Ways(INT idx)\n{\n"
00113 " return cache_info[idx].ways;\n}\n");
00114
00115 fprintf(fph, "inline INT Cache_Ports(INT idx)\n{\n"
00116 " return cache_info[idx].ports;\n}\n");
00117
00118
00119
00120 count = i; j=0;
00121 fprintf(fpc, "\nconst CACHE_INFO cache_info[%d] = {\n",count);
00122 for (i=0; i< count; i++)
00123 {
00124 if (strstr(cache_names[i], "I")) {
00125 cache_t = KAPI_CacheHierarcy(pknobs, i, KAPI_CACHE_TYPE_INSTRUCTION);
00126 j++;
00127 }else if(strstr(cache_names[i], "D")) {
00128 cache_t = KAPI_CacheHierarcy(pknobs, i-j, KAPI_CACHE_TYPE_DATA);
00129 }else{
00130 cache_t = KAPI_CacheHierarcy(pknobs, i-j, KAPI_CACHE_TYPE_DATA);
00131 }
00132
00133 if (cache_t) {
00134
00135 fprintf(fpc, " { %d, %d, %d, %d, %d, %d},",
00136 cache_t->nLines,
00137 cache_t->nBytesLine,
00138 cache_t->nBytesLine * cache_t->nLines,
00139 cache_t->nWays,
00140 cache_t->nCachePorts,
00141 cache_t->nCyclesRead);
00142 } else {
00143 fprintf(fpc, "{ 0, 0, 0, 0, 0 , 0}");
00144 }
00145
00146 fprintf(fpc, "/* %s */\n", cache_names[i]);
00147 }
00148 free(cache_names);
00149
00150 fprintf(fpc,"};\n");
00151 Emit_Tailer(fph, 1);
00152 Close_Module_Files(mode, &fpc, &fph, &fp_export);
00153 }
00154
00155