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 <stdlib.h>
00025 #include <string.h>
00026 #include <assert.h>
00027 #include "kmapi.h"
00028 #include "kmapi_internal.h"
00029 #include "kmapi_error.h"
00030
00031
00032
00033 bundle_fus_t *bundle_fus_AddNode(bundle_fus_t **ppbfu)
00034 {
00035 int i;
00036 bundle_fus_t *pbfu=(bundle_fus_t *)malloc(sizeof(bundle_fus_t));
00037 for (i=0;i<kmapi_BUNDLE_WIDTH;i++)
00038 ZERO_bv128(pbfu->bvSlots[i]);
00039 if (*ppbfu!=NULL)
00040 pbfu->pNext=(*ppbfu);
00041 else
00042 pbfu->pNext=NULL;
00043 *ppbfu=pbfu;
00044 return pbfu;
00045 }
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 kmapi_result kmapi_parse_split(kmapi_knobs_t *pKMnobs,char *pchSplitRule,kapi_bid_t *pbid)
00058 {
00059 char *pchWalker;
00060 char *pchRule;
00061 char *pchBid;
00062 char *pchTmp;
00063 int iSlot=0;
00064 kapi_bid_t bid;
00065 bundle_fus_t *pbfu;
00066 kapi_fu_t fu;
00067 int fEND=FALSE;
00068
00069 pchRule=strdup(pchSplitRule);
00070 pchBid=pchWalker=pchRule;
00071 pchWalker=strchr(pchWalker,':');
00072 *pchWalker='\0';
00073 bid=KAPI_EnumIndex(pKMnobs->pKnobs,"bid_t",pchBid);
00074 if (bid==-1)
00075 {
00076 kmapi_Error_pch1(0,"no such bundle template %s",pchBid);
00077 return kmapi_failure;
00078 }
00079 pchTmp=++pchWalker;
00080 pchWalker=strchr(pchWalker,':');
00081 *pchWalker='\0';
00082 if (strstr(pchTmp,"yes")!=NULL)
00083 pKMnobs->dmpSplitRules[bid].bvSplits|=kmapi_implicit_break_before;
00084 else
00085 {
00086 if (strstr(pchTmp,"no")==NULL)
00087 {
00088 kmapi_Error_pch1(0,"wrong format for split issue rule: %s",pchSplitRule);
00089 return kmapi_failure;
00090 }
00091 }
00092
00093 pchTmp=++pchWalker;
00094 pchWalker=strchr(pchWalker,':');
00095 *pchWalker='\0';
00096 if (strstr(pchTmp,"yes")!=NULL)
00097 pKMnobs->dmpSplitRules[bid].bvSplits|=kmapi_implicit_break_after;
00098 else
00099 {
00100 if (strstr(pchTmp,"no")==NULL)
00101 {
00102 kmapi_Error_pch1(0,"wrong format for split issue rule: %s",pchSplitRule);
00103 return kmapi_failure;
00104 }
00105 }
00106 pchWalker++;
00107 if (strstr(pchWalker,"none")!=NULL)
00108 return kmapi_success;
00109 pchWalker=strchr(pchWalker,'(');
00110 pchTmp=++pchWalker;
00111 pbfu=bundle_fus_AddNode(&(pKMnobs->dmpSplitRules[bid].pSplitExeptions));
00112 while (!fEND)
00113 {
00114 pchWalker++;
00115 switch (*pchWalker)
00116 {
00117 case ')':
00118 fEND=TRUE;
00119 case '/':
00120 *pchWalker='\0';
00121 if (*pchTmp!='*')
00122 {
00123 fu=KAPI_EnumIndex(pKMnobs->pKnobs,"fu_t",pchTmp);
00124 if (fu==-1) {
00125 kmapi_Error_pch2(0,"No such fu %s in rule %s",pchTmp,pchSplitRule);
00126 }
00127 SETBIT_bv128(pbfu->bvSlots[iSlot],fu);
00128 }
00129 pchTmp=++pchWalker;
00130 iSlot++;
00131 break;
00132 case ',':
00133 *pchWalker='\0';
00134 fu=KAPI_EnumIndex(pKMnobs->pKnobs,"fu_t",pchTmp);
00135 SETBIT_bv128(pbfu->bvSlots[iSlot],fu);
00136 pchTmp=++pchWalker;
00137 iSlot=0;
00138 pbfu=bundle_fus_AddNode(&(pKMnobs->dmpSplitRules[bid].pSplitExeptions));
00139 break;
00140 default:
00141 break;
00142 }
00143 }
00144 return kmapi_success;
00145 }
00146
00147 kmapi_result kmapi_init_split_issue_data(kmapi_knobs_t *pKMnobs)
00148 {
00149 int i;
00150 int nSplits;
00151 kapi_bid_t bid;
00152 int nBid;
00153
00154 nSplits=KAPI_count4attribute(pKMnobs->pKnobs,"SPLIT_ISSUE");
00155 nBid=KAPI_EnumCardinality(pKMnobs->pKnobs,"bid_t");
00156 pKMnobs->dmpSplitRules=(kmapi_split_rule_t *)malloc(sizeof(kmapi_split_rule_t)*nBid);
00157 for (i=0;i<nBid;i++)
00158 {
00159 pKMnobs->dmpSplitRules[i].bid=i;
00160 pKMnobs->dmpSplitRules[i].bvSplits=0;
00161 pKMnobs->dmpSplitRules[i].pSplitExeptions=NULL;
00162 }
00163 for (i=0;i<nSplits;i++)
00164 if (kmapi_success!=kmapi_parse_split(pKMnobs,KAPI_attribute4index(pKMnobs->pKnobs,"SPLIT_ISSUE",i),&bid))
00165 return kmapi_failure;
00166 pKMnobs->cSplitRules=nSplits;
00167 return kmapi_success;
00168 }
00169
00170
00171 kmapi_implicit_break_t KMAPI_ImplicitBreakType(void *pConfig,kapi_bid_t bid, kapi_fu_t *mpfu)
00172 {
00173 kmapi_knobs_t *pKMnobs=(kmapi_knobs_t *)pConfig;
00174 kmapi_split_rule_t splitRule=pKMnobs->dmpSplitRules[bid];
00175 bundle_fus_t *pException=splitRule.pSplitExeptions;
00176 int i;
00177
00178 assert(pKMnobs!=NULL);
00179
00180 while (pException!=NULL)
00181 {
00182 for (i=0;i<kmapi_BUNDLE_WIDTH;i++)
00183 if (isbv128BITSET(pException->bvSlots[i],mpfu[i]))
00184 return kmapi_no_implicit_break;
00185 pException=pException->pNext;
00186 }
00187
00188 return splitRule.bvSplits;
00189
00190 }